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

  • ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

  • 0. Класс Директор

  • 1. Класс Бухгалтер

  • 2. Класс Секретарь

  • 6. Класс Программист

  • ООП. Войнолович_ООП_ЛР2. Лабораторная работа 2 Классы инкапсуляция, наследование. По курсу Технология разработки программного обеспечения


    Скачать 0.65 Mb.
    НазваниеЛабораторная работа 2 Классы инкапсуляция, наследование. По курсу Технология разработки программного обеспечения
    Дата06.05.2022
    Размер0.65 Mb.
    Формат файлаdocx
    Имя файлаВойнолович_ООП_ЛР2.docx
    ТипЛабораторная работа
    #515521

    МИНОБРНАУКИ РОССИИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

    ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

    НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ «мэи»

    КАФЕДРА «ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, КОМПЛЕКСЫ, СИСТЕМЫ И СЕТИ»



    Лабораторная работа №2

    Классы: инкапсуляция, наследование.

    По курсу

    «Технология разработки программного обеспечения»

    Выполнили: студенты 1 курса магистратуры

    Группы А-07м-21

    Вариант №4

    Войнолович Е.А.

    Москва

    2022

    Оглавление


    1

    1.ПОСТАНОВКА ЗАДАЧИ 3

    1.1Цель работы 3

    1.2Задание 3

    1.3 Используемые классы согласно заданию 4

    2.РАЗРАБОТКА ПРОГРАММЫ 6

    2.1Рассмотрение основных моментов 6

    2.2Диаграмма классов 7

    2.3Описание разработанных классов 8

    2.4Тестирование разработанной программы 12

    2.5 «Алмаз смерти» демонстрация проблемы 20

    ВЫВОД 21

    ПРИЛОЖЕНИЕ 1 22


    1. ПОСТАНОВКА ЗАДАЧИ



      1. Цель работы


    Ознакомиться с концепцией объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, а именно ознакомиться с наследованием. А также ознакомиться с механизмом, который объединяет данные и код, манипулирует этими данными, а также защищает и то и то, а именно с инкапсуляцией.
      1. Задание


    1) Реализовать иерархию классов в соответствии с вариантом. У всех вариантов в качестве базового класса выступает класс “Сотрудник”. Построить диаграмму классов.

    Примечание: если в задании требуется реализовать функционал для другого класса, которого нет в вашем варианте,  делать этого не требуется.

    2) Реализовать дочерний класс на основе двух классов, реализованных в предыдущем задании 1.1.

    Рассмотрите полученный результат и скажите, какие проблемы возникли при реализации данного множественного наследования (прим.: "алмаз смерти").

    Создать новые классы "Инициалы" и "Выплаты", на основе которых реализовать дочерний класс "Данные о работнике". 

    Продемонстрировать работу класса.

    В случае некорректных данных выбрасывать исключения.

    1.3 Используемые классы согласно заданию



    0. Класс Директор:

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

    Также класс должен содержать поле, содержащее ФИО сотрудников, которые находятся в подчинении у директора, и их заработную плату.

    Реализовать методы для увольнения и принятия работников. 

    Реализовать методы, позволяющие читать/писать из/в полей класса.
    1. Класс Бухгалтер:

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

    Также класс должен содержать поле, содержащее ставку для всех должностей.

    Реализовать метод для расчета заработной платы работникам, исходя из размера ставки.

    Реализовать методы, позволяющие читать/писать из/в полей класса.
    2. Класс Секретарь:

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

    Реализовать метод, который для данного директора выводит в виде таблицы список сотрудников.

    Если в вашем варианте есть класс “Системный администратор”, то реализовать метод, который для данного системного администратора выводит в виде таблицы список оборудования.

    Если в вашем варианте есть класс “Охранник”, то реализовать метод, который принимает массив охранников и выводит их в таблицу.

    Если в вашем варианте есть класс “Водитель”, то реализовать метод, который принимает массив водителей и выводит их в таблицу.

    Если в вашем варианте есть класс “Программист”, то реализовать метод, который принимает массив программистов и выводит их в таблицу.

    Реализовать методы, позволяющие читать/писать из/в полей класса.
    6. Класс Программист

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

    Класс должен содержать поле, которое хранит уровень программиста (junior, middle, senior, lead).

    Класс должен содержать поле, которое будет содержать список технологий, которыми владеет программист.

    Реализовать методы, позволяющие читать/писать из/в полей класса.

    1. РАЗРАБОТКА ПРОГРАММЫ



      1. Рассмотрение основных моментов


    Для начала рассмотрения реализации, стоит уточнить, что код классов выполнялся по второму заданию изначально. То есть имеется два класса Initials и Finans на основе которых создан дочерний класс Employee. Этот код не сложно изменить для представления кода по 1-ому заданию, для этого было бы необходимо просто переопределить методы классов Initials и Finans в Employee.

    Для дальнейшей успешной разработки стоит разобраться с таким явлением как «Алмаз смерти».



    Рисунок 1 - "Алмаз смерти"

    Рассмотрим ситуацию: один производный класс имеет два базовых класса, при этом каждый из этих двух являются производным одного и того же суперкласса, такая ситуация демонстрируется на Рис. 1. При этом в производных классах есть свойство с одинаковым именем.

    Как мы знаем если в базовых классах элементы называются одинаково, то в производном классе появляется ошибка неоднозначности. Вот чем сулит «алмаз смерти», а название он свое получил, так как на диаграмме классов такая ситуация выглядит как алмаз.


      1. Диаграмма классов


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


    Рисунок 2 – Диаграмма классов


      1. Описание разработанных классов


    Класс Initials:

    • Поля

    — string m_firstName – переменная для хранения имени

    — string m_middleName – переменная для хранения отчества

    • Методы

    — Initials(string firstName = "", string middleName = "") – конструктор, задает имя и отчество

    — string getFirstName() – возвращает имя работника

    — void setFirstName – устанавливает имя работника

    — string getMiddleName() – возвращает отчество работника

    — void setMiddleName(string middleName) – устанавливает отчество работника

    • Взаимодействие

    — Является родительским классом для Employee

    Класс Finans:

    • Поля

    — double m_salary – переменная для хранения заработной платы

    • Методы

    — Finans(double salary = 0.0) – конструктор, задает заработную плату

    — double getSalary() – возвращает заработную плату работника

    • void setSalary(double salary) – устанавливает заработную плату работнику

    • Взаимодействие

    — Является родительским классом для Employee

    Класс Employee:

    • Поля

    — string m_lastName – хранит фамилию работника

    • string post – хранит должность работника

    • Методы

    — Employee(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0) – конструктор, задает ФИО и заработную плату сотрудника

    — string getLastName() – возвращает фамилию работника

    — string getFullName() – возвращает ФИО работника

    — int setLastName(string lastName) – устанавливает фамилию работника

    — virtual string whoAmI() – функция переопределения для производных классов, возвращающая должность работника

    • Взаимодействие

    — Является дочерним классом для Initials и Finans, а также в свою очередь является родительским для классов Director, Accountant, Secretary и Programmer

    Класс Director:

    • Поля

    — vector < Employee* > m_listEmployee – вектор хранит указатели на каждого подчиненного директора

    — vector < Employee* > m_listProgrammer – вектор хранит указатели на всех программистов

    • Методы

    — Director(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0) – конструктор устанавливает ФИО и заработную плату для созданного директора

    — void hireEmployee( Employee * newEmployee, string post) – создает нового работника у конкретного директора, указатели которого сохраняются в m_listEmployee, а в случае если это программист то еще и в m_listProgrammer

    • void printListEmployee() – выводит лист работников

    — void dismissEmployee(int i) – увольняет работника, убирает его из вектора m_listEmployee

    • Employee * getEmployee(int i) – возвращает указатель на работника по его номеру в m_listEmployee

    — string whoAmI() – возвращает должность работника

    • Взаимодействие

    — Является дочерним классом для Employee

    Класс Accountant:

    • Поля

    — int rate[4] – массив содержит ставку работника за час работы для всех должностей

    • Методы

    — Accountant(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0) – конструктор устанавливает ФИО и заработную плату для созданного секретаря

    — void getRate(int i) – выводит ставку заработной платы в час для конкретной должности

    — void getWages(int i) – производит расчет, а также выводит заработную плату для конкретной должности

    — string whoAmI() – возвращает должность работника

    • Взаимодействие

    — Является дочерним классом для Employee

    Класс Secretary:

    • Поля

    — нет

    • Методы

    — Secretary(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0) – конструктор устанавливает ФИО и заработную плату для созданного секретаря

    — void printTableEmplouee(vector < Director >& listDirectors, int md) – выводит таблицу сотрудников для своего директора

    — void printTabbleProgrammer(vector < Director >& listDirectors) – выводит таблицу всех программистов

    — string whoAmI() – возвращает должность работника

    • Взаимодействие

    — Является дочерним классом для Employee

    Класс Programmer:

    • Поля

    — string m_levelProgramming – хранит уровень программиста

    — string m_pullLevel[4] – массив содержит все возможные уровни программиста

    — vector < string > m_listTech – вектор хранит в себе все технологии, которыми владеет программист

    • Методы

    — Programmer(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0) - конструктор устанавливает ФИО и заработную плату для созданного программиста

    — void setLevelProgramming(int i) – устанавливает уровень программисту, данные берутся из m_pullLevel согласно номеру

    — string getLevelProgramming() – возвращает уровень программиста

    — void addTech(string newTech) – добавляет технологию которой владеет программист в m_listTech

    — void dismissTech(int i) – удаляет технологию которой владеет программист из m_listTech

    — void printListTech() – выводит список технологий, которыми владеет программист

    — string whoAmI() – возвращает должность работника

    • Взаимодействие

    — Является дочерним классом для Employee
      1. Тестирование разработанной программы


    С листингом программы можно ознакомиться в приложении 1. Код представляет собой CLI приложение, в котором представлен некоторый менеджер сотрудников компании. При запуске компания не имеет ни одного сотрудника и вот как выглядит главное меню:



    Рисунок 3 - Main menu

    Первоначально компания существует без директора, следовательно никакие функции и манипуляции производить невозможно, создадим двух директоров:



    Рисунок 4 -Main menu



    Рисунок 5 - Main menu

    Теперь в компании два директора и нам доступны возможности директора, перейдем в Dirrector office.



    Рисунок 6 - Main menu

    Выберем Dir1 и нас встретит приветственное окно с нашими возможностями.



    Рисунок 7 - Menu dirrector

    Наймем для директора 5 работников (Два сотрудника, бухгалтер, секретарь и программист, для простоты восприятия будем указывать в имени короткое название отражающее должность) и выведем лист его работников. Здесь же стоит отметить, что в каждом классе использовался дополнительый метод – whoiam(), он передавал значение post в котором хранится должность работника, это реализовано для создания должностей и последующего взаимодействия с работниками в Employee office.



    Рисунок 8 - Menu dirrector

    Сразу же проверим функции изменения имени и зарплаты работника на примере 4-ого в списке:



    Рисунок 9 - Menu dirrector

    Как видим данные о работнике действительно изменились, теперь удалим его, он больше нам не нужен.



    Рисунок 10 - Menu dissmis employee

    Далее зайдем в Director office для второго директора и наймем двух программистов это нам понадобится для дальнейших тестов вывода списка ВСЕХ программистов (метод секретаря).



    Рисунок 11 - Menu dirrector

    Теперь можно протестировать Employee office, для начало необходимо выбрать под чьим подчинением находится работник.



    Рисунок 12 - Menu choose dirrector

    Выберем 0-ого директора.



    Рисунок 13 - Menu choose employee

    Теперь можно выбрать какой именно сотрудник входит в office, 1-ым будет обычный сотрудник – Emp1.



    Рисунок 14 - Menu choose employee

    Как мы видим он не имеет никаких прав, теперь зайдем в роли бухгалтера - Acc1.



    Рисунок 15 - Menu accountant

    Посмотрим ставку секретаря и посчитаем заработную плату для него.



    Рисунок 16 - Menu rate



    Рисунок 17 - Menu salary

    Теперь зайдем в office секретаря – Sec1.



    Рисунок 18 - Menu secretary

    Выведем таблицу сотрудников для директора, а также выведем таблицу всех программистов.



    Рисунок 19 - Menu table employee



    Рисунок 20 - Meny table programmers

    И наконец посмотрим на меню программиста – Prog1.



    Рисунок 21 - Menu Programmer

    Установим текущий уровень программиста.



    Рисунок 22 - Menu level

    А теперь добавим технологии которыми он владеет и выведем список.



    Рисунок 23 - Menu technologies
      1. «Алмаз смерти» демонстрация проблемы


    Для демонстрирования проблемы множественного наследования добавим новый класс DiamondDead:

    class DiamondDead : public Director, public Accountant {

    public:

    DiamondDead() { cout << "Diamond dead"; }

    };

    Тело главной функции main выглядит следующим образом:

    int main() {

    DiamondDead test = DiamondDead();

    test.whoAmI()

    }

    Полный листинг программы находится в приложении 1, однако данные строки закомментированы для нормальной реализации кода, здесь же это показано для наглядности проблемы «алмаз смерти».

    При компилировании программы, как и ожидалось мы видим следующую ошибку:



    Рисунок 24 - Последствия "Алмаза смерти"

    Что мы и ожидали исходя из теоретической части, дело в том, что при создании объектов класса DiamondDead создаются в начале объекты классов Director, а также Accountant, в каждой из них присутствует метод whoAmI(), что и порождает данную неопределенность.

    ВЫВОД


    В данной работе произвелось знакомство с разработкой приложений с использованием ООП. Познакомились с механизмом инкапсуляции и наследования. Помимо простой работы с классами наследования были протестированы частые ошибки программистов такие как множественная наследовательность или «алмаз смерти». Рассмотрение данной ошибки поможет при дальнейшей работе, ведь работая над проектом в одиночку если человек и столкнется с данной проблемой, то без особых трудностей исправит ее, но работая в команде эта ошибка сулит очень большие проблемы.

    В ходе тестирования разработанной программы ошибок не было выявлено, все работает должным образом.


    ПРИЛОЖЕНИЕ 1


    #include

    #include

    using namespace std;

    class Initials {

    protected:

    string m_firstName;

    string m_middleName;

    public:

    Initials(string firstName = "", string middleName = "")

    : m_firstName(firstName), m_middleName(middleName)

    {

    }

    string getFirstName() { return m_firstName; }

    int setFirstName(string firstName) { m_firstName = firstName; return 1; }

    string getMiddleName() { return m_middleName; }

    int setMiddleName(string middleName) { m_middleName = middleName; return 1; }

    };

    class Finans {

    protected:

    double m_salary;

    public:

    Finans(double salary = 0.0)

    : m_salary(salary)

    {

    }

    double getSalary() {

    return m_salary;

    }

    double setSalary(double salary) {

    m_salary = salary;

    return salary;

    }

    };

    class Employee : public Initials, public Finans {

    protected:

    string m_lastName;

    string post;

    public:

    Employee(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0)

    : Initials(firstName, middleName), Finans(salary), m_lastName(lastName)

    {

    post = "Employee";

    //cout << "Employee createred: " << m_firstName << " " << m_lastName << " " << m_middleName << "\nSalary = " << m_salary << "$" << endl;

    }

    string getLastName() { return m_lastName; }

    string getFullName() { return m_firstName + ' ' + m_lastName + ' ' + m_middleName; }

    int setLastName(string lastName) { m_lastName = lastName; return 1; }

    virtual string whoAmI() { return post; }

    };

    class Director : public Employee {

    public:

    vector < Employee* > m_listEmployee;

    vector < Employee* > m_listProgrammer;

    Director(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0)

    : Employee(firstName, lastName, middleName, salary)

    {

    post = "Director";

    cout << "Director createred: " << m_firstName << " " << m_lastName << " " << m_middleName << "\nSalary = " << m_salary << "$" << endl;

    }

    // Нанимаем работника (добавить должность кого добавляем)

    void hireEmployee( Employee * newEmployee, string post) {

    m_listEmployee.push_back(newEmployee);

    if (post == "Programmer") {

    m_listProgrammer.push_back(newEmployee);

    }

    }

    // Выводим лист работников

    void printListEmployee() {

    for (int i = 0; i < m_listEmployee.size(); i++) {

    cout << i << ". " << m_listEmployee[i]->getFullName() << " " << m_listEmployee[i]->getSalary() << "$" << endl;

    }

    }

    // Увольняем работника

    void dismissEmployee(int i) {

    if ((i < 0) or (i > m_listEmployee.size())) {

    throw - 1;

    }

    else {

    delete m_listEmployee[i];

    m_listEmployee.erase(m_listEmployee.begin() + i);

    }

    }

    // Узнать о работнике по его id в списке

    Employee * getEmployee(int i) {

    if ((i < 0) or (i > m_listEmployee.size() + 1)) {

    throw - 1;

    }

    else {

    return m_listEmployee[i];

    }

    }

    string whoAmI() { return post; }

    };

    class Accountant : public Employee {

    private:

    int rate[4] = {20, 13, 10, 15};

    public:

    Accountant(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0)

    : Employee(firstName, lastName, middleName, salary)

    {

    post = "Accountant";

    cout << "Accountant createred: " << m_firstName << " " << m_lastName << " " << m_middleName << "\nSalary = " << m_salary << "$" << endl;

    }

    // ставка сотрудников

    void getRate(int i) {

    switch(i)

    {

    case 0: {cout << "Director rate " << rate[i] << "$ per hour" << endl; break; }

    case 1: {cout << "Accountant rate " << rate[i] << "$ per hour" << endl; break; }

    case 2: {cout << "Secretary rate " << rate[i] << "$ per hour" << endl; break; }

    case 3: {cout << "Programmer rate " << rate[i] << "$ per hour" << endl; break; }

    }

    }

    // расчет заработной платы исходя из ставки сотрудника

    void getWages(int i) {

    switch (i)

    {

    case 0: {cout << "Director wage " << rate[i]*8*5 << "$ per month" << endl; break; }

    case 1: {cout << "Accountant wage " << rate[i] * 8 * 5 << "$ per month" << endl; break; }

    case 2: {cout << "Secretary wage " << rate[i] * 8 * 5 << "$ per month" << endl; break; }

    case 3: {cout << "Programmer wage " << rate[i] * 8 * 5 << "$ per month" << endl; break; }

    }

    }

    string whoAmI() { return post; }

    };

    class Secretary : public Employee {

    private:

    public:

    Secretary(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0)

    : Employee(firstName, lastName, middleName, salary)

    {

    post = "Secretary";

    cout << "Secretary createred: " << m_firstName << " " << m_lastName << " " << m_middleName << "\nSalary = " << m_salary << "$" << endl;

    }

    void printTableEmplouee(vector < Director >& listDirectors, int md) {

    if (listDirectors.size() == 0) {

    cout << "There are no employees :( " << '\n';

    }

    else {

    cout << "ID\t" << "|Firstname\t" << "|Lastname\t" << "|Middlename\t" << "|Sallary\t" << endl;

    for (int i = 0; i < listDirectors[md].m_listEmployee.size(); i++) {

    cout << i <<".\t" << "|" << listDirectors[md].m_listEmployee[i]->getFirstName() << "\t\t" << "|" << listDirectors[md].m_listEmployee[i]->getLastName() << "\t\t" << "|" <<

    listDirectors[md].m_listEmployee[i]->getMiddleName() << "\t\t" << "|" << listDirectors[md].m_listEmployee[i]->getSalary() << "$" << "\t\t" << endl;

    }

    }

    }

    void printTabbleProgrammer(vector < Director >& listDirectors) {

    int k = -1;

    cout << "ID\t" << "|Firstname\t" << "|Lastname\t" << "|Middlename\t" << "|Sallary\t" << endl;

    for (int i = 0; i < listDirectors.size(); i++) {

    for (int j = 0; j < listDirectors[i].m_listProgrammer.size(); j++) {

    cout << k+1 << ".\t" << "|" << listDirectors[i].m_listProgrammer[j]->getFirstName() << "\t\t" << "|" << listDirectors[i].m_listProgrammer[j]->getLastName() << "\t\t" << "|" <<

    listDirectors[i].m_listProgrammer[j]->getMiddleName() << "\t\t" << "|" << listDirectors[i].m_listProgrammer[j]->getSalary() << "$" << "\t\t" << endl;

    }

    }

    }

    string whoAmI() { return post; }

    };

    class Programmer : public Employee {

    private:

    string m_levelProgramming = "";

    string m_pullLevel[4] = {"Junior", "Middle", "Senior", "Lead"};

    vector < string > m_listTech;

    public:

    Programmer(string firstName = "", string lastName = "", string middleName = "", double salary = 0.0)

    : Employee(firstName, lastName, middleName, salary)

    {

    post = "Programmer";

    cout << "Programmer createred: " << m_firstName << " " << m_lastName << " " << m_middleName << "\nSalary = " << m_salary << "$" << endl;

    }

    void setLevelProgramming(int i) {

    m_levelProgramming = m_pullLevel[i];

    }

    string getLevelProgramming() {

    return m_levelProgramming;

    }

    void addTech(string newTech) {

    m_listTech.push_back(newTech);

    }

    void dismissTech(int i) {

    if ((i < 0) or (i > m_listTech.size())) {

    throw - 1;

    }

    else {

    auto iter = m_listTech.cbegin(); // указатель на первый элемент

    m_listTech.erase(iter + i);

    }

    }

    void printListTech() {

    for (int i = 0; i < m_listTech.size(); i++) {

    cout << i << ". " << m_listTech[i] << endl;

    }

    }

    string whoAmI() { return post; }

    };

    void printListDirectors(vector < Director >& listDirectors) {

    if (listDirectors.size() == 0) {

    cout << "There are no directors :( " << '\n';

    }

    else {

    for (int i = 0; i < listDirectors.size(); i++) {

    cout << i << ". " << listDirectors[i].getFullName() << endl;

    }

    }

    }

    /*

    class DiamondDead : public Director, public Accountant {

    public:

    DiamondDead() { cout << "Diamond dead"; }

    };

    */

    int main() {

    //DiamondDead test = DiamondDead();

    //test.whoAmI();

    string firstName;

    string lastName;

    string middleName;

    double sallary;

    int opt = -1;

    int mainDirector;

    int mainEmployee;

    vector < Director > listDirectors;

    vector < Programmer > listProgrammer;

    int option = -1;

    while (opt != 0) {

    system("cls");

    cout << "Main menu" << endl <<

    "0. Exit" << endl <<

    "1. Create director" << endl <<

    "2. Director list" << endl <<

    "3. Director office" << endl <<

    "4. Employee office" << endl;

    cout << "Enter: ";

    cin >> opt;

    switch (opt) {

    case 0:

    break;

    case 1: {

    cout << "Enter firstName, lastName, middleName and salary " << endl;

    cout << "Enter: ";

    cin >> firstName >> lastName >> middleName;

    cin >> sallary;

    listDirectors.push_back(*(new Director(firstName, lastName, middleName, sallary)));

    system("pause");

    }

    break;

    case 2: {

    printListDirectors(listDirectors);

    system("pause");

    }

    break;

    case 3: {

    cout << "Who's in charge? " << endl;

    printListDirectors(listDirectors);

    cout << "Enter: ";

    cin >> mainDirector;

    int optDir = -1;

    while (optDir != 0) {

    system("cls");

    cout << "Menu Director. " << "Welcome " << listDirectors[mainDirector].getFirstName() << "!" << endl <<

    "0. Back" << endl <<

    "1. Hire employee" << endl <<

    "2. Dismiss empoyee" << endl <<

    "3. Employee list" << endl <<

    "4. Change name employee" << endl <<

    "5. Change sallary" << endl;

    cout << "Enter: ";

    cin >> optDir;

    switch (optDir) {

    case 0:

    break;

    case 1:

    {

    system("cls");

    int typeEmployee;

    cout << "Who are we hiring?" << endl <<

    "0. Employee" << endl <<

    "1. Accountant" << endl <<

    "2. Secretary" << endl <<

    "3. Programmer" << endl;

    cout << "Enter: ";

    cin >> typeEmployee;

    cout << "Enter firstName, lastName, middleName and salary " << endl;

    cout << "Enter: ";

    cin >> firstName >> lastName >> middleName;

    cin >> sallary;

    switch (typeEmployee) {

    case 0:

    listDirectors[mainDirector].hireEmployee(new Employee(firstName, lastName, middleName, sallary), "Employee");

    break;

    case 1:

    listDirectors[mainDirector].hireEmployee(new Accountant(firstName, lastName, middleName, sallary), "Accountant");

    break;

    case 2:

    listDirectors[mainDirector].hireEmployee(new Secretary(firstName, lastName, middleName, sallary), "Secretary");

    break;

    case 3:

    listDirectors[mainDirector].hireEmployee(new Programmer(firstName, lastName, middleName, sallary), "Programmer");

    break;

    }

    system("pause");

    }

    break;

    case 2: {

    system("cls");

    cout << "Who needs to leave the company?" << endl;

    listDirectors[mainDirector].printListEmployee();

    cout << "Enter: ";

    int numberDismiss;

    cin >> numberDismiss;

    listDirectors[mainDirector].dismissEmployee(numberDismiss);

    listDirectors[mainDirector].printListEmployee();

    system("pause");

    }

    break;

    case 3: {

    listDirectors[mainDirector].printListEmployee();

    system("pause");

    }

    break;

    case 4: {

    cout << "Which employee has the wrong name?" << endl;

    listDirectors[mainDirector].printListEmployee();

    cout << "Enter: ";

    cin >> mainEmployee;

    cout << "Enter the correct data:" << endl;

    cin >> firstName >> lastName >> middleName;

    listDirectors[mainDirector].getEmployee(mainEmployee)->setFirstName(firstName);

    listDirectors[mainDirector].getEmployee(mainEmployee)->setLastName(lastName);

    listDirectors[mainDirector].getEmployee(mainEmployee)->setMiddleName(middleName);

    cout << "Successfully! New employee data: " << listDirectors[mainDirector].getEmployee(mainEmployee)->getFullName() << endl;

    system("pause");

    }

    break;

    case 5: {

    cout << "Which employee has the wrong sallary?" << endl;

    listDirectors[mainDirector].printListEmployee();

    cout << "Enter: ";

    cin >> mainEmployee;

    cout << "Enter the correct data:" << endl;

    cin >> sallary;

    listDirectors[mainDirector].getEmployee(mainEmployee)->setSalary(sallary);

    cout << "Successfully! New employee data: " << listDirectors[mainDirector].getEmployee(mainEmployee)->getSalary() << endl;

    system("pause");

    }

    break;

    }

    }

    system("pause");

    }

    break;

    case 4: {

    system("cls");

    cout << "Who is your boss?" << endl;

    printListDirectors(listDirectors);

    cout << "Enter: ";

    cin >> mainDirector;

    system("cls");

    cout << listDirectors[mainDirector].getFullName() << " best director! And who are you?" << endl;

    listDirectors[mainDirector].printListEmployee();

    cout << "Enter: ";

    cin >> mainEmployee;

    int optEmployee = -1;

    if (listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() == "Accountant") {

    while (optEmployee != 0) {

    system("cls");

    cout << "Menu " << listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() << ". Welcome " << listDirectors[mainDirector].getEmployee(mainEmployee)->getFirstName() << "!" << endl;

    cout << "0. Back" << endl <<

    "1. Find out the rate by position" << endl <<

    "2. Calculate salary" << endl;

    cout << "Enter: ";

    cin >> optEmployee;

    switch (optEmployee) {

    case 0:

    break;

    case 1:

    {

    system("cls");

    cout << "What position are you interested in?" << endl <<

    "0. Director rate " << endl <<

    "1. Accountant rate " << endl <<

    "2. Secretary rate " << endl <<

    "3. Programmer rate " << endl;

    int optRate;

    cout << "Enter: ";

    cin >> optRate;

    ((Accountant*)listDirectors[mainDirector].getEmployee(mainEmployee))->getRate(optRate);

    system("pause");

    }

    break;

    case 2:

    {

    system("cls");

    cout << "For whom position to calculate the salary?" << endl <<

    "0. Director salary " << endl <<

    "1. Accountant salary " << endl <<

    "2. Secretary salary " << endl <<

    "3. Programmer salary " << endl;

    int optRate;

    cout << "Enter: ";

    cin >> optRate;

    ((Accountant*)listDirectors[mainDirector].getEmployee(mainEmployee))->getWages(optRate);

    system("pause");

    }

    break;

    }

    }

    }

    else if (listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() == "Secretary") {

    while (optEmployee != 0) {

    system("cls");

    cout << "Menu " << listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() << ". Welcome " << listDirectors[mainDirector].getEmployee(mainEmployee)->getFirstName() << "!" << endl;

    cout << "0. Back" << endl <<

    "1. Output for the director of employees" << endl <<

    "2. Bring out the programmers" << endl;

    cout << "Enter: ";

    cin >> optEmployee;

    switch (optEmployee) {

    case 0:

    break;

    case 1:

    {

    cout << "List of employees" << endl;

    system("cls");

    ((Secretary*)listDirectors[mainDirector].getEmployee(mainEmployee))->printTableEmplouee(listDirectors, mainDirector);

    system("pause");

    }

    break;

    case 2:

    {

    cout << "List of programmers" << endl;

    system("cls");

    ((Secretary*)listDirectors[mainDirector].getEmployee(mainEmployee))->printTabbleProgrammer(listDirectors);

    system("pause");

    }

    break;

    }

    }

    }

    else if (listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() == "Programmer") {

    while (optEmployee != 0) {

    system("cls");

    cout << "Menu " << listDirectors[mainDirector].getEmployee(mainEmployee)->whoAmI() << ". Welcome " << listDirectors[mainDirector].getEmployee(mainEmployee)->getFirstName() << "!" << endl;

    cout << "0. Back" << endl <<

    "1. Your programming level" << endl <<

    "2. List of technologies that you own" << endl <<

    "3. Add technology" << endl <<

    "4. Dismiss technology" << endl;

    cout << "Enter: ";

    cin >> optEmployee;

    switch (optEmployee) {

    case 0:

    break;

    case 1:

    {

    int lp;

    if (((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->getLevelProgramming() == "") {

    system("cls");

    cout << "You don't have a level yet. Choose level:" << endl;

    cout << "0. Junior" << endl <<

    "1. Middle" << endl <<

    "2. Senior" << endl <<

    "3. Lead" << endl;

    cout << "Enter: " << endl;

    cin >> lp;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->setLevelProgramming(lp);

    cout << "Your programming level: " << ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->getLevelProgramming() << endl;

    }

    else {

    cout << "Your programming level: " << ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->getLevelProgramming() << endl;

    cout << "Do you want to change the level?" << endl;

    cout << "Yes/No: ";

    string chl;

    cin >> chl;

    if (chl == "y") {

    cout << "0. Junior" << endl <<

    "1. Middle" << endl <<

    "2. Senior" << endl <<

    "3. Lead" << endl;

    cout << "Enter: " << endl;

    cin >> lp;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->setLevelProgramming(lp);

    cout << "Your programming level: " << ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->getLevelProgramming() << endl;

    }

    }

    system("pause");

    }

    break;

    case 2:

    {

    system("cls");

    cout << "List of technologies" << endl;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->printListTech();

    system("pause");

    }

    break;

    case 3:

    {

    cout << "Add new technology: ";

    string tech;

    cin >> tech;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->addTech(tech);

    system("pause");

    }

    break;

    case 4:

    {

    system("cls");

    cout << "Select the technology you want to remove" << endl;

    int ntech;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->printListTech();

    cout << "Enter: ";

    cin >> ntech;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->dismissTech(ntech);

    cout << "New list" << endl;

    ((Programmer*)listDirectors[mainDirector].getEmployee(mainEmployee))->printListTech();

    system("pause");

    }

    break;

    }

    }

    }

    else { cout << "You don't have rights :("; system("pause");}

    }

    break;

    }

    }

    }


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