Метод решения
В решении задачи были использованы:
Операторы:
Условный оператор if
Операторы цикла с предусловием while и for
Объекты:
Объект ввода cin
Объект вывода cout
Объект ob_app класса app - объект-приложение
Объекты SampleClass1, SampleClass2 (имена и количество задаются пользователем)
Класс Base
Свойства:
string name - имя объекта, protected
Base* parent - указатель на головной объект, private
vector children - список детей, public
Методы:
Base (Base*, string name) - конструктор класса, определяющий имя и головной объект
void vertical_print (int depth) - вывод иерархии
Base* find (string name) - поиск объекта в иерархии
Класс App
Свойства: -
Методы:
App (Base* parent) - конструктор класса
void Build_tree_objects() - заполнение иерархии
int exec_app() - запуск приложения
5. Класс SampleClass1
Свойства: -
Методы:
1. SampleMetod1(Base* parent, std::string name) - пустой конструктор класса
6. Класс SampleClass2
Свойства: -
Методы:
1. SampleMetod2(Base* parent, std::string name) - пустой конструктор класса
Иерархия наследования отображена в таблице 1.
Таблица 1. «Описание иерархии наследования классов»
№ |
Имя класса |
Классы-наследники |
Модификатор доступа при наследовании |
Описание |
Номер |
Комментарии |
1 |
Base |
|
|
Базовый класс. Содержит основные поля и методы. |
|
|
App |
public |
|
2 |
|
||
SampleClass1 |
public |
|
3 |
|
||
SampleClass2 |
public |
|
4 |
|
||
2 |
App |
|
|
Класс приложения (необходим для запуска и работы программы) |
|
|
3 |
SampleClass1 |
|
|
Дочерний класс, подчиненный классу Base |
|
Класс с функционалом вывода нформации |
4 |
SampleClass2 |
|
|
Дочерний класс, подчиненный классу Base |
|
Класс с функционалом вывода информации |
Описание алгоритма
Согласно этапам разработки, после определения необходимого инструментария в разделе «Метод», составляются подробные описания алгоритмов для методов классов и функций.
Функция: main
Функционал: Точка входа в программу Параметры: нет
Возвращаемое значение: int (ошибка) Алгоритм функции представлен в таблице 2. Таблица 2. Алгоритм функции main
№ |
Предикат |
Действия |
|
Комментарий |
1 |
|
Создаём объект ob_app класса app с параметорм nullptr |
2 |
|
2 |
|
Вызываем метод Build_tree_objects для объекта ob_app |
3 |
|
3 |
|
Вызываем метод exec_app для объекта ob_app |
Ø |
|
Класс объекта: App Модификатор доступа: public Метод: exec_app Функционал: Вывод иерархии
Параметры: нет
Возвращаемое значение: void
Алгоритм метода представлен в таблице 3. Таблица 3. Алгоритм метода exec_app класса App
№ |
Предикат |
Действия |
|
Комментарий |
1 |
|
Создаём переменную i и инициализируем её нулём |
2 |
|
2 |
|
Выводим this name |
3 |
|
3 |
Результат выполнения метода horizontal_print с параметрами i, i!=1 равен true |
i увеличиваем на единицу |
3 |
|
|
Возвращаем ноль |
Ø |
|
Класс объекта: App
Модификатор доступа: public
Метод: Build_tree_objects
Функционал: Заполнение иерархии
Параметры: нет
Возвращаемое значение: void
Алгоритм метода представлен в таблице 4.
Таблица 4. Алгоритм метода Build_tree_objects класса App
№ |
Предикат |
Действия |
|
Комментарий |
1 |
|
Объявляем строковый rootname |
2 |
|
2 |
|
Ввод значения rootname |
3 |
|
3 |
|
this name присваиваем значение name |
4 |
|
4 |
|
Создаём объект root класса Base с параметрами this и rootname |
5 |
|
5 |
|
Объявляем целочисленную i и инициализируем нулём |
6 |
|
6 |
|
Объявляем строковые parent и child |
7 |
|
7 |
|
Увеличиваем i на единицу |
8 |
|
8 |
|
Вводим parent и child |
9 |
|
9 |
parent не равен child и i нечётное |
Создаём объект temp класса SampleClass1 с параметрами Find(parent) и child |
11 |
|
|
|
10 |
|
|
10 |
parent не равен child и i чётное |
Создаём объект temp класса SampleClass2 с параметрами Find(parent), child |
11 |
|
|
|
11 |
|
|
11 |
parent не равен child |
|
7 |
|
|
|
Ø |
|
Класс объекта: Base
Модификатор доступа: public
Метод: Base
Функционал: Конструктор класса
Параметры: Base* parent (указатель на род. объект), string name (имя объекта) Возвращаемое значение: void
Алгоритм метода представлен в таблице 5. Таблица 5. Алгоритм метода Base класса Base
№ |
Предикат |
Действия |
|
Комментарий |
1 |
|
this parent присваиваем значение parent |
2 |
|
2 |
|
this name присваиваем значение name |
3 |
|
3 |
|
this children присваиваем значение vector<Base*> |
4 |
|
4 |
this parent не равно nullptr |
Вызываем метод push_back для вектора children с параметром this parent |
Ø |
|
|
|
Ø |
|
Класс объекта: Base
Модификатор доступа: public
Метод: horizontal_print
Функционал: Вывод иерархии
Параметры: int depth (тек. глубина), bool nextline(крит. переноса строки) Возвращаемое значение: bool
Алгоритм метода представлен в таблице 6.
Таблица 6. Алгоритм метода horizontal_print класса Base
№ |
Предикат |
Действия |
|
Комментарий |
1 |
depth равна нулю и children.size больше нуля |
|
2 |
|
|
|
7 |
|
|
2 |
nextline равно нулю |
Выводим endl |
3 |
|
|
|
3 |
|
3 |
|
Выводим name |
4 |
|
4 |
|
Объявляем целочисленную i и инициализируем нулём |
5 |
|
5 |
i меньше children.size |
Выводим name для children[i] |
6 |
|
6 |
|
Возвращаем true |
Ø |
|
|
i увеличиваем на единицу |
5 |
|
|
7 |
depth равна нулю и children.size равно нулю |
Возвращем false |
Ø |
|
|
|
8 |
|
|
8 |
|
Объявляем логическую res и инициализируем её ложью |
9 |
|
9 |
|
Объявляем целочисленную i и инициализируем её нулём |
10 |
|
10 |
i меньше children.size |
|
11 |
|
|
|
13 |
|
|
11 |
При выполнении метода horizontal_print с параметрами depth- 1, nextline для children[i] получаем истину |
res присваиваем значение истины |
12 |
|
|
|
12 |
|
|
12 |
|
Увеличиваем i на единицу |
10 |
|
13 |
|
Возвращаем res |
Ø |
|
Класс объекта: Base
Модификатор доступа: public
Метод: Find
Функционал: Поиск объекта в иерархии
Параметры: string name (имя искомого объекта) Возвращаемое значение: Base* (указатель на искомый объект) Алгоритм метода представлен в таблице 7.
Таблица 7. Алгоритм метода Find класса Base
№ |
Предикат |
Действия |
|
Комментарий |
1 |
this name равно name |
Возвращаем this |
Ø |
|
|
|
2 |
|
|
2 |
|
Объявляем целочисленную i и инициализируем нулём |
3 |
|
3 |
i меньше children.size |
Объявляем указатель buff и инициализируем результатом выполнения метода Find с параметром name для children[i] |
4 |
|
|
|
6 |
|
|
4 |
buff не равно nullptr |
Возвращаем buff |
Ø |
|
|
|
5 |
|
|
5 |
|
Увеличиваем i на единицу |
3 |
|
6 |
|
Возвращаем nullptr |
Ø |
|
