收藏 分享(赏)

数据结构一元多项式的运算.doc

上传人:精品资料 文档编号:8546820 上传时间:2019-07-02 格式:DOC 页数:23 大小:1,004KB
下载 相关 举报
数据结构一元多项式的运算.doc_第1页
第1页 / 共23页
数据结构一元多项式的运算.doc_第2页
第2页 / 共23页
数据结构一元多项式的运算.doc_第3页
第3页 / 共23页
数据结构一元多项式的运算.doc_第4页
第4页 / 共23页
数据结构一元多项式的运算.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

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

2、升幂写成: Pn(x)=a 0+a1 x+a2 x2 +an xn-1 .它由 n+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 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当

3、系数为 0 时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。基于以上的分析,我们定义多项式的数据结构为如下结构体形式:typedef struct Polynomialfloat coef;/系数int expn;/指数struct Polynomial *next;/指向下一个结点*Polyn,Polynomial; /Polyn 为结点指针类型课程设计(论文)22 系统分析2.1 可行性研究该程序主要从技术的角度来分析可

4、行性。技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。该系统采用了Windows XP 操作系统结合 Visual C+ 6.0,TC 2.0 等软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。2.2 系统结构与主要功能模块从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。如:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5.

5、 多项式复制功能等。系统的整体流程和主要功能模块如图 2-1 所示课程设计(论文)3开始输入选择显示加法显示功能表输入 pa 系数、指数退出输入 pb 系数、指数减法乘法i=mi=minext=NULL;for(i=0;icoef,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); /系

6、数为 0 的话释放结点else/如果系数不为 0Polyn q1,q2;q1=h;q2=h-next;while(q2q2=q2-next; if(q2free(p);if(!q2-coef) /系数为 0 的话释放结点q1-next=q2-next;free(q2); else /指数为新时将结点插入p-next=q2;q1-next=p; /Insert3. Polyn AddPolyn(Polyn pa,Polyn pb) 该函数有两个参数,其类型均为 polyn,分别表示要相加的两个不同的多项式。其计算的结果存放在新建的 pc 所指向的链表中。函数中调用了 int compare(Po

7、lyn 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(struct Polynomial);/建立头结点hc-next=NULL;headc=hc;while(qa|qb)qc=(Polyn)malloc(sizeof(struct Polynomial);课程设计(论文)9switch(compare(qa,qb)case 1:

8、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 时,释放该结点/while课程设计(论文)10return headc;/Add

9、Polynint compare(Polyn a,Polyn b)if(aelse if(!a|a-expnexpn) return -1;else return 0;else if(!a/a 多项式已空,但 b 多项式非空else return 1;/b 多项式已空,但 a 多项式非空/compare4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 该函数同加法一样,拥有相同的参数并且同样将新建立的链表 pf 的指针返回,用来实现输出乘法结果。下面给出关键代码:Polyn MultiplyPolyn(Polyn pa,Polyn pb)Polyn hf,pf

10、;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 函数以合并指数相同的项 课程设计(论文)11return hf;/Multip

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

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

13、要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。同样也是老师的严格要求才使得小组成员能够顺利的完成任务。课程设计(论文)14附录#include#include/*/typedef struct Polynomialfloat coef;/系数int expn;/指数struct Polynomial *next;/指向下一个结点*Polyn,Polynomial; /Polyn 为结点指针类型/*/void Insert(Polyn p,Polyn h) if(p-coef=0) free(p); /系数为 0

14、 的话释放结点else/如果系数不为 0Polyn q1,q2;q1=h;q2=h-next;while(q2q2=q2-next;if(q2free(p);if(!q2-coef) /系数为 0 的话释放结点q1-next=q2-next;free(q2);else /指数为新时将结点插入课程设计(论文)15p-next=q2;q1-next=p;/Insert/*以下函数实现建立一个多项式 */Polyn CreatePolyn(Polyn head,int m)/建立一个头指针为 head、项数为 m 的一元多项式/在主程序初始时,先输入的多项式中的项数 m、n 在这里为 m。主程序中的

15、pa、pb 在此为 headint i;/用来计数Polyn p;/定义一个 p 链表p=head=(Polyn)malloc(sizeof(struct Polynomial);head-next=NULL;for(i=0;icoef,Insert(p,head); /调用 Insert 函数插入结点return head;/CreatePolyn/*以下函数实现多项式的销毁 */void DestroyPolyn(Polyn p)/销毁多项式 pPolyn q1,q2;q1=p-next;q2=q1-next;while(q1-next)课程设计(论文)16free(q1);q1=q2;/

16、指针后移q2=q2-next;/*以下函数实现显示输出多项式 * */void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1;/项数计数器if(!q) /若多项式为空,输出 0putchar(0); printf(“n“);return; while (q)if(q-coef0 /系数大于 0 且不是第一项if(q-coef!=1 if(q-expn=1) putchar(X);else if(q-expn) printf(“X%d“,q-expn);elseif(q-coef=1)if(!q-expn) putchar(1); else if(

17、q-expn=1) putchar(X); else printf(“X%d“,q-expn);if(q-coef=-1)课程设计(论文)17if(!q-expn) printf(“-1“); else if(q-expn=1) printf(“-X“); else printf(“-X%d“,q-expn);q=q-next; flag+;/whileprintf(“n“);/PrintPolyn/*在下面的辅助乘法和加法运算 */int compare(Polyn a,Polyn b)if(aelse if(!a|a-expnexpn) return -1;else return 0;el

18、se if(!a/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;课程设计(论文)18while(qa|qb)qc=(Polyn)malloc(sizeof(

19、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;课程设计(论文)19hc-next=qc;hc=qc;else f

20、ree(qc);/当相加系数为 0 时,释放该结点/whilereturn 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;pd=AddPolyn(pa,h);for(p=h-next;p;p=p-next) /恢复 pb 的系数p-coef*=-1;return pd;/SubtractPolyn/*以下函数实现乘法*/P

21、olyn MultiplyPolyn(Polyn pa,Polyn pb)/求解并建立多项式 a*b,返回其头指针(该函数实现乘法)Polyn hf,pf;Polyn qa=pa-next;Polyn qb=pb-next;hf=(Polyn)malloc(sizeof(struct Polynomial);/建立头结点课程设计(论文)20hf-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;p

22、f-expn=qa-expn+qb-expn;Insert(pf,hf);/调用 Insert 函数以合并指数相同的项return hf;/MultiplyPolyn/*主函数实现显示与功能选择 */int main()int m,n,flag=0;/m、n 为分别为 a、b 两个多项式的项数Polyn pa=0,pb=0,pc,pd,pf;/定义各式的头指针,pa 与 pb 在使用前付初值 NULL/pc 头指针所在的多项式用在加法中作为结果,pd 用在加法中,pf 乘法中printf(“*欢迎使用一元多项式运算程序*n“);printf(“请输入第一个多项式 a 的项数:“);scanf(

23、“%d“,pa=CreatePolyn(pa,m);/建立第一个多项式 aprintf(“请输入第二个多项式 b 的项数:“);scanf(“%d“,pb=CreatePolyn(pb,n);/建立第二个多项式 b/输出菜单printf(“*n“);printf(“情选择您要进行的操作:nt1. 输出多项式 a 和 bnt2.建立多项式 a+bnt3.建立多项式 a-bn“);课程设计(论文)21printf(“t4.计算多项式 a*b 的值nt5.退出n“);for(;flag=0)printf(“n“);scanf(“%d“,if(flag=1)printf(“多项式 a:“);Print

24、Polyn(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(flag5) printf(“Error!n“);continue;/forDestroyPolyn(pa);课程设计(论文)22DestroyPolyn(pb);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报