用C语言编写二个通用计算程序

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:lfm888
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:在中学数学教学内容中,应用一元二次方程求根公式计算一元二次方程的根和应用高斯主元素消去法计算线性方程组的解是一部分具有机械计算性的程式化的单元,这使得很适合用C语言编写其计算程序。按照结构化思路设计编写C程序的二个实例。
  关键词:C语言;结构化;计算程序
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31611-03
  Compiling two General Computer Programs in C Language
  LIU Xiao-mang
  (Jiangxi College of Applied Technology,Ganzhou 341000,China)
  Abstract:In the middle school's mathematics curriculum,the calculating of the solution of a quadratic equation with two unknowns with its formula and the calculating of the solution of linear equation with Goss's eliminating the major elements solution are two units which involves mechanical formula computation. They are suitable for compiling computer programs in C Language. Here are two examples of compiling C program with the perspective of construction.
  Key words:C Language; construction;computing sequence
  
  在中学数学教学内容中,应用一元二次方程求根公式计算一元二次方程的根和应用高斯主元素消去法计算线性方程组的解是一部分具有机械计算性的程式化的单元,这使得很适合用C语言编写其计算程序. 下面即二个实例.
  
  1 用求根公式解一元二次方程的程序
  
  从代数学中知道,应用一元二次方程求根公式计算一般一元二次方程ax2+bx+c=0根的全过程和一元二次方程根的可能情况如下:
  观察判断a和b是否为零.
  如果a=b=0,那么方程为0x2+0x+0=0,无穷多解,或0x2+0x+c=0(c≠0),无解;
  如果a=0,b≠0,那么方程为0x2+bx+c=0,x=-c/b;
  如果a≠0,那么方程为
  ax2+0x+0=0, ax2+0x+c=0, ax2+bx+0=0, ax2+bx+c=0
  之一,可统一为
  (1)若d=b2-4ac<0,则有一对共轭复根
  (2)若d=b2-4ac=0,则有重根
  (3)若d=b2-4ac>0,则有一对相异实根
  简要显示题目和有关信息;设置变量h作为解一元二次方程次数的计数器(亦即题号);由键盘输入一元二次方程的二次项系数、一次项系数和常数项;用一组标记值0 0 0控制解题完毕.
  C程序
  #include"math.h"
  main()
  {int h;
  double a,b,c,d,r,s;
  printf("\n");printf("\n");
  printf("用求根公式解一元二次方程:");
  printf("\n");
  h=0;
  loop:h=h+1;
  printf("\n");printf("\n");
  printf("%d.%14ca b c=?%c",h,'','');
  scanf("%lf%lf%lf",&a,&b,&c);
  printf("\n");
  if(a==0.0&&b==0.0&&c==0.0)printf("%16c完毕.",'');
  else{printf("%10c解方程%4.2fx*x",'',a);
  if(b<0.0)printf("%4.2fx",b);
  else printf ("+%4.2fx",b);
  if(c<0.0)printf("%4.2f=0.00",c);
  else printf("+%4.2f=0.00",c);
  printf("\n");printf("\n");
  if(a==0.0&&b==0.0)printf("%16c无解",'');
  else if(a==0.0)printf("%16cx=%f",'',-c/b);
  else{d=b*b-4*a*c,r=-b/(2.0*a),s=sqrt(fabs(d))/(2.0*a);
  if(d<0.0&&s<0.0)
  printf("%16cx1=%4.2f%4.2fi%16cx2=%4.2f+%4.2fi",'',r,s,'',r,fabs(s));
  if(d<0.0&&s>=0.0)
  printf("%16cx1=%4.2f+%4.2fi%16cx2=%4.2f-%4.2fi",'',r,s,'',r,s);
  if(d==0.0)printf("%16cx1=x2=%4.2f",'',r);
  if(d>0.0)printf("%16cx1=%4.2f%16cx2=%4.2f",'',r+s,'',r-s);}goto loop;}}
  运行显示
  用求根公式解一元二次方程:
  (1)a b c=? 1 2 1
  解方程1.00x*x+2.00x+1.00=0.00
  x1=x2=-1.00
  (2)a b c=? 1 1 0
  解方程1.00x*x+1.00x+0.00=0.00
  x1=0.00x2=-1.00
  (3)a b c=? 1 2 -3
  解方程1.00x*x+2.00x-3.00=0.00
  x1=1.00x2=-3.00
  (4)a b c=? 4 -4 2
  解方程4.00x*x-4.00x+2.00=0.00
  x1=0.50+0.50ix2=0.50-0.50i
  (5)a b c=? 0 0 2
  解方程0.00x*x+0.00x+2.00=0.00
  无解
  (6)a b c=? 0 0 0
  完毕.
  
  2 用高斯主元素消去法解线性方程组的程序
  
  设线性方程组写成
  其中Ai,k为非奇异实矩阵.
  解线性方程组的高斯主元素消去法如下:
  首先在系数矩阵中找出模最大的元素(主元素),将其所在行与第一行互换,并将其所在列的其它元素消去. 继而对从第二行开始的n-1 行矩阵重复上述变换,直至第n行. 最后, 再将结果次序适当排列即得线性方程组的解.
  例如,给出一线性方程组:
  这里,选择的主元素必须不等于零,否则方程组系数矩阵对应的行列式D=0,方程组无解或有无穷多解,不予讨论.
  上面方法步骤总结归纳成为下面计算算法:
  读入方程组系数和常数项.
  (1)显示方程组;
  (2)设置变量i为消元次数计数器,1=>i;
  *找增广矩阵左下角n-i+1行n列矩阵的主元素,主元素=>t,主元素所在行、列序号=>p、q. 交换i行(主行)与p行(主元素所在行),将主元素所在列其它元素化为0. i+1=>i,若i≤n,则转*;
  (3)去系数并显示方程组的解.
  根据高斯主元素消去法的计算算法,可以在其C程序中划分出显示、消元和求解三个功能函数,按照结构化思路设计编写C程序.
  简要显示题目和有关信息;设置变量h 作为解线性方程组次数的计数器(亦即题号);由键盘输入线性方程组的未知数个数、系数和常数项;用一个标记值0控制解题完毕.
  C程序
  #include"math.h"
  main()
  {void xs(double b[7][8],int n);
  void xy(double b[7][8],int l[7],int n,double u[1]);
  void qj(double b[7][8],int l[7],int n);
  int h,n,i,j,m[7];
  double a[7][8],t[1];
  printf("\n");printf("\n");
  printf("用高斯主元素消去法解线性方程组:");
  printf("\n");printf("\n");
  h=0;
  loop:h=h+1;
  printf("%d.%18c线性方程组的未知数个数 n=?%c",h,'','');
  scanf("%d",&n);
  printf("\n");
  if(n==0)printf("%20c完毕.",'');
  else{printf("%20c线性方程组的系数和常数项=?%c",'','');
  printf("\n");printf("\n");
  for(i=1;i<=n;i++)
  for(j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
  printf("\n");
  xs(a,n);
  for(i=1;i<=n;i++)m[i]=0;
  t[0]=0.0;
  xy(a,m,n,t);
  printf("%12c|",'');
  printf("\n");printf("\n");
  xs(a,n);
  if(t[0]==0.0)printf("%20c主元素=0\n\n",'');
  else qj(a,m,n);
  goto loop;}}
  void xs(double b[7][8],int n)
  {int i,j;
  for(i=1;i<=n;i++)
  {printf("%4.2fx1",b[i][1]);
  for(j=2;j<=n;j++)
  if(b[i][j]<0.0)printf("%4.2fx%d",b[i][j],j);
  else printf("+%4.2fx%d",b[i][j],j);
  printf("=%4.2f",b[i][j]);
  printf("\n");printf("\n");}}
  void xy(double b[7][8],int l[7],int n,double u[1])
  {int i,j,k,p,q;
  double c,r;
  for(i=1;i<=n;i++)
  {p=i,q=1,u[0]=b[i][1];
  for(j=i;j<=n;j++)
  for(k=1;k<=n;k++)
  if(fabs(b[j][k])>fabs(u[0]))u[0]=b[j][k],p=j,q=k;
  if(u[0]!=0.0){for(k=1;k<=n+1;k++)c=b[i][k],b[i][k]=b[p][k],b[p][k]=c;
  for(j=1;j<=n;j++)if((j!=i)&&(b[j][q]!=0.0)) {r=b[j][q]/b[i][q];for(k=1;k<=n+1;k++)b[j][k]=b[j][k]-b[i][k]*r;}}l[i]=q;}}
  void qj(double b[7][8],int l[7],int n)
  {int i,j;
  double s[7];
  for(i=1;i<=n;i++)j=l[i],s[j]=b[i][n+1]/b[i][j];
  for(j=1;j<=n;j++)if(s[j]<0.0)printf("%21c%d=%f\n\n",'x',j,s[j]);
  else printf("%21c%d=+%f\n\n",'x',j,s[j]);}
  运行显示
  用高斯主元素消去法解线性方程组:
  (1)线性方程组的未知数个数 n=? 3
  线性方程组的系数和常数项=?
  1 2 2 5 2 6 5 22 1 -2 -3 -1
  1.00x1+2.00x2+2.00x3=5.00
  2.00x1+6.00x2+5.00x3=22.00
  1.00x1-2.00x2-3.00x3=-1.00
  |
  -0.00x1+6.00x2+0.00x3=54.00
  1.67x1+0.00x2+0.00x3=-1.67
  0.00x1+0.00x2+0.60x3=-3.60
  x1=-1.00000
  x2=+9.000000
  x3=-6.000000
  (2)线性方程组的未知数个数 n=? 2
  线性方程组的系数和常数项=?
  1 2 3 1 2 4
  1.00x1+2.00x2=3.00
  1.00x1+2.00x2=4.00
  |
  1.00x1+2.00x2=3.00
  0.00x1+0.00x2=1.00
  主元素=0
  (3)线性方程组的未知数个数 n=? 0
  完毕.
  除上面用C语言编写的二个通用计算程序外,在中学数学教学内容中还有一些计算算法可以用C语言编写其计算程序,限于篇幅,这里就不赘述了。
  参考文献:
  [1]谭浩强.C程序设计.第2版.北京:清华大学出版社,1999.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
摘要:移动通信已成为当代通信领域内发展潜力最大、市场前景最广的热点技术。它的发展已经历了几代,本文首先介绍了移动通信发展历程,然后在分析4G移动通信系统的特点基础上,对4G采用的关键技术:MIMO + OFDM技术、智能天线技术、软件无线电和IPv6进行了研究和分析。  关键词:移动通信;1G;2G;3G;4G  中国分类号:TN911文献标识码:A 文章编号:1009-3044(2007)18-
期刊
摘要:本文简述了在JSP页面中对SQL Server数据库进行备份和恢复的方法,并通过证明该方法能够很好的实现数据备份和恢复。  关键词:JSP;SQL Server数据库;数据备份;数据恢复  中图分类号:TP311 文献标识码:A文章编号:1009-3044(2007)18-31514-01  Carry out to backup and restore the SQL Server Dat
期刊
摘要:随着互联网的迅速普及和应用的不断发展,各种黑客工具和网络攻击手段也随之倍出,网络攻击导致网络和用户受到侵害,其中分布式拒绝服务 DDoS 以其攻击范围广、隐蔽性强、简单有效等特点成为常见的网络攻击技术之一,极大地影响网络和业务主机系统的有效服务。其中的TCP DDoS它利用了传统协议中三次握手协议的不安全性,向互联网服务器发送大量的报文。由于服务器接收大量无效的报文,而使得正常的报文无法得到
期刊
摘要:为满足与东盟各国的交流,开发一套针对东盟10国的手持PDA翻译系统,能完成中国与东盟10国的互译(还可完成中英互译及普通话与粵语的互译),能满足与东盟交流中的互译需求。  关键词:中国—东盟互译;PDA  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31624-02  10 Country PDAs in China-ASEAN Translate th
期刊
摘要:本文将探索基于嵌入式系统发展的需要,提出TMS320VC5402 DSP与AT89C51单片机通信的三种设计方案。利用TMS320VC5402的多通道缓冲串口MCBSP分别实现TMS320VC5402与AT89C51的SCI和SPI串行通信,以及通过TMS320VC5402的8位增强主机接口HPI一8实现TMS320VC5402与AT89C5l并行通信。就硬件接口电路和软件编程进行详细的阐述
期刊
摘要:阐述了在matlab 环境下,调用 Fortran 语言的原理,并通过一实例说明如何实现Matlab,Fortran 两种语言的混合编程。  关键词:Fortran;Matlab;接口技术;混合编程  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31643-01  ProgramInterface Technique for Matlab and For
期刊
摘要:简要介绍了瑞典ANOTO公司推出的专用ARM图像处理器ARGUS Ⅲ的特点,为使其在更多领域发挥其视频应用上的优势,在其开发板上构建了嵌入式Linux平台,详细论述了Linux系统在专用ARM处理器上的移植过程中,各个部分的设计及实现方法,其中包括引导加载、内核、接口驱动、文件系统、用户应用程序等。  关键词:ARGUS Ⅲ;embedded-Linux;引导加载;YAFFS  中图分类号:
期刊
摘要:20世纪70年代开始,GPS技术不断的成熟和迅猛发展,现在已渗透入除专业领域外的民用领域,从最初的航天及军事应用,逐步走近人们的生活。在专业测绘领域, GPS以全天候、高精度、自动化、高效益等显著特点,赢得广大测绘工作者的信赖。在民用领域,随着国民经济的发展,私人汽车保有量的不断增长,车载GPS导航已进入普及阶段。GPS全球卫星定位导航系统从日常的出行到老人儿童甚至宠物的协寻,应用范围不断扩
期刊
摘要:移动Ad hoc网络是近年来网络研究的热点,WSN(Wireless Sensor Networks,无线传感器网络)是传感器研究领域一个新的研究方向。由于它们之间诸多的相似性使得每当提到WSN的时候往往与Ad hoc网络做比较。本文试图通过对Ad hoc网络和WSN网络特点和路由协议的介绍和分析,使这两个领域区别并联系起来。  关键词:网络;协议;传感器;路由  中图分类号:TP393文献
期刊
摘要:针对Web使用挖掘中的信息,提出一种基于遗传算法的关联规则挖掘模型,同时结合实例对有关信息特征进行量化,然后利用实数数组的方法进行编码以及构造适应度函数,挖掘出隐含在用户注册登记信息库中的有关用户规则。为个性化服务系统提供准确和可行的关联规则,并对用户的行为进行了预测和分析。  关键词:遗传算法;Web使用挖掘;关联规则  中图分类号:TP311文献标识码:A文章编号:1009-3044(2
期刊