C++ 重载运算符——分数类和多项式类

一、创建RationalNumber(分数)类

【问题描述】


创建类RationalNumber(分数),使其具备下列能力:

  • a)创建一个构造函数,它可以防止分数的分母为0。如果分数不是化简形式,它可以进行化简。而且,它还可以避免分母为负数。
  • b) 针对该类,重载加法、减法、乘法和除法运算符。
  • c)针对该类,重载关系和相等运算符。

【相关的解决方法】

1.化简分数

void RationalNumber::simplification()//化简分数 
{
	if((numerator % denominator)==0)
	{
		fraction = numerator / denominator; 
	} 
	else
	{
		int n=1;
		while( (n<numerator) || (n<denominator) )
		{
			n++;
			if((numerator%n==0) && (denominator%n==0))
			{
				numerator   /= n;
				denominator /=n;
			}
		}
	}
}

2.创建构造函数,可以防止分母为0,并当分数不是最简形式时,它可以进行化简。

RationalNumber::RationalNumber(int numerator_,int denominator_)//构造函数 
{
	if(denominator_>=0)
	{
		denominator=denominator_;
	}
	else
	{
		denominator=1;
	}
	numerator=numerator_;
	//化简
	simplification();
}

3.重载算术运算符(加法,减法,乘法,除法)。

//重载+运算符 
RationalNumber RationalNumber::operator+ (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.denominator + this->denominator*a.numerator;
	t.simplification();  
	return t;
} 
//重载-运算符
RationalNumber RationalNumber::operator- (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.denominator - this->denominator*a.numerator;
	t.simplification();
	return t;
} 
//重载*运算符
RationalNumber RationalNumber::operator* (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.numerator;
	t.simplification();
	return t;
} 
//重载/运算符
RationalNumber RationalNumber::operator/ (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator*a.numerator;
	t.numerator = this->numerator*a.denominator;
	t.simplification();
	return t;
} 

4.重载关系运算符(大于,小于,大于等于,小于等于)。

//重载>运算符
bool RationalNumber::operator> (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m>n;
}
//重载<运算符
bool RationalNumber::operator< (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m<n;
}
//重载>=运算符
bool RationalNumber::operator>= (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m>=n;
}
//重载<=运算符
bool RationalNumber::operator<= (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m<=n;
}

5.重载相等运算符(!= ,==)。

//重载==运算符
bool RationalNumber::operator== (const RationalNumber &a) const
{
	return (this->denominator*a.numerator == this->numerator*a.denominator);
}
//重载!=运算符
bool RationalNumber::operator  !=(const RationalNumber &a) const
{
	return (this->denominator*a.numerator != this->numerator*a.denominator);
}

6.测试程序。

int main()
{	
	int n1,d1;
	int n2,d2;
	
	cout<<"请输入第一个分数(用空格分隔分子分母):"<<endl;
	cin>>n1>>d1;
	RationalNumber p1(n1,d1);
	
	cout<<"请输入第二个分数(用空格分隔分子分母):"<<endl;	
	cin>>n2>>d2;
	RationalNumber p2(n2,d2);
	
	RationalNumber p;
	p=p1+p2;
	p1.Print(); cout<<" + "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1-p2;
	p1.Print(); cout<<" - "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1*p2;
	p1.Print(); cout<<" * "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1/p2;
	p1.Print(); cout<<" / "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p1.Print(); cout<< ( (p1>p2) ? " < " : " >= " ); p2.Print(); cout<<endl;
	
	p1.Print(); cout<< ( (p1==p2) ? " == " : " != " ); p2.Print(); cout<<endl; 
	return 0;	
} 
//end main

完整的分数类代码

///
//创建RationalNumber(分数)类 .cpp
///
#include<iostream>
using namespace std;
class RationalNumber
{
public:
	RationalNumber()
	{
	}
	void simplification();//化简
	void Print() ;
	RationalNumber(int denominator_,int numerator_);
	//算术运算符 
	RationalNumber operator+ (const RationalNumber &a);
	RationalNumber operator- (const RationalNumber &a);
	RationalNumber operator* (const RationalNumber &a);
	RationalNumber operator/ (const RationalNumber &a);
	//关系运算符 
	bool operator> (const RationalNumber&a) const;
	bool operator< (const RationalNumber&a) const;
	bool operator>= (const RationalNumber&a)const;
	bool operator<= (const RationalNumber&a)const;
	//相等运算符 
	bool operator== (const RationalNumber&a)const;
	bool operator!= (const RationalNumber&a)const;
private:
	int numerator;  //分子
	int denominator;//分母 
	int fraction;	//分数 
};

RationalNumber::RationalNumber(int numerator_,int denominator_)//构造函数 
{
	if(denominator_>=0)
	{
		denominator=denominator_;
	}
	else
	{
		denominator=1;
	}
	numerator=numerator_;
	//化简
	simplification();
}

void RationalNumber::simplification()//化简分数 
{
	if((numerator % denominator)==0)
	{
		fraction = numerator / denominator; 
	} 
	else
	{
		int n=1;
		while( (n<numerator) || (n<denominator) )
		{
			n++;
			if((numerator%n==0) && (denominator%n==0))
			{
				numerator   /= n;
				denominator /=n;
			}
		}
	}
}
//end function simplication	

void RationalNumber::Print() 
{
	if(denominator==1)//分母为1,则直接输出分子 
	{
		cout<<numerator;
	}
	else if(numerator%denominator==0)//若可以整除,说明为整数,则直接输出整数 
	{
		cout<<numerator/denominator;
	}
	else
	{
		simplification();
		cout<<numerator<<'/'<<denominator;
	}
}
//end function Print
	
//重载+运算符 
RationalNumber RationalNumber::operator+ (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.denominator + this->denominator*a.numerator;
	t.simplification();  
	return t;
} 
//重载-运算符
RationalNumber RationalNumber::operator- (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.denominator - this->denominator*a.numerator;
	t.simplification();
	return t;
} 
//重载*运算符
RationalNumber RationalNumber::operator* (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator *a.denominator;
	t.numerator = this->numerator*a.numerator;
	t.simplification();
	return t;
} 
//重载/运算符
RationalNumber RationalNumber::operator/ (const RationalNumber &a)
{
	RationalNumber t;
	t.denominator = this->denominator*a.numerator;
	t.numerator = this->numerator*a.denominator;
	t.simplification();
	return t;
} 
//重载>运算符
bool RationalNumber::operator> (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m>n;
}
//重载<运算符
bool RationalNumber::operator< (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m<n;
}
//重载>=运算符
bool RationalNumber::operator>= (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m>=n;
}
//重载<=运算符
bool RationalNumber::operator<= (const RationalNumber &a) const
{
	double m=this->numerator/this->denominator;
	double n=a.numerator/a.denominator;
	return m<=n;
}
//重载==运算符
bool RationalNumber::operator== (const RationalNumber &a) const
{
	return (this->denominator*a.numerator == this->numerator*a.denominator);
}
//重载!=运算符
bool RationalNumber::operator  !=(const RationalNumber &a) const
{
	return (this->denominator*a.numerator != this->numerator*a.denominator);
}
int main()
{	
	int n1,d1;
	int n2,d2;
	
	cout<<"请输入第一个分数(用空格分隔分子分母):"<<endl;
	cin>>n1>>d1;
	RationalNumber p1(n1,d1);
	
	cout<<"请输入第二个分数(用空格分隔分子分母):"<<endl;	
	cin>>n2>>d2;
	RationalNumber p2(n2,d2);
	
	RationalNumber p;
	p=p1+p2;
	p1.Print(); cout<<" + "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1-p2;
	p1.Print(); cout<<" - "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1*p2;
	p1.Print(); cout<<" * "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p=p1/p2;
	p1.Print(); cout<<" / "; p2.Print() ;cout<<" = " ;p.Print() ;cout<<endl;
	
	p1.Print(); cout<< ( (p1>p2) ? " < " : " >= " ); p2.Print(); cout<<endl;
	
	p1.Print(); cout<< ( (p1==p2) ? " == " : " != " ); p2.Print(); cout<<endl; 
	return 0;	
} 
//end main

二、创建Polynomial(多项式)类

【问题描述】


  • 开发类Polynomial(多项式)。在类内部,多项式由的各个项组成的数组表示,每一项包含一个系数和一个指数。例如,项2x4的系数为2,指数为4。开发一个完整的类,包含适当的构造函数、析构函数以及设置和获取函数。此外,Polynomial类还应提供下列重载运算符的能力:
  • a)重载加法运算符(+),对两个Polynomial做加法。
  • b))重载减法运算符(-),对两个Polynomial做减法。
  • c)重载赋值运算符,把一个Polynomial赋给另一个。
  • d)重载乘法运算符(*),对两个Polynomial做乘法。
  • e)重载加法赋值运算符(+=)法赋算符()、减法赋值运算符(-=)和乘法赋值运算符(*=)。

 【相关的解决方法】

1.Polynamial类的基本架构。

//Polynomial类 
class Polynomial
{
public:
	float array[100];
	Polynomial();
	~Polynomial(){};
	void Print();
	void initial();	
	Polynomial operator +  (const Polynomial & a);
	Polynomial operator -  (const Polynomial & a);
	Polynomial operator *  (const Polynomial & a);
	Polynomial &operator =  (const Polynomial & a);
	Polynomial &operator += (const Polynomial & a);
	Polynomial &operator -= (const Polynomial & a);
	Polynomial &operator *= (const Polynomial & a);
};

2.构造函数以及初始化函数。

//构造函数 
Polynomial::Polynomial()
{
	for(int i=0;i<100;i++)
	{
		array[i]=0;
	}
}
//初始化 
void Polynomial::initial()
{
	float coefficient;//系数 
	int index;//指数 
	cout<<"请输入系数和指数(0就会结束) :"<<endl;
	while(1)
	{
		cin>>coefficient;
		cin>>index;
		if(index==0)
		{
			array[index]=coefficient;
		}
		if( index==0 && coefficient==0 )
		{
			break; 
		}
		
		if(index >0 && index < 50)
		{
			array[index] += coefficient;
		}
		else
		{
			cout<<"指数需要>0并且<50!!!"<<endl;
		}
	}
}
//end function initial

3. 重载算术运算符(加法,减法,乘法)。

//重载+运算符 
Polynomial Polynomial::operator+ (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		t.array[i] =this->array[i] + a.array[i];
	}
	return t;
}

//重载-运算符
Polynomial Polynomial::operator- (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		t.array[i] =this->array[i] - a.array[i];
	}
	return t;
}

//重载*运算符
Polynomial Polynomial::operator* (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		for(int j=0;j<50;j++)
		{
			t.array[i+j] =this->array[i]+t.array[j];
		}
	}
	return t;
}

4.重载赋值运算符。

//重载=运算符
Polynomial& Polynomial::operator= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] = a.array[i];
	}
	return *this;
}

5.重载加法赋值运算符(+=)法赋算符()、减法赋值运算符(-=)和乘法赋值运算符(*=)。

//重载+=运算符
Polynomial& Polynomial::operator+= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] += a.array[i];
	}
	return *this;
}

//重载-=运算符
Polynomial& Polynomial::operator-= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] -= a.array[i];
	}
	return *this;
}

//重载*=运算符
Polynomial& Polynomial::operator*= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i]*=a.array[i];
	}
	return *this;
}

6.测试程序。

int main()
{	
	Polynomial p1;
	Polynomial p2;
	Polynomial p;
	int x[10];
	int y[10];
	cout<<"请输入第一个多项式(要用空格隔开)"<<endl;
	p1.initial();
	cout<<"请输入第二个多项式(要用空格隔开)"<<endl;
	p2.initial(); 
	
	cout<<"你输入的两个多项式为:"<<endl;
	p1.Print();
	p2.Print();cout<<endl; 
	
	cout<<"两个多项式的和为 (利用加法运算符):"<<endl;
	p=p1+p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的差为 (利用减法运算符):"<<endl;
	p=p1-p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的乘积为(利用乘法运算符) :"<<endl;
	p=p1*p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的和为(利用加法赋值运算符+=) :"<<endl;
	p1+=p2;
	p1.Print(); 
	
	cout<<"两个多项式的差为(利用减法赋值运算符-=) :"<<endl;
	p1-=p2;
	p1.Print();cout<<endl;
	
	cout<<"两个多项式的乘积为(利用乘法赋值运算符*=) :"<<endl;
	
	p1*=p2;
	p1.Print();cout<<endl;
	 
	cout<<"把第二个多项式赋给第一个多项式的结果为 (利用赋值运算符):"<<endl;
	p1=p2;
	p1.Print();cout<<endl;
	p2.Print();cout<<endl;
	
	return 0;	
} 
//end main

完整的Polynomial类代码

///
//开发类Polynomial(多项式) 
///
#include<iostream>
using namespace std;
//Polynomial类 
class Polynomial
{
public:
	float array[100];
	Polynomial();
	~Polynomial(){};
	void Print();
	void initial();	
	Polynomial operator +  (const Polynomial & a);
	Polynomial operator -  (const Polynomial & a);
	Polynomial operator *  (const Polynomial & a);
	Polynomial &operator =  (const Polynomial & a);
	Polynomial &operator += (const Polynomial & a);
	Polynomial &operator -= (const Polynomial & a);
	Polynomial &operator *= (const Polynomial & a);
};

//构造函数 
Polynomial::Polynomial()
{
	for(int i=0;i<100;i++)
	{
		array[i]=0;
	}
}
//初始化 
void Polynomial::initial()
{
	float coefficient;//系数 
	int index;//指数 
	cout<<"请输入系数和指数(0就会结束) :"<<endl;
	while(1)
	{
		cin>>coefficient;
		cin>>index;
		if(index==0)
		{
			array[index]=coefficient;
		}
		if( index==0 && coefficient==0 )
		{
			break; 
		}
		
		if(index >0 && index < 50)
		{
			array[index] += coefficient;
		}
		else
		{
			cout<<"指数需要>0并且<50!!!"<<endl;
		}
	}
}
//end function initial

void Polynomial::Print()
{
	cout<<"该多项式为 : "<<array[0];
	for(int i=1;i<100;i++)
	{
		if(array[i]>0)
		{
			cout << "+" << array[i] << "*x^" << i;
		}
	}
	cout<<endl;
}
//end function Print

//重载+运算符 
Polynomial Polynomial::operator+ (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		t.array[i] =this->array[i] + a.array[i];
	}
	return t;
}

//重载-运算符
Polynomial Polynomial::operator- (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		t.array[i] =this->array[i] - a.array[i];
	}
	return t;
}

//重载*运算符
Polynomial Polynomial::operator* (const Polynomial&a)  
{
	Polynomial t;
	for(int i=0;i<50;i++)
	{
		for(int j=0;j<50;j++)
		{
			t.array[i+j] =this->array[i]+t.array[j];
		}
	}
	return t;
}

//重载=运算符
Polynomial& Polynomial::operator= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] = a.array[i];
	}
	return *this;
}

//重载+=运算符
Polynomial& Polynomial::operator+= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] += a.array[i];
	}
	return *this;
}

//重载-=运算符
Polynomial& Polynomial::operator-= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i] -= a.array[i];
	}
	return *this;
}

//重载*=运算符
Polynomial& Polynomial::operator*= (const Polynomial&a) 
{
	for(int i=0;i<50;i++)
	{
		this->array[i]*=a.array[i];
	}
	return *this;
}
int main()
{	
	Polynomial p1;
	Polynomial p2;
	Polynomial p;
	int x[10];
	int y[10];
	cout<<"请输入第一个多项式(要用空格隔开)"<<endl;
	p1.initial();
	cout<<"请输入第二个多项式(要用空格隔开)"<<endl;
	p2.initial(); 
	
	cout<<"你输入的两个多项式为:"<<endl;
	p1.Print();
	p2.Print();cout<<endl; 
	
	cout<<"两个多项式的和为 (利用加法运算符):"<<endl;
	p=p1+p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的差为 (利用减法运算符):"<<endl;
	p=p1-p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的乘积为(利用乘法运算符) :"<<endl;
	p=p1*p2;
	p.Print();cout<<endl;
	
	cout<<"两个多项式的和为(利用加法赋值运算符+=) :"<<endl;
	p1+=p2;
	p1.Print(); 
	
	cout<<"两个多项式的差为(利用减法赋值运算符-=) :"<<endl;
	p1-=p2;
	p1.Print();cout<<endl;
	
	cout<<"两个多项式的乘积为(利用乘法赋值运算符*=) :"<<endl;
	
	p1*=p2;
	p1.Print();cout<<endl;
	 
	cout<<"把第二个多项式赋给第一个多项式的结果为 (利用赋值运算符):"<<endl;
	p1=p2;
	p1.Print();cout<<endl;
	p2.Print();cout<<endl;
	
	return 0;	
} 
//end main

 

 

  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值