// 一元多项式运算.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;}}}

Polynomial operation with C++相关推荐

  1. 打工人防加班办公技巧合集(第3期)

    21. 如何激活Windows 命令提示符(管理员) slmgr /skms kms.v0v.bid && slmgr /ato 如遇报错请访问 https://v0v.bid/ 22 ...

  2. 第四章 MATLAB的数学运算

    第四章 MATLAB的数学运算 4.1 多项式与插值 4.1.1 多项式的表示 4.1.2 多项式的四则运算 4.1.3 多项式的其他运算 ==4.1.4 数据插值== 4.2 函数运算 4.2.1 ...

  3. npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX

    问题描述 使用npm install出现 npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX提示 原因 这里原因有 ...

  4. 向量算子优化Vector Operation Optimization

    向量算子优化Vector Operation Optimization 查看MATLAB命令View MATLAB Command 示例显示Simulink®编码器™ ,将生成向量的块输出,设置为标量 ...

  5. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...

    这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...

  6. list python 转tensor_TensorFlow 中的几个关键概念:Tensor,Operation,Graph,Session

    前言:TensorFlow是一种符号式编程框架,首先要构造一个图(graph),然后在这个图上做运算.打个比方,graph就像一条生产线,session就像生产者.生产线具有一系列的加工步骤(加减乘除 ...

  7. Operation Queues并发编程

    并发.异步在我们的编程中,见到的太多了.在iOS中,实现并发的主要三个途径Operation Queues.Dispatch Queues.Dispatch Sources,今天我们就来详细介绍Ope ...

  8. LESS 的 operation 是 特性

    LESS 的 operation 是 特性,其实简单的讲,就是对数值型的 value(数字.颜色.变量等)进行加减乘除四则运算. 例: 清单 1 . LESS 文件 1 2 3 4 5 @init: ...

  9. the user operation is waiting for building workspace to complete解决办法

    如果你在开发android应用程序中总是出现一个提示,显示"the user operation is waiting for "building workspace" ...

最新文章

  1. Git学习笔记;Git bash 库同步问题
  2. 爬虫-request库-get请求
  3. @程序员,幼儿园小班都在学 AI,就问你慌不慌?
  4. MATLAB 高等数学中的应用
  5. 弘辽科技:拼多多批发价格会影响活动价格吗?商家要不要改价?
  6. python人工智能难不难_AI人工智能难不难 怎么进入人工智能行业
  7. 一起捉妖 ios12.3更新了location不用了 怎么办
  8. xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
  9. 抽象基类与接口,共性与个性的选择!
  10. 记一次iphone更换电池难以取下旧电池解决办法
  11. win10 64位系统上注册wincc的ocx插件问题
  12. Win7系统没有音量图标,系统图标为灰色打不开的解决方法
  13. 计算机视觉基础知识复习
  14. 非谓语动词 + 情态动词学习笔记
  15. sublime匹配汉字
  16. 安卓手机查看已经连接的WIFI密码
  17. 倍福PLC Modbus通信区
  18. IIS WebDAV安全配置
  19. IE8 设置图片大小,没有效果
  20. Python检测文章抄袭,谈谈去重算法原理

热门文章

  1. u-nas 配置权限-- File Explorer
  2. 最近google.com打不开了
  3. free BSD协议栈代码
  4. [Java] POJ 2386
  5. python日常办公能用到_用Python自动办公,做职场高手全16讲(无需程序员基础) | 樱花庄...
  6. 【长安大学】考研初试复试资料分享
  7. BA-强强联手江森自控携手日立空调(转载)
  8. 针对电陶炉E5错误的维修总结(狗头)
  9. 阶段性总结(HTML)
  10. cupsd进程_Linux进程及作业管理