📄 高斯消去法解n维的线性方程组的小程序.cpp
字号:
//高斯消去法解n维的线性方程组的小程序
//运行时先输入阶数n,再输入系数行列式p[n][n],然后是输
//入常数列向量b[n].屏幕会输出消元前后的增广矩阵和解。
//该程序Turbo C2.0通过。
#include <stdlib.h>
double tabs(double x)
{
x=x>0?x:-x;
return x;
}
main()
{
int n,h,i,j,k;
double *x,*b,**p,*temp,t,sum;
do{ printf("\nInput n:");
scanf("%d",&n);
}while(n<=0||n>=200);
b=(double*)malloc(sizeof(double)*n);
x=(double*)malloc(sizeof(double)*n);
p=(double**)malloc(sizeof(double*)*n);
for(i=0;i<n;i++)
p[i]=(double*)malloc(sizeof(double)*n);
printf("Input p[i][j]:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ printf("a[%d][%d]:",i+1,j+1);
scanf("%lf",&t);
p[i][j]=t; }/*偶这样写不是自找麻烦,这是turbo c的BUG*/
printf("\n");/*直接写scanf("%lf",&p[i][j]);会出错*/
}
printf("Input b[n]:\n");
for(i=0;i<n;i++)
{ printf("b[%d]:",i);
scanf("%lf",&b[i]); }
for(i=0;i<n;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf("\t%g",p[i][j]);
printf("\t%g",b[i]); }
for(i=0;i<n-1;i++)
{
k=i;
for(j=i;j<n;j++)
{
if(tabs(p[k][i])<tabs(p[j][i]))
k=j;
}
temp=p[i];p[i]=p[k];p[k]=temp;
t=b[i];b[i]=b[k];b[k]=t;
if(p[i][i]==0)
{pintf("\nError!Can't be calculated!");
exit(1);}
for(j=i+1;j<n;j++)
{
b[j]=b[j]-b[i]*(p[j][i]/p[i][i]);
for(h=n-1;h>=i;h--)
p[j][h]-=p[i][h]*p[j][i]/p[i][i];}
}
printf("\n\n");
printf("\n\n");
for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<n;j++)
printf("\t%g",p[i][j]); printf("\t%g",b[i]); }
for(i=n-1;i>=0;i--)
{
sum=b[i];
for(j=i+1;j<n;j++)
sum-=x[j]*(p[i][j]);
if(p[i][i]==0)
{printf("\nError!Can't be calculated! ");
exit(1);}
x[i]=sum/p[i][i];
}
for(i=0;i<n;i++)
printf("%cx[%d]=%.8g",(i%3==0?'\n':'\t'),(i+1),x[i]);
free(p);free(x);free(b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -