Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

ВВЕДЕНИЕ

На этапе объектно-ориентированного проектирования строится архитектура программной системы и описываются её компоненты. Данный этап помогает избежать в дальнейшем проблем, связанных с логикой программы. Объектно-ориентированное проектирование позволяет:

  1. Реализовать декомпозицию программной системы;
  2. Выстроить логическую и физическую структуру компонентов программы и программной системы в целом;
  3. Провести анализ программной системы, и выстроить связь между всеми ее компонентами;
  4. Построить гибкую и эффективную архитектуру программы, в которую можно интегрировать новые модули программы;

Язык унифицированного моделирования (UML) позволяет качественно описать как разрабатываемую систему в целом, так и отдельные объекты и их поведение. ER-моделирование (построение моделей сущность - связь) позволяет разработать схему сущностей программы, спроектировать связи между сущностями.

Использование подхода, основанного на представлении программной системы в виде схемы, состоящей из совокупности блоков определенной структуры, позволяет описывать алгоритмы и процессы.

Объектно-ориентированное программирование позволяет объединить в один объект определенные методы и атрибуты. Дает возможность создавать экземпляры данного объекта. Использовать объект в различных однотипных задачах. Данный подход позволяет уменьшить сложность больших программных систем, уменьшить количество кода, сделать программную системы более понятной, используя классы. Во многих современных языках программирования содержится реализация объектно-ориентированного программирования, в таких как С++, Java, Delphi, Visual Basic, C#. Различаются они только по реализации данного метода программирования.

Предметом исследования курсовой работы (КР) являются методы проектирования и разработки объектно-ориентированных программных систем.

Объектом КР является применение методов ООП для моделирования ИС с использованием языка моделирования UML.

Целью КР является проектирование программной системы информационной системы лифтового обслуживания на языке объектно-ориентированного программирования UML, моделирующей работу технического устройства (лифта), а также рассмотрение основных проблем объектно-ориентированного проектирования и объектно-ориентированного программирования.

Для достижения поставленной цели в КР решаются следующие задачи:

  1. Определить этапы объектно-ориентированного проектирования.
  2. Проанализировать инструментальные средства объектно-ориентированного проектирования.
  3. Определить этапы объектно-ориентированного проектирования.
  4. Провести анализ сред разработки объектно-ориентированного проектирования и объектно-ориентированного программирования.
  5. Спроектировать программную модель ИС ПО лифтового обслуживания, используя UML.

Курсовая работа состоит из аналитической и проектной частей. В аналитической части рассматриваются общие вопросы объектно-ориентированного проектирования и объектно-ориентированного программирования, а также обсуждаются соответствующие инструментальные средства и среды разработки. В проектной части дается описание разрабатываемой программной системы, включающее этап ее проектирования с использованием UML, и этап объектно-ориентированной разработки, рассматривается эксперимент с разработанной системой.

АНАЛИТИЧЕСКАЯ ЧАСТЬ

1.1 ЭТАПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО

ПРОЕКТИРОВАНИЯ ПРОГРАММНЫХ КОМПЛЕКСОВ

Рассмотрим основные этапы проектирования с позиций технологии обработки информации.

Традиционно проектирование сложных технических систем подразделяют на следующие этапы или стадии проектирования:

  1. Техническое задание на проектируемый объект [3. c. 43].
  2. Научно-исследовательская работа [4. c. 50].
  3. Эскизный проект [7. c. 56].
  4. Технический проект [21. c. 78].
  5. Рабочий проект [32 c 100].

1.2 ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ОБЪЕКТНО-

ОРИЕНТИРОВАННОГО ПРОЕКТИРОВАНИЯ

Проектирование программного обеспечения — процесс создания структуры программы, описания всех её компонентов и взаимосвязей компонентов внутри программы. Проектирование ПО является частным случаем проектирования продуктов и процессов.

Целью проектирования является определение внутренних свойств системы и детализация её внешних (видимых) свойств на основе выданных заказчиком требований к ПО (исходные условия задачи). Эти требования подвергаются анализу. Первоначально программа рассматривается как чёрный ящик. Ход процесса проектирования и его результаты зависят не только от состава требований, но и выбранной модели процесса, опыта проектировщика.

Модель предметной области накладывает ограничения на бизнес-логику и структуры данных [25. c. 209].

В зависимости от класса, создаваемого ПО, процесс проектирования может обеспечиваться как «ручным» проектированием, так и различными средствами его автоматизации. В процессе проектирования ПО для выражения его характеристик используются различные нотации — блок-схемы, ER-диаграммы, UML-диаграммы, DFD-диаграммы [23, c. 265], а также макеты.

Проектированию обычно подлежат:

1) Архитектура ПО;

2) Устройство компонентов ПО;

3) Пользовательские интерфейсы.

В российской практике проектирование ведется поэтапно в соответствии со стадиями, регламентированными ГОСТ 2.10368 [39.c. 309]:

  1. Техническое задание (по ГОСТ 2.10368 к стадиям разработки не относится).
  2. Техническое предложение.
  3. Эскизный проект.
  4. Технический проект.
  5. Рабочий проект.

На каждом из этапов формируется свой комплект документов, называемый проектом (проектной документацией). В зарубежной практике регламентирующими документами, например, являются Software Architecture Document, Software Design Document [40. c. 76].

Методики проектирования излагаются в виде описаний проектных процедур и проектных операций.

Под проектной процедурой понимают формализованную совокупность действий, выполнение которых оканчивается проектным решением. Например, проектной процедурой являются процедуры раскрытия проектной ситуации и разработки структуры программы.

Действие или формализованную совокупность действий, составляющих часть проектной процедуры, алгоритм которых остается неизменным для ряда проектных процедур, называют проектной операцией. Например, вычерчивание схемы, дифференцирование функции.

Проектные процедуры могут включать другие проектные процедуры и т.д. до проектных операций. Проектные процедуры могут представлять собой алгоритмы (только для тривиальных нетворческих операций) и эвроритмы (которыми излагаются эвристические операции) [33. c. 214].

На этапе объектного проектирования разрабатывается логическое решение на основе объектно-ориентированной парадигмы. Основной задачей этого этапа является создание диаграмм взаимодействия (interaction diagram), иллюстрирующих взаимодействие объектов в процессе выполнения системных требований.

После создания диаграмм взаимодействия (или параллельно с ними) можно построить диаграммы классов, отражающие определения программных классов и интерфейсов, реализованных в программе.

На практике создание диаграмм взаимодействия и диаграмм классов происходит параллельно, поскольку эти процессы тесно взаимосвязаны.

Алгоритм — строго однозначно определенная для исполнителя последовательность действий, приводящих к решению задачи.

Современное значение слова «алгоритм» во многом аналогично таким понятиям, как рецепт, процесс, методика, способ. Согласно Д. Кнуту, алгоритм имеет пять следующих важных свойств.

  1. Конечность. Алгоритм всегда должен заканчиваться после выполнения конечного числа шагов.
  2. Определенность. Каждый шаг алгоритма должен быть точно определен.
  3. Наличие входных данных. Алгоритм имеет некоторое число входных данных, задающихся до начала его работы или определяющихся динамически во время его выполнения.
  4. Наличие выходных данных. Алгоритм имеет одно или несколько выходных данных, имеющих определенную связь с входными данными.
  5. Эффективность. Алгоритм обычно считается эффективным, если его операторы достаточно просты для того, чтобы их можно было точно выполнить при помощи карандаша и бумаги в течение конечного промежутка времени.

1.2.1 ГРАФИЧЕСКИЕ МОДЕЛИ

БЛОК СХЕМЫ

Схема – это абстракция какого-либо процесса или системы, наглядно отображающая наиболее значимые их части [2, c. 83]. Схемы широко применяются с древних времен до настоящего времени – чертежи древних пирамид, карты земель, принципиальные электрические схемы. Очевидно, древние мореплаватели хотели обмениваться картами и поэтому выработали единую систему обозначений и правил их выполнения. Аналогичные соглашения выработаны для изображения схем алгоритмов и закреплены ГОСТ и международными стандартами.

На территории Российской Федерации действует единая система программной документации (ЕСПД), частью которой является Государственный стандарт – ГОСТ 19.70190 “Схемы алгоритмов программ, данных и систем”. Несмотря на то, что описанные в стандарте обозначения могут использоваться для изображения схем ресурсов системы, схем взаимодействия программ и т.п.

Ниже рассматривается ГОСТ, который практически полностью соответствует международному стандарту ISO 5807:1985

1.2.2 ER-МОДЕЛЬ

Модель сущность-связь (ER-модель) это модель данных, которая описывает концептуальные схемы предметной области [22, c. 365]. Модель сущность-связь используется для проектирования баз данных, бизнес процессов, программных систем. Данные в модели представлены компонентами, которые соединены связями.

Множества сущностей в ER-модели представлены в виде прямоугольников, а множества отношений представлены в виде ромбов. Если сущность принимает участие в отношении, то они соединены линией. Линия является пунктирной, если эти отношения не являются обязательными. Атрибут связываться с одним отношением или сущностью линией и изображается в виде овала.

Сущности изображаются в виде прямоугольников, в которых содержится имя сущности. Имя выражается существительным. Оно должно быть уникальным для всей модели. Также оно представляет собой имя типа. Экземпляром данной сущности называют конкретным представителем данной сущности.

Связь показывается линией, которая соединяет две сущности, которые учувствуют в этом отношении. Концы связей указываются графически, множественность связи изображается в виде «вилки» на конце связи. Модальность связи так же показывается графически — необязательность связи изображается кружком на конце связи. Название обычно выражается глаголом в изъявительном наклонении настоящего времени: «Имеет», «Принадлежит» и т.д.; или глаголом, который поясняет: «Включит в себя», и т.п. Название может быть одно для всей связи или два для каждого из концов связи. Во втором случае, наименование левого конца связи указывается над линией связи, а правого – под линией. Каждое из наименования располагаются рядом с сущностью, к которой оно относится.

Атрибуты сущности записываются внутри прямоугольника, изображающего сущность, и выражаются существительными в единственном числе (возможно, с уточняющими словами). Среди атрибутов выделяется ключ сущности — не избыточный набор атрибутов, значения которых в совокупности являются уникальными для каждого экземпляра сущности [29, c 75]. На рисунке 11 показан пример ER-диаграммы.

Рисунок 11 – ER-диаграмма

1.2.3 UML

Язык UML (unied modeling language — унифицированный язык моделирования) — это универсальный визуальный язык моделирования, используемый для спецификации, визуализации, конструирования и документирования артефактов программной системы [6, c. 83]. Он описывает решения и представления о конструируемых системах и используется для понимания, анализа, просмотра, конфигурирования, поддержки и контроля информации о системе. Этот язык предназначен для использования в сочетании с любыми методами разработки, на любых стадиях жизненного цикла проекта, в любых предметных областях и в любых средах.

Язык UML был разработан компанией Rational SoFtware Corporation для унификации лучших свойств, которыми обладали более ранние методы и способы нотации [37, c. 45]. В 1997 году организация OMG ( Object Management Group — группа управления объектами) признала его в качестве стандартного языка моделирования. С тех пор UML получил дальнейшее развитие и широкое признание в отрасли информационных технологий.

Язык UML не зависит от применяемого процесса разработки программного обеспечения, хотя позже компания Rational предложила процесс, соответствующий этому языку, под названием Rational Unified Process (RUP: Krushten, 2003) [34, c. 101]. Совершенно очевидно, что процесс, в котором в качестве базового языка принят UML, должен поддерживать объектно-ориентированный подход к созданию ПО. Язык UML не подходит для устаревших структурных подходов, результатом которых являются системы, реализованные с помощью процедурных языков программирования наподобие языка COBOL [8, c. 234].

Язык UML также не зависит от технологий реализации (поскольку они являются объектно-ориентированными). Это ограничивает язык UML в отношении поддержки этапа детализированного проектирования жизненного цикла программного обеспечения. В то же время это делает язык UML более устойчивым к частой смене платформ реализации.

1.3 ЭТАПЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО

ПРОГРАММИРОВАНИЯ

1.3.1 ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД

Объектно-ориентированный подход (objectoriented approach) подразумевает разделение системы на компоненты с разной степенью детализации [16, c. 54]. В основе этой декомпозиции лежат классы объектов. Классы связаны разнообразными отношениями и обмениваются сообщениями, вызывающими операции над объектами.

Несмотря на то, что объектно-ориентированные языки программирования (к примеру, Simula) существовали еще в начале 1970х годов, объектно-ориентированный подход к проектированию систем получил распространение лишь в 1990х годах. Позднее ассоциация производителей программного обеспечения Object Management Group утвердила в качестве стандартного средства моделирования для этого подхода язык UML (Unified Modeling Language — унифицированный язык моделирования).

По сравнению со структурным подходом объектно-ориентированный подход в большей степени ориентирован на данные — он развивается вокруг моделей классов. На этапе анализа для классов не требуется определять операции — только атрибуты. Однако возрастающее значение использования в языке UML прецедентов способствует незначительному смещению акцентов от данных к функциям.

Существует понимание того, что разработчики используют объектный подход благодаря техническим преимуществам объектной парадигмы, таким как абстракция, инкапсуляция, повторное использование, наследование, передача сообщений, полиморфизм и т.д. Эти технические свойства могут привести к более высокому уровню повторного использования программного кода и данных, сокращению времени разработки, росту продуктивности труда программистов, повышению качества программного обеспечения, большей понятности программ и т.д. При всей свой привлекательности эти преимущества объектной технологии до сих пор не нашли своего практического воплощения. Тем не менее, объекты используются сегодня и будут использоваться завтра. Одной из причин этого является необходимость использовать программирование, управляемое событиями (eventdriven), требуемое современными интерактивными графическими интерфейсами.

Другой причиной популярности объектного подхода является возможность удовлетворить требования вновь возникающих типов приложений и находить наилучшие способы борьбы с ростом дефицита ресурсов (application backlog), который проявляет ся либо в недостаточном количестве программ, либо в нарушении сроков поставок в ходе расширения и компоновки существующих систем программного обеспечения. К двум наиболее важным новым категориям приложений, для которых требуется объектная технология, относятся групповые вычисления ( workgroup computing) и мультимедийные системы (multimedia systems). Идея уменьшить дефицит ресурсов посредством концепции упаковки объектов (object wrapping) доказала как свою привлекательность, так и работоспособность.

Объектный подход к разработке систем полностью соответствует требованиям итеративного и поступательного процесса разработки. На этапах анализа, проектирования и реализации разрабатывается единая модель (и единый проектный документ), которая постепенно уточняется, изменяется и усовершенствуется, а выпуски программных модулей с расширенными возможностями поддерживают высокий уровень удовлетворенности пользователей и обеспечивают обратную связь, необходимую для продолжения разработки модулей.

Разработка с помощью последовательной детализации становится возможной благодаря тому, что все создаваемые в ходе разработки модели (анализа, проектирования и реализации) обладают семантическим богатством и базируются на одном и том же “языке” — базовый словарь этих моделей существенно не отличается (классы, атрибуты, методы, наследование, полиморфизм и т.д.). Следует, однако, заметить, что если в основу реализации положена реляционная база данных, то необходимость в сложной и связанной с риском трансформации по-прежнему сохраняется (поскольку базовая семантика реляционной модели сравнительно беднее).

Объектный подход устраняет большинство из наиболее значительных недостатков структурного подхода, однако служит источником некоторых новых проблем:

1) Этап анализа проводится на еще более высоком уровне абстракции, и если реализация сервера предполагает использование реляционной базы данных, то может возникнуть значительный семантический разрыв (semantic gap) между концепцией и ее реализацией. Несмотря на то что анализ и проектирование могут проводиться итеративно и последовательно, в конце концов разработка достигает этапа реализации, на котором решение должно быть воплощено в реляционную базу данных. Если в качестве платформы реализации используется объектная или объектно-реляционная база данных, трансформация проекта проходит значительно легче.

2) Затрудняется управление проектом. Менеджеры измеряют степень продвижения разработки, используя четко определенные структуры декомпозиции, элементы комплекта поставки и календарный план. При объектно-ориентированной разработке с помощью детализации не существует четких границ между этапами, а проектная документация непрерывно уточняется. Приемлемое решение в такой ситуации заключается в разделении проекта на небольшие модули и управлении ходом разработки за счет частого выпуска выполняемых версий этих модулей (некоторые из этих выпусков могут предназначаться для внутреннего применения, а другие — поставляться заказчику).

3) Объектные решения значительно сложнее прежних структурированных систем. Сложность возникает в основном из-за интенсивного обмена сообщениями между объектами и компонентами. Эта проблема усугубляется плохой архитектурой, допускающей неограниченные связи между взаимодействующими объектами. Системы, имеющие такую архитектуру, трудно эксплуатировать и расширять.

Сложности, связанные с объектным подходом, не отменяют тот факт, что, по словам Артура Кларка, “время нельзя повернуть вспять”. Возврата к вызывающему ностальгию процедурному стилю пакетных приложений, например реализованного в языке COBOL, нет. Все участники проектов по созданию информационных систем хорошо знакомы с Интернетом, электронной коммерцией, компьютерными играми и другими интерактивными приложениями.

Разработка новых программных приложений отличается значительно большей сложностью, и структурный подход совершенно не соответствует этой задаче [17, c. 93]. На сегодняшний день объектно-ориентированной подход — единственный известный метод, позволяющий совладать с разработкой нового программного обеспечения, управляемого событиями и отличающегося высоким уровнем интерактивности.

1.3.2 ЭТАПЫ ЖИЗНЕННОГО ЦИКЛА

Жизненный цикл разработки программного обеспечения представляет собой точно определенную хронологическую последовательность действий [20, c. 48]. На укрупненном уровне жизненный цикл может включать пять этапов:

1) Бизнес-анализ.

2) Проектирование системы.

3) Реализация.

4) Компоновка и развертывание.

5) Эксплуатация и сопровождение.

1.4 СРЕДЫ РАЗРАБОТКИ

1.4.1 EMBARCADERO RAD STUDIO

Embarcadero RAD Studio – среда разработки программных систем для операционных систем Windows. Данная среда позволяет быстро разработать программные системы для Windows, Mac, Android, IOS, интернет вещей (IoT) [11, c 54]. Среда позволяет писать приложения на С++ и Object Pascal. Главное окно Embarcadero RAD Studio показано на рисунке 12.

В состав Embarcadero RAD Studio входят Delphi, C++Builder.

Рисунок 12 – Главное окно среды Embarcadero RAD Studio

Embarcadero RAD Studio включает следующие основные новые возможности:

А) Поддержка Windows 10. С помощью Delphi и C++Builder можно разрабатывать VCL и FMX-приложения, которые поддерживают компоненты Windows 10 и API системы, компоненты WinRT\UWP;

Б) Компилятор C++11, основанный на архитектуре CLANG. В C++Builder используется компилятор c++, который основан на CLANG. Компилятор используется для Windows и мобильных платформ. Данный компилятор работает с VCL и кроссплатформенными структурами FMX;

В) Удвоенный размер проектов в IDE. Позволяет увеличить размер проектов, что позволяет разрабатывает большие, комплексные решения;

1.4.2 VISUAL STUDIO

Visual Studio включает в себя редактор исходного кода с поддержкой технологии IntelliSense и возможностью простейшего рефакторинга кода [9, c. 154]. Встроенный отладчик может работать как отладчик уровня исходного кода, так и отладчик машинного уровня. Остальные встраиваемые инструменты включают в себя редактор форм для упрощения создания графического интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы базы данных. Visual Studio позволяет создавать и подключать сторонние дополнения (плагины) для расширения функциональности практически на каждом уровне, включая добавление поддержки систем контроля версий исходного кода (как, например, Subversion и Visual SourceSafe), добавление новых наборов инструментов (например, для редактирования и визуального проектирования кода на предметноориентированных языках программирования) или инструментов для прочих аспектов процесса разработки программного обеспечения (например, клиент Team Explorer для работы с Team Foundation Server)[27, c. 57]. Главное окно Visual Studio показано на рисунке 13.

Рисунок 13 – Главное окно среды Visual Studio

Visual Studio имеет множество возможностей:

    1. Современный C++. Visual Studio позволяет использовать последние стандарты языка С++.
    2. Создание универсальных программ для Windows. Используя C++ (либо C#, JavaScript или VB), вы можете создать единое универсальное приложение для Windows, способное работать на всех устройствах Windows 10.
    3. Мощные инструменты программирования. Среда имеет множество средств для редактирования, просмотра и рефакторинга, отладки, диагностики.

1.4.4 MONODEVELOP

MonoDevelop — свободная среда разработки, предназначенная для создания приложений C#, Java, Boo, Nemerle, Visual Basic .NET, Vala, CIL, C и C++. MonoDevelop позволяет разработчикам разрабатывать настольные и веб-приложения на Linux, Windows и Mac OS X. Среда предоставляет возможность .NET программы, сделанные в Visual Studio, портировать на Linux и Mac OS X; при этом сохраняется единый базовый код для всех платформ [26, c. 705]. Главное окно MONODEVELOP показано на рисунке 14.

Рисунок 14 – Главное окно среды MonoDevelop

2 ПРОЕКТНАЯ ЧАСТЬ

2.1 ПОСТАНОВКА ЗАДАЧИ

В ходе практики нужно было спроектировать и разработать программное средство для моделирования работы лифта. Лифт должен работать в многоэтажном доме. Программа отсчитывает время с тактами в одну секунду. Появление пассажира случайно. Также существует таймер отсчета для появления нового пассажира на любом этаже. Пассажир появляется на любом этаже, нажимает кнопку вызова лифта, если лифта на этом же этаже, то он открывает двери лифта. После этого кнопка лифта отжимается, и пассажир заходит в лифт. Далее пассажир нажимает кнопку случайного этажа, и лифт закрывает двери, затем начинает движение к заданному этажу. Когда лифт прибывает на нужный этаж, кнопка этажа отжимается, двери лифта открываются, и пассажир выходит из лифта. Затем лифт закрывает двери, и пассажир уходит.

    1. ИСПОЛЬЗОВАНИЕ UML ДЛЯ РАЗРАБОТКИ ПРОГРАММНОЙ

МОДЕЛИ

UML (Unified Modeling Language) — унифицированный язык моделирования — язык графического описания для объектного моделирования в области разработки программного обеспечения. UML – это мощный инструмент для проектирования программ или программных систем. Он помогает спроектировать полностью рабочие элементы программы. Предоставляет возможность описать работу программы во всех ситуациях. Что помогает выявить слабые и сильные стороны проектируемых компонентов, алгоритмов программы. Построить архитектуру программной системы. UML дает возможность разобраться в работе сложной системы. На рисунке 15 показаны этапы UML проектирования. Язык UML применим не только на стадии проектирования программного средства, но и на всех этапах разработки программы, так как на всех этапах нужен последовательный план действий, который упорядочивает разработку программного средства.

Рисунок 15 – Этапы UML проектирования

UML помогает заложить фундамент в проектировании программы и предоставляет возможность построить структуру классов. UML не зависит от конкретного языка программирования. Это дает возможность при программировании использовать любой язык. Ниже описывается логика разработки программы в нотации UML.

Кнопка Запуск (рисунок 16) запускает главную функцию main. Затем проверяются параметры программы. Если не было ввода параметров, то выставляются параметры по умолчанию. Инициализируются объекты классов. Затем начинается цикл, пока последний пассажир не проедет. Пассажир появляется на первом этаже, затем он нажимает на кнопку лифта. К счетчику времени прибавляется параметр времени нажатия кнопки. На форме программы появляется информация о положении лифта и пассажира. Если лифта на том же этаже, то он открывает двери и к счетчику времени прибавляется параметр времени открытия дверей. Если этаж другой, то лифт начинает движение к пассажиру и к счетчику времени прибавляется параметр времени передвижения лифта. Когда лифт прибывает на этаж с пассажиром, двери лифта открываются и кнопка вызова лифта выключается. К счетчику времени прибавляется время работы кнопки и дверей. Далее, пассажир заходит в лифт и нажимает на кнопку с случайным этажом. К счетчику времени прибавляется время работы кнопки. Двери лифта закрываются. К счетчику времени прибавляется время работы дверей. Лифта поднимается или опускается на заданный этаж. Когда лифт меняет своё положение, цифра над лифтом меняется. Пока лифт не прибудет на нужный этаж, стрелки будут показывать направление лифта. К счетчику времени прибавляется время работы лифта. После прибытия лифта на нужный этаж, кнопка в лифте выключается и двери лифта открываются. К счетчику времени прибавляется время работы кнопки и дверей. Пассажир выход из лифта, и двери лифта закрываются. К счетчику времени прибавляется время на вход/выход пассажира и время работы дверей. Пассажир исчезает. Производится отсчет времени до нового пассажира. Если пассажир был последним, то функция прекращает работу.

На рисунке 16 показана диаграмма активности лифта. Она показывает работу лифта в программе.

Рисунок 16 – Диаграмма лифта

На рисунке 17 показана диаграмма активности пассажира. Диаграмма показывает взаимодействие пассажира c лифтом в программе.

Рисунок 17 – Диаграмма пассажира

На рисунке 18 показана диаграмма активности кнопки. На диаграмме показаны состояния кнопки. При выполнении событий, которые показаны на диаграмме, меняется состояние кнопки.

Рисунок 18 – Диаграмма работы кнопки

Ниже описывается процесс проектирования главной функции класса. На первом этапе мы инициализируем все необходимые переменные и объекты класса. Загружаем значения полей формы, сохраняемых в глобальных переменных, присваиваем значения переменным в функции, отвечающей за процесс моделирования работы лифта. чтобы была возможность изменять эти значения в процессе ее работы. Проверяем эти значения. Если они пустые, то присваиваем переменным значение, равное единице. На рисунке 19 показана диаграмма проектирования первого этапа.

Рисунок 19 – Проектирование первого этапа

На втором этапе мы выводим количество этажей и пассажиров на форму программы. Устанавливаем метку. По метке будет осуществляться переход, если количество пассажиров, которые уже проехали, не будет равно установленному значению. На рисунке 20 показана диаграмма проектирования второго этапа.

Рисунок 20 – Проектирование второго этапа

На третьем этапе проинициализируем класс man. Выведем на форму программы пассажира, номер этажа с пассажиром и номер этажа с лифтом. На рисунке 21 показана диаграмма проектирования третьего этапа.

Рисунок 21 – Проектирование третьего этапа

На четвертом этапе выполним обработку вызова лифта. В переменную времени заложим время на нажатие кнопки. Отобразим процесс действия на форму. На рисунке 22 показана диаграмма проектирования четвертого этапа.

Рисунок 22 – Проектирование четвертого этапа

На пятом этапе выполним обработку движения лифта. В переменную времени заложим время на передвижение лифта. Отобразим процесс действия на форму. На рисунке 23 показана диаграмма проектирования пятого этапа.

Рисунок 23 – Проектирование пятого этапа

На шестом этапе выполним выключение кнопки вызова лифта. В переменную времени заложим время, которое необходимо на срабатывание кнопки лифта. Отобразим процесс действия на форму. На рисунке 24 показана диаграмма проектирования шестого этапа.

Рисунок 24 – Проектирование шестого этапа

На седьмом этапе выполним открытие дверей лифта. В переменную времени заложим время, которое необходимо на открытие дверей лифта. Отобразим процесс действия на форму. На рисунке 25 показана диаграмма проектирования седьмого этапа.

Рисунок 25 – Проектирование седьмого этапа

На восьмом этапе выполним передвижение пассажира в лифт. В переменную времени заложим время, которое необходимо на передвижение пассажира в лифт. Отобразим процесс действия на форму. На рисунке 26 показана диаграмма проектирования восьмого этапа.

Рисунок 26 – Проектирование восьмого этапа

На девятом этапе выполним случайный выбор этажа, нажатие на кнопку нужного этажа. В переменную времени заложим время, которое необходимо на нажатие кнопки лифта. Отобразим процесс действия на форму. На рисунке 27 показана диаграмма проектирования девятого этапа.

Рисунок 27 – Проектирование девятого этапа

На десятом этапе выполним закрытие дверей лифта. В переменную времени заложим время, которое необходимо на закрытие дверей лифта. Отобразим процесс действия на форму. На рисунке 28 показана диаграмма проектирования на десятом этапа.

Рисунок 28 – Проектирование десятого этапа

На одиннадцатом этапе выполним обработку движения лифта. В переменную времени заложим время на передвижение лифта к заданному этажу. Отобразим процесс действия на форму. На рисунке 29 показана диаграмма проектирования одиннадцатого этапа.

Рисунок 29 – Проектирование одиннадцатого этапа

На двенадцатом этапе выполним выключение кнопки этажа в лифте. В переменную времени заложим время, которое необходимо на срабатывание кнопки лифта. Отобразим процесс действия на форму. На рисунке 30 показана диаграмма проектирования двенадцатого этапа.

Рисунок 30 – Проектирование двенадцатого этапа

На тринадцатом этапе выполним открытие дверей лифта. В переменную времени заложим время, которое необходимо на открытие дверей лифта. Отобразим процесс действия на форму. На рисунке 31 показана диаграмма проектирования тринадцатом этапа.

Рисунок 31 – Проектирование третьего этапа

На четырнадцатом этапе выполним передвижение пассажира в лифт. В переменную времени заложим время, которое необходимо на передвижение пассажира в лифт. Отобразим процесс действия на форму. На рисунке 32 показана диаграмма проектирования четырнадцатого этапа.

Рисунок 32 – Проектирование четырнадцатого этапа

На пятнадцатом этапе выполним закрытие дверей лифта. В переменную времени заложим время, которое необходимо на закрытие дверей лифта. Отобразим процесс действия на форму. На рисунке 33 показана диаграмма проектирования пятнадцатого этапа.

Рисунок 33 – Проектирование пятнадцатого этапа

На шестнадцатом этапе выполним проверку, сколько человек проехало. Если число будет равно числу необходимых пассажиров, то функция прекращает работу. На рисунке 34 показана диаграмма проектирования шестнадцатого этапа.

Рисунок 34 – Проектирование шестнадцатого этапа

Совокупность этапов, на которые можно поделить разработку функции моделирования работы лифта, составило шестнадцать. Теперь с помощью языка программирования можно приступать к написанию кода, придерживаясь этих этапов.

      1. ПРОБЛЕМЫ ПРОЕКТИРОВАНИЯ

В процессе проектирования формируется модель программы. Во время формирования модели программы нужно выделить основные свойства системы. Проектирование программной системы решает следующие проблемы:

  1. Выбор платформы для программного средства.
  2. Выбор методов решения задачи.
  3. Разработка алгоритмов для решения задачи, функциональных структур алгоритмов. Проектирование свойств, методов, событий объектов.
  4. Составление общей структуры проекта.

На первых этапах проектирования нужно правильно выделить факты из постановки задачи. Используя таблицу для удобства распределения фактов и объектов, можно разделить выделенные факты по объектам в две колонки. Потом идет разделение фактов на две группы. Первую группу нужно пометить как Атрибуты, а вторую группу как Другие факты. Для описания поведения объектов нужно добавить третью группу. Это поможет выделить поведение объектов. Нужно добавить в отдельный список атрибуты, которые будут изменены. Выделим сообщения, посылаемые другим объектам. Это сообщения, которые будут передаваться от объектов к другим объектам, для осуществления их взаимодействия.

Для классов, которые были ранее выделены, нужно написать реализацию на языке программирования. Затем нужно спроектировать текстовой вывод действий, которые будут выполнены программой. Далее следует выделить отношения композиции между классами, которые были реализованы в программе, изменить описание классов, в которых будут отражены отношения композиции, и спроектировать и внедрить графический интерфейс в программу.

В процессе проектирования данной программы пришлось упростить класс man. Это сделано было для того, чтобы реализовать графический интерфейс. Было добавлено несколько функций, которые не изменяют основную логику программы, в основной класс программы для отображения результатов действий. С помощью этих функций и делегатов достигнута определенная стабильность программы. Основная функция, которая запускает процесс моделирования, сама запускается в отдельном потоке, что дает возможность увидеть визуальную часть программы. Но в целом программа работает так, как отражено в постановке задачи.

    1. ИСПОЛЬЗОВАНИЕ ЯЗЫКА С++ ДЛЯ РЕАЛИЗАЦИИ

ПРОГРАММНОЙ СИСТЕМЫ

В классе Button описаны методы объекта кнопки. Листинг класса находится в приложении А. В классе Button содержится параметр, который отвечает за состояние кнопки. Методы служат для включения кнопки и выключения её. Также в этом классе содержатся методы для вывода состояния кнопки в консоль. На рисунке 35 показана диаграмма состояния класса button.

Рисунок 35 – Диаграмма класса button

Класс man представляет собой объект пассажира. Листинг класса находится в приложении Б. Класс содержит два атрибута, которые отвечают за этаж с пассажиром и положение пассажира в лифте. Методы класса отвечают за положение пассажира по отношению к лифту. А также для вывода информации пассажира на экран. На рисунке 36 показана диаграмма состояния класса man.

Рисунок 36 – Диаграмма класса man

Класс elevator содержит методы и атрибуты, необходимые для моделирования лифта. Листинг класса находится в приложении В. В классе содержатся атрибуты класса button для инициализации кнопки в лифте, два атрибута, которые показывают состояния дверей и положения лифта. Объект лифт содержит методы для спуска, подъема, открытия дверей, закрытия дверей, вызова лифта. Также класс имеет методы для передвижения лифта к заданному этажу, переключения кнопки в лифте, отображения состояния кнопки лифта. На рисунке 37 показана диаграмма состояния класса elevator.

Рисунок 37 – Диаграмма класса elevator

Класс MyForm является основным в программе. Листинг класса находится в приложении Г. В этом классе содержится объявление и инициализация компонентов формы, подключение заголовочных файлов с классами man, button, elevator. При нажатии на кнопку «Запуск» запускается отдельный поток для выполнения основной функции. В функции main происходит инициализация нужных классов, а также происходит выполнение основного кода программы, процесс которого можно увидеть на форме программы. В программе используются делегаты для взаимодействия компонентов из потока.

Рассмотрим работу класса MyForm более подробно. Нажатие на кнопку запуска приводит к работе главную функцию программы. Нажатие на кнопку запуска активирует событие OnClick. При вызове OnClick происходит сброс времени на форме. Затем идет считывание полей ввода в переменные и запуск функции, которая запускает процесс моделирования работы лифта. При считывании поля происходит проверка: если оно пустое, то значение переменной будет равно 1. Запуск функции сделан через компонент BackgroundWorker. Он позволяет запускать функцию в отдельном потоке. На рисунке 38 изображена диаграмма алгоритма работы события OnClick кнопки запуска.

Рисунок 38 – Диаграмма алгоритма работы события OnClick

В функции моделирования происходит инициализация классов button, elevator, man. После этого происходит вывод количества этажей и пассажиров, так как они могли быть не введены. Вывод данных осуществлен через делегатов. Они меняют значение компонента формы в функции, которая запущенна в отдельном потоке. Функции NumberofFloor, SumPassenger (приложение Г) принимают число, которое нужно изменить на форме программы. Функции NumberofFloor (приложение Г) изменяет количество этажей в текстовом, а функция SumPassenger (приложение Г) изменяет значение этажей в текстовом поле. Далее идет установка метки. Возвращение к метке происходит, если проехали не все пассажиры. Затем происходит инициализация класса man. С помощью делегата модель человека появляется на форме. Так как человек приходит и уходит, то функция, которая отвечает за модель человека, принимает два параметра. Если параметр равен одному, то человек появляется на форме, если параметр не равен одному, то он исчезает. Диаграмма функции PassengerStatus (приложение Г) показана на рисунке 39.

Рисунок 39 – Диаграмма функции PassengerStatus

После этого появляется на форме программы номер этажа, на котором появился пассажир, и номер этажа, на котором расположен лифт. Номера этажей также выводятся с помощью делегатов. Затем проверяется состояние кнопки в лифте и на этаже. Если они находятся в выключенном состоянии, то происходит нажатие на кнопку.

Рассмотрим этап перемещения лифта и пассажира. Если этаж пассажира и лифта оказываются одинаковыми, то переменная, которая отвечает за статус кнопки, меняет значение на true. Метод setstatusfloor (приложение А) класса button изменяет статус кнопки. С помощью делегата функция ButtonFloorAction (приложение Г) меняет состояние кнопки этажа. То есть кнопка загорается. Функция принимает параметр, который указывает, что нужно сделать. Если параметр равен одному, то кнопка загорается. Любое другое число выключает кнопку. На рисунке 40 представлена диаграмма функции ButtonFloorAction.

Рисунок 40 – Диаграмма функции ButtonFloorAction

Затем идет добавление времени, которое было затрачено на нажатие кнопки. Функция ShowClock (приложение Г) выводит время, а затем функция LiftPosition (приложение Г) выводит номер этажа на форму. Функции ShowClock, LiftPosition принимают число, которое нужно изменить на форме программы. Если положение пассажира и лифта разные, то включаем кнопку на этаже путем изменения её статуса с помощью метода setstatusfloor (приложение А). И выводим положение лифта на форму программы через функцию LiftPosition (приложение Г), которая меняет этаж лифта. На рисунке 41 представлена схема алгоритма проверки того, что лифт и пассажир находятся на одном этаже.

Рисунок 41 – Схема алгоритма проверки

Затем идет перемещение лифта к пассажиру. Переменная floor1 (приложение Г) принимает значение этажа с лифтом. Если пассажир находится на этаже выше лифта, то лифт начинает движение вверх, которое обозначается стрелкой вверх. Функция PointAction (приложение Г) принимает значение направления, затем на форме появляется нужная стрелка. Если параметр этой функции равен up, то появляется стрелка вверх, если параметр равен down, то появляется стрелка вниз, если параметр равен stop, то стрелка исчезает с формы программы. На рисунке 42 представлена схема алгоритма функции PointAction.

Рисунок 42 – Схема алгоритма функции PointAction

Пока лифт и пассажир не будут на одном этаже, лифт будет подниматься вверх. Прибавляем к значению floor1 (приложение Г) единицу. Устанавливаем паузу на 5 секунд. Это сделано для того, чтобы была возможность наблюдать плавную работу движения лифта. С помощью функции LiftPosition (приложение Г) выводим значение этажа с лифтом. Добавляем к таймеру время подъема лифта. Через функцию ShowClock (приложение Г) выводим время на форму. На рисунке 43 представлена схема алгоритма подъема лифта.

Рисунок 43 – Схема алгоритма подъема лифта

Алгоритм спуска лифта имеет схожий принцип работы. Только переменная (приложение Г) floor1 уменьшается на единицу. На рисунке 44 представлена схема алгоритма спуска лифта. После того как лифт прибыл на нужный этаж, стрелка с направлением убирается с помощью функции PointAction (приложение Г). Тут она принимает параметр со значением stop.

Рисунок 44 – Схема алгоритма спуска лифта

Как только лифт приезжает на назначенный этаж, кнопка лифта выключается. Выключение кнопки происходит с помощью метода setstatusfloor (приложение Г). Ему передаются параметры false и номер этажа.

Используя цикл for, двери лифта на форме открываются. Данный цикл используется для плавного передвижения дверей лифта. Для перемещения дверей на форме используется функция DoorAction (приложение Г). Функция принимает параметр, который указывает направление дверей. Для открытия дверей нужно передать параметр значение, которого равно единице. Потом выполняется перемещение дверей. Схема алгоритма функции DoorAction представлена на рисунке 45.

Рисунок 45 – Схема алгоритма функции DoorAction

Затем добавляем к таймеру время работы дверей лифта. Вывод текущего времени эксперимента на форму программы осуществляется с помощью функции ShowClock (приложение Г). Передвигаем пассажира в лифт. Передвижение пассажира организовано с помощью функции PassengerAction (приложение Г). Функция принимает число, на которое нужно передвинуть пассажира. Если переменная положительная, то пассажир выходит из лифта, если переменная отрицательная, то пассажир заходит в лифт. Схема алгоритма функции PassengerAction представлена на рисунке 46.

Рисунок 46 – Схема алгоритма функции PassengerAction

Прибавляем к таймеру время передвижения пассажира. Выводим значение таймера на форму программы.

С помощью функции randomNumber (приложение Г) выбирается случайный этаж. Убираем номер этаж, на котором был пассажир. Функция PassangerPosition (приложение Г) убирает это значение. Функция принимает значение -1 для того, чтобы убрать номер с формы. Любое другое значение позволяет вернуть номер на форму программы. Схема алгоритма функции PassangerPosition представлена на рисунке 47. Когда пассажир зашел в лифт, он нажимает на нужную кнопку этажа. Функция ButtounLift (приложение Г) служит для показа нужного этажа на кнопке в лифте и этажа с пассажиром. Если значение статуса true, то кнопка появляется, если значение статуса false, то кнопка исчезает. Функция принимает номер этажа и параметр, отвечающий за состояние копки. Схема алгоритма функции ButtounLift представлена на рисунке 48. Прибавляем к таймеру время активации кнопки. Выводим значение таймера на форму программы.

Рисунок 47 – Схема алгоритма функции PassangerPosition

Рисунок 48 – Схема алгоритма функции ButtounLift

Далее происходит обработка этажа, на который нужно лифту прибыть. Если этаж равен текущему, то выполняется пауза. Если нужный этаж ниже этажа с лифтом, то функции PointAction (приложение Г) передается параметр down. На форме появляется стрелка вниз. Пока нужный этаж не будет равен этажу с лифтом, будет использоваться цикл. Уменьшаем на единицу переменную, в которой лежит значение этажа с лифтом. Делаем паузу на пять секунд. Выводим текущий этаж, на котором расположен лифт, на форму программы. Прибавляем к таймеру время работы лифта. Выводим значение таймер на форму программы. Если нужный этаж выше этажа с лифтом, то функции PointAction передается параметр up. На форме появляется стрелка вверх. Пока нужный этаж не будет равен этажу с лифтом, будет использоваться цикл. Прибавляем на единицу переменную, в которой лежит значение этажа с лифтом. Делаем паузу на пять секунд. Вывод текущий этаж с лифтом на форму программы. Прибавляем к таймеру время работы лифта. Выводим значение таймера на форму программы.

Когда пассажир прибыл на нужный этаж, выводим номер этажа на форму программы. Функция PassangerPosition (приложение Г) выполняет данное действие. Затем убираем стрелку с направлением. Передаем параметр stop функции PointAction. Данный параметр заставляет убрать стрелки с формы программы. Выключаем кнопку в лифте. Передадим функции ButtounLift (приложение Г) параметр false, чтобы выключить кнопку в лифте. Прибавляем к таймеру время работы кнопки. Выводим значение таймера на форму программы.

Затем происходит открытие дверей лифта (рисунок 49). Чтобы открыть и закрыть двери, используется цикл for и функция DoorAction (приложение Г). Функция DoorAction принимает положительный параметр, чтобы открыть двери лифта. Схема данного алгоритма представлена на рисунке 49. Прибавляем к таймеру время работы лифта. Выводим значение таймер на форму программы. Когда двери лифта открылись, пассажир покидает лифт. Чтобы пассажир вышел из лифта, используется цикл for и функция PassengerAction (приложение Г). Функция PassengerAction принимает положительный параметр, чтобы пассажир вышел из лифта. Схема данного алгоритма представлена на рисунке 50. Прибавляем к таймеру время, которое затратил пассажир на выход из лифта. Выводим значение таймера на форму программы.

Рисунок 49 – Схема алгоритма открытия дверей

Рисунок 50 – Схема алгоритма передвижения пассажира на форме

Далее происходит закрытие дверей лифта. Функция DoorAction (приложение Г) принимает параметр, который не равен 1. И двери на форме начинают закрываться. Схема данного алгоритма такая же, как у открытия дверей. Прибавляем к таймеру время работы дверей. Выводим значение таймера на форму программы.

К счетчику пассажиров прибавляем единицу. Сравниваем количество пассажиров, которые проехали, и количество пассажиров, которые должны проехать. Функция прекращает работу, если достигнуто необходимое количество пассажиров, которые должные проехать на лифте.

На рисунке 51 показана структура программы. В главном файле Myform.h описывается форма программы, и она же служит для запуска функции, в которой происходит процесс моделирования. В данном файле происходит подключение заголовочных файлов классов, которые описаны выше. В каждом заголовочном файле класса присутствует подключение внешних стандартных файлов.

Рисунок 51 – Структура программы

На рисунке 52 показана UML-диаграмма классов программы. На данной диаграмме показаны переменные, методы, объекты классов, а также связь классов программы.

Рисунок 52 – UML-диаграмма классов

Класс MyForm изображен на рисунках 53 и 54.

Рисунок 53 – Класс MyForm

Рисунок 54 – Класс MyForm

ЗАКЛЮЧЕНИЕ

Этап проектирования является одним из главных этапов объектно-ориентированного программирования. Проектирование помогает исключить ряд проблем в архитектуре программного средства. Для проектирования программного средства был выбран язык UML. Данный язык имеет множество элементов, которые предоставляют возможность наиболее полно описать программную систему на этапе проектирования.

Важную роль в процессе разработки занимает правильная организация всего процесса. Придерживаясь этапов проектирования при разработке программной системы можно сэкономить время и исключить ошибки в программной системе.

Грамотный выбор среды разработки предостережет разработчика программной системы от мелких и крупных неприятностей в процессе разработки.

В проектной части КР было спроектировано и разработано программное средство для моделирования работы лифта, а также проведен эксперимент с его использованием. Написано руководство пользователя.

В ходе разработки использовался объектно-ориентированный подход. Это привело к сокращению времени разработки и повысило качество программного решения. Разработанная программа подходит как строительным фирмам, так и компаниям, которые занимаются проектированием подъемных устройств и предоставляет проектным организациям эффективное решение под различные задачи. Данная программа имеет ряд возможностей для её адаптации к реальным проблемам, стоящим перед предприятиями, которые занимаются проектированием и разработкой лифто-подъемного оборудования.

Тема КР является актуальной. Моделирование работы лифта позволяет определить множество параметров для наладки оптимальной работы подъемников в различных строениях. К примеру, разработанная программа позволяет рассчитать пассажирооборот за нужный промежуток времени, а при проектировании зданий – определить, имеется ли необходимость в дополнительном лифте, настроить оптимальную скорость лифта и т.п. Программа позволяет исключить дополнительные расходы, связанные с переналадками лифтового оборудования. У данного программного средства есть множество способов для улучшения, например, добавление различных параметров, в частности, добавление возможности регулировать очереди пассажиров, увеличение числа лифтов, масштабирование в облачный ресурс для быстрого доступа к программе через интернет и другие способы.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Харви Д. Как программировать на C++ [Текст] / Харви Д, Пол Д – М.: ООО «Бином-Пресс», 2008. - 1456 с.
  2. Труб И. Объектно-ориентированное моделирование на C++ [Текст] –СПБ: Питер, 2006. - 411 с.
  3. Ларман К. Применение UML 2.0 и шаблонов проектирования. [Текст] — М.: ООО “И.Д. Вильямс”, 2013. — 736 с.
  4. Лешек А. Анализ и проектирование информационны
  5. х систем с помощью UML 2.0 [Текст] — М: ООО “И.Д. Вильямс”, 2008. — 816 с.
  6. Вирт Н. Алгоритмы и структуры данных [Текст] – М.: ДМК Пресс, 2010. – 272 с.
  7. Фаулер M. UML. Основы [Текст] – СПб.: Символ-Плюс, 2004. – 192 с.
  8. Гома Х. UML. Проектирование систем реального времени, параллельных и распределительных приложений. [Текст] – М.: ДМК Пресс, 2011. – 704 с.
  9. Арлоу Д.UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование. [Текст] – СПб.: Символ-Плюс, 2007. – 624 с.
  10. Страуструп Б. Программирование: принципы и практика с использованием С++. [Текст]- М.: ООО "И.Д. Вильяме", 2016. - 1328 с.
  11. Зиборов В. MS Visual C++ 2010 в среде .NET. Библиотека программиста. [Текст] — СПб.: Питер, 2012. — 320 с.
  12. Лафоре Р. Объектно-ориентированное программирование в С++. [Текст] - СПБ.: Питер, 2006. - 924 с.
  13. Прата C. Язык программирования C++. Лекции и упражнения. [Текст] — М.: ООО "И.Д. Вильяме", 2012. - 1248 с.
  14. Назаров С.В. Архитектура и проектирование программных систем [Текст] – М.: НИЦ Инфра-М, 2013. – 351 с.
  15. Брукс Ф. Проектирование процесса проектирования. Записки компьютерного эксперта [Текст] - М.: Вильямс, 2013. – 464 с.
  16. Культин Н. C/C++ в задачах и примерах [Текст] - СПБ.: БХВ-Петербург, 2009. — 351 с.
  17. Кёнинг Э. Эффективное программирование С++ [Текст] - М.: Издательский дом «Вильямс», 2002. – 386 с.
  18. Сидорина Т. Самоучитель Microsoft Visual Studio C++ и MFC [Текст] - СПБ.: БХВ-Петербург, 2009. — 848 с.
  19. Макконнелл С. Совершенный код. [Текст] - М.: Русская редакция, 2005. – 889 с.
  20. Стенли Л. Язык программирования С++ [Текст] - М.: Издательский дом «Вильямс», 2007. – 890 с.
  21. Годштейн С. Оптимизация приложений на платформе .NET [Текст] – М.: ДМК Пресс, 2014. – 524 с.
  22. Тепляков С. Паттерны проектирования на платформе .NET [Текст] - М.: Издательский дом «Вильямс», 2016. – 320 с.
  23. Вайсфельд М. Объектно-ориентированное мышление [Текст] –СПБ: Питер, 2014. - 304 с.
  24. Генри С. Алгоритмические трюки для программистов [Текст] - М.: Издательский дом «Вильямс», 2016. – 512 с.
  25. Клейнберг Дж. Алгоритмы: разработка и применение. [Текст] –СПБ: Питер, 2016. - 800 с.
  26. Колдаев В. Основы алгоритмизации и программирования [Текст] – М: ИД «ФОРУМ», 2006. - 416с.
  27. Шилд Г. Полный справочник по C++ [Текст] - М.: Издательский дом «Вильямс», 2006. – 791 с.
  28. Мейерс С. Эффективный и современный С++ [Текст] - М.: Издательский дом «Вильямс», 2016. – 306 с.
  29. Хортон А. Visual C++ 2010 Полный Курс. [Текст] — М.: Издательский дом «Вильямс», 2011. - 1216 с.
  30. Потопахин В. Современное программирование с нуля [Текст] – М.: ДМК Пресс, 2010. – 242 с.
  31. Вернон В. Реализация методов предметно-ориентированного проектирования. [Текст] — М.: Издательский дом «Вильямс», 2015. - 688 с.
  32. Эспозито Д. Microsoft .NET. Архитектура корпоративных приложений. [Текст] — М.: Издательский дом «Вильямс», 2015. - 432 с.
  33. Джейсон С. Элементарные шаблоны проектирования. [Текст] — М.: Издательский дом «Вильямс», 2013. - 533 с.
  34. Гради Б. Объектно-ориентированный анализ и проектирование с примерами приложений. [Текст] — М.: Издательский дом «Вильямс», 2008. - 721 с.
  35. Бабич А.В. Введение в UML [Текст] — М.: НОУ ИНТУИТ, 2016. - 209 c.
  36. Мацяшек Л.А. Анализ и проектирование информационных систем с помощью UML 2.0 [Текст] — М.: Издательский дом «Вильямс», 2008. - 816 с.
  37. Новиков Ф.А. Моделирование на UML: теория, практика [Текст] — СПб.: Профессиональная литература, 2010. — 640 с.
  38. Леоненков А. Объектно-ориентированный анализ и проектирование с использованием UML и IBM Rational Rose [Текст] — М.: НОУ ИНТУИТ, 2006. - 209 c.
  39. Йордон Э. Объектно-ориентированный анализ и проектирование систем [Текст] — М.: Лори, 2014. - 264 c.
  40. Кормен Т. Алгоритмы. Построение и анализ [Текст] — М.: Издательский дом «Вильямс», 2015. - 1368 с.
  41. Скиена С. Алгоритмы. Руководство по разработке [Текст] - СПБ.: БХВ-Петербург, 2011. — 720 с.

ПРИЛОЖЕНИЕ А

Листинг класса button.

#pragma once

// подключение заголовочных файлов

#include <windows.h>

#include <iostream>

using namespace std; //объявление пространства имен std

// класс button

class button {

public:

bool status; // нажата ли кнопка

button(bool p) { status = p; } // конструктор класса

void showstatus(int fl) {

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

if (status == true) {// если кнопка нажата

cout << " Кнопка " << fl << " этажа включена" << endl; // вывод результата в консоли

}

else {// если не нажата

cout << " Кнопка " << fl << " этажа выключена" << endl;// вывод результата в консоли

}

}

void setstatus(bool p, int fl) {

// функция для задания состояния кнопки в лифте

status = p; // установка статуса кнопки

showstatus(fl); // вывод положение кнопки

}

void showstatusfloor(int fl) {

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

if (status == true) { // если кнопка нажата

cout << " Кнопка вызова лифта включена на " << fl << " этаже" << endl;// вывод результата в консоли

}

else { // если кнопка не нажата

cout << " Кнопка вызова лифта выключена на " << fl << " этаже" << endl;// вывод результата в консоли

}

}

void setstatusfloor(bool p, int fl) {

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

status = p; // установка статуса кнопки

showstatusfloor(fl); // вывод положение кнопки

}

};

ПРИЛОЖЕНИЕ Б

Листинг класса man.

#pragma once

// подключение заголовочных файлов

#include <windows.h>

#include <iostream>

using namespace std; //объявление пространства имен std

// класс man

class man {

public:

int pos; // этаж пассажира

bool enter;// позиция пассажиры

// man() { }

man(int p) { pos = p; }// конструктор класса

void print() {

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

cout << " Человек на " << pos << " этаже" << endl; // вывод результата в консоли

}

void pressButton() {

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

cout << " Пассажир нажал на кнопку" << endl; // вывод результата в консоли

}

void enterToElevator() {

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

cout << " Человек входит в лифт " << endl;// вывод результата в консоли

enter = true; // пассажир внутри лифта

}

void exitToElevator() {

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

cout << " Человек выходит из лифта " << endl;// вывод результата в консоли

enter = false; // пассажир вышел лифта

}

};

ПРИЛОЖЕНИЕ В

Листинг класса elevator.

#pragma once

// подключение заголовочных файлов

#include <windows.h>

#include <iostream>

#include "button.h"

#include <string>

//#include "Toform.h"

using namespace std; //объявление пространства имен std

// класс elevator

class elevator {

public:

button bt; // переменная класса button

int door, floor; // переменная состояния дверей лифта, переменная положения лифта

elevator(int p, int p1, bool p3) :bt(p3) { door = p; floor = p1; } //конструктор класса

void up() {

// функция для поднятия лифта

floor++;// прибавляем этаж

cout << "\n Лифт поднимается на " << floor << " этаж" << endl; // вывод информации в консоли

}

void down() {

// функция для спуска лифта

floor--;//отнимаем этаж

cout << "\n Лифт спускается на " << floor << " этаж" << endl; // вывод информации в консоли

}

void Opendoor() {

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

door++; // открываем дверь

cout << "\n Лифт открывает двери" << endl;// вывод информации в консоли

}

void Closedoor() {

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

door--; // закрываем дверь

cout << "\n Лифт закрывает двери" << endl; // вывод информации в консоли

}

void setButtonElevator(int p, bool set) {

/// функция для задания состояния кнопки в лифте

bt.setstatus(set, p);

}

void elevatorcall(int tofloor) {

// функция для вызова лифта к пассажиру

if (tofloor == floor) {

// Если нужный этаж равен этажу с лифтом

Opendoor(); // открываем двери

}

else if (tofloor > floor) {// если нужный этаж выше этажа с лифтом

while (tofloor != floor) { // поднимаем лифт, пока этажи не будут равными

up();

}

Opendoor();// открываем двери

}

else if (tofloor < floor)

{// если нужный этаж ниже этажа с лифтом

while (tofloor != floor) {// опускаем лифт, пока этажи не будут равными

down();

}

Opendoor();// открываем двери

}

}

void enterfloorButton(int p) {

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

if (p == floor) { // если пассажир и лифт на одном этаже

setButtonElevator(p, true);// включение кнопки

Sleep(3000); // пауза на 3 секунды

setButtonElevator(p, false);//выключение кнопки

}

else if (p < floor) { // если пассажир ниже лифта

setButtonElevator(p, true); // включение кнопки

Closedoor(); // закрытие дверей

while (p != floor) { /// опускаем лифт, пока этажи не будут равными

down();

}

Opendoor(); // открытие двери

setButtonElevator(p, false); //выключение двери

}

else if (p > floor) { // если пассажир выше лифта

setButtonElevator(p, true); // включение кнопки

Closedoor(); // закрытие дверей

while (p != floor) {// поднимаем лифт, пока этажи не будут равными

up();

}

Opendoor();// открытие дверей

setButtonElevator(p, false); // выключение кнопки

}

}

void showstatus(int fl) { bt.showstatus(fl); } // функция для отображения состояния кнопки в лифте

void setstatus(bool p, int fl) { bt.setstatus(p, fl); } // функция для задания состояния кнопки в лифте

};

ПРИЛОЖЕНИЕ Г

Листинг класса MyForm.

#pragma once

// подключение заголовочных файлов

#include <windows.h>

#include <iostream>

#include <string>

#include <time.h>

#include "button.h"

#include "elevator.h"

#include "man.h"

using namespace std; //объявление пространства имен std

// пространство имен lift

namespace Lift {

// объявление пространства имен

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

/// <summary>

/// Сводка для MyForm

/// </summary>

// класс формы Myform

public ref class MyForm : public System::Windows::Forms::Form

{

public: // объявление видимых переменных в классе

int MainNumberFloor, MainNumberPassenger;

int PassengerTime, ButtonTime, LiftTime, DoorTime;

public:

// конструктор класса

MyForm(void)

{

InitializeComponent(); // инициализирует все компоненты, расположенные на форме

this->SetStyle(ControlStyles::SupportsTransparentBackColor, true);

}

protected:

/// <summary>

/// Освободить все используемые ресурсы.

/// </summary>

//деструктор класса

~MyForm()

{//удаление компонентов, если они есть

if (components)

{

delete components;

}

}

// объявление компонентов формы

private: System::Windows::Forms::PictureBox^ pictureBox14;

private: System::Windows::Forms::PictureBox^ pictureBox15;

private: System::Windows::Forms::Label^ label6;

private: System::Windows::Forms::Label^ label7;

private: System::Windows::Forms::GroupBox^ groupBox1;

private: System::Windows::Forms::TextBox^ textBox6;

private: System::Windows::Forms::Label^ label11;

private: System::Windows::Forms::TextBox^ textBox5;

private: System::Windows::Forms::Label^ label10;

private: System::Windows::Forms::TextBox^ textBox4;

private: System::Windows::Forms::Label^ label9;

private: System::Windows::Forms::TextBox^ textBox3;

private: System::Windows::Forms::Label^ label8;

private: System::Windows::Forms::PictureBox^ pictureBox13;

private: System::Windows::Forms::Button^ button1;

private: System::ComponentModel::BackgroundWorker^ backgroundWorker1;

private: System::Windows::Forms::PictureBox^ pictureBox1;

private: System::Windows::Forms::PictureBox^ pictureBox2;

private: System::Windows::Forms::PictureBox^ pictureBox3;

private: System::Windows::Forms::Label^ label1;

private: System::Windows::Forms::Label^ label2;

private: System::Windows::Forms::TextBox^ textBox1;

private: System::Windows::Forms::Label^ label3;

private: System::Windows::Forms::PictureBox^ pictureBox4;

private: System::Windows::Forms::PictureBox^ pictureBox5;

private: System::Windows::Forms::PictureBox^ pictureBox6;

private: System::Windows::Forms::PictureBox^ pictureBox7;

private: System::Windows::Forms::PictureBox^ pictureBox8;

private: System::Windows::Forms::Label^ label4;

private: System::Windows::Forms::PictureBox^ pictureBox9;

private: System::Windows::Forms::PictureBox^ pictureBox10;

private: System::Windows::Forms::PictureBox^ pictureBox11;

private: System::Windows::Forms::PictureBox^ pictureBox12;

private: System::Windows::Forms::Label^ label5;

private: System::Windows::Forms::TextBox^ textBox2;

protected:

private:

/// <summary>

/// Обязательная переменная конструктора.

/// </summary>

System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code

/// <summary>

/// Требуемый метод для поддержки конструктора — не изменяйте

/// содержимое этого метода с помощью редактора кода.

/// </summary>

// метод инциализации компонентов

void InitializeComponent(void)

{

System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(MyForm::typeid));

this->button1 = (gcnew System::Windows::Forms::Button());

this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());

this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox3 = (gcnew System::Windows::Forms::PictureBox());

this->label1 = (gcnew System::Windows::Forms::Label());

this->label2 = (gcnew System::Windows::Forms::Label());

this->textBox1 = (gcnew System::Windows::Forms::TextBox());

this->label3 = (gcnew System::Windows::Forms::Label());

this->pictureBox4 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox5 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox6 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox7 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox8 = (gcnew System::Windows::Forms::PictureBox());

this->label4 = (gcnew System::Windows::Forms::Label());

this->pictureBox9 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox10 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox11 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox12 = (gcnew System::Windows::Forms::PictureBox());

this->label5 = (gcnew System::Windows::Forms::Label());

this->textBox2 = (gcnew System::Windows::Forms::TextBox());

this->pictureBox13 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox14 = (gcnew System::Windows::Forms::PictureBox());

this->pictureBox15 = (gcnew System::Windows::Forms::PictureBox());

this->label6 = (gcnew System::Windows::Forms::Label());

this->label7 = (gcnew System::Windows::Forms::Label());

this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());

this->textBox6 = (gcnew System::Windows::Forms::TextBox());

this->label11 = (gcnew System::Windows::Forms::Label());

this->textBox5 = (gcnew System::Windows::Forms::TextBox());

this->label10 = (gcnew System::Windows::Forms::Label());

this->textBox4 = (gcnew System::Windows::Forms::TextBox());

this->label9 = (gcnew System::Windows::Forms::Label());

this->textBox3 = (gcnew System::Windows::Forms::TextBox());

this->label8 = (gcnew System::Windows::Forms::Label());

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox2))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox3))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox4))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox5))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox6))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox7))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox8))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox9))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox10))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox11))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox12))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox13))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox14))->BeginInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox15))->BeginInit();

this->groupBox1->SuspendLayout();

this->SuspendLayout();

//

// button1

//

this->button1->Location = System::Drawing::Point(30, 121);

this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(75, 23);

this->button1->TabIndex = 0;

this->button1->Text = L"Запуск";

this->button1->UseVisualStyleBackColor = true;

this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);

//

// backgroundWorker1

//

this->backgroundWorker1->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &MyForm::backgroundWorker1_DoWork);

//

// pictureBox1

//

this->pictureBox1->BackColor = System::Drawing::Color::Transparent;

this->pictureBox1->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox1.Image")));

this->pictureBox1->InitialImage = nullptr;

this->pictureBox1->Location = System::Drawing::Point(247, 316);

this->pictureBox1->Name = L"pictureBox1";

this->pictureBox1->Size = System::Drawing::Size(38, 72);

this->pictureBox1->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox1->TabIndex = 1;

this->pictureBox1->TabStop = false;

//

// pictureBox2

//

this->pictureBox2->BackColor = System::Drawing::Color::Transparent;

this->pictureBox2->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox2.Image")));

this->pictureBox2->Location = System::Drawing::Point(208, 229);

this->pictureBox2->Name = L"pictureBox2";

this->pictureBox2->Size = System::Drawing::Size(118, 81);

this->pictureBox2->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox2->TabIndex = 2;

this->pictureBox2->TabStop = false;

//

// pictureBox3

//

this->pictureBox3->BackColor = System::Drawing::Color::Transparent;

this->pictureBox3->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox3.Image")));

this->pictureBox3->Location = System::Drawing::Point(235, 171);

this->pictureBox3->Name = L"pictureBox3";

this->pictureBox3->Size = System::Drawing::Size(75, 52);

this->pictureBox3->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox3->TabIndex = 3;

this->pictureBox3->TabStop = false;

//

// label1

//

this->label1->AutoSize = true;

this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,

static_cast<System::Byte>(204)));

this->label1->Location = System::Drawing::Point(260, 188);

this->label1->Name = L"label1";

this->label1->Size = System::Drawing::Size(57, 20);

this->label1->TabIndex = 4;

this->label1->Text = L"label1";

//

// label2

//

this->label2->AutoSize = true;

this->label2->Location = System::Drawing::Point(13, 16);

this->label2->Name = L"label2";

this->label2->Size = System::Drawing::Size(138, 13);

this->label2->TabIndex = 5;

this->label2->Text = L"Количество этажей в дом";

//

// textBox1

//

this->textBox1->Location = System::Drawing::Point(172, 13);

this->textBox1->Name = L"textBox1";

this->textBox1->Size = System::Drawing::Size(100, 20);

this->textBox1->TabIndex = 6;

//

// label3

//

this->label3->AutoSize = true;

this->label3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,

static_cast<System::Byte>(204)));

this->label3->Location = System::Drawing::Point(52, 188);

this->label3->Name = L"label3";

this->label3->Size = System::Drawing::Size(57, 20);

this->label3->TabIndex = 8;

this->label3->Text = L"label3";

//

// pictureBox4

//

this->pictureBox4->BackColor = System::Drawing::Color::Transparent;

this->pictureBox4->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox4.Image")));

this->pictureBox4->Location = System::Drawing::Point(30, 171);

this->pictureBox4->Name = L"pictureBox4";

this->pictureBox4->Size = System::Drawing::Size(75, 52);

this->pictureBox4->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox4->TabIndex = 7;

this->pictureBox4->TabStop = false;

//

// pictureBox5

//

this->pictureBox5->BackColor = System::Drawing::Color::Transparent;

this->pictureBox5->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox5.Image")));

this->pictureBox5->Location = System::Drawing::Point(30, 238);

this->pictureBox5->Name = L"pictureBox5";

this->pictureBox5->Size = System::Drawing::Size(80, 50);

this->pictureBox5->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox5->TabIndex = 9;

this->pictureBox5->TabStop = false;

//

// pictureBox6

//

this->pictureBox6->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox6.Image")));

this->pictureBox6->Location = System::Drawing::Point(30, 238);

this->pictureBox6->Margin = System::Windows::Forms::Padding(0);

this->pictureBox6->Name = L"pictureBox6";

this->pictureBox6->Size = System::Drawing::Size(80, 50);

this->pictureBox6->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox6->TabIndex = 10;

this->pictureBox6->TabStop = false;

//

// pictureBox7

//

this->pictureBox7->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox7.Image")));

this->pictureBox7->Location = System::Drawing::Point(402, 238);

this->pictureBox7->Name = L"pictureBox7";

this->pictureBox7->Size = System::Drawing::Size(79, 50);

this->pictureBox7->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox7->TabIndex = 11;

this->pictureBox7->TabStop = false;

//

// pictureBox8

//

this->pictureBox8->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox8.Image")));

this->pictureBox8->Location = System::Drawing::Point(402, 238);

this->pictureBox8->Name = L"pictureBox8";

this->pictureBox8->Size = System::Drawing::Size(79, 50);

this->pictureBox8->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox8->TabIndex = 12;

this->pictureBox8->TabStop = false;

//

// label4

//

this->label4->AutoSize = true;

this->label4->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,

static_cast<System::Byte>(204)));

this->label4->Location = System::Drawing::Point(430, 251);

this->label4->Name = L"label4";

this->label4->Size = System::Drawing::Size(57, 20);

this->label4->TabIndex = 13;

this->label4->Text = L"label4";

//

// pictureBox9

//

this->pictureBox9->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox9.Image")));

this->pictureBox9->Location = System::Drawing::Point(208, 229);

this->pictureBox9->Name = L"pictureBox9";

this->pictureBox9->Size = System::Drawing::Size(59, 81);

this->pictureBox9->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage;

this->pictureBox9->TabIndex = 14;

this->pictureBox9->TabStop = false;

//

// pictureBox10

//

this->pictureBox10->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox10.Image")));

this->pictureBox10->Location = System::Drawing::Point(21, 229);

this->pictureBox10->Name = L"pictureBox10";

this->pictureBox10->Size = System::Drawing::Size(100, 67);

this->pictureBox10->TabIndex = 15;

this->pictureBox10->TabStop = false;

//

// pictureBox11

//

this->pictureBox11->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox11.Image")));

this->pictureBox11->Location = System::Drawing::Point(316, 173);

this->pictureBox11->Name = L"pictureBox11";

this->pictureBox11->Size = System::Drawing::Size(32, 50);

this->pictureBox11->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox11->TabIndex = 16;

this->pictureBox11->TabStop = false;

//

// pictureBox12

//

this->pictureBox12->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox12.Image")));

this->pictureBox12->Location = System::Drawing::Point(197, 173);

this->pictureBox12->Name = L"pictureBox12";

this->pictureBox12->Size = System::Drawing::Size(32, 50);

this->pictureBox12->SizeMode = System::Windows::Forms::PictureBoxSizeMode::Zoom;

this->pictureBox12->TabIndex = 17;

this->pictureBox12->TabStop = false;

//

// label5

//

this->label5->AutoSize = true;

this->label5->Location = System::Drawing::Point(12, 42);

this->label5->Name = L"label5";

this->label5->Size = System::Drawing::Size(131, 13);

this->label5->TabIndex = 18;

this->label5->Text = L"Количество пассажиров";

//

// textBox2

//

this->textBox2->Location = System::Drawing::Point(172, 39);

this->textBox2->Name = L"textBox2";

this->textBox2->Size = System::Drawing::Size(100, 20);

this->textBox2->TabIndex = 19;

//

// pictureBox13

//

this->pictureBox13->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox13.Image")));

this->pictureBox13->Location = System::Drawing::Point(267, 229);

this->pictureBox13->Name = L"pictureBox13";

this->pictureBox13->Size = System::Drawing::Size(59, 81);

this->pictureBox13->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage;

this->pictureBox13->TabIndex = 20;

this->pictureBox13->TabStop = false;

//

// pictureBox14

//

this->pictureBox14->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox14.Image")));

this->pictureBox14->Location = System::Drawing::Point(327, 229);

this->pictureBox14->Name = L"pictureBox14";

this->pictureBox14->Size = System::Drawing::Size(64, 81);

this->pictureBox14->TabIndex = 21;

this->pictureBox14->TabStop = false;

//

// pictureBox15

//

this->pictureBox15->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"pictureBox15.Image")));

this->pictureBox15->Location = System::Drawing::Point(143, 229);

this->pictureBox15->Name = L"pictureBox15";

this->pictureBox15->Size = System::Drawing::Size(64, 81);

this->pictureBox15->TabIndex = 22;

this->pictureBox15->TabStop = false;

//

// label6

//

this->label6->AutoSize = true;

this->label6->Location = System::Drawing::Point(12, 65);

this->label6->Name = L"label6";

this->label6->Size = System::Drawing::Size(47, 13);

this->label6->TabIndex = 23;

this->label6->Text = L"Прошло";

//

// label7

//

this->label7->AutoSize = true;

this->label7->Location = System::Drawing::Point(172, 65);

this->label7->Name = L"label7";

this->label7->Size = System::Drawing::Size(35, 13);

this->label7->TabIndex = 24;

this->label7->Text = L"label7";

//

// groupBox1

//

this->groupBox1->Controls->Add(this->textBox6);

this->groupBox1->Controls->Add(this->label11);

this->groupBox1->Controls->Add(this->textBox5);

this->groupBox1->Controls->Add(this->label10);

this->groupBox1->Controls->Add(this->textBox4);

this->groupBox1->Controls->Add(this->label9);

this->groupBox1->Controls->Add(this->textBox3);

this->groupBox1->Controls->Add(this->label8);

this->groupBox1->Location = System::Drawing::Point(278, 12);

this->groupBox1->Name = L"groupBox1";

this->groupBox1->Size = System::Drawing::Size(280, 132);

this->groupBox1->TabIndex = 25;

this->groupBox1->TabStop = false;

this->groupBox1->Text = L"Время";

//

// textBox6

//

this->textBox6->Location = System::Drawing::Point(174, 105);

this->textBox6->Name = L"textBox6";

this->textBox6->Size = System::Drawing::Size(100, 20);

this->textBox6->TabIndex = 27;

//

// label11

//

this->label11->AutoSize = true;

this->label11->Location = System::Drawing::Point(6, 108);

this->label11->Name = L"label11";

this->label11->Size = System::Drawing::Size(77, 13);

this->label11->TabIndex = 26;

this->label11->Text = L"Работа лифта";

//

// textBox5

//

this->textBox5->Location = System::Drawing::Point(174, 79);

this->textBox5->Name = L"textBox5";

this->textBox5->Size = System::Drawing::Size(100, 20);

this->textBox5->TabIndex = 25;

//

// label10

//

this->label10->AutoSize = true;

this->label10->Location = System::Drawing::Point(6, 82);

this->label10->Name = L"label10";

this->label10->Size = System::Drawing::Size(156, 13);

this->label10->TabIndex = 24;

this->label10->Text = L"Открытие \\ закрытие дверей";

//

// textBox4

//

this->textBox4->Location = System::Drawing::Point(174, 53);

this->textBox4->Name = L"textBox4";

this->textBox4->Size = System::Drawing::Size(100, 20);

this->textBox4->TabIndex = 23;

//

// label9

//

this->label9->AutoSize = true;

this->label9->Location = System::Drawing::Point(6, 56);

this->label9->Name = L"label9";

this->label9->Size = System::Drawing::Size(102, 13);

this->label9->TabIndex = 22;

this->label9->Text = L"Вкл \\ выкл кнопок";

//

// textBox3

//

this->textBox3->Location = System::Drawing::Point(174, 27);

this->textBox3->Name = L"textBox3";

this->textBox3->Size = System::Drawing::Size(100, 20);

this->textBox3->TabIndex = 21;

//

// label8

//

this->label8->AutoSize = true;

this->label8->Location = System::Drawing::Point(6, 30);

this->label8->Name = L"label8";

this->label8->Size = System::Drawing::Size(132, 13);

this->label8->TabIndex = 20;

this->label8->Text = L"Вход \\ выход пассажира";

//

// MyForm

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(570, 391);

this->Controls->Add(this->groupBox1);

this->Controls->Add(this->label7);

this->Controls->Add(this->label6);

this->Controls->Add(this->pictureBox15);

this->Controls->Add(this->pictureBox14);

this->Controls->Add(this->pictureBox13);

this->Controls->Add(this->textBox2);

this->Controls->Add(this->label5);

this->Controls->Add(this->pictureBox12);

this->Controls->Add(this->pictureBox11);

this->Controls->Add(this->pictureBox9);

this->Controls->Add(this->label4);

this->Controls->Add(this->pictureBox5);

this->Controls->Add(this->label3);

this->Controls->Add(this->pictureBox4);

this->Controls->Add(this->textBox1);

this->Controls->Add(this->label2);

this->Controls->Add(this->label1);

this->Controls->Add(this->pictureBox3);

this->Controls->Add(this->pictureBox1);

this->Controls->Add(this->pictureBox2);

this->Controls->Add(this->button1);

this->Controls->Add(this->pictureBox6);

this->Controls->Add(this->pictureBox7);

this->Controls->Add(this->pictureBox8);

this->Controls->Add(this->pictureBox10);

this->ForeColor = System::Drawing::SystemColors::ControlText;

this->Name = L"MyForm";

this->Text = L"Lift";

this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox2))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox3))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox4))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox5))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox6))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox7))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox8))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox9))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox10))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox11))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox12))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox13))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox14))->EndInit();

(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox15))->EndInit();

this->groupBox1->ResumeLayout(false);

this->groupBox1->PerformLayout();

this->ResumeLayout(false);

this->PerformLayout();

}

#pragma endregion

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

public: delegate void dSumPassenger(int);

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

public: void SumPassenger(int k)

{

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

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

}

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

public: delegate void dPassengerAction(int);

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

public: void PassengerAction(int k)

{

// Функция для передвижения пассажира по форме

int i; // переменная для движения пассажира

if (k < 0) { //если параметр больше 0, то переменная отрицательная

i = -1;

}

else { i = 1; }//иначе переменная положительная

pictureBox1->Location = Point(pictureBox1->Location.X, pictureBox1->Location.Y + i);// передвижение фигуры на форме

}

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

public: delegate void dButtonLift(int,bool);

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

public: void ButtounLift(int needFloor, bool status)

{

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

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

if (status) {// если переменная True

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

label4->Text = Convert::ToString(needFloor); // Конвертирование число в строку

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

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

// проверка на число ввод времени на вкл/выкл кнопок

if (Int32::TryParse(str, number)) {

ButtonTime= number;

}

str = textBox5->Text;// считывание время на открытие/закрытие дверей

// проверка на число ввод времени на открытие/закрытие дверей

if (Int32::TryParse(str, number)) {

DoorTime = number;

}

str = textBox6->Text;// считывание время на работу лифта

// проверка на число ввод времени на работу лифта

if (Int32::TryParse(str, number)) {

LiftTime = number;

}

//запуск функции работы лифта в отдельном потоке

backgroundWorker1->RunWorkerAsync(1);

}

private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {

//чистка значений на форме

label1->Text = "";

label3->Text = "";

label4->Text = "";

label7->Text = "";

pictureBox11 -> Visible = false;

pictureBox12->Visible = false;

pictureBox5->BackColor = Color::Transparent;

pictureBox6->BackColor = Color::Transparent;

}

};

}