Практическая работа 4. Перегрузка операций.. Практическая работа 4 С++. Отчет по практической работе 4 по предмету Системное программирование
Скачать 135.25 Kb.
|
Ring(){}ОТЧЕТ по практической работе 4 по предмету «Системное программирование» Номер варианта: 13 Санкт-Петербург 2022 Цель работы: Изучить механизм перегрузки операций. Практическое задание: Создать класс КОЛЬЦО (геометрическая фигура на плоскости) в прямоугольной системе координат OXY с центром в точке O(0,0), которая определяется двумя радиусами (R1, R2, R2>R1>0). Реализовать метод вывода на экран информации о кольце. Перегрузить бинарные операторы: пересечение двух колец (*), объединение двух колец (+), несимметрическая разность двух колец (-). Следует учесть, что результатом выполнения оператора может быть получено кольцо с равными радиусами (R1=R2), в этом случае следует сообщить об ошибке. Выполнение: Класс «Ring» Конструктор без параметров Конструктор с параметрами Конструктор копирования Деструктор Перегрузка оператора * (пересечение двух колец) Перегрузка оператора + (объединение двух колец) Перегрузка оператора – (несимметрическая разность двух колец) Метод print, который выводит данные Создать два кольца. Кольцо внутри другого. Выполнение все перегрузки оператора. \ Создать два кольца. Выполнение все перегрузки оператора. Создать два кольца, так чтобы результатом выполнения одного из перегрузки оператора выводил нулевого радиуса (R1 = R2). Выполнение все перегрузки оператора. Демонстрация. Листинг программы: #include "pch.h" #include using namespace std; class Ring { private: double R1; double R2; public: Ring(); Ring(double, double); Ring(const Ring& obj); Ring Ring::operator*(const Ring& ring) { Ring newring; if (R1 != R2 && ring.R1 != ring.R2) { newring.R1 = (R1 < ring.R1) ? ring.R1 : R1; newring.R2 = (R2 > ring.R2) ? ring.R2 : R2; } else { newring.R1 = 0; newring.R2 = 0; } return newring; } Ring Ring::operator+(const Ring& ring) { Ring newring; if (R1 != R2 && ring.R1 != ring.R2) { newring.R1 = (R1 > ring.R1) ? ring.R1 : R1; newring.R2 = (R2 < ring.R2) ? ring.R2 : R2; } else { newring.R1 = 0; newring.R2 = 0; } return newring; } Ring Ring::operator-(const Ring& ring) { Ring newring; if (R1 > ring.R1 && R2 < ring.R2) { newring.R1 = 0; newring.R2 = 0; } else if (R1 < ring.R1 && R2 > ring.R2) { newring.R1 = ring.R2; newring.R2 = R2; } else if (R1 == R2 || ring.R1 == ring.R2) { newring.R1 = 0; newring.R2 = 0; } else { if (R2 > ring.R2) { newring.R1 = (R1 > ring.R2) ? R1 : ring.R2; newring.R2 = R2; } else { newring.R1 = R1; newring.R2 = (R2 < ring.R1) ? R2 : ring.R1; } } return newring; } void Ring::print() { if (R1 == R2 || R1 < 0 || R2 < 0) { cout << "Кольцо не существует!" << endl << endl; } else { cout << "R1 = " << R1 << "\tR2 = " << R2 << endl << endl; } } int main() { setlocale(LC_ALL, "rus"); Ring ring1(5, 10), ring2(6, 7); cout << "Ring 1" << endl; ring1.print(); cout << "Ring 2" << endl; ring2.print(); cout << "Ring 1 - Ring 2" << endl; (ring1 - ring2).print(); cout << "Ring 2 - Ring 1" << endl; (ring2 - ring1).print(); cout << "Ring 1 + Ring 2" << endl; (ring1 + ring2).print(); cout << "Ring 1 * Ring 2" << endl; (ring1 * ring2).print(); Ring ring3(5, 10), ring4(8, 15); cout << endl << endl << "Ring 3" << endl; ring3.print(); cout << "Ring 4" << endl; ring4.print(); cout << "Ring 3 - Ring 4" << endl; (ring3 - ring4).print(); cout << "Ring 4 - Ring 3" << endl; (ring4 - ring3).print(); cout << "Ring 3 + Ring 4" << endl; (ring3 + ring4).print(); cout << "Ring 3 * Ring 4" << endl; (ring3 * ring4).print(); Ring ring5(5, 10), ring6(10, 15); cout << endl << endl << "Ring 5" << endl; ring5.print(); cout << "Ring 6" << endl; ring6.print(); cout << "Ring 5 - Ring 6" << endl; (ring5 - ring6).print(); cout << "Ring 6 - Ring 5" << endl; (ring6 - ring5).print(); cout << "Ring 5 + Ring 6" << endl; (ring5 + ring6).print(); cout << "Ring 5 * Ring 6" << endl; (ring5 * ring6).print(); } Ответы на контрольные вопросы: Для чего в С++ применяется перегрузка операций? Ответ: Чтобы переопределить алгоритм действий при использовании операций к объекту класса. Истинно ли следующее утверждение: операция >= может быть перегружена? Ответ: Да. Сколько аргументов требуется для определения перегруженной унарной операции? Ответ: Один аргумент. Сколько аргументов требуется для определения перегруженной бинарной операции? Ответ: Два аргумента. Чем отличается действие операции ++ в префиксной форме от её действия в постфиксной форме? Ответ: Префиксный оператор проводит операцию, затем возвращает значение, а постфиксный возвращает значение переменной, затем проводит операцию. Истинно ли следующее утверждение: перегруженная операция всегда требует на один аргумент меньше, чем количество операндов? Ответ: .Нет. Когда перегружается операция арифметического присваивания, то результат a. Передается объекту справа от операции b. Передается объекту слева от операции c. Передается объекту, вызвавшему операцию d. Должен быть возвращен Ответ: Передается объекту слева от операции (b). Истинно ли следующее утверждение: компилятор не выдаст сообщение об ошибке, если вы перегрузите операцию * для выполнения деления? Ответ: Да. Существуют ли операции, которые нельзя перегружать? Ответ: Да. |