1. */
  2. * Copyright (c) 2016,烟台大学计算机与控制工程学院
  3. * All rights reserved.
  4. * 文件名:text.cpp
  5. * 作者:常轩
  6. * 微信公众号:Worldhello
  7. * 完成日期:2016525
  8. * 版本号:V1.0
  9. * 问题描述:分数类的重载
  10. * 程序输入:无
  11. * 程序输出:见运行结果
  12. */
  13. #include<iostream>
  14. #include<Cmath>
  15. using namespace std;
  16.  
  17. class CFraction{
  18. private:
  19. int nume; //分子
  20. int deno; //分母
  21. public:
  22. CFraction(int nu=0,int de=0);
  23. CFraction operator+(const CFraction &n); //分数相加
  24. CFraction operator-(const CFraction &n); //分数相减
  25. CFraction operator*(const CFraction &n); //分数相乘
  26. CFraction operator/(const CFraction &n); //分数相除
  27. void display(); //输出分数
  28. void simplify(); //分数化简
  29. bool operator>(const CFraction &c);
  30. bool operator<(const CFraction &c);
  31. bool operator==(const CFraction &c);
  32. bool operator!=(const CFraction &c);
  33. bool operator>=(const CFraction &c);
  34. bool operator<=(const CFraction &c);
  35. };
  36.  
  37. CFraction::CFraction(int nu,int de) //构造函数
  38. {
  39. nume=nu;
  40. deno=de;
  41. }
  42. void CFraction::display() //输出函数
  43. {
  44. cout<<nume<<"/"<<deno<<endl;
  45. }
  46. void CFraction::simplify() //分数化简
  47. {
  48. int m,n,r;
  49. n=fabs(deno);
  50. m=fabs(nume);
  51. if(nume==0)
  52. deno=0;
  53. else{
  54. while(r=m%n) // 求m,n的最大公约数
  55. {
  56. m=n;
  57. n=r;
  58. }
  59. deno/=n; // 化简
  60. nume/=n;
  61. if (deno<0) // 将分母转化为正数
  62. {
  63. deno=-deno;
  64. nume=-nume;
  65. }
  66. }
  67. }
  68. CFraction CFraction::operator +(const CFraction &n) //定义分数相加
  69. {
  70. CFraction t;
  71. t.deno=this->deno*n.deno;
  72. t.nume=this->nume*n.deno+n.nume*this->deno;
  73. t.simplify();//化简
  74. return t;
  75. }
  76. CFraction CFraction::operator -(const CFraction &n) //定义分数相减
  77. {
  78. CFraction t;
  79. t.deno=this->deno*n.deno;
  80. t.nume=this->nume*n.deno-n.nume*this->deno;
  81. t.simplify();//化简
  82. return t;
  83. }
  84. CFraction CFraction::operator *(const CFraction &n) //定义分数相乘
  85. {
  86. CFraction t;
  87. t.deno=n.deno*this->deno;
  88. t.nume=n.nume*this->nume;
  89. t.simplify();//化简
  90. return t;
  91. }
  92. CFraction CFraction::operator /(const CFraction &n) //定义分数相除
  93. {
  94. CFraction t;
  95. t.deno=n.nume*this->deno;
  96. t.nume=n.deno*this->nume;
  97. t.simplify();//化简
  98. return t;
  99. }
  100.  
  101. //比较运算符重载
  102. bool CFraction::operator >(const CFraction &c) // >重载
  103. {
  104. int this_nume,c_nume,common_deno;
  105. this_nume=nume*c.deno; // 计算分数通分后的分子,同分母为deno*c.deno
  106. c_nume=c.nume*deno;
  107. common_deno=deno*c.deno;
  108. if ((this_nume-c_nume)*common_deno>0) return true;
  109. return false;
  110. }
  111. bool CFraction::operator<(const CFraction &c)
  112. {
  113. int this_nume,c_nume,common_deno;
  114. this_nume=nume*c.deno;
  115. c_nume=c.nume*deno;
  116. common_deno=deno*c.deno;
  117. if ((this_nume-c_nume)*common_deno<0) return true;
  118. return false;
  119. }
  120.  
  121. // 分数比较大小
  122. bool CFraction::operator==(const CFraction &c)
  123. {
  124. if (*this!=c) return false;
  125. return true;
  126. }
  127.  
  128. // 分数比较大小
  129. bool CFraction::operator!=(const CFraction &c)
  130. {
  131. if (*this>c || *this<c) return true;
  132. return false;
  133. }
  134.  
  135. // 分数比较大小
  136. bool CFraction::operator>=(const CFraction &c)
  137. {
  138. if (*this<c) return false;
  139. return true;
  140. }
  141.  
  142. // 分数比较大小
  143. bool CFraction::operator<=(const CFraction &c)
  144. {
  145. if (*this>c) return false;
  146. return true;
  147. }
  148.  
  149. int main()
  150. {
  151. CFraction a(2,3),b(1,3);
  152. CFraction c;
  153. c=a+b;
  154. cout<<"c=";
  155. c.display();
  156. c=a*b;
  157. cout<<"c=";
  158. c.display();
  159. c=a-b;
  160. cout<<"c=";
  161. c.display();
  162. c=a/b;
  163. cout<<"c=";
  164. c.display();
  165. if(a>b)
  166. cout<<"a>b";
  167.  
  168. return 0;
  169. }

运行结果:

心得:

这次感觉有必要写一下了,这个程序一开始思路错了,化简过程弄得复杂了,最终无路可走后看了一下参考答案后豁然开朗

附原始代码:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class CFraction{
  5. private:
  6. int nume; //分子
  7. int deno; //分母
  8. public:
  9. CFraction(int nu=0,int de=0);
  10. CFraction operator+(const CFraction &n);
  11. CFraction operator%(const CFraction &n);
  12. void display();
  13. friend int gcd(CFraction &,CFraction &); //构造函数及运算符重载的函数声明
  14. friend int Zxg(CFraction &,CFraction &);
  15. };
  16. CFraction CFraction::operator %(CFraction &n)
  17. {
  18. int fenmu;
  19. fenmu=this->deno%n.deno;
  20. CFraction t(this->nume,fenmu);
  21. return t;
  22. }
  23. int gcd(CFraction &a,CFraction &b)
  24. {
  25. if(a.deno<=b.deno)
  26. {
  27. if(b.deno%a.deno==0)
  28. return b.deno;
  29. else
  30. return(gcd(a,b%a));
  31. }
  32. else
  33. return gcd(b,a);
  34. }
  35. int Zxg(CFraction a,CFraction b)
  36. {
  37. return a.deno*b.deno/gcd(a.deno,b.deno);
  38. }
  39. CFraction::CFraction(int nu,int de)
  40. {
  41. nume=nu;
  42. deno=de;
  43. }
  44. CFraction CFraction::operator +(CFraction &n)
  45. {
  46. int fenzi,fenmu;int l;
  47. if(this.deno==n.deno)
  48. {
  49. fenzi=n.nume+this->nume;
  50. fenmu=this->deno;
  51. }
  52. else
  53. {
  54. fenmu=Zxg(this,n.deno);
  55. fenzi=fenmu/n.deno*n.nume+fenmu/this->deno*this->nume;
  56. }
  57.  
  58. CFraction t(fenzi,fenmu);
  59. return t;
  60. }
  61. void CFraction::display()
  62. {
  63. cout<<nume<<"/"<<deno;
  64. }
  65. int main()
  66. {
  67. CFraction a(1,3),b(1,3);
  68. CFraction c;
  69. c=a+b;
  70. c.display();
  71. return 0;
  72. }

可以看到一开始的思路比较混乱,想到哪就写哪,最终导致补不上了原来的大洞,以后写的时候要进行整体考虑后再下手也不迟。另外this指针好用也不能乱用,辨别清楚什么时候该用局部变量什么时候该用全局变量,写着这个程序实在挺累的,实现完每一个重载函数后也不想补全测试函数了,不过重载的应该都对了,明天接着做

C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)的更多相关文章

  1. C++走向远洋——55(项目一3、分数类的重载、>>

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++走向远洋——54(项目一2、分数类的重载、取倒数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. C++走向远洋——(项目二、存储班长信息的学生类、派生)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. 连分数(分数类模板) uva6875

    //连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...

  5. OC2_分数类

    // // Fraction.h // OC2_分数类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhangxu ...

  6. 第十七周oj刷题——Problem B: 分数类的四则运算【C++】

    Description 编写分数类Fraction,实现两个分数的加.减.乘和除四则运算.主函数已给定. Input 每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束. Outpu ...

  7. Problem F: 分数类的类型转换

    Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作:   1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...

  8. Problem E: 分数类的输出

    Problem E: 分数类的输出 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2699  Solved: 1227[Submit][Status][ ...

  9. java的分数类

    概述 分数类在算法中非常重要, 而在java中不那么重要,java基础类库提供 了biginteger了,提供类似方式, package 组合数学; public class Fraction { p ...

随机推荐

  1. 吴裕雄--天生自然 PYTHON3开发学习:网络编程

    # 导入 socket.sys 模块 import socket import sys # 创建 socket 对象 serversocket = socket.socket( socket.AF_I ...

  2. 统计学中比较重要的分布及python中使用方法

    比较重要的四种分布:正态分布.卡方分布.F分布.t分布 卡方分布概率密度曲线 t分布概率密度曲线 F分布概率密度曲线 参考资料: 统计学中四个概率分布 重要抽样分布

  3. 4412开发板QtE系统下MT6620-wifi的测试

    基于iTOP4412系统烧写并启动之后,使用如下命令.wpa_passphrase XXX "YYY " >> /etc/wpa_supplicant.conf其中 X ...

  4. scala编程(八)——函数和闭包

    当程序变得庞大时,你需要一些方法把它们分割成更小的,更易管理的片段.为了分割控制流,Scala 提供了所有有经验的程序员都熟悉的方式:把代码分割成函数.实际上,Scala 提供了许多 Java 中没有 ...

  5. scala编程(六)——函数式对象

    Rational 的式样书 分数:rational number 是一种可以表达为比率 d n 的数字,这里的 n 和 d 是数字,其中 d 不能为零.n 被称作是分子:numerator,d 被称作 ...

  6. idea出现 Unable to open debugger port (127.0.0.1:xxxx): java.net.SocketException "socket closed" 解决方案

    第一种:重启电脑,太费劲: 第二种: 1)根据端口号找到进程pid netstat -aon|findstr "1099" 2)杀掉进程pid即可 netstat -aon|fin ...

  7. Factual question|具体特殊

    Factual question:答案一定出于文章,不是总结 流程:找定位词做连连看,找对定位词,先看此句,然后看选项回文对照.如果找不到找上下两句话. 为了缩小范围,定位词是具体特殊,不要抽象词,可 ...

  8. RNA sequence单分子直测技术

    生命组学 按照功能分类遗传物质,可能的分类有系统流.操作流.平衡流等等.下面是使用该理论解释DNA与RNA的关系: DNA和RNA有很大不同,DNA存储遗传信息,作为生命活动的最内核物质,如同操作系统 ...

  9. <luogu1347>排序

    本来打算当打了个拓扑的板子 后来发现并不只是个板子 差不多 管他呢 #include<cstdio> #include<cstring> #include<iostrea ...

  10. drf三大认证

    源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...