Advertisement
avr39ripe

PV913FractionAssignOperator

Jun 9th, 2020
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 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.     //fractions[1] = Fraction{ 15,16 };
  54.     //Fraction& operator=(const Fraction& rhs);
  55.  
  56.     //ClassName& operator=(const ClassName& rhs);
  57.  
  58.     Fraction& operator=(const int rhs);
  59. };
  60.  
  61. //Fraction Fraction::operator*(const Fraction& rhs) const
  62. //{
  63. //   return Fraction{ numerator * rhs.numerator,  denominator * rhs.denominator };
  64. //}
  65.  
  66. /*Fraction& Fraction::operator=(const Fraction& rhs)
  67. {
  68.     std::cout << "Fraction " << this << " assigned by Fraction" << &rhs << '\n';
  69.     this->numerator = rhs.numerator;
  70.     this->denominator = rhs.denominator;
  71.     return *this;
  72. }
  73. */
  74.  
  75. Fraction& Fraction::operator=(const int rhs)
  76. {
  77.     std::cout << "Fraction " << this << " assigned by Int" << &rhs << '\n';
  78.     this->numerator = rhs;
  79.     this->denominator = 1;
  80.     return *this;
  81. }
  82.  
  83. Fraction operator*(const Fraction& lhs, const Fraction& rhs)
  84. {
  85.     return Fraction{ lhs.numerator * rhs.numerator,  lhs.denominator * rhs.denominator };
  86. }
  87.  
  88. Fraction operator*(const Fraction& lhs, int rhs)
  89. {
  90.     return Fraction{ lhs.numerator * rhs,  lhs.denominator };
  91. }
  92.  
  93. Fraction operator*(int lhs, const Fraction& rhs)
  94. {
  95.     return rhs * lhs;
  96. }
  97.  
  98. Fraction operator/(const Fraction& lhs, const Fraction& rhs)
  99. {
  100.     return Fraction{ lhs.numerator * rhs.denominator, lhs.denominator * rhs.numerator };
  101. }
  102.  
  103. Fraction operator+(const Fraction& lhs, const Fraction& rhs)
  104. {
  105.     return Fraction{ lhs.numerator * rhs.denominator + rhs.numerator * lhs.denominator, rhs.denominator * lhs.denominator };
  106. }
  107.  
  108. Fraction operator-(const Fraction& lhs, const Fraction& rhs)
  109. {
  110.     return Fraction{ lhs.numerator * rhs.denominator - rhs.numerator * lhs.denominator, rhs.denominator * lhs.denominator };
  111. }
  112.  
  113. //Fraction operator*(const Fraction& lhs, const Fraction& rhs)
  114. //{
  115. //    return Fraction{ lhs.getNumerator() * rhs.getNumerator(),  lhs.getDenominator() * rhs.getDenominator() };
  116. //}
  117.  
  118. //std::ostream& operator<<(std::ostream& out, const Fraction& rhs)
  119. //{
  120. //    out << '(' << rhs.numerator << " / " << rhs.denominator << ')';
  121. //    return out;
  122. //}
  123.  
  124. std::ostream& operator<<(std::ostream& out, const Fraction& rhs)
  125. {
  126.     if (rhs.numerator == rhs.denominator)
  127.     {
  128.         out << 1;
  129.         return out;
  130.     }
  131.  
  132.     if (rhs.denominator == 1)
  133.     {
  134.         out << rhs.numerator;
  135.         return out;
  136.     }
  137.  
  138.     out << '(' << rhs.numerator << " / " << rhs.denominator << ')';
  139.     return out;
  140. }
  141. //
  142. //std::istream& operator>>(std::istream& in, Fraction& rhs)
  143. //{
  144. //    in >> rhs.numerator;
  145. //    in >> rhs.denominator;
  146. //    rhs.denominator = (rhs.denominator ? rhs.denominator : 1);
  147. //    rhs.reduce();
  148. //    return in;
  149. //}
  150.  
  151. int Fraction::gcd(int a, int b)
  152. {
  153.     while (b)
  154.     {
  155.         a %= b;
  156.         std::swap(a, b);
  157.     }
  158.     return a;
  159. }
  160.  
  161. void Fraction::reduce()
  162. {
  163.     int gcdVal{ gcd(numerator, denominator) };
  164.     numerator /= gcdVal;
  165.     denominator /= gcdVal;
  166.  
  167.     if (denominator < 0 and numerator < 0)
  168.     {
  169.         denominator *= -1;
  170.         numerator *= -1;
  171.     }
  172. }
  173. void Fraction::print() const
  174. {
  175.     std::cout << '(' << numerator << " / " << denominator << ")";
  176. };
  177.  
  178. int main()
  179. {
  180.   /*  const Fraction a{ 2,16 };
  181.     const Fraction b{ 2,4 };
  182.     Fraction k{ 5,8 };
  183.     int x{ 42 };
  184.     Fraction c{ 4,8 };
  185.     */
  186.     int a{35};
  187.    
  188.     const int fractionsSize{ 3 };
  189.     Fraction fractions[fractionsSize]{};//{ {1,2}, {3,4}, {5,6}, {7,8}, {9,10} };
  190.     fractions[1] = Fraction{ 15,16 };
  191.     (fractions[2] = a) = Fraction{ 2,3 };
  192.     for (int i{}; i < fractionsSize; ++i)
  193.     {
  194.         std::cout << "Fraction #" << i << ' ' << fractions[i] << '\n';
  195.     }
  196.  
  197.     return 0;
  198.  
  199.     //c = operator*(a,b);
  200.     //c = a.operator*(b);
  201.     /*c = a * b;
  202.     c = a * x;*/
  203. /*
  204.     std::cout << "x = " << x << '\n';
  205.  
  206.  
  207.     c = a * b * k;
  208.  
  209.  
  210.     std::cout << '\n';
  211.  
  212.     //c.print();
  213.  
  214.     std::cout << "Fraction a = " << a << '\n';
  215.     std::cout << "Fraction b = " << b << '\n' << "Fraction k = " << k << '\n';
  216.     std::cout << "Fraction c = " << c << '\n';
  217.  
  218.     std::cout << '\n';
  219.  
  220.     std::cout << "Fraction a = ";
  221.     a.print();
  222.     std::cout << '\n' << "Fraction b = ";
  223.     b.print();
  224.     std::cout << '\n' << "Fraction k = ";
  225.     k.print();
  226.     std::cout << '\n' << "Fraction c = ";
  227.     c.print();
  228.     std::cout << '\n';
  229.  
  230.     std::cout << '\n';
  231.     */
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement