[C++]分数类的定义(成员函数、运算符重载)

本文介绍了C++中分数类的设计,包括分数类的成员变量(分子和分母),成员函数(化简、输入输出重载、四则运算和关系运算重载)以及如何通过运算符重载实现分数的加减乘除和比较操作。此外,还展示了化简分数的具体实现和四则运算符如+的重载示例。
摘要由CSDN通过智能技术生成

1 分数类成员和成员函数

1.1 分数类成员

对于分数类,可以将分数拆分为分子和分母两个整型数据进行存储,所以分数类的成员只有两个,一个是分子(numerator),一个是分母(denominator)

1.2 分数类的成员函数

C++将关于类的操作以成员函数的形式在类定义中实现,针对分数的四则运算和关系运算,我们需要通过代码在分数类中逐一实现四则运算和关系运算对应的功能。

而+、-、*、/、>、<、==等符号已经有了定义,且不能对分数类进行操作。所以这些运算符需要通过运算符重载来实现。

除此之外,还有分数常涉及的约分运算,也需要实现。

1.3 分数类的io操作

对于int、double、char等数据类型的io操作已经在iostream中定义,所以通常会用

int x;
cin>>x;
cout<<"hello world!"<<endl;

这样的代码来执行输入和输出。为了能使分数类的输入和输出也能简单地完成,还需要重载">>“和”<<"符号。

1.4 分数类的预定义

// Fraction.cpp
#include <iostream>
#include <iomanip>
using namespace std;

// 分数类
class Fraction
{
public:
	//构造函数,初始化用
	Fraction(int nume = 0, int denom = 1)
		: numerator(nume), denominator(denom) {}

	//化简(使分子分母没有公因子)
	void simplify();

	//输入输出重载
	friend ostream &operator<<(ostream &out, const Fraction &fraction);
	friend istream &operator>>(istream &in, Fraction &fraction);
	
	//加减乘除,结果需要化简
	friend Fraction operator+(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator-(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator*(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator/(const Fraction &leftFraction, const Fraction &rightFraction);

	//关系运算符
	friend bool operator>(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator<(const Fraction &leftFraction, const Fraction &rightFraction);	
	friend bool operator>=(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator<=(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator==(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator!=(const Fraction &leftFraction, const Fraction &rightFraction);
	//取+、-一目运算符
	Fraction operator+();//重载运算符,实现将分数变为正
	Fraction operator-();//重载运算符,实现取将分数变为负

	void setNumerator(int nume);//设置分子的值
	int getNumerator() const;//获取分子

	void setDenominator(int denom);//设置分母的值
	int getDenominator() const;//获取分母

private://成员
	int numerator;	 // 分子
	int denominator; // 分母
};

2 成员函数定义

2.1 化简

void Fraction::simplify() //约分
{
	int nume, deno;
	if (this->numerator == 0)//分子为0的情况
		this->denominator = 1;
	else if (this->numerator * this->denominator > 0)//分子分母同号,即分数为正的情况
	{
		if (this->numerator < 0)//如果分子分母都为负,则消掉负号
			nume = -this->numerator, deno = -this->denominator;
		else
			nume = this->numerator, deno = this->denominator;
		for (int i = (nume < deno ? nume : deno); i >= 1; i--)//化简
		{
			if (nume % i == 0 && deno % i == 0)
				nume /= i, deno /= i;
		}
		this->numerator = nume, this->denominator = deno;
	}
	else//分数为负时
	{
		nume = abs(this->numerator), deno = abs(this->denominator);//先取分子分母的绝对值进行化简操作,再添加负号,完成对负分数的化简操作
		for (int i = (nume < deno ? nume : deno); i >= 1; i--)
		{
			if (nume % i == 0 && deno % i == 0)
			{
				nume /= i;
				deno /= i;
			}
		}
		this->numerator = -nume, this->denominator = deno;
	}
}

2.2 四则运算符的重载(以+为例)

Fraction operator+(const Fraction &leftFraction, const Fraction &rightFraction) //重载运算符+
{
	Fraction sum(leftFraction.numerator * rightFraction.denominator + rightFraction.numerator * leftFraction.denominator, leftFraction.denominator * rightFraction.denominator);//b/a+d/c=(bc+ad)/ac
	sum.simplify();
	return sum;
}

2.3 关系运算符的重载(以>为例)

bool operator>(const Fraction &leftFraction, const Fraction &rightFraction)
{
	if ((float)leftFraction.numerator / (float)leftFraction.denominator > (float)rightFraction.numerator / (float)rightFraction.denominator)//化为小数进行比较
		return true;
	else
		return false;
}

2.4 输入输出的重载(以<<为例)

ostream &operator<<(ostream &out, const Fraction &fraction) //重载输出流
{
	return out << fraction.numerator << "/" << fraction.denominator;
}

完整代码存放在gitee

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

武的阶乘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值