Advertisement
chevengur

СПРИНТ № 4 | Перегрузка операторов | Урок 4: Перегрузка операций присваивания 1/2

Dec 4th, 2023 (edited)
893
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  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.    
  30.     Rational& operator+=(Rational r) {
  31.         numerator_ = numerator_ * r.Denominator() + denominator_ * r.Numerator();
  32.         denominator_ = denominator_ * r.Denominator();
  33.         Normalize();
  34.         return *this;
  35.     }
  36.    
  37.     Rational& operator-=(Rational r) {
  38.         numerator_ = numerator_ * r.Denominator() - denominator_ * r.Numerator();
  39.         denominator_ = denominator_ * r.Denominator();
  40.         Normalize();
  41.         return *this;
  42.     }
  43.    
  44.     Rational& operator*=(Rational r) {
  45.         numerator_ *= r.Numerator();
  46.         denominator_ *= r.Denominator();
  47.         Normalize();
  48.         return *this;
  49.     }
  50.    
  51.     Rational& operator/=(Rational r) {
  52.         numerator_ *= r.Denominator();
  53.         denominator_ *= r.Numerator();
  54.         Normalize();
  55.         return *this;
  56.     }
  57.  
  58.  
  59. private:
  60.     void Normalize() {
  61.         if (denominator_ < 0) {
  62.             numerator_ = -numerator_;
  63.             denominator_ = -denominator_;
  64.         }
  65.         const int divisor = gcd(numerator_, denominator_);
  66.         numerator_ /= divisor;
  67.         denominator_ /= divisor;
  68.     }
  69.  
  70.     int numerator_ = 0;
  71.     int denominator_ = 1;
  72. };
  73.  
  74.  
  75. std::ostream& operator<<(std::ostream& os, const Rational rat){
  76.     os << rat.Numerator() << '/' << rat.Denominator();
  77.     return os;
  78. }
  79.  
  80. std::istream& operator>>(std::istream& is, Rational rat){
  81.     char b;
  82.     is >> rat.Numerator() >> b >> rat.Denominator();
  83.     return is;
  84. }
  85.  
  86. Rational operator+(Rational left, Rational right){
  87.     const int numerator = left.Numerator() * right.Denominator() + right.Numerator() * left.Denominator();
  88.     const int denominator = left.Denominator() * right.Denominator();
  89.     return { numerator, denominator };
  90. }
  91.  
  92. Rational operator-(Rational left, Rational right){
  93.     const int numerator = left.Numerator() * right.Denominator() - right.Numerator() * left.Denominator();
  94.     const int denominator = left.Denominator() * right.Denominator();
  95.     return { numerator, denominator };
  96. }
  97.  
  98. Rational operator+(Rational left){
  99.     return {left.Numerator(), left.Denominator()};
  100. }
  101.  
  102. Rational operator-(Rational left){
  103.     return {-left.Numerator(), left.Denominator()};
  104. }
  105.  
  106. int main(){
  107.     Rational rat{2,1};
  108.     Rational rat2{3,6};
  109.     Rational rat3;
  110.  
  111.     cout << rat << endl;
  112.  
  113.     rat3+=rat;
  114.     cout << rat3 << endl;
  115.  
  116.    
  117.     rat3-=rat2;
  118.     cout << rat3;
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement