Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Должны присутсвовать:
- * 1. Конструкторы, соответствующие способам задания объекта
- * 2. Конструктор копирования
- * 3. Деструктор
- * 4. Перегруженные арифметические операции (в виде методов класса)
- * 5. Перегруженные операции сравнения (в виде методов)
- * 6. Перегруженный оператор присваивания
- * 7. Переруженные операции << и >>
- *
- * Лабораторная работа № 2
- * 10. Дробные числа. Число должно быть представлено двумя полями: целая часть - указатель на длинное целое со знаком,
- * дробная часть - указатель на беззнаковое короткое целое
- */
- /* Замечания:
- * 1. Оператор присваивания: удалить указатели и работать с данными
- * 2. Оператор ввода не должен содержать интерфейс (cout), как и весь класс в целом
- */
- #include <iostream>
- #include <Windows.h>
- using namespace std;
- class Number {
- int len;
- long int* integer;
- unsigned short int* fractional;
- public:
- //конструктор по умолчанию
- Number()
- {
- integer = new long int;
- fractional = new unsigned short int;
- *integer = *fractional = 0;
- len = 1;
- }
- // конструктор с параметрами
- Number(int len1, long int first_part, unsigned short int second_part)
- {
- len = len1;
- integer = new long int;
- fractional = new unsigned short int;
- *integer = first_part;
- *fractional = second_part;
- }
- //конструктор копирования
- Number(const Number &other)
- {
- this->integer = new long int;
- *this->integer = *other.integer;
- this->fractional = new unsigned short int;
- *this->fractional = *other.fractional;
- this->len = other.len;
- }
- //деструктор
- ~Number()
- {
- delete integer;
- delete fractional;
- }
- //Перегруженный оператор присваивания
- Number& operator= (const Number& other)
- {
- this->integer = new long int;
- this->integer = other.integer;
- this->fractional = new unsigned short int;
- this->fractional = other.fractional;
- this->len = other.len;
- return *this;
- }
- //Перегруженный оператор сложения
- Number operator+ (const Number& other)
- {
- Number tmp;
- int minlen;
- *tmp.integer = *this->integer + *other.integer;
- if (this->len >= other.len)
- {
- tmp.len = this->len;
- minlen = other.len;
- *other.fractional *= pow(10.0, tmp.len - minlen);
- }
- else
- {
- tmp.len = other.len;
- minlen = this->len;
- *this->fractional *= pow(10.0, tmp.len - minlen);
- }
- *tmp.fractional = *this->fractional + *other.fractional;
- return tmp;
- }
- //Перегруженный оператор вычитания
- Number operator- (const Number& other)
- {
- Number tmp;
- int minlen;
- *tmp.integer = *this->integer - *other.integer;
- if (this->len >= other.len)
- {
- tmp.len = this->len;
- minlen = other.len;
- *other.fractional *= pow(10.0, tmp.len - minlen);
- }
- else
- {
- tmp.len = other.len;
- minlen = this->len;
- *this->fractional *= pow(10.0, tmp.len - minlen);
- }
- if (*this->fractional >= * other.fractional)
- *tmp.fractional = *this->fractional - *other.fractional;
- else
- {
- *tmp.integer -= 1;
- *tmp.fractional = pow(10, tmp.len) - abs(*this->fractional - *other.fractional);
- }
- return tmp;
- }
- //Перегруженный оператор умножения
- Number operator* (const Number& other)
- {
- Number tmp;
- tmp.len = this->len + other.len;
- int power = pow(10, tmp.len);
- int result = (*this->integer * pow(10, this->len) + *this->fractional) * (*other.integer * pow(10, other.len) + *other.fractional);
- *tmp.integer = result / power;
- *tmp.fractional = result % power;
- return tmp;
- }
- //Перегруженный оператор деления
- Number operator/ (const Number& other)
- {
- Number tmp;
- int minlen;
- if (this->len >= other.len)
- {
- tmp.len = this->len;
- minlen = other.len;
- }
- else
- {
- tmp.len = other.len;
- minlen = this->len;
- }
- 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));
- *tmp.integer = result / 1;
- *tmp.fractional = result * pow(10, tmp.len) - *tmp.integer * pow(10, tmp.len);
- return tmp;
- }
- //Перегруженные операторы ввода, вывода, сравнения
- friend istream& operator>> (istream& in, Number& Number);
- friend ostream& operator<< (ostream& out, const Number&Number);
- friend bool operator== (const Number &A, const Number &B);
- };
- ostream& operator<< (ostream& out, const Number& other)
- {
- out << *other.integer + (*other.fractional)/(pow(10.0, other.len)) << endl;
- return out;
- }
- istream& operator>> (istream& in, Number& other)
- {
- cout << "Введите количество знаков в дробной части:" << endl;
- in >> other.len;
- cout << "Введите целую часть:" << endl;
- in >> *other.integer;
- cout << "Введите дробную часть:" << endl;
- in >> *other.fractional;
- return in;
- }
- bool operator== (const Number &A, const Number& B)
- {
- return (A.len == B.len && *A.integer == *B.integer && *A.fractional == *B.fractional);
- }
- int main()
- {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- int q;
- do
- {
- cout << "1. Сложение" << endl;
- cout << "2. Вычитание" << endl;
- cout << "3. Умножение" << endl;
- cout << "4. Деление" << endl;
- cout << "5. Сравнение" << endl;
- cout << "0. Выход" << endl;
- cin >> q;
- if (q != 0)
- {
- Number A, B;
- cin >> A;
- cout << "Получено число A = " << A;
- cin >> B;
- cout << "Получено число B = " << B;
- if (q == 1)
- {
- Number C = A + B;
- cout <<"A + B = "<< C << endl;
- }
- else if (q == 2)
- {
- Number C = A - B;
- cout << "A - B = " << C << endl;
- }
- else if (q == 3)
- {
- Number C = A * B;
- cout << "A * B = " << C << endl;
- }
- else if (q == 4)
- {
- Number C = A / B;
- cout << "A / B = " << C << endl;
- }
- else if (q == 5)
- {
- if (A == B)
- cout << "Равны" << endl;
- else cout << "Не равны" << endl;
- }
- }
- } while (q != 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement