#include "stdio.h"
#include "math.h"
#include "conio.h"
#define N 3
static double aa[N][N] = {{1,2,-1} , {1,-1,5} , {4,1,-2}};
static double bb[N+1] = {3,0,2};
void main()
{
    int i,j;
    double a[N+1][N+1] , b[N+1] ; 
 double x[N+1] ;
 double det;
    double gaussl(double a[][N+1] , double b[], double x[]);
    void disp(double a[][N+1] , double b[]);
    
    for( i=1; i <= N; i++ )
    {
        for( j=1; j <= N; j++)
          a[i][j] = aa[i-1][j-1] ;  
          
        b[i] = bb[i-1];  
    }
 //gaussl(a,b,x);
    
   det = gaussl(a,b,x);
    
   if(det != 0)
    {
        printf("\n方程组的解为:");
        
        for( i=1; i <= N; i++ )
          printf(" x[%d]=%f",i,x[i]);
        printf("\n\n系数矩阵的行列式值=%f",det);
    }
    else printf("\n\n系数矩阵奇异阵,高斯方法失败!:");
    getch();
}
double gaussl(double a[][N+1] , double b[], double x[])
{
   
 double max1 , max2;  /* max 主元 */
 double p,q;
 double m1,m2;
 int i , j , k=1 ;
 int t;
    printf("消元前增广矩阵:\n");
    disp( a ,  b);
   for( i=1; i <= N; i++ )
 {
        max1 = a[1][1];
  if( a[i][1] > max1 )
  {
   max1 = a[i][1];
   t = i;
  }
   }
   for( i=1; i <= N; i++ )
   {
  p = a[1][i] ;
  a[1][i] = a[t][i] ;
        a[t][i] = p;
   }
   q = b[1];
   b[1] = b[t];
   b[t] = q;
 
    printf("交换第1,%d行\n",t);  /* t hang */
    disp( a ,  b);
m1 = a[t][1]/max1; /* xiang chu wei yi ,yin wei max1 = a[1][1] */
    for( i=1; i <= N; i++ )
 {
  
  for( j=1; j <= N; j++ )
  {
   if(i != 1)
   {
    a[i][j] = a[i][j] - (a[1][j]*m1);
   }
  }
  if(i != 1)
  {
   b[i] = b[i] - (b[1]*m1);
  }
 }
    printf("第%d次消元:\n",k);
    disp( a ,  b);
    for( i=k+1; i <= N; i++ )
 {
  max2 = a[k+1][k+1];
  if( a[i][k+1] > max2 )
  {
   max2 = a[i][k+1];
   t = i;
  }
 }
 for( i=k+1; i <= N; i++ )
 {
  p = a[k+1][i] ;
  a[k+1][i] = a[t][i] ;
        a[t][i] = p;
 }
  q = b[k+1];
  b[k+1] = b[t];
  b[t] = q;           /* jiang b shu zu yong xun huan jiao huan ,que wei yong dao bian liang i */
 
    printf("交换第%d,%d行\n",k+1,t);
    disp( a ,  b);
m2 = a[t][k+1]/max2;
    for( i=k+1; i <= N; i++ )
 {
  
  for( j=k+1; j <= N; j++ )
  {
   if(i != k+1)
   {
    a[i][j] = a[i][j] - (a[k+1][j]*m2);
   }
  }
  if(i != k+1)
  {
   b[i] = b[i] - (b[k+1]*m2);
  }
 }
    printf("第%d次消元:\n",k+1);
    disp( a ,  b);
  x[3] = b[3] / a[3][3] ;  /* ci chu ke yong for xun huan shu zu lai gai gai zui hao */
 x[2] = (b[2] - x[3]*a[2][3])/a[2][2];
 x[1] = (b[1] - x[3]*a[1][3] - x[2]*a[1][2])/a[1][1];
return ( a[1][1]*a[2][2]*a[3][3]); /* ci chu ke yong for xun huan shu zu lai gai gai zui hao */
}
void disp(double a[][N+1] , double b[]) /*用于显示选主元及消元运算中间增广矩阵结果*/
{ /* 由gaussl()调用  */
int i,j;
   
   for( i=1; i <= N; i++ )
   {
     for( j=1; j <= N; j++ )
  {
   printf(" ");
   printf("%f",a[i][j]);
  }
     printf(" ");
  printf("%f",b[i]);
  printf("\n");
   }
}