Главная страница
Навигация по странице:

  • Постановка задачи

  • Далее, построчно

  • Предикат Действия № перехода Комментарий

  • Проверка готовности объектов к работе


    Скачать 206.55 Kb.
    НазваниеПроверка готовности объектов к работе
    Дата15.05.2022
    Размер206.55 Kb.
    Формат файлаdocx
    Имя файла3_1.docx
    ТипДокументы
    #530671

    Постановка задачи


    Проверка готовности объектов к работе

    Фрагмент методического указания.

    Создание объектов и построение исходного иерархического дерева объектов. Система собирается из объектов, принадлежащих определенным классам. В тексте постановки задачи классу соответствует уникальный номер. Относительно номера класса определяются требования (свойства, функциональность). Первоначальная сборка системы (дерева иерархии объектов, программы) осуществляется исходя из входных данных. Данные вводятся построчно.

    Первая строка содержит имя корневого объекта (объект приложение). Номер класса корневого объекта 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. Создан и размешен в составе системы (на дереве иерархии объектов) согласно схеме архитектуры;

    1. Имеет свое уникальное наименование;

    2. Свойство, определяющее его готовность к работе, имеет целочисленное положительное значение.

    В результате решения задачи опроса готовности объектов, относительно каждого объекта системы на консоль надо вывести соответствующую информацию:

    Если свойство определяющее готовность объекта имеет положительное значение:

    The object «наименование объекта» is ready иначе

    The object « наименованиеобъекта » is not ready

    Система содержит объекты трех классов, не считая корневого. Номера классов: 2,3,4.

    Описание входных данных


    Множество объектов, их характеристики и расположение на дереве иерархии.

    Структура данных для ввода согласно изложенному в фрагменте методического указания.

    Описание выходных данных


    В



    первой






    строке

    вывести

    Test















    result

    Далее, построчно, согласно следованию объектов на дереве иерархии слева на право и сверху вниз, относительно каждого объекта в зависимости от состояния готовности выводиться, если объект готов к работе:

    The object «наименование объекта» is ready

    Если не готов, то:

    The object «наименование объекта» is not ready

    Метод решения


    Класс С, наследуемый от Base с модификатором public

    Изменения в классе Base: добавлено закрытое свойство status - состояние текущей вершины изменен конкструктор класса Base(Base * parent, string name, int status) добавлен метод print_status_tree - выводит статусы вершины поддерева текущей вершины




    Имя класса

    Класс-наследник

    Модификатор доступа при наследовании

    Описание

    1

    Base







    Основа для в

    App

    public




    A

    public




    B

    public




    C

    public




    2

    App







    Класс прило

    3

    A










    4

    B










    5

    C









    Изменения в классе App: изменена функция build_tree() измененеа функция run()

    Описание алгоритма


    Класс объекта: Base

    Модификатор доступа: public

    Метод: Base

    Функционал: Конструктор класса

    Параметры: Base * parent - указатель на родителя, string name - имя вершины, int status - её статус

    Возвращаемое значение: отсутствует



    Предикат

    Действия

    перехода

    Комментарий

    1




    Присваивание закрытому свойству parent указателя аргумента parent

    2




    2




    Присваивание закрытому свойству name значения аргумента name

    3




    3




    Присваивание закрытому свойству status значениея аргумента status






    Класс объекта: Base

    Модификатор доступа: public

    Метод: print_status_tree

    Функционал: Выводит статусы вершин поддерева из данной вершины

    Параметры: отсутствуют

    Возвращаемое значение: отсутствует



    Предикат

    Действия

    перехода

    Комментарий

    1




    Вывод "The object " и значения закрытого свойства name

    2




    2

    Значение закрытого свойства status больше 0

    Вывод " is ready"

    3




    Значение закрытого свойства status меньше 1

    Вывод " is not ready"

    3




    3

    Результат работы метода size объекта закрытого

    свойства children не равен нулю

    Вывод "\n"

    4




    Результат работы метода size объекта закрытого

    свойства children равен нулю




    4




    4




    Инициализация переменной i со значением 0

    5




    5

    i меньше размера объекта закрытого свойства

    Вызов метода print_status_tree у i-ого элемента закрытого

    6







    children

    свойства children







    i больше либо равно размеру объекта закрытого свойства children




    7




    6

    i не равно размеру закрытого свойства children минус 1

    Вывод "\n"

    7




    i равно размеру закрытого свойства children минус 1




    7




    7




    Увеличить i на единицу

    5




    Класс объекта: App

    Модификатор доступа: public

    Метод: build_tree

    Функционал: Строит дерево по данным из входящго потока

    Параметры: отсутствуют

    Возвращаемое значение: отсутствует



    Предикат

    Действия

    перехода

    Комментарий

    1




    Инициализация двух переменных строкого типа s1, s2

    2




    2




    Инициализация двух переменных целочисленного типа status и class_type

    3




    3




    Считывание s1

    4




    4




    Вызов метода set_name у данного объекта с аргументом s1

    5




    5

    Всегда

    Считывание s1

    6




    Никогда









    6

    s1 равно "endtree"









    s1 не равно "endtree"




    7




    7




    Считывание s2, class_type, status

    8




    8




    Вызов метода get_by_name у данного объекта с аргументом s1

    9




    9




    Присваивание результата работы get_by_name переменной b

    10




    10

    class_type равно 2

    Инициализация объекта класса A с аргументами b, s2, status и вызов метода add_child у объекта b с аргументом созданным объектом класса A

    5







    class_type равно 3

    Инициализация объекта класса B с аргументами b, s2, status и вызов метода add_child у объекта b с аргументом созданным объектом класса B

    5




    class_type равно 4

    Инициализация объекта класса C с аргументами b, s2, status и вызов метода add_child у объекта b с аргументом созданным объектом класса C

    5




    class_type не равно 2, 3, 4




    5




    Класс объекта: App

    Модификатор доступа: public

    Метод: run

    Функционал: Запускает программу действий с созданным деревом

    Параметры: отсутствуют

    Возвращаемое значение: отсутствует



    Предикат

    Действия

    перехода

    Комментарий

    1




    Вывод "Test result" и перенос строки

    2




    2




    Вызов метода print_status_tree у данного объекта





    Блок-схема алгоритма











    Код программы


    Файл 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 #include using namespace std;

    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 #include class Base;

    class Base{ private: std::string name; Base * parent; int status; protected:

    std::vector children; public:

    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(); }

    Тестирование


    Входные данные

    Ожидаемые выходные данные

    Фактические выходные данные

    root root abc 2 -1 root abd 3 1 abd abh 4 1 abh abg 2 -1 endtree

    Test result The object root is ready The object abc is not ready The object abd is ready The object abh is ready The object abg is not ready

    Test result The object root is ready The object abc is not ready The object abd is ready The object abh is ready The object abg is not ready

    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

    Test result The object app_root is ready The object object_1 is ready The object object_7 is ready The object object_2 is

    Test result The object app_root is ready The object object_1 is ready The object object_7 is ready The object object_2 is




    object_2 object_6 2 1 object_1 object_7 2 1 endtree

    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

    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


    написать администратору сайта