<小甲鱼>C++实例练习29—对运算符进行重载,实现有理数的加减乘除

本篇博客通过C++实例展示了如何重载运算符,以实现有理数的加、减、乘、除操作。作者参考了B站UP主鱼C_小甲鱼的《C++快速入门》课程,并在VS2017环境下成功调试了代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

参考: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值