avr39-ripe

fractionClassOperatorsOverloading

Nov 27th, 2019
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class Fraction
  4. {
  5.     int num;
  6.     int denom;
  7.     friend Fraction operator*(const Fraction &lhs, const Fraction &rhs);
  8.     friend Fraction operator/(const Fraction &lhs, const Fraction &rhs);
  9.     friend Fraction operator+(const Fraction &lhs, const Fraction &rhs);
  10.     friend Fraction operator-(const Fraction &lhs, const Fraction &rhs);
  11.     friend bool operator==(const Fraction &lhs, const Fraction &rhs);
  12.     friend bool operator!=(const Fraction &lhs, const Fraction &rhs);
  13.     friend std::ostream& operator<<(std::ostream &out, const Fraction &rhs);
  14.     friend std::istream& operator>>(std::istream &in, Fraction &rhs);
  15.     int gcd(int a, int b);
  16.     void reduce();
  17.  
  18. public:
  19.     Fraction() : Fraction(0, 1) {};
  20.     Fraction(int n) : Fraction(n, 1){};
  21.     Fraction(int n, int d);
  22. //  Fraction& operator=(const Fraction &rhs);
  23.     Fraction& operator*=(const Fraction &rhs);
  24.     Fraction& operator/=(const Fraction &rhs);
  25.     Fraction& operator+=(const Fraction &rhs);
  26.     Fraction& operator-=(const Fraction &rhs);
  27.     Fraction& operator++();
  28.     Fraction& operator--();
  29.     Fraction operator++(int);
  30.     Fraction operator--(int);
  31. };
  32.  
  33. Fraction::Fraction(int n, int d)
  34. : num{ n }, denom{ d ? d : 1 }
  35. {
  36.     reduce();
  37. }
  38.  
  39. int Fraction::gcd(int a, int b)
  40. {
  41.     while (b)
  42.     {
  43.         a %= b;
  44.         std::swap(a, b);
  45.     }
  46.     return a;
  47. }
  48.  
  49. void Fraction::reduce()
  50. {
  51.     int gcdVal
  52.     { gcd(num, denom) };
  53.     num /= gcdVal;
  54.     denom /= gcdVal;
  55.     if (denom < 0 and num < 0)
  56.     {
  57.         denom *= -1;
  58.         num *= -1;
  59.     }
  60. }
  61.  
  62. Fraction& Fraction::operator++()
  63. {
  64.     num+=denom;
  65.     return *this;
  66. }
  67.  
  68. Fraction& Fraction::operator--()
  69. {
  70.     num-=denom;
  71.     return *this;
  72. }
  73.  
  74. Fraction Fraction::operator++(int)
  75. {
  76.     Fraction tmp{*this};
  77.     ++(*this);
  78.     return tmp;
  79. }
  80.  
  81. Fraction Fraction::operator--(int)
  82. {
  83.     Fraction tmp{*this};
  84.     --(*this);
  85.     return tmp;
  86. }
  87.  
  88. //Fraction& Fraction::operator=(const Fraction &rhs)
  89. //{
  90. //  num = rhs.num;
  91. //  denom = rhs.denom;
  92. //  return *this;
  93. //}
  94.  
  95. Fraction& Fraction::operator+=(const Fraction &rhs)
  96. {
  97.     *this = *this + rhs;
  98.     return *this;
  99. }
  100.  
  101. Fraction& Fraction::operator-=(const Fraction &rhs)
  102. {
  103.     *this = *this - rhs;
  104.     return *this;
  105. }
  106.  
  107.  
  108. Fraction& Fraction::operator*=(const Fraction &rhs)
  109. {
  110.     *this = *this * rhs;
  111.     return *this;
  112. }
  113.  
  114.  
  115. Fraction& Fraction::operator/=(const Fraction &rhs)
  116. {
  117.     *this = *this / rhs;
  118.     return *this;
  119. }
  120.  
  121. Fraction operator*(const Fraction &lhs, const Fraction &rhs)
  122. {
  123.     return Fraction{ lhs.num * rhs.num, lhs.denom * rhs.denom };
  124. }
  125.  
  126. Fraction operator/(const Fraction &lhs, const Fraction &rhs)
  127. {
  128.     return Fraction{ lhs.num * rhs.denom, lhs.denom * rhs.num };
  129. }
  130.  
  131. Fraction operator+(const Fraction &lhs, const Fraction &rhs)
  132. {
  133.     return Fraction(lhs.num * rhs.denom + rhs.num * lhs.denom, rhs.denom * lhs.denom);
  134. }
  135.  
  136. Fraction operator-(const Fraction &lhs, const Fraction &rhs)
  137. {
  138.     return Fraction(lhs.num * rhs.denom - rhs.num * lhs.denom, rhs.denom * lhs.denom);
  139. }
  140.  
  141. std::ostream& operator<<(std::ostream &out, const Fraction &rhs)
  142. {
  143.     if (rhs.num == rhs.denom)
  144.     {
  145.         out << 1;
  146.         return out;
  147.     }
  148.  
  149.     if (rhs.denom == 1)
  150.     {
  151.         out << rhs.num;
  152.         return out;
  153.     }
  154.  
  155.     out << rhs.num << '/' << rhs.denom;
  156.     return out;
  157. }
  158.  
  159. std::istream& operator>>(std::istream &in, Fraction &rhs)
  160. {
  161.     in >> rhs.num;
  162.     in >> rhs.denom;
  163.     rhs.denom = (rhs.denom ? rhs.denom : 1);
  164.     rhs.reduce();
  165.     return in;
  166. }
  167.  
  168. bool operator==(const Fraction &lhs, const Fraction &rhs)
  169. {
  170.     return ((lhs.num * rhs.denom) == (rhs.num * lhs.denom));
  171. }
  172.  
  173. bool operator!=(const Fraction &lhs, const Fraction &rhs)
  174. {
  175.     return !(lhs == rhs);
  176. }
  177.  
  178. int main()
  179. {
  180.     Fraction a{ 3, 5 };
  181.     Fraction b{ 1, 3 };
  182.     Fraction c{ 2, 3 };
  183.     Fraction a1{ 3, 5 };
  184.     Fraction d{};
  185.  
  186.     d = c;
  187.     std::cout << "d = " << d << '\n';
  188.     std::cout << "d += b " << (d += b) << '\n';
  189.     std::cout << a << ' ' << b << '\n';
  190.     std::cout << a + b << '\n';
  191.     std::cout << a - b << '\n';
  192.     std::cout << (a == a1) << '\n';
  193.     b+=c;
  194.     std::cout << "b=" << b << '\n';
  195.     b-=c;
  196.     std::cout << "b=" << b << '\n';
  197.     std::cout << "++b = " << (++b) << " --b = " << --b << '\n';
  198.     std::cout << "b++ = " << (b++) << " b-- = " << b-- << " b = " << b << '\n';
  199.     std::cin >> a >> a1;
  200.     std::cout << a << ' ' << a1 << '\n';
  201.     std::cout << a << " == " << a1 << " : " << (a == a1) << '\n';
  202.     std::cout << a << " != " << a1 << " : " << (a != a1) << '\n';
  203. }
Advertisement
Add Comment
Please, Sign In to add comment