Проверка готовности объектов к работе
Скачать 206.55 Kb.
|
Постановка задачиПроверка готовности объектов к работе Фрагмент методического указания. Создание объектов и построение исходного иерархического дерева объектов. Система собирается из объектов, принадлежащих определенным классам. В тексте постановки задачи классу соответствует уникальный номер. Относительно номера класса определяются требования (свойства, функциональность). Первоначальная сборка системы (дерева иерархии объектов, программы) осуществляется исходя из входных данных. Данные вводятся построчно. Первая строка содержит имя корневого объекта (объект приложение). Номер класса корневого объекта 1. Корневой объект объявляется в основной программе (main). Исходное состояние корневого объекта соответствует его функционированию. Далее, каждая строка входных данных определяет очередной объект, задает его характеристики и расположение на дереве иерархии. Структура данных в строке: «Наименование головного объекта»«Наименование очередного объекта»«Номер класса принадлежности очередного объекта»«Номер исходного состояния очередного объекта» Ввод иерархического дерева завершается, если наименование головного объекта равно « endtree » (в данной строке ввода больше ничего не указывается). Готовность объекта характеризуется значением его состояния. Значение состояния - целое число. Определены правила для значения состояния: 0 – объект выключен; Отрицательное – объект включен, но не функционирует, обнаружена неисправность. Значение классифицирует характер неисправности. Положительное – объект включен, функционирует в штатном режиме. Значение определяет текущее состояние объекта. Подчиненные объекты располагаются слева на право относительно головного, согласно их следованию в исходных данных. Исходные данные подготовлены таким образом, что любой головной объект предварительно добавлен в качестве подчиненного. Подразумевается, что все объекты имеют уникальные имена. Для организации исходя из входных данных создания экземпляров объектов и формирования иерархического дерева, необходимо: 1. В базовом классе реализовать метод поиска объекта на дереве объектов по его наименованию и возврата указателя на него. Если объект не найден, то вернуть нулевой указатель. 2. В корневом объекте (объект приложения) реализовать метод чтения исходных данных, создания объектов и построения исходного дерева иерархии. Пример Ввод app_root app_root object_1 3 1 app_root object_2 2 1 object_2 object_4 3 -1 object_2 object_5 3 1 app_root object_3 3 1 object_2 object_6 2 1 object_1 object_7 2 1 endtree Построенное дерево app_root object_1 object_7 object_2 object_4 object_5 object_6 object_3 Вывод списка готовности объектов The object app_root is ready The object object_1 is ready The object object_7 is ready The object object_2 is ready The object object_4 is not ready The object object_5 is ready The object object_6 is ready The object object_3 is ready Постановка задачи Все сложные электронные, технические средства разного назначения в момент включения выполняют опрос готовности к работе составных элементов, индицируя соответствующую информацию на табло, панели или иным образом. Построить модель иерархической системы. Реализовать задачу опроса готовности каждого объекта из ее состава и вывести соответствующее сообщение на консоль. Объект считается готовым к работе: 1. Создан и размешен в составе системы (на дереве иерархии объектов) согласно схеме архитектуры; Имеет свое уникальное наименование; Свойство, определяющее его готовность к работе, имеет целочисленное положительное значение. В результате решения задачи опроса готовности объектов, относительно каждого объекта системы на консоль надо вывести соответствующую информацию: Если свойство определяющее готовность объекта имеет положительное значение: The object «наименование объекта» is ready иначе The object « наименованиеобъекта » is not ready Система содержит объекты трех классов, не считая корневого. Номера классов: 2,3,4. Описание входных данныхМножество объектов, их характеристики и расположение на дереве иерархии. Структура данных для ввода согласно изложенному в фрагменте методического указания. Описание выходных данных
Далее, построчно, согласно следованию объектов на дереве иерархии слева на право и сверху вниз, относительно каждого объекта в зависимости от состояния готовности выводиться, если объект готов к работе: The object «наименование объекта» is ready Если не готов, то: The object «наименование объекта» is not ready Метод решенияКласс С, наследуемый от Base с модификатором public Изменения в классе Base: добавлено закрытое свойство status - состояние текущей вершины изменен конкструктор класса Base(Base * parent, string name, int status) добавлен метод print_status_tree - выводит статусы вершины поддерева текущей вершины
Описание алгоритмаКласс объекта: Base Модификатор доступа: public Метод: Base Функционал: Конструктор класса Параметры: Base * parent - указатель на родителя, string name - имя вершины, int status - её статус Возвращаемое значение: отсутствует
Класс объекта: Base Модификатор доступа: public Метод: print_status_tree Функционал: Выводит статусы вершин поддерева из данной вершины Параметры: отсутствуют Возвращаемое значение: отсутствует
Класс объекта: App Модификатор доступа: public Метод: build_tree Функционал: Строит дерево по данным из входящго потока Параметры: отсутствуют Возвращаемое значение: отсутствует
Класс объекта: App Модификатор доступа: public Метод: run Функционал: Запускает программу действий с созданным деревом Параметры: отсутствуют Возвращаемое значение: отсутствует
Блок-схема алгоритмаКод программыФайл a.cpp #include #include "a.h" #include "base.h" A::A(Base * parent, std::string name, int status): Base(parent, name, status) {}; Файл a.h#ifndef AH #define AH #include #include "base.h" class A: public Base{ public: A(Base * parent, std::string name, int status); }; #endif Файл app.cpp#include #include #include "app.h" #include "a.h" #include "b.h" #include "c.h" using namespace std; App::App(Base * parent): Base(parent, "", 1){}; void App::build_tree(){ string s1, s2; int class_type = 0, status; // Считываем имя корня cin >> s1; // Задаем имя корня this->set_name(s1); // Начинаем считывание while (true){ // Считывание двух строк, разделенных пробелом cin >> s1; // Проверяем, что не конец ввода if (s1 == "endtree"){ break; } cin >> s2 >> class_type >> status; // Находим элемент с именем s1 Base * b = this->get_by_name(s1); // Добавляем к найденой вершине элемент с именем s2 if (class_type == 2){ b->add_child(new A(b, s2, status)); }else if (class_type == 3){ b->add_child(new B(b, s2, status)); }else if (class_type == 4){ b->add_child(new C(b, s2, status)); } } } void App::run(){ cout << "Test result\n"; this->print_status_tree(); } Файл app.h#ifndef APPH #define APPH #include "base.h" class App : public Base{ public: App(Base * parent); void build_tree(); void run(); }; #endif Файл base.cpp#include "base.h" #include #include void Base::set_name(string new_name){ this->name = new_name; return; } string Base::get_name(){ return this->name; } void Base::set_parent(Base * new_parent){ this->parent = new_parent; return; } Base::Base(Base * parent, string name, int status=0){ this->parent = parent; this->name = name; this->status = status; } Base * Base::get_parent(){ return this->parent; } void Base::print_tree(){ if (!this->children.size()) return; // Выводим имя данной вершины cout << this->name; // Выводим имена детей, раздлеяя их двумя пробелами for (int i = 0; i < this->children.size(); ++i){ cout << " "; cout << this->children[i]->get_name(); } // Вызываем аналогичную функцию у детей bool w = false; for (int i = 0; i < this->children.size(); ++i){ if (this->children[i]->children.size() && !w){ cout << "\n"; w = true; } this->children[i]->print_tree(); } return; } void Base::print_status_tree(){ cout << "The object " << this->name; // Проверяем, готов ли объект, и выводим соответствующую информацию if (this->status > 0){ cout << " is ready"; }else{ cout << " is not ready"; } if (this->children.size()){ cout << "\n"; } // Выводим имена детей, раздлеяя их двумя пробелами for (int i = 0; i < this->children.size(); ++i){ this->children[i]->print_status_tree(); if (i != this->children.size() - 1) cout << "\n"; } return; } void Base::add_child(Base * h){ this->children.push_back(h); return; } Base * Base::get_by_name(string name){ if (this->name == name){ return this; } for (int i = 0; i < this->children.size(); ++i){ Base * b = children[i]->get_by_name(name); if (b != NULL) return b; } return nullptr; } Файл base.h#ifndef BASEH #define BASEH #include class Base{ private: std::string name; Base * parent; int status; protected: std::vector Base(Base * parent, std::string name, int status); void set_name(std::string new_name); std::string get_name(); void set_parent(Base * new_parent); Base * get_parent(); void print_tree(); void print_status_tree(); void add_child(Base * h); Base * get_by_name(std::string name); }; #endif Файл b.cpp#include #include "b.h" #include "base.h" B::B(Base * parent, std::string name, int status): Base(parent, name, status) {}; Файл b.h#ifndef BH #define BH #include #include "base.h" class B: public Base{ public: B(Base * parent, std::string name, int status); }; #endif Файл c.cpp#include #include "c.h" #include "base.h" C::C(Base * parent, std::string name, int status): Base(parent, name, status) {}; Файл c.h#ifndef CH #define CH #include #include "base.h" class C: public Base{ public: C(Base * parent, std::string name, int status); }; #endif Файл main.cpp #include "app.h" int main(){ App app(NULL); app.build_tree(); app.run(); } Тестирование
|