elevator  0.7
Симулятор пассажирского лифта
Класс Control

Основной класс — симулятор пассажирского лифта Подробнее...

#include <Control.h>

Открытые члены

 Control (size_t numberOfFloors, size_t numberOfElevators, size_t capacityOfElevator)
 Инициализирующий конструктор Подробнее...
 
 ~Control ()
 Деструктор Подробнее...
 
void MakeStep ()
 Функция выполнения шага моделирования по времени Подробнее...
 
size_t getCurrentTime () const
 Функция запроса текущего времени Подробнее...
 
void SetElevatorDestination (size_t elevatorNumber, size_t destination)
 Функция задания назначения лифту Подробнее...
 
void SetElevatorIndicator (size_t elevatorNumber, ElevatorIndicator indicator)
 Функция задания состояния индикатора лифта (лампочка со стрелочкой, которую видят пассажиры) Подробнее...
 
size_t getElevatorDestination (size_t elevatorNumber) const
 Функция запроса текущего назначения Подробнее...
 
ElevatorIndicator getElevatorIndicator (size_t elevatorNumber) const
 Функция запроса текущего состояния индикатора Подробнее...
 
bool isElevatorAchievedDestination (size_t elevatorNumber) const
 Проверка того, что лифт завершил выполнение текущего назначения Подробнее...
 
bool isElevatorEmptyAfterUnloading (size_t elevatorNumber) const
 Проверка того, что лифт пустой после выхода очередного пассажира Подробнее...
 
bool isElevatorEmpty (size_t elevatorNumber) const
 Проверка того, что кабина лифта пуста Подробнее...
 
bool isElevatorGoingUp (size_t elevatorNumber) const
 Проверка того, что кабина лифта движется вверх Подробнее...
 
bool isElevatorGoingDn (size_t elevatorNumber) const
 Проверка того, что кабина лифта движется вниз Подробнее...
 
bool isElevatorStaying (size_t elevatorNumber) const
 Проверка того, что кабина лифта стоит (не движется) Подробнее...
 
bool isElevatorGoingUniformly (size_t elevatorNumber) const
 Проверка того, что кабина лифта движется равномерно Подробнее...
 
bool isElevatorAccelerating (size_t elevatorNumber) const
 Проверка того, что кабина лифта ускоряется (разгоняется) Подробнее...
 
bool isElevatorBreaking (size_t elevatorNumber) const
 Проверка того, что кабина лифта замедляется (тормозит) Подробнее...
 
bool isElevatorDoorsOpening (size_t elevatorNumber) const
 Проверка того, что у кабины лифта в данный момент открываются двери Подробнее...
 
bool isElevatorDoorsClosing (size_t elevatorNumber) const
 Проверка того, что у кабины лифта в данный момент закрываются двери Подробнее...
 
bool isElevatorDoorsOpened (size_t elevatorNumber) const
 Проверка того, что у кабины лифта в данный момент открыты двери Подробнее...
 
bool isElevatorStayingDoorsClosed (size_t elevatorNumber) const
 Проверка того, что у кабина лифта в данный момент стоит на этаже с закрытыми дверьми Подробнее...
 
double getElevatorPosition (size_t elevatorNumber) const
 Функция запроса текущего положения лифта Подробнее...
 
const std::vector< bool > & getFloorUpButtons () const
 Функция запроса состояний кнопок "вверх" на этажах Подробнее...
 
const std::vector< bool > & getFloorDnButtons () const
 Функция запроса состояний кнопок "вниз" на этажах Подробнее...
 
bool getFloorUpButton (size_t floor) const
 Функция запроса состояния кнопки "вверх" на конкретном этаже Подробнее...
 
bool getFloorDnButton (size_t floor) const
 Функция запроса состояния кнопки "вниз" на конкретном этаже Подробнее...
 
void unsetUpButton (size_t floor)
 Функция сброса (выключения) кнопки "вверх" на конкретном этаже Подробнее...
 
void unsetDnButton (size_t floor)
 Функция сброса (выключения) кнопки "вниз" на конкретном этаже Подробнее...
 
const std::vector< bool > & getElevatorButtons (size_t elevatorNumber) const
 Функция запроса состояний кнопок в кабине лифта Подробнее...
 
bool getElevatorButton (size_t elevatorNumber, size_t floor) const
 Функция запроса состояния конкретной кнопки в кабине лифта Подробнее...
 
void AddPassengerToQueue (const PassengerProperties &passProp_)
 Функция добавления пассажира в очередь Подробнее...
 
void ReadTimeTable (const std::string &fileName_)
 Функция чтения расписания появления пассажиров на этажах Подробнее...
 
void PrintElevatorState (size_t elevatorNumber, const std::string &fname="") const
 Функция печати в файл или на экран состояния лифта в текущий момент времени Подробнее...
 
void PrintButtonsState (const std::string &fname="") const
 Функция печати в файл или на экран состояния кнопок в кабинах и на этажах в текущий момент времени Подробнее...
 
void PrintPassengerState (const std::string &fname="") const
 Функция печати в файл или на экран событий, произошедших с пассажирами за последний шаг (последнюю секунду) Подробнее...
 
void PrintStatistics (bool passengersDetails, const std::string &fname="") const
 Функция печати в файл или на экран итоговой статистики, включая итоговый "рейтинг" (чем меньше - тем лучше!) Подробнее...
 

Открытые атрибуты

const size_t waitingTime = 5
 Время ожидания до закрытия дверей (если только кто-то не нажмет кнопку "ход" раньше) Подробнее...
 
const size_t timeEntering = 2
 Время между входами двух пассажиров в лифт Подробнее...
 
const size_t timeLeaving = 2
 Время между выходами двух пассажиров в лифт Подробнее...
 
const size_t timeOpening = 4
 Время открывания дверей Подробнее...
 
const size_t timeClosing = 4
 Время закрывания дверей Подробнее...
 
const size_t timeAccelerating = 4
 Время разгона лифта Подробнее...
 
const size_t timeBreaking = 3
 Время торможения лифта Подробнее...
 
const double veloUniform = 0.25
 Скорость равномерно движения лифта (в долях этажа) Подробнее...
 

Подробное описание

Основной класс — симулятор пассажирского лифта

См. определение в файле Control.h строка 25

Конструктор(ы)

Control::Control ( size_t  numberOfFloors,
size_t  numberOfElevators,
size_t  capacityOfElevator 
)

Инициализирующий конструктор

Аргументы
[in]numberOfFloorsчисло этажей (считая подвальный)
[in]numberOfElevatorsчисло лифтовых кабин
[in]capacityOfElevatorемкость каждой кабины

См. определение в файле Control.cpp строка 22

23  : floorButtons(new FloorButtons(numberOfFloors)), queue(new Queue(numberOfFloors)), time(0)
24 {
25  for (size_t id = 0; id < numberOfElevators; ++id)
26  elevators.emplace_back(new Elevator(numberOfFloors, capacityOfElevator, id));
27 }//Control(...)
Класс — кабина лифта
Definition: Elevator.h:79
const size_t numberOfFloors
Общее число этажей
Definition: main.cpp:67
const size_t numberOfElevators
Число лифтов
Definition: main.cpp:56
Класс — очередь пассажиров
Definition: Queue.h:21
Класс — кнопки на этажах
Definition: FloorButtons.h:19
Control::~Control ( )

Деструктор

См. определение в файле Control.cpp строка 30

31 {
32 }//~Control()

Граф вызовов:

Методы

void Control::AddPassengerToQueue ( const PassengerProperties passProp_)

Функция добавления пассажира в очередь

Аргументы
[in]passProp_константная ссылка на список параметров пассажира

См. определение в файле Control.cpp строка 554

555 {
556  queue->addPassenger(passProp_);
557 }//AddPassengerToQueue(...)

Граф вызова функции:

size_t Control::getCurrentTime ( ) const
inline

Функция запроса текущего времени

Возвращает
текущее время в секундах от начала моделирования

См. определение в файле Control.h строка 110

111  {
112  return time;
113  }

Граф вызова функции:

bool Control::getElevatorButton ( size_t  elevatorNumber,
size_t  floor 
) const
inline

Функция запроса состояния конкретной кнопки в кабине лифта

Аргументы
[in]elevatorNumberномер кабины, состояние кнопки в которой запрашивается
[in]floorкнопка, состояние которой запрашивается
Возвращает
признак нажатости конкретной кнопки в соответствующей кабине лифта

См. определение в файле Control.h строка 411

412  {
413  return elevators[elevatorNumber]->getButton(floor);
414  }

Граф вызовов:

const std::vector<bool>& Control::getElevatorButtons ( size_t  elevatorNumber) const
inline

Функция запроса состояний кнопок в кабине лифта

Аргументы
[in]elevatorNumberномер кабины, состояние кнопок в которой запрашивается
Возвращает
константную ссылку на вектор признаков нажатости кнопок в соответствующей кабине лифта

См. определение в файле Control.h строка 400

401  {
402  return elevators[elevatorNumber]->getButtons();
403  }
size_t Control::getElevatorDestination ( size_t  elevatorNumber) const
inline

Функция запроса текущего назначения

Аргументы
[in]elevatorNumberномер кабины, назначение которой запрашивается
Возвращает
этаж назначения соответствующей кабины лифта

См. определение в файле Control.h строка 140

141  {
142  return elevators[elevatorNumber]->getDestination();
143  }

Граф вызова функции:

ElevatorIndicator Control::getElevatorIndicator ( size_t  elevatorNumber) const
inline

Функция запроса текущего состояния индикатора

Аргументы
[in]elevatorNumberномер кабины, состояние индикатора которой запрашивается
Возвращает
состояние индикатора (вверх, вниз или в обе стороны) соответствующей кабины лифта

См. определение в файле Control.h строка 150

151  {
152  return elevators[elevatorNumber]->getIndicator();
153  }

Граф вызова функции:

double Control::getElevatorPosition ( size_t  elevatorNumber) const
inline

Функция запроса текущего положения лифта

Аргументы
[in]elevatorNumberномер кабины, положение которой запрашивается
Возвращает
дробное число; если дробная часть нудевая - то лифт на этаже

См. определение в файле Control.h строка 332

333  {
334  return elevators[elevatorNumber]->getPosition();
335  }

Граф вызова функции:

bool Control::getFloorDnButton ( size_t  floor) const
inline

Функция запроса состояния кнопки "вниз" на конкретном этаже

Аргументы
[in]floorномер этажа, на котором опрашивается кнопка
Возвращает
признак нажатости кнопки "вниз" на соответствующем этаже

См. определение в файле Control.h строка 370

371  {
372  return floorButtons->getDnButton(floor);
373  }
const std::vector<bool>& Control::getFloorDnButtons ( ) const
inline

Функция запроса состояний кнопок "вниз" на этажах

Возвращает
константную ссылка на вектор признаков нажатости кнопок "вниз" на этажах

См. определение в файле Control.h строка 350

351  {
352  return floorButtons->getDnButtons();
353  }

Граф вызова функции:

bool Control::getFloorUpButton ( size_t  floor) const
inline

Функция запроса состояния кнопки "вверх" на конкретном этаже

Аргументы
[in]floorномер этажа, на котором опрашивается кнопка
Возвращает
признак нажатости кнопки "вверх" на соответствующем этаже

См. определение в файле Control.h строка 360

361  {
362  return floorButtons->getUpButton(floor);
363  }
const std::vector<bool>& Control::getFloorUpButtons ( ) const
inline

Функция запроса состояний кнопок "вверх" на этажах

Возвращает
константную ссылка на вектор признаков нажатости кнопок "вверх" на этажах

См. определение в файле Control.h строка 341

342  {
343  return floorButtons->getUpButtons();
344  }

Граф вызова функции:

bool Control::isElevatorAccelerating ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта ускоряется (разгоняется)

Может быть истинной только при закрытых дверях, когда лифт движется вверх или вниз с ускорением (разгоном)

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак движения соответствующей кабины лифта с ускорением (при разгоне)

См. определение в файле Control.h строка 262

263  {
264  return elevators[elevatorNumber]->isAccelerating();
265  }
bool Control::isElevatorAchievedDestination ( size_t  elevatorNumber) const
inline

Проверка того, что лифт завершил выполнение текущего назначения

Назначение считается выполненым, когда

  • лифт приехал на тот этаж, куда его послали, остановился, и
  • выполнено одно из трех условий:
    1. в нем есть хотя бы 1 пассажир - тогда открылись двери
    2. он пустой, а на этаже, на который он прибыл, нажата хотя бы одна кнопка - тогда тоже открылись двери
    3. он пустой, а на этаже, на который он прибыл, не нажато ни одной кнопки - тогда двери не открываются
Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак выполнения назначения соответствующей кабиной лифта

См. определение в файле Control.h строка 167

168  {
169  return elevators[elevatorNumber]->isDestinationAchieved(floorButtons->getUpButtons(), floorButtons->getDnButtons());
170  }

Граф вызова функции:

bool Control::isElevatorBreaking ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта замедляется (тормозит)

Может быть истинной только при закрытых дверях, когда лифт движется вверх или вниз с замедлением (тормозит)

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак движения соответствующей кабины лифта с замедлением (при торможении)

См. определение в файле Control.h строка 274

275  {
276  return elevators[elevatorNumber]->isBreaking();
277  }
bool Control::isElevatorDoorsClosing ( size_t  elevatorNumber) const
inline

Проверка того, что у кабины лифта в данный момент закрываются двери

Может быть истинной только при нахождении лифта на этаже, когда он не движется

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак того, что у соответствующей кабины лифта происходит закрывание дверей

См. определение в файле Control.h строка 298

299  {
300  return elevators[elevatorNumber]->isDoorsClosing();
301  }
bool Control::isElevatorDoorsOpened ( size_t  elevatorNumber) const
inline

Проверка того, что у кабины лифта в данный момент открыты двери

Может быть истинной только при нахождении лифта на этаже, когда он не движется

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак того, что у соответствующей кабины лифта открыты двери

См. определение в файле Control.h строка 310

311  {
312  return elevators[elevatorNumber]->isDoorsOpened();
313  }
bool Control::isElevatorDoorsOpening ( size_t  elevatorNumber) const
inline

Проверка того, что у кабины лифта в данный момент открываются двери

Может быть истинной только при нахождении лифта на этаже, когда он не движется

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак того, что у соответствующей кабины лифта происходит открывание дверей

См. определение в файле Control.h строка 286

287  {
288  return elevators[elevatorNumber]->isDoorsOpening();
289  }
bool Control::isElevatorEmpty ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта пуста

Состояние лифта не проверяется - стоит он или едет, открыты или нет двери

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак пустоты соответствующей кабины лифта

См. определение в файле Control.h строка 200

201  {
202  return elevators[elevatorNumber]->isEmpty();
203  }
bool Control::isElevatorEmptyAfterUnloading ( size_t  elevatorNumber) const
inline

Проверка того, что лифт пустой после выхода очередного пассажира

Возвращает true, если лифт стоит на этаже, и после выхода очередного пассажира лифт оказался пустым — возможно, при этом имеет смысл "включить" индикатор в оба направления, чтобы в любом случае зашел пассажир, стоящий первым в очереди. Но это не обязательно - у Вас может быть своя логика!

Если индикатор лифта "горит" в состоянии both (в обе стороны), при этом он пустой или нет - не важно, и в лифт входит пассажир, то индикатор автоматически переключается в то направление, какую кнопку он нажал, входя в лифт.

Будьте осторожны, "зажигайте" состояние индикатора both (в обе стороны) аккуратно, но и без него обойтись будет трудно!

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак пустоты соответствующей кабины лифта после выхода очередного пассажира

См. определение в файле Control.h строка 188

189  {
190  return elevators[elevatorNumber]->isEmptyAfterUnloading();
191  }
bool Control::isElevatorGoingDn ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта движется вниз

Может быть истинной только при закрытых дверях; едет ли лифт равномерно или с ускорением - не важно

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак движения вниз соответствующей кабины лифта

См. определение в файле Control.h строка 224

225  {
226  return elevators[elevatorNumber]->isGoingDn();
227  }
bool Control::isElevatorGoingUniformly ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта движется равномерно

Может быть истинной только при закрытых дверях, когда лифт движется равномерно (не разгоняется и не тормозит)

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак равномерного движения соответствующей кабины лифта

См. определение в файле Control.h строка 250

251  {
252  return elevators[elevatorNumber]->isGoingUniformly();
253  }

Граф вызова функции:

bool Control::isElevatorGoingUp ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта движется вверх

Может быть истиной только при закрытых дверях; едет ли лифт равномерно или с ускорением - не важно

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак движения вверх соответствующей кабины лифта

См. определение в файле Control.h строка 212

213  {
214  return elevators[elevatorNumber]->isGoingUp();
215  }
bool Control::isElevatorStaying ( size_t  elevatorNumber) const
inline

Проверка того, что кабина лифта стоит (не движется)

Может быть истиной не только, когда лифт на этаже (при этом состояние дверей не важно), но и между этажами, когда лифт, к примеру ехал вверх, но поступило новое назначение: а этом случае он тормозит, в течение 1 секунды стоит на месте (в этот ммомент данное условие будет выполненным), а потом разгоняется вниз

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак стояния на месте соответствующей кабины лифта

См. определение в файле Control.h строка 238

239  {
240  return elevators[elevatorNumber]->isStaying();
241  }
bool Control::isElevatorStayingDoorsClosed ( size_t  elevatorNumber) const
inline

Проверка того, что у кабина лифта в данный момент стоит на этаже с закрытыми дверьми

Может быть истинной только при нахождении лифта на этаже

Аргументы
[in]elevatorNumberномер кабины, для которой проверяется данное условие
Возвращает
признак того, что соответствующая кабина лифта стоит на этаже с закрытыми дверьми

См. определение в файле Control.h строка 322

323  {
324  return elevators[elevatorNumber]->isStayingDoorsClosed();
325  }
void Control::MakeStep ( )

Функция выполнения шага моделирования по времени

См. определение в файле Control.cpp строка 102

103 {
104  passStatBuffer.resize(0);
105 
106  TimeIncrement();
107 
108  //Проверка появления пассажиров на этажах и их передача
109  //в соответствующие списки ожидающих на этажах
110  FindAppearingPassengers();
111 
112  //Нажатие появившимися пассажирами кнопок на этажах
113  PressingFloorButtons();
114 
115  //Пассажиры, ждавшие слишком долго, уходят с этажей, и за это начисляется большой штраф
116  LeavingFloors();
117 
118  //Посадка пассажиров в лифты на этажах
119  //цикл по этажам:
120  for (size_t pos = 0; pos < floorButtons->dnButtons.size(); ++pos)
121  {
122  //std::vector<ElevatorIndicator> ind = { ElevatorIndicator::up, ElevatorIndicator::down };
123 
124  //for (auto& indValue : ind)
125  //{
126  std::vector<Elevator*> elevOnFloor;
127  for (auto& e : elevators)
128  {
129  if ((e->position / 100 == pos) && (e->doorsStatus == ElevatorDoorsStatus::openedLoading))
130  if (e->getNumberOfPassengers() < e->capacity)
131  elevOnFloor.push_back(e.get());
132  else
133  {
134  if (e->timeToSelfProgramme == 0)
135  {
136  e->timeToSelfProgramme = waitingTime;
137  e->doorsStatus = ElevatorDoorsStatus::waiting;
138  }
139  }
140  }
141 
142  if (elevOnFloor.size() > 1)
143  for (auto& pe : elevOnFloor)
144  pe->timeToSelfProgramme = elevOnFloor[0]->timeToSelfProgramme;
145 
146  if (elevOnFloor.size() > 0)
147  if (elevOnFloor[0]->timeToSelfProgramme == 0)
148  {
149  auto& pass = queue->passOnFloor[pos];
150 
151  size_t passToUp = 0, passToDn = 0;
152  for (auto& p : pass)
153  {
154  if (p.getFloorDestination() > pos)
155  ++passToUp;
156  else
157  ++passToDn;
158  }
159 
160  if (passToUp == 0)
161  for (auto& e : elevOnFloor)
162  if (e->getIndicator() == ElevatorIndicator::up)
163  {
164  e->timeToSelfProgramme = waitingTime;
165  e->doorsStatus = ElevatorDoorsStatus::waiting;
166  };
167 
168  if (passToDn == 0)
169  for (auto& e : elevOnFloor)
170  if (e->getIndicator() == ElevatorIndicator::down)
171  {
172  e->timeToSelfProgramme = waitingTime;
173  e->doorsStatus = ElevatorDoorsStatus::waiting;
174  };
175 
176  if ((passToUp == 0) && (passToDn == 0))
177  for (auto& e : elevOnFloor)
178  if (e->getIndicator() == ElevatorIndicator::both)
179  {
180  e->timeToSelfProgramme = waitingTime;
181  e->doorsStatus = ElevatorDoorsStatus::waiting;
182  };
183 
184 
185  std::vector<Passenger> stillWaiting;
186 
187  for (auto& p : pass)
188  {
189 
190  std::vector<Elevator*> elevAppropriate;
191  bool inverseWay = false;
192 
193  bool inv = p.PerformInverseProbability(getCurrentTime());
194 
195  for (auto& e : elevOnFloor)
196  {
197  if ((p.getFloorDestination() > pos) && (e->timeToSelfProgramme == 0) && (e->doorsStatus == ElevatorDoorsStatus::openedLoading) && (e->indicator == ElevatorIndicator::up || e->indicator == ElevatorIndicator::both))
198  {
199  e->lastChechedPassenger = std::max(p.id, e->lastChechedPassenger);
200 
201  if (e->getNumberOfPassengers() < e->capacity)
202  elevAppropriate.push_back(e);
203  else
204  {
205  e->timeToSelfProgramme = waitingTime;
206  e->doorsStatus = ElevatorDoorsStatus::waiting;
207  }
208  }
209 
210  if ((p.getFloorDestination() < pos) && (e->timeToSelfProgramme == 0) && (e->doorsStatus == ElevatorDoorsStatus::openedLoading) && (e->indicator == ElevatorIndicator::down || e->indicator == ElevatorIndicator::both))
211  {
212  e->lastChechedPassenger = std::max(p.id, e->lastChechedPassenger);
213 
214  if (e->getNumberOfPassengers() < e->capacity)
215  elevAppropriate.push_back(e);
216  else
217  {
218  e->timeToSelfProgramme = waitingTime;
219  e->doorsStatus = ElevatorDoorsStatus::waiting;
220  }
221  }
222  }
223 
224  //Если человек готов сесть не туда
225  if ((elevAppropriate.size() == 0) && (inv))
226  {
227 
228  for (auto& e : elevOnFloor)
229  {
230  if ((e->timeToSelfProgramme == 0) && (e->doorsStatus == ElevatorDoorsStatus::openedLoading))
231  {
232  e->lastChechedPassenger = std::max(p.id, e->lastChechedPassenger);
233 
234  if (e->lastChechedPassenger <= p.id)
235  {
236  if (e->getNumberOfPassengers() < e->capacity)
237  {
238  elevAppropriate.push_back(e);
239  inverseWay = true;
240  }
241  else
242  {
243  e->timeToSelfProgramme = waitingTime;
244  e->doorsStatus = ElevatorDoorsStatus::waiting;
245  }
246  }
247  }
248  }
249  }
250 
251 
252  if (elevAppropriate.size() > 0)
253  {
254  size_t elevWithSmallestPass = 0;
255  size_t smallestPass = elevAppropriate[0]->getNumberOfPassengers();
256 
257  for (size_t numb = 1; numb < elevAppropriate.size(); ++numb)
258  if (elevAppropriate[numb]->getNumberOfPassengers() < smallestPass)
259  {
260  elevWithSmallestPass = numb;
261  smallestPass = elevAppropriate[numb]->getNumberOfPassengers();
262  }
263 
264 
265  Elevator* e = elevAppropriate[elevWithSmallestPass];
266 
267  e->passengers.push_back(p);
268  e->passengers.back().status = PassengerStatus::going;
269  e->passengers.back().timeStart = getCurrentTime();
270  passStatBuffer.push_back("time = " + std::to_string(getCurrentTime()) \
271  + "\tPassenger #" + std::to_string(e->passengers.back().id) \
272  + "\tfrom floor #" + std::to_string(e->passengers.back().getFloorDeparture()) \
273  + " to floor #" + std::to_string(e->passengers.back().getFloorDestination()) \
274  + (inverseWay ? "*" : "") \
275  + "\tentered the elevator #" + std::to_string(e->myid));
276  e->timeToSelfProgramme = timeEntering;
277  e->buttons[e->passengers.back().getFloorDestination()] = true;
278  if (e->indicator == ElevatorIndicator::both)
279  {
280  if (e->passengers.back().properties.floorDestination > pos)
281  e->indicator = ElevatorIndicator::up;
282  else
283  e->indicator = ElevatorIndicator::down;
284  }
285 
286  }
287  else
288  stillWaiting.push_back(p);
289 
290  }//for p
291 
292  pass.clear();
293  pass = std::move(stillWaiting);
294 
295  }
296  //}//for indValue
297  }//for pos
298 
299 
300  //Обработка нажатия кнопки "Ход"
301  for (auto& e : elevators)
302  {
303  if (e->doorsStatus == ElevatorDoorsStatus::waiting)
304  if (e->isGoingButtonPressed() && (e->timeToSelfProgramme > 1))
305  {
306  e->timeToSelfProgramme = 1;
307  }
308  }
309 
310  //Обработка движения лифта
311  for (auto& e : elevators)
312  {
313  if (e->timeToSelfProgramme == 0)
314  {
315  auto pos = e->position / 100;
316  auto& pass = queue->passOnFloor[pos];
317 
318  switch (e->status)
319  {
321  {
322  //3.1. Обрабатываем стоящий лифт
323  switch (e->doorsStatus)
324  {
326  {
327  e->timeToSelfProgramme = timeLeaving - 1;
328  auto it = std::find_if(e->passengers.begin(), e->passengers.end(), \
329  [=](const Passenger& p) {return p.getFloorDestination() == pos; });
330  if (it != e->passengers.end())
331  {
332  it->status = PassengerStatus::arrived;
333  it->timeFinish = getCurrentTime();
334  queue->finished.push_back(*it);
335  passStatBuffer.push_back("time = " + std::to_string(getCurrentTime()) \
336  + "\tPassenger #" + std::to_string(it->id) \
337  + "\tfrom floor #" + std::to_string(it->getFloorDeparture()) \
338  + " to floor #" + std::to_string(it->getFloorDestination()) \
339  + "\tgot off the elevator #" + std::to_string(e->myid) \
340  + " (appeared t = " + std::to_string(it->properties.timeInit) \
341  + ", in elevator t = " + std::to_string(it->timeStart) + ")");
342  e->passengers.erase(it);
343  break;
344  }// if it!=
345 
346  e->doorsStatus = ElevatorDoorsStatus::openedLoading;
347  e->lastChechedPassenger = 0;
348 
349  break;
350  }//case ElevatorDoorsStatus::openedUnloading:
351 
353  {
354  e->doorsStatus = ElevatorDoorsStatus::closing;
355  e->timeToSelfProgramme = timeClosing - 1;
356  break;
357  }//case ElevatorDoorsStatus::waiting:
358 
360  {
361  //Только что закрывший двери лифт - делаем двери закрытыми
362  e->doorsStatus = ElevatorDoorsStatus::closed;
363  break;
364  }//case ElevatorDoorsStatus::closing:
365 
367  {
368  //Если лифт стоит на этаже и появляется человек снаружи //29.05.2021
369  if ( ((e->position % 100) == 0 ) && (e->isEmpty()) )
370  {
371  if (queue->passOnFloor[e->position / 100].size() > 0)
372  {
373  bool isPassUp = false, isPassDn = false;
374  for (auto& p : queue->passOnFloor[e->position / 100])
375  {
376  if (p.getFloorDestination() > pos)
377  isPassUp = true;
378  if (p.getFloorDestination() < pos)
379  isPassDn = true;
380  }
381 
382  if ((e->indicator == ElevatorIndicator::both)
383  || (e->indicator == ElevatorIndicator::up && isPassUp)
384  || (e->indicator == ElevatorIndicator::down && isPassDn))
385  {
386  e->doorsStatus = ElevatorDoorsStatus::opening;
387  e->buttons[pos] = false;
388  e->timeToSelfProgramme = timeOpening - 1;
389  break;
390  }
391 
392  }
393  }
394 
395  //Если есть назначение для стоящего лифта с закрытыми дверьми - разгоняем
396 
397  //вверх
398  if ((e->position / 100) < e->destinationFloor)
399  {
400  e->status = ElevatorStatus::movingUp;
401  e->acceleration = ElevatorAcceleration::accelerating;
402  e->timeToSelfProgramme = timeAccelerating - 1;
403  }//if ((e->position...
404 
405  //вниз
406  if (((e->position + 99) / 100) > e->destinationFloor)
407  {
408  e->status = ElevatorStatus::movingDn;
409  e->acceleration = ElevatorAcceleration::accelerating;
410  e->timeToSelfProgramme = timeAccelerating - 1;
411  }//if (((e->position...
412 
413  //3.1.4. Если лифт прибыл в пункт назначения - открываем двери
414  if (((e->position / 100) == e->destinationFloor) &&
415  ((e->position % 100) == 0))
416  {
417  //но открываем двери только если либо он непустой, либо снаружи нажата кнопка:
418  if ((e->getNumberOfPassengers() > 0) ||
419  (floorButtons->getDnButton(e->destinationFloor)) ||
420  (floorButtons->getUpButton(e->destinationFloor)))
421  {
422  e->doorsStatus = ElevatorDoorsStatus::opening;
423  e->buttons[pos] = false;
424  e->timeToSelfProgramme = timeOpening - 1;
425 
426  if ((floorButtons->getDnButton(e->destinationFloor)) &&
427  (e->indicator == ElevatorIndicator::down || e->indicator == ElevatorIndicator::both))
428  floorButtons->unsetDnButton(e->destinationFloor);
429 
430  if ((floorButtons->getUpButton(e->destinationFloor)) &&
431  (e->indicator == ElevatorIndicator::up || e->indicator == ElevatorIndicator::both))
432  floorButtons->unsetUpButton(e->destinationFloor);
433  }//if ((e->getNumberOfPassengers() > 0) ||...
434  }//if (((e->position...
435  break;
436  }//case ElevatorDoorsStatus::closed:
437 
439  {
440  //Только что открывший двери лифт - делаем двери открытыми
441  if (e->isEmpty()) //29.05.2021
442  e->doorsStatus = ElevatorDoorsStatus::openedLoading;
443  else
444  e->doorsStatus = ElevatorDoorsStatus::openedUnloading;
445  break;
446  }
447 
448  }//switch (e->doorsStatus)
449 
450  break;
451  }// case ElevatorStatus::staying
452 
453 
456  {
457  switch (e->acceleration)
458  {
460  {
461  e->acceleration = ElevatorAcceleration::uniform;
462  e->status = ElevatorStatus::staying;
463  break;
464  }//case ElevatorAcceleration::breaking:
465 
467  {
468  int sign = (e->status == ElevatorStatus::movingUp) ? 1 : -1;
469  e->position += sign * (int)(100*veloUniform);
470  e->acceleration = ElevatorAcceleration::uniform;
471  break;
472  }//case ElevatorAcceleration::accelerating:
473 
475  {
476  int sign = (e->status == ElevatorStatus::movingUp) ? 1 : -1;
477 
478  bool critDir = ((100 * (int)e->destinationFloor - (int)e->position) * sign) > 0;
479  if (critDir)
480  {
481  if (abs((int)((e->position - 100 * e->destinationFloor))) != (int)(100 * veloUniform))
482 
483  e->position += sign * (int)(100 * veloUniform);
484  else
485  {
486  e->acceleration = ElevatorAcceleration::breaking;
487  e->position += sign * 12;
488  e->timeToSelfProgramme = timeBreaking - 1;
489  }//else
490  }
491  else
492  {
493  e->acceleration = ElevatorAcceleration::breaking;
494  e->position += sign * 12;
495  e->timeToSelfProgramme = timeBreaking - 1;
496  }
497  }//case ElevatorAcceleration::uniform:
498 
499  }//switch (e->acceleration)
500 
501  break;
502  }//case ElevatorStatus::movingUp:
503  //case ElevatorStatus::movingDn:
504  }
505 
506 
507  }//if (e->timeToSelfProgramme == 0)
508  else // если продолжается предыдущая операция
509  {
510  if ((e->status == ElevatorStatus::movingUp) ||
511  (e->status == ElevatorStatus::movingDn))
512  {
513  int sign = (e->status == ElevatorStatus::movingUp) ? 1 : -1;
514 
515  if (e->acceleration == ElevatorAcceleration::accelerating)
516  {
517  switch (e->timeToSelfProgramme)
518  {
519  case 3:
520  e->position += sign * 5;
521  break;
522 
523  case 2:
524  e->position += sign * 8;
525  break;
526 
527  case 1:
528  e->position += sign * 12;
529  break;
530  }//switch (e->timeToSelfProgramme)
531  }//if (e->acceleration == ElevatorAcceleration::accelerating)
532 
533  if (e->acceleration == ElevatorAcceleration::breaking)
534  {
535  switch (e->timeToSelfProgramme)
536  {
537  case 2:
538  e->position += sign * 8;
539  break;
540 
541  case 1:
542  e->position += sign * 5;
543  break;
544  }//switch (e->timeToSelfProgramme)
545  }//if (e->acceleration == ElevatorAcceleration::breaking)
546  }//if ((e->status == ElevatorStatus::movingUp) || (e->status == ElevatorStatus::movingDn))
547 
548  --(e->timeToSelfProgramme);
549  }//else
550  }//for e : elevators
551 }//MakeStep()
стрелочки в обоих направлениях
Класс — кабина лифта
Definition: Elevator.h:79
const double veloUniform
Скорость равномерно движения лифта (в долях этажа)
Definition: Control.h:86
const size_t timeLeaving
Время между выходами двух пассажиров в лифт
Definition: Control.h:71
движется вниз
движется равномерно или стоит
движется вверх
стрелочка вверх
const size_t waitingTime
Время ожидания до закрытия дверей (если только кто-то не нажмет кнопку "ход" раньше) ...
Definition: Control.h:65
const size_t timeOpening
Время открывания дверей
Definition: Control.h:74
const size_t timeBreaking
Время торможения лифта
Definition: Control.h:83
size_t getCurrentTime() const
Функция запроса текущего времени
Definition: Control.h:110
Пассажир успешно прибыл на нужный этаж
Класс — пассажир
Definition: Passenger.h:54
const size_t timeAccelerating
Время разгона лифта
Definition: Control.h:80
открыты (идет посадка пассажиров)
открыты (лифт ожидает отправления)
const size_t timeClosing
Время закрывания дверей
Definition: Control.h:77
открыты (идет высадка пассажиров)
стоит (не движется)
открываются
const size_t timeEntering
Время между входами двух пассажиров в лифт
Definition: Control.h:68
Пассажир нажодится в лифте
закрываются
замедляется (тормозит)
ускоряется (разгоняется)
стрелочка вниз

Граф вызовов:

Граф вызова функции:

void Control::PrintButtonsState ( const std::string &  fname = "") const

Функция печати в файл или на экран состояния кнопок в кабинах и на этажах в текущий момент времени

Если вызывается без аргумента - печать на экран, если с аргументом - печать в файл с данным именем.

Если вызывать эту функцию на каждом шаге по времени - получится полный протокол состояния всех кнопок в кабинах и на этажах

Аргументы
[in]fnameимя файла, в корорый выводить состояние

См. определение в файле Control.cpp строка 742

743 {
744  std::ofstream fout;
745  if (fname != "")
746  {
747  if (getCurrentTime() <= 1)
748  fout.open(fname);
749  else
750  fout.open(fname, std::ios_base::app);
751  }//if (fname != "")
752 
753  std::ostream& str = (fname == "") ? std::cout : fout;
754 
755  str << "time = " << getCurrentTime() << ": " << std::endl;
756  for (auto& e : elevators)
757  {
758  str << " in elevator #" << e->myid << ": ";
759  for (size_t i = 0; i < e->buttons.size(); ++i)
760  if (e->getButton(i))
761  str << i << " ";
762  str << std::endl;
763  }//for e
764  str << " on floors: ";
765  for (size_t i = 0; i < floorButtons->upButtons.size(); ++i)
766  {
767  if (floorButtons->getUpButton(i) || floorButtons->getDnButton(i))
768  {
769  str << "#" << i << "(";
770  if (floorButtons->getUpButton(i)) {
771  printf("\033[01;32m");
772  str << "up ";
773  }
774  if (floorButtons->getDnButton(i)) {
775  printf("\033[01;34m");
776  str << "dn";
777  }
778  printf("\033[01;37m");
779  str << ") ";
780  }//if (floorButtons->...
781  }//for i
782  str << std::endl << std::endl;
783 
784  if (fname != "")
785  fout.close();
786 }//PrintButtonsState(...)
size_t getCurrentTime() const
Функция запроса текущего времени
Definition: Control.h:110

Граф вызовов:

Граф вызова функции:

void Control::PrintElevatorState ( size_t  elevatorNumber,
const std::string &  fname = "" 
) const

Функция печати в файл или на экран состояния лифта в текущий момент времени

Если вызывается без аргумента - печать на экран, если с аргументом - печать в файл с данным именем.

Если вызывать эту функцию на каждом шаге по времени - получится полный протокол работы кабины лифта

Аргументы
[in]elevatorNumberномер кабины, состояние котрой печатается
[in]fnameимя файла, в корорый выводить состояние

См. определение в файле Control.cpp строка 595

596 {
597  std::ofstream fout;
598  if (fname != "")
599  {
600  if (getCurrentTime() <= 1)
601  fout.open(fname);
602  else
603  fout.open(fname, std::ios_base::app);
604  }//if (fname != "")
605 
606  std::ostream& str = (fname == "") ? std::cout : fout;
607 
608 /*str << "time = " << getCurrentTime() << ", \telev[" << i << "]: " \
609  << elevators[i]->getStateString() << std::endl;*/
610 
611  printf("\033[01;37m");
612  str << "time = " << getCurrentTime() << ", \telev[";
613  switch (i) {
614  case 0: printf("\033[01;34m"); break;
615  case 1: printf("\033[01;32m"); break;
616  case 2: printf("\033[22;31m"); break;
617  case 3: printf("\033[01;35m"); break;
618  default: printf("\033[22;33m");
619  }
620  str << i;
621  printf("\033[01;37m");
622  str << "]: ";
623 
624  //begin
625  //std::string strState;
626 
627  //std::string strStatus;
628 
629  str << "level = ";
630  str << std::to_string(elevators[i]->position / 100);
631  str << ".";
632  if ((elevators[i]->position % 100) < 10)
633  str << "0";
634  str << std::to_string(elevators[i]->position % 100);
635 
636  str << ", dir. = ";
637 
638  switch (elevators[i]->status)
639  {
641  printf("\033[01;32m");
642  str << "up, ";
643  break;
645  printf("\033[01;34m");
646  str << "dn, ";
647  break;
649  printf("\033[01;33m");
650  str << "stay,";
651  break;
652  }//switch (status)
653 
654  printf("\033[01;37m");
655  str << " ind. = ";
656 
657  //std::string strIndicator;
658  switch (elevators[i]->indicator)
659  {
661  printf("\033[01;32m");
662  str << "up, ";
663  break;
665  printf("\033[01;34m");
666  str << "down,";
667  break;
669  printf("\033[01;33m");
670  str << "both,";
671  break;
672  }// switch (indicator)
673 
674  printf("\033[01;37m");
675  str << " acceler. = ";
676 
677  //std::string strAccel;
678  switch (elevators[i]->acceleration)
679  {
681  printf("\033[22;32m");
682  str << "acceler.,";
683  break;
685  printf("\033[22;31m");
686  str << "breaking,";
687  break;
689  printf("\033[22;33m");
690  str << "uniform, ";
691  break;
692  }//switch (acceleration)
693 
694  printf("\033[01;37m");
695  str << " doors = ";
696 
697  //std::string strDoors;
698  switch (elevators[i]->doorsStatus)
699  {
701  printf("\033[01;31m");
702  str << "unloading...";
703  break;
705  printf("\033[01;31m");
706  str << "loading... ";
707  break;
709  printf("\033[01;33m");
710  str << "opening... ";
711  break;
713  printf("\033[01;33m");
714  str << "closing... ";
715  break;
717  printf("\033[22;36m");
718  str << "closed ";
719  break;
721  printf("\033[01;31m");
722  str << "waiting... ";
723  break;
724  }//switch (doorsStatus)
725 
726  printf("\033[01;37m");
727  str << " (pass.: ";
728  for (auto& p : elevators[i]->passengers)
729  {
730  str << std::to_string(p.id);
731  str << ", ";
732  }//for p
733  str << ")" << std::endl;
734  //end
735 
736 
737  if (fname != "")
738  fout.close();
739 }//PrintElevatorState(...)
стрелочки в обоих направлениях
движется вниз
движется равномерно или стоит
движется вверх
стрелочка вверх
size_t getCurrentTime() const
Функция запроса текущего времени
Definition: Control.h:110
открыты (идет посадка пассажиров)
открыты (лифт ожидает отправления)
открыты (идет высадка пассажиров)
стоит (не движется)
открываются
закрываются
замедляется (тормозит)
ускоряется (разгоняется)
стрелочка вниз

Граф вызовов:

Граф вызова функции:

void Control::PrintPassengerState ( const std::string &  fname = "") const

Функция печати в файл или на экран событий, произошедших с пассажирами за последний шаг (последнюю секунду)

Если вызывается без аргумента - печать на экран, если с аргументом - печать в файл с данным именем.

Выводит сообщения:

  • о появлении пассажира на этаже
  • о входе пассажира в кабину лифта
  • о выходе пассажира из лифта
  • о том, что пассажир ушел, не дождавшись лифта
Предупреждения
Нужна только для отладки. В процессе работы системы управнения эта информация недоступна и не может быть использована!
Аргументы
[in]fnameимя файла, в корорый выводить состояние

См. определение в файле Control.cpp строка 789

790 {
791  std::ofstream fout;
792  if (fname != "")
793  {
794  if (getCurrentTime() <= 1)
795  fout.open(fname);
796  else
797  fout.open(fname, std::ios_base::app);
798  }//if (fname != "")
799 
800  std::ostream& str = (fname == "") ? std::cout : fout;
801  printf("\033[01;33m");
802  if (passStatBuffer.size() > 0)
803  for (auto& st : passStatBuffer)
804  str << st << std::endl;
805 
806  if (fname != "")
807  fout.close();
808  printf("\033[01;37m");
809 }//PrintPassengerState(...)
size_t getCurrentTime() const
Функция запроса текущего времени
Definition: Control.h:110

Граф вызовов:

Граф вызова функции:

void Control::PrintStatistics ( bool  passengersDetails,
const std::string &  fname = "" 
) const

Функция печати в файл или на экран итоговой статистики, включая итоговый "рейтинг" (чем меньше - тем лучше!)

Аргументы
[in]passengersDetailsпризнак печати статистики по каждому пассажиру
[in]fnameимя файла, в корорый выводить состояние

См. определение в файле Control.cpp строка 821

822 {
823  std::ofstream fout;
824  if (fname != "")
825  fout.open(fname);
826 
827  std::ostream& str = (fname == "") ? std::cout : fout;
828 
829  std::vector<Passenger> allPass(queue->passengers);
830  for (auto& pf : queue->passOnFloor)
831  std::copy(pf.begin(), pf.end(), std::back_inserter(allPass));
832  for (auto& e : elevators)
833  std::copy(e->passengers.begin(), e->passengers.end(), std::back_inserter(allPass));
834  std::copy(queue->finished.begin(), queue->finished.end(), std::back_inserter(allPass));
835 
836  std::sort(allPass.begin(), allPass.end());
837 
838  size_t numInElevetor = 0, numOnFloors = 0, numLeaved = 0;
839  size_t penaltyFinished = 0, penaltyInElevetor = 0, penaltyOnFloors = 0, penaltyLeaved = 0;
840 
841  if (passengersDetails)
842  str << "Passangers:" << std::endl;
843 
844  for (auto& p : allPass)
845  {
846  switch (p.status)
847  {
849  {
850  penaltyFinished += p.timeFinish - p.getTimeInit();
851  if (passengersDetails)
852  str << "#" << p.id << ", penalty = " << p.timeFinish - p.getTimeInit() \
853  << " (init = " << p.getTimeInit() << ", started = " << p.timeStart << ", finished = " << p.timeFinish << ")" \
854  << std::endl;
855  break;
856  }//case PassengerStatus::arrived:
857 
859  {
860  ++numInElevetor;
861  penaltyInElevetor += getCurrentTime() - p.getTimeInit();
862  if (passengersDetails)
863  str << "#" << p.id << ", penalty = " << getCurrentTime() - p.getTimeInit() \
864  << " (init = " << p.getTimeInit() << ", started = " << p.timeStart << ", STILL IN ELEVATOR!!!" << ")" \
865  << std::endl;
866  break;
867  }//case PassengerStatus::going:
868 
870  {
871  ++numOnFloors;
872  penaltyOnFloors += getCurrentTime() - p.getTimeInit();
873  if (passengersDetails)
874  str << "#" << p.id << ", penalty = " << getCurrentTime() - p.getTimeInit() \
875  << " (init = " << p.getTimeInit() << ", STILL WAITING FOR ELEVATOR!!!" << ")" \
876  << std::endl;
877  break;
878  }//case PassengerStatus::waiting:
879 
881  {
882  ++numLeaved;
883  penaltyLeaved += p.properties.criticalWaitTime * 5;
884  if (passengersDetails)
885  str << "#" << p.id << ", penalty = " << p.properties.criticalWaitTime * 5 \
886  << " (init = " << p.getTimeInit() << ", LEAVED THE FLOOR!!!" << ")" \
887  << std::endl;
888  break;
889  }//case PassengerStatus::leaved:
890  }//switch (p.status)
891  }//for p
892 
893  if (passengersDetails)
894  str << std::endl;
895 
896  size_t waitingTime = 0, goingTime = 0, totalTime = 0;
897  size_t num_finished_notLeaved = 0;
898  for (auto& p : queue->finished)
899  {
900  if (p.status != PassengerStatus::leaved)
901  {
902  ++num_finished_notLeaved;
903  waitingTime += p.timeStart - p.getTimeInit();
904  goingTime += p.timeFinish - p.timeStart;
905  totalTime += p.timeFinish - p.getTimeInit();
906  }
907  //else
908  //{
909  // waitingTime += p.properties.criticalWaitTime;
910  // totalTime += p.properties.criticalWaitTime;
911  //}
912  }//for p
913 
914  str << "Number of passengers, that have finished the trip: " << num_finished_notLeaved << std::endl;
915  if (num_finished_notLeaved > 0)
916  {
917  str << " average waiting time = " << 1.0 * waitingTime / num_finished_notLeaved << std::endl;
918  str << " average going time = " << 1.0 * goingTime / num_finished_notLeaved << std::endl;
919  str << " average total time = " << 1.0 * totalTime / num_finished_notLeaved << std::endl;
920  }
921  str << "Penalty for them = " << penaltyFinished << std::endl;
922  str << std::endl;
923 
924 
925  str << "Still waiting on floors = " << numOnFloors << std::endl;
926  str << "Penalty for them = " << penaltyOnFloors << std::endl;
927  str << std::endl;
928 
929  str << "Still in elevator = " << numInElevetor << std::endl;
930  str << "Penalty for them = " << penaltyInElevetor << std::endl;
931  str << std::endl;
932 
933  str << "Leaved the floors, because of too large waiting time = " << numLeaved << std::endl;
934  str << "Penalty for them = " << penaltyLeaved << std::endl;
935  str << std::endl;
936 
937  str << "TOTAL PENALTY = " << penaltyFinished + penaltyInElevetor + penaltyOnFloors + penaltyLeaved << std::endl;
938 
939  if (fname != "")
940  fout.close();
941 }//PrintStatistics(...)
Пассажир не дождался лифта и ушел
Пассажир ждет лифта на этаже отправления
const size_t waitingTime
Время ожидания до закрытия дверей (если только кто-то не нажмет кнопку "ход" раньше) ...
Definition: Control.h:65
size_t getCurrentTime() const
Функция запроса текущего времени
Definition: Control.h:110
Пассажир успешно прибыл на нужный этаж
Пассажир нажодится в лифте

Граф вызовов:

Граф вызова функции:

void Control::ReadTimeTable ( const std::string &  fileName_)

Функция чтения расписания появления пассажиров на этажах

Аргументы
[in]fileName_константная ссылка на имя файла с расписанием

См. определение в файле Control.cpp строка 559

560 {
561  std::ifstream fi(fileName_);
562 
563  char str[255];
564  fi.getline(str, 100, '\n');
565 
566  PassengerProperties passProp;
567  int N;
568 
569  while (!fi.eof())
570  {
571  fi >> N;
572  fi.get();
573  fi >> passProp.timeInit;
574  fi.get();
575  fi >> passProp.floorDeparture;
576  fi.get();
577  fi >> passProp.floorDestination;
578  fi.get();
579  fi >> passProp.criticalWaitTime;
580  fi.get();
581  fi >> passProp.pInverseStartWaiting;
582  fi.get();
583  fi >> passProp.pInverseStopWaiting;
584  fi.get();
585  fi >> passProp.pStartGoing;
586 
587  queue->addPassenger(passProp);
588  }
589 
590  fi.close();
591  fi.clear();
592 }
double pStartGoing
Вероятность нажать кнопку "ход", не дожидаясь закрытия дверей
Definition: Passenger.h:48
size_t timeInit
Время появления пассажира на этаже
Definition: Passenger.h:30
size_t criticalWaitTime
Время ожидания, после которого пассажир уходит
Definition: Passenger.h:39
size_t floorDestination
Этаж, на который пассажир едет
Definition: Passenger.h:36
size_t floorDeparture
Этаж, с которого пассажир отправляется
Definition: Passenger.h:33
Параметры пассажиров
Definition: Passenger.h:27
double pInverseStopWaiting
Вероятность сесть в лифт, едущий в неверном направлении в конце ожидания
Definition: Passenger.h:45
double pInverseStartWaiting
Вероятность сесть в лифт, едущий в неверном направлении в начале ожидания
Definition: Passenger.h:42

Граф вызова функции:

void Control::SetElevatorDestination ( size_t  elevatorNumber,
size_t  destination 
)
inline

Функция задания назначения лифту

Аргументы
[in]elevatorNumberномер кабины, которой задается назначение
[in]destinationэтаж назначения

См. определение в файле Control.h строка 120

121  {
122  elevators[elevatorNumber]->setDestination(destination);
123  }

Граф вызова функции:

void Control::SetElevatorIndicator ( size_t  elevatorNumber,
ElevatorIndicator  indicator 
)
inline

Функция задания состояния индикатора лифта (лампочка со стрелочкой, которую видят пассажиры)

Аргументы
[in]elevatorNumberномер кабины, которой задается назначение
[in]indicatorустанавливаемое значение индикатора (вверх, вниз или в обе стороны)

См. определение в файле Control.h строка 130

131  {
132  elevators[elevatorNumber]->setIndicator(indicator);
133  }

Граф вызова функции:

void Control::unsetDnButton ( size_t  floor)
inline

Функция сброса (выключения) кнопки "вниз" на конкретном этаже

Аргументы
[in]floorномер этажа, на котором сбрасывается (гасится) кнопка Добавлена на всякий случай; если на этаже есть пассажиры, и они увидят, что нужная им кнопка погасла - то они ее нажмут

См. определение в файле Control.h строка 390

391  {
392  floorButtons->unsetDnButton(floor);
393  }
void Control::unsetUpButton ( size_t  floor)
inline

Функция сброса (выключения) кнопки "вверх" на конкретном этаже

Аргументы
[in]floorномер этажа, на котором сбрасывается (гасится) кнопка Добавлена на всякий случай; если на этаже есть пассажиры, и они увидят, что нужная им кнопка погасла - то они ее нажмут

См. определение в файле Control.h строка 380

381  {
382  floorButtons->unsetUpButton(floor);
383  }

Данные класса

const size_t Control::timeAccelerating = 4

Время разгона лифта

См. определение в файле Control.h строка 80

const size_t Control::timeBreaking = 3

Время торможения лифта

См. определение в файле Control.h строка 83

const size_t Control::timeClosing = 4

Время закрывания дверей

См. определение в файле Control.h строка 77

const size_t Control::timeEntering = 2

Время между входами двух пассажиров в лифт

См. определение в файле Control.h строка 68

const size_t Control::timeLeaving = 2

Время между выходами двух пассажиров в лифт

См. определение в файле Control.h строка 71

const size_t Control::timeOpening = 4

Время открывания дверей

См. определение в файле Control.h строка 74

const double Control::veloUniform = 0.25

Скорость равномерно движения лифта (в долях этажа)

См. определение в файле Control.h строка 86

const size_t Control::waitingTime = 5

Время ожидания до закрытия дверей (если только кто-то не нажмет кнопку "ход" раньше)

См. определение в файле Control.h строка 65


Объявления и описания членов классов находятся в файлах: