一元多项式

实验目的:掌握用线性表实现一元多项式的基本运算。

实验内容:使用链式存储实现一元多项式的加法、减法、乘法和求导。即:

C(x)= A(x)+B(x);C(x)= A(x)-B(x) C(x)= A(x)*B(x) C(x)= A’(x)

菜单:

1)C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入,遇到系数为0则停止。例如:输入 :

1 2 3 4 5 6 7 8

0 2 3 4 5 6 7 0 则生成的多项式分别为:

A(x)=x^2+3x^4+5x^6+7x^8

B(x)=2x^3+4x^5+6x^7

2)P:计算C(x)= A(x)+B(x),计算完毕后输出C(x)的 结果

3)S: 计算C(x)= A(x)-B(x),计算完毕后输出C(x)的 结果

4)M: 计算C(x)= A(x)*B(x),计算完毕后输出C(x)的 结果

5)D: 计算C(x)= A’(x),计算完毕后输出C(x)的 结果

6)V: 首先输入一个 float型数据,然后计算 A(x)并输出计算的结果。

7)C: 分别清空A(x)、B(x)、C(x)三个多项式。

8)X: 退出程序。

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <stdlib.h>
using namespace std;
struct Term{
  float coef;
  int exp;
  Term *link;
  Term(float c,int e,Term *next=NULL){
     coef=c;exp=e;link=next;
  }
  Term *InsertAfter(float c,int e){
     link=new Term(c,e,link);
     return link;
  }
  friend ostream &operator <<(ostream &,const Term &);
};
class Polynomal{
  public:
      Polynomal(){
          first=new Term(0,-1);
      }
      int maxOder(){
        Term *p=first;
        while(p->link!=NULL){
            p=p->link;
        }
        return p->exp;
      }
      //Polynoaml (Polynomal &R);
      Term *getHead() const {return first;}
      float Result(float x);
      Polynomal qiudao();
      void makeEmpty()
      {
          Term *p;
          while(first->link!=NULL)
          {
              p=first->link;
              first->link=p->link;
              delete p;
          }
      }
  private:
    Term *first;
    friend ostream &operator << (ostream &,const Polynomal&);
    friend istream &operator >> (istream &,Polynomal&);
    friend Polynomal operator + (Polynomal&,Polynomal&);
    friend Polynomal operator – (Polynomal&,Polynomal&);
};
ostream &operator << (ostream &out,const Term &x){
   if(x.coef==0.0) return out;
   if(fabs(x.coef-1)<0.00001);
   else if(fabs(x.coef+1)<0.00001) out<<"-";
   else  out<<x.coef;
   switch(x.exp){
     case 0:break;
     case 1:out<<"x";break;
     default :out<<"x^"<<x.exp;break;
     }
return out;
}
istream &operator>>(istream &in,Polynomal &x){
  Term *rear=x.getHead();
  int c,e;
  while(1){
    in>>c;
    if(c==0.0) break;
    in>>e;
    rear=rear->InsertAfter(c,e);
  }
  return in;
}
ostream &operator << (ostream &out,Polynomal &x){
  Term *current=x.getHead()->link;
  bool h=true;
  while(current!=NULL){
    if(h==false&&current->coef>0.0)  out<<"+";
    h=false;
    out<<*current;
    current=current->link;
  }
  out<<endl;
  return out;
}
Polynomal operator +(Polynomal &A ,Polynomal &B){
   Term *pa,*pb,*pc,*p;float temp;
   Polynomal C;
   pc=C.first;
   pa=A.getHead()->link;
   pb=B.getHead()->link;
   while(pa!=NULL&&pb!=NULL){
    if(pa->exp==pb->exp){
        temp=pa->coef+pb->coef;
        if(fabs(temp)>0.001)
            pc=pc->InsertAfter(temp,pa->exp);
        pa=pa->link;
        pb=pb->link;
    }
    else if(pa->exp<pb->exp){
        pc=pc->InsertAfter(pa->coef,pa->exp);
        pa=pa->link;
       }
    else{
           pc=pc->InsertAfter(pb->coef,pb->exp);
           pb=pb->link;
        }
   }
    if(pa!=NULL)  p=pa;
    else  p=pb;
    while(p!=NULL){
        pc=pc->InsertAfter(p->coef,p->exp);
           p=p->link;
    }
    return C;
}
Polynomal operator -(Polynomal &A ,Polynomal &B){
   Term *pa,*pb,*pc,*p;float temp;
   Polynomal C;
   pc=C.first;
   pa=A.getHead()->link;
   pb=B.getHead()->link;
   while(pa!=NULL&&pb!=NULL){
    if(pa->exp==pb->exp){
        temp=pa->coef-pb->coef;
        if(fabs(temp)>0.001)
            pc=pc->InsertAfter(temp,pa->exp);
        pa=pa->link;
        pb=pb->link;
    }
    else if(pa->exp<pb->exp){
        pc=pc->InsertAfter(pa->coef,pa->exp);
        pa=pa->link;
     }
    else{
           pc=pc->InsertAfter(-(pb->coef),pb->exp);
           pb=pb->link;
        }
   }
   int count=1;
    if(pa!=NULL){
        p=pa;
        count=0;
    }
    else
    p=pb;
    while(p!=NULL){
            if(count==0)
            pc=pc->InsertAfter(p->coef,p->exp);
            if(count==1)
            pc=pc->InsertAfter(-(p->coef),p->exp);
           p=p->link;
    }
    return C;
}
Polynomal operator*(Polynomal& A,Polynomal& B)//乘法
{
    Term *pa,*pb,*pc;
    Polynomal C;
     pc=C.getHead();
    int a,b,e,maxExp;
    a=A.maxOder();
    b=B.maxOder();
    if(a!=-1||b!=-1)
    {
        maxExp=a+b;
        float* result=new float[maxExp+1];
        for(int i=0;i<=maxExp;i++)//给计算后的多项式系数赋初值
            result[i]=0.0f;
        pa=A.getHead()->link;
        while(pa!=NULL)
        {
            pb=B.getHead()->link;
            while(pb!=NULL)
            {
                e=pa->exp+pb->exp;
                result[e]+=pa->coef*pb->coef;
                pb=pb->link;
            }
            pa=pa->link;
        }

        for(int i=0;i<=maxExp;i++){
            if(fabs(result[i])>0.000001)
            {
                pc=pc->InsertAfter(result[i],i);
            }
        }
        delete[] result;
    }
    pc->link=NULL;
    return C;
}
float Polynomal::Result(float x)
{
    Term *p;
    float result=0.0f,t;
    p=first->link;
    while(p!=NULL)
    {
        t=1.0f;
        for(int i=0;i<p->exp;i++)
        {
            t*=x;
        }
        result+=p->coef*t;
        p=p->link;
    }
    return result;
}
Polynomal Polynomal::qiudao()
{
    Term* p,*pc;
    float temp;
    int e;
    p=first->link;
    Polynomal C;
    pc=C.first;
    while(p!=NULL)
    {
        temp=p->coef*p->exp;
        e=p->exp-1;
        if(temp!=0)
        pc=pc->InsertAfter(temp,e);
        p=p->link;
    }
    return C;
}
int main()
{
    Polynomal A,B,C;
    float result,x;
    char c;
    int count=0;
    while(1)
    {
        cin>>c;
        switch(c)
        {
            case 'C':cin>>A;cin>>B;break;
            case 'P':C=A+B;cout<<"C(x)="<<C;break;
            case 'S':C=A-B;cout<<"C(x)="<<C;break;
            case 'M':C=A*B;cout<<"C(x)="<<C;break;
            case 'D':C=A.qiudao();cout<<"C(x)="<<C;break;
            case 'V':cin>>x;result=A.Result(x);printf("%.2f\n",result);break;
            case 'X':count=1;break;
        }
        if(count==1)
        {
            break;
        }
    }

    return 0;
}


You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注