85.35K
Категория: ПрограммированиеПрограммирование

Объектно-ориентированное программирование на алгоритмическом языке С++

1.

МИРЭА, Институт Информационных технологий,
кафедра Вычислительной техники

2.

Вывод дерева иерархии КВ_1
root
ob_1
ob_3
ob_4
ob_5
ob_2
ob_6
ob_7
ob_3
Входные данные
root
root ob_1
ob_1 ob_3
ob_3 ob_4
ob_3 ob_5
root ob_2

not_exsist not_exsist
Выходные данные
root
root ob_1 ob_2 ob_6 ob_3
ob_1 ob_3
ob_3 ob_4 ob_5
ob_6 ob_7
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
2

3.

Базовый класс cl_base
• Свойства:
• Наименование объекта (строкового типа) - string object_name;
• Указатель на головной объект для текущего объекта - cl_base * p_parent;
• Динамический массив указателей на подчиненные объекты
• Функционал:
• Параметризированный конструктор с параметрами: указатель на головной объект, строкового тип, содержащий наименование
создаваемого объекта (имеет значение по умолчанию);
• Метод редактирования имени объекта. Один параметр строкового типа, содержит новое наименование объекта. Если нет
дубляжа имени подчиненных объектов у головного, то редактирует имя и возвращает «истину», иначе возвращает «ложь»;
• Метод получения имени объекта; string get_object_name();
• Метод получения указателя на головной объект текущего объекта; cl_base* get_parent();
• Метод вывода наименований объектов в дереве иерархии слева направо и сверху вниз; void show_tree();
• Метод получения указателя на подчиненный объект по его имени. Если объект не найден, то возвращает nullptr. Один параметр
строкового типа, содержит наименование искомого подчиненного объекта.
3

4.

Примерная заголовочная часть базового класса
#include <string>
#include <vector>
class cl_base
{
string
object_name;
// наименование объекта
cl_base
* p_parent;
// указатель на головной объект
vector < cl_base * > children;
// указатели на подчиненные объекты
vector < cl_base * > :: iterator it_child;
public:
cl_base ( cl_base * p_parent, string o_name=”root” );
bool
set_object_name ( string
object_name );
string
get_object_name (){return object_name;}
cl_base * get_parent
(){return p_parent;}
void
show_tree
();
cl_base * get_child
( string
object_name );
};
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
4

5.

Класс приложение
Для построения дерева иерархии объектов в качестве корневого
объекта используется объект приложение. Класс объекта
приложения наследуется от базового класса. Объект приложение
реализует следующий функционал :
методы:
• построить дерево иерархии объектов;
• запустить приложение;
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
5

6.

Примерная заголовочная часть класса приложения
#include "cl_base.h"
class cl_application : public cl_base{
public:
cl_application ( );
void build_tree_objects ( );
int exec_app
( );
};
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
6

7.

Главный метод программы main()
Функция main() должна иметь следующий вид:
#include <iostream>
using namespace std;
#include "cl_application.h"
int main ( ){
cl_application
ob_application(nullptr);
ob_application.build_tree_objects ( );
return ob_application.exec_app
( );
}
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
7

8.

Примерная часть реализации базового класса
cl_base * cl_base :: get_child ( string find_object_name )
{
if ( children.size ( ) == 0 ) return nullptr;
it_child = children.begin ( );
while ( it_child != children.end ( ) ) {
if ( ( * it_child ) -> get_object_name ( ) == find_object_name ) {
return ( * it_child );
}
it_child ++;
}
return 0;
}
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
8

9.

Примерная часть реализации базового класса
bool cl_base::set_object_name(string s){
if ( children.size ( ) == 0 ){
s_object_name = s;
return true;
}
it_child = children.begin ( );
while ( it_child != children.end ( ) ) {
if ( ( * it_child ) -> get_object_name ( ) == s )
return false;
it_child ++;
}//while
object_name = s;
return true;
}//set_object_name()
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
9

10.

Примерная часть реализации базового класса
cl_base :: cl_base ( cl_base * parent, string nname ){
set_object_name ( nname );
if ( parent ) {
this -> p_parent = parent;
parent -> children.push_back ( this );
}
}
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
10

11.

Примерная часть реализации базового класса
void cl_base :: show_tree (){
if(this->children.size()==0)return;
cout << endl << this->object_name;
it_child = this->children.begin ( );
while ( it_child != this->children.end ( ) ) {
cout<< ” ” << ( * it_child ) -> object_name;
it_child ++;
}//while
it_child = this->children.begin ( );
while ( it_child != this->children.end ( ) ) {
( * it_child ) -> show_tree();
it_child ++;
}//while
}//void show_tree()
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
11

12.

Производные классы КВ_1
<…>
Для построения дерева использовать объекты двух производных классов,
наследуемых от базового.
<…>
#ifndef CL2_H
#define CL2_H
#include "cl_base.h"
class cl_2: public cl_base {
public:
cl_2(cl_base* parent, string name):cl_base(parent, name) {}
};
#endif
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
12

13.

Производные классы КВ_1
void cl_application::build_tree() {

while (true) {
cin >> parent_name >> child_name;
if (parent_name == child_name) break;
if (counter%2) {
child = new cl_2(parent, child_name);
} else {
child = new cl_3(parent, child_name);
}
++counter;
}//for
}//while()
}// void cl_application::build_tree()
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
13

14.

Производные классы КВ_1
Каждый объект на дереве иерархии имеет свое место и наименование. Не
допускается для одного головного объекта одинаковые наименования в
составе подчиненных объектов
<…>
Исключить создание объекта если его наименование совпадает с именем
уже имеющегося подчиненного объекта у предполагаемого головного
<…>
Исключить добавление нового объекта, не последнему подчиненному
предыдущего уровня
<…>
Если «имя головного объекта» равняется «имени подчиненного объекта», то
новый объект не создается и построение дерева объектов завершается
МИРЭА, Институт Информационных технологий, кафедра Вычислительной техники
14

15.

Производные классы КВ_1
void cl_application::build_tree_objects() {
string parent_name , child_name;
cin >> parent_name;
vector<cl_base*> created { this };
set_name(parent_name);
cl_base* current;
while (true) {
cin >> parent_name >> child_name;
if (parent_name == child_name) break;
for (auto c : created) {
if (c->get_name() == parent_name && !c->get_child(child_name)) {
if (c->get_parent() && c->get_parent()->children.size() !=
0 && *(c->get_parent()->children.end() - 1) != c) break;
if (created.size() % 2) {
current = new cl_2(c, child_name);
} else {
current = new cl_3(c, child_name);
}
created.push_back(current);
break;
}
}//for
}//while
}//
15
English     Русский Правила