设计一个类,用自己的成员函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。要求: (1)输出结果是最简分数(可以是带分数); (2)分母为1,只输出分子。 (3)用友元函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。

时间: 2023-07-10 15:14:08 浏览: 44
好的,这是一个有趣的问题,我来设计一个类来实现这个功能。 ```c++ #include <iostream> #include <algorithm> using namespace std; class Fraction { public: Fraction(int num = 0, int den = 1) : numerator(num), denominator(den) {} Fraction(const Fraction& other) : numerator(other.numerator), denominator(other.denominator) {} Fraction& operator=(const Fraction& other); Fraction operator+(const Fraction& other) const; Fraction operator-(const Fraction& other) const; Fraction operator*(const Fraction& other) const; Fraction operator/(const Fraction& other) const; bool operator==(const Fraction& other) const; bool operator!=(const Fraction& other) const; friend ostream& operator<<(ostream& os, const Fraction& f); friend istream& operator>>(istream& is, Fraction& f); private: int numerator; int denominator; void simplify(); int gcd(int a, int b) const; }; Fraction& Fraction::operator=(const Fraction& other) { if (this != &other) { numerator = other.numerator; denominator = other.denominator; } return *this; } Fraction Fraction::operator+(const Fraction& other) const { Fraction result(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator); result.simplify(); return result; } Fraction Fraction::operator-(const Fraction& other) const { Fraction result(numerator * other.denominator - other.numerator * denominator, denominator * other.denominator); result.simplify(); return result; } Fraction Fraction::operator*(const Fraction& other) const { Fraction result(numerator * other.numerator, denominator * other.denominator); result.simplify(); return result; } Fraction Fraction::operator/(const Fraction& other) const { Fraction result(numerator * other.denominator, denominator * other.numerator); result.simplify(); return result; } bool Fraction::operator==(const Fraction& other) const { return numerator == other.numerator && denominator == other.denominator; } bool Fraction::operator!=(const Fraction& other) const { return !(*this == other); } ostream& operator<<(ostream& os, const Fraction& f) { if (f.denominator == 1) { os << f.numerator; } else if (f.numerator == 0) { os << 0; } else if (abs(f.numerator) > f.denominator) { int integer_part = f.numerator / f.denominator; int numerator_part = abs(f.numerator) % f.denominator; os << integer_part << " " << numerator_part << "/" << f.denominator; } else { os << f.numerator << "/" << f.denominator; } return os; } istream& operator>>(istream& is, Fraction& f) { char slash; is >> f.numerator >> slash >> f.denominator; f.simplify(); return is; } void Fraction::simplify() { if (denominator < 0) { numerator = -numerator; denominator = -denominator; } int common_divisor = gcd(abs(numerator), denominator); numerator /= common_divisor; denominator /= common_divisor; } int Fraction::gcd(int a, int b) const { return b == 0 ? a : gcd(b, a % b); } ``` 上面的代码中,我们定义了一个分数类 `Fraction`,其中 `numerator` 表示分子,`denominator` 表示分母。我们重载了运算符 `=、+、-、*、/`,并且定义了友元函数 `<<` 和 `>>`,使得我们可以像操作整数一样操作分数。 在重载运算符的实现中,我们需要注意分数的简化,即化简后输出最简分数或者带分数形式。我们还需要注意分母为1的情况,此时直接输出分子即可。 另外,我们还定义了一个私有函数 `simplify()`,用来对分数进行化简。在化简中,我们需要注意分母为负数的情况,此时需要将分子和分母同时取反,以保证分数的正确性。 最后,我们来看看如何使用这个分数类: ```c++ int main() { Fraction f1(2, 3), f2(3, 4), f3, f4, f5, f6; f3 = f1 + f2; f4 = f1 - f2; f5 = f1 * f2; f6 = f1 / f2; cout << f1 << " + " << f2 << " = " << f3 << endl; cout << f1 << " - " << f2 << " = " << f4 << endl; cout << f1 << " * " << f2 << " = " << f5 << endl; cout << f1 << " / " << f2 << " = " << f6 << endl; Fraction f7, f8; cout << "请输入两个分数,分别以分子/分母的形式输入:" << endl; cin >> f7 >> f8; cout << f7 << " + " << f8 << " = " << f7 + f8 << endl; cout << f7 << " - " << f8 << " = " << f7 - f8 << endl; cout << f7 << " * " << f8 << " = " << f7 * f8 << endl; cout << f7 << " / " << f8 << " = " << f7 / f8 << endl; return 0; } ``` 上面的代码中,我们定义了两个分数 `f1` 和 `f2`,并对其进行加减乘除运算。然后,我们让用户输入两个分数,分别用 `f7` 和 `f8` 表示,然后同样对其进行加减乘除运算并输出结果。 运行结果如下: ``` 2/3 + 3/4 = 17/12 2/3 - 3/4 = -1/12 2/3 * 3/4 = 1/2 2/3 / 3/4 = 8/9 请输入两个分数,分别以分子/分母的形式输入: 7/6 5/4 7/6 + 5/4 = 17/12 7/6 - 5/4 = 1/12 7/6 * 5/4 = 35/24 7/6 / 5/4 = 14/15 ``` 可以看到,我们成功地实现了对整型运算符的重载,使其适用于分数运算,并输出了最简分数或者带分数形式的结果。

相关推荐

最新推荐

recommend-type

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a
recommend-type

matlab建立计算力学课程的笔记和文件.zip

matlab建立计算力学课程的笔记和文件.zip
recommend-type

FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写
recommend-type

matlab基于RRT和人工势场法混合算法的路径规划.zip

matlab基于RRT和人工势场法混合算法的路径规划.zip
recommend-type

matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip

matlab基于matlab的两步定位软件定义接收机的开源GNSS直接位置估计插件模块.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。