Advertisement
kutuzzzov

Урок 5

Sep 27th, 2022 (edited)
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. #include <numeric>
  2. #include <ostream>
  3. #include <vector>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class Rational {
  9. public:
  10.     Rational() = default;
  11.  
  12.     Rational(int numerator)
  13.         : numerator_(numerator)
  14.         , denominator_(1) {
  15.     }
  16.  
  17.     Rational(int numerator, int denominator)
  18.         : numerator_(numerator)
  19.         , denominator_(denominator) {
  20.         Normalize();
  21.     }
  22.  
  23.     int Numerator() const {
  24.         return numerator_;
  25.     }
  26.  
  27.     int Denominator() const {
  28.         return denominator_;
  29.     }
  30.  
  31.     Rational& operator+=(Rational right) {
  32.         numerator_ = numerator_ * right.denominator_ + denominator_ * right.numerator_;
  33.         denominator_ = denominator_ * right.denominator_;
  34.         Normalize();
  35.         return *this;
  36.     }
  37.  
  38.     Rational& operator-=(Rational right) {
  39.         numerator_ = numerator_ * right.denominator_ - denominator_ * right.numerator_;
  40.         denominator_ = denominator_ * right.denominator_;
  41.         Normalize();
  42.         return *this;
  43.     }
  44.  
  45.     Rational& operator*=(Rational right) {
  46.         numerator_ *= right.numerator_;
  47.         denominator_ *= right.denominator_;
  48.         Normalize();
  49.         return *this;
  50.     }
  51.  
  52.     Rational& operator/=(Rational right) {
  53.         numerator_ *= right.denominator_;
  54.         denominator_ *= right.numerator_;
  55.         Normalize();
  56.         return *this;
  57.     }
  58.  
  59. private:
  60.     void Normalize() {
  61.         if (denominator_ < 0) {
  62.             numerator_ = -numerator_;
  63.             denominator_ = -denominator_;
  64.         }
  65.         const int divisor = gcd(numerator_, denominator_);
  66.         numerator_ /= divisor;
  67.         denominator_ /= divisor;
  68.     }
  69.  
  70.     int numerator_ = 0;
  71.     int denominator_ = 1;
  72. };
  73.  
  74. ostream& operator<<(ostream& out, Rational value) {
  75.     out << value.Numerator() << "/"s << value.Denominator();
  76.     return out;
  77. }
  78.  
  79. istream& operator>>(istream& in, Rational& value) {
  80.     int numerator, denominator;
  81.     char drob;
  82.     in >> numerator >> drob >> denominator;
  83.     value = Rational{ numerator, denominator };
  84.     return in;
  85. }
  86.  
  87. Rational operator+(Rational left, Rational right) {
  88.     return left += right;
  89. }
  90.  
  91. Rational operator-(Rational left, Rational right) {
  92.     return left -= right;
  93. }
  94.  
  95. Rational operator*(Rational left, Rational right) {
  96.     return left *= right;
  97. }
  98.  
  99. Rational operator/(Rational left, Rational right) {
  100.     return left /= right;
  101. }
  102.  
  103. Rational operator-(Rational value) {
  104.     return { -value.Numerator(), value.Denominator()};
  105. }
  106.  
  107. Rational operator+(Rational value) {
  108.     return value;
  109. }
  110.  
  111. bool operator==(Rational left, Rational right) {
  112.     return left.Numerator() == right.Numerator() &&
  113.         left.Denominator() == right.Denominator();
  114. }
  115.  
  116. bool operator!=(Rational left, Rational right) {
  117.     return !(left == right);
  118. }
  119.  
  120. bool operator<(Rational left, Rational right) {
  121.     return (left.Numerator() * right.Denominator() < right.Numerator() * left.Denominator());
  122. }
  123.  
  124. bool operator>(Rational left, Rational right) {
  125.     return (left.Numerator() * right.Denominator() > right.Numerator() * left.Denominator());
  126. }
  127.  
  128. bool operator<=(Rational left, Rational right) {
  129.     return !(left > right);
  130. }
  131.  
  132. bool operator>=(Rational left, Rational right) {
  133.     return !(left < right);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement