Вылетает borland при решение СЛАУ методом Гаусса. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Написал программу по алгоритму(приложен к теме), но при запуске borland вылетает. Помогите, пожалуйста.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
double i, m, t, j, k, ch, max, S;
const int n=4;
void main()
 {
  clrscr();
  double a[3][4];
  double x[4];
//  printf ("\nVvodim koefficienti uravneniy:\n");
 
// для тестирования
a[0][0]=1; a[0][1]=2; a[0][2]=0-1; a[0][3]=0; a[0][4]=8;
a[1][0]=0; a[1][1]=1; a[1][2]=3;   a[1][3]=1; a[1][4]=15;
a[2][0]=4; a[2][1]=0; a[2][2]=1;   a[2][3]=1; a[2][4]=11;
a[3][0]=1; a[3][1]=1; a[3][2]=0;   a[3][3]=5; a[3][4]=23;
 
/*  for (i=0;i<n;i++)
  for (j=0;j<n;j++)
   {
    scanf ("\n%lf", &a[i][j]);
   }*/
  for (i=1;i<n;i++)
   {
    max=abs(a[i][i]);
    k=i;
    for (j=1;j<n;j++)
     {
      if (abs(a[j][i])>max)
       {
    max=abs(a[j][i]);
    k=j;
       }
      if (k!=i)
       {
    for(m=i;m<n+1;m++)
     {
      t=a[i][m];
      a[i][m]=a[k][m];
      a[k][m]=t;
     }
       }
      for (j=n+1;j>i;j--)
       {
    a[i][j]=a[i][j]/a[i][i];
       }
      for (k=i+1;k<n;k++)
       {
    for (m=n+1;m>i;m--)
     {
      a[k][m]=a[k][m]-a[k][i]*a[i][m];
     }
       }
     }
   }
  for (i=n;i>1;i--)
   {
    S=a[i][n+1];
    for (j=i+1;j<n;j++)
     {
      S=S-a[i][j]*x[j];
     }
    x[i]=S;
   }
  for (i=1;i<n;i++)
   {
    printf ("\n%lf", x[i]);
   }
 }

Решение задачи: «Вылетает borland при решение СЛАУ методом Гаусса.»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
double t, ch, max, S;
int i, j, m, k;
const int n=4;
void main()
 {
//  clrscr();
  double a[4][5];
  double x[4];
//  printf ("\nVvodim koefficienti uravneniy:\n");
 
// для тестирования
a[0][0]=1; a[0][1]=2; a[0][2]=0-1; a[0][3]=0; a[0][4]=8;
a[1][0]=0; a[1][1]=1; a[1][2]=3;   a[1][3]=1; a[1][4]=15;
a[2][0]=4; a[2][1]=0; a[2][2]=1;   a[2][3]=1; a[2][4]=11;
a[3][0]=1; a[3][1]=1; a[3][2]=0;   a[3][3]=5; a[3][4]=23;
 
/*  for (i=0;i<n;i++)
  for (j=0;j<n;j++)
   {
    scanf ("\n%lf", &a[i][j]);
   }*/
  for (i=1;i<n;i++)
   {
    max=fabs(a[i][i]);
    k=i;
    for (j=1;j<n;j++)// внешний цикл по j
     {
      if (fabs(a[j][i])>max)
       {
        max=fabs(a[j][i]);
        k=j;
       }
     }
    if (k!=i)
     {
      for(m=i;m<n+1;m++)
       {
        t=a[i][m];
        a[i][m]=a[k][m];
        a[k][m]=t;
       }
     }
    for (j=n+1;j>i;j--)// внутренний цикл изменяет значение j и поэтому программа зависает
     {
      a[i][j]=a[i][j]/a[i][i];
     }
    for (k=i+1;k<n;k++)
     {
      for (m=n+1;m>i;m--)
       {
        a[k][m]=a[k][m]-a[k][i]*a[i][m];
       }
     }     
   }
  for (i=n;i>1;i--)
   {
    S=a[i][n+1];// будет обращаться и к такому элементу: a[4][5] - выход за границы массива
    for (j=i+1;j<n;j++)
     {
      S=S-a[i][j]*x[j];// будет обращаться и к такому элементу: x[5] - выход за границы массива
     }
    x[i]=S;
   }
  for (i=1;i<n;i++)
   {
    printf ("\n%lf", x[i]);
   }
 }

Объяснение кода листинга программы

В этом коде решается система линейных уравнений методом Гаусса. Вот список действий, которые происходят в коде:

  1. Вводятся коэффициенты системы линейных уравнений.
  2. Выполняется перестановка строк матрицы a, чтобы получить эквивалентную систему с верхнетреугольной матрицей.
  3. Выполняется обратное подстановление, чтобы найти значения переменных x.
  4. Выводятся значения переменных x.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы