delix777

Спринт 4. Перегрузка арифметических операций.

Jan 26th, 2024 (edited)
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <numeric>
  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.  
  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. private:
  32.     void Normalize() {
  33.         if (denominator_ < 0) {
  34.             numerator_ = -numerator_;
  35.             denominator_ = -denominator_;
  36.         }
  37.         int n = gcd(numerator_, denominator_);
  38.         numerator_ /= n;
  39.         denominator_ /= n;
  40.     }
  41.  
  42.     int numerator_ = 0;
  43.     int denominator_ = 1;
  44. };
  45.  
  46. ostream& operator<<(ostream& output, Rational rational) {
  47.     output << rational.Numerator() << '/' << rational.Denominator();
  48.     return output;
  49. }
  50.  
  51. istream& operator>>(istream& input, Rational& rational) {
  52.     int numerator, denominator;
  53.     char slash;
  54.     input >> numerator >> slash >> denominator;
  55.     rational = Rational{numerator, denominator};
  56.     return input;
  57. }
  58.  
  59. Rational operator+(Rational r) {
  60.     return r;
  61. }
  62.  
  63.  
  64. Rational operator-(Rational r) {
  65.     return {-r.Numerator(), r.Denominator()};
  66. }
  67.  
  68. Rational operator+(Rational left, Rational right) {
  69.     const int numerator = left.Numerator() * right.Denominator()
  70.                   + right.Numerator() * left.Denominator();
  71.     const int denominator = left.Denominator() * right.Denominator();
  72.  
  73.     return {numerator, denominator};
  74. }
  75.  
  76. Rational operator-(Rational left, Rational right) {
  77.     const int numerator = left.Numerator() * right.Denominator()
  78.                   - right.Numerator() * left.Denominator();
  79.     const int denominator = left.Denominator() * right.Denominator();
  80.  
  81.     return {numerator, denominator};
  82. }
Add Comment
Please, Sign In to add comment