?? 4.cpp
字號:
/*采用高斯列主元消元法,編譯環(huán)境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 + -