一元符号多项式的四则运算.docx
《一元符号多项式的四则运算.docx》由会员分享,可在线阅读,更多相关《一元符号多项式的四则运算.docx(14页珍藏版)》请在冰豆网上搜索。
一元符号多项式的四则运算
C++开放项目实验报告
题目:
一元符号多项式四则运算
姓名:
指导老师:
学号:
班级:
一、内容总结
1.功能要求
用所学C++知识编程实现两个一元符号多项式的加法,减法和乘法运算。
2.算法概要设计
1结点插入函数
voidInsert(PNode*temp);
2多项式的创建函数
voidCreatPoly();
3赋值运算符的重载
Polynomail&operator=(constPolynomail&p1);
4一元符号多项式的加法
Polynomail&operator+(constPolynomail&p);
5一元符号多项式的减法
Polynomail&operator-(Polynomail&p);
6一元符号多项式的乘法
Polynomail&operator*(constPolynomail&p);
3.应用技巧
1利用Insert()插入函数规范多项式的输入问题,进行同类项的合并和不同类项间的排序问题,使得到有序的链表,方便后续的运算
2对赋值、加、减和乘运算符进行重载,赋予其新的意义,进行多项式间的四则运算。
3发现函数间联系,可以减少代码的长度。
巧妙利用Insert()函数和加运算符重载函数,方便乘法和减法等代码编写。
二、实验成果
1.输入要求
按提示一次输入多项式各项的系数和指数,建立多项式。
如下所示:
系数,指数:
1,2
系数,指数:
3,4
系数,指数:
04(以输入系数为零的项结束创建)
创建结果为:
1x^2+3x^4
根据自己的需要选择输入功能序号进行运算,如选择数字2进行加法运算
2.输出样例
总体上各项是按照输入的方法进行输出,如果指数为零只输出系数,如果系数为零,那么该项不输出,如果系数为负数,那么两项间“+”变“-”。
以上述输入为例创建的结果为:
1x^2+3x^4。
如果另一个多项式为:
-1-2x^6,
那么加法运算后的结果为:
-1+1x^2+3x^4-2x^6
3.主要代码展示:
//****c++开放实验项目****
//一元符号多项式的四则运算
#include
usingnamespacestd;
structPNode{
PNode(doublec=0,inte=-1){coef=c;expn=e;next=NULL;}
doublecoef;
intexpn;
PNode*next;
};
classPolynomial{
public:
Polynomial(){poly=newPNode;}
Polynomial(Polynomial&p);
voidPrint();
~Polynomial();
voidInsert(PNode*temp);
voidCreatPoly();
Polynomial&operator=(constPolynomial&p);
Polynomial&operator+(constPolynomial&p);
Polynomial&operator-(Polynomial&p);
Polynomial&operator*(constPolynomial&p);
private:
PNode*poly;
};
//析构函数
Polynomial:
:
~Polynomial(){
PNode*pt=poly->next;
while(pt){
poly->next=pt->next;
deletept;
pt=poly->next;
}
deletepoly;
poly=NULL;
}
//赋值运算符的重载
Polynomial&Polynomial:
:
operator=(constPolynomial&p){
this->~Polynomial();
poly=newPNode;
PNode*pt=poly,*qt=p.poly->next;
while(qt){
PNode*s=newPNode(qt->coef,qt->expn);
pt->next=s;
pt=s;
qt=qt->next;
}
return*this;
}
//复制构造函数
Polynomial:
:
Polynomial(Polynomial&p){
poly=newPNode;
*this=p;
}
//遍历
voidPolynomial:
:
Print(){
if(poly->next==NULL){
cout<<"empty!
\n";
return;
}
PNode*pt=poly->next;
if(pt){
if(pt->expn==0){
cout<coef;
}
else{
cout<coef<<"x^"<expn;
}
pt=pt->next;
}
while(pt){
if(pt->expn==0){
cout<coef;
}
else{
if(pt->coef<0){
cout<coef<<"x^"<expn;
}
else{
cout<<"+"<coef<<"x^"<expn;
}
}
pt=pt->next;
}
cout<}
//结点插入函数
voidPolynomial:
:
Insert(PNode*temp){
if(poly->next==NULL){
poly->next=temp;
return;
}
PNode*pt=poly;
PNode*qt=pt->next;
while(qt&&qt->expnexpn){
pt=qt;
qt=pt->next;
}
if(qt==NULL||qt->expn>temp->expn){
temp->next=qt;
pt->next=temp;
}
else{
qt->coef+=temp->coef;
if(qt->coef==0){
pt->next=qt->next;
deleteqt;
}
}
}
//多项式的构建函数
voidPolynomial:
:
CreatPoly(){
doublec;
inte;
cout<<"系数,指数:
";
cin>>c>>e;
while(c){
PNode*p=newPNode(c,e);
Insert(p);
cout<<"系数,指数:
";
cin>>c>>e;
}
}
//多项式的加法
Polynomial&Polynomial:
:
operator+(constPolynomial&q){
Polynomial*PC=newPolynomial;
PNode*ta=poly->next,*tb=q.poly->next,*tc=PC->poly;
while(ta&&tb){
inta=ta->expn;
intb=tb->expn;
intt=a>b?
1:
(b>a?
-1:
0);
switch(t){
case-1:
{
PNode*s=newPNode(ta->coef,ta->expn);
tc->next=s;
tc=s;
ta=ta->next;
break;
}
case0:
{
doublesum=ta->coef+tb->coef;
if(sum==0){
ta=ta->next;
tb=tb->next;
}
else{
PNode*s=newPNode(sum,ta->expn);
tc->next=s;
tc=s;
ta=ta->next;
tb=tb->next;
}
break;
}
case1:
{
PNode*s=newPNode(tb->coef,tb->expn);
tc->next=s;
tc=tc->next;
tb=tb->next;
break;
}
}//switch
}//while
while(ta){
PNode*s=newPNode(ta->coef,ta->expn);
tc->next=s;
tc=s;
ta=ta->next;
}
while(tb){
PNode*s=newPNode(tb->coef,tb->expn);
tc->next=s;
tc=s;
tb=tb->next;
}
return*PC;
}
//多项式的减法
Polynomial&Polynomial:
:
operator-(Polynomial&p){
//复制取反相加
PolynomialP(p),*PC=newPolynomial;
PNode*pt=P.poly->next;
while(pt){
pt->coef=-pt->coef;
pt=pt->next;
}
*PC=*this+P;
return*PC;
}
//多项式的乘法
Polynomial&Polynomial:
:
operator*(constPolynomial&p){
Polynomial*PC=newPolynomial;
PNode*pt=poly->next,*qt;
for(;pt;pt=pt->next){
for(qt=p.poly->next;qt;qt=qt->next){
PNode*s=newPNode(pt->coef*qt->coef,pt->expn+qt->expn);
PC->Insert(s);
}
}
return*PC;
}
//主函数
intmain(){
PolynomialPA,PB,PC;
intindex;
cout<<"//------一元符号多项式的表示及运算------//"<cout<<"本函数的功能列表:
"<cout<<"1.多项式的加法:
"<cout<<"2.多项式的减法:
"<cout<<"3.多项式的乘法:
"<cout<<"4.选择重建多项式:
"<cout<<"5.结束运算\n"<cout<<"依次输入PA各项系数和指数(以输入系数0项结束),建立多项
式:
"<PA.CreatPoly();
PA.Print();
cout<<"依次输入PB各项系数和指数(以输入系数0项结束),建立多项
式:
"<PB.CreatPoly();
PB.Print();
cout<<"\n请输入功能序号进行多项式的运算:
";
cin>>index;
while(index){
switch(index){
case1:
{
PC=PA+PB;
cout<<"PC=PA+PB:
";
PC.Print();
break;
}
case2:
{
PC=PA-PB;
cout<<"PC=PA-PB:
";
PC.Print();
break;
}
case3:
{
PC=PA*PB;
cout<<"PC=PA*PB:
";
PC.Print();
break;
}
case4:
{
intflag;
cout<<"输入0修改多项式PA,其他数字保留多项式PA:
";
cin>>flag;
if(!
flag){
PA.CreatPoly();
PA.Print();
}
cout<<"输入0修改多项式PB,其他数字保留多项式PB:
";
cin>>flag;
if(!
flag){
PB.CreatPoly();
PB.Print();
}
break;
}
case5:
{
cout<<"运算结束"<return0;
}
}//switch
cout<<"\n是否需要继续,请再次输入选择:
";
cin>>index;
}//while
return0;
}
4.项目结果展示
三、实践体会
在此次的C++开放项目试验中,我承担了用C++实现一元符号多项式的四则运算,将所学C++知识运用实战编程中去,并及时进行知识的查缺补漏,帮助我更好的掌握了C++这门语言。
通过整个编程调试过程,我认识到完成一个程序的设计,必须一步一步的进行,修改程序中的Bug,以防影响后续程序的进行。
不能一股脑的将程序全部写出,这样就会使得程序的调试的难度大大增加。
要能够去考虑程序的每一步实现的可能性问题。
如在这次试验中,关于赋值运算符的问题,普通的赋值运算符无法实现我自定义的多项式的整体复制,必须进行运算符的重载,赋予其新的意义。
类似的还有加号、减号和乘号。
考虑程序设计中的特殊部分的运算,像是此次项目中的头结点和尾结点等,防止程序的特殊化。
要考虑程序的实用性,结合要求来对程序进行调整,返回引用值减少空间的使用,保护多项式的封装性,使得程序运行通畅和方便。
在程序的基本编写结束时。
还要对程序进行优化,使得程序能够尽可能的精炼,增加程序的可读性和含金量等。
总之一段好的代码一定是经过精心设计,千锤百炼,然后才能经久不衰。
在此次实验项目中,我学会了一些编程的技巧,掌握了C++这门课程的主要知识,提升了自我钻研能力,希望以后能够多参与一些这样的开发项目。