C++用类实现一元多项式加减乘


刚刚学C++

正在慢慢的体会类的思想,面向对象的思想。。。

感觉用动态数组要比链表麻烦很多。。也许是我水平有限吧~

接口文件poly.h 

#ifndef POLY_H
#define POLY_H
#include <iostream>
#include <cstdlib>
#include <cstddef>
using namespace std;
typedef int* intptr;
class poly
{
public:
 poly();
 poly(int a);
 poly(const poly& p);
 ~poly();
 void creat();
 friend poly operator +(const poly& p1,const poly& p2);
 friend poly operator -(const poly& p1,const poly& p2);
 friend poly operator *(const poly& p1,const poly& p2);
  poly& operator =(const poly& p);
 friend ostream& operator <<(ostream& outs,const poly& p);
private:
 intptr polyomial;
 int len;
};
#endif

 

 

多项式类的实现poly.cpp

#include <iostream>
#include "poly.h"
#include <vector>
using namespace std;


poly::poly()
{  polyomial=NULL;
len=0;
}

poly::poly(int a)
{len=1;
 polyomial=new int[1];
 polyomial[0]=a;
}


poly::poly(const poly& p)
{ len=p.len;
 polyomial=new int[len];
 for(int i=0;i<len;i++)
  polyomial[i]=p.polyomial[i];

}


poly::~poly()
{
 delete [] polyomial;
}

 

void poly::creat()
{ vector <int> v1,v2;
 int c1,c2;
 cin>>c1>>c2;
 while(c1!=0)
 {
  v1.push_back(c1);
  v2.push_back(c2);
  cin>>c1>>c2;
 }

 int max=v2[0];
 for(int i=1;i<v2.size();i++)
 if(max<v2[i])max=v2[i];


//int max=v2[v2.size()-1];
   
 polyomial=new int[max+1];
 len=max+1;
 for(int z=0;z<max+1;z++)
  polyomial[z]=0;
 for(int i=0;i<max+1;i++)
 {
  for(int j=0;j<v1.size();j++)
  {if(i==v2[j])polyomial[i]=v1[j];
  
  }
 }
 
}

poly operator +(const poly& p1,const poly& p2)
{ poly a;
 if(p1.len>p2.len)
 { a.polyomial=new int[p1.len];
 for(int i=0;i<p2.len;i++)
  a.polyomial[i]=p1.polyomial[i]+p2.polyomial[i];
 for(int i=p2.len;i<p1.len;i++)
  a.polyomial[i]=p1.polyomial[i];
 a.len=p1.len;
 }
 else
 { a.polyomial=new int[p2.len];
 for(int i=0;i<p1.len;i++)
  a.polyomial[i]=p1.polyomial[i]+p2.polyomial[i];
 for(int i=p1.len;i<p2.len;i++)
  a.polyomial[i]=p1.polyomial[i];
 a.len=p2.len;
 }
 return a;
}

 poly operator -(const poly& p1,const poly& p2)
{ poly a;
 if(p1.len>p2.len)
 { a.polyomial=new int[p1.len];
 for(int i=0;i<p2.len;i++)
  a.polyomial[i]=p1.polyomial[i]-p2.polyomial[i];
 for(int i=p2.len;i<p1.len;i++)
  a.polyomial[i]=p1.polyomial[i];
 a.len=p1.len;
 }
 else if(p1.len<p2.len)
 { a.polyomial=new int[p2.len];
 for(int i=0;i<p1.len;i++)
  a.polyomial[i]=p1.polyomial[i]-p2.polyomial[i];
 for(int i=p1.len;i<p2.len;i++)
  a.polyomial[i]=-p2.polyomial[i];
 a.len=p2.len;
 }
 else
 {
 a.polyomial=new int[p1.len];
 for(int i=0;i<p1.len;i++)
  a.polyomial[i]=p1.polyomial[i]-p2.polyomial[i];
 a.len=p1.len;
 }
 return a;
}

poly operator *(const poly& p1,const poly& p2)
{
 poly a;
 
 a.polyomial=new int[p1.len+p2.len-1];
 
 a.len=p1.len+p2.len-1;
 for(int i=0;i<a.len;i++)
  a.polyomial[i]=0;
 for(int i=0;i<p2.len;i++)
 {
  for(int j=0;j<p1.len;j++)
  {
   if(0==i){ a.polyomial[i+j]=p2.polyomial[i]*p1.polyomial[j];}
   else { a.polyomial[i+j]=a.polyomial[i+j]+p2.polyomial[i]*p1.polyomial[j];}
  }
 }
 return a;
}


 poly& poly:: operator =(const poly& p)
 { len=p.len;
 polyomial=new int[len];
 for(int i=0;i<len;i++)
  polyomial[i]=p.polyomial[i];
 return (*this);
 }

 

 ostream& operator <<(ostream& outs,const poly& p)
 {int n=0;
  for(int i=0;i<p.len;i++)
   if(p.polyomial[i]!=0)
   {  n++;
   if(1==n)
   {
    if(0==i)outs<<p.polyomial[0];
    else outs<<p.polyomial[i]<<"x^"<<i;
   }
    else
    {
  
     if(0==i)outs<<p.polyomial[0];
    else if(p.polyomial[i]>0)outs<<"+"<<p.polyomial[i]<<"x^"<<i;
    else outs<<p.polyomial[i]<<"x^"<<i;
    }
   }
   return outs;
 }

相关内容