Student.gomel.by
На главную ... Контакты ... Университеты ... Частые вопросы ...
Заказать курсовую ...
Репетитор по информатике ...
Условия ...
Так сколько же стоит?


Организация программ с использованием классов



ЦЕЛЬ ЗАДАНИЯ


1. Изучение средств языка С++ для определения новых типов данных через механизм классов.
2. Получение навыков в написании программ с использованием классов.

МЕТОДИЧЕСКИЕ УКАЗАНИЯ


Разработать программу, реализующую абстрактный тип данных, через механизм классов (для демонстрации использовать библиотеки graphics.h и conio.h).

А. Минимальное задание

1. Составить программу с использованием классов для реализации "бегущей" точки из левого верхнего угла экрана в нижний правый угол экрана по строкам. Цвет точки выбирается произвольно. Продемонстрировать работу двух конструкторов: обычного конструктора и конструктора по умолчанию. Сделать выводы.
2. Для классов:


class Point {int x,y;
public:
Point (int a, int b) {x=a; y=b; };
…..
};

class Rect {Point lt, rb;
public:
Rect (Point a, Point b):lt(a), rb(b){ };
void draw(void);
};

доопределить соответствующие член-функции таким образом, чтобы, объявив в main-программе объект класса Rect, вызовом функции draw() можно было бы вычертить на экране прямоугольник с указанием заданных размеров с помощью псевдографических символов. Сделать выводы.


Требуемые библиотечные функции из conio.h: gotoxy(x,y) и putch(ch).


Б. Основное задание

– Выбрать объект. Объект выбирается согласно варианта.
– Спроектировать класс для программного представления таких объектов.
– Нарисовать его схему в нотации UML.


ВАРИАНТЫ ОСНОВНОГО ЗАДАНИЯ

1. Создайте класс, который содержит информацию об имени и адресе. Храните всю эту информацию в символьных строках закрытой части класса. Включите в класс открытую функцию для запоминания имени и адреса, а также открытую функцию, которая выводит эти имя и адрес на экран.

2. Создайте класс, который поддерживает каталог библиотечных карточек. Этот класс должен хранить заглавие книги имя автора и выданное на руки число экземпляров книги. Заглавие и имя автора храните в виде строки символов, а количество экземпляров в виде целого числа. Включите в класс открытую функцию для запоминания информации о книгах, а также открытую функцию, которая выводит информацию на экран.

3. Создайте класс, реализующий стек символов. Сделайте стек длиной 10 символов. Члены класса: стек (массив символов), индекс вершины стека. Обязательны функции-члены класса для инициализации стека (присваивает индексу нулевое значение), помещения значения в стек, выталкивания значения из стека. Продемонстрировать использование класса.

4. Создайте класс, с циклической очередью целых. Сделайте очередь длиной 100 целых. Члены класса: очередь (массив целых чисел), индекс вершины и индекс хвоста. Обязательны функции-члены класса для инициализации очереди (присваивает индексам нулевые значения), помещения значения в очередь, удаления значения из очереди. Продемонстрировать использование класса.

5. Создайте класс для имитации секундомера. Члены класса: переменные типа double для хранения начального и конечного значения времени. Обязательны функции- члены класса для инициализации секундомера (присваивает переменным нулевые значения), для запуска и остановки секундомера, для вывода на экран величины истекшего времени.

6. Определить класс эллипс, а также продемонстрировать использование класса. Члены класса: переменные, необходимые для того, чтобы иметь возможность пользоваться стандартными функциями рисования. Обязательны функции-члены класса: нарисовать, стереть, передвинуть эллипс, изменить радиусы эллипса.

7. Определить класс отрезок, а также продемонстрировать использование класса. Члены класса: переменные, необходимые для того, чтобы иметь возможность пользоваться стандартными функциями рисования. Обязательны функции-члены класса: нарисовать, стереть, передвинуть отрезок, вращать отрезок относительно его середины или описывать окружность одним его концом.

8. Определить класс треугольник, а также продемонстрировать использование класса. Члены класса: переменные, необходимые для того, чтобы иметь возможность пользоваться стандартными функциями рисования. Обязательны функции-члены класса: нарисовать, стереть, передвинуть треугольник, вращать треугольник относительно его вершины, изменить размеры треугольника.

9. Определить класс трапеция, а также продемонстрировать использование класса. Члены класса: переменные, необходимые для того, чтобы иметь возможность пользоваться стандартными функциями рисования. Обязательны функции-члены класса: нарисовать, стереть, закрасить, передвинуть, повернуть трапеции, изменить размеры трапеции.

10. Определить класс ромб, а также продемонстрировать использование класса. Члены класса: переменные, необходимые для того, чтобы иметь возможность пользоваться стандартными функциями рисования. Обязательны функции-члены класса: нарисовать, стереть, закрасить, передвинуть, повернуть ромб, изменить размеры ромба.

11. Вектор в трехмерном евклидовом пространстве задан своими полярными координатами. Обязательны функции - члены класса:
- ввод вектора;
- вывод вектора;
- функция, которая возвращает рабочий вектор в декартовых координатах.
Другие функции можно ввести по желанию. Описать класс и продемонстрировать его использование.

12. Угол на плоскости. Обязательные члены класса: величина угла в градусах; функции-члены для ввода и вывода величины угла, перевода величины угла в радианы, нахождения синуса угла. Описать класс и продемонстрировать его использование.

13. Комплексное число, задаваемое своей вещественной и мнимой частями (например, 5 + 3i задается парой (5, 3)). Обязательны функции-члены класса для ввода и вывода числа, сложения, произведения двух чисел, а также возведения числа в целую степень. Описать класс и продемонстрировать его использование.

14. Комплексное число, задаваемое своим модулем и углом (например, число 10* (cos(p/6) + i* sin(p/6)) задается парой (10, p/6)). Обязательны функции-члены класса для ввода и вывода числа, сложения, произведения двух чисел, а также возведения числа в целую степень. Описать класс и продемонстрировать его использование.

15. Кольцевой буфер емкостью 1024 вещественных чисел. Доступ к элементам буфера – как к элементам очереди. Обязательны функции-члены класса для инициализации буфера, добавления и удаления элемента, определения количества свободного и занятого пространства в буфере. Описать класс и продемонстрировать его использование.

16. Стек вещественных чисел. Обязательны функции-члены класса для добавления и удаления элемента, проверке присутствия указанного элемента, вывода текущих элементов стека. Описать класс и продемонстрировать его использование.

17. Двунаправленный список. Обязательны функции-члены класса для добавления и удаления элемента, проверке присутствия указанного элемента, вывода текущих элементов списка. Описать класс и продемонстрировать его использование.

18. Кольцевой список. Обязательны функции-члены класса для добавления и удаления элемента, проверке присутствия указанного элемента, вывода текущих элементов списка. Описать класс и продемонстрировать его использование.

19. Бинарное дерево. Обязательны функции-члены класса для добавления и удаления элемента, проверке присутствия указанного элемента, вывода текущих элементов дерева. Описать класс и продемонстрировать его использование.

20. Точка на экране в текстовом (или графическом режиме). Должны быть предоставлены возможности:
- высветить точку в определенном месте экрана определенным цветом;
- определить, видима ли точка в данный момент;
- получить координаты точки после поворота отрезка, соединяющего эту точку с началом координат, на заданный угол.
Описать класс и продемонстрировать его использование.


ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ


ПОСТАНОВКА ЗАДАЧИ


Создать класс, позволяющий работать со строкой символов. Набор данных, описывающий такой объект как символьная строка должен состоять:

- собственно строка;
- позиция на экране, начиная с которой будет выводиться строка;
- видео атрибуты символов (цвета текста и фона).

Функции необходимые для работы со строкой:

- ввод строки;
- установка координат для дальнейшего вывода строки;
- установка видео атрибутов символов;
- вывод строки в указанное место.


СТРУКТУРНАЯ СХЕМА КЛАССА


ЧЛЕН-ДАННЫЕ

Класс


String ЧЛЕН-ФУНКЦИИ


Собственно строка: str
Позиция выдачи строки на экран: x, y
Цвет текста и фона: attr Ввод строки: SetStr()
Установка координат выдачи строки на экран: SetCoord()
Установка цветов текста и фона: SetAttr()
Вывод строки на экран: PrintStr()


ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ


#include
#include
class String {
char str[80]; // Член-данные класса имеют доступ private
int attr; // т.е., доступны только через член-функции
int col, row; // класса, которые объявлены общедоступными
public:
void SetAttr(int a) {attr = a;}
void SetStr(char*s) {strcpy(str, s);}
void SetCoord(int x, int y) {row = y; col = x;}
void PrintStr(int = 0, int = 0); //Использованы аргументы по умолчанию
};
inline void String:: PrintStr(int x, int y)
{ textattr(attr);
gotoxy(x = = 0 ? col: x, y = = 0 ? row: y);
cputs(str); }
// Демонстрационная программа
void main (void)
{ String Str,*sp = &Str;
Str.SetAttr((BLUE<<4) + YELLOW); //Пишем желтым по синему фону
Str.SetStr(“Hello, USER !!!”);
sp ->PrintStr (5,20); }
РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ
(20 пустых строк)
(5 пробелов) Hello, USER!!!
ВЫВОДЫ ………


Организация программ с использованием перегрузки функций. Использование механизма перегрузки операций в программах



ЦЕЛЬ ЗАДАНИЯ


1. Изучение механизма перегрузки функций.
2. Получение навыков в написании программ с использованием перегрузки конструкторов.
3. Изучение механизма перегрузки операций.
4. Получение навыков в написании программ с использованием перегрузки операций для объектов, введенных пользователем.


МЕТОДИЧЕСКИЕ УКАЗАНИЯ


Разработать программы, реализующие механизмы перегрузки функций и операций для объектов, введенных пользователем.


А. Минимальные задания:


Варианты задания 2.1
1. Создайте функцию sroot (), которая возвращает квадратный корень своего аргумента. Перегрузите sroot () тремя способами: чтобы получить квадратный корень целого, длинного целого и числа с плавающей точкой двойной точности. Для подсчета квадратного корня используйте стандартную библиотечную функцию sqrt ().
2. Создайте функцию sleep () , приостанавливающую работу компьютера на столько секунд, сколько указано в аргументе функции. Перегрузите sleep () так, чтобы она могла вызываться или с целым, или со строкой, задающей целое. Например, оба этих вызова должны заставить компьютер остановиться на 15 секунд: sleep (15); sleep (“15”);
3. Создайте функцию min () ,которая возвращает наименьший из двух численных аргументов, используемых при вызове функции. Перегрузите min () так, чтобы она воспринимала в качестве аргументов символы, целые и действительные двойной точности.
4. Создайте функцию r_str () для изменения порядка следования символов строки на обратный. Перегрузите r_str () так, чтобы она могла вызываться с одним или с двумя символьными строками. Если функция вызывается с одной строкой, то операция должна осуществляться с ней. Если она вызывается с двумя строками, то результирующая строка должна оказаться во втором аргументе, а первый аргумент остается без изменений.
5. Создайте функцию prompt () для выдачи подсказки пользователю и ожидания ввода данного. Перегрузите функцию prompt () так, чтобы она осуществляла ввод данных типов int, double, long.
6. Дано неполное определение класса:

class strt () {
char*p;
int len;
public:
char*getstring () { retutn p; }
int*getlength () { retutn len; } };

Добавьте в это определение два конструктора в первом не должно быть параметров. Он должен выделять255 байтов памяти, инициализировать эту память нулевой строкой и устанавливать переменную len равной 255. во втором конструкторе должно быть два параметра. Первый – это строка, используемая при инициализации, второй – число выделяемых байтов. Во второй версии конструктора должно выделяться заданное количество памяти, в которую помещается копия строки. Реализуйте полный контроль границ массива и, разработав программу вывода, показать, что оба конструктора работают, как задумано.
7. Создайте класс stopwatch для эмитации секундомера. Используйте конструктор для начальной установки секундомера в 0. Образуйте две член-функции start () и stop () соответственно для запуска и остановки секундомера. Включите в класс член – функцию show () для вывода на экран величины истекшего промежутка времени. Перегрузите конструктор для доступа к системному времени через стандартную функцию clock (). Покажите что оба конструктора работают.
8. Дано неполное определение класса date:

class date {
int day, month, year;
public:
// здесь конструкторы и функция для вывода на экран даты
};

Перегрузите конструктор двумя способами. В первом случае данные задаются в виде строки символов, в другом случае в виде трех целых. Покажите, что оба конструктора работают.
9. На основании класса date, описанного в предыдущем задании, перегрузите конструктор date ()в другом случае так, чтобы он имел параметр типа time_t. (time_t. - это тип данных, определенный стандартными библиотечными функциями времени и даты компилятора С++.)
10. Пусть дано следующее неполное описание класса, добавьте конструкторы так, чтобы оба объявления в функции main () были правильны. (необходимо дважды перегрузить конструктор samp ().)

class samp {
int a;
public:
// добавьте конструкторы
int get_a () { return a; } };
int main ()
{ samp ob (88); // инициализация объекта значением 88
samp obarr [10]; // неинициализируемый 10-элементный массив
// }


Б. Основное задание

Варианты основного задания

1. Вектор в пятимерном евклидовом пространстве задается пятеркой своих координат. Реализовать:
a) сложение (вычитание) векторов;
b) скалярное произведение векторов;
c) векторное произведение векторов (операция %);
d) умножение вектора на скаляр.
Опишите класс и операции для работы с объектами этого класса. Продемонстрируйте выполнение операций.
2. Создать класс “вектор_целых_чисел”, определить для него операции:
a) ввод элементов вектора с консоли (оператор >>);
b) вывод элементов вектора на экран или в файл (оператор <<);
c) доступ к заданному элементу (оператор []);
Продемонстрируйте выполнение операций с объектами этого класса.
3. Создать класс “вектор_целых_чисел”, определить для него операции:
a) сложение векторов с сохранением значения в одном из них (операция +=);
b) сложение векторов с сохранением значения в новом векторе (операция +);
c) вычитание векторов с сохранением значения в одном из них (операция -=);
Продемонстрируйте выполнение операций с объектами этого класса.
4. Создать класс “Строка символов”. Реализовать операции:
a) сравнение строк (операция = =);
b) удаления из строки указанного символа (операция -);
c) переворота строки (операция ~).
Кроме того членом класса сделать также функцию с именем strset () для удаления из первой строки всех символов, встречающихся во второй строке.
Продемонстрируйте выполнение операций с объектами этого класса.
5. Создать класс “Строка_Си”, определить для него операции:
a) слияния строк (операция +);
b) сравнение строк на равенство (операция = =);
c) удаления из строки подстроки (операция -);
d) удаления из строки всех символов, содержащихся в строке-делителе (операция /);
e) копирования строки
f) функцию at (char*substr, char*dest, int i), возвращающую номер позиции i-того вхождения строки substr в строкуdest.
Продемонстрируйте выполнение операций с объектами этого класса.
6. В британском формате дата задается как число/месяц/год. Реализовать с учетом високосных годов:
a) сложение даты и определенного пользователем количества дней;
b) вычитание из даты определенного пользователем количества дней;
c) вычитание числа дней, прошедших между двумя датами (оператор %).
Опишите класс и операции для работы с объектами этого класса. Продемонстрируйте выполнение операций.
7. Время задается в формате час.минута.секунда.. Реализовать следующие операции (учесть переход через 24ч):
a) сложение времени и определенного пользователем количества секунд;
b) вычитание из времени указанного пользователем количества секунд;
c) вычитание из одного момента времени другого;
d) подсчет числа секунд, между двумя моментами времени, лежащими в пределах одних суток (оператор %).
Опишите класс и операции для работы с объектами этого класса. Продемонстрируйте выполнение операций.
8. Ввести класс для работы с прямоугольной матрицей. Реализовать операции:
a) сложение (вычитание) двух матриц (операции +, -);
b) умножение двух матриц (операции*);
c) функцию det () вычисления определителя матрицы;
d) функцию ort () проверки ортогональности строк матрицы;
e) функцию transp () получения транспонированной матрицы.
Продемонстрируйте выполнение операций с объектами этого класса.
9. Ввести класс для работы с прямоугольной матрицей. Реализовать операции:
a) ввод матрицы с консоли (оператор >>);
b) вывод матрицы на экран или в файл (оператор <<);
c) доступ к элементу (оператор [] []);
d) функцию revers () получения обратной матрицы;
e) функцию self_value () получения собственных значений матрицы;
f) функцию self_vector () получения собственных значений матрицы.
Продемонстрируйте выполнение операций с объектами этого класса.
10. Создать класс “система линейных уравнений”, определить для него операции:
a) решение системы методом Гаусса;
b) решение системы методом Крамара;
Продемонстрируйте выполнение операций с объектами этого класса.


ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗАДАНИй


ПОСТАНОВКА ЗАДАЧИ

Создайте класс, для хранения целого числа. Класс содержит член-функцию, возвращающую значение член-данного. Перегрузите конструктор для обеспечения выбора способа инициализации объекта.


СТРУКТУРНАЯ СХЕМА КЛАССА (ПРЕДСТАВИТЬ В ВИДЕ UML-ДИАГРАММ)


ЧЛЕН-ДАННЫЕ

КЛАСс
mycl ЧЛЕН-ФУНКЦИИ


Целое число: x
Конструктор по умолчанию: mycl()
Конструктор с инициализацией:
mycl (int n)
Вывод значения: getx()


ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ


#include
class mycl
{ int x;
public:
// перегрузка конструктора двумя способами
mycl () { x = 0;} // нет инициализации
mycl (int n) { x = n;} // инициализация
int getx () { return x; } };
int main ()
{ mycl a1 (5); // объявление объекта а1 с начальным значением
mycl a2; // объявление объекта а2 без начального значения
cout << " значение a1: " << a1. getx () << '\n';
cout << " значение a2: " << a2. getx () << '\n';
return 0; }


РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРОГРАММЫ


значение a1: 5
значение a2: 0


Организация программ с использованием механизма наследования классов



ЦЕЛЬ ЗАДАНИЯ


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 #include // 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 ();
}


Организация программ с использованием виртуальных функций и абстрактных базовых классов



ЦЕЛЬ ЗАДАНИЯ


1. Изучение механизма динамического связывания.
2. Получение навыков в использовании виртуальных функций.
3. Изучение принципов построения абстрактных базовых классов и производных классов, созданных на основе базовых.
4. Получение навыков в разработке абстрактных классов с применением чисто виртуальных функций, в построении производных классов с использованием открытого наследования.


А. Минимальное задание

1. Имеется первичный (основной) базовый класс A:
class A {
int i;
char c;
char v[10];
public:
A(int ni=0,char nc=’*’) {cout< ~A() {cout< Реализуйте иерархии классов, представленные "деревьями".

Член-данное класса В1: вещественное двойной точности. Член-данные класса В2: вещественное. Член-данное класса С: длинное целое. Классы B1, B2, C должны содержать соответствующие конструкторы и деструкторы аналогичные классу A. Напишите демонстрационную программу, которая поочередно создает объекты классов A, B1, B2, C и выдает их размеры в памяти. Объясните полученные результаты.
2. Составить программу с использованием множественного наследования для изображения на экране дисплея прямоугольника, с текстом внутри, следующего содержания: "GRUPPA 417415". При составлении программы использовать иерархию классов.
Класс Point должен быть виртуальным базовым классом. Для всех классов иерархии определите конструкторы и член-функции в целях перемещения, показа и стирания соответствующих объектов.
Класс Point должен содержать член-данные, характеризующие координаты и цвет точки. Класс Rect должен содержать член-данные, характеризующие координаты левого вернего и правого нижнего углов. Класс Message должен содержать член-данные, характеризующие тип шрифта и адрес сообщения в памяти. Класс MR может не содержать собственных член-данных.
3. Напишите программу создания базового класса num. В этом классе должно храниться целое и определена виртуальная функция shownum(). Создайте два производных класса outhex и outoct, которые наследуют класс num. Функция shownum() должна быть переопределена в производных классах так, чтобы осуществлять вывод на экран значений, в шестнадцатеричной и восьмеричной системах счисления соответственно.
4. Напишите программу, в которой базовый класс dist используется для хранения в переменной типа double расстояния между двумя точками. В классе dist создайте виртуальную функцию trav_time(), которая выводит на экран время, необходимое для прохождения этого расстояния с учетом того, что расстояние задано в милях, а скорость равна 60 миль в час. В производном классе metricпереопределите функцию trav_time() так, чтобы она выводила на экран время, необходимое для прохождения этого расстояния, считая теперь, что расстояние задано в километрах, а скорость равна 100 километров в час.
5. Напишите программу создания базового класса area. В этом классе должны храниться две переменные типа double, определяющие размеры фигуры (например, высота и ширина), определена функция setar(), задающая значения переменным, и определена виртуальная функция getar(). Создайте два производных класса rectangle и triangle, которые наследуют класс area. Функция getar() должна быть переопределена в производных классах так, чтобы возвращать площадь фигуры, вид которой задается в производном классе.
6. Создать иерархическую структуру классов “точка”, “четырехугольник”, “линия”, “окружность”, “полигон”. Определить для них следующие операции:
a) прорисовки;
b) перемещения с заданной скоростью в заданном направлении;
c) вращения вокруг заданной точки;
d) масштабирования.
Организовать движение этих фигур до нажатия клавиши.
7. Разработать программу, моделирующую поведение двух стай рыб, одна из которых является хищником для другой. Представители обеих стай могут “видеть” друг друга в заданном радиусе, изменять в определенных пределах скорость и направление движения. Для стай определены коэффициенты естественной смертности и рождаемости. “Хищники” могут преследовать и “поедать” “жертв”, если окажутся в непосредственной близости. Для визуализации модели воспользуйтесь классами, определенными в предыдущей задаче (“точка”, “четырехугольник”, “линия”, “окружность”, “полигон”).
8. Создать иерархию классов для моделирования взаимодействия “Магазин-склад- Заказчик”. В распоряжении магазина имеется:
§ Склад с товарами различных наименований, стоимости и веса;
§ Гараж с машинами различной грузоподъемности, вместительности и потребляемой мощности.
В магазин поступают заказы на поставку определенного количества товаров различных наименований в заданный район (задается как расстояние между магазином и районом). Магазин должен выбрать наиболее подходящее транспортное средство (учитывать, что машины могут быть заняты другими заказчиками) и определить счет за поставку товара.
9. Создать иерархию классов следующих элементов интерфейса: “Окно”, “Кнопка”, ‘’Меню”, “Окно редактирования”, ‘Окно вывода текста или графики”, “Кнопка-перключатель”, “Кнопка-Активизатор”, “Радиокнопка”. С помощью созданных классов построить интерфейс к задаче о двух стаях рыб 10. Создать иерархию классов и запрограммировать компьютерную игру “Морской бой”. Игровое поле разбивается на клетки. Палуба корабля занимает одну клетку. Кораблем считается совокупность смежных клеток. Допускаются четыре категории кораблей: одно-, двух-, трех- и четырехпалубные. Двух-, трех- и четырехпалубные корабли могут иметь всевозможные конфигурации и ориентации на игровом поле. Не допускается размещение кораблей в смежных клетках.


Б. Основное задание

Каждое задание состоит из двух частей. Одна часть общая для всех вариантов описана в преамбуле. Вторая часть, индивидуальная, описана в нумерованном списке.
Преамбула. Используя абстрактный базовый класс "фигура", разработанный самостоятельно, определить класс, описанный ниже. Предусмотреть следующие действия с объектами создаваемого класса:
1. динамическое создание объектов, в том числе создание массивов объектов;
2. динамическое уничтожение объектов;
3. изменение параметров объекта (цвет, размер, координаты и т.п.);
4. отображение объектов на экране.


ВАРИАНТЫ ОСНОВНОГО ЗАДАНИЯ


1. Окружность с начерченным радиусом.
2. Эллипс с начерченными диаметрами.
3. Квадрат с начерченными диагоналями.
4. Треугольник.
5. Правильный шестиугольник.
6. Прямоугольник с начерченными диагоналями.
7. Окружность, вписанная в квадрат.
8. Эллипс, вписанный в прямоугольник.
9. Равнобедренный треугольник.
10. Ромб с начерченными диагоналями.


ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ


ПОСТАНОВКА ЗАДАЧИ


Для классов “Точка” и ”Окружность” определить виртуальную функцию 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 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;}

Организация программ с использованием шаблонов



ЦЕЛЬ ЗАДАНИЯ


1. Изучение средств языка С++, используемых для создания параметрических типов, т.е. типов, которые выполняются по-разному в зависимости от параметров, переданных при создании класса.
2. Получение навыков в написании программ с использованием шаблонов.


ВАРИАНТЫ ЗАДАНИЯ

1. Создать шаблон класса «стек». Использовать его при решении следующей задачи:
Описать класс, реализующий стек. Написать программу, использующую этот класс для моделирования Т-образного сортировочного узла на железной дороге. Программа должна разделять на два направления состав, состоящий из вагонов двух типов (на каждое направление формируется состав из вагонов одного типа). Предусмотреть возможность формирования состава из файла и с клавиатуры.
2. Создать шаблон класса «стек». Использовать его при решении следующей задачи:
Составить программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат либо открыт, либо закрыт. Вход в закрытый квадрат запрещен. Если квадрат открыт, то вход в него возможен со стороны, но не с угла. Каждый квад¬рат определяется его координатами в матрице. Программа находит проход через лабиринт, двигаясь от заданного входа. После отыскания прохода программа выводит найденный путь в виде координат квад¬ратов. Для хранения пути использовать стек.
3. Создать шаблон класса «стек». Использовать его при решении следующей задачи:
Гаражная стоянка имеет одну стояночную полосу, причем въезд и выезд находятся в одном конце полосы. Если владелец автомашины приходит забрать свой авто¬мобиль, который не является ближайшим к выходу, то все автомашины, загора¬живающие проезд, удаляются, машина данного владельца выводится со стоянки, а другие машины возвращаются на стоянку в исходном порядке. Написать программу, которая моделирует процесс прибытия и отъезда машин. Прибытие или отъезд автомашины задается командной строкой, которая содер¬жит признак прибытия или отъезда и номер машины. Программа должна вы¬водить сообщение при прибытии или выезде любой машины. При выезде авто¬машины со стоянки сообщение должно содержать число раз, которое машина удалялась со стоянки для обеспечения выезда других автомобилей.
4. Создать шаблон класса «однонаправленный линейный список». Использовать его при решении задачи:
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе содержат:
номер автобуса;
фамилию и инициалы водителя;
номер маршрута.
Программа должна обеспечивать:
начальное формирование данных о всех автобусах в парке в виде списка;
при выезде каждого автобуса из парка вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся в парке, и записывает эти данные в список автобусов, находящихся на маршруте;
при въезде каждого автобуса в парк вводится номер автобуса, и программа удаляет данные об этом автобусе из списка автобусов, находящихся на мар¬шруте, и записывает эти данные в список автобусов, находящихся в парке;
по запросу выдаются сведения об автобусах, находящихся в парке, или об ав¬тобусах, находящихся на маршруте.
5. Создать шаблон класса «однонаправленный линейный список». Использовать его при решении следующей задачи:
Составить программу, которая содержит динамическую информацию о заявках на авиабилеты. Каждая заявка содержит:
пункт назначения;
номер рейса;
фамилию и инициалы пассажира;
желаемую дату вылета.
Программа должна обеспечивать:
хранение всех заявок в виде списка;
добавление заявок в список;
удаление заявок;
вывод заявок по заданному номеру рейса и дате вылета;
вывод всех заявок.
6. Создать шаблон класса «бинарное дерево». Использовать его при решении следующей задачи:
Составить программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах содержат:
номер УДК;
фамилию и инициалы автора;
название;
год издания;
количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
начальное формирование данных о всех книгах в библиотеке в виде двоично¬го дерева;
добавление данных о книгах, вновь поступающих в библиотеку; удаление данных о списываемых книгах;
по запросу выдаются сведения о наличии книг в библиотеке, упорядоченные по годам издания.
7. Создать шаблон класса «бинарное дерево». Использовать его при решении следующей задачи:
Составить программу, которая содержит текущую информацию о заявках на авиабилеты. Каждая заявка содержит:
пункт назначения;
номер рейса;
фамилию и инициалы пассажира;
желаемую дату вылета.
Программа должна обеспечивать:
хранение всех заявок в виде двоичного дерева;
добавление и удаление заявок;
по заданному номеру рейса и дате вылета вывод заявок с их последующим удалением;
вывод всех заявок.
8. Создать шаблон класса «бинарное дерево». Использовать его для сортировки це¬лых чисел и строк, задаваемых с клавиатуры или из файла.
9. Создать шаблон класса «очередь». Написать программу, демонстрирующую работу с этим шаблоном для различных типов параметров шаблона. Программа должна содержать меню, позволяющее осуществить проверку всех методов шаблона.
10. Создать шаблон класса «очередь с приоритетами». При добавлении элемента в такую очередь его номер определяется его приоритетом. Написать программу, демонстрирующую работу с этим шаблоном для различных типов параметров шаблона. Программа должна содержать меню, позволяющее осуществить про¬верку всех методов шаблона.


ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ


ПОСТАНОВКА ЗАДАЧИ


Создать параметризованный класс одномерных массивов. Написать программу, использующую созданный шаблон для создания массивов различного типа (целых чисел, массива животных).


ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ


#include
const int DefaultSize = 10;
// объявление простого класса Animal, чтобы получить
// возможность создать массив животных
class Animal
{ public:
Animal(int);
Animal();
~Animal() {}
int GetWeight() const { return itsWeight;)
void Display() const { std::cout < < itsWeight; }
private:
int itsWeight; };
Animal:: Animal(int weight): itsWeight(weight) {…}
Animal::Animal(): itsWeight(0) { }
template // объявлен шаблон, параметром которого является тип,
// обозначенный идентификатором t
// параметрический класс
class Array { public:
// конструкторы
Array(int itsSize = DefaultSize); //принимает в качестве
//параметра размер целого числа, устанавливаемый по
//умолчанию константой DefaultSize
Array(const Array &rhs);
~Array() { delete [ ] pType; }
// операторы
Array& operator = (const Array&); //присвоения
//непостоянная версия оператора индекса
T& operator [ ] (int offSet) { return pType [ offSet ]; }
//постоянная версия оператора индекса
const T& operator [ ] (int offSet) const { return pType [ offset ]; }
// член-функции
int GetSize() const { return itsSize; }// возвращает размер массива
private:
Т*рТуре;
int itsSize; };
// далее следует реализация ...
// реализация конструктора
template Аггау<Т>:: Array(int size):
itsSize(size)
{ рТуре = new T[ size ];
for (int i = 0; i < size; i++)
pType[ i ] = 0; }
// конструктор копий
template
Array:: Array(const Array &rhs)
{ itsSize = rhs.GetSize();
pType = new T[ itsSize ];
for (int i = 0; i < itsSize; i++)
pType[ i ] = rhs[ i ]; }
// operator ‘=’
template
Array& Array:: operator=(const Array &rhs)
{ if (this == &rhs)
return*this;
delete [ ] pType;
itsSize = rhs. GetSize();
pType = new T[ itsSize ];
for (int i = 0; i < KitsSize; i++)
pType [ i ] = rhs [ i ];
return*this; }
// основная программа
int main()
{ Array theArray; // массив целых чисел
Array theZoo; // массив животных
Animal*pAnimal;
// заполнить массивы
for (int i = 0; i < theArray. GetSize(); i++)
{ theArray[ i ] = i*2;
pAnimal = new Animal(i*3);
theZoo[ i ] =*pAnimal;
delete pAnimal;
}
// вывести на экран содержимое массивов
for (int j = 0; j < theArray.GetSize(); j++)
{
Std:: cout << "theArray ["<< j << "]:\t";
Std:: cout << theArray[j] << "\t\t";
Std:: cout << "theZoo [" << j << "]:\t";
theZoo[j].Display();
std:: cout << std:: endl;
}
return 0;
}


РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ


theArray [0]: 0 theZoo [0]: 0
theArray [1]: 2 theZoo [0]: 3
theArray [2]: 4 theZoo [0]: 6
theArray [3]: 6 theZoo [0]: 9
theArray [4]: 8 theZoo [0]: 12
theArray [5]: 10 theZoo [0]: 15
theArray [6]: 12 theZoo [0]: 18
theArray [7]: 14 theZoo [0]: 21
theArray [8]: 16 theZoo [0]: 24
theArray [9]: 18 theZoo [0]: 27