C++课程设计实验报告(一元多项式加减法)
- 格式:doc
- 大小:120.00 KB
- 文档页数:14
C++程序设计课程设计报告课题: 一元多项式加减法专业班级:学号:姓名:同组者姓名:指导教师:目录一、课程设计的目的意义.................................2二、程序报告要求.............................. 3三、程序流程图 (4)四、运行和调试.......................................5五、错误分析 (8)六、课程设计的心得...................................8七、参考书目.........................................9八、附录:源代码....................................101、设计系统的目的意义《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;⏹训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2、程序及报告要求1、能够按照指数降序排列建立并输出多项式;2、能够完成两个多项式的相加、相减,并将结果输入;3、在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;3、程序流程图程序流程图如下:是4、运行和测试1、系统需求、功能分析:由用户输入两个一元多项式,计算得到它们的和、差并输出。
程序运行时,提示用户选择一个自己将要进行的运算的数字,界面如下:编辑程序后会出现如上的界面让你选择要进行的运算,这时只要你输入1或者2就可以达到你的目的。
接下来就演示下将要进行的加法或者运算,这将要作为接下来的内容。
2、下面的界面是我们选择1进行加法运算出来的界面:如上面的界面我们可以看到此程序成功的将3*x^3+2*x^2与2*x^2进行了相加运算得到3*x^3+4*x^2这个结果正式我们预期的正确的结果。
此时界面依旧会出现,现在仍旧可以进行加法与减法的选择,我们可以再次输入我们进行的运算的数字进行相应的运算。
3、现在进行程序要求的例外一个要求进行减法运算,当然进行减法运算与加法运算有那么点点的区别。
就是在一元多项式进行输入的时候与加法不同,我们要在输入的第二个多项式系数钱加上一个“-”号,这样就可以得到我们预期的正确结果。
进行减法运算的界面如下:当然,如界面所示,所进行的减法运算时正确的。
我们进行完加法运算后是仍旧可以再进行加法或者减法运算的。
加法与减法的不同之处就是在在输入系数的时候有点小技巧的,也正是这个小技巧让我们的这个程序变的更简便。
4、错误分析从一开始写这个程序时遇到过很多的错误,有些是在编译的时候,使得程序无法运行;有的则是程序未能达到要求。
简单地把错误列举如下:错误一:在用尾插法建立一个存放系数和指数的链表时,指针的指向问题是一个难点。
要非常小心每个指针的指向没有错误,否则虽然程序编译的时候没有错误,但是运行时并不会有程序出现。
错误二:就是调用函数时,要注意实参和虚参的个数以及类型的对应。
否则会出现如下的一些致命的错误:error C2819: type 'polynode' does not have an overloaded member 'operator ->'error C2227: left of '->next' must point to class/struct/unionerror C2664: 'add' : cannot convert parameter 1 from 'struct polynode *' to 'struct polynode'这些错误就是因为调用add函数时把实参和虚参的类型没有一一对应起来而导致的错误。
错误三:对这个程序来说,进行加法运算相对来说要简单些。
而进行减法运算时比较难,当时并没有想到在输入时下点功夫,而是一味的编程。
后来在数据输入时该变了一些小技巧。
如下:printf("(%d*x^%d)",p->xishu,p->zhishu);printf("+(%d*x^%d)",p->xishu,p->zhishu);在前面加了括号和“+”之后,输入数据的时候在前面加上“-”后就能轻松进行减法运算,这个错误是我们刚开始没能进行减法运算的关键。
用了这个小技巧后,减法也就迎刃而解了。
5、课程设计的心得:历时一个星期,我终于成功地编完了这个程序!其中酸甜苦辣自不必言,然而令我欣慰的是写算法和调错误的能力的大幅提高。
还没写之前,我就琢磨:一元多项式的主要涉及的数据结构是单链表,对指针的操作是最根本也是最重要的操作。
指针用起来效率高,但是产生的错误比较隐蔽,需要有高度的耐性和毅力才能攻克难关。
有了这个思想准备,我就开始比较小心地写程序,每写一个算法之前都先把思路理清,把指针的操作想明白,但这其中还是出现了不小的麻烦。
有一个比较棘手的问题就是对指数无序的单链表进行排序,本来想实现指数无序输入再内部进行升幂排序的功能,但考虑之后发现如果超过三个结点需要用四个指针来操作,而且过程极为繁琐,最终没有想出好的算法,只能作罢。
所以我的程序要求用户必需按升幂顺序输入,而且不能有同类项,这个问题也作为以后我继续攻克的难点之一。
经过程序的多次修改,最终花了两个多小时才解决了这个问题,可见编程真是步步为营,一点都马虎不得!从输入的读取到核心的算法一直到输出,都要以认真严谨的态度来对待。
当然程序还有许多值得改进的地方,比如多项式的输入和读取缺乏健壮性,对输错的内容无法进行处理等等。
无论如何,能比较圆满地完成这个课题对我来说是个极大的鼓舞,它让我享受到了编程的快乐,同时也留下了我成熟的印痕,成为我漫漫编程路上的一个里程碑。
6、参考书目:[1]苏仕华等.《数据结构课程设计》.机械工业出版社.2004年[2]严蔚敏.吴伟民《数据结构C语言版》.清华大学出版社2009年7、附录:源代码:#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct polynode{int xishu; //多项式的系数int zhishu; //指数struct polynode *next;}node;node *createlist(){node *h,*r,*s;int c,e;h=(node*)malloc(sizeof(node));r=h;printf("系数xishu:");scanf("%d",&c);printf("指数zhishu: ");scanf("%d",&e);while(c!=0) //输入系数为0时,多项式的输入结束{s=(node*)malloc(sizeof(node));s->xishu=c;s->zhishu=e;r->next=s;r=s;printf("系数:");scanf("%d",&c);printf("指数: ");scanf("%d",&e);}r->next=NULL;return(h);}void print(node *p){if(p)p=p->next;printf("(%d*x^%d)",p->xishu,p->zhishu); while(p->next!=NULL){p=p->next;printf("+(%d*x^%d)",p->xishu,p->zhishu);}}void add(node *ha, node *hb){node *p,*q,*pre,*temp;int sum;p=ha->next;q=hb->next;pre=ha;while(p!=NULL&&q!=NULL){if(p->zhishu>q->zhishu){pre->next=p;pre=pre->next;p=p->next;} //p指数大的情况else if(p->zhishu==q->zhishu){sum=p->xishu+q->xishu;if(sum!=0){p->xishu=sum;pre->next=p;pre=pre->next;p=p->next;temp=q;q=q->next;free(temp);}else //如果系数和为零,则删除结点p与q,并将指针指向下一个结点{temp=p->next;free(p);p=temp;temp=q->next;free(q);q=temp;}}else{pre->next=q;pre=pre->next;q=q->next;} //q指数大的情况}if(p!=NULL) //将多项式A中剩余的结点加入到和多项式中pre->next=p;elsepre->next=q;}void main(){ int a=1;node *ha,*hb;while(a){printf(" * * * * * * * * * * * * * * * *\n");printf(" * *\n"); printf(" * 1:进行加法运算*\n"); printf(" * *\n"); printf(" * 2:进行减法运算*\n"); printf(" * *\n"); printf(" * * * * * * * * * * * * * * * *\n");printf(" 选择要进行的运算:");scanf("%d",&a);switch(a){case 1:printf("请输入多项式ha的系数与指数:\n");ha=createlist();print(ha);printf("\n");printf("请输入多项式hb的系数与指数:\n");hb=createlist();print(hb);printf("\n");printf("多项式的和是:\n");add(ha,hb);print(ha);printf("\n");break;case 2:printf("请输入多项式ha的系数与指数:\n");ha=createlist();print(ha);printf("\n");printf("请输入多项式hb的系数与指数:\n");hb=createlist();print(hb);printf("\n");printf("多项式的差是:\n");add(ha,hb);print(ha);printf("\n");break;default:printf(" 不和法数字请重新输入:\n");break;}}}。