C++多项式运算

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 一元多项式运算.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include
using namespace std;
#include
#include"stdio.h"


struct Term
{
int exp; //指数
double coef; //系数
};

struct Node
{
Term data; //结点内容,为TERM结构
struct Node *next;
};

template
class Polynomial //多项式类
{
public:
Polynomial(Node* p) :front(p),n(0) //构造函数
{
p->data.coef=-1;
p->data.exp=-1;
p->next=NULL;
}
~Polynomial() { } //析构函数
void Print(); //显示
void Delete(Node *p); //销毁多项式值为0的项
int Getlength(); //获取多项式长度
void Setn();
void Getfront();
void Row(); //将多项式降序排序
T Power(T n, T x); //计算x^n,用于赋值
void Plus(Polynomial &B,Polynomial &R); //相加
void Minus(Polynomial &B,Polynomial &R); //相减
void Oppo(); //系数相反数,用于相减
void Evalute(double x); //赋值
void Derivate(Polynomial &R); //求导
void Multiply(Polynomial &B,Polynomial &R); //相乘
void destroyLink(); //销毁多项式
void menuPrint(); //菜单
void createLink(int n); //创建多项式
void Over(); //退出
int n;
double result;
private:
Node *front;
};



//计算x^n,用于赋值
template
T Polynomial::Power(T n, T x)
{
double result=1;
for(int i=1;i<=n;i++)
result=result*x;
return result;
}


//显示
template
void Polynomial::Print()
{
Row();
if((front==NULL)||(front->next==NULL))
{
cout<<"一元多项式为空"<}
else
{
Node *p=front->next;
if(p->data.exp!=0)
cout<<"Poly= "<data.coef<<"x^"<data.exp;
else if(p->data.exp==0)
cout<<"Poly= "<data.coef;
if(p->next!=NULL)
{
p=p->next;
while(1)
{
if((p->data.coef<0)&&(p->data.exp!=0))
cout<data.coef<<"x^"<data.exp;
else if((p->data.coef>0)&&(p->data.exp!=0))
cout<<"+"<data.coef<<"x^"<data.exp;
else if((p->data.coef<0)&&(p->data.exp==0))
cout<data.coef;
else if((p->data.coef>0)&&(p->data.exp==0))
cout<<"+"<data.coef;
if(p->next!=NULL)
p=p->next;
else
break;
}
}
}
cout<}



//销毁多项式值为0的项
template
void Polynomial::Delete(Node *p)
{
Node *q=front

;
while(q->next!=p)
q=q->next;
p=q;
q=q->next;
delete q;
}



//获取多项式长度
template
int Polynomial::Getlength()
{
Node *p=front;
if (p == NULL)
return 0;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}



template
void Polynomial::Setn()
{
n=Getlength();
}

template
void Polynomial::Getfront()
{
Node *front=new Node;
}



//将多项式降序排序与合并同类项
template
void Polynomial::Row()
{
Node *p=front->next;
Node *q=front->next;
Node *t=front->next;

while(1) //冒泡排序
{
p=t;
q=p->next;
while(q)
{
if(p->data.exp>q->data.exp)
{
if(q->next)
q=q->next;
else
break;
}
else if(p->data.exp==q->data.exp) //合并同类项
{
p->data.coef=p->data.coef+q->data.coef;
Node *temp=front;
while(temp->next!=q)
temp=temp->next;
if(q->next)
{
q=temp;
temp=temp->next;
q->next=temp->next;
delete temp;
q=q->next;
}
else
{
q=temp;
temp=temp->next;
delete temp;
q->next=NULL;
break;
}
}
else
{
Node *temp = new Node;
temp->data=q->data;
q->data=p->data;
p->data=temp->data;
delete temp;
if(q->next)
q=q->next;
else
break;
}
}
if(t->next)
{
t=t->next;
}
else
break;
}
Setn();
}



//系数相反数,用于相减
template
void Polynomial::Oppo()
{
Row();
Node *p=front->next;
while(1)
{
p->data.coef=0-p->data.coef;
if(p->next)
p=p->next;
else
break;
}
}



//相减
template
void Polynomial::Minus(Polynomial &B,Polynomial &R)
{
B.Oppo();
Plus(B,R);
B.Oppo();
}



//求导
template
void Polynomial::Derivate(Polynomial &R)
{
Setn();
Node *p=front->next;
Node *r=R.front;
while(1)
{
r->next=new Node;
r=r->next;
r->data.coef=p->data.coef;
r->data.exp=p->data.exp;
r->next=NULL;
if(p->next)
p=p->next;
else
break;
}
r=R.front->next;
while(1)
{
if(r->data.exp==0)
Delete(p);
else
{
r->data.coef=r->data.coef*r->data.exp;
r->data.exp=r->data.exp-1;
}
if(r->next)
r=r->next;
else
break;

}
}



//相乘
template
void Polynomial::Multiply(Polynomial &B,Polynomial &R)
{
Node* a=front->next;
Node* b=B.front->next;
Node* r=R.front;
if(R.front->next!=NULL)
R.destroyLink();
Row();
B.Row();

while(1)
{
while(1)
{
Node *rr=new Node;
rr->data.exp=a->data.exp+b->data.exp;
rr->data.coef=a->data.coef*b->data.coef;
rr->next=NULL;
r->next=rr;
r=rr;
if(b->next)
b=b->next;
else
break;
}
if(a->next)
a=a->next;
else
break;
b=B.front->next;
R.Row();
}
}




//赋值运算
template
voi

d Polynomial::Evalute(double x)
{
Setn();
Node *p=front->next;
double temp=0;
while(1)
{
temp+=(p->data.coef)*Power(p->data.exp,x);
if(p->next)
p=p->next;
else
break;
}
cout<}

//相加
template
void Polynomial::Plus(Polynomial &B,Polynomial &R)
{
Node* a=front->next;
Node* b=B.front->next;
Node* r=R.front;
while(1)
{
r->next=new Node;
r=r->next;
r->next=NULL;
r->data=a->data;
if(a->next)
a=a->next;
else
break;

}
while(1)
{
r->next=new Node;
r=r->next;
r->next=NULL;
r->data=b->data;
if(b->next)
b=b->next;
else
break;

}
R.Row();
}



//销毁多项式
template
void Polynomial::destroyLink()
{
Node* a=front->next;
if(!a) throw "一元多项式已为空!";//抛出异常

while(1)
{
if(a->next)
{
Node* b=a;
a=a->next;
delete b;
}
else
{
delete a;
break;
}
}
front->next=NULL;
}




//菜单
template
void Polynomial::menuPrint()
{
cout<<"\t***********一元多项式的简单运算*************"<cout<<"\t\t 1创建要运算的两个一元多项式"<cout<<"\t\t 2将两个一元多项式相加"<cout<<"\t\t 3将两个一元多项式相减"<cout<<"\t\t 4将两个一元多项式相乘"<cout<<"\t\t 3将两个一元多项式求导"<cout<<"\t\t 6显示两个一元多项式"<cout<<"\t\t 7给两个一元多项式赋值"<cout<<"\t\t 8销毁所创建的二个多项式"<cout<<"\t\t 9退出"<cout<<"请输入你要进行的操作(1-9)"<}



//创建多项式
template
void Polynomial::createLink(int n)
{
if(front->next!=NULL)
{
destroyLink();
}
Node *a=front;
for(int i=1;i<=n;i++)
{
a->next=new Node;
a=a->next;
a->next=NULL;

cout<<"请输入第"<cout<<"系数:";
cin>>(a->data).coef;
cout<<"指数:";
cin>>(a->data).exp;
if(a->data.exp<0)
{
cout<<"您输入有误,指数不允许为负值!"<Delete(a);
i--;
continue;
}
if(a->data.coef==0)
{
cout<<"系数为零,重新输入!"<Delete(a);
i--;
continue;
}
}
}


//退出
template
void Polynomial::Over()
{
exit(0);
}


//主函数
void main()
{
Node *p=new Node;
Node *q=new Node;
Node *r=new Node;
Polynomial A(p); //操作多项式A
Polynomial B(q); //操作多项式B
Polynomial R(r); //操作多项式R(存储结果)
int m=0;
int n=0;
int choose;
while(1)
{
A.menuPrint();
cin>>choose;
switch(choose)
{
case 1: //创建多项式
cout<<"请输入你要运算的第一个一元多项式的项数:"<cin>>m;
A.createLink(m);
cout<<"请输入你要运

算的第二个一元多项式的项数:"<cin>>n;
B.createLink(n);
break;
case 2: //相加
if(!m||!n)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
A.Plus(B,R);
cout<<"相加的两个一元多项式为:"<A.Print();
B.Print();
cout<<"相加后的结果为:"<R.Print();
R.destroyLink();
break;
case 3: //相减
if(!m||!n)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
A.Minus(B,R);
cout<<"相减的两个一元多项式为:"<A.Print();
B.Print();
cout<<"相减后的结果为:"<R.Print();
R.destroyLink();
break;
case 4: //相乘
if(!n||!m)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
A.Multiply(B,R);
cout<<"相乘的两个一元多项式为:"<A.Print();
B.Print();
cout<<"相乘后的结果为:"<R.Print();
R.destroyLink();
break;
case 5: //求导
if(!m)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
cout<<"求导的一元多项式为:"<A.Print();
B.Print();
cout<<"求导后的结果为:"<A.Derivate(R);
R.Print();
R.destroyLink();
B.Derivate(R);
R.Print();
break;
case 6: //输出多项式
if(!n||!m)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
cout<<"第一个一元多项式为:"<A.Print();
cout<<"第二个一元多项式为:"<B.Print();
break;
case 7: //多项式赋值
if(!n||!m)
{
cout<<"您的多项式创建有误,请重新选择……"<break;
}
cout<<"第一个一元多项式为:"<A.Print();
cout<<"第二个一元多项式为:"<B.Print();
cout<<"您的X值为:"<double x;
cin>>x;
cout<<"第一个一元多项式值为:";
A.Evalute(x);
cout<<"第二个一元多项式值为:";
B.Evalute(x);
break;
case 8:
try //捕捉异常
{
A.destroyLink();
B.destroyLink();
}
catch(const char *s)
{
cout<cout<<"请重新选择^^^"<continue;
}
cout<<"销毁成功!"<break;
case 9:
A.Over();

//退出函数
default:
cout<<"您的输入有误,请重新选择操作……"<break;
}
}
}

相关文档
最新文档