Advertisement
chevengur

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

Dec 18th, 2023
924
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 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.     {
  18.         if(denominator == 0){
  19.             throw domain_error("Exist");
  20.         }
  21.         numerator_ = numerator;
  22.         denominator_ = denominator;
  23.  
  24.         Normalize();
  25.     }
  26.  
  27.     int Numerator() const {
  28.         return numerator_;
  29.     }
  30.  
  31.     int Denominator() const {
  32.         return denominator_;
  33.     }
  34.  
  35.     Rational& operator+=(Rational right) {
  36.         numerator_ = numerator_ * right.denominator_ + right.numerator_ * denominator_;
  37.         denominator_ *= right.denominator_;
  38.         Normalize();
  39.         return *this;
  40.     }
  41.  
  42.     Rational& operator-=(Rational right) {
  43.         numerator_ = numerator_ * right.denominator_ - right.numerator_ * denominator_;
  44.         denominator_ *= right.denominator_;
  45.         Normalize();
  46.         return *this;
  47.     }
  48.  
  49.     Rational& operator*=(Rational right) {
  50.         numerator_ *= right.numerator_;
  51.         denominator_ *= right.denominator_;
  52.         Normalize();
  53.         return *this;
  54.     }
  55.  
  56.     Rational& operator/=(Rational right) {
  57.         if(right.numerator_ == 0){
  58.             throw invalid_argument("Division by zero");
  59.         }
  60.         numerator_ *= right.denominator_;
  61.         denominator_ *= right.numerator_;
  62.         Normalize();
  63.         return *this;
  64.     }
  65.  
  66. private:
  67.     void Normalize() {
  68.         if (denominator_ < 0) {
  69.             numerator_ = -numerator_;
  70.             denominator_ = -denominator_;
  71.         }
  72.         int n = gcd(numerator_, denominator_);
  73.         numerator_ /= n;
  74.         denominator_ /= n;
  75.     }
  76.  
  77.     int numerator_ = 0;
  78.     int denominator_ = 1;
  79. };
  80.  
  81. ostream& operator<<(ostream& output, Rational rational) {
  82.     return output << rational.Numerator() << '/' << rational.Denominator();
  83. }
  84.  
  85. istream& operator>>(istream& input, Rational& rational) {
  86.     int numerator;
  87.     int denominator;
  88.     char slash;
  89.     if ((input >> numerator) && (input >> slash) && (slash == '/') && (input >> denominator)) {
  90.         rational = Rational{numerator, denominator};
  91.     }
  92.     return input;
  93. }
  94.  
  95. // Unary plus and minus
  96.  
  97. Rational operator+(Rational value) {
  98.     return value;
  99. }
  100.  
  101. Rational operator-(Rational value) {
  102.     return {-value.Numerator(), value.Denominator()};
  103. }
  104.  
  105. // Binary arithmetic operations
  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.     return left *= right;
  117. }
  118.  
  119. Rational operator/(Rational left, Rational right) {
  120.     if(right.Numerator() == 0){
  121.         throw invalid_argument("Division by zero");
  122.     }
  123.     return left /= right;
  124. }
  125.  
  126. // Comparison operators
  127.  
  128. bool operator==(Rational left, Rational right) {
  129.     return left.Numerator() == right.Numerator() &&
  130.            left.Denominator() == right.Denominator();
  131. }
  132.  
  133. bool operator!=(Rational left, Rational right) {
  134.     return !(left == right);
  135. }
  136.  
  137. bool operator<(Rational left, Rational right) {
  138.     return left.Numerator() * right.Denominator() <
  139.            left.Denominator() * right.Numerator();
  140. }
  141.  
  142. bool operator>(Rational left, Rational right) {
  143.     return left.Numerator() * right.Denominator() >
  144.            left.Denominator() * right.Numerator();
  145. }
  146.  
  147. bool operator>=(Rational left, Rational right) {
  148.     return !(left < right);
  149. }
  150.  
  151. bool operator<=(Rational left, Rational right) {
  152.     return !(left > right);
  153. }
  154.  
  155. int main() {
  156.     try {
  157.         // При попытке сконструировать дробь с нулевым знаменателем
  158.         // должно выброситься исключение domain_error
  159.         const Rational invalid_value{1, 0};
  160.         // Следующая строка не должна выполниться
  161.         cout << invalid_value << endl;
  162.     } catch (const domain_error& e) {
  163.         cout << "Ошибка: "s << e.what() << endl;
  164.     }
  165. }
  166.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement