Advertisement
kutuzzzov

Урок 4

Sep 29th, 2022 (edited)
651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 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.         if (denominator_ == 0) throw invalid_argument("value is zero"s);
  56.         Normalize();
  57.         return *this;
  58.     }
  59.  
  60. private:
  61.     void Normalize() {
  62.         if (denominator_ < 0) {
  63.             numerator_ = -numerator_;
  64.             denominator_ = -denominator_;
  65.         }
  66.         const int divisor = gcd(numerator_, denominator_);
  67.         numerator_ /= divisor;
  68.         denominator_ /= divisor;
  69.     }
  70.  
  71.     int numerator_ = 0;
  72.     int denominator_ = 1;
  73. };
  74.  
  75. ostream& operator<<(ostream& out, Rational value) {
  76.     out << value.Numerator() << "/"s << value.Denominator();
  77.     return out;
  78. }
  79.  
  80. istream& operator>>(istream& in, Rational& value) {
  81.     int numerator, denominator;
  82.     char drob;
  83.     in >> numerator >> drob >> denominator;
  84.     value = Rational{ numerator, denominator };
  85.     return in;
  86. }
  87.  
  88. Rational operator+(Rational left, Rational right) {
  89.     return left += right;
  90. }
  91.  
  92. Rational operator-(Rational left, Rational right) {
  93.     return left -= right;
  94. }
  95.  
  96. Rational operator*(Rational left, Rational right) {
  97.     return left *= right;
  98. }
  99.  
  100. Rational operator/(Rational left, Rational right) {
  101.     return left /= right;
  102. }
  103.  
  104. Rational operator-(Rational value) {
  105.     return { -value.Numerator(), value.Denominator()};
  106. }
  107.  
  108. Rational operator+(Rational value) {
  109.     return value;
  110. }
  111.  
  112. bool operator==(Rational left, Rational right) {
  113.     return left.Numerator() == right.Numerator() &&
  114.         left.Denominator() == right.Denominator();
  115. }
  116.  
  117. bool operator!=(Rational left, Rational right) {
  118.     return !(left == right);
  119. }
  120.  
  121. bool operator<(Rational left, Rational right) {
  122.     return (left.Numerator() * right.Denominator() < right.Numerator() * left.Denominator());
  123. }
  124.  
  125. bool operator>(Rational left, Rational right) {
  126.     return (left.Numerator() * right.Denominator() > right.Numerator() * left.Denominator());
  127. }
  128.  
  129. bool operator<=(Rational left, Rational right) {
  130.     return !(left > right);
  131. }
  132.  
  133. bool operator>=(Rational left, Rational right) {
  134.     return !(left < right);
  135. }
  136.  
  137. int main() {
  138.     setlocale(LC_ALL, "Russian");
  139.  
  140.     try {
  141.         const Rational three_fifth{ 3, 5 };
  142.         const Rational zero;
  143.         cout << three_fifth << " / " << zero << " = " << (three_fifth / zero) << endl;
  144.     }
  145.     catch (const invalid_argument& e) {
  146.         cout << "Ошибка: "s << e.what() << endl;
  147.     }
  148.  
  149.     try {
  150.         Rational value{ 3, 5 };
  151.         value /= Rational();
  152.         // Следующая строка не должна выполниться
  153.         cout << value << endl;
  154.     }
  155.     catch (const invalid_argument& e) {
  156.         cout << "Ошибка: "s << e.what() << endl;
  157.     }
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement