发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归。经过半天的调试,仍找不出纠正的方法。因为并不是算法的问题,而是因为自己对编译器处理 浮点函数的方法不是很理解。明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对。不过如果没有浮点型 的话,这个程序应该算不错了 。
复制代码 代码如下:
#include<stdio.h>
#include<math.h>
#include<mem.h>
#define NUM 100
void print(void) /* 使用说明 */
{ clrscr();
printf("\n\n\n\n\n\t\t\t\t Introduction \n");
printf("\t*--------------------------------------------------------------*\n");
printf("\t* This program was design for compute linear equations. *\n");
printf("\t* The way of use it is very simple. *\n");
printf("\t* First : Input the number of the equation;(Input 0 to exit) *\n");
printf("\t* Second: Input the coefficient of every eqution; *\n");
printf("\t* Third : Input the constant of every eqution; *\n");
printf("\t* Last : Chose the way you want use to solve the equtions; *\n");
printf("\t* That's all, input any key to run it . . . *\n");
printf("\t*-------------------------By__TJX------------------------------*\n");
getch(); }
void chose(void) /*选择计算方法*/
{ clrscr();
fflush(stdin);
printf("\n\n\n\n\n\t\t**********Introduction********** \n");
printf("\t\t* Chose the way,please. * \n");
printf("\t\t* a : Gauss eliminant. * \n");
printf("\t\t* b : Gauss_yd eliminant. * \n");
printf("\t\t* c : Iterative way. * \n");
printf("\t\t* d : Cramer way. * \n");
printf("\t\t* e : exit. * \n");
printf("\t\t*************By__TJX************ \n");
printf("\t\tPlease choose number :\n");}
void input(double **a1,double b1[],int num) /*数据输入*/
{ int i,j,t;
double *p;
char de1,de2;
do{
printf("Please input array a[%d][%d]: \n",num,num);
printf("Warn: The first number of the array mustn't contain zero! \n");
for(i=1;i<=num;i++)
{printf("Please input array a[%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("The input is invalid,please input again:\n"); scanf("%f",&a1[i][j]);}
}while(a1[i][j]==0);}
else scanf("%lf",&a1[i][j]);}}
printf(" \nPlease check the value of array a[%d][%d],press Y to input again.\n",num,num);
do{
de1=getch();
}while(de1!='y'&&de1!='Y'&&de1!='n'&&de1!='N');
}while(de1=='y'||de1=='Y');
do{
printf("Please input array b[%d]: \n",num);
p=b1+1;
for(i=1;i<=num;i++)
scanf("%lf",p++);
printf(" \nPlease check the value of array b[%d],press Y to input again.\n",num);
do{
de2=getch();
}while(de2!='y'&&de2!='Y'&&de2!='n'&&de2!='N');
}while(de2=='y'||de2=='Y');}
int max(double *t1, double x1[],int n) /*迭代子函数*/
{ int i,temp=0;
for(i=1;i<=n;i++)
if(fabs(x1[i]-t1[i])>1e-2) {temp=1;break;}
/* printf(" %d ",temp); */
return temp;
}
int ddcompute(double **a1,double b1[],double x1[],int n) /*迭代法计算*/
{double *t;
int i,j,k=0;
double sum1=0.0,sum2=0.0;
t=(double*)malloc(n*sizeof(double));
printf("\nPlease Input The Initial Value of x:\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: These equtions can't be solve by this way!\n Press any Key to continue...");
getch();
free(t);
return 0;}
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);
return 1; }
int gscompute(double **a1,double b1[],double x1[],int n) /*高斯消元法计算*/
{int i,j,k;
double m,sum;
for(k=1;k<=n-1;k++)
for(i=k+1;i<=n;i++)
{ if(a1[k][k]==0) {printf(" \nThese equtions can't be solve is this way.\n Press any Key to continue...");
getch();
return 0; }
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;}}
/* yi xia ji suan x zhi */
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];}
return 1; }
int gs_ydcompute(double **a1,double b1[],double x1[],int n) /*高斯_约当法计算*/
{int i,j,k;
double m,sum;
for(k=1;k<=n;k++)
{i=1;
while(i<=n)
{ if(a1[k][k]==0) {printf(" \nThese equtions can't be solve is this way.\n Press any Key to continue...");
getch(); return 0;}
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++;}
else i++; }}
/* yi xia ji suan x zhi */
for(i=n;i>=1;i--)
x1[i]=b1[i]/a1[i][i];
return 1;}
double computed(double **a,int h,int l, int *c1,int n) /*计算系数行列式D值*/
{ int i, j,p=1;
double sum=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; }
return sum; }
void ncompute(double **a,double b[],double x[],int n,int *c,double h) /*克莱姆法计算*/
{int i,j;
double t[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()
{double x[NUM];
double b[NUM];
int i,j=2,n=0;
int *c;
double he;
char m,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("n is too large,please input again:\n");
else
printf("Please input the total number of the equations n(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]);}
}
else if(j==0)
{printf(" \nThese equtions can't be solve is this way.\nPlease chose the other way."); goto Other;}
else {for(i=1; i<NUM; i++) free(a[i]);
free(a);
free(c);
exit(1);}
}
else printf(" \n\n\tD=%.4f\n This linear equations hasn't accurate answer!",he);
printf(" \n Do you want to continue?(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);}
相关推荐:
SEO重要性与企业互联网发展的必由之路,互联网营销推广平台设计
互联网资源的无限潜力:如何利用数字世界为个人和企业创造价值,信阳网站建设正规公司
优方法-高效生活与工作的秘密武器,钻石营销推广方案
seo跟sem是什么,seo和sem的概念 ,惠威的ai功能
如何通过AI写文章,轻松提高写作效率与质量
为什么要做seo si,为什么要做* ,ai里面怎么扣二维码
AI智能时代的到来:如何利用人工智能推动生活与商业创新,ai相册下载
OpenAIGPT:开启智能时代的语言革命,ai辣妹动漫
乘风SEO:突破困境,领航网络营销新时代,武汉靠谱的关键词排名
AI助手推进:智能化时代的企业革命,ai改变图片颜色
《命运交错的轨迹:小说背后的无尽魅力》,seo优化huifachina
chatai写作免费一键生成,轻松解决写作难题!,陈逗逗ai换脸在线看
AI网页效果生成:开启网站设计的新纪元,ai画线祥云
ChatGPT中文版下载免费版:智能对话新时代,尽在,ai光波
为什么行业都要做seo,为什么要做seo ,ai明信片
ChatGPT内部HTTP接口文档-为开发者提供高效便捷的AI服务接入方式,安屿ai
ChapGPT免费爬墙,轻松访问全球互联网资源!,蜜桃ai插画
seo点击工具,seo排名点击软件推荐 ,ai狂躁
为什么seo这么麻烦,seo是什么意思 为什么要做seo ,dota1ai地图命令选ai
高效创作之路:文章AI生成器的力量
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
ChatGPTWindows版本下载:让AI助力您的工作和生活,ai yamama
SEO兼职:如何通过SEO兼职实现收入增长与职业突破,濮阳网站建设官网
SEO拓客,让您的业务飞速增长!,密云自适应网站建设
ChatGPT回答是空白的背后,究竟隐藏着什么秘密?,如何用ai写作来赚钱
产品seo什么意思,产品seo标题是什么 ,ai模仿张宇
AI免费写文:创作新时代的高效助手
SEO建议:如何通过优化提升网站流量,赢得市场竞争,自媒体网站免费推广平台
SEO单页网站:助力企业在线营销的一站式解决方案,湖南视频网站优化方式
AI网页版本:开启智能时代的新篇章,拼音标调ai
AI免费工具:提升效率与创意的秘密武器
AI免费生成:开启智能创作新纪元,助力你的创意无限可能
丹东seo是什么怎么选,丹东spr ,黑发ai图
颠覆写作方式:免费的AI续写软件助你轻松创作
seo适合看什么书,自学seo书籍推荐 ,ai少女 刻晴
文字生成AI:开启创意写作的新纪元
SEO优化排名原理解析:如何提高网站排名,实现精准流量获取,奥迪ai售价
SEO管家:为您的网站保驾护航的智能SEO助手,网站推广作用有哪些类型
未来智能:AI智能人工软件引领数字化变革
ChatGPT4账号共享-让AI助力你的学习与工作,轻松提升效率,ai巨无霸
文字写作AI生成工具:让创作更简单、更高效
AI做文章:引领智能创作的未来
用AI优化文章,轻松提升内容质量与创作效率
软件AI的全称:人工智能驱动未来的关键力量
SEO量:提升网站流量和排名的关键法则,德兴seo
优化工具:提升工作效率的秘密武器,网站模板的优化策略是什么
如何下载免费AI软件,让你的工作和生活更智能
《收录情况:数字时代的网络信息检索与价值体现》,山东全域营销推广软件客服电话
SEO策划:让你的网站迅速脱颖而出的秘诀,seo优化和技巧
ChatGPT:OpenAI的创新之作-一款颠覆传统的语言模型,ai球衣号