Файл: Объектно-ориентированный подход при проектировании информационной системы.pdf
Добавлен: 22.04.2023
Просмотров: 339
Скачиваний: 1
else {// если параметр неравен 1, то двери лифта закрываються
int x1, x2, xf, yf;
x1 = 1;
x2 = -1;
pictureBox9->Location = Point(pictureBox9->Location.X + x1, pictureBox9->Location.Y);
pictureBox13->Location = Point(pictureBox13->Location.X + x2, pictureBox13->Location.Y);
}
}
// объявление делегата для функции dPointAction
public: delegate void dPointAction(System::String^);
// объявление функции dPointAction
public: void PointAction(System::String^ str)
{
// функция для переключения кнопки между состояниями
if (str=="up") {// если параметр равен up, появляется стрелка вверх
pictureBox11->Visible = true;
pictureBox12->Visible = false;
}
else if (str=="down")
{// если параметр равен down, появляется стрелка вниз
pictureBox11->Visible = false;
pictureBox12->Visible = true;
}
else if (str=="stop")
{// если параметр равен stop, стрелки убираться
pictureBox12->Visible = false;
pictureBox11->Visible = false;
}
}
int timer(int sec, int time) {
// функция для задержки таймера
cout << endl; // перевод каретки на новую строку в консоли
for (int i = 0; i < sec; i++) {// вывод времени в секундах
cout << "\r "; //перевод каретки в начало строки
time++;// увеличение времени
cout << "Прошло " << time;// вывод времени
Sleep(1000);// пауза на 1 секунды
}
cout << endl; // перевод каретки на новую строку в консоли
return time; // возврат функцией времени
}
int randomNumber(int frome, int to) {
srand(time(NULL)); // инициализация генератора случайных чисел
int sc; // переменная для случайного числа
sc = frome + rand() % to; // получение случайного числа
return sc;// возврат функцией случайного числа
}
void elevatorcall(int tofloor,int floor) {
// функция для вызова лифта
if (tofloor == floor) { // Если нужный этаж равен этажу с лифтом
}
else if (tofloor > floor) {// если нужный этаж выше этажа с лифтом
while (tofloor != floor) {// поднимаем лифт, пока этажи не будут равными
floor++; // увеличиваем этаж
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor); // отображение позиции лифта на форме
}
}
else if (tofloor < floor)
{// если нужный этаж ниже этажа с лифтом
while (tofloor != floor) {// опускаем лифт, пока этажи не будут равными
floor--; // уменьшаем этаж
Invoke(gcnew dLiftPosition(this, &MyForm::LiftPosition), floor); // отображение позиции лифта на форме
}
}
}
int main()
{
int doorLif=56;
int step1;
int t = 1;
int k = 1;
int sumofpassenegr;// значение пассажиров
int generalTime=0; // начальное значение времени
// проверка на ввод пользовательских данных о количестве пассажиров
if (MainNumberPassenger == NULL) {
sumofpassenegr = 5;//Если нет, то количество пассажиров равно 5
}
else
{
sumofpassenegr = MainNumberPassenger;//Если есть, то количество пассажиров равно введенному значению
}
int fl; //значение этажей
// проверка на ввод пользовательских данных о количестве этажей
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;// считывание время на вкл/выкл кнопок