//运行环境VS2010
//要求矩阵对角线无0元素
#include<iostream>
#include<math.h>
#include<fstream>
#include<iomanip>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
double **A_B_Matrix; //行列式
double *Ans; //行列式的解
double dd; //无用缓存
char c; //无用缓存
string s; //无用缓存
int n=0; //矩阵的行数
int m=0; //矩阵的列数
ifstream read("data.dat");
while(getline(read,s)) //检测文件中矩阵有几行
{
n++;
}
read.close();
read.open("data.dat");
while(1) //检测矩阵有几列
{
read>>dd;
m++;
c=read.peek();
if('
'==c)
break;
}
read.close();
if(m==n+1)
{
cout<<"行列式有唯一解"<<endl;
}
else
{
cout<<"此题无解或解不唯一"<<endl;
exit(1);
}
Ans=new double[n+1];
Ans[n]=0;
A_B_Matrix=(double **)new double *[n];
for(int i=0;i!=n;i++)
{
A_B_Matrix[i]=new double[n+1];
}
int nn=0;
read.open("data.dat");
while(!read.eof()) //将文件中的行列式读入A_B_Matrix
{
for(int i=0;i!=m;i++)
{
read>>A_B_Matrix[nn][i];
}
nn++;
}
read.close();
for( int i=0;i!=n;i++) //寻找列中较大值
{
double *Tem_Matrix; //行交换时中间值
Tem_Matrix=new double[n+1];
int Tem_R; //最大值所在行缓存值
Tem_R=i;
for(int j=i+1;j!=n;j++) //选出列中最大值所在的行
{
if(fabs(A_B_Matrix[Tem_R][i])<fabs(A_B_Matrix[j][i]))
{
Tem_R=j;
}
}
for(int x=0;x!=n+1;x++) //行交换
{
Tem_Matrix[x]=A_B_Matrix[Tem_R][x];
A_B_Matrix[Tem_R][x]=A_B_Matrix[i][x];
A_B_Matrix[i][x]=Tem_Matrix[x];
}
for(int x=i+1;x!=n;x++) //形成下三角为0的矩阵
{
double tem ; //行与行之间的倍数
tem=-A_B_Matrix[x][i]/A_B_Matrix[i][i];
for(int m=0;m!=n+1;m++) //将对应列下变为0
{
A_B_Matrix[x][m]=A_B_Matrix[i][m]*tem+A_B_Matrix[x][m];
}
}
}
cout<<"化简后的行列式为"<<endl;
for(int i=0;i!=n;i++)
{
for(int j=0;j!=n+1;j++)
{
cout<<left<<setw(8)<<A_B_Matrix[i][j]<<' ';
}
cout<<'
';
}
cout<<"其解为"<<endl;
for(int i=n-1;i!=-1;i--) //求解
{
double sum=A_B_Matrix[i][n];
for(int j=i;j!=n;j++)
{
sum=sum-Ans[j+1]*A_B_Matrix[i][j+1];
}
Ans[i]=(double)sum/A_B_Matrix[i][i];
}
for(int i=0;i!=n;i++) //输出所有的解
{
cout<<"x["<<i+1<<"]为"<<Ans[i]<<endl;
}
system("pause");
}