Advertisement
Bibodui

ООП Лаба 2

Dec 28th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.73 KB | None | 0 0
  1. /*Должны присутсвовать:
  2. * 1. Конструкторы, соответствующие способам задания объекта
  3. * 2. Конструктор копирования
  4. * 3. Деструктор
  5. * 4. Перегруженные арифметические операции (в виде методов класса)
  6. * 5. Перегруженные операции сравнения (в виде методов)
  7. * 6. Перегруженный оператор присваивания
  8. * 7. Переруженные операции << и >>
  9. *
  10. * Лабораторная работа № 2
  11. * 10. Дробные числа. Число должно быть представлено двумя полями: целая часть - указатель на длинное целое со знаком,
  12. * дробная часть - указатель на беззнаковое короткое целое
  13. */
  14.  
  15.  
  16.  
  17. /* Замечания:
  18. * 1. Оператор присваивания: удалить указатели и работать с данными
  19. * 2. Оператор ввода не должен содержать интерфейс (cout), как и весь класс в целом
  20. */
  21.  
  22. #include <iostream>
  23. #include <Windows.h>
  24.  
  25. using namespace std;
  26.  
  27. class Number {
  28.     int len;
  29.     long int* integer;
  30.     unsigned short int* fractional;
  31. public:
  32.     //конструктор по умолчанию
  33.     Number()
  34.     {
  35.         integer = new long int;
  36.         fractional = new unsigned short int;
  37.         *integer = *fractional = 0;
  38.         len = 1;
  39.     }
  40.    
  41.     // конструктор с параметрами
  42.     Number(int len1, long int first_part, unsigned short int second_part)
  43.     {
  44.         len = len1;
  45.         integer = new long int;
  46.         fractional = new unsigned short int;
  47.         *integer = first_part;
  48.         *fractional = second_part;
  49.     }
  50.  
  51.     //конструктор копирования
  52.     Number(const Number &other)
  53.     {
  54.         this->integer = new long int;
  55.         *this->integer = *other.integer;
  56.         this->fractional = new unsigned short int;
  57.         *this->fractional = *other.fractional;
  58.         this->len = other.len;
  59.     }
  60.    
  61.     //деструктор
  62.     ~Number()
  63.     {
  64.         delete integer;
  65.         delete fractional;
  66.     }
  67.  
  68.     //Перегруженный оператор присваивания
  69.     Number& operator= (const Number& other)
  70.     {
  71.         this->integer = new long int;
  72.         this->integer = other.integer;
  73.         this->fractional = new unsigned short int;
  74.         this->fractional = other.fractional;
  75.         this->len = other.len;
  76.  
  77.         return *this;
  78.     }
  79.  
  80.     //Перегруженный оператор сложения
  81.     Number operator+ (const Number& other)
  82.     {
  83.         Number tmp;
  84.         int minlen;
  85.         *tmp.integer = *this->integer + *other.integer;
  86.         if (this->len >= other.len)
  87.         {
  88.             tmp.len = this->len;
  89.             minlen = other.len;
  90.             *other.fractional *= pow(10.0, tmp.len - minlen);
  91.         }
  92.         else
  93.         {
  94.             tmp.len = other.len;
  95.             minlen = this->len;
  96.             *this->fractional *= pow(10.0, tmp.len - minlen);
  97.         }
  98.        
  99.         *tmp.fractional = *this->fractional + *other.fractional;
  100.  
  101.         return tmp;
  102.     }
  103.  
  104.     //Перегруженный оператор вычитания
  105.     Number operator- (const Number& other)
  106.     {
  107.         Number tmp;
  108.         int minlen;
  109.         *tmp.integer = *this->integer - *other.integer;
  110.         if (this->len >= other.len)
  111.         {
  112.             tmp.len = this->len;
  113.             minlen = other.len;
  114.             *other.fractional *= pow(10.0, tmp.len - minlen);
  115.         }
  116.         else
  117.         {
  118.             tmp.len = other.len;
  119.             minlen = this->len;
  120.             *this->fractional *= pow(10.0, tmp.len - minlen);
  121.         }
  122.  
  123.         if (*this->fractional >= * other.fractional)
  124.             *tmp.fractional = *this->fractional - *other.fractional;
  125.         else
  126.         {
  127.             *tmp.integer -= 1;
  128.             *tmp.fractional = pow(10, tmp.len) - abs(*this->fractional - *other.fractional);
  129.         }
  130.  
  131.         return tmp;
  132.     }
  133.  
  134.     //Перегруженный оператор умножения
  135.     Number operator* (const Number& other)
  136.     {
  137.         Number tmp;
  138.         tmp.len = this->len + other.len;
  139.         int power = pow(10, tmp.len);
  140.         int result = (*this->integer * pow(10, this->len) + *this->fractional) * (*other.integer * pow(10, other.len) + *other.fractional);
  141.         *tmp.integer = result / power;
  142.         *tmp.fractional = result % power;
  143.  
  144.         return tmp;
  145.     }
  146.  
  147.     //Перегруженный оператор деления
  148.     Number operator/ (const Number& other)
  149.     {
  150.         Number tmp;
  151.         int minlen;
  152.         if (this->len >= other.len)
  153.         {
  154.             tmp.len = this->len;
  155.             minlen = other.len;
  156.         }
  157.         else
  158.         {
  159.             tmp.len = other.len;
  160.             minlen = this->len;
  161.         }
  162.  
  163.         double result = (*this->integer * pow(10, tmp.len) + *this->fractional * pow(10, tmp.len - this->len)) / (*other.integer * pow(10, tmp.len) + *other.fractional * pow(10, tmp.len - other.len));
  164.         *tmp.integer = result / 1;
  165.         *tmp.fractional = result * pow(10, tmp.len) - *tmp.integer * pow(10, tmp.len);
  166.  
  167.         return tmp;
  168.     }
  169.  
  170.  
  171.     //Перегруженные операторы ввода, вывода, сравнения
  172.     friend istream& operator>> (istream& in, Number& Number);
  173.     friend ostream& operator<< (ostream& out, const Number&Number);
  174.     friend bool operator== (const Number &A, const Number &B);
  175. };
  176.  
  177. ostream& operator<< (ostream& out, const Number& other)
  178. {
  179.     out << *other.integer + (*other.fractional)/(pow(10.0, other.len)) << endl;
  180.  
  181.     return out;
  182. }
  183.  
  184. istream& operator>> (istream& in, Number& other)
  185. {
  186.     cout << "Введите количество знаков в дробной части:" << endl;
  187.     in >> other.len;
  188.     cout << "Введите целую часть:" << endl;
  189.     in >> *other.integer;
  190.     cout << "Введите дробную часть:" << endl;
  191.     in >> *other.fractional;
  192.  
  193.     return in;
  194. }
  195.  
  196. bool operator== (const Number &A, const Number& B)
  197. {
  198.     return (A.len == B.len && *A.integer == *B.integer && *A.fractional == *B.fractional);
  199. }
  200.  
  201. int main()
  202. {
  203.     SetConsoleOutputCP(1251);
  204.     SetConsoleCP(1251);
  205.  
  206.     int q;
  207.  
  208.     do
  209.     {  
  210.         cout << "1. Сложение" << endl;
  211.         cout << "2. Вычитание" << endl;
  212.         cout << "3. Умножение" << endl;
  213.         cout << "4. Деление" << endl;
  214.         cout << "5. Сравнение" << endl;
  215.         cout << "0. Выход" << endl;
  216.         cin >> q;
  217.         if (q != 0)
  218.         {
  219.             Number A, B;
  220.            
  221.  
  222.             cin >> A;
  223.             cout << "Получено число A = " << A;
  224.             cin >> B;
  225.             cout << "Получено число B = " << B;
  226.             if (q == 1)
  227.             {
  228.                 Number C = A + B;
  229.                 cout <<"A + B = "<< C << endl;
  230.             }
  231.             else if (q == 2)
  232.             {
  233.                 Number C = A - B;
  234.                 cout << "A - B = " << C << endl;
  235.             }
  236.             else if (q == 3)
  237.             {
  238.                 Number C = A * B;
  239.                 cout << "A * B = " << C << endl;
  240.             }
  241.             else if (q == 4)
  242.             {
  243.                 Number C = A / B;
  244.                 cout << "A / B = " << C << endl;
  245.             }
  246.             else if (q == 5)
  247.             {
  248.                 if (A == B)
  249.                     cout << "Равны" << endl;
  250.                 else cout << "Не равны" << endl;
  251.             }
  252.         }
  253.     } while (q != 0);
  254. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement