一元稀疏多项式计算器实验报告c++编写附源代码.docx
- 文档编号:13093983
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:27
- 大小:112.84KB
一元稀疏多项式计算器实验报告c++编写附源代码.docx
《一元稀疏多项式计算器实验报告c++编写附源代码.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器实验报告c++编写附源代码.docx(27页珍藏版)》请在冰点文库上搜索。
一元稀疏多项式计算器实验报告c++编写附源代码
一元稀疏多项式计算器实验报告
级班年月日学号_
1.实验题目
设计一个一元稀疏多项式简单计算器。
2.需求分析
本程序用VC编写,实现一元浮点系数,整数指数稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
①输入的形式和输入值的围:
A.输入指定的数字,以此选择两个多项式的运算方式,运算方式有两个一元多项式相加、两个一元多项式相减。
B.创建多项式时,需要输入此多项式,每一项的系数和指数。
②输出的形式:
每次输入一个完整的多项式后、每次得出多项式运算结果时,会以指定的方式输出多项式。
③程序所能达到的功能:
实现一元稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
④测试数据:
输入数据:
A.出现选择两个多项式的运算方式菜单时,输入1(即使两个多项式相加);
B.首先输入多项式p的每一项系数和指数,当输入的指数为-5000时,表示该多项式输入完毕,输入的数据依次为:
3,3,0,-5000;
C.其次输入多项式q的每一项系数和指数,输入数据依次为:
2,2,0,-5000。
输出结果:
多项式q+p的结果为:
多项式为:
3x3+2x2
3.概要设计
1)为了实现上述程序功能,需要定义多项式结点的抽象数据类型:
classTerm
{
数据对象:
floatcoef;该数据对象为多项式一项中的系数。
intexp;该数据对象为多项式一项中的指数。
Term*link;该数据对象为指向下一个多项式结点的指针。
基本操作:
A.Term(floatc,inte)
初始条件:
无
操作结果:
初始化多项式结点对象,将c赋值给该结点的数据成员coef(表示系数),将e赋值给该结点的数据成员exp(表示指数),将该结点的数据成员link赋值为0。
B.Term(floatc,inte,Term*next)
初始条件:
无
操作结果:
初始化多项式结点对象,将c赋值给该结点的数据成员coef(表示系数),将e赋值给该结点的数据成员exp(表示指数),将next赋值给该结点的数据成员link(link表示指向下一个多项式结点的指针)。
C.Term*InsertAfter(floatc,inte)
初始条件:
存在一个多项式结点
操作结果:
为一个新的多项式项申请结点,并且用Term进行初始化,把this->link赋值给新项结点的link;并且把该新项结点的指针赋值给this->link,最后返回一个指向新项结点的指针。
D.friendostream&operator<<(ostream&,constTerm&)
初始条件:
存在一个多项式结点
操作结果:
输出一个多项式结点中存放的该项的系数和指数,输出格式为coefX^exp,其中coef为该结点所存储的系数,exp为该结点所存储的指数。
}
2)多项式的抽象数据类型如下:
classPolynominal{
数据对象:
Term*theList;该数据对象是多项式的头指针。
基本操作:
A.Polynominal()
初始条件:
无
操作结果:
初始化多项式对象,构造一个多项式的空的单循环链表。
B.~Polynominal()
初始条件:
存在一个多项式对象
操作结果:
当多项式对象的生命周期结束后,释放其所占用的存空间。
C.voidAddTerms(istream&in);
初始条件:
存在一个多项式对象
操作结果:
让用户输入多项式的每一项,构造单循环链表。
D.voidOutput(ostream&out)const;
初始条件:
存在一个多项式对象
操作结果:
调用Term类上重载的<<操作,输出多项式的每一项。
E.voidPolyAdd(Polynominal&r);
初始条件:
存在两个多项式对象
操作结果:
将this指针所指向的多项式与r多项式相加,相加的结果存放在this所指向的多项式中。
F.voidOpposeCoef();
初始条件:
存在一个多项式对象
操作结果:
将this指针所指向的多项式每一项的系数取反。
G.voidPolySubtract(Polynominal&r);
初始条件:
存在两个多项式对象
操作结果:
调用OpposeCoef函数,将r多项式的每一项系数取反;再调用PolyAdd函数,将r与this指针所指向的多项式相加,即得到this指针所指向多项式减去r多项式的结果。
H.friendostream&operator<<(ostream&,constPolynominal&)
初始条件:
存在一个多项式对象
操作结果:
调用Output函数,将一个输出流对象返回
I.friendistream&operator>>(istream&,Polynominal&);
初始条件:
存在一个多项式对象
操作结果:
调用AddTerms函数,将一个输入流对象返回
J.friendPolynominal&operator+(Polynominal&,Polynominal&);
初始条件:
存在两个多项式对象
操作结果:
调用PolyAdd函数,实现多项式的相加
K.friendPolynominal&operator-(Polynominal&,Polynominal&);
初始条件:
存在两个多项式对象
操作结果:
调用OpposeCoef和olyAdd函数,实现多项式的相减
3)综上所述,程序中的类图如图1所示
Term
-floatcoef;
-intexp;
-Term*link;
+Term(floatc,inte);
+Term(floatc,inte,Term*next);
+Term*InsertAfter(floatc,inte);
-friendostream&operator<<(ostream&,constTerm&);
Polynominal
-Term*theList;
+Polynominal();
+~Polynominal();
+voidAddTerms(istream&in);
+voidOutput(ostream&out)const;
+voidPolyAdd(Polynominal&r);
+voidPolySubtract(Polynominal&r);
+voidOpposeCoef();
+friendostream&operator<<(ostream&,constPolynominal&);
+friendistream&operator>>(istream&,Polynominal&);
+friendPolynominal&operator+(Polynominal&,Polynominal&);
+friendPolynominal&operator-(Polynominal&,Polynominal&);
程序包含11个函数:
主函数main()
②多项式结点初始化函数Term(floatc,inte);
③多项式结点初始化函数Term(floatc,inte,Term*next);
④新申请结点后,将其插入this指针指向的结点后
Term*InsertAfter(floatc,inte);
⑤多项式构造函数Polynominal();
⑥多项式析构函数~Polynominal();
⑦让用户输入多项式的每一项,构造单循环链表
voidAddTerms(istream&in);
⑧输出多项式的每一项voidOutput(ostream&out)const;
⑨将两个多项式相加voidPolyAdd(Polynominal&r);
⑩将两个多项式相减voidPolySubtract(Polynominal&r);
将一个多项式的每一项系数取反voidOpposeCoef();
程序包含5个运算符及操作符重载:
friendostream&operator<<(ostream&,constPolynominal&);
friendistream&operator>>(istream&,Polynominal&);
friendPolynominal&operator+(Polynominal&,Polynominal&);
friendPolynominal&operator-(Polynominal&,Polynominal&);
friendostream&operator<<(ostream&,constTerm&);
各函数间关系如下:
4.详细设计
1)多项式结点类的定义
classTerm
{
public:
Term(floatc,inte);
Term(floatc,inte,Term*next);
Term*InsertAfter(floatc,inte);//在this指针指示的结点后插入一个结点
private:
floatcoef;//多项式一个结点中的系数
intexp;//多项式一个结点中的系数
Term*link;//多项式中该结点指向下一个结点的指针
friendostream&operator<<(ostream&,constTerm&);
friendclassPolynominal;
};
2)多项式类的定义
classPolynominal
{
public:
Polynominal();
~Polynominal();
voidAddTerms(istream&in);
//让用户输入多项式的每一项,构造单循环链表
voidOutput(ostream&out)const;
//调用Term类上重载的<<操作,输出多项式的每一项
voidPolyAdd(Polynominal&r);
//将this指针所指向的多项式与r多项式相加,相加的结果存放在this所指向的多项式中。
voidPolySubtract(Polynominal&r);//多项式相减
voidOpposeCoef();将this指针所指向的多项式每一项的系数取反。
private:
Term*theList;//该多项式的指向表头的指针
friendostream&operator<<(ostream&,constPolynominal&);
friendistream&operator>>(istream&,Polynominal&);
friendPolynominal&operator+(Polynominal&,Polynominal&);
friendPolynominal&operator-(Polynominal&,Polynominal&);
};
多项式的基本操作如下
3)Term:
:
Term(floatc,inte)
{
把c赋值给Term的coef;
把e赋值给Term的exp;
link置值为0;
}
4)Term:
:
Term(floatc,inte,Term*next)
{
把c赋值给Term的coef;
把e赋值给Term的exp;
把next赋值给Term的link;
}
5)Term*Term:
:
InsertAfter(floatc,inte)
{
为需要插入的多项式结点申请动态存储空间,并且用Trem构造函数将其初始化;
把c、e和this的指向下一项的指针赋值给新的结点,即使插入的结点指向this->link所指向的结点;
将新结点的地址返回给this指向下一个结点的指针,即返回给this->link,使this指向新插入的结点;
returnlink;
}
6)ostream&operator<<(ostream&out,constTerm&single)
//重载"<<",让其输出多项式的一项;
//该模块不输出系数为0的项。
{
if该多项式系数为0
返回输出流对象out;
if(多项式系数为1&&该多项式的指数不为0);
//该判断条件没有下一步的执行语句,其直接进入接下来的输出X的模块
elseif(多项式系数为-1&&该多项式的指数不为0)
输出-号;
else
输出该多项式的系数;
switch(指数)//输出多项式的X和其指数
{
指数为0:
break;
指数为1:
输出X;break;
否则:
输出:
X^指数;break;
}
返回输出流对象out;
}
7)Polynominal:
:
Polynominal()//多项式的构造函数
{
指向该多项式的头指针theList=new多项式结点(0.0,N);
//调用Term的构造函数,初始化该新结点
头指针指向下一个结点的指针theList->link=头指针theList的地址;
//构造一个多项式结点,其构成一个单循环链表,该结点系数域为0,指针域为指定的常量N,并且把多项式的头指针指向该结点
}
8)Polynominal:
:
~Polynominal()//多项式的析构函数
{
临时申请的指向多项式结点的指针=头结点指向下一个结点的地址;
//将临时指针指向头结点的下一个结点
while(临时指针!
=指向头结点的指针)
{
将头结点指向临时指针所指结点的下一个结点;
delete临时指针所指向的存空间;
临时指针后移;
}
delete头指针所指向的结点的存空间;
}
9)voidPolynominal:
:
AddTerms(std:
:
istream&in)
//该函数功能为输入多项式的每一项,直至当输入指数为N时输入结束
{
将临时指针temp指向头结点;
floatc;inte;
while
(1)
{
cout<<"请输入多项式一项中的系数和指数(coef,exp);
cout<<当输入指数为"< cin>>c>>e; if(e等于N) 退出while循环,结束构造多项式的过程; 临时指针=临时指针temp调用InsertAfter(c,e); //InsertAfter(c,e)返回一个地址,赋值给临时指针,临时指针指向InsertAfter(c,e)生成的新结点 } } 10)istream&operator>>(istream&in,Polynominal&x) //重载>>符号,实现输入多项式的功能 { 多项式对象x调用AddTerms函数; return输入流对象; } 11)voidPolynominal: : Output(ostream&out)const { intfirst=1; //first用来判断输出的多项式是否为第一项,first=1为第一项,否则不是第一项。 将临时指针temp指向头结点; if(temp的系数==0) //如果第一项系数为0,则该多项式必为0 输出0; else { for(;临时指针temp! =头指针;临时指针=临时指针temp->link) { if(不为第一项&&系数>0) 输出"+"号; first=0; 调用重载的<<,输出临时指针所指向的结点; } } } 12)ostream&operator<<(ostream&out,constPolynominal&x) { 多项式对象x调用Output函数; return输出流对象; } 13)voidPolynominal: : PolyAdd(Polynominal&r) //该函数把this指针指向的多项式和r多项式相加,相加结果放入this指向的多项式中。 下面给出该函数的流程图: 是 否 是 否 是 是 否 14)Polynominal&operator+(Polynominal&a,Polynominal&b) { 多项式对象a调用PolyAdd,将a、b两个多项式相加; return返回多项式对象a; } 15)voidPolynominal: : OpposeCoef() { 将多项式的每一项系数取反; } 16)Polynominal&operator-(Polynominal&a,Polynominal&b) { 被减的多项式b调用OpposeCoef函数,将自身的每一项系数取反; 多项式对象a调用PolyAdd,将a、b两个多项式相加; return返回多项式对象a; } 5.调试分析 调试过程中遇到了两个问题,都是因为我自身疏忽而导致的问题。 第一个是在判断多项式是否相等时,我把“==”误输入成“=”,导致程序运行很久都没有出结果,因为之前已经对各模块做过测试,确保了其他模块没有问题,所以我把错误锁定在多项式相加函数这一模块中。 通过Debug来观察链表的值,我发现有一个本不该发生值改变的链表的值被赋值,之后根据Debug停留的位置,发现了把“==”误输入成“=”的错误。 这与我不够细心,没有养成良好的编程风格有关。 还有一个问题是,我把一个语句的位置写错,写入了一个循环体,结果得出的多项式不正确,我还是用Debug来观察链表的值,发现了一个链表的值很不寻常,最终经过分析,找到了这一个错误。 编程需要耐心和细心,一个很小的错误,就导致得不出最终的结果。 并且在做动态调试时,一定要认真地进行静态调试,这样才能提高编程的效率。 6.使用说明 程序名为: 多项式正式.exe,运行环境为DOS。 程序执行后显示 请选择两个多项式需要进行的运算 1.多项式q+多项式p 2.多项式q-多项式p 输入数字选择执行不同的功能。 输入1,使用多项式q+多项式p功能; 输入2,使用多项式q-多项式p功能; 输入其他数字,则提示输入错误,需要重新输入数字选择功能,直至输入的数字为1或2为止。 输入其他数字后,输出的画面如下: 您输入的数据有误,请输入1或者2,请重新输入数字 输入1,使用多项式q+多项式p功能; 输入2,使用多项式q-多项式p功能; 输入1后,输出画面如下: 此时请降幂输入多项式的各项系数和指数,当输入的指数为-5000时,结束该多项式的输入,进入下一个多项式的输入阶段,输出画面如下: 此时请降幂输入多项式的各项系数和指数,当输入的指数为-5000时,结束该多项式的输入,接着会打印输出多项式的相加的结果。 并且输出: 请问是否还需要继续进行多项式计算? 请输入y或n(y-继续,n-退出) 此时输入y则继续进行多项式计算,画面回到功能选择菜单,输入n则退出程序 输入2时,操作步骤和上面的类似。 7.测试结果 按照下面的多项式进行测试,并且输入时互换两个多项式,把程序得出的运算结果和人工计算结果对比,程序运算结果全部正确 1)(3.1x11+5x8+2x)+(11x6+7)=(3.1x11+5x8+11x6+2x+7) 2)(3.1x11-5x8-2x)+(11x6+7)=(3.1x11-5x8+11x6-2x+7) 3)(-1.2x9+4.4x2-x+6x-3)-(7.8x15+5.4x2-6x-3)=(-7.8x15-1.2x9-x2-x+12x-3) 4)(x5+x4+x3+x2+x+1)+(-x4-x3)=(x5+x2+x+1) 5)(x+x-3)+(-x-x-3)=0 6)(x100+x)+(x200+x100)=(x200+2x100+x) 7)(x3+x2+x)+0=x3+x2+x 程序源代码: #include usingnamespacestd; #include #include"TermPolynominal.h" constintN=-5000; voidmain() { charselection_y_n; intselection_number; do { Polynominalp,q; cout<<"请选择两个多项式需要进行的运算"< cout<<"1.多项式q+多项式p"< cout<<"2.多项式q-多项式p"< cin>>selection_number; while((selection_number! =1)&&(selection_number! =2)) { cout<<"您输入的数据有误,请输入1或者2,请重新输入数字"< cout<<"请选择两个多项式需要进行的运算"< cout<<"1.多项式q+多项式p"< cout<<"2.多项式q-多项式p"< cin>>selection_number; } cout<<"请输入两个需要计算的多项式"< cout<<"请按降幂输入多项式p"< cin>>p;cout< cout<<"请按降幂输入多项式q"< cin>>q;cout< switch(selection_number) { case1: q=q+p; cout<<"多项式q+p的结果为: "< cout< break; case2: q=q-p; cout<<"多项式q-p的结果为: "< cout< break; } cout<<"请问是否还需要继续进行多项式计算? 请输入y或n(y-继续,n-退出)"< cin>>selection_y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 计算器 实验 报告 c+ 编写 源代码