C++ 多项式操作

#include<windows.h>
#include<iostream>

#include<stdlib.h>
#include"stdio.h"

using namespace std;

 

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;
    else
     break;
   }
  }
 }
 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;
    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<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;
  else
   break;
 }
}

 

//相减
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;
  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<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;
   else
    break;
  }
  if(a->next)
   a=a->next;
  else
   break;
  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;
  else
   break;
 }
 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;
  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<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);
}


//主函数   
void main()
{
 Node *p=new Node;
 Node *q=new Node;
 Node *r=new Node;
 Polynomial<double> A(p);     //操作多项式A
 Polynomial<double> B(q);     //操作多项式B
 Polynomial<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;
  }
 }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#ifndef FUNCTION_H_ #define FUNCTION_H_ #include #include #include "polyfit.h" #include using namespace std; dxs::dxs() { ifstream fin("多项式拟合.txt"); fin>>n; x=new float[n]; y=new float[n]; for(int i=0;i>x[i]; } for(i=0;i>y[i]; } cout<>nn; m=nn+1; u=new float*[m]; for(i=0;i<m;i++) { u[i]=new float[m+1]; }//创建m行,m+1列数组 } void dxs::dfine() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { u[i][j]=0; } } for(i=0;i<m;i++) { for(int j=0;j<m;j++) { for(int k=0;k<n;k++) { u[i][j]=u[i][j]+pow(x[k],j+i); } } } for(i=0;i<m;i++) { for(int k=0;k<n;k++) { u[i][m]=u[i][m]+pow(x[k],i)*y[k]; } } } void dxs::show() { for(int i=0;i<m;i++) { for(int j=0;j<m+1;j++) { cout<<u[i][j]<<" ";//<<endl; } cout<<endl; } ////显示具有m行m+1列u数组的各元素值 } void dxs::select_main(int k,float **p,int m) { double d; d=*(*(p+k)+k); //cout<<d; int l=k; int i=k+1; for(;i fabs(d)) { d=*(*(p+i)+k); l=i; } else continue; } if(d==0) cout<<"错误"; else { if(k!=l) { for(int j=k;j<m+1;j++) { double t; t=*(*(p+l)+j); *(*(p+l)+j)=*(*(p+k)+j); *(*(p+k)+j)=t; } } } } void dxs::gaosi() { for(int k=0;k<m;k++) { select_main(k,u,m);//调用列主元函数 for(int i=1+k;i<m;i++) { // *(*(p+i)+k)=(float) *(*(p+i)+k) / *(*(p+k)+k); u[i][k]=(float) u[i][k] / u[k][k]; } for(i=k+1;i<m;i++) { for(int j=k+1;j=0;i--) { float a=0; for(int j=i+1;j<m;j++) { //a=a + (*(*(p+i)+j) * *(*(p+j)+m)); a=a+u[i][j] * u[j][m]; } //*(*(p+i)+n-1)= (*(*(p+i)+n-1) - a) / *(*(p+i)+i); u[i][m]= (u[i][m] -a) / u[i][i]; } cout<<"方程组的解为:"<<endl; for(i=0;i<m;i++) { cout<<"a"<<i+1<<"="; cout<<u[i][m]<<endl; // l[i]=*(*(p+i)+n-1); } cout<<"y="<<u[0][m]; for(i=1;i<m;i++) { cout<<showpos<<u[i][m]<<"x"; if(i!=1)cout<<"^"<<noshowpos<<i; } cout<<endl; } dxs::~dxs() { delete[]x,y; delete []*u; } #endif

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值