#include <stdio.h>
#include <stdlib.h>
#define MAX 3
// 矩阵
typedef struct{
double data[MAX][MAX+1];
}Matrix;
// 获取当前行第一个非0的数的位置
int zeroCol(Matrix *matrix,int row){
for(int i=0;i<MAX+1;i++){
if(matrix->data[row][i]!=0){
return i;
}
}
return -1;
}
void swap(double *a,double *b){
double t = *a;
*a = *b;
*b = t;
}
int gauss(Matrix *matrix){
// 针对每一行做处理
int m = MAX,n = MAX+1;
for(int i=0;i<MAX;i++){
int k = zeroCol(matrix,i);
// 任意一行出现全零,无解
if(k == -1){
return -1;
}else if(i!=k){
for(int j=0;j<n;j++){
swap(&matrix->data[k][j],&matrix->data[i][j]);
}
}
// 把主元化为1
double ii = matrix->data[i][i];
for(int j=i;j<n;j++){
matrix->data[i][j] = matrix->data[i][j]/ii;
}
// 把其他行的对应列元素化为0
for(int j=0;j<m;j++){
if(j == i){
continue;
}
// 其他行的对应列边为0了,其他行的其他列也要变化
double ji = matrix->data[j][i];
for(int q=0;q<n;q++){
matrix->data[j][q] -= matrix->data[i][q]*ji;
}
}
}
}
int main()
{
Matrix matrix;
matrix.data[0][0] = 12.0;
matrix.data[0][1] = 22;
matrix.data[0][2] = -3;
matrix.data[0][3] = 41;
matrix.data[1][0] = 35;
matrix.data[1][1] = 6;
matrix.data[1][2] = 7;
matrix.data[1][3] = 202;
matrix.data[2][0] = 10;
matrix.data[2][1] = 100;
matrix.data[2][2] = 502;
matrix.data[2][3] = 600;
for(int i=0;i<MAX;i++){
for(int j=0;j<MAX+1;j++){
printf("%.2f ",matrix.data[i][j]);
}
printf("\n");
}
printf("\n");
gauss(&matrix);
for(int i=0;i<MAX;i++){
for(int j=0;j<MAX+1;j++){
printf("%.2f ",matrix.data[i][j]);
}
printf("\n");
}
return 0;
}