C语言网

 找回密码
 加入社区!

QQ登录

只需一步,快速开始

查看: 820|回复: 2

C语言 用Gauss列主元消元法解线性方程组 [复制链接]

Rank: 1

主题
0
帖子
4
C币
33 枚
在线时间
1 小时
发表于 2009-8-30 10:56:43 |显示全部楼层
分享到:

  1. #include<math.h>
  2. #include<stdio.h>
  3. #define NUMBER 20
  4. #define Esc   0x1b
  5. #define Enter 0x0d
  6. float A[NUMBER][NUMBER+1] ,ark;
  7. int flag,n;
  8. exchange(int r,int k);
  9. float max(int k);
  10. message();
  11. main()
  12. {
  13.    float x[NUMBER];      /*此数组用于存放方程解*/
  14.    int r,k,i,j;
  15.    char celect;
  16.    clrscr();
  17.    
  18.    printf("\n\n用Gauss列主元消元法解线性方程组");
  19.    printf("\n\n1.解方程组请按Enter.");
  20.    printf("\n\n2.退出程式请按Esc.");
  21.    celect=getch();
  22.    if(celect==Esc)
  23.      exit(0);
  24.    printf("\n\n 输入方程组的维数:n=");
  25.    scanf("%d",&n);
  26.      printf(" \n\n现在输入系数矩阵A和向量b:");
  27.    for(i=1;i<=n;i++)
  28.    {
  29.     printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
  30.          /*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
  31.     for(j=1;j<=n+1;j++)     /*将刚才输入的数存入数组*/
  32.     scanf("%f",&A[i][j]);
  33.    }
  34.    for(k=1;k<=n-1;k++)                       
  35.    {
  36.     ark=max(k);
  37.     if(ark==0)                /*判断方程是否为线性方程,即是否合法*/
  38.     {
  39.       printf("\n\n此方程组不合法!");message();   
  40.     }
  41.     else if(flag!=k)
  42.      exchange(flag,k);
  43.      for(i=k+1;i<=n;i++)
  44.      for(j=k+1;j<=n+1;j++)
  45.      A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
  46.    }
  47.    x[n]=A[n][n+1]/A[n][n];
  48.    for( k=n-1;k>=1;k--)
  49.    {
  50.      float me=0;
  51.      for(j=k+1;j<=n;j++)
  52.      {
  53.        me=me+A[k][j]*x[j];
  54.      }
  55.        x[k]=(A[k][n+1]-me)/A[k][k];
  56.    }
  57.    for(i=1;i<=n;i++)
  58.    {
  59.      printf(" \n\nx%d=%f",i,x[i]);
  60.    }
  61.    message();
  62. }
  63. exchange(int r,int k)         /*交换行的矩函数*/
  64. {
  65.   int i;
  66.   for(i=1;i<=n+1;i++)
  67.     A[0][i]=A[r][i];
  68.   for(i=1;i<=n+1;i++)
  69.     A[r][i]=A[k][i];
  70.   for(i=1;i<=n+1;i++)
  71.     A[k][i]=A[0][i];
  72. }
  73. float max(int k)           /*比校系数大小的函数*/
  74. {
  75.   int i;
  76.   float temp=0;
  77.   for(i=k;i<=n;i++)
  78.     if(fabs(A[i][k])>temp)
  79.     {
  80.       temp=fabs(A[i][k]);
  81.       flag=i;
  82.     }
  83.   return temp;
  84. }
  85. message()                                       /*实现菜单选择的函数*/
  86. {
  87.   printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
  88.   switch(getch())
  89.   {
  90.    case Enter: main();
  91.    case Esc: exit(0);
  92.    default:{printf("\n\n不合法的输入!");message();}
  93.   }
  94. }
复制代码

Rank: 1

主题
0
帖子
5
C币
3 枚
在线时间
1 小时
发表于 2009-9-2 14:44:25 |显示全部楼层
看看先~~~

Rank: 1

主题
0
帖子
3
C币
18 枚
在线时间
1 小时
发表于 2011-11-9 21:34:12 |显示全部楼层
有错误啊
您需要登录后才可以回帖 登录 | 加入社区!

C语言 ( 粤ICP备11042647号-2 )

GMT+8, 2012-5-20 17:49

©2009-2011 cyuyan.com.cn

回顶部