一、创建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