avr39ripe

PV913ClassesFractionOperatorOverloading

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