前言:
参考:B站UP主鱼C_小甲鱼<C++快速入门>
代码调试平台:VS2017,调试成功。
问题描述:
问题描述:对运算符进行重载,实现有理数的加减乘除
代码实现:
#include <iostream>
using namespace std;
class Rational
{
public:
Rational(int num, int denom);
Rational operator+ (Rational rhs);
Rational operator- (Rational rhs);
Rational operator* (Rational rhs);
Rational operator/ (Rational rhs);
void print();
private:
void normalize(); //实现对分数的简化
int numerator; //分子
int denominator; //分母
friend ostream& operator<<(ostream& os, Rational f); //重载<<操作符函数
};
Rational::Rational(int num, int denom)
{
numerator = num;
denominator = denom;
normalize();
}
//normalize()对分数进行简化操作包括:
//1、只允许分子为负数,如果分母为负数挪到分子部分;
//2、利用欧几里算法(辗转求余原理)将分数进行简化。
void Rational::normalize()
{
//确保分母为正
if (denominator < 0)
{
numerator = -numerator;
denominator = -denominator;
}
//欧几里算法
int a = abs(numerator); //求绝对值
int b = abs(denominator);
//求出最大公约数
while (b > 0)
{
int t = a % b;
a = b;
b = t;
}
//分子分母分别除以最大公约数得到嘴贱化分数
numerator /= a;
denominator /= a;
}
//加法: b/a+d/c=(bc+ad)/ac
Rational Rational::operator+ (Rational rhs)
{
int a = denominator;
int b = numerator;
int c = rhs.denominator;
int d = rhs.numerator;
int e = b * c + a * d;
int f = a * c;
return Rational(e, f);
}
//减法:b/a-d/c=(bc-ad)/ac
Rational Rational::operator- (Rational rhs)
{
rhs.numerator = -rhs.numerator;
return operator+(rhs);
}
//乘法:(b/a)*(d/c)=bd/ac
Rational Rational::operator* (Rational rhs)
{
int a = denominator;
int b = numerator;
int c = rhs.denominator;
int d = rhs.numerator;
int e = b * d;
int f = a * c;
return Rational(e, f);
}
//除法:(b/a)/(d/c)=bc/ad
Rational Rational::operator/ (Rational rhs)
{
int t = rhs.numerator;
rhs.numerator = rhs.denominator;
rhs.denominator = t;
return operator*(rhs);
}
void Rational::print()
{
if (numerator%denominator == 0)
{
cout << numerator / denominator;
}
else
{
cout << numerator << "/" << denominator;
}
}
ostream& operator<<(ostream& os, Rational f);
int main()
{
Rational f1(2, 16), f2(7, 8);
/*
Rational res1 = f1 + f2;
f1.print();
cout << "+";
f2.print();
cout << "=";
res1.print();
cout << "\n";
Rational res2 = f1 - f2;
f1.print();
cout << "-";
f2.print();
cout << "=";
res2.print();
cout << "\n";
Rational res3 = f1 * f2;
f1.print();
cout << "*";
f2.print();
cout << "=";
res3.print();
cout << "\n";
Rational res4 = f1 / f2;
f1.print();
cout << "/";
f2.print();
cout << "=";
res4.print();
cout << "\n";
*/
//调用重载之后的<<操作符
cout << f1 << "+" << f2 << "=" << (f1 + f2) << "\n";
cout << f1 << "-" << f2 << "=" << (f1 - f2) << "\n";
cout << f1 << "*" << f2 << "=" << (f1 * f2) << "\n";
cout << f1 << "/" << f2 << "=" << (f1 / f2) << "\n";
return 0;
}
ostream& operator<<(ostream& os, Rational f)
{
os << f.numerator << "/" << f.denominator;
return os;
}