delix777

Спринт 4. Перегрузка операторов ввода-вывода.

Jan 26th, 2024 (edited)
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <numeric>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class Rational {
  7. public:
  8.     Rational() = default;
  9.  
  10.     Rational(int numerator)
  11.         : numerator_(numerator)
  12.         , denominator_(1) {
  13.     }
  14.  
  15.     Rational(int numerator, int denominator)
  16.         : numerator_(numerator)
  17.         , denominator_(denominator) {
  18.         Normalize();
  19.     }
  20.  
  21.     int Numerator() const {
  22.         return numerator_;
  23.     }
  24.  
  25.     int Denominator() const {
  26.         return denominator_;
  27.     }
  28.  
  29. private:
  30.     void Normalize() {
  31.         if (denominator_ < 0) {
  32.             numerator_ = -numerator_;
  33.             denominator_ = -denominator_;
  34.         }
  35.         const int divisor = gcd(numerator_, denominator_);
  36.         numerator_ /= divisor;
  37.         denominator_ /= divisor;
  38.     }
  39.  
  40.     int numerator_ = 0;
  41.     int denominator_ = 1;
  42. };
  43.  
  44. ostream& operator<<(ostream& output, Rational rational) {
  45.     output << rational.Numerator() << "/"s << rational.Denominator();
  46.     return output;
  47. }
  48.  
  49. istream& operator>>(istream& input, Rational& rational) {
  50.     int numerator, denominator;
  51.     char fraction;
  52.     input >> numerator >> fraction >> denominator;
  53.     rational = Rational{numerator, denominator};
  54.     return input;
  55. }
Add Comment
Please, Sign In to add comment