Polynomial operation with C++

来源:互联网 发布:百度软件中心开发者 编辑:程序博客网 时间:2024/06/05 16:03
// 一元多项式运算.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h" #include<iostream>using namespace std;#include<stdlib.h>#include"stdio.h"struct Term{int exp; //指数double coef; //系数};struct Node{Term data; //结点内容,为TERM结构struct Node *next;};template <typename T>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<class T>T Polynomial<T>::Power(T n, T x){double result=1;for(int i=1;i<=n;i++)result=result*x;return result;}//显示template<class T>void Polynomial<T>::Print(){Row();if((front==NULL)||(front->next==NULL)){cout<<"一元多项式为空"<<endl;}else{Node *p=front->next;if(p->data.exp!=0)cout<<"Poly= "<<p->data.coef<<"x^"<<p->data.exp;else if(p->data.exp==0)cout<<"Poly= "<<p->data.coef;if(p->next!=NULL){p=p->next;while(1){if((p->data.coef<0)&&(p->data.exp!=0))cout<<p->data.coef<<"x^"<<p->data.exp;else if((p->data.coef>0)&&(p->data.exp!=0))cout<<"+"<<p->data.coef<<"x^"<<p->data.exp;else if((p->data.coef<0)&&(p->data.exp==0))cout<<p->data.coef;else if((p->data.coef>0)&&(p->data.exp==0))cout<<"+"<<p->data.coef;if(p->next!=NULL)p=p->next;elsebreak;}}}cout<<endl;}//销毁多项式值为0的项template<class T>void Polynomial<T>::Delete(Node *p){Node *q=front;while(q->next!=p)q=q->next;p=q;q=q->next;delete q;}//获取多项式长度template<class T>int Polynomial<T>::Getlength(){Node *p=front;if (p == NULL)return 0;while(p->next!=NULL){n++;p=p->next;}return n;}template<class T>void Polynomial<T>::Setn(){n=Getlength();}template<class T>void Polynomial<T>::Getfront(){Node *front=new Node;}//将多项式降序排序与合并同类项template<class T>void Polynomial<T>::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;elsebreak;}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;elsebreak;}}if(t->next){t=t->next;}elsebreak;}Setn();}//系数相反数,用于相减template<class T>void Polynomial<T>::Oppo(){Row();Node *p=front->next;while(1){p->data.coef=0-p->data.coef;if(p->next)p=p->next;elsebreak;}}//相减template<class T>void Polynomial<T>::Minus(Polynomial &B,Polynomial &R){B.Oppo();Plus(B,R);B.Oppo();}//求导template<class T>void Polynomial<T>::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;elsebreak;}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;elsebreak;}}//相乘template<class T>void Polynomial<T>::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;elsebreak;}if(a->next)a=a->next;elsebreak;b=B.front->next;R.Row();}}//赋值运算template<class T>void Polynomial<T>::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;elsebreak;}cout<<temp<<endl;}//相加template<class T>void Polynomial<T>::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;elsebreak;}while(1){r->next=new Node;r=r->next;r->next=NULL;r->data=b->data;if(b->next)b=b->next;elsebreak;}R.Row();}//销毁多项式template<class T>void Polynomial<T>::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<class T>void Polynomial<T>::menuPrint(){cout<<"\t***********一元多项式的简单运算*************"<<endl;cout<<"\t\t 1创建要运算的两个一元多项式"<<endl;cout<<"\t\t 2将两个一元多项式相加"<<endl;cout<<"\t\t 3将两个一元多项式相减"<<endl;cout<<"\t\t 4将两个一元多项式相乘"<<endl;cout<<"\t\t 3将两个一元多项式求导"<<endl;cout<<"\t\t 6显示两个一元多项式"<<endl;cout<<"\t\t 7给两个一元多项式赋值"<<endl;cout<<"\t\t 8销毁所创建的二个多项式"<<endl;cout<<"\t\t 9退出"<<endl;cout<<"请输入你要进行的操作(1-9)"<<endl;}//创建多项式template<class T>void Polynomial<T>::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<<"请输入第"<<i<<"项的系数和指数:"<<endl;cout<<"系数:";cin>>(a->data).coef;cout<<"指数:";cin>>(a->data).exp;if(a->data.exp<0){cout<<"您输入有误,指数不允许为负值!"<<endl;Delete(a);i--;continue;}if(a->data.coef==0){cout<<"系数为零,重新输入!"<<endl;Delete(a);i--;continue;}}}//退出template<class T>void Polynomial<T>::Over(){exit(0);}//主函数int main(){Node *p=new Node;Node *q=new Node;Node *r=new Node;Polynomial<double> A(p); //操作多项式APolynomial<double> B(q); //操作多项式BPolynomial<double> R(r); //操作多项式R(存储结果)int m=0;int n=0;int choose;while(1){A.menuPrint();cin>>choose;switch(choose){case 1: //创建多项式cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl;cin>>m;A.createLink(m);cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl;cin>>n;B.createLink(n);break;case 2: //相加if(!m||!n){cout<<"您的多项式创建有误,请重新选择……"<<endl; //异常(以下省略)break;}A.Plus(B,R);cout<<"相加的两个一元多项式为:"<<endl;A.Print();B.Print();cout<<"相加后的结果为:"<<endl;R.Print();R.destroyLink();break;case 3: //相减if(!m||!n){cout<<"您的多项式创建有误,请重新选择……"<<endl;break;}A.Minus(B,R);cout<<"相减的两个一元多项式为:"<<endl;A.Print();B.Print();cout<<"相减后的结果为:"<<endl;R.Print();R.destroyLink();break;case 4: //相乘if(!n||!m){cout<<"您的多项式创建有误,请重新选择……"<<endl;break;}A.Multiply(B,R);cout<<"相乘的两个一元多项式为:"<<endl;A.Print();B.Print();cout<<"相乘后的结果为:"<<endl;R.Print();R.destroyLink();break;case 5: //求导if(!m){cout<<"您的多项式创建有误,请重新选择……"<<endl;break;}cout<<"求导的一元多项式为:"<<endl;A.Print();B.Print();cout<<"求导后的结果为:"<<endl;A.Derivate(R);R.Print();R.destroyLink();B.Derivate(R);R.Print();break;case 6: //输出多项式if(!n||!m){cout<<"您的多项式创建有误,请重新选择……"<<endl;break;}cout<<"第一个一元多项式为:"<<endl;A.Print();cout<<"第二个一元多项式为:"<<endl;B.Print();break;case 7: //多项式赋值if(!n||!m){cout<<"您的多项式创建有误,请重新选择……"<<endl;break;}cout<<"第一个一元多项式为:"<<endl;A.Print();cout<<"第二个一元多项式为:"<<endl;B.Print();cout<<"您的X值为:"<<endl;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<<s<<endl;cout<<"请重新选择^^^"<<endl;continue;}cout<<"销毁成功!"<<endl;break;case 9:A.Over();//退出函数default:cout<<"您的输入有误,请重新选择操作……"<<endl;break;}}}

原创粉丝点击