SHARE
TWEET

Untitled

a guest May 22nd, 2019 54 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "Fraction.h"
  2.  
  3. ostream& operator<<(ostream& p_out, const Fraction& p_num) //Перегрузка оператора вывода
  4. {
  5.     p_out << p_num.f_intpart << "," << p_num.f_fracpart;
  6.     return p_out;
  7. }
  8.  
  9. Fraction::Fraction() //Конструктор по умолчанию
  10. {
  11.     ++f_count;
  12.     a_size = 3;
  13.     a_massiv[0] = (unsigned char)'0';
  14.     a_massiv[1] = (unsigned char)',';
  15.     a_massiv[2] = (unsigned char)'0';
  16.     a_massiv[3] = (unsigned char)'\0';
  17.     f_intsize = 1;
  18.     f_fracsize = 1;
  19.     f_intpart[0] = (unsigned char)'0';
  20.     f_intpart[f_intsize] = (unsigned char)'\0';
  21.     f_fracpart[0] = (unsigned char)'0';
  22.     f_fracpart[f_fracsize] = (unsigned char)'\0';
  23. }
  24.  
  25. Fraction::Fraction(unsigned char p_mas[], int p_intsize, int p_fracsize) : Array(p_intsize + p_fracsize + 1, p_mas) //Конструктор
  26. {
  27.     if (p_intsize < 0 || p_fracsize < 0)
  28.     {
  29.         throw myexception("   Ошибка №4 - неправильно заданы размеры целой и дробной частей числа.");
  30.     }
  31.     ++f_count;
  32.     f_intsize = p_intsize;
  33.     f_fracsize = p_fracsize;
  34.     for (int i = 0; i < f_intsize; i++)
  35.     {
  36.         f_intpart[i] = p_mas[i];
  37.     }
  38.     f_intpart[f_intsize] = '\0';
  39.     int pmas = f_intsize + 1;
  40.     for (int i = 0; i < f_fracsize; i++)
  41.     {
  42.         f_fracpart[i] = p_mas[pmas];
  43.         pmas++;
  44.     }
  45.     f_fracpart[f_fracsize] = '\0';
  46. }
  47.  
  48. Fraction::~Fraction() //Деструктор
  49. {
  50.  
  51. }
  52.  
  53. double Fraction::splitup() const //Метод, превращающий Fraction в double
  54. {
  55.     double res = 0;
  56.     int in = 1;
  57.     for (int i = 0; i < f_intsize - 1; i++)
  58.     {
  59.         in *= 10;
  60.     }
  61.     for (int i = 0; i < f_intsize; i++)
  62.     {
  63.         res += (double)(f_intpart[i] - '0') * in;
  64.         in /= 10;
  65.     }
  66.     int fr = 10;
  67.     for (int i = 0; i < f_fracsize; i++)
  68.     {
  69.         res += (double)(f_fracpart[i] - '0') / fr;
  70.         fr *= 10;
  71.     }
  72.     return res;
  73. }
  74.  
  75. Fraction Fraction::ret(double p_num) //Метод, превращающий double в Fraction
  76. {
  77.     int m_intpart = (int)p_num, p_intpart = m_intpart;
  78.     f_intsize = 0;
  79.     while (p_intpart > 0)
  80.     {
  81.         p_intpart /= 10;
  82.         f_intsize++;
  83.     }
  84.     if (m_intpart == 0)
  85.     {
  86.         f_intsize = 1;
  87.     }
  88.     int m_fracpart = ((p_num - m_intpart) * 100), p_fracpart = m_fracpart;
  89.     f_fracsize = 0;
  90.     while (p_fracpart > 0)
  91.     {
  92.         p_fracpart /= 10;
  93.         f_fracsize++;
  94.     }
  95.     if (m_fracpart == 0)
  96.     {
  97.         f_fracsize = 1;
  98.     }
  99.     for (int i = f_intsize - 1; i >= 0; i--)
  100.     {
  101.         a_massiv[i] = m_intpart % 10 + '0';
  102.         f_intpart[i] = m_intpart % 10 + '0';
  103.         m_intpart /= 10;
  104.     }
  105.     f_intpart[f_intsize] = '\0';
  106.     a_massiv[f_intsize] = (unsigned char)',';
  107.     int pos = f_intsize + f_fracsize;
  108.     for (int i = f_fracsize - 1; i >= 0; i--)
  109.     {
  110.         a_massiv[pos] = m_fracpart % 10 + '0';
  111.         f_fracpart[i] = m_fracpart % 10 + '0';
  112.         m_fracpart /= 10;
  113.         pos--;
  114.     }
  115.     f_fracpart[f_fracsize] = '\0';
  116.     a_size = f_intsize + f_fracsize + 1;
  117.     return *this;
  118. }
  119.  
  120. bool Fraction::Add(Array* p_val1, Array* p_val2, Array* o_res) //Перегрузка оператора сложения
  121. {
  122.     int realsize;
  123.     if (p_val1->a_size > p_val2->a_size)
  124.     {
  125.         realsize = p_val1->a_size;
  126.     }
  127.     else
  128.     {
  129.         realsize = p_val2->a_size;
  130.     }
  131.     Fraction result;
  132.     result.a_size = realsize;
  133.     o_res->a_size = realsize;
  134.     char th[30] = "";
  135.     for (int i = 0; i < p_val1->a_size; i++)
  136.     {
  137.         th[i] = p_val1->a_massiv[i];
  138.     }
  139.     double thi;
  140.     thi = atof(th);
  141.     char pa[30] = "";
  142.     for (int i = 0; i < p_val2->a_size; i++)
  143.     {
  144.         pa[i] = p_val2->a_massiv[i];
  145.     }
  146.     double par = atof(pa);
  147.     double res = thi + par;
  148.     result.ret(res);
  149.     for (int i = 0; i < a_size; i++)
  150.     {
  151.         o_res->a_massiv[i] = result.a_massiv[i];
  152.     }
  153.     return true;
  154. }
  155.  
  156. Fraction Fraction::operator+(const Fraction& p_num) //Перегрузка оператора +
  157. {
  158.     double result = p_num.splitup() + this->splitup();
  159.     Fraction res;
  160.     res.ret(result);
  161.     return res;
  162. }
  163.  
  164. Fraction Fraction::operator-(const Fraction& p_num) //Перегрузка оператора -
  165. {
  166.     double result = this->splitup() - p_num.splitup();
  167.     Fraction res;
  168.     res.ret(result);
  169.     return res;
  170. }
  171.  
  172. Fraction Fraction::operator*(const Fraction& p_num) //Перегрузка оператора *
  173. {
  174.     double result = p_num.splitup() * this->splitup();
  175.     Fraction res;
  176.     res.ret(result);
  177.     return res;
  178. }
  179.  
  180. bool Fraction::operator==(const Fraction& p_num) //Перегрузка оператора ==
  181. {
  182.     double th = this->splitup();
  183.     double num = p_num.splitup();
  184.     return (th == num);
  185. }
  186.  
  187. bool Fraction::operator!=(const Fraction& p_num) //Перегрузка оператора !=
  188. {
  189.     double th = this->splitup();
  190.     double num = p_num.splitup();
  191.     return (th != num);
  192. }
  193.  
  194. bool Fraction::operator>(const Fraction& p_num) //Перегрузка оператора >
  195. {
  196.     double th = this->splitup();
  197.     double num = p_num.splitup();
  198.     return (th > num);
  199. }
  200.  
  201. bool Fraction::operator<(const Fraction& p_num) //Перегрузка оператора <
  202. {
  203.     double th = this->splitup();
  204.     double num = p_num.splitup();
  205.     return (th < num);
  206. }
  207.  
  208. bool Fraction::operator>=(const Fraction& p_num) //Перегрузка оператора >=
  209. {
  210.     double th = this->splitup();
  211.     double num = p_num.splitup();
  212.     return (th >= num);
  213. }
  214.  
  215. bool Fraction::operator<=(const Fraction& p_num) //Перегрузка оператора <=
  216. {
  217.     double th = this->splitup();
  218.     double num = p_num.splitup();
  219.     return (th <= num);
  220. }
  221.  
  222. unsigned char& Fraction::operator[](size_t p_ind)  //Перегрузка оператора []
  223. {
  224.     if (p_ind < 0 || p_ind > a_size)
  225.     {
  226.         throw myexception("   Ошибка №2 - неверный индекс.");
  227.     }
  228.     return f_fracpart[p_ind];
  229. }
  230.  
  231. int Fraction::showcount() //Метод, показывающий количество созданный объектов
  232. {
  233.     return f_count;
  234. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top