#include <iostream>
#include <iomanip>
using namespace std;
const int n=3; //设置方程组的维
void input_data(float a[n][2*n]) //输入行列式的相关数据
{
cout<<"输入要计算的行列式a["<<n<<"]["<<n<<"]:"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(i=0;i<n;i++)
for(int j=n;j<2*n;j++)
if(i==j-n)
a[i][j]=1;
else
a[i][j]=0;
system("cls");
}
//////////////////////////////////////////////////////////////////
//
//find_line():找出行(i,,,n)、列为i的最大主元素所在的行,并返回行值
//
//////////////////////////////////////////////////////////////////
int find_line(int i,float a[n][2*n])
{
int max_a_line=i; //max_a_line为最大元素所在的行
float max_a=a[i][i]; //max_a为最大元素的值
int out_i=i; //out_i为i的初始值
for(i=i+1;i<n;i++)
{
if(a[i][out_i]<0)
if(max_a<-a[i][out_i])
{
max_a=-a[i][out_i];
max_a_line=i;
};
if(max_a<a[i][out_i])
{
max_a=a[i][out_i];
max_a_line=i;
};
}
return max_a_line;
}
//////////////////////////////////////////////////////////////////
//
//chang_line():交换两行的从line列到n列的元素
//
//////////////////////////////////////////////////////////////////
void chang_line(int line,int other_line,float a[n][2*n])
{
float m; //m为中间变量
for(int j=line;j<2*n;j++)
{
m=a[line][j];
a[line][j]=a[other_line][j];
a[other_line][j]=m;
}
}
//////////////////////////////////////////////////////////////////
//
//clear_num_down():消去第i列、i行以下的元素
//
//////////////////////////////////////////////////////////////////
void clear_num_down(int i,float a[n][2*n])
{
int line=i,j;
float m;
for(i=i+1;i<n;i++)
{
m=-a[i][line]/a[line][line];
for(j=line;j<2*n;j++)
{
a[i][j]=a[i][j]+m*a[line][j];
};
}
}
//////////////////////////////////////////////////////////////////
//
//clear_num_up():消去第i列、i行以上的元素
//
//////////////////////////////////////////////////////////////////
void clear_num_up(int i,float a[n][2*n])
{
int line=i,j;
float m;
for(i=i-1;i>=0;i--)
{
m=-a[i][line]/a[line][line];
for(j=line;j<2*n;j++)
{
a[i][j]=a[i][j]+m*a[line][j];
};
}
}
//////////////////////////////////////////////////////////////////
//
//calculate_det():计算行列式的值
//
//////////////////////////////////////////////////////////////////
float calculate_det(float a[n][2*n])
{
float det=1;
int i=0,j;
do{ //消去第i列、i行以下的元素
if(a[i][i]==0)
{
j=find_line(i,a);
if(i!=j)
{
chang_line(i,j,a);
det=-det;
};
}
if(a[i][i]==0)
return 0;
det=det*a[i][i];
if(i<n-1)
clear_num_down(i,a);
i++;
}while(i<n);
i--;
do{ //消去第i列、i行以上的元素
if(i>0)
{
clear_num_up(i,a);
}
i--;
}while(i>0);
i=0;
do{
if(a[i][i]!=1)
{
for(j=i+1;j<2*n;j++)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=1;
}
i++;
}while(i<n);
return det;
}
void main ()
{
float a[n][2*n],det,b[n][n];
input_data(a);
cout << setiosflags(ios::fixed); //和下一句结合起来用来设定小数位的位数
cout << setprecision(6);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
b[i][j]=a[i][j];
det=calculate_det(a);
cout<<"原矩阵为:"<<endl;
for(i=0;i<n;i++)
{
cout<<"┃ ";
for(int j=0;j<n;j++)
cout<<b[i][j]<<" ";
cout<<"┃"<<endl;
};
cout<<"矩阵的行列式值为:"<<det<<endl;
cout<<endl<<endl<<"原矩阵的逆矩阵为:"<<endl;
for(i=0;i<n;i++)
{
cout<<"┃ ";
for(int j=n;j<2*n;j++)
cout<<a[i][j]<<" ";
cout<<"┃"<<endl;
};
}