当前位置:文档之家› 课程设计报告模板 2

课程设计报告模板 2

课程设计教学院湖北理工学院课程名称数据结构课程设计题目一元多项式的运算专业网络工程班级一班姓名杨成雷同组人员秦枚林姜佳豪梅春帆指导教师冯珊2013 年12 月26 日(完成时间)目录一概述 (2)1.课程设计的目的 (2)2.课程设计的要求 (2)二总体方案设计 (3)1.整体设计思路如下 (3)2. 我所承担的设计工作 (4)三详细设计 (5)1.基本的具体算法 (5)2.函数的剖析 (7)3.实现一元多项式各项运算程序代码如下: (11)四程序的调试与运行结果说明 (16)参考文献 (18)一概述1.课程设计的目的1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。

2.培养综合运用所学知识独立完成课题的能力。

3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

2.课程设计的要求需要的基本知识与技能,尚未掌握的知识点,需要查阅相关资料。

教师对本题目所提出的要求等。

其课程设计题目的要求如下:1.用C语言实现一元多项式的运算.2.利用链表实现一元多项式运算的存储.3.该程序具有加法、减法、乘法基本运算功能.4. 程序的各个功能模块要求用函数的形式实现.5. 完成设计任务并书写课程设计报告二总体方案设计1.整体设计思路如下(1)存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。

代码如下:typedef struct Polynomial{float coef;//系数int expn;//指数struct Polynomial *next;//指向下一个结点}*Polyn,Polynomial; //Polyn为结点指针类型(2)基本步骤:根据一元多项式相加的规则,对于两个一元多项式中所有指数相同的项,对应的系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中指数不相同的项则分别复制到“和多项式”中去。

即步骤如下:A输入并建立多项式B输出多项式,输出形式为整数序列:n,c1,e1,c2,e2….,en 其中n为多项式的项数,次,ci,ei分别为第i项的系数与指数序列按指数降序排列。

C多项式a和b的相加,建立多项式a+b,输出相加的多项式D多项式a和b的相减,建立多项式a-b,输出相减的多项式E多项式a和b的相乘,建立多项式a*b,输出相乘的多项式(3)算法的整体模块如下思路:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5. 多项式复制功能等2. 我所承担的设计工作在该次课程设计中,我所承担的工作是得出一元多项式的减法,其主要的关键问题解决是:创建两个指针分别指向两个多项式表头的next以两个指针同时不为空为条件循环遍历,如果当前多项式1的指数小于多项式2则将当前多项式2的系数置负,指数不变,存入新建多项式中,指向多项式2的指针指向下一个;如果如果当前多项式1的指数大于多项式2则将当前多项式1的系数指数不变,存入新建多项式中,指向多项式1的指针指向下一个;否则将多项式1的系数减去2的系数后存入新建多项式中,指数不变存入,再将两个指针同时指向下一个。

结束循环后判断是哪一个多项式遍历完了,将未遍历完的多项式剩下的数据全部插入新建的多项式中。

三详细设计(所完成的具体功能及用到的算法(详细分析)。

程序流程图主要部分的详细流程图)1.基本的具体算法1.1输入输出(1)功能:将要进行运算的多项式输入输出。

(2)数据流入:要输入的多项式的系数与指数。

(3)数据流出:合并同类项后的多项式。

(4)程序流程图:多项式输入流程图如图1所示。

(5)测试要点:输入的多项式是否正确,若输入错误则重新输入(图一)1.2多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图二1.3多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图三所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图三2.函数的剖析2.1该多项式程序除了main()函数外,主要有以下函数:void Insert(Polyn p,Polyn h)Polyn CreatePolyn(Polyn head,int m)void DestroyPolyn(Polyn p)void PrintPolyn(Polyn P)int compare(Polyn a,Polyn b)Polyn AddPolyn(Polyn pa,Polyn pb)Polyn SubtractPolyn(Polyn pa,Polyn pb)下面对这些函数逐一介绍:(1)main()函数main函数用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。

在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。

在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进行控制。

(2)Polyn CreatePolyn(Polyn head,int m)该函数功能是创建新的多项式链表。

int m保存的多项式的项数,使用for 语句,控制输入多项式的每一项。

当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。

在该函数中要用到分配空间的函数malloc()为新建链表分配空间。

(3)void DestroyPolyn(Polyn p)该函数的功能是销毁掉创建的两个链表,释放内存。

以辅助退出程序。

(4)void Insert(Polyn p,Polyn h)该函数功能:将新的节点p插入到现有链表的后面,并确保多项式的指数exp是升序。

将s节点插入到head所指向的链表。

在该函数的操作中,要注意指针是如何移动的。

(5)Polyn AddPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,它的原理是将指数相同的单项式相加,系数相加后为0,则pa、pb的指针都后移。

在加法计算中要求pa,与pb的幂次序都是升序,否则可能得到错误的结果。

该函数调用了int compare(Polyn a,Polyn b)的结果,用来判断多项式在同一指数下a、b是否有为系数为0。

同样也使用了malloc()关键字,为新链表创建空间。

(6)int compare(Polyn a,Polyn b)该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。

用来辅助加法和乘法运算。

(7) Polyn SubtractPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相减,其原理根加法类似,将指数相同的指数相减。

与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。

(8)void PrintPolyn(Polyn P)该函数功能:显示多项式链表。

在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还有符号的控制。

在输出第一项时要判断是不是常数项,若是,则不要输出字符x。

2.2解析重要函数具体实现过程及其参数的意义函数:(1)Polyn CreatePolyn(Polyn head,int m)该函数的两个参数,head表示为创建的链表的头指针,m表示为链表的长度,即多项式的项数。

定义int i 计数,当i<m时,for语句反复提示用户输入该多项式的每一项的指数和系数,并保存。

当i=m时,输入完毕,该链表也创建完毕。

详细的实现过程如下:Polyn CreatePolyn(Polyn head,int m){int i;//用来计数Polyn p;//定义一个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;}//CreatePolyn(2)void Insert(Polyn p,Polyn h) 该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。

以下是实现插入的关键代码:void Insert(Polyn p,Polyn h){if(p->coef==0) free(p); //系数为0的话释放结点else{//如果系数不为0Polyn 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;}}}//Insert(3)Polyn AddPolyn(Polyn pa,Polyn pb) 该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。

其计算的结果存放在新建的pc 所指向的链表中。

函数中调用了int compare(Polyn a,Polyn b)的结果。

相关主题