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

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

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

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

Добавлен: 28.03.2023

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

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

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

pictureBox8->BringToFront();// уход на второй план картинки кнопки

label4->BringToFront();// уход на второй план номер этажа на кнопки

}

else

{

label4->Visible = false;// сделать номер нужного этажа невидимым

pictureBox7->BringToFront(); // уход на второй план картинки кнопки

}

}

// объявление делегата для функции LiftPossition

public: delegate void dLiftPosition(int);

// объявление функции LiftPossition

public: void LiftPosition(int k)

{

// функция для отображения номера этажа с лифтом

label1->Text = Convert::ToString(k);

}

// объявление делегата для функции dPassangerPosition

public: delegate void dPassangerPosition(int);

// объявление функции dPassangerPosition

public: void PassangerPosition(int k)

{

// функция для отображения номера этажа с пассажиром

if (k == -1) { // если параметр отрицательный, то номер этаж невидимый

label3->Visible = false;

}

else

{// если значение другое

label3->Visible = true;// номер этажа видимый

label3->Text = Convert::ToString(k); // ввод номера этажа

}

}

// объявление делегата для функции dShowClock

public: delegate void dShowClock(int);

// объявлени функции dShowClock

public: void ShowClock(int k)

{

// функция для вывода времени, которое прошло

label7->Text = Convert::ToString(k) + " секунд";

}

// объявление делегата для функции dNumberofFloor

public: delegate void dNumberofFloor(int);

// объявление функции dNumberofFloor

public: void NumberofFloor(int k)

{

// функция для отображения количества этажей

textBox1->Text = Convert::ToString(k);

}

// объявление делегата для функции dButtonFloorAction

public: delegate void dButtonFloorAction(int);

// объявление функции dButtonFloorAction

public: void ButtonFloorAction(int k)

{

// функция для отображения состояния кнопки

if (k==1){// если параметр равен 1, кнопка на этаже включается

pictureBox6->BringToFront();

}

else {// если параметр неравен 1, кнопка на этаже выключается

pictureBox5->BringToFront();

}

}

// объявление делегата для функции dPassengerStatus

public: delegate void dPassengerStatus(int);

// объявление функции dPassengerStatus

public: void PassengerStatus(int k)

{

// функция для отображения пассажира

if (k == 1) {// если параметр равен 1, то пассажир виден на форме

pictureBox1->Visible=true;

}

else { // если параметр неравен 1, то пассажир не виден на форме

pictureBox1->Visible = false;

}

}

// объявление делегата для функции dDoorAction

public: delegate void dDoorAction(int);

// объявление делегата для функции dDoorAction

public: void DoorAction(int k)

{

// функция для отображения работы дверей

int k1 = 30;

if (k == 1) {// если параметр равен 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);

}


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); // Отображение времени на форме