Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. namespace fraction
  5. {
  6.     int gcd(int a, int b)
  7.     {
  8.         if (!a)
  9.             return b;
  10.         return gcd(b % a, a);
  11.     }
  12.  
  13.     int lcm(int a, int b)
  14.     {
  15.         return (a * b) / gcd(a, b);
  16.     }
  17.  
  18.  
  19.     struct fraction
  20.     {
  21.         fraction() {}
  22.         fraction(int, int);
  23.         fraction(const fraction&);
  24.         fraction(double);
  25.  
  26.         fraction &operator+(int);
  27.         fraction &operator+(fraction &);
  28.  
  29.         fraction &operator-(int);
  30.         fraction &operator-(fraction &);
  31.  
  32.         fraction &operator*(int);
  33.         fraction &operator*(fraction &);
  34.  
  35.         fraction &operator/(int);
  36.         fraction &operator/(fraction &);
  37.  
  38.         fraction &operator=(const fraction &);
  39.  
  40.         fraction &simplify();
  41.         fraction &fpow(int);
  42.  
  43.  
  44.         friend bool operator<(fraction &, fraction &);
  45.  
  46.         friend bool operator>=(fraction &, fraction &);
  47.         friend bool operator==(fraction &, fraction &);
  48.         friend bool operator>(fraction &, fraction &);
  49.         friend bool operator<=(fraction &, fraction &);
  50.         friend bool operator!=(fraction &, fraction &);
  51.  
  52.  
  53.         friend std::ostream &operator<<(std::ostream &, const fraction &);
  54.  
  55.  
  56.  
  57.     private:
  58.         int numerator;
  59.         int denominator;
  60.     };
  61.  
  62.  
  63.     fraction::fraction(int numerator, int denominator)
  64.     {
  65.         fraction f;
  66.         f.numerator = numerator;
  67.         f.denominator = denominator;
  68.         f.simplify();
  69.         this->numerator = f.numerator;
  70.         this->denominator = f.denominator;
  71.     }
  72.  
  73.     fraction::fraction(const fraction &f)
  74.     {
  75.         this->numerator = f.numerator;
  76.         this->denominator = f.denominator;
  77.     }
  78.  
  79.     fraction::fraction(double d)
  80.     {
  81.         int i = 0;
  82.         for (; d!=((int)d); i++) { d*=10; }
  83.  
  84.         this->numerator = d * pow(10, i);
  85.         this->denominator = pow(10, i);
  86.         this->simplify();
  87.     }
  88.  
  89.     fraction &fraction::operator+(int digit)
  90.     {
  91.         this->numerator += digit * this->denominator;
  92.         this->simplify();
  93.         return *this;
  94.     }
  95.  
  96.     fraction &fraction::operator+(fraction &f)
  97.     {
  98.         int lcm = ::fraction::lcm(this->denominator, f.denominator);
  99.         this->numerator *= lcm / this->denominator;
  100.         f.numerator *= lcm / f.denominator;
  101.         f.denominator = lcm;
  102.         this->numerator += f.numerator;
  103.         this->denominator = lcm;
  104.  
  105.         f.simplify();
  106.         this->simplify();
  107.         return *this;
  108.  
  109.     }
  110.  
  111.     fraction &fraction::operator-(int digit)
  112.     {
  113.         this->numerator -= digit * this->denominator;
  114.  
  115.         this->simplify();
  116.         return *this;
  117.     }
  118.  
  119.     fraction &fraction::operator-(fraction &f)
  120.     {
  121.         int lcm = ::fraction::lcm(this->denominator, f.denominator);
  122.         this->numerator *= lcm / this->denominator;
  123.         f.numerator *= lcm / f.denominator;
  124.         f.denominator = lcm;
  125.         this->numerator -= f.numerator;
  126.         this->denominator = lcm;
  127.  
  128.         f.simplify();
  129.         this->simplify();
  130.         return *this;
  131.  
  132.     }
  133.  
  134.     fraction &fraction::operator*(int digit)
  135.     {
  136.         this->numerator *= digit;
  137.  
  138.         this->simplify();
  139.         return *this;
  140.     }
  141.  
  142.     fraction &fraction::operator*(fraction &f)
  143.     {
  144.         this->numerator *= f.numerator;
  145.         this->denominator *= f.denominator;
  146.  
  147.         this->simplify();
  148.         return *this;
  149.  
  150.     }
  151.  
  152.     fraction &fraction::operator/(int digit)
  153.     {
  154.         this->denominator *= digit;
  155.  
  156.         this->simplify();
  157.         return *this;
  158.     }
  159.  
  160.     fraction &fraction::operator/(fraction &f)
  161.     {
  162.         this->numerator *= f.denominator;
  163.         this->denominator *= f.numerator;
  164.  
  165.         this->simplify();
  166.         return *this;
  167.     }
  168.  
  169.     fraction& fraction::operator=(const fraction &f)
  170.     {
  171.         this->numerator = f.numerator;
  172.         this->denominator = f.denominator;
  173.  
  174.         return *this;
  175.  
  176.     }
  177.  
  178.     //advanced arithmetics
  179.     fraction &fraction::simplify()
  180.     {
  181.         int gcd = ::fraction::gcd(this->numerator, this->denominator);
  182.         this->numerator /= gcd;
  183.         this->denominator /= gcd;
  184.  
  185.         return *this;
  186.     }
  187.  
  188.     fraction& fraction::fpow(int pow)
  189.     {
  190.         this->numerator *= pow;
  191.         this->denominator *= pow;
  192.  
  193.         return *this;
  194.     }
  195.  
  196.  
  197.     //logical
  198.     bool operator<(fraction &l, fraction &r)
  199.     {
  200.         l.simplify();
  201.         r.simplify();
  202.  
  203.         int lcm = ::fraction::lcm(l.denominator, r.denominator);
  204.         l.numerator *= lcm / l.denominator;
  205.         l.denominator = lcm;
  206.         r.numerator *= lcm / r.denominator;
  207.         r.denominator = lcm;
  208.  
  209.         return l.numerator < r.numerator;
  210.     }
  211.  
  212.  
  213.     bool operator>(fraction &l, fraction &r)
  214.     {
  215.         return r < l;
  216.     }
  217.  
  218.     bool operator>=(fraction &l, fraction &r)
  219.     {
  220.         return !(l < r);
  221.     }
  222.  
  223.     bool operator<=(fraction &l, fraction &r)
  224.     {
  225.         return !(l > r);
  226.     }
  227.  
  228.     bool operator!=(fraction &l, fraction &r)
  229.     {
  230.         return l > r || r > l;
  231.     }
  232.  
  233.     bool operator==(fraction &l, fraction &r)
  234.     {
  235.         return !(l != r);
  236.     }
  237.  
  238.  
  239.     std::ostream &operator<<(std::ostream &l, const fraction &r)
  240.     {
  241.         return l << r.numerator << "/" << r.denominator;
  242.     }
  243.  
  244.  
  245.  
  246.  
  247.     extern "C" void init()
  248.     {
  249.  
  250.         std::cout << "Over here!\n";
  251.         fraction f1(3,4), f2(1,2);
  252.         fraction f = f1 + f2;
  253.         std::cout << f1 << ((f1 > f2) ? " bigger than " : " smaller than ") << f2 << "\n";
  254.         std::cout << "+: " << f << "\n";
  255.         f = f1 - f2;
  256.         std::cout << "-: " << f << "\n";
  257.         f = f1 * f2;
  258.         std::cout << "*: " << f << "\n";
  259.         f = f1 / f2;
  260.         std::cout << "/: " << f << "\n";
  261.  
  262.  
  263.     }
  264.  
  265. }
  266.  
  267.  
  268. int main() {
  269.     using namespace fraction;
  270.  
  271.     init();
  272.     return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement