Advertisement
chevengur

СПРИНТ № 4 | Перегрузка операторов | Урок 3: Перегрузка арифметических операций

Nov 28th, 2023
915
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 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.     friend std::ostream& operator<<(std::ostream& os, Rational& rat);
  30.     friend std::istream& operator>>(std::istream& in, Rational& rat);
  31.     friend Rational operator+(Rational& left, Rational& right);
  32.     friend Rational operator-(Rational& left, Rational& right);
  33.     friend Rational operator+(Rational& left);
  34.     friend Rational operator-(Rational& left);
  35.    
  36.    
  37.  
  38. private:
  39.     void Normalize() {
  40.         if (denominator_ < 0) {
  41.             numerator_ = -numerator_;
  42.             denominator_ = -denominator_;
  43.         }
  44.         const int divisor = gcd(numerator_, denominator_);
  45.         numerator_ /= divisor;
  46.         denominator_ /= divisor;
  47.     }
  48.    
  49.     int numerator_ = 0;
  50.     int denominator_ = 1;
  51. };
  52.  
  53. std::ostream& operator<<(std::ostream& os, const Rational& rat){
  54.     os << rat.Numerator() << "/" << rat.Denominator();
  55.     return os;
  56. }
  57.  
  58. std::istream& operator>>(std::istream& is, Rational& rat){
  59.     char b;
  60.     is >> rat.numerator_ >> b >> rat.denominator_;
  61.     return is;
  62. }
  63.  
  64. Rational operator+(Rational& left, Rational& right){
  65.     const int numerator = left.Numerator() * right.Denominator() + right.Numerator() * left.Denominator();
  66.     const int denominator = left.Denominator() * right.Denominator();
  67.     return { numerator, denominator };
  68. }
  69.  
  70. Rational operator-(Rational& left, Rational& right){
  71.     const int numerator = left.Numerator() * right.Denominator() - right.Numerator() * left.Denominator();
  72.     const int denominator = left.Denominator() * right.Denominator();
  73.     return { numerator, denominator };
  74. }
  75.  
  76. Rational operator+(Rational& left){
  77.     return {left.numerator_, left.denominator_};
  78. }
  79.  
  80. Rational operator-(Rational& left){
  81.     return {-left.numerator_, left.denominator_};
  82. }
  83.  
  84. int main(){
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement