C++:完成一个分数(fraction)类

前言:

关于运算符重载的知识点:C++ 运算符重载

一:题目要求

用C++语言完成一个分数类(fraction)的构建,分数类实现的功能(函数)要求如下:

1.单目运算:

Inverse:取负运算(例:+2/3 -> -2/3,或者 -2/3 -> +2/3)、

Reciprocal:求倒数(例:2/3 -> 3/2)、

Reduction:约分(例:6/9 -> 2/3)、

DtoF: 输入是double型转成分数(例:0.25 -> 1/4)、

StoF: 输入是字符串型分数表示转成数值型分数(例“1/4”-> 1/4)

2.双目运算

算术运算(加、减、乘、除、通分)、

关系运算(>、<、>=、<=、==、!=)

3.其他

显示输出

4.main函数

测试上述各项功能,并逐一输出结果到文件中保存。

二:实现过程

1.fraction.h的实现

  • GCD函数:帮助进行约分的实现
  • 两个构造函数:一个是用两个int型分别给分子、分母赋值,且带默认参数,分子默认为0,分母默认为1(分母不能为0);另一个则是用fraction赋值
  • 两个转换构造函数:实现输入double、字符串型转换成分数类
  • 类型转换函数:将分数转换为double型
  • DtoF:double转为fraction的显示调用函数,帮助后面各种运算符的实现
  • FtoD:fraction转为double的显示调用函数,帮助后面各种运算符的实现
  • 单目运算符:写成类成员函数的形式
  • 双目运算符:写成友员函数的形式(因为有左值不是fraction类的情况,如果左值是fraction类,则写作类成员函数/友元函数都可)
  • 重载输出流:实现显示输出

2.fraction.cpp的实现

头文件中函数的实现

2.1 GCD求最大公约数

因为后续的约分函数中是分子分母同时除以最大公约数,因此GCD缺省返回1

2.2 构造函数

2.3 转换构造函数

2.4 类型转换函数

2.5 转换函数的显示调用

帮助后面各种运算符的实现

2.6 单目运算符

Inverse:取负运算

Reciprocal:求倒数

Reduction:约分

DtoF: 输入是double型转成分数

StoF: 输入是字符串型分数表示转成数值型分数

2.7 双目运算符

每个双目运算符都有三种形式:左值为double型,右值为fraction型、左值为fraction型,右值为double型、左值为fraction型、右值为fraction型。

2.8 重载输出运算符

输出为 分子/分母 的形式

3.fraction_main.cpp的实现

测试函数

四:总结

1.需要注意的地方:

  • 分母不能为0
  • 为保护数据,参数最好写成const的形式
  • double类型不能以传统类型比较,注意浮点数的精度,具体精度可以由用户设定,本程序中在main.cpp中设定了全局变量const double eps,可供用户修改
  • 重载运算符时,根据是否需要改变自身的值来决定返回值是 fraction& 还是 fraction
  • 输出到文件后记得关闭文件!!!

2.可改进之处:

  • 单目运算符中的取负、求倒数、约分等由于题目要求的原因写成了函数形式,个人感觉写成重载运算符的方式更好一些
  • main函数中的测试可以写的更多样一些,比如可以由用户输入数据、写一个分数计算器的形式等
  • 错误处理还有许多方面需要完善
  • 双目运算符中fraction除了与double进行各种算术运算,也可以添加其他各种数据类型,原理相差不大,可以自行添加
  • fraction类中可以添加符号、值等数据,可能在后续的各种函数实现中会更加方便
以下是一个简单的 C++ 分数 Fraction 的实现: ```cpp #include <iostream> using namespace std; class Fraction { private: int numerator; // 分子 int denominator; // 分母 public: // 构造函数 Fraction(int n = 0, int d = 1) : numerator(n), denominator(d) {} // 获取分子和分母 int getNumerator() const { return numerator; } int getDenominator() const { return denominator; } // 赋值运算符重载 Fraction& operator=(const Fraction& other) { numerator = other.numerator; denominator = other.denominator; return *this; } // 加法运算符重载 friend Fraction operator+(const Fraction& f1, const Fraction& f2) { int n = f1.numerator * f2.denominator + f2.numerator * f1.denominator; int d = f1.denominator * f2.denominator; return Fraction(n, d); } // 减法运算符重载 friend Fraction operator-(const Fraction& f1, const Fraction& f2) { int n = f1.numerator * f2.denominator - f2.numerator * f1.denominator; int d = f1.denominator * f2.denominator; return Fraction(n, d); } // 乘法运算符重载 friend Fraction operator*(const Fraction& f1, const Fraction& f2) { int n = f1.numerator * f2.numerator; int d = f1.denominator * f2.denominator; return Fraction(n, d); } // 除法运算符重载 friend Fraction operator/(const Fraction& f1, const Fraction& f2) { int n = f1.numerator * f2.denominator; int d = f1.denominator * f2.numerator; return Fraction(n, d); } // 输出运算符重载 friend ostream& operator<<(ostream& os, const Fraction& f) { os << f.numerator << "/" << f.denominator; return os; } // 约分 void reduce() { int gcd = __gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } }; int main() { Fraction f1(1, 2); Fraction f2(3, 4); Fraction f3 = f1 + f2; Fraction f4 = f1 - f2; Fraction f5 = f1 * f2; Fraction f6 = f1 / f2; cout << "f1 = " << f1 << endl; cout << "f2 = " << f2 << endl; cout << "f1 + f2 = " << f3 << endl; cout << "f1 - f2 = " << f4 << endl; cout << "f1 * f2 = " << f5 << endl; cout << "f1 / f2 = " << f6 << endl; } ``` 上述代码定义了一个 Fraction ,其中包含分子和分母两个私有成员变量,以及加、减、乘、除等运算符的重载函数。在主函数中,我们创建两个分数对象 f1 和 f2,并使用重载的运算符进行加、减、乘、除操作。最后,我们通过重载的输出运算符将结果输出到控制台。 注意,在上述代码中,我们还定义了一个 reduce 函数,用于将分数约分为最简形式。在需要输出分数时,我们先调用 reduce 函数将其约分,再输出到控制台,以确保输出的分数是最简形式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值