面向对象程序设计实验——编写Rational类

  • 实验任务与要求
  • 代码解析
    • 定义一个命名空间Numeric
    • Rational类的成员变量
    • 编写默认构造函数
    • 编写复制构造函数
    • 编写赋值操作=
    • 分数化简
    • 编写友元函数
    • 编写重载函数
    • main函数测试
  • 测试截图
  • 写在最后

实验任务与要求

编写一个表示有理数的类Rational。(有理数就是分数,包含分子与分母,均为整数)。要求:1)定义一个命名空间Numeric,在该空间中定义类Rational;2)编写默认构造函数,构造一个有理数0;3)编写带参数列表的构造函数Rational (int, int ),要求使用初始化列表;4)编写复制构造函数;5)编写赋值操作=;6)编写四个友元函数add、sub、mul、div,对两个Rational对象表示的有理数分别进行相加、相减、相乘、相除运算;(例:Rational x(1,2),y(1,3);分别表示有理数,则Rational z = add(x,y);之后,z表示)7)重载上述四个函数,实现有理数与整数的相加、相减、相乘、相除运算;(例:Rational x(1,2);表示有理数,则        Rational z = add(x,1),之后,z表示)8)编写成员函数getValue(),返回用浮点数表示的有理数,要求写成常函数。(例:Rational x(1,2);表示有理数,则x.getValue()返回0.5)9)编写友元函数lessThan,比较两个有理数的大小,返回bool类型。(例:Rational x(1,2),y(1,3);则bool b = lessThan(x,y);之后b为false)10)编写main函数,使用using namespace Numeric;来访问Numeric::Rational类。编写代码测试Rational类。11)在main函数中,随机生成10个有理数,形成一个有理数数组,并利用lessThan函数以及任意一种排序算法,对这10个有理数进行从小到大排序,输出排序结果。

代码解析

定义一个命名空间Numeric

下面展示代码片段 Numeric

// 命名空间内定义类及类的成员函数
// 本文简化设计,将函数体一同编写进类中
// 为代码清晰,可自定义头文件
namespace Numeric {/*表示有理数的类*/class Rational {public:// 默认构造函数,构造一个有理数0Rational() :numerator(0), denominator(1) {}// 带参数列表的构造函数,要求使用初始化列表Rational(int _a, int _b) :numerator(_a), denominator(_b) {}// 复制构造函数Rational(const Rational& rational) {}// 编写赋值操作 = Rational& operator=(const Rational& rational) {}private:int numerator;  // 分子int denominator;  // 分母public:// 分数化简,参数为一个Rational对象Rational& fractionSimplify() {}// 有理数相加,参数为两个Rational对象friend Rational add(const Rational& x, const Rational& y) {}// 重载函数,实现有理数与整数的相加friend Rational add(const Rational& x, const int y) {}// 有理数相减,参数为两个Rational对象,friend Rational sub(const Rational& x, const Rational& y) {}// 重载函数,实现有理数与整数的相减friend Rational sub(const Rational& x, const int y) {}// 有理数相乘,参数为两个Rational对象,friend Rational mul(const Rational& x, const Rational& y) {}// 重载函数,实现有理数与整数的相乘friend Rational mul(const Rational& x, const int y) {}// 有理数相除,参数为两个Rational对象,friend Rational div(const Rational& x, const Rational& y) {}// 重载函数,实现有理数与整数的相除friend Rational div(const Rational& x, const int y) {}// 返回用浮点数表示的有理数,参数为两个Rational对象,要求写成常函数float getValue()const {}// 比较两个有理数的大小,参数为两个Rational对象,返回bool类型friend bool lessThan(const Rational x, const Rational y) {}};
}

Rational类的成员变量

下面展示代码片段 。

private:int numerator;  // 分子int denominator;  // 分母

编写默认构造函数

下面展示代码片段 Rational()
直接初始化,为避免除零异常,分母初始化为1

// 默认构造函数,构造一个有理数0
Rational() :numerator(0), denominator(1) {}
// 带参数列表的构造函数,要求使用初始化列表
Rational(int _a, int _b) :numerator(_a), denominator(_b) {}

编写复制构造函数

下面展示代码片段。

Rational(const Rational& rational) {numerator = rational.numerator;denominator = rational.denominator;
}

编写赋值操作=

下面展示代码片段。

Rational& operator=(const Rational& rational) {if (this != &rational) {numerator = rational.numerator;denominator = rational.denominator;}return *this;
}

分数化简

用于简化后续计算。

下面展示代码片段。

Rational& fractionSimplify() {int up, under;if (this->getValue() > 1) {  // 假分数up = this->denominator;under = this->numerator;}else {up = this->numerator;under = this->denominator;}while (under % up != 0) {int temp = under;under = up;up = temp % up;}this->numerator /= up;this->denominator /= up;return *this;
}

编写友元函数

以add为例。
下面展示代码片段 add

friend Rational add(const Rational& x, const Rational& y) {int _numerator = x.numerator * y.denominator + y.numerator * x.denominator;int _denominator = x.denominator * y.denominator;return Rational(_numerator, _denominator).fractionSimplify();
}

编写重载函数

以add为例。
下面展示代码片段 add

friend Rational add(const Rational& x, const int y) {int _numerator = x.numerator + y * x.denominator;int _denominator = x.denominator;return Rational(_numerator, _denominator).fractionSimplify();
}

main函数测试

下面展示代码。

int main(void) {using namespace Numeric;std::cout << name << " " << ID << std::endl;int numY = 2;Rational testX(1, 2);Rational testY(3, 4);Rational testOut;std::cout << "两个有理数算数运算:" << testX.getValue() << " , " << testY.getValue() << std::endl;testOut = add(testX, testY);std::cout << "Add reasult = " << testOut.getValue() << std::endl;testOut = sub(testX, testY);std::cout << "Sub reasult = " << testOut.getValue() << std::endl;testOut = div(testX, testY);std::cout << "Div reasult = " << testOut.getValue() << std::endl;testOut = mul(testX, testY);std::cout << "Mul reasult = " << testOut.getValue() << std::endl;std::cout << "有理数与常数算数运算:" << testX.getValue() << " , " << numY << std::endl;testOut = add(testX, numY);std::cout << "Add reasult = " << testOut.getValue() << std::endl;testOut = sub(testX, numY);std::cout << "Sub reasult = " << testOut.getValue() << std::endl;testOut = div(testX, numY);std::cout << "Div reasult = " << testOut.getValue() << std::endl;testOut = mul(testX, numY);std::cout << "Mul reasult = " << testOut.getValue() << std::endl;std::srand(int(time(0)));std::vector<Rational> rationals;for (int i = 0; i < 10; ++i) {  // 随机生成10个有理数,形成一个有理数数组int _numerator = (int)std::rand() % 10 + 1;int _denominato = (int)std::rand() % 10 + 1;Rational gener(_numerator, _denominato);rationals.push_back(gener);}for (unsigned int i = 0; i < rationals.size() - 1; ++i) {  // 冒泡排序,升序for (unsigned int j = 0; j < rationals.size() - 1 - i; ++j)if (!lessThan(rationals[j], rationals[j + 1])) {Rational temp = rationals[j];rationals[j] = rationals[j + 1];rationals[j + 1] = temp;}}std::cout << "排序结果:" << std::endl;for (unsigned int i = 0; i < rationals.size(); ++i) {  // 输出排序结果std::cout << rationals[i].getValue() << std::ends;}return 0;
}

测试截图

写在最后

本文作者刚开始学C++,如有问题或不对之处,欢迎指摘
代码仅供参考,问题实现范式不唯一,希望能给读者带来启发

面向对象程序设计实验——编写Rational类相关推荐

  1. java红牛农场答案_Java面向对象程序设计实验指导与习题解答(21世纪高等学校计算机专业实用规划教材)...

    导语 <Java面向对象程序设计实验指导与习题解答>是<Java面向对象程序设计>(作者耿祥义,清华大学出版社出版,2010)的配套实验指导和习题解答,目的是通过一系列实验练习 ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  4. java面向对象实验结论及心得_20162305 实验二 Java面向对象程序设计 实验报告

    20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...

  5. 红牛农场java代码_Java面向对象程序设计实验指导模板代码(171页)-原创力文档...

    PAGE 1 PAGE 24 Java面向对象程序设计实验指导代码 内容简介 本书是<Java面向对象程序设计>的配套实验指导和习题解答.本书的第一部分为16次上机实践的内容,每次上机实践 ...

  6. 面向对象程序设计实验 如何使用JTable来展示数据

    目录 1.绘制出带滚动条的JTable表格并填充数据 2.创建一个JPanel用来显示在表格中选中的数据 3.使在选中的表格中的一行下添加新的一行 4.Java代码部分 5.Github仓库地址 1. ...

  7. 面向对象程序设计实验 - 实验2 类和对象:类的构建

    实验二 类和对象--类的构建 目录 实验二 类和对象--类的构建 2.1 实验目的 2.2 实验内容 2.2.1程序阅读 2.2.2 程序设计 2.3思考题 2.1 实验目的 1.类的定义: 2.类对 ...

  8. C++面向对象程序设计实验题:有理数类(分数类)设计

    C++实验题:有理数类(分数类)设计 问题描述: 根据main测试函数设计有理数类CRational,数据成员由分子.分母组成(都是整型,应表示成最简形式),完成分数显示(如用户输入的分子是4,分母是 ...

  9. 头歌 C++ 面向对象程序设计 实验四 公有继承 —— 学生信息类

    设计一个学生信息类 一.任务描述 本关任务:声明并定义一个学生信息类. 二.相关知识 为了完成本关任务,你需要掌握类的声明和定义. 类 在现实世界中,经常有属于同一类的对象.例如,你的自行车只是世界上 ...

最新文章

  1. Windows内存管理和linux内存管理
  2. python用jieba进行分词并可视化
  3. 1_HDFS理论及安装部署
  4. Java_JDBC_MySql
  5. shell读取excel_[PHP 开源类库]simple-Excel — 兼具优雅与性能的Excel和CSV文件读写工具...
  6. BZOJ5379: Tree
  7. 全局容器的创建和使用---单件模式和IOC的容器的应用
  8. Gprmax 三维地质雷达建模及在 paraview 中的可视化
  9. Shell:export命令
  10. vue - (v-pre、v-cloak、v-once)
  11. 织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上绝对路径教程...
  12. 13.GitLab api
  13. 计算机图形学学习记录(一) —— DDA画线算法
  14. CAD中怎么将Z轴归零?CADZ轴归零教程
  15. How to Rerun Failed Tests in JUnit?
  16. Ubuntu教程,让你成为Ubuntu高手!
  17. 消防应急照明和疏散指示系统——集中控制型系统的设计与应用
  18. Apache Hadoop集群设置示例(带虚拟机)
  19. 游戏微服务架构设计:棋牌游戏
  20. 一分钟告诉你究竟DevOps是什么鬼?

热门文章

  1. st58服务器装系统,微pe硬盘安装系统教程
  2. 崩坏三8月20号服务器维修,崩坏3手游8月20日更新了什么
  3. mailgun_用Mailgun邮寄出去!
  4. 如何收集SparkSteaming运行日志实时进入kafka中
  5. Revit API 2018调试闪退
  6. 数据防泄密(DLP)系统
  7. 腾讯全民wifi驱动 v1.1.923 官方版
  8. Python 课程学习笔记(5)列表 [ ] lst
  9. 【日语】编程相关日语词汇
  10. 自己的第一个windows程序