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