#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
FILE *fp;
int i,j,n;
double **a,*b,*x;
double max=-1,t; //max用于选主元
int r,k=1;
double temp;
if((fp=fopen("gauss.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
fscanf(fp,"%d",&n); //读入系数行列式阶数n
a=(double **)malloc(n*sizeof(double *));
b=(double *)malloc(n*sizeof(double));
x=(double *)malloc(n*sizeof(double));
for(j=1;j<=n;j++){
a[j]=(double *)malloc(n*sizeof(double));
}
printf("n=%d\n",n);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
fscanf(fp,"%lf",&a[i][j]);
fscanf(fp,"%lf",&b[i]);
}
if(fclose(fp))
{
printf("Can not close the file!\n");
exit(0);
}
printf("输入的矩阵为:\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("a[%d][%d]=%.f ",i,j,a[i][j]);
printf("b[%d]=%.f\n",i,b[i]);
}
//1.1选主元 k:对角线行/列 产生主元a[r][k]
do //k=1,2
{
for(i=k;i<=n;i++) //找出第k列绝对值最大数max=a[r][k](在r行)
if(fabs(a[i][k])>max){
max=a[i][k];
r=i; //r记录最大值所在-行
}
if(a[r][k]==0) //奇异矩阵,无法计算
{
printf("Cannot solve!\n");
exit(0);
}
//1.2换行 主元a[r][k]->a[k][k]
for(j=1;j<=n;j++) //交换第k行和r行,交换后主元在第k行。
{
{
t=a[r][j];
a[r][j]=a[k][j];
a[k][j]=t;
}
{
t=b[r];
b[r]=b[k];
b[k]=t;
}
}
//2.消去同列中其它项
for(i=1;i<=n;i++){
if(i!=k){
temp=a[i][k]/a[k][k]; //temp=-1/5
for(j=1;j<=n;j++){
a[i][j]-=temp*a[k][j]; //a[2][1]=0,a[2][2]=
}
b[i]-=temp*b[k];
}
}
// printf("temp=%.6f\n",temp);
//测试
/* for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("a[%d][%d]=%.6f ",i,j,a[i][j]);
printf("b[%d]=%.6f\n",i,b[i]);
}
printf("\n");
*/
k=k+1;
max=-1;
}while(k<=n);
printf("化为对角阵为:\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("a[%d][%d]=%.6f ",i,j,a[i][j]);
printf("b[%d]=%.6f\n",i,b[i]);
}
//3.求解
printf("求得其解x为:\n");
for(i=1;i<=n;i++)
{
x[i]=b[i]/a[i][i];
}
for(i=1;i<=n;i++)
printf(" x%d=%.1f\n",i,x[i]);
return 0;
}