C++ overloaded operators - fractional and polynomial classes

1. Create the RationalNumber (fraction) class

【Problem Description】


Create a class RationalNumber(fraction) with the following capabilities:

  • a) Create a constructor that prevents the denominator of a fraction from being 0. If a fraction is not in reduced form, it can be reduced. Also, it avoids negative denominators.
  • b) For this class, overload the addition, subtraction, multiplication and division operators.
  • c) For this class, overload relationships and equality operators.

【Related solutions】

1. Simplify fractions

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. Create a constructor that prevents the denominator from being 0 and simplifies the fraction when it is not in its simplest form.

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

3. Overload arithmetic operators (addition, subtraction, multiplication, division).

//重载+运算符 
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. Overloaded relational operators (greater than, less than, greater than or equal to, less than or equal to).

//重载>运算符
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. Overload equality operators (!=, ==).

//重载==运算符
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. Test procedures.

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

Complete fraction class code

///
//创建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

2. Create Polynomial class

【Problem Description】


  • Develop class Polynomial. Within the class, a polynomial is represented by an array of terms, each containing a coefficient and an exponent. For example, the term 2x4 has a coefficient of 2 and an exponent of 4. Develop a complete class with appropriate constructors, destructors, and setter and getter functions. In addition, the Polynomial class should provide the ability to overload the following operators:
  • a) Overload the addition operator (+) to add two Polynomials.
  • b)) Overload the subtraction operator (-) to subtract two Polynomials.
  • c) Overload the assignment operator to assign one Polynomial to another.
  • d) Overload the multiplication operator (*) to multiply two Polynomials.
  • e) Overload the addition assignment operator (+=), the method assignment operator (), the subtraction assignment operator (-=), and the multiplication assignment operator (*=).

 【Related solutions】

1.Basic structure of Polynamial class.

//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. Constructor and initialization function.

//构造函数 
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. Overload arithmetic operators (addition, subtraction, multiplication).

//重载+运算符 
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. Overload assignment operators.

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

5. Overload the addition assignment operator (+=), the method assignment operator (), the subtraction assignment operator (-=) and the multiplication assignment operator (*=).

//重载+=运算符
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. Test procedures.

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

Complete Polynomial class code

///
//开发类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

 

 

Guess you like

Origin blog.csdn.net/weixin_74287172/article/details/131385477