Добавлен: 31.03.2023
Просмотров: 102
Скачиваний: 1
if (MainNumberFloor == NULL) {
fl = randomNumber(2, 6);//Если нет, то количество этажей равно 5
}
else
{
fl = MainNumberFloor;//Если есть, то количество этажей равно введенному значению
}
setlocale(LC_ALL, "Russian");// устанавливаем русскую локаль
elevator e(0, 1, false);//Инциализируем лифт
button bt_floor1(false), bt_floor2(true);//Инициализируем кнопки на этаже и в лифте
cout << "\n Количество этажей в доме " << fl << endl; // вывод значения этажей в консоль
cout << "\n Количество пассажиров " << sumofpassenegr << endl; // вывод значения пассажиров в консоль
Invoke(gcnew dNumberofFloor(this, &MyForm::NumberofFloor), fl); // вывод значения этажей на форму
Invoke(gcnew dSumPassenger(this, &MyForm::SumPassenger), sumofpassenegr); // вывод значения пассажиров форму
metka1: // установка метки
man h(randomNumber(1, fl));//Инциализируем пассажира
Invoke(gcnew dPassengerStatus(this, &MyForm::PassengerStatus), 1); // появление пассажира на форме
cout << "\n ---------------------------------------\n";
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), e.floor); // отображение этажа, на котором расположен лифт, на форме
h.print(); // печать положения лифта в консоле
Invoke(gcnew dPassangerPosition(this, &MyForm::PassangerPosition), h.pos); // отображение этажа, на котором расположен пассажир, на форме
if (bt_floor1.status == false || bt_floor2.status == false)
{
// если кнопки выключены
cout << " Press button elevator" << endl;
if (h.pos == 1 && e.floor==1) {
// если лифт и пассажир на одном этаже
bt_floor1.setstatusfloor(true, h.pos);// нажатие кнопки на этаже
Invoke(gcnew dButtonFloorAction(this, &MyForm::ButtonFloorAction), 1);// отображение нажатия кнопки на этаже
generalTime = generalTime + ButtonTime;// добавление к таймеру время нажатия на кнопки
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), h.pos); // отображение положения лифта на форме
}
else {
// если пассажир и лифт на разных этажах
bt_floor2.setstatusfloor(true, h.pos);// нажатие
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), e.floor); // отображение положения лифта на форме
}
cout << " Нажата кнопка вызова лифта " << endl;
Invoke(gcnew dButtonFloorAction(this, &MyForm::ButtonFloorAction),1); // отображение нажатия кнопки на этаже
generalTime = generalTime + ButtonTime;// добавление к таймеру время нажатия на кнопки
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
int floor1 = e.floor; // переменная с положением лифта
if (h.pos == floor1) {
//если лифт и пассажир на одном этаже
}
else if (h.pos > floor1) {
// если пассажир выше лифта
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "up");// отображение стрелки вверх
while (h.pos != floor1) {
// пока пассажир и лифт не на одном этаже
floor1++;// прибавляем этаж
Sleep(5000);// пауза на 5 секунд
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor1); // отображение номера этажа с лифтом на форме
generalTime = generalTime + LiftTime; // добавление к таймеру время работы лифта
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
}
else if (h.pos < floor1)
{// если пассажир ниже лифта
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "down"); // отображение стрелки вниз на форме
while (h.pos != floor1) {
// пока пассажир и лифт не на одном этаже
floor1--;// отнимаем этаж
Sleep(5000);// пауза на 5 секунд
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor1);// отображение номера этажа с лифтом на форме
generalTime = generalTime + LiftTime; // добавление к таймеру времени работы лифта
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
}
Sleep(1000); // пауза на 1 секунду
e.elevatorcall(h.pos); // вызов лифта к пассажиру
}
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "stop");// выключение стрелок направления лифта
if (h.pos == 1) {
// если пассажир на первом этаже
bt_floor1.setstatusfloor(false, h.pos); // выключение кнопки и назначение этажа
Invoke(gcnew dButtonFloorAction(this, &MyForm::ButtonFloorAction), 0); // отображение выключения кнопки
generalTime = generalTime + ButtonTime; // дабавление к таймеру времени выкл кнопки
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
else {
// иначе
bt_floor2.setstatusfloor(false, h.pos);// выключение кнопки и назначение этажа
Invoke(gcnew dButtonFloorAction(this, &MyForm::ButtonFloorAction), 0); // отображение выключения кнопки
generalTime = generalTime + ButtonTime;// дабавление к таймеру времени выкл кнопки
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
h.enterToElevator(); // вход пассажира в лифт
step1 = 0; // счетчик
for (step1; step1 < doorLif; step1++)
{
// передвижение дверей на форме
Invoke(gcnew dDoorAction(this, &MyForm::DoorAction), 1);// Отображение открытия дверей на форме
Sleep(100); // пауза на 0,1 секунд
}
generalTime = generalTime + DoorTime; // добавление к таймер время работы дверей
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
step1 = 0; // счетчик
for (step1; step1 < 84; step1++)
{
// передвижение пассажира на форме
Invoke(gcnew dPassengerAction(this, &MyForm::PassengerAction),-42); // отображение передвижения пассажира на форме
Sleep(100);// пауза на 0,1 секунде.
}
generalTime = generalTime + PassengerTime; // добавление к таймеру вермя передвижения пассажира
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
int num = randomNumber(1, fl); // нужный этаж пассажиру
Invoke(gcnew dPassangerPosition(this, &MyForm::PassangerPosition), -1); // выключение отображение этажа с пассажиром
while (h.pos == num)
{
num = randomNumber(1, fl);// нужный этаж
}
//Invoke(gcnew dPassangerPosition(this, &MyForm::PassangerPosition), NULL);
Invoke(gcnew dButtonLift(this, &MyForm::ButtounLift), num, true);// отображение нажатия на кнопку в лифте и нужный этаж на форме
generalTime = generalTime + ButtonTime; // добавление к таймеру времени нажатия на кнопку
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
step1 = 0;// счетчик
for (step1; step1 < doorLif; step1++)
{
// передвижение дверей на форме
Invoke(gcnew dDoorAction(this, &MyForm::DoorAction), 0);// Отображение открытия дверей на форме
Sleep(100); // пауза на 0,1 секунды
}
generalTime = generalTime + DoorTime; // добавление к таймеру времени закрытия дверей
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // Отображение времени на форме
int floor1 = e.floor; // номер этаж с лифтом
int p = num; // нужный этаж
if (p == floor1) {
// если нужный этаж равен этажу с лифтом
Sleep(3000); // пауза на 0,3 секунды
}
else if (p < floor1) {
// если нужный этаж ниже этажа с лифтом
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "down"); // Отображение стрелки вниз на форме
while (p != floor1) {
// Пока нужный этаж не равен этажу с лифтом
floor1--; // уменьшаем этаж с лифтом
Sleep(5000); // пауза на 5 секунд
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor1); // отображение номера этажа с лифтом на форме
generalTime = generalTime + LiftTime;// добавление к таймеру время работы лифта
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
}
else if (p > floor1) {
// если нужный этаж выше этажа лифтом
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "up"); // отображение стрелки вверх на форме
while (p != floor1) {
// Пока нужный этаж не равен этажу с лифтом
floor1++; // прибавляем этаж с лифтом
Sleep(5000); // пауза на 5 секунд
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor1); // Отображение номера этажа с лифтом на форме
generalTime = generalTime + LiftTime; // добавление к таймеру время работы лифта
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
}
}
e.enterfloorButton(num); // передвижение лифта к заданому этажу
Invoke(gcnew dPassangerPosition(this, &MyForm::PassangerPosition), e.floor);// отображение этажа с пассажиром на форме
h.exitToElevator(); // выход пассажира из лифта
Invoke(gcnew dPointAction(this, &MyForm::PointAction), "stop"); //выключение стрелок направления лифта
Invoke(gcnew dButtonLift(this, &MyForm::ButtounLift), num, false); // выключение кнопки в лифте
step1 = 0;// счетчик
generalTime = generalTime + ButtonTime; // добавление к таймеру время выключения кнопки
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
for (step1; step1 < doorLif; step1++)
{
//передвижение дверей на форме
Invoke(gcnew dDoorAction(this, &MyForm::DoorAction), 1); //Отображение открытия дверей на форме
Sleep(100); // пауза 0,1 секунды
}
generalTime = generalTime + DoorTime; // добавление к таймеру времени открытие дверей
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // Отображение времени на форме
step1 = 0; // счетчик
for ( step1; step1 < 84; step1++)
{
// передвижение пассажира на форме
Invoke(gcnew dPassengerAction(this, &MyForm::PassengerAction), 42); // отображение передвижения пассажира на форме
Sleep(100); // пауза на 0,1 секунды
}
generalTime = generalTime + PassengerTime; // добавление к таймеру времени передвижения пассажира
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
e.Closedoor(); // закрытие дверей
step1 = 0;// счетчик
for (step1; step1 < doorLif; step1++)
{
// передвижение дверей на форме
Invoke(gcnew dDoorAction(this, &MyForm::DoorAction), 0); // отображение передвижения дверей
Sleep(100); // пауза на 0,1 секунды
}
generalTime = generalTime + DoorTime; // добавление к таймеру времени закрытия дверей
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
Sleep(5000); // пауза на 5 секунд
Invoke(gcnew dPassengerStatus(this, &MyForm::PassengerStatus), 0);// убрать пассажира с формы
k++; // прибавление пассажира
t = generalTime; // сохранение текущего времени
t = timer(randomNumber(0, 5), t); // произвольное время паузы между пассажирами
generalTime = t; // сохранение времени
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
//t++;
if (k > sumofpassenegr) {
// если проехало заданное количество пассажиров
cout << " Было пассажиров " << k - 1 << endl;
cout << " Прошло " << t << " секунд" << endl;
Invoke(gcnew dShowClock(this, &MyForm::ShowClock), generalTime); // отображение времени на форме
//_getch();
return 0; // завершение функции
}
goto metka1; // возврат к метки
return 0; // завершение функции
}
private: System::Void backgroundWorker1_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e)
{
// запуск функции работы лифта
main();
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// обработка нажатия на кнопку запуск
label7->Text = ""; // Удаление времени на форме
String^ str;
str=textBox1->Text; // считывание количество этажей
Int32 number; // переменная для считывания числа
// установка значений времени, если поля ввода пустые
if (String::IsNullOrEmpty(textBox3->Text)) { textBox3->Text = "1"; }
if (String::IsNullOrEmpty(textBox4->Text)) { textBox4->Text = "1"; }
if (String::IsNullOrEmpty(textBox5->Text)) { textBox5->Text = "1"; }
if (String::IsNullOrEmpty(textBox6->Text)) { textBox6->Text = "1"; }
//проверка на число ввод этажей
if (Int32::TryParse(str, number)) {
MainNumberFloor = number;
}
str = textBox2->Text; // считывание количество пассажиров
// проверка на число ввод количества пассажиров
if (Int32::TryParse(str, number)) {
MainNumberPassenger = number;
}
str = textBox3->Text;// считывание время на вход/выход пассажира
// проверка на число ввод времени на вход/выход пассажира
if (Int32::TryParse(str, number)) {
PassengerTime = number;
}
str = textBox4->Text;// считывание время на вкл/выкл кнопок