Advertisement
35657

Untitled

Feb 26th, 2024
619
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.28 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class rational {
  6.  
  7. public:
  8.  
  9.     rational(int numerator, int denominator) {
  10.         numerator_ = numerator;
  11.         denominator_ = denominator;
  12.         reduction();
  13.     }
  14.  
  15.     int numerator() const {
  16.         return numerator_;
  17.     }
  18.  
  19.     int denominator() const {
  20.         return denominator_;
  21.     }
  22.  
  23.     rational& operator+=(const rational& other) {
  24.         numerator_ = numerator_ * other.denominator_ + other.numerator_ * denominator_;
  25.         denominator_ = denominator_ * other.denominator_;
  26.         reduction();
  27.         return *this;
  28.     } // переопределение оператора +=
  29.  
  30.     rational& operator-=(const rational& other) {
  31.         numerator_ = numerator_ * other.denominator_ - other.numerator_ * denominator_;
  32.         denominator_ = denominator_ * other.denominator_;
  33.         reduction();
  34.         return *this;
  35.     } // переопределение оператора -=
  36.  
  37.     rational& operator*=(const rational& other) {
  38.         numerator_ *= other.numerator_;
  39.         denominator_ *= other.denominator_;
  40.         reduction();
  41.         return *this;
  42.     } // переопределение оператора *=
  43.  
  44.     rational& operator/=(const rational& other) {
  45.         numerator_ *= other.denominator_;
  46.         denominator_ *= other.numerator_;
  47.         reduction();
  48.         return *this;
  49.     } // переопределение оператора /=
  50.  
  51. private:
  52.     int numerator_;
  53.     int denominator_;
  54.  
  55.     void reduction() { // сокращение дроби
  56.  
  57.         if (denominator_ < 0) {
  58.             numerator_ *= -1;
  59.             denominator_ *= -1;
  60.         }
  61.  
  62.         int x = numerator_ < 0 ? -numerator_ : numerator_;
  63.         int y = denominator_;
  64.  
  65.         while (x != y) {
  66.             if (x > y) {
  67.                 x -= y;
  68.             }
  69.             else {
  70.                 y -= x;
  71.             }
  72.         }
  73.         numerator_ /= x;
  74.         denominator_ /= x;
  75.     }
  76. };
  77.  
  78. rational& operator+(const rational& left, const rational& right) {
  79.     rational temp = left;
  80.     return temp += right;
  81. } // переопределение оператора + с помощью ранее переопределенного оператора +=
  82.  
  83. rational& operator-(const rational& left, const rational& right) {
  84.     rational temp = left;
  85.     return temp -= right;
  86. } // переопределение оператора - с помощью ранее переопределенного оператора -=
  87.  
  88. rational& operator*(const rational& left, const rational& right) {
  89.     rational temp = left;
  90.     return temp *= right;
  91. } // переопределение оператора * с помощью ранее переопределенного оператора *=
  92.  
  93. rational& operator/(const rational& left, const rational& right) {
  94.     rational temp = left;
  95.     return temp /= right;
  96. } // переопределение оператора / с помощью ранее переопределенного оператора /=
  97.  
  98. bool operator==(const rational& left, const rational& right) {
  99.     return left.numerator() == right.numerator() && left.denominator() == right.denominator();
  100. } // перегрузка оператора ==
  101.  
  102. bool operator!=(const rational& left, const rational& right) {
  103.     return !(left == right);
  104. } // перегрузка оператора != с помощью ранее переопределенного ==
  105.  
  106. bool operator>(const rational& left, const rational& right) {
  107.     return left.numerator() * right.denominator() > right.numerator() * left.denominator();
  108. }
  109.  
  110. bool operator<(const rational& left, const rational& right) {
  111.     return left.numerator() * right.denominator() < right.numerator() * left.denominator();
  112. }
  113.  
  114. bool operator>=(const rational& left, const rational& right) {
  115.     return left.numerator() * right.denominator() >= right.numerator() * left.denominator();
  116. }
  117.  
  118. bool operator<=(const rational& left, const rational& right) {
  119.     return left.numerator() * right.denominator() <= right.numerator() * left.denominator();
  120. }
  121.  
  122. ostream& operator<<(ostream& output, const rational& right) {
  123.      return output << right.numerator() << '/' << right.denominator();
  124. }
  125.  
  126. istream& operator>>(istream& input, rational& right) {
  127.     int numerator;
  128.     int denominator;
  129.     char slash;
  130.     if ((input >> numerator) && (input >> slash) && (slash == '/') && (input >> denominator)) {
  131.         right = rational{ numerator, denominator };
  132.     }
  133.     return input;
  134. }
  135.  
  136.  
  137. int main() {
  138.  
  139.     setlocale(LC_ALL, "ru");
  140.  
  141.     rational r1(1, 2);
  142.     rational r2(3, 4);
  143.     cout << r1 << endl;
  144.     cout << r2 << endl;
  145.  
  146.     cout << (r1 == r2) << endl;
  147.     cout << (r1 != r2) << endl;
  148.     cout << (r1 > r2) << endl;
  149.     cout << (r1 < r2) << endl;
  150.     cout << (r1 >= r2) << endl;
  151.     cout << (r1 <= r2) << endl;
  152.  
  153.     r1 += r2;
  154.     cout << r1 << endl;
  155.  
  156.     r1 -= r2;
  157.     cout << r1 << endl;
  158.  
  159.     r1 *= r2;
  160.     cout << r1 << endl;
  161.  
  162.     r1 /= r2;
  163.     cout << r1 << endl;
  164.  
  165.     int a = 3;
  166.     int b = 2;
  167.  
  168.     rational r3(1, 1);
  169.     r3 = r1 + r2;
  170.     cout << r3 << endl;
  171.  
  172.     r3 = r1 - r2;
  173.     cout << r3 << endl;
  174.  
  175.     r3 = r1 * r2;
  176.     cout << r3 << endl;
  177.  
  178.     r3 = r1 / r2;
  179.     cout << r3 << endl;
  180.  
  181.     cin >> r3;
  182.     cout << r3 << endl;
  183. }
  184.  
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement