鱼C论坛

 找回密码
 立即注册
查看: 1374|回复: 0

[技术交流] C++运算符重载,完成的作业分享

[复制链接]
发表于 2020-11-29 08:25:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 PokerFaceMan 于 2020-11-29 08:35 编辑

C++运算符重载的练习
纯手写哦,无抄袭复制粘贴,同学们做作业的时候能自己写尽量自己慢慢写哦

      • 用C++重载运算符"+","-","*","/"实现有理数的加减乘除运算。
      • 如:(1/8) + (7/8)  = 1
      • 如:(1/8) - (7/8)   = -6/8
      • 如:(1/8) * (7/8)  = 7/64
      • 如:(1/8) / (7/8)   = 1/7



      暂且我只实现了+,但是功能都已经齐全,如通分,约分。
      有空再写- * /

      1. #include<iostream>
      2. #include<string>
      3. #include<cmath>
      4. #include<sstream>

      5. //求最大公因数算法or欧几里德算法
      6. // 递归版本
      7. int gcd(int a,int b){
      8.     if(b==0){
      9.         return a;
      10.     }
      11.     return gcd(b, a % b);
      12. }
      13. // 迭代版本
      14. int foreachGcd(int a,int b){
      15.     int remainder = 0;
      16.     while(b!=0){
      17.         remainder = a % b;
      18.         a = b;
      19.         b = remainder;
      20.     }
      21.     return a;
      22. }

      23. class Rational{
      24.     public :
      25.         Rational(){
      26.             numerator = 0;
      27.             denominator = 1;
      28.         };
      29.         Rational(int numerator, int denominator)
      30.         {
      31.             // 分母为零的情况
      32.             if (denominator == 0)
      33.             {
      34.                 std::cout << "denominator can not be zero;" << std::endl;
      35.             }
      36.             // 分母和分子相同的情况,格式化为1/1
      37.             else if (numerator == denominator)
      38.             {
      39.                 this->numerator = 1;
      40.                 this->denominator = 1;
      41.             }
      42.             // 分子为零的情况,格式化为0/1
      43.             else if (numerator == 0)
      44.             {
      45.                 this->numerator = 0;
      46.                 this->denominator = 1;
      47.             }
      48.             // 分母小于零的情况,分子分母符号变化
      49.             else if (denominator < 0)
      50.             {
      51.                 numerator = -1 * numerator;
      52.                 denominator = -1 * denominator;
      53.             }
      54.             // 正常赋值构造
      55.             int gcf = 1;
      56.             if(numerator<0){
      57.                 gcf = gcd(abs(numerator), denominator);
      58.             }else{
      59.                 gcf = gcd(numerator, denominator);
      60.             }
      61.             //看看是否要约分
      62.             if(gcf!=1){
      63.                 this->numerator = numerator / gcf;
      64.                 this->denominator = denominator / gcf;
      65.             }else{
      66.                 this->numerator = numerator;
      67.                 this->denominator = denominator;
      68.             }
      69.         }
      70.         // toString函数
      71.         std::string getRational(){
      72.             std::ostringstream oss;
      73.             // 如果分子和分母相等,输出1
      74.             // 或者
      75.             // 如果分子为0,输出0
      76.             if(numerator==denominator||numerator==0){
      77.                 oss << numerator << std::endl;
      78.             }else{
      79.                 // 不然就正常输出
      80.                 oss << numerator << "\n_____\n"
      81.                 << denominator << std::endl;
      82.             }
      83.             
      84.             return oss.str();
      85.         }
      86.         Rational operator+(Rational &rational){
      87.             // 分母相同的情况,直接分子相加
      88.             if(rational.denominator==denominator){
      89.                 return Rational(numerator + rational.numerator, denominator);
      90.             // 分母不同的情况,通分,然后再相加
      91.             }else{
      92.                 int gcf = gcd(denominator, rational.denominator);
      93.                 int newDenominator = denominator * rational.denominator / gcf;
      94.                 int newNumerator = newDenominator / denominator * numerator + newDenominator / rational.denominator * rational.numerator;
      95.                 return Rational(newNumerator, newDenominator);
      96.             }
      97.         }
      98.     private :
      99.         //符号位,暂时保留,没有使用,以后扩展功能可以用
      100.         // int sign=0;
      101.         // 分子
      102.         int numerator;
      103.         // 分母
      104.         int denominator;
      105. };


      106. int main(){

      107.     // std::cout << gcd(3, 6) << std::endl;
      108.     Rational r3;

      109.     Rational r1(1, 3), r2(2,3);
      110.     r3 = r1 + r2;
      111.     std::cout << r3.getRational() << std::endl;
      112.    
      113. }
      复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-9 04:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表