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