C语言解线性方程的四种方法
2023-06-13 09:15:12 时间
发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归。经过半天的调试,仍找不出纠正的方法。因为并不是算法的问题,而是因为自己对编译器处理浮点函数的方法不是很理解。明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对。不过如果没有浮点型的话,这个程序应该算不错了。
复制代码代码如下:
#include<stdio.h>
#include<math.h>
#include<mem.h>
#defineNUM100
voidprint(void) /*使用说明*/
{clrscr();
printf("\n\n\n\n\n\t\t\t\tIntroduction\n");
printf("\t*--------------------------------------------------------------*\n");
printf("\t* Thisprogramwasdesignforcomputelinearequations. *\n");
printf("\t* Thewayofuseitisverysimple. *\n");
printf("\t* First:Inputthenumberoftheequation;(Input0toexit)*\n");
printf("\t* Second:Inputthecoefficientofeveryeqution; *\n");
printf("\t* Third:Inputtheconstantofeveryeqution; *\n");
printf("\t* Last:Chosethewayyouwantusetosolvetheequtions;*\n");
printf("\t* That"sall,inputanykeytorunit... *\n");
printf("\t*-------------------------By__TJX------------------------------*\n");
getch();}
voidchose(void) /*选择计算方法*/
{clrscr();
fflush(stdin);
printf("\n\n\n\n\n\t\t**********Introduction**********\n");
printf("\t\t*Chosetheway,please. *\n");
printf("\t\t*a:Gausseliminant. *\n");
printf("\t\t*b:Gauss_ydeliminant. *\n");
printf("\t\t*c:Iterativeway. *\n");
printf("\t\t*d:Cramerway. *\n");
printf("\t\t*e:exit. *\n");
printf("\t\t*************By__TJX************\n");
printf("\t\tPleasechoosenumber:\n");}
voidinput(double**a1,doubleb1[],intnum) /*数据输入*/
{inti,j,t;
double*p;
charde1,de2;
do{
printf("Pleaseinputarraya[%d][%d]:\n",num,num);
printf("Warn:Thefirstnumberofthearraymustn"tcontainzero!\n");
for(i=1;i<=num;i++)
{printf("Pleaseinputarraya[%d][]:\n",i);
for(j=1;j<=num;j++)
{t=0;
if(i==1&&j==1)
{do{
if(t==0){scanf("%lf",&a1[i][j]);t++;}
else{printf("Theinputisinvalid,pleaseinputagain:\n");scanf("%f",&a1[i][j]);}
}while(a1[i][j]==0);}
elsescanf("%lf",&a1[i][j]);}}
printf("\nPleasecheckthevalueofarraya[%d][%d],pressYtoinputagain.\n",num,num);
do{
de1=getch();
}while(de1!="y"&&de1!="Y"&&de1!="n"&&de1!="N");
}while(de1=="y"||de1=="Y");
do{
printf("Pleaseinputarrayb[%d]:\n",num);
p=b1+1;
for(i=1;i<=num;i++)
scanf("%lf",p++);
printf("\nPleasecheckthevalueofarrayb[%d],pressYtoinputagain.\n",num);
do{
de2=getch();
}while(de2!="y"&&de2!="Y"&&de2!="n"&&de2!="N");
}while(de2=="y"||de2=="Y");}
intmax(double*t1,doublex1[],intn) /*迭代子函数*/
{inti,temp=0;
for(i=1;i<=n;i++)
if(fabs(x1[i]-t1[i])>1e-2){temp=1;break;}
/*printf(" %d ",temp);*/
returntemp;
}
intddcompute(double**a1,doubleb1[],doublex1[],intn)/*迭代法计算*/
{double*t;
inti,j,k=0;
doublesum1=0.0,sum2=0.0;
t=(double*)malloc(n*sizeof(double));
printf("\nPleaseInputTheInitialValueofx:\n");
for(i=1;i<=n;i++)
scanf("%lf",&x1[i]);
do{k++;
for(i=1;i<=n;i++)
t[i]=x1[i];
for(i=1;i<=n;i++)
{sum1=0.0;sum2=0.0;
for(j=1;j<=i-1;j++)sum1=sum1+a1[i][j]*x1[j];/*printf("sum1=%0.4f",sum1);*/
for(j=i+1;j<=n;j++)sum2=sum2+a1[i][j]*t[j];/*printf("sum2=%0.4f",sum2);}*/
if(a1[i][i]==0||fabs(sum1)>1e+12||fabs(sum2)>1e+12)
{printf("\nWarning:Theseequtionscan"tbesolvebythisway!\nPressanyKeytocontinue...");
getch();
free(t);
return0;}
x1[i]=(b1[i]-sum1-sum2)/a1[i][i];}
}while(max(t,x1,n));
/*for(i=1;i<=n;i++)
{if(i%3==0)printf("\n");
printf(" %.4f ",x1[i]);}*/
free(t);
return1;}
intgscompute(double**a1,doubleb1[],doublex1[],intn)/*高斯消元法计算*/
{inti,j,k;
doublem,sum;
for(k=1;k<=n-1;k++)
for(i=k+1;i<=n;i++)
{if(a1[k][k]==0){printf("\nTheseequtionscan"tbesolveisthisway.\nPressanyKeytocontinue...");
getch();
return0;}
if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}
else{for(j=k+1;j<=n;j++)
a1[i][j]=a1[i][j]+a1[k][j]*m;
b1[i]=b1[i]+b1[k]*m;}}
/*yixiajisuanxzhi*/
x1[n]=b1[n]/a1[n][n];
for(i=n-1;i>=1;i--)
{sum=0.0;
for(j=n;j>=i+1;j--)
sum=sum+a1[i][j]*x1[j];
x1[i]=(b1[i]-sum)/a1[i][i];}
return1; }
intgs_ydcompute(double**a1,doubleb1[],doublex1[],intn)/*高斯_约当法计算*/
{inti,j,k;
doublem,sum;
for(k=1;k<=n;k++)
{i=1;
while(i<=n)
{if(a1[k][k]==0){printf("\nTheseequtionscan"tbesolveisthisway.\nPressanyKeytocontinue...");
getch(); return0;}
if(i!=k)
{if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}
else{for(j=k+1;j<=n;j++)
a1[i][j]=a1[i][j]+a1[k][j]*m;
b1[i]=b1[i]+b1[k]*m;}
i++;}
elsei++; }}
/*yixiajisuanxzhi*/
for(i=n;i>=1;i--)
x1[i]=b1[i]/a1[i][i];
return1;}
doublecomputed(double**a,inth,intl,int*c1,intn)/*计算系数行列式D值*/
{inti,j,p=1;
doublesum=0.0;
if(h==n)
sum=1.0;
else{
i=++h;
c1[l]=0;
for(j=1;j<=n;j++)
if(c1[j])
if(a[i][j]==0)p++;
else{sum=sum+a[i][j]*computed(a,i,j,c1,n)*pow(-1,1+p);p++;} c1[l]=1;}
returnsum;}
voidncompute(double**a,doubleb[],doublex[],intn,int*c,doubleh) /*克莱姆法计算*/
{inti,j;
doublet[NUM];
for(j=1;j<=n;j++)
{for(i=1;i<=n;i++)
{t[i]=a[i][j];a[i][j]=b[i];}
x[j]=computed(a,0,0,c,n)/h;
for(i=1;i<=n;i++)
a[i][j]=t[i];}
}
main()
{doublex[NUM];
doubleb[NUM];
inti,j=2,n=0;
int*c;
doublehe;
charm,decision;
double**a;
a=(double**)malloc(NUM*sizeof(double*));
for(i=0;i<NUM;i++)
a[i]=(double*)malloc(NUM*sizeof(double));
print();
do{
clrscr();
do{
if(n>=NUM)printf("nistoolarge,pleaseinputagain:\n");
else
printf("Pleaseinputthetotalnumberoftheequationsn(n<NUM):\n");
scanf("%d",&n);
}while(n>NUM);
if(n==0){for(i=1;i<NUM;i++)free(a[i]);
free(a);exit(1);}
input(a,b,n);
c=(int*)malloc((n+1)*sizeof(int));
memset(c,1,(n+1)*sizeof(int));
he=computed(a,0,0,c,n);
if(fabs(he)>1e-4)
{
Other: chose();
do{
m=getche();
}while(m!="a"&&m!="b"&&m!="A"&&m!="B"&&m!="c"&&m!="C"&&m!="d"&&m!="D"&&m!="e"&&m!="E");
switch(m)
{case"a":;
case"A":j=gscompute(a,b,x,n); break;
case"b":;
case"B":j=gs_ydcompute(a,b,x,n);break;
case"c":;
case"C":j=ddcompute(a,b,x,n); break;
case"d":;
case"D":j=1;ncompute(a,b,x,n,c,he);break;
case"e":;
case"E":j=2;break;
default:j=2;break;
}
if(j==1)
{ clrscr();
printf("\n\n\n\n");
printf(" D=%.4f\n",he);
for(i=1;i<=n;i++)
{if(i%5==0)printf("\n");
printf(" %.4f ",x[i]);}
}
elseif(j==0)
{printf("\nTheseequtionscan"tbesolveisthisway.\nPleasechosetheotherway.");gotoOther;}
else{for(i=1;i<NUM;i++)free(a[i]);
free(a);
free(c);
exit(1);}
}
elseprintf("\n\n\tD=%.4f\nThislinearequationshasn"taccurateanswer!",he);
printf("\nDoyouwanttocontinue?(Y/N)\n");
do{
decision=getchar();}while(decision!="y"&&decision!="Y"&&decision!="n"&&decision!="N");
}while(decision=="y"||decision=="Y");
for(i=1;i<NUM;i++)free(a[i]);
free(a);
free(c);}
相关文章
- C语言求素数的方法_用c语言求1~n的素数个数
- 用递归方法求n的阶乘【C语言实现】
- 【C语言经典面试题】memcpy函数有没有更高效的拷贝实现方法?
- C语言常用的字符串函数及案例
- 数组越界及其避免方法,C语言数组越界详解
- C语言main()函数
- C语言杨辉三角(两种方法)
- 文件Linux下的C语言调用动态链接库文件实践(linuxc调用so)
- 如何在Linux环境下使用C语言清空文件(linuxc文件清空)
- MySQL上利用C语言编写的数据库操作方法(c 关于mysql的方法)
- C语言中MySQL导出数据的方法简介(c 中mysql导出数据)
- C语言实现TCP连接MySQL的方法(c tcp连接mysql)
- C语言使用MySQL读取数据结果的方法(c mysql 读取结果)
- 使用C语言和MySQL快速抓取实例的下载方法(c mysql 实例下载)
- C语言中MySQL增添新列的方法(c mysql增加一列)
- C语言实现MySQL例程,轻松搞定(c mysql 例程)
- C语言连接Oracle数据库的方法探究(c 连接oracle方法)
- Oracle数据库C语言开发优势探究(c 能开发oracle么)
- 使用C语言封装Oracle数据库的方法研究(c oracle封装)
- C语言实现Oracle数据库中存储图像的方法(c oracle 存图像)
- C语言解决不用+、-、×、÷数字运算符做加法的实现方法
- 使用C语言递归与非递归实现字符串反转函数char*reverse(char*str)的方法
- C语言中判断int,long型等变量是否赋值的方法详解