Файл: Применение объектно-ориентированного подхода при проектировании информационной системы (ЭТАПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.03.2023

Просмотров: 388

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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;// считывание время на вкл/выкл кнопок