Advertisement
selebry

fdsfsdfsfsd

Mar 18th, 2022
1,123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.15 KB | None | 0 0
  1. /*
  2. * Для организации иерархического построения объектов необходимо разработать базовый класс, который содержит функционал и свойства для построения иерархии объектов.
  3. В последующем, в приложениях использовать этот класс как базовый для всех создаваемых классов. Это позволит включать любой объект в состав дерева иерархии объектов.
  4.  
  5.  
  6. Создать базовый класс со следующими элементами:
  7.  
  8.  
  9. Свойства:
  10.     - наименование объекта (строкового типа);
  11.     - указатель на головной объект для текущего объекта (для корневого объекта значение указателя равно 0);
  12.     - массив указателей на объекты, подчиненные к текущему объекту в дереве иерархии.
  13.  
  14.  
  15. Функционал:
  16.     - параметризированный конструктор с параметрами: указатель на головной объект в дереве иерархии и наименование объекта  (имеет значение по умолчанию);
  17.     - метод определения имени объекта;
  18.     - метод получения имени объекта;
  19.     - метод вывода наименований объектов в дереве иерархии слева направо и сверху вниз;
  20.     - метод переопределения головного объекта для текущего в дереве иерархии;
  21.     - метод получения указателя на головной объект текущего объекта.
  22.  
  23.  
  24. Для построения дерева иерархии объектов в качестве корневого объекта используется объект приложение. Класс объекта приложения наследуется от базового класса. Объект приложение реализует следующий функционал:
  25. − метод построения исходного дерева иерархии объектов (конструирования программы-системы, изделия);
  26. − метод запуска приложения (начало функционирования системы, выполнение алгоритма решения задачи).
  27.  
  28. Написать программу, которая последовательно строит дерево иерархии объектов, слева направо и сверху вниз.
  29. Переход на новый уровень происходит только от правого (последнего) объекта предыдущего уровня.
  30. Для построения дерева использовать объекты двух производных классов, наследуемых от базового. Каждый объект имеет уникальное имя.
  31.  
  32.  
  33. Построчно, по уровням вывести наименования объектов построенного иерархического дерева.
  34.  
  35. Основная функция должна иметь следующий вид:
  36.  
  37. int main()
  38. {
  39.     cl_application  ob_cl_application ( nullptr );
  40.     ob_cl_application.bild_tree_objects ( );  // построение дерева объектов
  41.     return ob_cl_application.exec_app ( );    // запуск системы
  42. }
  43.  
  44. Наименование класса cl_application и идентификатора корневого объекта ob_cl_application могут быть изменены разработчиком.
  45.  
  46.  
  47. Входные данные
  48. Первая строка:
  49. имя корневого объекта
  50. Вторая строка и последующие строки:
  51. имя головного объекта имя подчиненного объекта
  52. Создается подчиненный объект и добавляется в иерархическое дерево.
  53.  
  54.  
  55. Если имя головного объекта равняется имени подчиненного объекта, то новый объект не создается и построение дерева объектов завершается.
  56.  
  57.  
  58. Пример ввода
  59.  
  60.  
  61. Object_root
  62. Object_root Object_1
  63. Object_root Object_2
  64. Object_root Object_3
  65. Object_3 Object_4
  66. Object_3 Object_5
  67. Object_6 Object_6
  68.  
  69. Дерево объектов, которое будет построено по данному примеру:
  70.  
  71.  
  72. Object_root
  73.          Object_1
  74.          Object_2
  75.          Object_3
  76.                    Object_4
  77.                    Object_5
  78.  
  79. Выходные данные
  80. Первая строка:
  81. имя корневого объекта
  82. Вторая строка и последующие строки имена головного и подчиненных объектов очередного уровня разделенных двумя пробелами.
  83. имя головного объекта имя подчиненного объекта[[ имя подчиненного объекта] …….]
  84.  
  85.  
  86. Пример вывода
  87.  
  88. Object_root
  89. Object_root  Object_1  Object_2  Object_3
  90. Object_3  Object_4  Object_5
  91. */
  92.  
  93. #include <iostream>
  94. #include <string>
  95. #include <vector>
  96. using namespace std;
  97. class Base {
  98.     string obj_name="";
  99.     Base* head_obj;
  100.     enum class Status { error = -1, buid, ready };
  101.     Status state;
  102.     vector<Base*> sub_objs;
  103. public:
  104.     Base(Base* head_obj, string obj_name = "Object_root");
  105.     void set_obj_name(string obj_name);
  106.     string get_obj_name();
  107.     void set_state(int state);
  108.     int get_state();
  109.     void set_head_obj(Base* head_obj);
  110.     Base* get_head_obj();
  111.     Base* get_obj_by_name(string obj_name);
  112.   //  unsigned int sub_objs_count();
  113.     void print_tree();
  114.     ~Base();
  115. };
  116. Base::Base(Base* head_obj, string obj_name)
  117.     :head_obj(head_obj), obj_name(obj_name), state(Status::buid)
  118. {
  119.     if (head_obj) head_obj->sub_objs.push_back(this);
  120. }
  121. void Base::set_obj_name(string obj_name) {
  122.     this->obj_name =obj_name;
  123. }
  124. string Base::get_obj_name() {
  125.     return obj_name;
  126. }
  127. void Base::set_state(int state) {
  128.     switch (state) {
  129.     case -1:
  130.         this->state = Status::error;
  131.         break;
  132.     case 0:
  133.         this->state = Status::buid;
  134.         break;
  135.     case 1:
  136.         this->state = Status::ready;
  137.         break;
  138.     default:
  139.         break;
  140.     }
  141. }
  142. int Base::get_state() {
  143.     switch (state) {
  144.     case Status::error:
  145.         return -1;
  146.     case Status::buid:
  147.         return 0;
  148.     case Status::ready:
  149.         return 1;
  150.     default:
  151.         break;
  152.     }
  153. }
  154. void Base::set_head_obj(Base* head_obj) {
  155.     this->head_obj = head_obj;
  156. }
  157. Base* Base::get_head_obj() {
  158.     return head_obj;
  159. }
  160. Base* Base::get_obj_by_name(string obj_name) {
  161.     if (this->obj_name == obj_name) return this;
  162.     Base* val=nullptr;
  163.     if (!sub_objs.empty()) {
  164.         for (int i = 0; i < sub_objs.size(); i++) {
  165.             if (sub_objs[i]->obj_name == obj_name) val = sub_objs[i];
  166.         }
  167.         if (val == nullptr) {
  168.             for (int i = 0; i < sub_objs.size(); i++) {
  169.                 val = sub_objs[i]->get_obj_by_name(obj_name);
  170.             }
  171.         }
  172.     }
  173.     if (val == nullptr) set_state(-1);
  174.     return val;
  175. }
  176. /*unsigned int sub_objs_count();
  177. */
  178. void Base::print_tree() {
  179.     if (!head_obj) cout << obj_name;
  180.     if (sub_objs.size() > 0) {
  181.         cout << '\n' << obj_name;
  182.         for (int i = 0; i < sub_objs.size(); i++)
  183.             cout << ' ' << sub_objs[i]->get_obj_name();
  184.         for (int i = 0; i < sub_objs.size(); i++) sub_objs[i]->print_tree();
  185.     }
  186.  
  187. }
  188. Base::~Base() {
  189.     delete head_obj;
  190.     sub_objs.clear();
  191. }
  192. class App:public Base {
  193. public:
  194.     App(Base* head=nullptr);
  195.     void build_tree_objs();
  196.     int exec_app();
  197. };
  198. App::App(Base* head) :Base(head) {}
  199. void App::build_tree_objs() {
  200.     string obj_name1,obj_name2;
  201.     cin >> obj_name1;
  202.     set_obj_name(obj_name1);
  203.     while (true) {
  204.         cin >> obj_name1 >> obj_name2;
  205.         if (obj_name1 == obj_name2) return;
  206.         Base* sub = new Base(get_obj_by_name(obj_name1), obj_name2);
  207.         sub->set_state(1);
  208.     }
  209. }
  210. int App::exec_app() {
  211.     print_tree();
  212.     return 0;
  213. }
  214. int main()
  215. {
  216.     App ob_cl_application(nullptr);
  217.     ob_cl_application.build_tree_objs();
  218.     return ob_cl_application.exec_app();
  219. }
  220.  
  221. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  222. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  223.  
  224. // Советы по началу работы
  225. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  226. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  227. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  228. //   4. В окне "Список ошибок" можно просматривать ошибки.
  229. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  230. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
  231.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement