- •Отчет по лабораторной работе №3 Иерархия объектов и группа. Итераторы.
- •1 Техническое задание
- •Введение
- •Основание для разработки
- •Назначение
- •Требования к программе
- •Требования к программной документации
- •3 Иерархия объектов
- •4 Определение классов (добавленных или измененных по сравнению с лабораторной работой № 2)
- •5 Реализация для одного не абстрактного класса-группы всех методов
- •6 Реализация итератора
- •7 Реализация передаваемой итератору функции
- •8 Подключаемые библиотеки и метод main
- •9 Скриншот, иллюстрирующий результат работы программы
5 Реализация для одного не абстрактного класса-группы всех методов
Реализация методов, определённых в классе WorkShop:
void WorkShop::Show()
{
PrintDividingRow();
printf("\nЦех %s, с начальником: ", _name);
_head->Show();
if (_listHead == NULL) printf("\nУ которого нет подчинённых.\n");
else
{
printf("\nКоторому подчиняются:\n");
TItem* cur = _listHead;
while(cur != NULL)
{
cur->_item->Show();
printf("\n");
cur = cur->_nextItem;
}
}
PrintDividingRow();
}
А это – методы, определённые в предках класса WorkShop (которые Workshop не переопределяет):
TPerson* TDepartment::GetHead()
{
return _head;
}
void TDepartment::SetHead( TPerson* person )
{
if (person != NULL)
{
if (_head != NULL) delete _head;
_head = person;
}
}
void TDepartment::PushBack( TObject* obj )
{
if (obj == NULL)
{
return;
}
TItem* item = new TItem;
item->_item = obj;
item->_nextItem = NULL;
if (_listHead == NULL) _listHead = item;
else
{
TItem* cur = _listHead;
while(cur->_nextItem != NULL)
cur = cur->_nextItem;
cur->_nextItem = item;
}
}
void TDepartment::ForEach( PF action, int minExp )
{
if (_head != NULL) action(_head, minExp);
if (_listHead == NULL) return;
TItem* cur = _listHead;
while(cur != NULL)
{
action(cur->_item, minExp);
cur = cur->_nextItem;
}
}
char* TObject::GetName()
{
return _name;
}
void TObject::SetName( char* name )
{
if (name != NULL) // Если переданная строка не является NULL-значением
{
_name = new char[strlen(name) + 1];
strcpy(_name, name);
}
else _name = NULL;
}
6 Реализация итератора
void TDepartment::ForEach( PF action, int minExp )
{
if (_head != NULL) action(_head, minExp);
if (_listHead == NULL) return;
TItem* cur = _listHead;
while(cur != NULL)
{
action(cur->_item, minExp);
cur = cur->_nextItem;
}
}
7 Реализация передаваемой итератору функции
void PrintName(TObject* obj, int minExp)
{
if (typeid(*obj) == typeid(Worker))
{
Worker* temp = (Worker*) obj;
if (temp->GetWorkExp() >= minExp) temp->Show();
}
else if (typeid(*obj) == typeid(Employee))
{
Employee* temp = (Employee*) obj;
if (temp->GetWorkExp() >= minExp) temp->Show();
}
else if(typeid(*obj) == typeid(Engineer))
{
Engineer* temp = (Engineer*) obj;
if (temp->GetWorkExp() >= minExp) temp->Show();
}
else return;
printf("\n");
}
8 Подключаемые библиотеки и метод main
#include <stdio.h>
#include <typeinfo.h>
#include <Windows.h>
#include "Branch.h"
#include "Department.h"
#include "Employee.h"
#include "Engineer.h"
#include "Factory.h"
#include "HelperMethods.h"
#include "Person.h"
#include "TObject.h"
#include "Worker.h"
#include "WorkShop.h"
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Engineer* engineerFactory;
Worker* workerFactory;
Employee* employeeFactory;
printf("Создаём завод под названием СибСФУНефть с директором-служащим Иваном возраста 50 лет со стажем работы 30 лет");
employeeFactory = new Employee("Иван", 50, 30);
Factory factory("СибСФУНефть", employeeFactory);
printf("\nСоздаём филиал, находящийся в подчинении у СибСФУНефть под названием ИКИТГаз с директором-рабочим Василием возраста 29 лет со стажем работы 10 лет");
workerFactory = new Worker("Василий", 29, 10);
Branch* branchISIT = new Branch("ИКИТГаз", workerFactory);
factory.PushBack(branchISIT);
printf("\nСоздаём цех, находящийся в подчинении у СибСФУНефть под названием НиГ с директором-рабочим Николаем возраста 40 лет со стажем работы 13 лет");
workerFactory = new Worker("Николай", 40, 13);
WorkShop* wsNIG = new WorkShop("НиГ", workerFactory);
factory.PushBack(wsNIG);
printf("\nСоздаём филиал, находящийся в подчинении у НиГ под названием СибГАУНикель с директором-инженером Дмитрием возраста 30 лет со стажем работы 5 лет\n");
engineerFactory = new Engineer("Дмитрий", 30, 5);
Branch* branchSIBGAU = new Branch("СибГАУНикель", engineerFactory);
branchISIT->PushBack(branchSIBGAU);
printf("Теперь заполним каждое подразделение рабочими, инженерами, и служащими");
factory.PushBack(new Engineer("Юлия", 24, 2));
factory.PushBack(new Employee("Владислав", 41, 10));
factory.PushBack(new Employee("Николай", 31, 7));
branchISIT->PushBack(new Worker("Евгений", 30, 2));
branchISIT->PushBack(new Worker("Анатолий", 39, 10));
branchISIT->PushBack(new Engineer("Алёна", 45, 21));
wsNIG->PushBack(new Worker("Алексей", 23, 1));
wsNIG->PushBack(new Employee("Михаил", 29, 7));
wsNIG->PushBack(new Engineer("Екатерина", 35, 10));
branchSIBGAU->PushBack(new Employee("Олег", 35, 2));
branchSIBGAU->PushBack(new Employee("Глеб", 50, 15));
branchSIBGAU->PushBack(new Engineer("Виталий", 32, 7));
branchSIBGAU->PushBack(new Worker("Юлия", 38, 12));
factory.Show();
printf("\n\nВсе рабочие, служащие и инженеры, работающие в СибСФУНефть, рабочий стаж которых выше 7 лет:\n");
factory.ForEach(PrintName, 8);
printf("\n\nВсе рабочие, служащие и инженеры, работающие в СибГАУНикель, рабочий стаж которых выше 2 лет:\n");
branchSIBGAU->ForEach(PrintName, 3);
}