📄 4.cpp
字号:
/*采用高斯列主元消元法,编译环境visual C++ 2008*/
#include<stdio.h>
#include<cstdlib>
#include<math.h>
FILE *fp;
void read(float *p,int n);
void save(float *p,int n);
void main()
{
if((fp=fopen("a.txt","r"))==NULL)
{
puts("打开出错");
exit(0);
}
int i,j,N,imax,k;
float **a,*ans,temp;
fscanf(fp,"%d",&N);
a=new float *[N];//分配空间
if(a==NULL) exit(0);
ans=new float [N];
if(ans==NULL) exit(0);
for(i=0; i<N;i ++)
{
a[i]=new float[N+1];
if(a[i]==NULL) exit(0);
read(a[i], N+1);//读取一行数据
}
fclose(fp);
puts("读取的N*(N+1)矩阵为:");
for(i=0; i<N; i++)//输出读取的矩阵
{
for(j=0; j<N+1; j++)
{
printf("%g ",a[i][j]);
}
putchar(10);
}
for(i = 0;i< N; i++)
{
for(imax=k=i; k<N; k++)//找出列主元
{
if(fabs(a[imax][i])<fabs(a[k][i])) imax=k;
}
if(fabs(a[imax][i])<1e-5) //判断有没有解
{
puts("无解或有多个解");
exit(0);
}
if(i==N-1) break;
if(i!=imax)//交换i行和imax行
{
for(int k=i; k<=N; k++)
{
temp=a[i][k];
a[i][k]=a[imax][k];
a[imax][k]=temp;
}
}
for(int j=i+1; j<N; j++)//消元
{
temp=a[j][i]/a[i][i];
for(int k=i+1; k<N+1; k++)
{
a[j][k]-=a[i][k]*temp;
}
}
}
ans[N-1] = a[N - 1][N]/a[N - 1][N - 1];
for(i = N - 2; i >= 0; i--)//回代
{
for (int j = i + 1; j < N; j++)
a[i][N]-= a[i][j] * ans[j];
ans[i]=a[i][N]/a[i][i];
}
puts("结果保留三位小数");
for(i = 0; i < N; i++)//输出解
{
printf("X%d = %.3f\n", i + 1, ans[i]);
}
save(ans, N);
for(i=0;i<N;i++)//释放空间
{
delete [] a[i];
a[i]=NULL;
}
delete [] a,ans;
a=NULL;
}
void read(float *p, int n)
{
for(int i=0;i<n;i++)
{
fscanf(fp, "%f", p + i);
}
}
void save(float *p, int n)
{
if((fp=fopen("a.txt","a+"))==NULL)
{
puts("打开出错");
exit(0);
}
fprintf(fp,"结果保留三位小数\n");
for(int i= 0; i<n; i++)
{
fprintf(fp,"X%d = %.3f\n", i + 1, *(p+ i));
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -