分数类 c++


#include <iostream>
#include <cmath>
 

using namespace std;


class Fraction {
 public:
  Fraction();
  Fraction(int numer, int deno);
  Fraction(int numer);

  int get_numerator(const Fraction& fraction) { return fraction.numerator_var; } //获取分数的分子
    
  int get_denominator(const Fraction& fraction) { return fraction.denominator_var; }  //获取分数的分母

  //var1%vq=var2,如果var1小于va
  static int max_common_divisor(int var1, int var2) {
      return var1 == 0 ? var2 : max_common_divisor(var2 % var1, var1);
  }
  //输入输出
  friend ostream& operator << (ostream& os, const Fraction& fraction);
  friend istream& operator >> (istream& is, Fraction& fraction);

  //基本运算
  friend Fraction operator + (const Fraction& fraction1, const Fraction& fraction2);
  friend Fraction operator - (const Fraction& fraction1, const Fraction& fraction2);

 private:
  int numerator_var, denominator_var;  //分子,分母
};

Fraction::Fraction() {
  numerator_var = 0;
  denominator_var =1;
}
Fraction::Fraction(int numer) {
  numerator_var = numer;
  denominator_var = 1;
}

//mcd:最大公约数
Fraction::Fraction(int numer, int deno) {
  int mcd = Fraction::max_common_divisor(numer, deno); 
  numerator_var = numer / mcd;
  denominator_var = deno / mcd;
}

//cout, fraction
ostream& operator << (ostream& os, const Fraction& fraction) {
  bool is_postive = (fraction.numerator_var>=0 && fraction.denominator_var>=0) 
                      || (fraction.numerator_var<0 && fraction.denominator_var<0);
  if (is_postive == false) {
    os << "(-" ;
  }
  if (fraction.denominator_var != 1) {
      os << abs(fraction.numerator_var) << "/" << abs(fraction.denominator_var);
  } else {
    cout << fraction.numerator_var;
  }
  if (is_postive == false) {
    os << ")";
  }
  return os;
}

//is,fraction 
istream& operator >> (istream& is,  Fraction& fraction) {
  char input[10];
  bool is_positive = true;//是否是正分数
  bool mid = false;
  fraction.numerator_var = fraction.denominator_var = 0;
  cin >> input;
  for (int i = 0; ; i++) {
    if (input[i] == '\0') {
      //cout << "input end ";
      break;
    }
    if (input[i] == '-') {
      is_positive = !is_positive;//右一个负号位负,两个负号位正
      continue;
    }
    if (input[i] == '/') {
      mid = true;
      continue;
    }
    if (mid == false) {
      fraction.numerator_var = fraction.numerator_var * 10 + (input[i] - '0');
    } else {
      fraction.denominator_var = fraction.denominator_var * 10 +(input[i] - '0'); 
    }
  }
  if (mid == false) {
    fraction.denominator_var = 1;
  }
  //cout << "input_numerator: " << fraction.numerator_var;
  //cout << " input_denominator: " << fraction.denominator_var << endl;
  int mcd = Fraction::max_common_divisor(fraction.numerator_var, fraction.denominator_var);
  fraction.numerator_var = fraction.numerator_var / mcd;
  fraction.denominator_var = fraction.denominator_var / mcd;
  //cout << "max_common_divisor: " << mcd << endl;
  //cout << "numerator: " << fraction.numerator_var;
  //cout << " denominator: " << fraction.denominator_var;
  if (!is_positive) {
    fraction.numerator_var = -fraction.numerator_var;
  }
  cout << endl;
  return  is;
}
Fraction operator + (const Fraction& fraction1, const Fraction& fraction2) {
  int numer = fraction1.numerator_var*fraction2.denominator_var + fraction2.numerator_var * fraction1.denominator_var;
  int deno  = fraction1.denominator_var * fraction2.denominator_var;
  return Fraction(numer, deno);

}

Fraction operator - (const Fraction& fraction1, const Fraction& fraction2) {
  int numer = fraction1.numerator_var*fraction2.denominator_var - fraction2.numerator_var * fraction1.denominator_var;
  int deno  = fraction1.denominator_var * fraction2.denominator_var;
  return Fraction(numer, deno);

}

int main() {
  Fraction Fra1(1,4);
  Fraction Fra2(2,4);
  //cout << Fra1.max_common_divisor(12,6);
  cout << "Fraction Fra1 = "  << Fra1 << endl;
  cout << "Fraction Fra2 = "  << Fra2 << endl;
  cout << "Fra1 + Fra2 =  " << Fra1 - Fra2 << endl;
  
 return 0;
}

`

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值