数据结构一元多项式的简单计算器(正文)_第1页
数据结构一元多项式的简单计算器(正文)_第2页
数据结构一元多项式的简单计算器(正文)_第3页
数据结构一元多项式的简单计算器(正文)_第4页
数据结构一元多项式的简单计算器(正文)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 潘敏 用c语言设计一元多项式简单计算器 第页 共 20 页 1 引 言 本课程设计主要设计一个一元多项式的简单计算器。通过c语言实现一元多项式的建立和输出,以及两个一元多项式的加法减法乘法和输出。其中一元多项式的定义为:数域上一个文字的一元多项式指的是形式表达式: (1)其中是非负整数,面都是中的数。称为(1)的零次项或常数项,称为一次项,一般地,称做次项,而称为次项的系数。一元多项式常用符号来表示。在一个多项式中,可以任意添上或者去掉一些系数为零的项;若是某一个次项()的系数是,那么这个系数可以省略不写1。1.1 课程设计目的通过c语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。

2、通过课程的设计,进一步了解链式结构的运用。1.2 课程设计内容程序的基本功能: (1) 建立多项式 (2) 输出多项式 (3) 两个多项式相加,建立并输出和多项式 (4) 两个多项式相减,建立并输出差多项式(5) 两个多项式相乘,建立并输出乘多项式2 设计思路与方案2.1 需求分析一元多项式的计算是常用的数学计算,在计算机计算中是非常普遍的,为了更加方便的进行此类运算,在此设计了一个简单的一元多项式计算器,用于对一元多项式进行创建,输出,以及一元多项式之间的相加,相减和相乘。该程序简单,清晰,明了,用户易懂易用,能较好得实现一元多项式的计算功能2。2.2定义的函数及说明1 程序函数构成 (1)

3、createpoly-创建一个多项式链表;(2)outp_poly-输出一个多项式链表;(3)addpoly-多项式和的计算;(4)decpoly-多项式差的计算; (5)mulpoly-多项式积的计算;(6)delpoly-删除多项式;(7)main -主函数。2 c语言简介c语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序数据结构3。因此,它的应用范围广泛。主要有以下特点: c语言在很多方面都可以用,不仅仅是在软件开发上,各类科研都是需要用到c语言的。具体应用

4、比如我是学硬件的,单片机以及嵌入式系统都可以用c来开发。c 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多著名的系统软件, 如dbase plus、dbase 都是由c 语言编写的。用c 语言加上一些汇编语言子程序, 就更能显示c 语言的优势了, 象pc- dos 、wordstar等就是用这种方法编写的。归纳起来c 语言具有下列特点:(1) c是中级语言它把高级语言的基本结构和语句与低级语言的实用性结合起来。c 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。(2) c是结构式语言结构式语言的显著特点是代码及数据的分隔化,

5、 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。c 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。(3) c语言功能齐全c 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另外c 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大, 可以实现决策目的编游戏,编3d游戏,做数据库,做联众世界,做聊天室,做photoshop做flash,做3dmax。(4) c语言适用范围大c 语言还有一个突出的优点就是适合于多

6、种操作系统, 如dos、unix,也适用于多种机型。 c语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用c语言明显优于其它解释型高级语言,有一些大型应用软件也是用c语言编写的。c语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言4。 2.3 算法设计本程序的特点是主要运用指针数组、结构体和链表,其中在建立链表的时候用数组指针,然后通过数组指针完成多项式的创建5。综上所述,本系统的系统功能如图2.1所示一元多项式的创建 两个一元多项式相减 两个一元多项式相乘 两个一元多项式相加输出乘多项式输出差多项式输出和多项式

7、 图2.1 系统结构图3 详细实现3.1 一元多项式的创建创建一元多项式的关键程序如下,由用户决定一元多项式的项数,项数系数和指数。#include#include#include typedef struct term /项的表示,多项式的项作为linklist的数据元素 float coef; /系数 int expn; /指数 struct term *next;termterm* creatpolyn(term *p,int m) / 算法2.22/ 输入m项的系数和指数,建立表示一元多项式的有序链表p if(m coef = 0.0; int i; printf(依次输入%d个非零项

8、n,m); for (i = 1; i coef,&p-expn); if(p-coef) q = p;p = p-next = (term*)malloc(sizeof(term); q-next = null; free(p); return h; / creatpolyn3.2 一元多项式的输出用户输入相关数据确定一元多项式的界面如图3.1所示:图3.1 一元多项式的输出界面图3.3一元多项式的相加一元多项式加法的关键程序如下:term* apolyn(term *pa, term *pb) / 算法2.23/ 多项式加法:pa = papb,利用两个多项式的结点构成和多项式。term

9、*h, *qa = pa, *qb = pb, *p, *q;float sum;h = p = (term*)malloc(sizeof(term);p-next = null;while (qa & qb) / pa和pb均非空 switch (compare(qa,qb) case -1: / 多项式pa中当前结点的指数值小 p-next = qb;p = qb;qb = qb-next; break; case 0: / 两者的指数值相等 sum = qa-coef + qb-coef;if (sum != 0.0) / 修改多项式pa中当前结点的系数值 p-next = qa;qa-

10、coef = sum;p = qa;qa = qa-next; else / 删除多项式pa中当前结点 q = qa;qa = qa-next; ree(q); q = qb;qb = qb-next; free(q); break; case 1: / 多项式pb中当前结点的指数值小 p-next = qa;p = qa;qa = qa-next; break; / switch / while if (pa) p-next = qa; / 链接pa中剩余结点 if (pb) p-next = qb; / 链接pb中剩余结点 q = h;h = h-next; free(q); return

11、 h; / apolynterm* a(term *pa, term *pb) int n; puts(再输入一一元多项式的项数); scanf(%d,&n); /输入n pb = creatpolyn(pb,n);pb = selsort(pb); printfpoly(pa); /输出poly(pa) if(pb & pb-coef0) printf( + ); printfpoly(pb);pa = apolyn(pa,pb); printf( = ); /输出“=” pa = selsort(pa);printfpoly(pa); return pa;3.4一元多项式的相减一元多项式减

12、法关键程序如下:term* bpolyn(term *pa, term *pb) / 算法2.23 / 多项式减法:pa = pa-pb,利用两个多项式的结点构成差多项式。 term *p = pb; /创建指针 while(p) p-coef *= -1;p = p-next; return apolyn(pa,pb); / bpolynterm* b(term *pa, term *pb) int n; puts(再输入一一元多项式的项数); scanf(%d,&n); pb = creatpolyn(pb,n);pb = selsort(pb); printfpoly(pa); prin

13、tf( - ); putchar();printfpoly(pb);putchar();pa = bpolyn(pa,pb); printf( = ); pa = selsort(pa);printfpoly(pa); return pa;3.5一元多项式的相乘一元多项式乘法的关键程序如下:term* cpolyn(term *pa, term *pb) / 算法2.23/ 多项式乘法:pa = pa*pb,利用两个多项式的结点构成积多项式。if(!pb) return null;term *pa = pa, *p, *q, *r, *s, *t; /创建一系列指针 r = p = (term

14、*)malloc(sizeof(term); while(pa) p-coef = pa-coef;p-expn = pa-expn;q = p; p = p-next = (term*)malloc(sizeof(term);pa = pa-next; q-next = null; free(p);pa = pa;t = s = (term*)malloc(sizeof(term); while(pa) q = s;s = s-next = (term*)malloc(sizeof(term);pa = pa-next; q-next = null; free(s); pa = pa; wh

15、ile(pa) pa-coef *= pb-coef;pa-expn += pb-expn;pa = pa-next; pb = pb-next; while(pb) p = r;s = t; while(p) s-coef = p-coef * pb-coef;s-expn = p-expn + pb-expn; p = p-next;s = s-next; pa = apolyn(pa,t);pb = pb-next; return pa; / cpolynterm* c(term *pa, term *pb) int n; puts(再输入一一元多项式的项数); scanf(%d,&n)

16、; pb = creatpolyn(pb,n);pb = selsort(pb); putchar();printfpoly(pa);putchar(); printf( * ); /输出“*” putchar();printfpoly(pb);putchar(); printf( = ); /输出“=” pa = cpolyn(pa,pb);pa = selsort(pa); printfpoly(pa); /输出poly(pa) return pa;void main() term *m,*n;char s2;int i,n; puts(一元多项式计算:n输入一一元多项式的项数); sca

17、nf(%d,&n);m = creatpolyn(m,n);m = selsort(m); printfpoly(m);p: puts(n1:加n2:减n3:乘n4:退出);getchar();q: gets(s); if(s1!=0 | !isdigit(*s) puts(输入有误,请重新输入!);goto q;i = *s-48; switch(i) case 1:m = a(m,n);goto p; case 2:m = b(m,n);goto p; case 3:m = c(m,n);goto p; case 4:break; /跳出 default:puts(输入有误,请重新输入!)

18、;goto q; 4 运行环境与结果4.1运行环境(1)windows2000/xp系统 (2)tc或vc编译环境4.2 调试分析结果1 一元多项式加法输入第一个多项式项数2,系数(2,3),指数(2,1),第二个多项式项数2,系数(1,2),指数(2,1),结果如图4.1所示:图4.1 两个一元多项式加法结果界面图2 一元多项式减法输入第一个多项式项数2,系数(2,3),指数(2,1),第二个多项式项数2,系数(1,2),指数(2,1),结果如图4.2所示:图4.2 两个一元多项式减法结果界面图 3 一元多项式乘法输入第一个多项式项数2,系数(2,3),指数(2,1),第二个多项式项数2,系

19、数(1,2),指数(2,1),结果如图4.3所示:图4.3 两个一元多项式乘法结果界面图5 结束语通过陈老师的指导,一元多项式的简单计算问题基本完成,通过二个多星期的设计与开发,一元多项式简单计算系统基本开发完毕。本系统所用到的知识与数据结构这本书密切相关。进行测试运行后,发现程序运行良好,在此谢谢陈老师的指导。首先,发现自己对知识的掌握不是很牢固,对课程的设计很困难。自己对知识的掌握和运用是相当的差,感觉自己的知识就是白学了,做这样的题目还是有困难的,尤其是指针的运用很不熟练。而做这个题目恰恰运用了大量的指针。所以很困难。由于时间问题和知识水平有限,系统还存在一些问题,比如:系统的界面比较单

20、调,整个程序的功能还不完善,还有界面做的有些简单,菜单没有做好,可进行的操作太少,这些都有待进一步改善。参考文献1 黄同成,黄俊民,董建寅数据结构.北京:中国电力出版社,20082 董建寅,黄俊民,黄同成数据结构实验指导与题解.北京:中国电力出版社,20083 严蔚敏,吴伟民数据结构.北京:清华大学出版社,20024 李春葆数据结构习题与解析.北京:清华大学出版社,20005 王红梅,胡明,王涛数据结构.北京:清华大学出版社,2005附录 源程序代码#include#include#includetypedef struct term /项的表示,多项式的项作为linklist的数据元素 fl

21、oat coef; /系数 int expn; /指数 struct term *next;term;term* creatpolyn(term *p,int m) / 算法2.22 / 输入m项的系数和指数,建立表示一元多项式的有序链表p if(m coef = 0.0; int i; printf(依次输入%d个非零项n,m); for (i = 1; i coef,&p-expn); if(p-coef) q = p; p = p-next = (term*)malloc(sizeof(term); q-next = null; free(p); return h; / creatpol

22、ynterm* selsort(term *h) term *g, *p, *q; if(!h) return null; float f; int i, fini = 1; for(g = h;g-next&fini;g = g-next) fini = 0; for(p = h,q = h-next;q;p = p-next,q = q-next) if (p-expn expn) f = p-coef;i = p-expn; p-coef = q-coef;p-expn = q-expn; q-coef = f;q-expn = i; fini = 1; for(g = h,p = g-

23、next;p;) if(g-expn=p-expn) g-coef += p-coef; g-next = p-next; q = p; p = p-next; free(q); else if(g-next) g = g-next; p = p-next; return h;void printfpoly(term *p) term *q = p; if(!q) putchar(0); return; if(q-coef!=1) printf(%g,q-coef); if(q-expn=1) putchar(x); else if(q-expn) printf(x%d,q-expn); el

24、se if(!q-expn) putchar(1); else if(q-expn=1) putchar(x); else printf(x%d,q-expn); q = q-next; while (q) if(q-coef 0) putchar(+); if(q-coef!=1) printf(%g,q-coef); if(q-expn=1) putchar(x); else if(q-expn) printf(x%d,q-expn); else if(!q-expn) putchar(1); else if(q-expn=1) putchar(x); else printf(x%d,q-

25、expn); q = q-next; compare(term *a, term *b) if (a-expn expn) return -1; if (a-expn b-expn) return 1; return 0;term* apolyn(term *pa, term *pb) / 算法2.23 / 多项式加法:pa = papb,利用两个多项式的结点构成和多项式。 term *h, *qa = pa, *qb = pb, *p, *q; float sum; h = p = (term*)malloc(sizeof(term); p-next = null; while (qa &

26、qb) / pa和pb均非空 switch (compare(qa,qb) case -1: / 多项式pa中当前结点的指数值小 p-next = qb; p = qb; qb = qb-next; break; case 0: / 两者的指数值相等 sum = qa-coef + qb-coef; if (sum != 0.0) / 修改多项式pa中当前结点的系数值 p-next = qa; qa-coef = sum; p = qa; qa = qa-next; else / 删除多项式pa中当前结点 q = qa; qa = qa-next; free(q); q = qb; qb =

27、qb-next; free(q); break; case 1: / 多项式pb中当前结点的指数值小 p-next = qa; p = qa; qa = qa-next; break; / switch / while if (pa) p-next = qa; / 链接pa中剩余结点 if (pb) p-next = qb; / 链接pb中剩余结点 q = h; h = h-next; free(q); return h; / apolynterm* a(term *pa, term *pb) int n; puts(再输入一一元多项式的项数); scanf(%d,&n); pb = crea

28、tpolyn(pb,n); pb = selsort(pb); printfpoly(pa); if(pb & pb-coef0) printf( + ); printfpoly(pb); pa = apolyn(pa,pb); printf( = ); pa = selsort(pa); printfpoly(pa); return pa;term* bpolyn(term *pa, term *pb) / 算法2.23 / 多项式减法:pa = pa-pb,利用两个多项式的结点构成差多项式。 term *p = pb; while(p) p-coef *= -1; p = p-next;

29、return apolyn(pa,pb); / bpolynterm* b(term *pa, term *pb) int n; puts(再输入一一元多项式的项数); scanf(%d,&n); pb = creatpolyn(pb,n); pb = selsort(pb); printfpoly(pa); printf( - ); putchar();printfpoly(pb);putchar(); pa = bpolyn(pa,pb); printf( = ); pa = selsort(pa); printfpoly(pa); return pa;term* cpolyn(term

30、*pa, term *pb) / 算法2.23 / 多项式乘法:pa = pa*pb,利用两个多项式的结点构成积多项式。 if(!pb) return null; term *pa = pa, *p, *q, *r, *s, *t; r = p = (term*)malloc(sizeof(term); while(pa) p-coef = pa-coef; p-expn = pa-expn; q = p; p = p-next = (term*)malloc(sizeof(term); pa = pa-next; q-next = null; free(p); pa = pa; t = s = (term*)malloc(sizeof(term

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论