2022年用C语言实现多项式简单计算器的设计 .pdf
学号10212812141 武 汉 理 工 大 学 华 夏 学 院课 程 设 计 报 告 书课程名称:数据结构题目:用 C 语言实现多项式简单计算器的设计系名:信息工程系专业班级:软件工程 1121 班姓名:邓 燕 蓉指导教师 :王 绪 梅 2013 年 6月 28日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 20 页 - - - - - - - - - 课程设计任务书学生姓名:邓燕蓉专业班级:软件工程 1121 班指导教师:王绪梅工作单位:华夏学院计算机教研室设计题目 :用 C 语言实现多项式简单计算器的设计设计目的1. 巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法;2. 选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算;3. 提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养;设计任务(在规定的时间内完成下列任务)问 题描述输入并 建立两个多项式 并输出多项式设计一个 程序:对两个多 项式进行加、 减法及乘法运算 , 建立一个新多项式并输出.或设计一个程序对其中一个多项式求导。实 现提示选择带头结点的单链表或循环链表存储多项式,头结点中存放多项式的参数及单链表的数据具体要完成的任务是:A.编制完成上述问 题的C 语 言程序、进行 程序调试并能得出正确的运行结果。B. 写出 规范的课程设计 报告书;时间安排:6 月 24 日-28 日第一天布置题目,确定任务、查找相关资料第二天第四天功能分析,编写程序,调试程序、运行系统;第五天程序验收、答辩;撰写设计报告。具体要求1. 课程设计报告按统一通用格式书写,具体内容如下: 设计任务与要求 总体方案与说明 软件主要模块的流程图 源程序清单与注释 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想) ; 小结与体会附录:源程序(必须有简单注释) 使用说明 参考资料2.每位学生应独立完成各自的任务且每天至少在设计室工作半天;指导教师签名: 王绪梅2013 年6 月 22日教研室主任(或责任教师)签名:2013 年6 月 24 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 20 页 - - - - - - - - - 目录1. 设计题目 .12. 需求分析.12.1一元多项式的简单计算器的基本功能.1 2.2 设计思路 .1 3. 系统过程 .2 3.1 概要设计 .2 3.2 详细设计 .3 4. 调用关系图.3 4.1 总流程图 .4 4.2 加法流程图.5 4.3 减法流程图.6 5. 测试.7 5.1 测试数据 .7 5.2 打开程序时的主界面.7 5.3 输入并建立多项式.8 5.4 选择执行的操作及执行的结果 .9 6. 心得体会及总结 .10 7. 参考文献 .10 附录 . 11 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 20 页 - - - - - - - - - - 1 - 数据结构课程设计报告书1 设计题目用 C语言实现 多项式简 单计算器的设计2 需求分析2. 1一元多项式的简单计算器的基本功能(1)输入并建立多项式;(2)输出多项式;(3)多项式a 和 b 相加,建立多项式a+b;(4)多 项式 a和 b 相减,建立多项式a-b;( 5)多项式a 和 b 相乘,建立多项式a*b。2.2 设计思路(1)定义线性表的动态分配顺序存储结构;(2)建立多项式存储结构,定义指针*next;(3)利用链表实现队列的构造,每次输入一项的系数和指数,可以构造一元多项式;(4)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的数据进行输入建立多项式以及多项式相加,减,乘的运行结果在屏幕上显示。设计思路分析:要解决多项式相加,相减,相乘,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:系数 coef指数 expn指针域 next运用尾插法建立两个单链表,以单链表Polyn p 和 Polyn h 分别表示一元多项式a和 b,a+b 的求和运算等同于单链表的插入问题(将Polyn p 中的结点插入到单链表Polyn h 中) ,因此“和多项式”的结点无须另生成。为了实现处理,设p、q2 分别指向单链表polya 和 polyb 的当前项,比较p、q2 结点的指数由此得到下列运算规则: 若 p-expnexpn ,则结点 q2 所指的结点应是“和多项式”中的一项,令指针q2 后移。 若 p-expn=q2-expn ,则将两个结点中的系数相加,当和不为0时修改结点q2 的系数。 若 p-expnq2-expn ,则结点 p 所指的结点应是“和多项式”中的一项,将结点p 插入在结点q2 之前,且令指针p 在原来的链表上后移。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 20 页 - - - - - - - - - - 2 - 3 系统设计 3.1 概要设计系统的主功能模块结构如图31 所示。3.2 详细设计1、元素类型、结点类型和指针类型:typedef struct Polynomial float coef; /系数int expn; /指数struct Polynomial *next; *Polyn,Polynomial; 2、建立一个头指针为head、项数为m的一元多项式, 建立新结点以接收数据, 调用 Insert函数插入结点 : Polyn CreatePolyn(Polyn head,int m) int i; 5 4 3 2 1 一元多项式简单计算器菜单Choice=?Printpoly ()输出多项式Addpoly ()多项式相加SubtractPolyn()多项式相减*退 出* MultiplyPolyn ()多项式相乘图 31 系统的主功能模块结构结束开始名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 20 页 - - - - - - - - - - 3 - Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); /调用 Insert 函数插入结点 return head; 3、主函数和其他函数:int main() int m,n,flag=0; float x; Polyn pa=0,pb=0,pc,pd,pe,pf; void PrintPolyn(Polyn P) /输出多项式a和 bPolyn AddPolyn(Polyn pa,Polyn pb) /求解并建立多项式a+b,返回其头指针Polyn SubtractPolyn(Polyn pa,Polyn pb) /求解并建立多项式a-b,返回其头指针Polyn MultiplyPolyn(Polyn pa,Polyn pb) /求解并建立多项式a*b,返回其头指针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 20 页 - - - - - - - - - - 4 - 4 调用关系图4.1 总流程图总流程图如图41 所示。否是开 始系数存入coef,指数存入expn 输入数据选择 1 输出多项式选择执行的操作结 束输出结果图 41 总流程图选择 5 退出选择 4 多项式相乘选择 2 多项式相加选择 3 多项式相减是否继续?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 20 页 - - - - - - - - - - 5 - 4.2执行加法流程图执行加法流程图如图42 所示。N Y Y case 0case -1N case 1开 始Polyn*pa,*pb,headc,hc,qc qa=pa-next ;qb=pb-next; hc-next=NULL; headc=hc; switch(compare(qa,qb)qc-coef=qa-coef; qc-expn=qa-expn; qa=qa-next; qc-coef!=0breakfree(qc)结 束qc-coef=qb-coef; qc-expn=qb-expn; qb=qb-next; qc-coef=qa-coef+qb-coef;qc-expn=qa-expn;qa=qa-next;qb=qb-next; qc-next=hc-next; hc-next=qc; hc=qc;qa,qb!=0 return headc图 42 执行加法流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 20 页 - - - - - - - - - - 6 - 4.3执行减法流程图执行减法流程图如图43 所示。Y 开 始Polyn*pa,*pb ,Polyn h=pb; p=pb-next; pd pd=AddPolyn(pa,h) 结 束p-coef*=-1; p=p-next; P!=0 return pd 图 43 执行减法流程图p!=0 p=h-next p-coef*=-1Y p=p-next Y N 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 20 页 - - - - - - - - - - 7 - 5测试5.1 测试数据1、 (-3x11+5x8 +4x)+( 11x9-5x8+7)=(-3x11+11x9+4x+7); 2、 (7x-3 +4.4x2-1.2x9-x)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+13x-3-x); 3、 (9x8+4x6-5x4+8x)*( x14+2x4)=(9x22+4x20-5x18+8x15+18x12+8x10-10 x8+16x5); 4、 (x+x3)+(-x-x3)=0; 5、 (1-x+x2+x3-x4)*(-x3-x4)=(x8-2x6-x3)。5.2. 打开程序时的主界面打开程序时的主界面如图51 所示。图 5 1 打开程序时的主界面5.3 . 输入并建立多项式输入并建立多项式如图52 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 20 页 - - - - - - - - - - 8 - 图 52 输入并建立多项式5.4 选择执行的操作及执行操作的结果选择执行的操作及执行操作的结果如图53、54、55 所示。图 5 3 选择执行的操作及执行操作的结果名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 20 页 - - - - - - - - - - 9 - 图 5 4 选择执行的操作及执行操作的结果图 5 5 选择执行的操作及执行操作的结果名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 20 页 - - - - - - - - - - 10 - 6 心得体会及总结通过这次课程设计,我感觉到要自己动手真正做出一个程序并不很容易, 但只要用心去做,总会有收获 ,特别是当我遇到问题, 问老师, 问同学, 想尽办法去解决, 最后终于找到方法时,心里的那份喜悦之情真是难以形容. 编写程序中遇到问题再所难免, 应耐心探究其中的原因, 从出现问题的地方起, 并联系前后程序 , 仔细推敲 , 逐个排查 . 直到最终搞清为止。对于数据结构有了更深层次的理解, 数据结构体现的是解决问题的一种思想,怎样把这种思想体现出来,需要我们对每个方面的系统了解。并发现了许多自己的不足,平时没掌握的的知识在实践中暴露,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分的问题,还有一些小问题。但是,我相信在今后的学习中,一定能把它解决好。当今计算机应用在生活中可以说是无处不在。因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而 C语言又是最常见,功能最强大的一种高级语言, 因此做好c 语言版数据结构课程设计是十分必要的。我不仅巩固了数据结构程序设计的内容,掌握设计的基本方法,强化了上机动手能力,还进一步掌握了以下知识:数据类型, 分支控制, 循环控制,结构体及数组,指针,文件操作,编译预处理等;通过课程设计,掌握了程序的局部测试,调试方法,建立程序系统调试,测试的基本概念和思想,学会较大程序的系统测试和调试方法。当我选择通讯录管理系统时, 首先系统分析主要思路和框架哦,与同学讨论,联系所学的知识。我知道书上和老师讲的有限,所以上网搜也是一种利用资源的表现。在编程中,特别是结构体,指针的部分,几乎是一片空白。不过经过几天的努力,大体把课本上的知识点看了一遍,知识点也基本上掌握了,所以下一步就是开始正式的编程序了。当读懂了C语言编程的基本过程和方法,经过一波三折,终于开始正式编程。通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的知识与实际结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力。在课程设计过程中,收获知识, 提高能力的同时,我也学到了很多的人生哲理,懂得了怎么去制定计划, 怎么去实现这个计划,并掌握了在执行的过程中怎样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定把课程设计的精神带到生活中,使生活变得更好。7 参考文献1 唐国民,王国均. 数据结构( C语言版)北京:清华大学出版社. 2 严蔚敏,吴伟民.数据结构( C语言版) . 北京:清华大学出版社,1997. 3 詹春华,杨沙. C语言程序设计教程科学出版社, 2011.8 4 董志民,崔建平,肖利娜. C语言程序设计教学改革探索与实践J.福建电脑 . 5 王路明? C语言程序设计教程 ?北京:北京邮电大学出版社,2005 年 5 月6 谭浩强 C+ 程序设计北京:清华大学出版社2004 7 范策. 算法与数据结构(C语言版) . 北京:机械工业出版社,2004. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 20 页 - - - - - - - - - - 11 - 附录#include #include typedef struct Polynomial float coef; int expn; struct Polynomial *next; *Polyn,Polynomial; /Polyn 为结点指针类型void Insert(Polyn p,Polyn h) if(p-coef=0) free(p); /系数为 0 的话释放结点else Polyn q1,q2; q1=h;q2=h-next; while(q2&p-expnexpn) /查找插入位置 q1=q2; q2=q2-next; if(q2&p-expn=q2-expn) /将指数相同相合并 q2-coef+=p-coef; free(p); if(!q2-coef) /系数为 0 的话释放结点 q1-next=q2-next; free(q2); else /指数为新时将结点插入 p-next=q2; q1-next=p; /Insert Polyn CreatePolyn(Polyn head,int m) /建立一个头指针为head、项数为m 的一元多项式 int i; Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial); head-next=NULL; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 20 页 - - - - - - - - - - 12 - for(i=0;icoef,&p-expn); Insert(p,head); /调用 Insert 函数插入结点 return head; /CreatePolyn void DestroyPolyn(Polyn p) /销毁多项式p Polyn q1,q2; q1=p-next; q2=q1-next; while(q1-next) free(q1); q1=q2; /指针后移q2=q2-next; void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1; /项数计数器if(!q) /若多项式为空,输出0 putchar(0); printf(n); return; while (q) if(q-coef0&flag!=1) putchar(+); /系数大于0 且不是第一项if(q-coef!=1&q-coef!=-1) /系数非 1 或-1 的普通情况 printf(%g,q-coef); if(q-expn=1) putchar(X); else if(q-expn) printf(X%d,q-expn); else if(q-coef=1) if(!q-expn) putchar(1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 20 页 - - - - - - - - - - 13 - else if(q-expn=1) putchar(X); else printf(X%d,q-expn); if(q-coef=-1) if(!q-expn) printf(-1); else if(q-expn=1) printf(-X); else printf(-X%d,q-expn); q=q-next; flag+; /while printf(n); /PrintPolyn int compare(Polyn a,Polyn b) if(a&b) if(!b|a-expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a&b) return -1; /a 多项式已空,但b 多项式非空else return 1; /b 多项式已空,但a 多项式非空/compare Polyn AddPolyn(Polyn pa,Polyn pb) /求解并建立多项式a+b,返回其头指针 Polyn qa=pa-next; Polyn qb=pb-next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial); /建立头结点hc-next=NULL; headc=hc; while(qa|qb) qc=(Polyn)malloc(sizeof(struct Polynomial); switch(compare(qa,qb) case 1: qc-coef=qa-coef; qc-expn=qa-expn; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 20 页 - - - - - - - - - - 14 - qa=qa-next; break; case 0: qc-coef=qa-coef+qb-coef; qc-expn=qa-expn; qa=qa-next; qb=qb-next; break; case -1: qc-coef=qb-coef; qc-expn=qb-expn; qb=qb-next; break; /switch if(qc-coef!=0) qc-next=hc-next; hc-next=qc; hc=qc; else free(qc);/当相加系数为0 时,释放该结点/while return headc; /AddPolyn Polyn SubtractPolyn(Polyn pa,Polyn pb) / 求解并建立多项式a-b,返回其头指针 Polyn h=pb; Polyn p=pb-next; Polyn pd; while(p) /将 pb 的系数取反 p-coef*=-1; p=p-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 20 页 - - - - - - - - - - 15 - pd=AddPolyn(pa,h); for(p=h-next;p;p=p-next) /恢复 pb 的系数p-coef*=-1; return pd; /SubtractPolyn Polyn MultiplyPolyn(Polyn pa,Polyn pb) /求解并建立多项式a*b,返回其头指针 Polyn hf,pf; Polyn qa=pa-next; Polyn qb=pb-next; hf=(Polyn)malloc(sizeof(struct Polynomial); /建立头结点hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(Polyn)malloc(sizeof(struct Polynomial); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf); /调用 Insert 函数以合并指数相同的项 return hf; /MultiplyPolyn int main() int m,n,flag=0; float x; Polyn pa=0,pb=0,pc,pd,pe,pf; /定义各式的头指针,pa 与 pb 在使用前赋初值NULL printf( 请输入 a 的项数 :); scanf(%d,&m); pa=CreatePolyn(pa,m); /建立多项式a printf( 请输入 b 的项数 :); scanf(%d,&n); pb=CreatePolyn(pb,n); /建立多项式b /输出菜单printf(*操作提示 *n); printf(t 1. 输出多项式a 和 bn); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 20 页 - - - - - - - - - - 16 - printf(t 2. 建立多项式a+bn); printf(t 3. 建立多项式a-bn); printf(t 4. 建立多项式a*bn); printf(t 5. 退出 n*n); for(;flag=0) printf( 执行操作 ); scanf(%d,&flag); if(flag=1) printf( 多项式 a:);PrintPolyn(pa); printf( 多项式 b:);PrintPolyn(pb);continue; if(flag=2) pc=AddPolyn(pa,pb); printf( 多项式 a+b:);PrintPolyn(pc); DestroyPolyn(pc);continue; if(flag=3) pd=SubtractPolyn(pa,pb); printf( 多项式 a-b:);PrintPolyn(pd); DestroyPolyn(pd);continue; if(flag=4) pf=MultiplyPolyn(pa,pb); printf( 多项式 a*b:);PrintPolyn(pf); DestroyPolyn(pf);continue; if(flag=5) break; if(flag8) printf(Error!n);continue; /for DestroyPolyn(pa); DestroyPolyn(pb); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 20 页 - - - - - - - - - - 17 - 设计过程中质疑(或答辩)记载:问题 1:用什么存放数据 ? 答:用带头结点的的单链表问题 2: 用结构体的系数 coef和指数 expn加上输出的结果,形成的结构是什么?答:单链表问题 3:怎样画流程图?答:先设计一个总流程图,结束,然后再按模块画出各个流程图,如图指导教师评语:签名:2013年7 月 1 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 20 页 - - - - - - - - -