#include "Stdio.h"#include "Conio.h"/*L是矩阵的行减1,从程序上看是最外层循环的次数N 对应矩阵的行数,M对应矩阵的列数可以通过改变L、N、M来控制矩的阶数 */#define L 3#define N 4#define M 5void gauss(double a[N][M],double x[N]){int i,j,l,n,m,k=0;double temp[N];/*第一个do-while是将增广矩阵消成上三角形式*/do{n=0;for(l=k;l<L;l++)temp[n++]=a[l+1][k]/a[k][k];for(m=0,i=k;i<N;i++,m++)for(j=k;j<M;j++)a[i+1][j]-=temp[m]*a[k][j];k++;}while(k<N) ;/*第二个do-while是将矩阵消成对角形式,并且重新给k赋值*/ k=L-1;do{n=0;for(l=k;l>=0;l--)temp[n++]=a[k-l][k+1]/a[k+1][k+1];for(m=0,i=k;i>=0;i--,m++)for(j=k;j<M;j++)a[k-i][j]-=temp[m]*a[k+1][j];k--;}while(k>=0) ;/*下一个for是解方程组*/for(i=0;i<N;i++)x[i]=a[i][N]/a[i][i];}void menu(){printf("\n _ _ _ _ _\n");printf(" 1.operation\n");printf(" 2.exit");printf("\n _ _ _ _ _\n");}main(){int i,j,choose;double a[N][M]={0},answer[N];clrscr();while(1){leep:menu();scanf("%d",&choose);switch(choose){case 1:printf("!!The size of Maxrix is %d * %d,each line enter %d element:\n ",N,M,M); for(i=0;i<N;i++){printf("Enter the Matrix's %d line:\n",i);for(j=0;j<N+1;j++)scanf("%lf",&a[i][j]);}printf("\nthe corss matrix is:\n_ _ _ _ _\n");gauss(a,answer);for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%-2lf ",a[i][j]);putchar('\n');}printf("_ _ _ _ _\nthe solve is:\n");for(i=0;i<N;i++)printf("x%d=%lf\n",i+1,answer[i]);case 2:exit(0);default:printf("input error:\n");goto leep;}}getch();}/*试验:西安交通大学出版社出版的《计算方法》书上28页的例2.1:1 2 3 -4 -2_ -3 -4 -12 13 5A= 2 10 0 -3 104 14 9 -13 7试验结果:x1=1,x2=2,x3=3,x4=4 */#include "Stdio.h"#include "Conio.h"/*L是矩阵的行减1,从程序上看是最外层循环的次数N 对应矩阵的行数,M对应矩阵的列数可以通过改变L、N、M来控制矩的阶数 */#define L 3#define N 4#define M 5void gauss(double a[N][M],double x[N]){int i,j,l,n,m,k=0;double temp[N];/*第一个do-while是将增广矩阵消成上三角形式*/do{n=0;for(l=k;l<L;l++)temp[n++]=a[l+1][k]/a[k][k];for(m=0,i=k;i<N;i++,m++)for(j=k;j<M;j++)a[i+1][j]-=temp[m]*a[k][j];k++;}while(k<N) ;/*第二个do-while是将矩阵消成对角形式,并且重新给k赋值*/ k=L-1;do{n=0;for(l=k;l>=0;l--)temp[n++]=a[k-l][k+1]/a[k+1][k+1];for(m=0,i=k;i>=0;i--,m++)for(j=k;j<M;j++)a[k-i][j]-=temp[m]*a[k+1][j];k--;}while(k>=0) ;/*下一个for是解方程组*/for(i=0;i<N;i++)x[i]=a[i][N]/a[i][i];}void menu(){printf("\n _ _ _ _ _\n");printf(" 1.operation\n");printf(" 2.exit");printf("\n _ _ _ _ _\n");}main(){int i,j,choose;double a[N][M]={0},answer[N];clrscr();while(1){leep:menu();scanf("%d",&choose);switch(choose){case 1:printf("!!The size of Maxrix is %d * %d,each line enter %d element:\n ",N,M,M); for(i=0;i<N;i++){printf("Enter the Matrix's %d line:\n",i);for(j=0;j<N+1;j++)scanf("%lf",&a[i][j]);}printf("\nthe corss matrix is:\n_ _ _ _ _\n");gauss(a,answer);for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%-2lf ",a[i][j]);putchar('\n');}printf("_ _ _ _ _\nthe solve is:\n");for(i=0;i<N;i++)printf("x%d=%lf\n",i+1,answer[i]);break;case 2:exit(0);break;default:printf("input error:\n");goto leep;}}getch();}/*试验:西安交通大学出版社出版的《计算方法》书上28页的例2.1:1 2 3 -4 -2_ -3 -4 -12 13 5A= 2 10 0 -3 104 14 9 -13 7试验结果:x1=1,x2=2,x3=3,x4=4 */程序实现:int n = 3;double[] x = new double[n];double[,] lines = { {2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}};public static void Gauss(int n, double[,] a, double[] x){double d;Console.WriteLine("高斯消去法解方程组的中间过程");Console.WriteLine("============================");Console.WriteLine("中间过程");Console.WriteLine("增广矩阵:");printArray(n, a); Console.WriteLine();// 消元for(int k = 0; k < n; k++){Console.WriteLine("第{0}步", k + 1);Console.WriteLine("初始矩阵:");printArray(n, a); Console.WriteLine();selectMainElement(n, k, a); // 选择主元素Console.WriteLine("选择主元素后的矩阵:");printArray(n, a); Console.WriteLine();// for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / a[k, k];// 若将下面两个语句改为本语句,则程序会出错,因为经过第1次循环// 后a[k,k]=1,a[k,k]的值发生了变化,所以在下面的语句中先用d// 将a[k,k]的值保存下来d = a[k, k];for (int j = k; j <= n; j++ ) a[k, j] = a[k, j] / d;Console.WriteLine("将第{0}行中a[{0},{0}]化为1后的矩阵:", k + 1);printArray(n, a); Console.WriteLine();// Guass消去法与Jordan消去法的主要区别就是在这一步,Gauss消去法是从k+1 // 到n循环,而Jordan消去法是从1到n循环,中间跳过第k行for(int i = k + 1; i < n; i++){d = a[i, k];// 这里使用变量d将a[i,k]的值保存下来的原理与上面注释中说明的一样for (int j = k; j <= n; j++) a[i, j] = a[i, j] - d * a[k, j];} Console.WriteLine("消元后的矩阵:");printArray(n, a); Console.WriteLine();} // 回代x[n - 1] = a[n - 1, n];for (int i = n - 1; i >= 0; i--){x[i] = a[i, n];for (int j = i + 1; j < n; j++) x[i] = x[i] - a[i, j] * x[j];}} // 选择主元素public static void selectMainElement(int n, int k, double[,] a){ // 寻找第k列的主元素以及它所在的行号double t, mainElement;// mainElement用于保存主元素的值int l;// 用于保存主元素所在的行号// 从第k行到第n行寻找第k列的主元素,记下主元素mainElement和所在的行号l mainElement = Math.Abs(a[k, k]); // 注意别忘了取绝对值l = k;for(int i = k + 1; i < n; i++){if (mainElement < Math.Abs(a[i, k])){mainElement = Math.Abs(a[i, k]);l = i;// 记下主元素所在的行号}}// l是主元素所在的行。