- 主题
- 0
- 帖子
- 4
- 精华
- 0
- 积分
- 23
- C币
- 33 枚
- 在线时间
- 1 小时
- 注册时间
- 2009-8-30
- 最后登录
- 2011-8-13
- 性别
- 保密

- 主题
- 0
- 帖子
- 4
- C币
- 33 枚
- 在线时间
- 1 小时
|
发表于 2009-8-30 10:56:43
|显示全部楼层
-
- #include<math.h>
- #include<stdio.h>
- #define NUMBER 20
- #define Esc 0x1b
- #define Enter 0x0d
- float A[NUMBER][NUMBER+1] ,ark;
- int flag,n;
- exchange(int r,int k);
- float max(int k);
- message();
- main()
- {
- float x[NUMBER]; /*此数组用于存放方程解*/
- int r,k,i,j;
- char celect;
- clrscr();
-
- printf("\n\n用Gauss列主元消元法解线性方程组");
- printf("\n\n1.解方程组请按Enter.");
- printf("\n\n2.退出程式请按Esc.");
- celect=getch();
- if(celect==Esc)
- exit(0);
- printf("\n\n 输入方程组的维数:n=");
- scanf("%d",&n);
- printf(" \n\n现在输入系数矩阵A和向量b:");
- for(i=1;i<=n;i++)
- {
- printf("\n\n请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);
- /*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
- for(j=1;j<=n+1;j++) /*将刚才输入的数存入数组*/
- scanf("%f",&A[i][j]);
- }
- for(k=1;k<=n-1;k++)
- {
- ark=max(k);
- if(ark==0) /*判断方程是否为线性方程,即是否合法*/
- {
- printf("\n\n此方程组不合法!");message();
- }
- else if(flag!=k)
- exchange(flag,k);
- for(i=k+1;i<=n;i++)
- for(j=k+1;j<=n+1;j++)
- A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
- }
- x[n]=A[n][n+1]/A[n][n];
- for( k=n-1;k>=1;k--)
- {
- float me=0;
- for(j=k+1;j<=n;j++)
- {
- me=me+A[k][j]*x[j];
- }
- x[k]=(A[k][n+1]-me)/A[k][k];
- }
- for(i=1;i<=n;i++)
- {
- printf(" \n\nx%d=%f",i,x[i]);
- }
- message();
- }
- exchange(int r,int k) /*交换行的矩函数*/
- {
- int i;
- for(i=1;i<=n+1;i++)
- A[0][i]=A[r][i];
- for(i=1;i<=n+1;i++)
- A[r][i]=A[k][i];
- for(i=1;i<=n+1;i++)
- A[k][i]=A[0][i];
- }
- float max(int k) /*比校系数大小的函数*/
- {
- int i;
- float temp=0;
- for(i=k;i<=n;i++)
- if(fabs(A[i][k])>temp)
- {
- temp=fabs(A[i][k]);
- flag=i;
- }
- return temp;
- }
- message() /*实现菜单选择的函数*/
- {
- printf("\n\n 继续运算按 Enter ,退出程式按 Esc!");
- switch(getch())
- {
- case Enter: main();
- case Esc: exit(0);
- default:{printf("\n\n不合法的输入!");message();}
- }
- }
复制代码 |
|