
- •1 4 Семинар 1. Классы
- •Что принесло с собой ооп
- •1 6 Семинар 1. Классы
- •От структуры — к классу
- •Задача 1.1. Поиск в массиве структур
- •1 8 Семинар 1. Классы
- •Инициализаторы конструктора
- •28 Семинар 1. Классы
- •Конструктор копирования
- •Перегрузка операций инкремента
- •Задача 1.1. Поиск в массиве структур 31
- •1 Является переменной встроенного типа, форма инкремента безразлична:
- •Статические элементы класса
- •3 4 Семинар 1. Классы
- •4 0 Семинар 1. Классы
- •Задача 1.2. Реализация класса треугольников 45
4 0 Семинар 1. Классы
О Поле static int count играет роль глобального^ счетчика создаваемых объектов;
мы сочли удобным в конструкторах генерировать имена треугольников
автоматически: «Треугольник 1», «Треугольник 2» и т. д., используя
текущее значение count (возможны и другие способы именования треугольников).
О Поле char* objID избыточно для решения нашей задачи — оно введено
исключительно для целей отладки и обучения; вскоре вы увидите, что
благодаря отладочным операторам печати в конструкторах и деструкторе
удобно наблюдать за созданием и уничтожением объектов.
О Метод ShowSideAndAreaO введен также только для целей отладки, — убедившись,
что стороны треугольника и его площадь вычисляются правильно
(с помощью калькулятора), в дальнейшем этот метод можно удалить.
Q Конструктор пустого (нулевого) треугольника предусмотрен для создания
временных объектов, которые могут модифицироваться с помощью присваивания.
О Метод ShowO — см. комментарий выше по поводу метода ShowO в классе
Point. К сожалению, здесь нам тоже не удастся нарисовать треугольник на
экране; вместо этого печатаются координаты его вершин.
• Основной модуль (файл Main.cpp).
О Инициализация глобальных переменных: обратите внимание на оператор
int Triangle::count = 0; — если вы забудете это написать, компилятор
очень сильно обидится.
О Функция mainO:
определения восьми точек р1,..., р8 выбраны произвольно, но так, чтобы из
них можно было составить треугольники;
определения четырех треугольников сделаны тоже произвольно, впоследствии
на них будут демонстрироваться основные методы класса; однако не
забывайте, что вершины в каждом треугольнике должны перечисляться по
часовой стрелке;
далее определяются массив указателей Triangle* pTria[] с адресами объявленных
выше треугольников и его размер п; в таком виде удобно передавать
адрес pTria и величину п в вызываемые серверные функции;
главный цикл функции довольно прозрачен и дополнительных пояснений
не требует.
О Функция Menu() — после вывода на экран списка пунктов меню вызывается
функция Get Number (), возвращающая номер пункта, введенный пользователем
с клавиатуры. Для чего написана такая сложная функция — GetNumberO?
Ведь можно было просто написать: cin » number;? Но тогда мы не обеспечили
бы защиту программы от непреднамеренных ошибок при вводе. Вообще-то
Свойство глобальности обеспечивается благодаря модификатору static.
Задача 1.2. Реализация класса треугольников 41
вопрос надежного ввода чисел с клавиатуры подробно разбирается на
семинаре 4 при решении задачи 4.2. Там же вы можете найти описание
работы аналогичной функции GetlntO^
О Функция ShowOnpocTo выводит на экран перечень всех треугольников.
В завершение вызывается функция ExitBackО, которая обеспечивает заключительный
диалог с пользователем после обработки очередного пункта
меню.
О Остальные функции по обработке оставшихся пунктов меню выполнены
в виде заглушек, выводящих только наименование соответствующего пункта.
Тестирование и отладка первой версии
программы
После К0МПИЛЯЦИР1 и запуска программы вы должны увидеть на экране следующий
текст:
Constructor_l for
Constructor_l for
Constructor_l for
Constructor 1 for
triaA (Треугольник 1)
triaB (Треугольник 2)
tr1aC (Треугольник 3)
triaD (Треугольник 4)
=============== Г л а в н о е м е н ю ================
1 - вывести все объекты 3 - найти максимальный
2 - переместить 4 - определить отношение включения
5 - выход
Введите с клавиатуры цифру 1^. Программа выведет:
1
Перечень треугольников
Треугольник 1
Треугольник 2
Треугольник 3
Треугольник 4
(О, 0) (0.5. 1) (1. 0)
(0. 0) (0. 4.5) (3. 0)
(0. 0) (2. 1) (2. 0)
(0. 0) (2. 2) (3. 0)
Треугольник 1:
Треугольник 2:
Треугольник 3:
Треугольник 4:
а= 1.118.
а= 4.5.
а= 2.236.
а= 2.828.
Ь= 1.118.
Ь= 5.408.
Ь= 1.
Ь= 2.236.
с=
с=
с=
с=
1:
3:
2;
3:
s= 0.5
s= 6.75
s= 1
s= 3
Нажмите Enter.
В задаче 9.2 из первой книги практикума было дано другое решение проблемы ввода номера
пункта меню (с защитой от ошибок), но оно рассчитано на использование функций
библиотеки stdio, унаследованных из языка С.
После ввода числовой информации всегда подразумевается нажатие клавиши Enter.
4 2 Семинар 1. Классы
Выбор первого пункта меню проверен. Нажмите Enter. Программа выведет:
=============== Г л а в н о е м е н ю ===================
Теперь проверим выбор второго пункта меню. Введите с клавиатуры цифру 2.
На экране должно появиться:
2
======================= Перемещение =======================
Нажмите Enter.
Выбор второго пункта проверен. Нажмите Enter. Программа выведет:
=============== Г л а в н о е м е н ю ===================
Теперь проверим ввод ошибочного символа. Введите с клавиатуры любой буквенный
символ, например w, и нажмите Enter. Программа должна выругаться:
Повторите ввод (ожидается число от 1 до 5):
Проверяем завершение работы. Введите цифру 5. Программа выведет:
5
Конец работы.
Destructor for
Destructor for
Destructor for
Destructor for
triaD
tr1aC
tr1aB
triaA
Тестирование закончено. Обратите внимание на то, что деструкторы объектов
вызываются в порядке, обратном вызову конструкторов.
Продолжим разработку программы. На втором этапе мы добавим в классы Point
и Triangle методы, обеспечиваюш;ие перемещение треугольников, а в основной
модуль — реализацию функцир! MoveO. Кроме этого, в классе Triangle мы удалим
метод ShowS1deAndArea(), поскольку он был введен только для целей отладки
и свою роль уже выполнил.
Этап 2
Внесите следующие изменения в тексты модулей проекта.
1. Модуль Point.h: добавьте сразу после объявления метода ShowO объявление
операции-функции «+=», которая позволит нам впоследствии реализовать метод
перемещения MoveO в классе Triangle:
void operator +=(Po1nt&):
2. Модуль Polnt.cpp. Добавьте код реализации данной функции:
void Point::operator +=(Po1nt& p) {
X += p.x; у += p.у;
}
Задача 1.2. Реализация класса треугольников 43
3. Модуль Тг1 angl е. h.
О Удалите объявление метода ShowSideAndAreaO.
О Добавьте объявление метода:
void Move(Polnt);
4. Модуль Тг1 angl е. срр.
О Удалите метод ShowSideAndAreaO.
О Добавьте код метода Move():
/ / Переместить объект на величину (dp.x. dp.у)
void Triangle::Move(Point dp) {
vl += dp: v2 += dp: v3 += dp:
}
5. Модуль Main.cpp.
О В список прототипов функций в начале файла добавьте сигнатуру:
double GetDoubleO:
О Добавьте в файл текст новой функции 6etDouble() либо сразу после функции
Show(), либо в конец файла. Эта функция предназначена для ввода вещественного
числа и вызывается из функции MoveO. В ней предусмотрена
защита от ввода недопустимых (например, буквенных) символов аналогично
тому, как это решено в функции GetNumberO:
// ввод вещественного числа
double GetDoubleO {
double value:
while (true) {
c1n » value:
if (cin.peekO == '\n') break:
else {
cout « "Повторите ввод (ожидается вещественное число):" « endl:
cin.clearO:
while (cin.getO != '\n') {}:
}
}
return value:
}
О Замените заглушку функции MoveO следующим кодом:
/ / перемещение
void Movedriangle* p_tria[]. int к) {
cout « "============^ Перемещение =============" « endl:
cout « "Введите номер треугольника (от 1 до " « к « "): ":
int i = GetNumberd. к) - 1:
p_tria[i]->Show():
Point dp:
44 Семинар 1. Классы
cout « "Введите смещение по х: ":
dp.x = GetDoubleO:
cout « "Введите смещение по у: ";
dp.у = GetDoubleO:
p_tria[1]->Move(dp):
cout « "Новое положение треугольника:" « endl:
p_tr1a[1]->Show():
ExitBackO:
}
Выполнив компиляцию проекта, проведите его тестирование аналогично тестированию
на первом этапе. После выбора второго пункта меню и ввода данных,
задающих номер треугольнргка, величину сдвига по х и величину сдвига по у, вы
должны увидеть на экране примерно следующее:^
2
============= Перемещение =============
Вв'едите номер треугольника (от 1 до 4): 1
Треугольник 1: (0. 0) (0.5. 1) (1. 0)
Введите смещение по х: 2,5
Введите смещение по у: -7
Новое положение треугольника:
Треугольник 1: (2.5. -7) (3. -6) (3.5. -7)
Нажмите Enter.
Продолжим разработку программы.
Этап 3
На этом этапе мы добавим в класс Triangle метод, обеспечивающий сравнение
треугольников по их площади, а в основной модуль — реализацию функции
F1ndMax(). Внесите следующие изменения в тексты модулей проекта:
1. Модуль Triangle.h: добавьте объявление функции-операции:
bool operator >(const Tr1angle&) const:
2. Модуль Triangle.cpp: добавьте код реализации функции-операции:
/ / Сравнить объект (по площади) с объектом t r ia
bool Triangle::operator >(const Tr1angle& t r i a ) const {
double p = (a + b + c) / 2:
double s = sqrt(p * (p - a) ^ (p - b) * (p - c)):
double pi = (tria.a + t r i a .b + t r i a . c ) / 2:
double si = sqrt(pl * (pi - tria.a) * (pi - tria.b) -^ (pi - t r i a . c ) ):
i f (s > si) return true:
else return false:
Жирным шрифтом выделено то, что вводилось с клавиатуры.