Guest User

Untitled

a guest
Nov 28th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3.  
  4. class Exception {
  5.  
  6. private:
  7.     std::string m_error;
  8.  
  9. public:
  10.     Exception(std::string error)
  11.         :m_error(error)
  12.     {
  13.     }
  14.     const char* getError() {
  15.         return m_error.c_str();
  16.     }
  17. };
  18.  
  19.  
  20.  
  21. template <class T>
  22. class Rational
  23. {
  24. private:
  25.     T numenator;
  26.     T denominator;
  27.  
  28. public:
  29.     Rational(T num = 0, T denom = 1){
  30.         numenator = num;
  31.         denominator = denom;
  32.  
  33.         if (denom ==  0) {
  34.             throw Exception("Division by zero exception");
  35.         }
  36.  
  37.         if (typeid(denom).name() == "float" || "double" || "char") {
  38.             throw Exception("types of float, char and double are not allowed");
  39.         }
  40.          
  41.         if (denominator <  0) {
  42.             denominator = -denominator;
  43.             numenator = -numenator;
  44.         }
  45.  
  46.     }
  47.  
  48.     T getNumenator() const {
  49.         return numenator;
  50.     }
  51.  
  52.     T getDenominator() const {
  53.         return denominator;
  54.     }
  55.  
  56.     void setNumenator(T a) {
  57.         numenator = a;
  58.     }
  59.  
  60.     void setDenominator(T a) {
  61.         denominator = a;
  62.     }
  63.  
  64.     double getDouble() const {
  65.         return static_cast<double> (numenator) / denominator;
  66.     }
  67.  
  68.  
  69.     template <class T>friend std::ostream& operator<< (std::ostream & out, const Rational<T> &rational);
  70.     template <class T>friend std::istream& operator>> (std::istream& in, Rational<T> &rational);
  71. };
  72.  
  73. template<typename T>
  74. T gcd(T a, T b) {
  75.  
  76.     while (b) {
  77.         a %= b;
  78.         T z = a;
  79.         a = b;
  80.         b = z;
  81.     }
  82.  
  83.     if (a < 0) {
  84.         a = -a;
  85.     }
  86.  
  87.     return a;
  88. }
  89.  
  90. template<typename T>
  91. T NOK(T a, T b)
  92. {
  93.     return a * b / gcd(a, b);
  94. }
  95.  
  96. template<typename T>
  97. void FractionReduction(Rational<T>& r) {
  98.     T num = r.getNumenator();
  99.     T denom = r.getDenominator();
  100.     T c = gcd(num, denom);
  101.  
  102.     num /= c;
  103.     denom /= c;
  104.     r.setNumenator(num);
  105.     r.setDenominator(denom);
  106. }
  107.  
  108.  
  109.  
  110. template <typename T>
  111. std::ostream& operator<< (std::ostream& out, const Rational<T> &rational) {
  112.     out << rational.numenator << "/" << rational.denominator << std::endl;
  113.     return out;
  114. }
  115.  
  116.  
  117.  
  118. template <typename T>
  119. std::istream& operator>> (std::istream& in, Rational<T> &rational) {
  120.     in >> rational.numenator;
  121.     in >> rational.denominator;
  122.     rational = Rational<T>(rational.numenator, rational.denominator);
  123.     return in;
  124. }
  125.  
  126.  
  127.  
  128. template <typename T>
  129. Rational<T>& operator*= (Rational<T>& r1, const  Rational<T> r2) {
  130.     T a = r1.getNumenator() * r2.getNumenator();
  131.     T b = r1.getDenominator() * r2.getDenominator();
  132.     r1.setNumenator(a);
  133.     r1.setDenominator(b);
  134.     FractionReduction(r1);
  135.     return r1;
  136. }
  137.  
  138. template <typename T>
  139. bool operator== (const Rational<T>& lhs, const Rational<T>& rhs) {
  140.     if (lhs.getDouble() == rhs.getDouble()) {
  141.         return true;
  142.     }
  143.  
  144.     else {
  145.         return false;
  146.     }
  147. }
  148.  
  149. template <typename T>
  150. bool operator> (const Rational<T>& lhs, const Rational<T>& rhs) {
  151.     if (lhs.getDouble() > rhs.getDouble()) {
  152.         return true;
  153.     }
  154.  
  155.     else {
  156.         return false;
  157.     }
  158. }
  159.  
  160. template <typename T>
  161. Rational<T>& operator- (Rational<T>& r) {
  162.     T a = r.getNumenator() * -1;
  163.  
  164.     r.setNumenator(a);
  165.  
  166.     return r;
  167. }
  168.  
  169.  
  170. template <typename T>
  171. Rational<T>& operator+(Rational<T>& r1, const Rational<T>& r2) {
  172.     Rational<T> r;
  173.     T denom1 = r1.getDenominator();
  174.     T denom2 = r2.getDenominator();
  175.     T nok = NOK(denom1, denom2);
  176.  
  177.     denom1 = nok / denom1;
  178.     denom2 = nok / denom2;
  179.  
  180.     T num = denom1 * r1.getNumenator() + denom2 * r2.getNumenator();
  181.     r.setNumenator(num);
  182.     r.setDenominator(nok);
  183.  
  184.     FractionReduction(r);
  185.  
  186.     return r;
  187. }
  188.  
  189. template <typename T>
  190. Rational<T> operator*(const Rational<T>& r1, const Rational<T>& r2) {
  191.         Rational<T> r;
  192.  
  193.         int a = r1.getNumenator() * r2.getNumenator();
  194.         int b = r1.getDenominator() * r2.getDenominator();
  195.  
  196.         r.setNumenator(a);
  197.         r.setDenominator(b);
  198.  
  199.         FractionReduction(r);
  200.  
  201.         return r;
  202. }
  203.  
  204. template<typename T>
  205. Rational<T>& operator+=(Rational<T>& r1, const Rational<T>& r2) {
  206.     T denom1 = r1.getDenominator();
  207.     T denom2 = r2.getDenominator();
  208.     T nok = NOK(denom1, denom2);
  209.  
  210.     denom1 = nok / denom1;
  211.     denom2 = nok / denom2;
  212.  
  213.     T num = denom1 * r1.getNumenator() + denom2 * r2.getNumenator();
  214.  
  215.     r1.setNumenator(num);
  216.     r1.setDenominator(nok);
  217.  
  218.     FractionReduction(r1);
  219.  
  220.     return r1;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment