鱼C论坛

 找回密码
 立即注册
查看: 1255|回复: 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



      暂且我只实现了+,但是功能都已经齐全,如通分,约分。
      有空再写- * /
      #include<iostream>
      #include<string>
      #include<cmath>
      #include<sstream>
      
      //求最大公因数算法or欧几里德算法
      // 递归版本
      int gcd(int a,int b){
          if(b==0){
              return a;
          }
          return gcd(b, a % b);
      }
      // 迭代版本
      int foreachGcd(int a,int b){
          int remainder = 0;
          while(b!=0){
              remainder = a % b;
              a = b;
              b = remainder;
          }
          return a;
      }
      
      class Rational{
          public :
              Rational(){
                  numerator = 0;
                  denominator = 1;
              };
              Rational(int numerator, int denominator)
              {
                  // 分母为零的情况
                  if (denominator == 0)
                  {
                      std::cout << "denominator can not be zero;" << std::endl;
                  }
                  // 分母和分子相同的情况,格式化为1/1
                  else if (numerator == denominator)
                  {
                      this->numerator = 1;
                      this->denominator = 1;
                  }
                  // 分子为零的情况,格式化为0/1
                  else if (numerator == 0)
                  {
                      this->numerator = 0;
                      this->denominator = 1;
                  }
                  // 分母小于零的情况,分子分母符号变化
                  else if (denominator < 0)
                  {
                      numerator = -1 * numerator;
                      denominator = -1 * denominator;
                  }
                  // 正常赋值构造
                  int gcf = 1;
                  if(numerator<0){
                      gcf = gcd(abs(numerator), denominator);
                  }else{
                      gcf = gcd(numerator, denominator);
                  }
                  //看看是否要约分
                  if(gcf!=1){
                      this->numerator = numerator / gcf;
                      this->denominator = denominator / gcf;
                  }else{
                      this->numerator = numerator;
                      this->denominator = denominator;
                  }
              }
              // toString函数
              std::string getRational(){
                  std::ostringstream oss;
                  // 如果分子和分母相等,输出1
                  // 或者
                  // 如果分子为0,输出0
                  if(numerator==denominator||numerator==0){
                      oss << numerator << std::endl;
                  }else{
                      // 不然就正常输出
                      oss << numerator << "\n_____\n"
                      << denominator << std::endl;
                  }
                  
                  return oss.str();
              }
              Rational operator+(Rational &rational){
                  // 分母相同的情况,直接分子相加
                  if(rational.denominator==denominator){
                      return Rational(numerator + rational.numerator, denominator);
                  // 分母不同的情况,通分,然后再相加
                  }else{
                      int gcf = gcd(denominator, rational.denominator);
                      int newDenominator = denominator * rational.denominator / gcf;
                      int newNumerator = newDenominator / denominator * numerator + newDenominator / rational.denominator * rational.numerator;
                      return Rational(newNumerator, newDenominator);
                  }
              }
          private :
              //符号位,暂时保留,没有使用,以后扩展功能可以用
              // int sign=0;
              // 分子
              int numerator;
              // 分母
              int denominator;
      };
      
      
      int main(){
      
          // std::cout << gcd(3, 6) << std::endl;
          Rational r3;
      
          Rational r1(1, 3), r2(2,3);
          r3 = r1 + r2;
          std::cout << r3.getRational() << std::endl;
          
      }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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