C++_Operator Overloading(运算符重载 | 计算有理数的加减乘除)

// OperatorT.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

//运算符的重载 
//计算有理数rational的 + - * /

class Rational
{
public:
	Rational();//构造函数初始化
	Rational(int numer, int denom);
	Rational operator +(Rational  d);// 
	Rational operator -(Rational  d);
	Rational operator *(Rational  d);
	Rational operator /(Rational  d);

	void print();
private:
	friend std::ostream &operator<<(std::ostream &os, Rational f);
	//友元函数用friend声明,可以访问类中的私有变量

	void normalize();//对分数简化处理
	int nu;
	int de;
};
Rational::Rational()
{
	nu = 0;
	de = 0;
}
Rational::Rational(int numer, int denom)
{
	nu = numer;
	de = denom;
	normalize();//简化
}
Rational Rational::operator +(Rational  d)
{
	Rational r;
	r.nu = nu *d.de + de*d.nu;
	r.de = de * d.de;
	return r;
}

Rational Rational::operator-(Rational  d)
{
	//Rational r;
	//r.nu = nu *d.de - de*d.nu;
	//r.de = de * d.de;
	//return r;

	d.nu = -d.nu;
	return operator +(d);
}

Rational Rational::operator*(Rational  d)
{
	Rational r;
	r.nu = nu * d.nu;
	r.de = de * d.de;
	return r;
}
Rational Rational::operator/(Rational   d)
{
	//Rational r;
	//r.nu = nu * d.de;
	//r.de = de * d.nu;
	//return r;

	int temp;
	temp = d.nu;
	d.nu = d.de;
	d.de = temp;
	return operator*(d);
}
void Rational::print()
{
	normalize();
	if (nu%de == 0)
	{
		std::cout << nu / de << std::endl; //<< "\n" << "\n"
	}
	else
	{
		std::cout << nu << "/" << de  << std::endl;
	}
}
//对分数的简化处理
//1.分母为正
//2.欧几里得算法对分数进行化简
void Rational::normalize()
{
	if (de < 0)//分母小于0,分子分母都取负
	{
		nu = -nu;
		de = -de;
	}

	int a = abs(nu);
	int b = abs(de);
	while (b > 0)   //好!
	{
		int t = a%b;
		a = b;//被除数变除数,余数变被除数...循环..直到余数为0
		b = t;
	}
	nu /= a;
	de /= a;
}
//使用前先声明 // 对 << 进行重载
std::ostream & operator<<(std::ostream & os, Rational f);
int main()
{
	Rational r1(-3, 5), r2(-6, -9);
	Rational r3, r4, r5, r6;

	r3 = r1 + r2;
	r4 = r1 - r2;
	r5 = r1 * r2;
	r6 = r1 / r2;

	std::cout << "Src: "<<"\n";
	std::cout << "r1= "; r1.print();
	std::cout << "r2= "; r2.print();

	std::cout << "Result: "<<"\n";
	//std::cout << "r3= "; r3.print();
	//std::cout << "r4= "; r4.print();
	//std::cout << "r5= "; r5.print();
	//std::cout << "r6= "; r6.print();//

	//对<<重载 应用
	std::cout <<"("<< r1 <<")"<< " + " <<"("<< r2  <<")"<< " = " << r1 + r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " - " << "("<< r2  <<")"<< " = " << r1 - r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " * " << "("<< r2  <<")"<< " = " << r1 * r2 << std::endl;
	std::cout <<"("<< r1 <<")"<< " / " << "("<< r2  <<")" << " = " << r1 / r2 << std::endl;

	system("pause");
	return 0;
}
// 对 << 进行重载的实现
std::ostream & operator<<(std::ostream & os, Rational f)
{
	Rational f1 = f;
	f1.normalize();
	os << f1.nu << "/" << f1.de;
	return os;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊鸿一博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值