Пример выполнения практического задания
Задание 3
Организация программ с использованием механизма наследования классов
Цель задания
1. Изучение механизма наследования классов.
2. Получение навыков в написании программ с использованием механизма наследования.
Методические указания
Для проверки функционирования созданных классов написать программу, использующую эти классы. В программе должны быть продемонстрированы все свойства созданных классов.
Варианты МИНИМАЛЬНОГО задания
1. Определить иерархию классов для хранения информации о летательных аппаратах. Начните с общего базового класса airship, предназначенного для хранения количества перевозимых пассажиров и количества перевозимого груза. Затем создайте два производных от airship класса airplane и balloon. Класс airplane должен хранить тип самолетного двигателя (винтовой или реактивный) и дальность полета. Класс balloon должен хранить информацию о типе газа, используемого для подъема дирижабля (водород или гелий), и его максимальный потолок (в метрах). Создайте программу для демонстрации работы этой иерархии классов.
2. Создайте исходный базовый класс building для хранения числа этажей и комнат в здании, а также общую площадь комнат. Создайте производный класс house, который наследует класс building и хранит число ванных комнат и число спален. Кроме этого создайте производный класс office, который наследует класс building и хранит число огнетушителей и телефонов.
3. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе. Человек : студент, преподаватель.
4. Точка : окружность : окружность с текстом внутри (нарисовать, стереть, передвинуть, изменить радиус). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
5. Точка : отрезок : треугольник (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
6. Точка : отрезок : выпуклый четырехугольник: трапеция (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
7. Точка : отрезок : квадрат: прямоугольник: ромб : параллелограмм (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
8. Меню : горизонтальное, вертикальное, иерархическое. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
9. Окно : стековое, слоеное, всплывающее. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
10. Список : бинарное дерево : n – арное дерево. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
Пример выполнения практического задания
Постановка задачи
Создайте класс для работы с объектом ОКНО (с рамкой, тенью и текстовой строкой внутри). Иерархия классов будет такой. Базовый класс ScreenObject описывает некоторый прямоугольный объект на экране – строку, кнопку, окно, …
Его член-данные: координаты объекта и цвет объекта.
Член- функции: конструктор и функция для вывода изображения объекта.
Этот класс имеет два производных класса : String (описывающий текстовую строку) и Window (описывающий окно).
Класс String содержит такие поля как адрес начала строки и цвет букв текста, а также конструктор, вывод текста (вспомогательная функция), изображение строки на экране.
В классе Window членами- данными являются:
nmax – максимально допустимое число включаемых в окно объектов (строк, кнопок, ..) ;
n – фактическое число включенных объектов ;
pObj – массив указателей на включенные объекты ;
ColorFrame - цвет рамки окна (цвет тени – фиксированный).
Члены функции класса Window:
конструктор, рисование тени, рисование рамки, изображение всего объекта; используется также перегрузка операции << для включения в окно очередного объекта (функция возвращает 1 или 0 в качестве признака того, успешно ли включился в окно данный объект).
В примере не проводятся проверки корректности данных: не выходят ли координаты окна за рамки экрана, влезает ли объект в окно и т. п.
Структурная схема классов (представить в виде UML-диаграмм)
Член-данные | Базовый класс ScreenObject | Член-функции |
координаты левого верхнего угла: x1, y1 координаты правого нижнего угла: xr, yr цвет объекта(окна, строки, …): ColorGround | Конструктор:ScreenObject( ) Вывод изображения объекта: Show( ) смещение координат: Move ( ) | |
адрес начала строки: pText цвет букв текста: ColorText | Производный класс String(описывает текстовую строку). | Конструктор: String ( ) Вывод текста: DrawText( ) Изображение строки на экране: Show ( ) |
максимально допустимое число включаемых в окно объектов (строк, кнопок, ..):nmax фактическое число включенных объектов:n массив указателей на включенные объекты: pObj цвет рамки окна (цвет тени – фиксированный): ColorFrame | Производный класс: Window (описывает окно) | Конструктор: Window( ) Рисование тени: DrawShadow( ) Рисование рамки: DrawFrame( ) Изображение всего объекта: Show( ) Перегрузка операции << для включения в окно очередного объекта: operator << |
Исходный текст программы
// ОПИСАНИЯ КЛАССОВ
class ScreenObject
{ protected :
int x1, y1 ; // координаты левого верхнего угла
int xr, yr ; // координаты правого нижнего угла
int ColorGround ; // цвет объекта (окна, строки, …)
ScreenObject (int Xleft, int Yup, int Xright, int Ydown, int ColGround) ;
virtual void Show ( void ) ;
void Move (int Dx, int Dy) ; } ; // параметры – смещения координат
class Window : public ScreenObject
{ int nmax ;
int n ;
int ColorFrame ;
ScreenObject **pObj ;
public :
Window (int Xleft, int Yup, int Xright, int Ydown, int ColGround,
int ColFrame, unsigned MaxObj) ;
// параметры – координаты углов окна, цвет окна и рамки,
// максимально возможное число включаемых объектов
void Show ( void ) ;
void DrawFrame ( void ) ;
void DrawShadow ( void ) ;
int operator << (ScreenObject *obj) ; } ;
class String : public ScreenObject
{ char * pText ;
int ColorText ;
public :
String (int xleft, int yup, int ColGround, int ColText, char *Text) ;
void Show ( void ) ;
void DrawText ( void ) ; } ;
// РЕАЛИЗАЦИЯ КЛАССОВ
#include <stdio.h >
#include <conio.h >
// class ScreenObject
ScreenObject : : ScreenObject (int Xleft, int Yup, int Xright, int Ydown,
int ColGround)
{ x1 = Xleft ; y1 = Yup ; xr = Xright ; yr = Ydown ; ColorGround = ColGround ; }
void ScreenObject : : Show (void)
{ int i, j ;
textbackground (ColorGround) ;
for( j = y1 ; j <= yr ; j ++ ) // зафиксировали номер строки
for( ji= x1 ; i <= xr ; i ++ ) // идем по столбцам
{ gotoxy ( i, j ) ; cprintf ( “ “ ) ; } }
void ScreenObject : : Move ( int Dx, int Dy )
{ x1 += Dx ; y1 += Dy ; { xr += Dx ; yr += Dy ; }
// class String
String : : String (int xleft, int yup, int ColGround, int ColText, char *Text) :
ScreenObject (xleft, yup, xleft + strlen( Text, yup, ColGround )
{ ColorText = ColText ;
pText = new char [strlen(Text)+1] ;
if (pText) strcpy (pText, Text) ; }
void String : : DrawText ( void ) ;
{ textcolor (ColorText ) ;
gotoxy ( x1, y1 ) ;
cprintf ( “%s “ , pText) ; }
void String : : Show ( void )
{ ScreenObject : : Show ( ) ; // рисуем пустой прямоугольник для
DrawText ( ) ; } // строки и пишем в нем текст
// Class Window
Window : : Window (int Xleft, int Yup, int Xright, int Ydown, int ColGround,
int ColFrame, unsigned MaxObj) :
ScreenObject (int Xleft, int Yup, int Xright, int Ydown, int ColGround)
{ ColorFrame = ColFrame ;
nmax = MaxObj ;
pObj = new ScreenObject *[nmax] ; // выделяем память под массив указателей
if ( ! pObj) nmax = 0 ; // если не хватает памяти
n = 0 ; }
void Window : : DrawFrame (void)
{ int i ;
textcolor (ColorFrame ) ;
for (i = x1 ; i <= xr ; i++)
{ gotoxy ( i, y1 ) ; cprintf ( “_ “) ; // верхняя линия
gotoxy ( i, yr ) ; cprintf ( “_”) ; // нижняя линия рамки окна }
for (i = y1+1 ; i < yr ; i++)
{gotoxy ( x1, i ) ; cprintf ( “_ “) ; // левая часть
gotoxy ( xr, i ) ; cprintf ( “_”) ; // правая часть рамки окна } }
void Window : : DrawShadow (void)
{ int i ;
textcolor (BROUN) ;
for (i = x1 +1 ; i <= xr+1 ; i++)
{ gotoxy ( i, yr+1 ) ; cprintf ( “_ “) ; // нижняя часть тени }
for (i = y1+1 ; i <= yr ; i++)
{gotoxy ( xr+1, i ) ; cprintf ( “_ “) ; // правая часть тени } }
int Window : : operator << (ScreenObject *obj )
{ if (n = = nmax) return 0 ; //объект не может быть включен
pObj[n] = obj ;
n++ ;
obj -> Move (x1, y1 ) ;
return 1 ; }
void Window : : Show (void)
{ int i ;
ScreenObject : : Show ( ) ;
DrawShadow ( ) ;
DrawFrame ( ) ;
for { i = 0 ; i < n ; i++) // выводим все объекты, включенные в окно
pObj[i] -> Show ( ) ; // здесь используется виртуальность функцииShow( ),
// т.к. в pObj могут быть адреса разных объектов –
// строк, кнопок, окон, …, но все они – производные от ScreenObject
}
void main( )
{
Window *wn ;
String *str ;
// рисуем синее окно с белой рамкой; в нем – три зеленые строки с
// надписями черными буквами
wn = new Window (5, 5, 20, 20, BLUE, WHITE, 5) ;
// фактические параметры функции new String( ) содержат координаты
// относительно левого верхнего угла окна
str = new String(2, 2, GREEN, BLACK, “Xа-Xа”) ;
*wn << str ;
str = new String(4, 4, GREEN, BLACK, “Xи-Xи”) ;
*wn << str ;
str = new String(6, 6, GREEN, BLACK, “Xо-Xо”) ;
*wn << str ;
wn -> Show ( ) ;
getch ( ) ;
}