Polynomial operation with C++
// 一元多项式运算.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++相关推荐
- 打工人防加班办公技巧合集(第3期)
21. 如何激活Windows 命令提示符(管理员) slmgr /skms kms.v0v.bid && slmgr /ato 如遇报错请访问 https://v0v.bid/ 22 ...
- 第四章 MATLAB的数学运算
第四章 MATLAB的数学运算 4.1 多项式与插值 4.1.1 多项式的表示 4.1.2 多项式的四则运算 4.1.3 多项式的其他运算 ==4.1.4 数据插值== 4.2 函数运算 4.2.1 ...
- npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX
问题描述 使用npm install出现 npm install 提示权限不足 Error: EPERM: operation not permitted, unlink XXX提示 原因 这里原因有 ...
- 向量算子优化Vector Operation Optimization
向量算子优化Vector Operation Optimization 查看MATLAB命令View MATLAB Command 示例显示Simulink®编码器™ ,将生成向量的块输出,设置为标量 ...
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
这是精心收集的精品经典资料,值得下载保存阅读! c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual h ...
- list python 转tensor_TensorFlow 中的几个关键概念:Tensor,Operation,Graph,Session
前言:TensorFlow是一种符号式编程框架,首先要构造一个图(graph),然后在这个图上做运算.打个比方,graph就像一条生产线,session就像生产者.生产线具有一系列的加工步骤(加减乘除 ...
- Operation Queues并发编程
并发.异步在我们的编程中,见到的太多了.在iOS中,实现并发的主要三个途径Operation Queues.Dispatch Queues.Dispatch Sources,今天我们就来详细介绍Ope ...
- LESS 的 operation 是 特性
LESS 的 operation 是 特性,其实简单的讲,就是对数值型的 value(数字.颜色.变量等)进行加减乘除四则运算. 例: 清单 1 . LESS 文件 1 2 3 4 5 @init: ...
- the user operation is waiting for building workspace to complete解决办法
如果你在开发android应用程序中总是出现一个提示,显示"the user operation is waiting for "building workspace" ...
最新文章
- Git学习笔记;Git bash 库同步问题
- 爬虫-request库-get请求
- @程序员,幼儿园小班都在学 AI,就问你慌不慌?
- MATLAB 高等数学中的应用
- 弘辽科技:拼多多批发价格会影响活动价格吗?商家要不要改价?
- python人工智能难不难_AI人工智能难不难 怎么进入人工智能行业
- 一起捉妖 ios12.3更新了location不用了 怎么办
- xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
- 抽象基类与接口,共性与个性的选择!
- 记一次iphone更换电池难以取下旧电池解决办法
- win10 64位系统上注册wincc的ocx插件问题
- Win7系统没有音量图标,系统图标为灰色打不开的解决方法
- 计算机视觉基础知识复习
- 非谓语动词 + 情态动词学习笔记
- sublime匹配汉字
- 安卓手机查看已经连接的WIFI密码
- 倍福PLC Modbus通信区
- IIS WebDAV安全配置
- IE8 设置图片大小,没有效果
- Python检测文章抄袭,谈谈去重算法原理