Advertisement
chevengur

СПРИНТ № 4 | Обработка ошибок. Исключения | Урок 4: Введение в исключения

Dec 18th, 2023
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <numeric>
  3. #include <stdexcept>
  4.  
  5. using namespace std;
  6.  
  7. class Rational {
  8. public:
  9.     Rational() = default;
  10.  
  11.     Rational(int value)
  12.         : numerator_(value)
  13.         , denominator_(1) {
  14.     }
  15.  
  16.     Rational(int numerator, int denominator)
  17.         : numerator_(numerator)
  18.         , denominator_(denominator)
  19.     {
  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_ + right.numerator_ * denominator_;
  33.         denominator_ *= right.denominator_;
  34.         Normalize();
  35.         return *this;
  36.     }
  37.  
  38.     Rational& operator-=(Rational right) {
  39.         numerator_ = numerator_ * right.denominator_ - right.numerator_ * denominator_;
  40.         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.         if(right.numerator_ == 0){
  54.             throw invalid_argument("Division by zero");
  55.         }
  56.         numerator_ *= right.denominator_;
  57.         denominator_ *= right.numerator_;
  58.         Normalize();
  59.         return *this;
  60.     }
  61.  
  62. private:
  63.     void Normalize() {
  64.         if (denominator_ < 0) {
  65.             numerator_ = -numerator_;
  66.             denominator_ = -denominator_;
  67.         }
  68.         int n = gcd(numerator_, denominator_);
  69.         numerator_ /= n;
  70.         denominator_ /= n;
  71.     }
  72.  
  73.     int numerator_ = 0;
  74.     int denominator_ = 1;
  75. };
  76.  
  77. ostream& operator<<(ostream& output, Rational rational) {
  78.     return output << rational.Numerator() << '/' << rational.Denominator();
  79. }
  80.  
  81. istream& operator>>(istream& input, Rational& rational) {
  82.     int numerator;
  83.     int denominator;
  84.     char slash;
  85.     if ((input >> numerator) && (input >> slash) && (slash == '/') && (input >> denominator)) {
  86.         rational = Rational{numerator, denominator};
  87.     }
  88.     return input;
  89. }
  90.  
  91. // Unary plus and minus
  92.  
  93. Rational operator+(Rational value) {
  94.     return value;
  95. }
  96.  
  97. Rational operator-(Rational value) {
  98.     return {-value.Numerator(), value.Denominator()};
  99. }
  100.  
  101. // Binary arithmetic operations
  102.  
  103. Rational operator+(Rational left, Rational right) {
  104.     return left += right;
  105. }
  106.  
  107. Rational operator-(Rational left, Rational right) {
  108.     return left -= right;
  109. }
  110.  
  111. Rational operator*(Rational left, Rational right) {
  112.     return left *= right;
  113. }
  114.  
  115. Rational operator/(Rational left, Rational right) {
  116.     if(right.Numerator() == 0){
  117.         throw invalid_argument("Division by zero");
  118.     }
  119.     return left /= right;
  120. }
  121.  
  122. // Comparison operators
  123.  
  124. bool operator==(Rational left, Rational right) {
  125.     return left.Numerator() == right.Numerator() &&
  126.            left.Denominator() == right.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.Numerator() * right.Denominator() <
  135.            left.Denominator() * right.Numerator();
  136. }
  137.  
  138. bool operator>(Rational left, Rational right) {
  139.     return left.Numerator() * right.Denominator() >
  140.            left.Denominator() * right.Numerator();
  141. }
  142.  
  143. bool operator>=(Rational left, Rational right) {
  144.     return !(left < right);
  145. }
  146.  
  147. bool operator<=(Rational left, Rational right) {
  148.     return !(left > right);
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement