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

目录

  • 前言:
  • 一:题目要求
    • 1.单目运算:
    • 2.双目运算
    • 3.其他
    • 4.main函数
  • 二:实现过程
    • 1.fraction.h的实现
    • 2.fraction.cpp的实现
      • 2.1 GCD求最大公约数
    • 2.2 构造函数
    • 2.3 转换构造函数
    • 2.4 类型转换函数
    • 2.5 转换函数的显示调用
    • 2.6 单目运算符
    • 2.7 双目运算符
    • 2.8 重载输出运算符
    • 3.fraction_main.cpp的实现
  • 四:总结
    • 1.需要注意的地方:
    • 2.可改进之处:

前言:

关于运算符重载的知识点: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类中可以添加符号、值等数据,可能在后续的各种函数实现中会更加方便

你可能感兴趣的:(homework,c++)