Advertisement
kutuzzzov

Урок 5

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