数据结构一元多项式的运算_第1页
数据结构一元多项式的运算_第2页
数据结构一元多项式的运算_第3页
数据结构一元多项式的运算_第4页
数据结构一元多项式的运算_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计(论文)目 录一、问题分析11.1 问题描述11.2 问题的数学模型11.3 构造数据结构1二、系统分析22.1 可行性研究22.2 系统结构与主要功能模块2三、系统设计43.1系统设计目的与要求43.2系统设计内容43.3功能算法描述与数据结构说明4四、系统实现7五、调试及运行结果11六、收获和体会12附录131 问题分析1.1 问题描述设计一个n元多项式程序,并完成多项式的乘法运算。从实际的角度出发,这里设计的程序是基于一元n次多项式的数学模型。1.2 问题的数学模型在数学上,一个一元多项式Pn(x)可按升幂写成:Pn(x)=a 0+a1 x+a2 x2 +an xn-1 .它由n

2、+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:Pn=(a0,a1,a2,an)每一项的指数i隐含在其系数ai的序号里。多项式的乘法规则:多次运用单项式与多项式相乘的法则得到的计算时(a+b)(m+n),先把(m+n)看成一个单项式,(a+b) 是一个多项式,运用单项式与多项式相乘的法则,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次运用单项式与多项式相乘的法则。1.3 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和

3、指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。基于以上的分析,我们定义多项式的数据结构为如下结构体形式:typedef struct Polynomial float coef;/系数 int expn;/指数 struct Polynomial *next;/指向下一个结点*Polyn,Polynomial; /Polyn为结点指针类型2 系统分析2.1 可行性研究该程序主要从技术的角度来分析可行性。技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。该系统采用了Wind

4、ows XP操作系统结合Visual C+ 6.0,TC 2.0等软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。2.2 系统结构与主要功能模块从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。如:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5. 多项式复制功能等。系统的整体流程和主要功能模块如图2-1所示开始输入选择显示加法显示功能表输入pa系数、指数退出输入p

5、b系数、指数减法乘法i=mi=mi<mi<m图 2-13 系统设计3.1系统设计目的与要求通过多项式运算程序设计(用C语言实现),使我们进一步掌握和利用C语言进行结构化程序设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握开发一个小型系统程序设计的基本方法;学会调试一个较长程序的基本方法;学会利用流程图或N-S图表示算法;以及掌握书写课程设计开发文档的能力(书写课程设计报告)。总之,通过本课程设计加深对C语言及数据结构课程所学知识的理解,进一步巩固C语言语法规则,在程序中体现出算法的思想,提高程序的运行效率。学会编制结构清晰、风格良好、数据结构适当的语言程序,从而具备解

6、决综合性实际问题的能力。3.2系统设计内容多项式运算程序具有以下基本功能:1界面输出,提示如何输入数据。要求先输入多项式的项数。2创建多项式。接收输入的数据,并保存到链表中。3显示程序的功能表,允许使用者选择运算类型。4显示已经创建好的多项式。6实现加法运算。7实现减法运算。8实现乘法运算。9清除内存内容,销毁创建的链表,退出程序。3.3功能算法描述与数据结构说明该多项式程序除了main()函数外,主要有以下函数:void Insert(Polyn p,Polyn h)Polyn CreatePolyn(Polyn head,int m)void DestroyPolyn(Polyn p)vo

7、id PrintPolyn(Polyn P)int compare(Polyn a,Polyn b)Polyn AddPolyn(Polyn pa,Polyn pb)Polyn SubtractPolyn(Polyn pa,Polyn pb)Polyn MultiplyPolyn(Polyn pa,Polyn pb)下面对这些函数逐一介绍。3.3. 系统主要功能函数的详细设计1.main()函数main函数用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。在程序开始

8、要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进行控制。2. Polyn CreatePolyn(Polyn head,int m)该函数功能是创建新的多项式链表。int m保存的多项式的项数,使用for语句,控制输入多项式的每一项。当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。在该函数中要用到分配空间的函数malloc()为新建链表分配空间。3. void DestroyPolyn(Polyn p)该函数的功能是销毁掉创建的两个链表,释放内存。以辅助退出程序。4. void Insert(

9、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是否有为系

10、数为0。同样也使用了malloc()关键字,为新链表创建空间。6. int compare(Polyn a,Polyn b)该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。用来辅助加法和乘法运算。7. Polyn SubtractPolyn(Polyn pa,Polyn pb)该函数功能:实现两个多项式pa、pb相减,其原理根加法类似,将指数相同的指数相减。与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。8. void PrintPolyn(Polyn P)该函数功能:显示多项式链表。在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还

11、有符号的控制。在输出第一项时要判断是不是常数项,若是,则不要输出字符x。9. Polyn MultiplyPolyn(Polyn pa,Polyn pb)函数功能:实现两个多项式相乘,A(X) * B(x) 。计算时运用单项式与多项式相乘的法则,然后再次运用单项式与多项式相乘的法则。4 系统实现该程序实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。为完成这些功能,还用到了一些辅助函数。下面讨论重要函数具体实现过程及其参数的意义:1. Polyn CreatePolyn(Polyn head,int m)该函数的两个参数,head表示为创建的链表的头指针,m表示为链表的长度,即

12、多项式的项数。定义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

13、("请输入第%d项的系数与指数:",i+1); scanf("%f %d",&p->coef,&p->expn); Insert(p,head); /调用Insert函数插入结点 return head;/CreatePolyn2. void Insert(Polyn p,Polyn h) 该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。以下是实现插入的关键代码: void Insert(Polyn p,Polyn h) if(p->coef=0) free(p); /系数为0的话释放结点 else/如果系数不

14、为0 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->nex

15、t=p; /Insert3. Polyn AddPolyn(Polyn pa,Polyn pb) 该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。其计算的结果存放在新建的pc所指向的链表中。函数中调用了int compare(Polyn a,Polyn b)的结果。下面是实现加法的关键代码:Polyn AddPolyn(Polyn pa,Polyn pb)/求解并建立多项式a+b,返回其头指针 Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(s

16、truct 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; q

17、b=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;/AddPolynint compare(Polyn a,Polyn b) if(a&&b) if(!b|a->expn

18、>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多项式非空/compare4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。下面给出关键代码:Polyn MultiplyPolyn(Polyn pa

19、,Polyn pb) 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->ex

20、pn+qb->expn; Insert(pf,hf);/调用Insert函数以合并指数相同的项 return hf;/MultiplyPolyn5.其它函数的介绍请参见附录中详细代码.5 调试及运行结果该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确。以下图5-1即为该程序运行结果效果图。图中采用的是计算多项式4x5+2x2+3x和x10+7x2的加减乘三种运算进行演示:输入两个多项式的每一项值提示功能选择进行三则运算的结果图5-16 收获和体会通过这次课程设计练习,使我更深刻地理解了语言的精髓-指针的使用。完成整个程序设计有,对指针掌握的更加熟练。同时通过直接对链表

21、的操作,加深了对数据结构的理解和认识。并在完成课程设计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。计算多项式的加、减、乘法运算-该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。在这个小组中我是组长,通过分工与合作,使我充分认识到在项目团队开发

22、过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。同样也是老师的严格要求才使得小组成员能够顺利的完成任务。附录#include<stdio.h>#include<malloc.h>/*/typedef struct Polynomial float coef;/系数 int expn;/指数 struct Polynomial *next;/指向下一个结点*Polyn,Polynomial; /Polyn为结点指针

23、类型/*/void Insert(Polyn p,Polyn h) if(p->coef=0) free(p); /系数为0的话释放结点 else/如果系数不为0 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的

24、话释放结点 q1->next=q2->next; free(q2); else /指数为新时将结点插入 p->next=q2; q1->next=p; /Insert/*以下函数实现建立一个多项式*/Polyn CreatePolyn(Polyn head,int m)/建立一个头指针为head、项数为m的一元多项式/在主程序初始时,先输入的多项式中的项数m、n 在这里为m。主程序中的pa、pb在此为head int i;/用来计数 Polyn p;/定义一个p链表 p=head=(Polyn)malloc(sizeof(struct Polynomial); head

25、->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/*以下函数实现多项式的销毁*/void DestroyPolyn(Polyn p)/销毁多项式p Polyn q

26、1,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) putch

27、ar('+'); /系数大于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) put

28、char('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(Poly

29、n 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多项式非空/compare/*以下函数实现加法*/Polyn AddPolyn(Polyn pa,Polyn pb)/求解并建立多项式a+b,返回其头指针 Polyn qa=pa-&g

30、t;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-&g

31、t;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 hea

32、dc;/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; pd=AddPolyn(pa,h); for(p=h->next;p;p=p->next) /恢复pb的系数 p->coef*=-1; return pd;/SubtractPolyn/*以下函数实现乘法*/Polyn Multipl

33、yPolyn(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

温馨提示

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

评论

0/150

提交评论