Вылетает 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]);
}
}
Объяснение кода листинга программы
В этом коде решается система линейных уравнений методом Гаусса. Вот список действий, которые происходят в коде:
- Вводятся коэффициенты системы линейных уравнений.
- Выполняется перестановка строк матрицы a, чтобы получить эквивалентную систему с верхнетреугольной матрицей.
- Выполняется обратное подстановление, чтобы найти значения переменных x.
- Выводятся значения переменных x.