




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 一元稀疏多项式的表示及加法运算一、 需求分析1. 程序的功能:l 多项式以指数递增的顺序输入。l 设计的数据结构应有利于表示任意一元稀释多项式。l 输出原始多项式及运算结果。l 附加功能:乱序输入计算表达式结果2. 输入输出要求:l 多项式以指数递增的方式输入l 输出原始多项式及其结果3. 测试数据(1) , (2)0 , (3) , -1附加功能测试数据:(4) ,二、 概要设计l 所用数据结构定义:struct Term/多项式结点的定义float coef;/系数int exp;/指数Term * link;Term(float c,int e,Term * next=NULL)coef=c;exp=e;link=next;Term *InsertAfter(float c,int e);Term & operator -=(Term & t)if(t.exp=exp) coef-=t.coef;return *this;Term & operator +=(Term & t)if(t.exp=exp) coef+=t.coef;return *this;friend ostream & operatorlink=first;/必须链成环Polynomal()makeEmpty();Polynomal(Polynomal & R);/复制构造函数Polynomal & operator=(const Polynomal & R);/重载复制赋值操作符 void insert(float c,int e,Polynomal& R);/对于二项式进行插入排序 Polynomal sort();/对于多项式进行排序Term * getHead() constreturn first;void makeEmpty();private:Term * first;friend ostream & operator(istream &,Polynomal&);friend Polynomal operator+(Polynomal&,Polynomal&);l 主程序的流程及各模块之间的层次关系:1) 主程序流程2) 模块之间层次关系三、 详细设计1、插入一个结点Term* Term:InsertAfter(float c,int e)/在当前由this指针指示的项(即调用此函数的对象)后面插入一个新项link=new Term(c,e,link);/创建一个新结点,自动链接return link;/插入到this结点后面2、重载各运算符(1)Polynomal & Polynomal:operator =(const Polynomal & R) makeEmpty();/先清空 first=new Term(0,-1); Term *destptr=first,*srcptr=R.first-link; while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);srcptr=srcptr-link;destptr=destptr-link; destptr-link=first;/必须链成环 return *this;#伪代码清空;动态创建节点first;创建节点指针*destptr指向first,创建节点指针*srcptr指向R.first-link;WHILE(R链未遍历结束) 将R链表中的结点一次插入到first之后;ENDWHILE将*destptr连成环;结束(2)istream& operator(istream& in,Polynomal& x)Term *rear=x.first;int e;float c;/定义尾指针rearwhile(1)cout输入:系数,指数(以、-1结束):ce;if(c=0&e=-1)break;/用e小于控制输入结束rear=rear-InsertAfter(c,e);/链接到rear所指结点后return in;(3)ostream & operatorlink;coutThe polynomal is:coef0.0)outcoef=0)outlink;elseout*current;/调用term类的重载操作link;outlink;设置标志位hWHILE IF 打印符号+; 改变标志位; ELSE 打印该节点; 指向下一个节点;ENDIFENDWHILE(4)Polynomal operator+(Polynomal& A,Polynomal& B)Term *pa,*pb,*pc,*p,*last;float temp;Polynomal C;pc=C.first;pa=A.first-link;pb=B.first-link;while(pa!=A.first &pb!=B.first)/两两比较if(pa-exp=pb-exp)/对应项指数相等temp=pa-coef+pb-coef;/系数相加if(fabs(temp)!=0)pc=pc-InsertAfter(temp,pa-exp);pa=pa-link ;pb=pb-link;else if(pa-expexp)pc=pc-InsertAfter(pa-coef,pa-exp);/pa指数小 pa=pa-link;elsepc=pc-InsertAfter (pb-coef,pb-exp);pb=pb-link;/pb指数小,加入ah链if(pa!=A.first)p=pa;last=A.first;elsep=pb;last=B.first;while(p!=last)pc=pc-InsertAfter (p-coef,p-exp );p=p-link;return C;#伪代码*Pa=二项式a的当前节点;*pb=二项式b的当前节点;新建二项式c;WHILE IF IF 系数相加后将插入节点到c尾部; ENDIF 比较a,b的下一个节点 ELSEIF 将pa的当前节点复制到c尾部; Pa后移; ELSE 将Pb的当前节点复制到c尾部; Pb后移; ENDIFENDWHILEIF 将未遍历空的那一个所在的二项式剩余部分复制到c尾部;ENDIF返回合成多项式3、排序算法(1)Polynomal Polynomal:sort()Polynomal R; Term *p=first; p=p-link; while(p!=first)insert(p-coef,p-exp,R);p=p-link; return R;(2)void Polynomal:insert(float c, int e, Polynomal &R)Term *q=R.first,*p=R.first-link, *r;if(p=R.first) q-link=new Term(c,e);/c为空q-link-link=R.first;elsewhile(p!=R.first) if(p-exp=e)/指数相等p-coef+=c;if(p-coef!=0)break;if(p-coef=0)q-link=p-link;r=p;p=p-link;delete r;break;else if(p-expe)/e小于当前结点的指数q-link=new Term(c,e);q=q-link;q-link=p;break;elsep=p-link;q=q-link;if (p=R.first) /e大于R中每一项的指数,插在表尾q-link=new Term(c,e);q-link-link=p;四、 调试分析1、调试中的问题(1)在测试数据一时,出现带有常数项的多项式,常数项被构造为一次项,例如多项式被输出为解决办法:在重载运算符+中,当pa的指数小时,将程序由pc=pc-InsertAfter (pa-coef,pb-exp);pb=pb-link;改为pc=pc-InsertAfter (pb-coef,pb-exp);pb=pb-link;即可;(2)在调试问题二的过程中,出现的0被程序自动忽略,不能打印使得输出结果为解决办法:在重载输出运算符的程序模块中添加:if(current-coef=0)outlink;即可保证程序的输出正常,但是是以作为输出的。(3)由于程序的数据结构构造成一种环形链表,因而在编程侧时候比单链表更易出错,采取画图的方式容易解决问题。2、分析算法的时间复杂度和空间复杂度本实验所涉及算法基本采用顺序遍历方式,因而时间复杂度为o(m+n),空间复杂度为o(m+n)。五、 使用说明及测试结果按照程序提示,依次输入多项式的各项,系数与指数以Enter隔开,整个多项式输入以0、-1结束。如下图所示:1、测试数据一2、测试数据二3、测试数据三4、测试数据四六、 源程序带注释#include#includeusing namespace std;struct Term/多项式结点的定义float coef;/系数int exp;/指数Term * link;Term(float c,int e,Term * next=NULL)coef=c;exp=e;link=next;Term *InsertAfter(float c,int e);Term & operator -=(Term & t)if(t.exp=exp) coef-=t.coef;return *this;Term & operator +=(Term & t)if(t.exp=exp) coef+=t.coef;return *this;friend ostream & operatorlink=first;/必须链成环Polynomal()makeEmpty();Polynomal(Polynomal & R);/复制构造函数Polynomal & operator=(const Polynomal & R);/重载复制赋值操作符 void insert(float c,int e,Polynomal& R);/对于二项式进行插入排序 Polynomal sort();/对于多项式进行排序Term * getHead() constreturn first;void makeEmpty();private:Term * first;friend ostream & operator(istream &,Polynomal&);friend Polynomal operator+(Polynomal&,Polynomal&);Term* Term:InsertAfter(float c,int e)/在当前由this指针指示的项(即调用此函数的对象)后面插入一个新项link=new Term(c,e,link);/创建一个新结点,自动链接return link;/插入到this结点后面ostream& operator(ostream& out,const Term& x)/Term的友元函数:输出一个项X的内容到输出流out中if(x.coef=0.0) return out;/0系数项不输出outx.coef;switch(x.exp)case 0:break;case 1:outX;break;default:outXlink, *r;if(p=R.first) q-link=new Term(c,e);/c为空q-link-link=R.first;elsewhile(p!=R.first) if(p-exp=e)/指数相等p-coef+=c;if(p-coef!=0)break;if(p-coef=0)q-link=p-link;r=p;p=p-link;delete r;break;else if(p-expe)/e小于当前结点的指数q-link=new Term(c,e);q=q-link;q-link=p;break;elsep=p-link;q=q-link;if (p=R.first) /e大于R中每一项的指数,插在表尾q-link=new Term(c,e);q-link-link=p;Polynomal Polynomal:sort()Polynomal R;Term *p=first;p=p-link;while(p!=first)insert(p-coef,p-exp,R);p=p-link;return R;Polynomal:Polynomal(Polynomal& R)/复制构造函数:用已有多项式初始化当前多项式对象first=new Term(0,-1);Term *destptr=first,*srcptr=R.first-link;while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);/在destptr所指结点后插入一新结点,再让destptr指到这个新结点srcptr=srcptr-link;destptr=destptr-link;destptr-link=first;/必须链成环Polynomal & Polynomal:operator =(const Polynomal & R)makeEmpty();/先清空first=new Term(0,-1);Term *destptr=first,*srcptr=R.first-link;while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);srcptr=srcptr-link;destptr=destptr-link;destptr-link=first;/必须链成环return *this;void Polynomal:makeEmpty()Term *q;while(first-link!=first)q=first-link;first-link=q-link;delete q;istream& operator(istream& in,Polynomal& x)Term *rear=x.first;int e;float c;/定义尾指针rearwhile(1)cout输入:系数,指数(以、-1结束):ce;if(c=0&e=-1)break;/用e小于控制输入结束rear=rear-InsertAfter(c,e);/链接到rear所指结点后return in;ostream & operatorlink;coutThe polynomal is:coef0.0)outcoef=0)outlink;elseout*current;/调用term类的重载操作link
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 7752-2025绝缘胶粘带工频介电强度和耐电压的试验方法
- 2025年山东兴罗投资控股有限公司招聘工作人员(14人)考前自测高频考点模拟试题及1套完整答案详解
- 2025年菏泽市省属公费师范毕业生专项招聘(421人)考前自测高频考点模拟试题及一套参考答案详解
- 2025吉林长春市直事业单位招聘高层次人才17人(4号)考前自测高频考点模拟试题完整答案详解
- 2025年黑河逊克县乡村医生公开招聘19人考前自测高频考点模拟试题含答案详解
- 2025金隅集团春季校园招聘模拟试卷完整答案详解
- 2025年镀锡板卷(马口铁)项目合作计划书
- Heptanoyl-thio-PC-生命科学试剂-MCE
- Haploperoside-A-Scopolin-6-O-α-L-rhamnopyranoside-生命科学试剂-MCE
- 安全培训效果评估改进
- 中华人民共和国标准设计施工总承包招标文件(2012年版)
- 2022年内分泌医疗质量控制评价体系与考核标准
- 全国中小学生学籍信息管理系统学生基本信息采集表(2022修订版)
- 国家公务员行测数量关系(数字推理)模拟试卷1(共253题)
- 北师大版四年级数学上册第五单元《方向与位置》(大单元教学设计)
- (高清版)JTG 5211-2024 农村公路技术状况评定标准
- 人教精通版6年级上下册重点单词和句型默写
- 《民航客舱设备操作与管理》课件-项目二 客舱服务设备
- 大隐静脉消融术手术
- 三D打印公开课
- 生而逢盛世青年当有为 (模板)
评论
0/150
提交评论