Advertisement
azakharov93

hw_rational_numbers

Feb 14th, 2023 (edited)
1,179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include<iostream>
  2. #include <vector>
  3.  
  4. class RationalNumber
  5. {
  6. public: // Constructors
  7.   RationalNumber(int numerator)
  8.   {
  9.     numerator_ = numerator;
  10.     denominator_ = 1;
  11.   }
  12.  
  13.   RationalNumber(int numerator, int denominator)
  14.   {
  15.     if (denominator == 0)
  16.       throw std::logic_error("Denominator could not be zero!");
  17.  
  18.     numerator_ = numerator;
  19.     denominator_ = denominator;
  20.  
  21.     simplify_current_fraction();
  22.   }
  23.  
  24. public:
  25.   RationalNumber& operator+=(const RationalNumber& right)
  26.   {
  27.     const int new_numerator = numerator_ * right.denominator_ + right.numerator_ * denominator_;
  28.     const int new_denominator = denominator_ * right.denominator_;
  29.  
  30.     numerator_ = new_numerator;
  31.     denominator_ = new_denominator;
  32.  
  33.     simplify_current_fraction();
  34.  
  35.     return *this;
  36.   }
  37.  
  38.   RationalNumber operator+(const RationalNumber& right) const
  39.   {
  40.     RationalNumber result(*this);
  41.     result += right;
  42.  
  43.     return result;
  44.   }
  45.  
  46.   RationalNumber& operator-=(const RationalNumber& right)
  47.   {
  48.     const int new_numerator = numerator_ * right.denominator_ - right.numerator_ * denominator_;
  49.     const int new_denominator = denominator_ * right.denominator_;
  50.  
  51.     numerator_ = new_numerator;
  52.     denominator_ = new_denominator;
  53.  
  54.     simplify_current_fraction();
  55.  
  56.     return *this;
  57.   }
  58.  
  59.   RationalNumber operator-(const RationalNumber& right) const
  60.   {
  61.     RationalNumber result(*this);
  62.     result -= right;
  63.  
  64.     return result;
  65.   }
  66.  
  67.   RationalNumber& operator*=(const RationalNumber& right)
  68.   {
  69.     numerator_ *= right.numerator_;
  70.     denominator_ *= right.denominator_;
  71.  
  72.     simplify_current_fraction();
  73.  
  74.     return *this;
  75.   }
  76.  
  77.   RationalNumber operator*(const RationalNumber& right) const
  78.   {
  79.     RationalNumber result(*this);
  80.     result *= right;
  81.  
  82.     return result;
  83.   }
  84.  
  85.   RationalNumber& operator/=(const RationalNumber& right)
  86.   {
  87.     numerator_ *= right.denominator_;
  88.     denominator_ *= right.numerator_;
  89.  
  90.     simplify_current_fraction();
  91.  
  92.     return *this;
  93.   }
  94.  
  95.   RationalNumber operator/(const RationalNumber& right) const
  96.   {
  97.     RationalNumber result(*this);
  98.     result /= right;
  99.  
  100.     return result;
  101.   }
  102.  
  103.   RationalNumber operator-() const
  104.   {
  105.     return RationalNumber(-numerator_, denominator_);
  106.   }
  107.  
  108. public: // Overload operator =
  109.   RationalNumber& operator=(const RationalNumber& right)
  110.   {
  111.     if(this != &right)
  112.     {
  113.       numerator_ = right.numerator_;
  114.       denominator_ = right.denominator_;
  115.     }
  116.  
  117.     return *this;
  118.   }
  119.  
  120. public: // Overload boolean operators
  121.   bool operator==(const RationalNumber& right) const
  122.   {
  123.     return numerator_ == right.numerator_ && denominator_ == right.denominator_;
  124.   }
  125.  
  126.   bool operator<(const RationalNumber& right) const
  127.   {
  128.     return numerator_ * right.denominator_ < right.numerator_* denominator_;
  129.   }
  130.  
  131.   bool operator<=(const RationalNumber& right) const
  132.   {
  133.     return *this < right || *this == right;
  134.   }
  135.  
  136.   bool operator>(const RationalNumber& right) const
  137.   {
  138.     return !(*this <= right);
  139.   }
  140.  
  141.   bool operator>=(const RationalNumber& right) const
  142.   {
  143.     return !(*this < right);
  144.   }
  145.  
  146. public:
  147.   friend std::ostream& operator<<(std::ostream& os, const RationalNumber& rational_number);
  148.  
  149. private:
  150.   void simplify_current_fraction()
  151.   {
  152.     const int count = std::max(numerator_, denominator_);
  153.  
  154.     // Here we try to simplify the fraction: if both - numerator & denominator could be divided on value - they will be ;)
  155.     // Example: On input: 12 / 24 = 2 * 2 * 3 / 2 * 2 * 2 * 3 = 1 / 3 will be output
  156.     for(int possible_divider = 2; possible_divider < count; ++possible_divider)
  157.     {
  158.       while (numerator_ % possible_divider == 0 && denominator_ % possible_divider == 0)
  159.       {
  160.         numerator_ /= possible_divider;
  161.         denominator_ /= possible_divider;
  162.       }
  163.     }
  164.   }
  165.  
  166. private:
  167.   int denominator_;
  168.   int numerator_;
  169. };
  170.  
  171. std::ostream& operator<<(std::ostream& os, const RationalNumber& rational_number)
  172. {
  173.   os << rational_number.numerator_ << "/" << rational_number.denominator_;
  174.   return os;
  175. }
  176.  
  177.  
  178. int main()
  179. {
  180.   const RationalNumber first(12, 24);
  181.   const RationalNumber second(2, 3);
  182.  
  183.   std::cout << "fist = " << first << " " << " second = " << second << std::endl;
  184.  
  185.   std::cout << first + second << std::endl;
  186.   std::cout << first - second << std::endl;
  187.   std::cout << first * second << std::endl;
  188.   std::cout << first / second << std::endl;
  189.  
  190.   RationalNumber result = first + second;
  191.  
  192.   return 0;
  193. }
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement