Advertisement
Guest User

Calculator Week4 Exception

a guest
Apr 22nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. class Rational
  5. {
  6. public:
  7.     Rational()
  8.     {
  9.         _numerator = 0;
  10.         _denominator = 1;
  11.     }
  12.     Rational(const int numerator, const int denominator)
  13.     {
  14.         if (denominator == 0)
  15.         {
  16.             throw std::exception("Invalid argument");
  17.         }
  18.  
  19.         int GCD = FindGCD(numerator, denominator);
  20.  
  21.         if (numerator > 0 && denominator < 0 || numerator < 0 && denominator < 0)
  22.         {
  23.             _numerator = -numerator / GCD;
  24.             _denominator = -denominator / GCD;
  25.         }
  26.         else
  27.         {
  28.             _numerator = numerator / GCD;
  29.             _denominator = denominator / GCD;
  30.         }
  31.     }
  32.  
  33.     int GetNumerator() const
  34.     {
  35.         return _numerator;
  36.     }
  37.  
  38.     int GetDenominator() const
  39.     {
  40.         return _denominator;
  41.     }
  42.  
  43. private:
  44.     int _numerator;
  45.     int _denominator;
  46.  
  47.     int FindGCD(int numerator, int denominator)
  48.     {
  49.         numerator = abs(numerator);
  50.         denominator = abs(denominator);
  51.  
  52.         while (numerator > 0 && denominator > 0)
  53.         {
  54.             if (numerator > denominator)
  55.             {
  56.                 numerator %= denominator;
  57.             }
  58.             else
  59.             {
  60.                 denominator %= numerator;
  61.             }
  62.         }
  63.  
  64.         return numerator + denominator;
  65.     }
  66. };
  67.  
  68. Rational operator+ (const Rational& lhs, const Rational& rhs)
  69. {
  70.     if (lhs.GetDenominator() == rhs.GetDenominator())
  71.         return { lhs.GetNumerator() + rhs.GetNumerator(), lhs.GetDenominator() };
  72.  
  73.     return { lhs.GetNumerator() * rhs.GetDenominator() + rhs.GetNumerator() * lhs.GetDenominator(), lhs.GetDenominator() *rhs.GetDenominator() };
  74. }
  75.  
  76. Rational operator- (const Rational& lhs, const Rational& rhs)
  77. {
  78.     if (lhs.GetDenominator() == rhs.GetDenominator())
  79.         return { lhs.GetNumerator() - rhs.GetNumerator(), lhs.GetDenominator() };
  80.  
  81.     return { lhs.GetNumerator() * rhs.GetDenominator() - rhs.GetNumerator() * lhs.GetDenominator(), lhs.GetDenominator() * rhs.GetDenominator() };
  82. }
  83.  
  84. Rational operator* (const Rational& lhs, const Rational& rhs)
  85. {
  86.     return { lhs.GetNumerator() * rhs.GetNumerator(), lhs.GetDenominator() * rhs.GetDenominator() };
  87. }
  88.  
  89. Rational operator/ (const Rational& lhs, const Rational& rhs)
  90. {
  91.     const int numerator = lhs.GetNumerator() * rhs.GetDenominator();
  92.     const int denominator = rhs.GetNumerator() * lhs.GetDenominator();
  93.  
  94.     if (denominator == 0)
  95.         throw std::exception("Division by zero");
  96.  
  97.     return { numerator, denominator };
  98. }
  99.  
  100. std::istream& operator>> (std::istream& stream, Rational& obj)
  101. {
  102.     if(stream.good())
  103.     {
  104.         int numerator = 0;
  105.         int denominator = 0;
  106.         stream >> numerator;
  107.         if (stream.peek() != '/')
  108.             throw std::exception("/");
  109.         stream.ignore(1);
  110.         stream >> denominator;
  111.  
  112.         obj = { numerator, denominator };
  113.     }
  114.  
  115.     return stream;
  116. }
  117.  
  118. std::ostream& operator<< (std::ostream& stream, Rational& obj)
  119. {
  120.     stream << obj.GetNumerator() << "/" << obj.GetDenominator();
  121.  
  122.     return stream;
  123. }
  124.  
  125. int main()
  126. {
  127.     try
  128.     {
  129.         Rational r1, r2;
  130.         char oper;
  131.  
  132.         std::cin >> r1 >> oper >> r2;
  133.  
  134.         if(oper == '+')
  135.         {
  136.             Rational result = r1 + r2;
  137.             std::cout << result << std::endl;
  138.         }
  139.         else if(oper == '-')
  140.         {
  141.             Rational result = r1 - r2;
  142.             std::cout << result << std::endl;
  143.         }
  144.         else if(oper == '*')
  145.         {
  146.             Rational result = r1 * r2;
  147.             std::cout << result << std::endl;
  148.         }
  149.         else if(oper=='/')
  150.         {
  151.             Rational result = r1 / r2;
  152.             std::cout << result << std::endl;
  153.         }
  154.     }
  155.     catch (std::exception& ex)
  156.     {
  157.         std::cout << ex.what() << std::endl;
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement