Пример выполнения практического задания

Задание 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 ( ) ;

}