#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; }; }
|