多项式存储-2

第二次:对于多项式类增加下列功能:

  • 重载“+”运算符,实现两个多项式相加。
  • 重载“-”运算符,实现两个多项式相减。
  • 重载“*”运算符,实现两个多项式相乘。
  • 重载“=”运算符,实现两个多项式的赋值运算。
  • 在main函数中增加相应测试代码。

考虑:把其中某个运算符重载为友元函数。

第一次请参看:blog.sagiri-web.com/wordpress/2019/06/09/%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%AD%98%E5%82%A8-1/

//Polynomial-类定义头文件

#ifndef _POLYNOMIAL_H
#define _POLYNOMIAL_H 

#include <iostream>
 
using namespace std;
class Polynomial{
	public:
		Polynomial(Polynomial &A);
		Polynomial(int count);
		Polynomial();
		void output();
		float get_answer();
		void get_NoOfPolynomial();
		~Polynomial();
		friend Polynomial operator + (Polynomial & A,Polynomial & B); 
		friend Polynomial operator - (Polynomial & A,Polynomial & B); 
		friend Polynomial operator * (Polynomial & A,Polynomial & B); 
		Polynomial& operator = (const Polynomial & B); 
//	private:
		int n;
		float x;
		float *a; 
		static int NoOfPolynomial;
};


#endif

//Polynomial.cpp-类函数定义

#include "Polynomial.h"
int Polynomial::NoOfPolynomial=0;
Polynomial::Polynomial(Polynomial &A){
			n=A.n;
			a=new float[A.n+1];
			for(int i=0;i<=n;i++)
			{
				a[i]=A.a[i];
			}
			NoOfPolynomial++; 
		}

Polynomial::Polynomial(int count){
	n=count;
	a=new float[n+1];
	NoOfPolynomial++; 
}

Polynomial::~Polynomial(){
			delete[] a;
			NoOfPolynomial--;
		}

Polynomial::Polynomial(){
			cout<<"please input n:";
			cin>>n;
			a=new float[n+1];
			for(int i=0;i<=n;i++)
			{
				cout<<"please input a"<<i<<':';
				cin>>a[i];
			}
			NoOfPolynomial++;
		}

void Polynomial::output(){
			cout<<"Polynomial=";
			for(int i=n;i>=0;i--)
			{
				if(i!=n)
					if(a[i]>0)
						cout<<'+';
				if(a[i]==1)
				{
					cout<<"X^"<<i;
				}
				else if(a[i]!=0)
				{
					cout<<a[i]<<"X^"<<i;
				}
			}
			cout<<endl;
		}

float Polynomial::get_answer(){
			float data=1;
			float answer=a[0];
			cout<<"please input x:";
			cin>>x;
			for(int i=1;i<=n;i++)
			{
				for(int j=i;j>0;j--)
				{
					data*=x;
				}
				answer+=data*a[i];
				data=1;
			}
			cout<<answer<<endl;
			return answer;
		}
		
void Polynomial::get_NoOfPolynomial(){
			cout<<NoOfPolynomial<<endl;
		
}

Polynomial operator +(Polynomial & A,Polynomial & B){
	int i=0;
	if(A.n>=B.n)
	{
		Polynomial sum(A);
		for(i=0;i<=B.n;i++)
		{
			sum.a[i]=A.a[i]+B.a[i];
		}
		for(i+=1;i<=A.n;i++)
		{
			sum.a[i]=A.a[i];
		}
		return sum;
	}
	else
	{
		Polynomial sum(B);
		for(i=0;i<=A.n;i++)
		{
			sum.a[i]=A.a[i]+B.a[i];
		}
		for(i+=1;i<=B.n;i++)
		{
			sum.a[i]=B.a[i];
		}
		return sum;
	}
}

Polynomial operator -(Polynomial & A,Polynomial & B){
	int i=0;
	if(A.n>=B.n)
	{
		Polynomial diffrence(A);
		for(i=0;i<=B.n;i++)
		{
			diffrence.a[i]=A.a[i]-B.a[i];
		}
		for(i+=1;i<=A.n;i++)
		{
			diffrence.a[i]=A.a[i];
		}
		return diffrence;
	}
	else
	{
		Polynomial diffrence(B);
		for(i=0;i<=A.n;i++)
		{
			diffrence.a[i]=A.a[i]-B.a[i];
		}
		for(i+=1;i<=B.n;i++)
		{
			diffrence.a[i]=-B.a[i];
		}
		return diffrence;
	}
}

Polynomial operator *(Polynomial & A,Polynomial & B){
//	if(A.n==0&&B.n==00)
//	{
//		Polynomial diffrence(1);
//		diffrence.a[0]=A.n*B.n;
//		return diffrence;
//	}
	Polynomial diffrence(A.n+B.n+1);
	cout<<A.n+B.n+1<<endl;
	for(int i=0;i<=A.n+B.n;i++)
		diffrence.a[i]=0;
	for(int i=0;i<=A.n;i++)
	{
		for(int j=0;j<=B.n;j++)
		{
			diffrence.a[i+j]+=A.a[i]*B.a[j];
//			cout<<"a[0]="<<diffrence.a[0]<<endl;
//			cout<<"a[1]="<<diffrence.a[1]<<endl;
//			cout<<"a[2]="<<diffresnce.a[2]<<endl;
//			cout<<"a[3]="<<diffrence.a[3]<<endl;
//			cout<<"------------------------------\n";
		}
	}
	return diffrence;
}

Polynomial& operator =(const Polynomial & B){
	if(this.n>=B.n)
	{
		for(int i=0;i<=B.n;i++)
		{
			this.a[i]=B.b[i];
		}
		for(int i=B.n+1;i<=this.n;i++)
		{
			this.a[i]=0;
		}
		return;
	}
	else
	{
		delete[] this.a;
		this.a=new float[B.n+1];
		for(int i=0;i<=B.n;i++)
		{
			this.a[i]=B.b[i];
		}
		return;
	}
}

//main.cpp-主函数(测试)

#include <iostream>
#include "Polynomial.h"


int main(){
	int num;
	Polynomial A;
	A.output();
//	A.get_answer();
	Polynomial B;
	B.output();
//	B.get_answer();
	//Polynomial sum(A+B);
	(A*B).output();
	(A*B).get_answer();
//	Polynomial *p;
//	cout<<"please input how many Polynomial you want to save:";
//	cin>>num;
//	p=new Polynomial[num]; 
}

第一次编译声明了友元函数却无法访问私有成员,多次调试后仍未解决,最终重新启动dev后编译通过,推测可能是dev的问题

最初忘记了“=”重载不能写成友元函数,于是不停的在错误中挣扎,查询资料后改写成非静态成员函数但还是出错,经询问后得知声明方式错误,遂改为Polynomial & Polynomial::operator =(Polynomial &B){}

点赞

发表评论