结合上一篇关于运算符重载的看:运算符重载
模块化:有理数运算 模块化
设计一个有理数类,要求如下:
有理数有整数类型的分子、分母组成,通过运算符重载,完成有理数的加、减、乘、除运算,运算结果要求为最简分数,即分子分母没有公约数。在主程序中测试类与方法。
tip:
1.可以在运算符重载时利用friend,友元关系让重载的运算符可以访问自定义类中的私有变量。看具体程序需求,不用也可以。
2.二元运算符成员函数重载只能有一个参数或没有参数。故在此时的条件下该题运算符重载时要用friend使其成为友元函数而避免被编译器错误认作成员函数报错。
例子:
friend Rational operator+(const Rational &r1,const Rational &r2);//相加例子
代码:
这段代码是自己输入两个有理数的
若只是测试类与方法,可以把输入句段删除,自定义类中的number1和number2相关值即可
#include<iostream>
#include<cmath>
using namespace std;
class Clc
{
public:
Clc(int s=0,int m=1):son(s),mom(m){}//定义数据输入形式
int son,mom;
friend Clc operator+(const Clc &number1,const Clc &number2);
friend Clc operator-(const Clc &number1,const Clc &number2);
friend Clc operator*(const Clc &number1,const Clc &number2);
friend Clc operator/(const Clc &number1,const Clc &number2);
void easy();//辗转相除化简
void print();
};
Clc operator+(const Clc &number1,const Clc &number2)
{
Clc anser;
anser.son=number1.son*number2.mom+number1.mom*number2.son;
anser.mom=number1.mom*number2.mom;
anser.easy();
return anser;
}
Clc operator-(const Clc &number1,const Clc &number2)
{
Clc anser;
anser.son=number1.son*number2.mom-number1.mom*number2.son;
anser.mom=number1.mom*number2.mom;
anser.easy();
return anser;
}
Clc operator*(const Clc &number1,const Clc &number2)
{
Clc anser;
anser.son=number1.son*number2.son;
anser.mom=number1.mom*number2.mom;
anser.easy();
return anser;
}
Clc operator/(const Clc &number1,const Clc &number2)
{
Clc anser;
anser.son=number1.son*number2.mom;
anser.mom=number1.mom*number2.son;
anser.easy();
return anser;
}
void Clc::easy()
{
int s,m,tmp,gcd;
if(son!=0)//若分子为零,辗转相除会报错,故判断 分子大小
{
s=abs(son);
m=abs(mom);
tmp=m%s;
while(tmp!=0)
{
m=s;
s=tmp;
tmp=m%s;
}
gcd=s;
son=son/gcd;
mom=mom/gcd;
if(mom<0)//如果分母为负数就把'-'放在分子上
{
mom=-mom;
son=-son;
}
}
}
void Clc::print()
{
if(son==0) //分子为零就输出0
cout<<"0"<<endl;
if(son!=0)
{
if(mom!=1)
cout<<son<<"/"<<mom<<endl;
if(mom==1)//分母为1就输出分子,让答案为整数
{
cout<<son<<endl;
}
}
}
int main()
{
int son1,son2,mom1,mom2;
cout<<"按照x(分子)/x(分母)的格式输入有理数~"<<endl;
cout<<"输入第一个有理数吧~" <<endl;
cin>>son1;
cin.ignore(100,'/');
cin>>mom1;
cout<<"输入第二个有理数吧~" <<endl;
cin>>son2;
cin.ignore(100,'/');
cin>>mom2;
if(mom1==0||mom2==0)//排除分母为0
cout<<"分母中有0存在~检查一下"<<endl;
cout<<"---------------------------------------------"<<endl;
Clc anser;
Clc number1(son1,mom1),number2(son2,mom2);
cout<<son1<<"/"<<mom1<<" + "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
anser=number1+number2;
anser.print();
cout<<son1<<"/"<<mom1<<" - "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
anser=number1-number2;
anser.print();
cout<<son1<<"/"<<mom1<<" * "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
anser=number1*number2;
anser.print();
cout<<son1<<"/"<<mom1<<" / "<<son2<<"/"<<mom2<<"的答案为:" <<endl;
anser=number1/number2;
anser.print();
return 0;
}
最典型的输出判断例子:
包含情况:
1.分子为0
2.分母为1