武汉理工大学华夏学院课程设计报告书课程名称:数据结构题目:用C语言实现多项式简单计算器的设计系名:信息工程系专业班级:软件工程1121班*名:*******:***2013 年6月28日课程设计任务书学生姓名:邓燕蓉专业班级:软件工程1121班指导教师:王绪梅工作单位:华夏学院计算机教研室设计题目:用C语言实现多项式简单计算器的设计设计目的1.巩固和加深课堂所学知识、学会分析研究数据对象的特性及数据的组织方法;2.选择合适的数据的逻辑结构和存储结构以及相应操作,实现简单的多项式计算;3.提高程序设计能力、加强查阅、运用资料的能力、算法分析与程序设计素质培养;设计任务(在规定的时间内完成下列任务)〔问题描述〕输入并建立两个多项式并输出多项式设计一个程序:对两个多项式进行加、减法及乘法运算,建立一个新多项式并输出.或设计一个程序对其中一个多项式求导。
〔实现提示〕选择带头结点的单链表或循环链表存储多项式,头结点中存放多项式的参数及单链表的数据具体要完成的任务是:A.编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。
B.写出规范的课程设计报告书;时间安排:6月24日---28日具体要求1. 课程设计报告按统一通用格式书写,具体内容如下:①设计任务与要求②总体方案与说明③软件主要模块的流程图④源程序清单与注释⑤问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);⑥小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料2.每位学生应独立完成各自的任务且每天至少在设计室工作半天;指导教师签名:王绪梅2013 年6月22日教研室主任(或责任教师)签名:2013年6月24日目录1.设计题目 (1)2.需求分析 (1)2.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)数据结构课程设计报告书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)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的数据进行输入建立多项式以及多项式相加,减,乘的运行结果在屏幕上显示。
设计思路分析:要解决多项式相加,相减,相乘,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:运用尾插法建立两个单链表,以单链表Polyn p和Polyn h分别表示一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将Polyn p中的结点插入到单链表Polyn h中),因此“和多项式”的结点无须另生成。
为了实现处理,设p、q2分别指向单链表polya和polyb的当前项,比较p、q2结点的指数由此得到下列运算规则:① 若p->expn<q2->expn,则结点q2所指的结点应是“和多项式”中的一项,令指针q2后移。
② 若p->expn=q2->expn,则将两个结点中的系数相加,当和不为0时修改结点q2的系数。
③ 若p->expn>q2->expn,则结点p所指的结点应是“和多项式”中的一项,将结点p插入在结点q2之前,且令指针p在原来的链表上后移。
3 系统设计3.1 概要设计系统的主功能模块结构如图3—1所示。
图3—1 系统的主功能模块结构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;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial));printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&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,返回其头指针4 调用关系图4.1 总流程图总流程图如图4—1所示。
执行加法流程图如图4—2所示。
图4—2 执行加法流程图执行减法流程图如图4—3所示。
图4—3 执行减法流程图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-10x8+16x5);4、(x+x3)+(-x-x3)=0;5、(1-x+x2+x3-x4)*(-x3-x4)=(x8-2x6-x3)。
5.2. 打开程序时的主界面打开程序时的主界面如图5—1所示。
图 5—1 打开程序时的主界面5.3 .输入并建立多项式输入并建立多项式如图5—2所示。
图5—2 输入并建立多项式5.4 选择执行的操作及执行操作的结果选择执行的操作及执行操作的结果如图5—3、5—4、5—5所示。
图 5—3 选择执行的操作及执行操作的结果图 5—4 选择执行的操作及执行操作的结果图5—5 选择执行的操作及执行操作的结果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.附录#include<stdio.h>#include<malloc.h>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->expn<q2->expn) //查找插入位置{ 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;}}}//InsertPolyn CreatePolyn(Polyn head,int m) //建立一个头指针为head、项数为m的一元多项式{ int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial)); //建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head); //调用Insert函数插入结点}return head;}//CreatePolynvoid 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->coef>0&&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');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++;}//whileprintf("\n");}//PrintPolynint compare(Polyn a,Polyn b){ if(a&&b){ if(!b||a->expn>b->expn) return 1;else if(!a||a->expn<b->expn) return -1;else return 0;}else if(!a&&b) return -1; //a多项式已空,但b多项式非空else return 1; //b多项式已空,但a多项式非空}//comparePolyn 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;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;}}//switchif(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}//whilereturn headc;}//AddPolynPolyn 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;}pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next) //恢复pb的系数p->coef*=-1;return pd;}//SubtractPolynPolyn 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;}//MultiplyPolynint 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); //建立多项式aprintf("请输入b的项数:");scanf("%d",&n);pb=CreatePolyn(pb,n); //建立多项式b//输出菜单printf("********************操作提示**************************\n");printf("\t 1.输出多项式a和b\n");printf("\t 2.建立多项式a+b\n");printf("\t 3.建立多项式a-b\n");printf("\t 4.建立多项式a*b\n");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(flag<1||flag>8) printf("Error\n");continue;}//forDestroyPolyn(pa);DestroyPolyn(pb);return 0; }。