Advertisement
avr39ripe

PV913FractionIncDecInput

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