Лабораторная работа №10.
Разработка структуры классов. Создание операций класса.
Цель работы
Овладеть практическими навыками разработки классов.
Краткие сведения из теории
Дан класс, описывающий рациональную дробь, созданный в 9 лабораторной работе.
Для использования знаков арифметических операций и операций сравнения перегрузим соответствующие операторы.
Поскольку любая дробь является вещественным числом, переопределим оператор явного преобразования объекта класса Fraction к вещественному типу данных double:
// операция преобразования дроби в тип double
Fraction:: operator double()
{
double res = (double)sign*(intPart * denominator +
numerator) / denominator;
return res;
}
Данное преобразование удобно будет использовать при сравнении дробей.
Перегрузку операций сравнения двух дробей (больше, больше или равно, меньше, меньше или равно, равно, не равно) осуществим с помощью статических методов класса Fraction. Эти операторы должны возвращать значение типа bool. Заметим, что эти операторы следует перегружать «парами». Например, если класс содержит перегруженную операцию ”==”, то обязательно в нем должна быть перегружена и операция ”!=”.
Операторы ”==” и ”!=” осуществляют поэлементное сравнение двух дробей, которые представлены в смешанном виде. Остальные операторы сравнения используют преобразование дроби к вещественному числу и сравнивают полученные значения. Объект, вызвавший метод, сравнивается с объектом, переданным в качестве параметра, при этом обращение к нему осуществляется через указатель this.
Каждая арифметическая операция (“+”, “–“, “*”, ”/”) перегружена тремя методами-операторами для случаев, когда:
операндами операции являются объекты класса Fraction;
первый операнд – дробь, второй – целое число;
первый операнд – целое число, второй – объект-дробь.
Результатом выполнения этих операторов является новая дробь. Рассмотрим подробнее реализацию операторов сложения.
Оператор сложения двух дробей после формирования результата осуществляет преобразование к смешанному виду.
В определении функции сложения дроби с целым числом осуществляется преобразование этого целого числа в дробь (создается новый объект класса Fraction, значение которого равно целому числу) и вызов оператора сложения двух дробей.
Аналогичным образом определяют и другие арифметические операции.
Оператор “<<” осуществляет вывод дроби в привычном математическом виде с учетом существования целой или дробно части. Этот же оператор может использоваться и для записи дроби в файл. Для последующего корректного прочтения данных из файла требуется разделять два числа символом, отличным от пробела (поскольку пробел является разделителем между цело и дробно частями числа). Разделителем в данном случае является символ табуляции (‘\t’).
В том же формате будет осуществляться и ввод данных из потока. Разделителем между двумя дробными числами, записанными в файле, будет являться символ табуляции или символ конца строки (‘\h’). Данные из входного потока считываются в строку, а затем производится разделение на составные части числа – знак, целую часть, числитель и знаменатель.
Приведем пример использования объектов класса Fraction и операций работы с ними.
Порядок выполнения работы
1. Отредактировать приложение, демонстрирующее работу с классом «Рациональное число», реализовав перегруженные операции в соответствии с теорией.
2. Разработать реализации операций класса согласно варианту.
3. Создать приложение, демонстрирующее использование разработанного класса.
Варианты заданий:
1. Разработать класс «Комплексное число». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.
2. Разработать класс «Комплексное число в тригонометрической форме». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.
3. Разработать класс «Дата». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к дате заданного количества дней, операцию вычитания двух дат, операции сравнения и операцию преобразования в символьную строку, а также статический метод получения даты из строки.
4. Разработать класс «Время». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к времени заданного количества минут, операцию вычитания двух моментов времени, операцию преобразования в символьную строку и метод получения момента времени из строки.
5. Разработать класс «Прямоугольник». Определить в нем конструкторы и деструктор, перегрузить операцию пересечения прямоугольников (операция “*”), операцию вычисления площади прямоугольника, операции сравнения (по площади), операцию преобразования в символьную строку и метод получения объекта-прямоугольника из строки.
6. Разработать класс «Треугольник». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь треугольника), операцию проверки включения точки в треугольник, операции сравнения треугольников (по площади), операцию преобразования в символьную строку и метод получения объекта-треугольника из строки.
7. Разработать класс «Круг». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь круга), операцию проверки включения точки в круг, операции сравнения кругов (по радиусу), операцию преобразования в символьную строку и метод получения объекта-круга из строки.
8. Разработать класс «Отрезок». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (длина отрезка), операцию проверки параллельности отрезка осям координат, операции сравнения отрезков (по длине), операцию преобразования в символьную строку и метод получения объекта-отрезка из строки.
9. Разработать класс «Прямая». Определить в нем конструкторы и деструктор, перегрузить операцию сложения прямой с числом (смещение вдоль оси у: вверх или вниз), операцию умножения на число (изменение угла наклона), операцию проверки параллельности прямой осям координат, операцию преобразования в символьную строку и метод получения объекта-прямой из строки.
10. Разработать класс «Вектор». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения вектора из строки.
4. Содержание отчёта
1. Название, цель работы
2. Протокол выполнения работы со всеми распечатками, скриншотами, комментариями и наблюдениями согласно разделу «Выполнение работы».
3. Ответы на контрольные вопросы.
Вопросы к защите
1. Что такое класс?
2. Что такое экземпляр класса?
3. Что такое конструктор?
4. Что такое деструктор?
5. Что такое перегрузка функций?
6. Чем отличается поле класса от свойства класса?
Приложение
Самостоятельная работа по лабораторной работе № 10
«Разработка структуры классов. Создание операций класса»
Самостоятельная работа по теме занятия включает в себя:
- изучение теоретического материала лекционных занятий, учебной литературы, Интернет-ресурсов, раздела «Краткие сведения из теории» настоящего описания ЛР;
- выполнение практических заданий и решение задач
Задачи и практические задания
1. Дополнить класс Fraction перегруженными арифметическими операциями, в которых одним из операндов является вещественное число.
2. Дополнить класс Fraction перегруженными операциями сравнения для дробей и вещественных чисел.
3. Дополнить класс Fraction перегруженным конструктором, осуществляющим преобразование вещественного числа к типу Fraction. Предполагается, что дробная часть вещественного числа содержит до 10 знаков после запятой.