收藏 分享(赏)

数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc

上传人:hskm5268 文档编号:6359137 上传时间:2019-04-09 格式:DOC 页数:30 大小:226KB
下载 相关 举报
数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc_第1页
第1页 / 共30页
数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc_第2页
第2页 / 共30页
数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc_第3页
第3页 / 共30页
数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc_第4页
第4页 / 共30页
数据结构课程设计-一元多项式的加法、减法、乘法的实现.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、一、设计题目一元多项式的加法、减法、乘法的实现。二、主要内容设有一元多项式A m(x)和B n(x).Am(x)=A0+A1x1+A2x2+A3x3+ +AmxmBn(x)=B0+B1x1+B2x2+B3x3+ +Bnxn请实现求M(x)= A m(x)+Bn(x)、M(x)= A m(x)-Bn(x)和M(x)= A m(x)Bn(x)。 要求: 1) 首先判定多项式是否稀疏2) 采用动态存储结构实现;3) 结果M(x)中无重复阶项和无零系数项;4) 要求输出结果的升幂和降幂两种排列情况三、具体要求及应提交的材料1每个同学以自己的学号和姓名建一个文件夹,如:“312009080611101张

2、三”。里面应包括:学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中)、任务书和课程设计说明书的电子文档。2打印的课程设计说明书(注意:在封面后夹入打印的“任务书”以后再装订)。四、主要技术路线提示为把多个小功能结合成一个完整的小软件,需使用“菜单设计”技术(可以是控制台方式下的命令行形式,若能做成图形方式则更好)。五、进度安排共计两周时间,建议进度安排如下:选题,应该在上机实验之前完成需求分析、概要设计可分配4学时完成详细设计可分配4学时调试和分析可分配10学时。2学时的机动,可用于答辩及按教师要求修改课程设计说明书。注:只用课内上机时间一般不能完成设计任务,所以需要学生自行

3、安排时间做补充。六、推荐参考资料(不少于3篇)1苏仕华等编著,数据结构课程设计,机械工业出版社,20072严蔚敏等编著,数据结构(C语言版),清华大学出版社,20033严蔚敏等编著,数据结构题集(C语言版),清华大学出版社,2003指导教师 签名日期 年 月 日系 主 任 审核日期 年 月 日摘 要 分析了matlab,mathmatic ,maple等数学软件对一元多项式的计算过程,步骤后。由于这些软件比较大功能 齐全,但是 实用性不强 。因此,利用 microsoft visual studio 6.0开发工具,编程实现了一元多项式的加法、减法、乘法的 计算器系统,该系统具有一元多项式的加

4、法、减法、乘法等功能。关键词:一元多项式; 软件; 计算 目 录 1需求分析 12开发及运行平台 23 概要设计 .34 详细设计 .45 调试分析 .86 测试结果 .97 结论 11致 谢 12参考文献 13附 录 .1611需求分析动态链表结构下的一元多项式的加法、减法、乘法的实现。设有一元多项式Am(x)和Bn(x).Am(x)=A0+A1x1+A2x2+A3x3+ +AmxmBn(x)=B0+B1x1+B2x2+B3x3+ +Bnxn实现求M(x)= Am(x)+Bn(x)、M(x)= Am(x)-Bn(x)和M(x)= Am(x)Bn(x)。(1)输入形式和输入值范围:输入的系数为

5、float类型,输入的幂为int类型请选择:1请输入你要运算的第一个一元多项式的项数:2请输入第1项的系数和指数:系数:1指数:1请输入第2项的系数和指数:系数:1指数:2(2)输出形式请选择:5一元多项式A为:x+x2一元多项式B为:4x4+5x5+6x6(3)程序所能达到的功能1) 首先判定多项式是否稀疏;2) 采用动态存储结构实现;23) 结果 M(x)中无重复阶项和无零系数项;4) 要求输出结果的升幂和降幂两种排列情况(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果。正确的输入:请选择:5一元多项式A为:x+x2一元多项式B为:4x4+5x5+6x6错误的输入:请

6、输入第1项的系数和指数:系数:1指数:1请输入第2项的系数和指数:系数:2指数:1输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式请输入第1项的系数和指数:2开发及运行平台Windows 7 alienware 平台上,Microsoft Visual studio 6.0 环境下开发。所以建议用户在使用时,在windows 7 平台上使用。33 概要设计数据类型的定义:struct Nodefloat coef;/结点类型,系数int exp;/指数;typedef Node polynomial;struct LNodepolynomial data;/链表类型LNod

7、e *next;typedef LNode* Link;模块调用关系如图1所示:一元多项式相乘 一元多项式输出 一元多项式销毁退出一元多项式创建一元多项式相加一元多项式的四则运算一元多项式相减4图 1 一元多项式计算器模块调用图4 详细设计 加法模块:5void PolyAdd(Link CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode;pc-nextnext;p2next;while(p1不为空且p2不为空)if(p1-data.expdata.exp)then: p-next=p1;p=p-next; p1=p1-next;else if(p1-da

8、ta.expp2-data.exp)then: p-nextnext;p2next;elsep1-data.coefdata.coef+p2-data.coef;/指数相同,系数想加if(p1-data.coef不等于0)p-nextnext;p1next;p2next;elsepdnext;p2next;6delete pd;/如果系数为0,则删除该项 if(p1!=NULL)then:p-next=p1;endifif(p2!=NULL)then : p-next=p2;endif减法模块,如图2所示:图 2 减法模块结构图void PolySubstract(Link CopyLink(

9、pt,pb);pdata).coefdata).coef);/被减的多项式前加“-“号pnext);PolyAdd(pc,pa,pt);/调用多项式加法运算函数开始调用多项式加法函数进行运算将多项式 B进行复制取多项式 B的相反数7DestroyLink(pt);乘法模块:如图3所示图 3 乘法模块结构图void PolyMultiply(Link pc=new LNode;pc-next=NULL;p1=pa-next;p2=pb-next;while(p1不为空) pd=new LNode;pd-next=NULL;p=new LNode;p-next=NULL;t=p;while(p2)

10、 newp=new LNode;newp-next=NULL;newp-data.coef=p1-data.coef*p2-data.coef;/系数相乘开始给出运算的两个多项式按系数相乘指数相加进行运算将运算的结果相加并输出8newp-data.exp=p1-data.exp+p2-data.exp;/指数相加t-next=newp;t=t-next;p2=p2-next;PolyAdd(pd,pc,p);/调用加法函数CopyLink(pc,pd);p1=p1-next;p2=pb-next;DestroyLink(p);DestroyLink(pd);5 调试分析(1)调试过程中遇到的问

11、题 :独立测试各个模块的功能时发现在创建链表后和另一个进行运算后多余的存储单元没有释放而造成内存的泄漏,还有对于链表的运算时结束条件掌握不透彻导致没有按计划地去结束,比如在用For循环及While循环时没有正确地判断指针的移动与结束条件而得不到自己想要的结果。进入函数内部调试时发现有误用没有初始化的变量,还有赘余的语句扰乱了代码的健壮性。 在主函数中对各个函数的调用时没有一个清晰的思路,使程序显得很混乱,给调试造成了很大困难。 对非法操作控制的不够完善,例如缺少对越界访问及其非法数据的控制机制,使程序9的安全性下降。(2)算法的时空分析该程序的实现是用链表实现的,所以时间复杂度和空间复杂度主要

12、来自于链表的操作,都是O(n)。(3)经验和体会编写的程序不但要拿来使用,还要给别人查看,以便代码的维护。所以代码编写的风格尽量规范,清晰。变量要尽量少定义,结构夜采用简单的。另外,对指针的使用要小心,尽量在定义的时候就进行初始化,避免野指针,指针的使用涉及到内存的分配。6 测试结果判断稀疏,如图4所示:图 4 判断多项式是否稀疏10加法运算,如图5所示: 图 5加法测试结果减法运算,如图6所示:图 6 减法测试结果乘法运算,如图7所示:图 7 乘法测试结果降幂升幂排序,如图8所示11图8降幂升幂排序测试结果7 结论该程序基本实现了要求的顺序结构、动态链表结构下的一元多项式的加法、减法、乘法等

13、功能。代码较为冗余,可读性较差,可以多添加一些提示语句以及注释。在这次课程设计中我又进一步地了解了数据结构中算法的核心思想的重要性,懂得了一个程序地好坏关键在于算法是否优秀,一个好的优秀的算法可以使我们的程序更加完善,安全性更高以及有更高的效率。这次设计中我发现了自己的许多不足,如对指针的机制掌握的还不是很透彻,有的时候会出现指针指向错误以及空指针的错误,还有不能很好地分析自己算法地复杂度以及不能很好地使用控制机制使自己的程序流12畅地运行。致 谢感谢指导老师给我的一些重要指导以及提供的资料,感谢严蔚敏编著的数据结构等资料,让我在编写代码的过程中少走了很多弯路。13参考文献1苏仕华等编著.数据

14、结构课程设计.机械工业出版社.20072严蔚敏等编著.数据结构(C语言版).清华大学出版社.20033严蔚敏等编著.数据结构题集(C语言版).清华大学出版社,20034郑莉等 编著. C+程序设计语言(第三版).清华大学出版社,2005.06北京5.陈清华 朱红主编. Visual C+课程设计案例精选与编程指导.东南大学出版社,2003.06,南京6.刘振安等编著. C+程序设计课程设计.机械工业出版社,2004.08,北京14附 录附录1 源程序清单#include/标准输入输出流#include/使程序中可用键盘输入函数#include/使程序中可用系统标准输出函数#include/调用

15、数学库函数using namespace std;/命名空间std内定义的所有标识符均有效struct Nodefloat coef;/结点类型,系数int exp;/指数;typedef Node polynomial;struct LNode15polynomial data;/链表类型LNode *next;typedef LNode* Link;void CreateLink(Link void PrintList(Link L);void PolyAdd(Link void PolySubstract(Link void CopyLink(Link void PolyMultiply

16、(Link int JudgeIfExpSame(Link pa,Link e);void DestroyLink(Link int CompareIfNum(int i);void DestroyLink(Link p=L-next;while(p) L-next=p-next;delete p;p=L-next;delete L;L=NULL;void CreateLink(Link Link p,newp;L=new LNode;L-next=NULL;(L-data).exp=-1;/创建头结点p=L;for(int i=1;i(newp-data).coef;cout(newp-da

17、ta).exp;if(newp-data.expnext=NULL;p=L;if(newp-data.coef=0)coutnext!=NULL) /p指向指数最小的那一个 if(!JudgeIfExpSame( L, newp)newp-next=p-next;p-next=newp;else coutnext;while(p-next!=NULL)if(abs(p-next-data.exp-p-data.exp)1)flag=1;elseflag=0;p=p-next;if(flag)coutnext;while(p!=NULLif(p=NULL)return 0;else return

18、 1;void PrintList(Link L)Link p;if(L=NULL|L-next=NULL) coutnext;18if(p-data).coef0) if(p-data).exp=0)coutdata).coef;/如果指数为0则直接输出系数else if(p-data).coef=1 else if(p-data).exp=1if(p-data).coefdata).exp=0)coutdata).coef;/如果指数为0,则直接输出系数else if(p-data.coef=-1 else if(p-data.exp=1)coutdata.coefdata).coefda

19、ta).exp;p=p-next;while(p!=NULL)if(p-data).coef0)/系数大于0时输出情况if(p-data).exp=0) coutdata).coef;else if(p-data).exp=1else coutdata).coefdata).exp;19if(p-data).coefdata).exp=0)coutdata).coef;else if(p-data.coef=-1else if(p-data.exp=1)coutdata.coefdata).coefdata).exp;p=p-next;coutnext=NULL;r=pc;p=pa;while

20、(p-next!=NULL) q=new LNode;q-data.coef=p-next-data.coef;q-data.exp=p-next-data.exp;r-next=q;q-next=NULL;r=q;p=p-next;void PolyAdd(Link 20CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode;pc-next=NULL;p=pc;p1=p1-next;p2=p2-next;while(p1!=NULLp=p-next;p1=p1-next;else if(p1-data.expp2-data.exp)p-next=p2;p=p

21、-next;p2=p2-next;elsep1-data.coef=p1-data.coef+p2-data.coef; if(p1-data.coef!=0)p-next=p1;p=p-next;p1=p1-next;p2=p2-next;elsepd=p1;p1=p1-next;p2=p2-next;delete pd;/如果系数为0,则删除该项21if(p1!=NULL) p-next=p1;if(p2!=NULL) p-next=p2;void PolySubstract(Link CopyLink(pt,pb);p=pt;while(p!=NULL) (p-data).coef=(-

22、(p-data).coef);/被减的多项式前加“-“号p=p-next;PolyAdd(pc,pa,pt);/调用多项式加法运算函数DestroyLink(pt);void Clear()system(“pause“);system(“cls“);/让用户重新选择void PolyMultiply(Link pc=new LNode;pc-next=NULL;p1=pa-next;p2=pb-next;while(p1!=NULL)pd=new LNode;pd-next=NULL;p=new LNode;p-next=NULL;22t=p;while(p2)newp=new LNode;n

23、ewp-next=NULL;newp-data.coef=p1-data.coef*p2-data.coef;/系数相乘newp-data.exp=p1-data.exp+p2-data.exp;/指数相加t-next=newp;t=t-next;p2=p2-next;PolyAdd(pd,pc,p);CopyLink(pc,pd);p1=p1-next;p2=pb-next;DestroyLink(p);DestroyLink(pd);void Menu()cout0switch(choose) case 1:coutn;if(CompareIfNum(n)=1) coutn;if(Comp

24、areIfNum(n)=1) cout“您的输入有误,请重新输入“endl;Clear();break;CreateLink(Lb,n);Clear();break; case 2:24if(La=NULL|Lb=NULL)cout“您的多项式创建有误,请重新选择“endl;Clear();break;PolyAdd(L,La,Lb);cout“endl;cout“设相加的两个一元多项式为和则:“endl;cout“endl;cout“A的多项式为:“;PrintList(La);cout“endl;cout“B的多项式为:“;PrintList(Lb);cout“endl; cout“相加后

25、的结果为:“;PrintList(L);cout“endl;Clear();DestroyLink(L);break;case 3:if(La=NULL|Lb=NULL)cout“您的多项式创建有误,请重新选择“endl;Clear();break;PolySubstract(L,La,Lb);cout“设相减的两个一元多项式为和则:“endl;cout“endl;cout“A的多项式为:“;PrintList(La);cout“endl;cout“B的多项式为:“;25PrintList(Lb);cout“endl;cout“相减后的结果为:“;PrintList(L);cout“endl;

26、Clear();DestroyLink(L);break; case 4:if(La=NULL|Lb=NULL) cout“您的多项式创建有误,请重新选择“endl;Clear();break;PolyMultiply(L,La,Lb);cout“设相乘的两个一元多项式为和则:“endl;cout“endl;cout“A的多项式为:“;PrintList(La);cout“endl;cout“B的多项式为:“;PrintList(Lb);cout“endl;cout“相乘后的结果为:“;PrintList(L);DestroyLink(L);cout“endl;Clear();break;ca

27、se 5:if(La=NULL|Lb=NULL)cout“您的多项式创建有误,请重新选择“endl;Clear();break;26cout“一元多项式A为:“endl;PrintList(La);cout“endl;cout“一元多项式B为:“endl;PrintList(Lb);cout“endl;Clear();break;case 6:if(LaDestroyLink(Lb);cout“多项式销毁成功!“endl;Clear();else cout“多项式不存在,请重新选择“endl;Clear();break;case 7:exit(0); /exit(0)强制终止程序,返回状态码0表示正常结束default:cout“您的输入有误,请重新选择操作“endl;Clear();break;附录2 用户使用说明双击该软件目录下的exe文件即可,或则右击,然后打开即可正常使用。

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

当前位置:首页 > 网络科技 > 数据结构与算法

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


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

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

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