Задание 4
Организация программ с использованием виртуальных функций и абстрактных базовых классов
Цель задания
1. Изучение механизма динамического связывания.
2. Получение навыков в использовании виртуальных функций.
3. Изучение принципов построения абстрактных базовых классов и производных классов, созданных на основе базовых.
4. Получение навыков в разработке абстрактных классов с применением чисто виртуальных функций, в построении производных классов с использованием открытого наследования.
Минимальное задание
1. Имеется первичный (основной) базовый класс A:
class A {
int i;
char c;
char v[10];
public:
A(int ni=0,char nc=’*’)
{cout<<endl<<"Конструктор класса A "; i=ni; c=nc;}
~A()
{cout<<endl<<"Деструктор класса A ";} };
Реализуйте иерархии классов, представленные "деревьями".
A B1 C
![]()


! !

B2
A virtual B1 C
![]()


! ! !
virtual
B2
Член-данное класса В1: вещественное двойной точности. Член-данные класса В2: вещественное. Член-данное класса С: длинное целое. Классы B1, B2, C должны содержать соответствующие конструкторы и деструкторы аналогичные классу A. Напишите демонстрационную программу, которая поочередно создает объекты классов A, B1, B2, C и выдает их размеры в памяти. Объясните полученные результаты.
2. Составить программу с использованием множественного наследования для изображения на экране дисплея прямоугольника, с текстом внутри, следующего содержания: "GRUPPA 417415". При составлении программы использовать иерархию классов:
Point Rect MR
![]()
![]()
![]()
! !
Message

!
Класс Point должен быть виртуальным базовым классом. Для всех классов иерархии определите конструкторы и член-функции в целях перемещения, показа и стирания соответствующих объектов.
Класс Point должен содержать член-данные, характеризующие координаты и цвет точки. Класс Rect должен содержать член-данные, характеризующие координаты левого вернего и правого нижнего углов. Класс Message должен содержать член-данные, характеризующие тип шрифта и адрес сообщения в памяти. Класс MR может не содержать собственных член-данных.
3. Напишите программу создания базового класса num. В этом классе должно храниться целое и определена виртуальная функция shownum( ). Создайте два производных класса outhex и outoct, которые наследуют класс num. Функция shownum( ) должна быть переопределена в производных классах так, чтобы осуществлять вывод на экран значений, в шестнадцатеричной и восьмеричной системах счисления соответственно.
Напишите программу, в которой базовый класс dist используется для хранения в переменной типа double расстояния между двумя точками. В классе dist создайте виртуальную функцию trav_time( ), которая выводит на экран время, необходимое для прохождения этого расстояния с учетом того, что расстояние задано в милях, а скорость равна 60 миль в час. В производном классе metricпереопределите функцию trav_time( ) так, чтобы она выводила на экран время, необходимое для прохождения этого расстояния, считая теперь, что расстояние задано в километрах, а скорость равна 100 километров в час. Напишите программу создания базового класса area. В этом классе должны храниться две переменные типа double, определяющие размеры фигуры (например, высота и ширина), определена функция setar( ), задающая значения переменным, и определена виртуальная функция getar( ). Создайте два производных класса rectangle и triangle, которые наследуют класс area. Функция getar( ) должна быть переопределена в производных классах так, чтобы возвращать площадь фигуры, вид которой задается в производном классе. Создать иерархическую структуру классов “точка”, “четырехугольник”, “линия”, “окружность”, “полигон”. Определить для них следующие операции:a) прорисовки;
b) перемещения с заданной скоростью в заданном направлении;
c) вращения вокруг заданной точки;
d) масштабирования.
Организовать движение этих фигур до нажатия клавиши.
Разработать программу, моделирующую поведение двух стай рыб, одна из которых является хищником для другой. Представители обеих стай могут “видеть” друг друга в заданном радиусе, изменять в определенных пределах скорость и направление движения. Для стай определены коэффициенты естественной смертности и рождаемости. “Хищники” могут преследовать и “поедать” “жертв”, если окажутся в непосредственной близости. Для визуализации модели воспользуйтесь классами, определенными в предыдущей задаче (“точка”, “четырехугольник”, “линия”, “окружность”, “полигон”). Создать иерархию классов для моделирования взаимодействия “Магазин-склад - Заказчик”. В распоряжении магазина имеется:§ Склад с товарами различных наименований, стоимости и веса;
§ Гараж с машинами различной грузоподъемности, вместительности и потребляемой мощности.
В магазин поступают заказы на поставку определенного количества товаров различных наименований в заданный район (задается как расстояние между магазином и районом). Магазин должен выбрать наиболее подходящее транспортное средство (учитывать, что машины могут быть заняты другими заказчиками) и определить счет за поставку товара.
Создать иерархию классов следующих элементов интерфейса: “Окно”, “Кнопка”, ‘’Меню”, “Окно редактирования”, ‘Окно вывода текста или графики”, “Кнопка-перключатель”, “Кнопка-Активизатор”, “Радиокнопка”. С помощью созданных классов построить интерфейс к задаче о двух стаях рыб Создать иерархию классов и запрограммировать компьютерную игру “Морской бой”. Игровое поле разбивается на клетки. Палуба корабля занимает одну клетку. Кораблем считается совокупность смежных клеток. Допускаются четыре категории кораблей: одно-, двух-, трех- и четырехпалубные. Двух-, трех - и четырехпалубные корабли могут иметь всевозможные конфигурации и ориентации на игровом поле. Не допускается размещение кораблей в смежных клетках.Пример выполнения задания
Постановка задачи
Для классов “Точка” и ”Окружность” определить виртуальную функцию Draw( ) прорисовки объекта, функцию элементарного перемещения с заданной скоростью в заданном направлении.
Для объектов point и circ вызывается одна и та же функция базового класса Run( ), однако в ней для первого объекта вызывается функция Draw(int) базового класса, для второго – функция Draw(int) производного класса Circ
Структурная схема класса (представить в виде UML-диаграмм)
Член-данные | Базовый класс Point ( ) | Член-функции |
координаты точки: x,y цвет точки: color скорость движения: v направление движения: alpha | конструктор: Point ( ) прорисовка объекта: Draw( ) изменение координат со скоростью v: E1_move( ) перемещения с заданной скоростью в заданном направлении: Run( ) | |
радиус окружности: rad | Производный класс Circ( ) | конструктор: Circ( ) прорисовка объекта: Draw( ) |
Исходный текст программы
#iinclude <graphics. h >
class Point
{ int x, y ; //координаты
int color ; //цвет
float v ; //скорость
float alpha ; //направление движения
public :
Point (int _x, int _y, int _color, float _v = 10, float _alpha = M_PI/3 ) : x( _x), y( _y), color( _color), v( _v), alpha( _alpha) {Draw(color) ;}
virtual void Draw(int col) ;
void E1_move( ) ;
void Run( ) ; } ;
void Point : : Draw(int col)
{ putpixel(x, y, col) ; }
void Point : : E1_move( ) //функция осуществляет элементарное изменение координат со скоростью v
{ x +=ceil(v * cos(alpha) ) ;
y +=ceil(v * sin(alpha) ) ; }
void Point : : Run( )
{ do
{ Draw( 0 ) ;
E1_Move( ) ;
Draw( color ) ; }
while( ! kbhit( ) ) ; }
class Circ : public Point
{ int rad ;
public :
Circ (int _x, int _y, int _color, float _v, float _alpha, int _rad ) : Point( _x, _y, _color, _v, _alpha), rad( _rad) {Draw( _color) ;}
void Draw(int col) ; } ;
void Circ : : Draw(int col)
{ setcolor(col) ;
circle(x, y, rad) ; }
int main( )
{ int gd = DETECT, gm ;
initgraph(&gd, &gm, “c:\\borlandc\\bgi “ ) ;
Point point (20, 20, 1) ;
Circ circ (200, 200, 4, 15, M_PI/6) ;
point. Run( ) ;
circ. Run( ) ;
closegraph( ) ;
retutn 0 ;}


