Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Для организации иерархического построения объектов необходимо разработать базовый класс, который содержит функционал и свойства для построения иерархии объектов.
- В последующем, в приложениях использовать этот класс как базовый для всех создаваемых классов. Это позволит включать любой объект в состав дерева иерархии объектов.
- Создать базовый класс со следующими элементами:
- Свойства:
- - наименование объекта (строкового типа);
- - указатель на головной объект для текущего объекта (для корневого объекта значение указателя равно 0);
- - массив указателей на объекты, подчиненные к текущему объекту в дереве иерархии.
- Функционал:
- - параметризированный конструктор с параметрами: указатель на головной объект в дереве иерархии и наименование объекта (имеет значение по умолчанию);
- - метод определения имени объекта;
- - метод получения имени объекта;
- - метод вывода наименований объектов в дереве иерархии слева направо и сверху вниз;
- - метод переопределения головного объекта для текущего в дереве иерархии;
- - метод получения указателя на головной объект текущего объекта.
- Для построения дерева иерархии объектов в качестве корневого объекта используется объект приложение. Класс объекта приложения наследуется от базового класса. Объект приложение реализует следующий функционал:
- − метод построения исходного дерева иерархии объектов (конструирования программы-системы, изделия);
- − метод запуска приложения (начало функционирования системы, выполнение алгоритма решения задачи).
- Написать программу, которая последовательно строит дерево иерархии объектов, слева направо и сверху вниз.
- Переход на новый уровень происходит только от правого (последнего) объекта предыдущего уровня.
- Для построения дерева использовать объекты двух производных классов, наследуемых от базового. Каждый объект имеет уникальное имя.
- Построчно, по уровням вывести наименования объектов построенного иерархического дерева.
- Основная функция должна иметь следующий вид:
- int main()
- {
- cl_application ob_cl_application ( nullptr );
- ob_cl_application.bild_tree_objects ( ); // построение дерева объектов
- return ob_cl_application.exec_app ( ); // запуск системы
- }
- Наименование класса cl_application и идентификатора корневого объекта ob_cl_application могут быть изменены разработчиком.
- Входные данные
- Первая строка:
- имя корневого объекта
- Вторая строка и последующие строки:
- имя головного объекта имя подчиненного объекта
- Создается подчиненный объект и добавляется в иерархическое дерево.
- Если имя головного объекта равняется имени подчиненного объекта, то новый объект не создается и построение дерева объектов завершается.
- Пример ввода
- Object_root
- Object_root Object_1
- Object_root Object_2
- Object_root Object_3
- Object_3 Object_4
- Object_3 Object_5
- Object_6 Object_6
- Дерево объектов, которое будет построено по данному примеру:
- Object_root
- Object_1
- Object_2
- Object_3
- Object_4
- Object_5
- Выходные данные
- Первая строка:
- имя корневого объекта
- Вторая строка и последующие строки имена головного и подчиненных объектов очередного уровня разделенных двумя пробелами.
- имя головного объекта имя подчиненного объекта[[ имя подчиненного объекта] …….]
- Пример вывода
- Object_root
- Object_root Object_1 Object_2 Object_3
- Object_3 Object_4 Object_5
- */
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- class Base {
- string obj_name="";
- Base* head_obj;
- enum class Status { error = -1, buid, ready };
- Status state;
- vector<Base*> sub_objs;
- public:
- Base(Base* head_obj, string obj_name = "Object_root");
- void set_obj_name(string obj_name);
- string get_obj_name();
- void set_state(int state);
- int get_state();
- void set_head_obj(Base* head_obj);
- Base* get_head_obj();
- Base* get_obj_by_name(string obj_name);
- // unsigned int sub_objs_count();
- void print_tree();
- ~Base();
- };
- Base::Base(Base* head_obj, string obj_name)
- :head_obj(head_obj), obj_name(obj_name), state(Status::buid)
- {
- if (head_obj) head_obj->sub_objs.push_back(this);
- }
- void Base::set_obj_name(string obj_name) {
- this->obj_name =obj_name;
- }
- string Base::get_obj_name() {
- return obj_name;
- }
- void Base::set_state(int state) {
- switch (state) {
- case -1:
- this->state = Status::error;
- break;
- case 0:
- this->state = Status::buid;
- break;
- case 1:
- this->state = Status::ready;
- break;
- default:
- break;
- }
- }
- int Base::get_state() {
- switch (state) {
- case Status::error:
- return -1;
- case Status::buid:
- return 0;
- case Status::ready:
- return 1;
- default:
- break;
- }
- }
- void Base::set_head_obj(Base* head_obj) {
- this->head_obj = head_obj;
- }
- Base* Base::get_head_obj() {
- return head_obj;
- }
- Base* Base::get_obj_by_name(string obj_name) {
- if (this->obj_name == obj_name) return this;
- Base* val=nullptr;
- if (!sub_objs.empty()) {
- for (int i = 0; i < sub_objs.size(); i++) {
- if (sub_objs[i]->obj_name == obj_name) val = sub_objs[i];
- }
- if (val == nullptr) {
- for (int i = 0; i < sub_objs.size(); i++) {
- val = sub_objs[i]->get_obj_by_name(obj_name);
- }
- }
- }
- if (val == nullptr) set_state(-1);
- return val;
- }
- /*unsigned int sub_objs_count();
- */
- void Base::print_tree() {
- if (!head_obj) cout << obj_name;
- if (sub_objs.size() > 0) {
- cout << '\n' << obj_name;
- for (int i = 0; i < sub_objs.size(); i++)
- cout << ' ' << sub_objs[i]->get_obj_name();
- for (int i = 0; i < sub_objs.size(); i++) sub_objs[i]->print_tree();
- }
- }
- Base::~Base() {
- delete head_obj;
- sub_objs.clear();
- }
- class App:public Base {
- public:
- App(Base* head=nullptr);
- void build_tree_objs();
- int exec_app();
- };
- App::App(Base* head) :Base(head) {}
- void App::build_tree_objs() {
- string obj_name1,obj_name2;
- cin >> obj_name1;
- set_obj_name(obj_name1);
- while (true) {
- cin >> obj_name1 >> obj_name2;
- if (obj_name1 == obj_name2) return;
- Base* sub = new Base(get_obj_by_name(obj_name1), obj_name2);
- sub->set_state(1);
- }
- }
- int App::exec_app() {
- print_tree();
- return 0;
- }
- int main()
- {
- App ob_cl_application(nullptr);
- ob_cl_application.build_tree_objs();
- return ob_cl_application.exec_app();
- }
- // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
- // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
- // Советы по началу работы
- // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
- // 2. В окне Team Explorer можно подключиться к системе управления версиями.
- // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
- // 4. В окне "Список ошибок" можно просматривать ошибки.
- // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
- // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement