Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. Имитация работы оптовог

Автор: Пользователь скрыл имя, 13 Октября 2011 в 17:18, курсовая работа

Описание работы

Объектом разработки является система имитационного моделирования «работы оптового магазина».
Целью курсового проектирования является разработка программного продукта – системы имитационного моделирования.
Программный продукт может применяться любом оптовом магазине

Содержание

Введение 6
1 Поставновка задачи 7
1.1 Описание предметной области 7
1.2 Цели и задачи курсового проектирования 8
2 Выбор метода решения 9
2.1 Описание ОО подхода 9
3 Метод решения 10
3.1 Объектно-ориентированный анализ 10
3.2 Объектно-ориентированное проектирование 15
3.2.1 Диаграмма классов 15
3.2.2 Диаграмма объектов 17
3.2.3 Диаграмма состояний и переходов 19
3.2.4 Диаграмма взаимодействия 20
3.3 Объектно-ориентированное программирование 22
3.3.1 Диаграмма процессов 22
Выводы 23
Перечень ссылок 24
Приложение А. Техническое задание 25
Приложение Б. Руководство пользователя 29
Приложение В. Экранные формы 30
Приложение Г. Листинг программы 31

Работа содержит 1 файл

Курсовой проект ООП.docx

— 532.62 Кб (Скачать)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ  УКРАИНЫ 

Государственный университет информатики и искусственного интеллекта 
 

     Д050103.1.01.10/059.КП                            

 

Кафедра программного обеспечения

интеллектуальных  систем 
 
 
 

Курсовой  проект 

по дисциплине: «Объектно-ориентированное программирование»

Тема: «Имитационное моделирование динамических систем и процессов с                                                  использованием объектно-ориентированного подхода.

Имитация  работы оптового магазина»

 
 
 
 
 
 
 

              Руководители:

              ____________ ст.пр. С.П. Некрашевич

                   (дата, подпись)

              ____________ асс. О.О. Савельев   

                   (дата, подпись)

              ____________ асс. Е.В. Курило

                   (дата, подпись)

              Разработал:

              ____________ ст.гр. ПО-10В

                   (дата, подпись)        М.А. Боковой

  
 
 
 
 

Донецк  – 2011 

МИНИСТЕРСТВО  ОБРАЗОВАНИЯ И  НАУКИ УКРАИНЫ 

Государственный университет информатики и искусственного интеллекта 

Факультет:          Современных компьютерных информационных технологий

Специальность: Программное обеспечение автоматизированных систем

Кафедра:              Программного обеспечения интеллектуальных систем 

ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТ

      по  дисциплине: «Объектно-ориентированное программирование» 

Студенту               Боковому Максиму Андреевичу               группы        ПО-10В     

      (фамилия,  имя, отчество)

  Тема проекта  Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. «Имитация работы оптового магазина»                                                                                                           _

  Исходные данные к проекту  Основные положения ОО методологии разработки ПО, проведения этапов ОО анализа, ОО проектирования, ОО программирования. Описание предметной области.                                                                                        _

  Перечень  искомых результатов  Словарь ПрО. ОО словарь ПрО. Диаграммы классов, объектов, состояний и переходов, взаимодействия, модулей, процессов. Протоколы классов. Результаты моделирования: загрузка клерков, время обслуживания одного клиента, число удовлетворенных заявок.                                 _

  Рекомендуемая литература 1. Шлеер С. Объектно-ориентированный анализ: моделирование мира в состояниях / Шлеер С., Меллор С. – К.: Диалектика, 1993. – 240 с. 2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++ / Гради Буч. – М.: Невский проспект, 2000. – 2-е изд. – 359 с. 3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений / Гради Буч, Роберт А. Максимчук, Майкл У. Энгл, Бобби Дж. Янг, Джим Коналлен, Келли А. Хьюстон. – М.: Вильямс, 2008. – 3-е изд. – 720 с. 4. Страуструп Б. Язык программирования C++. Специальное издание / Бьерн Страуструп. – М.: Бином, 2008. – 3-е изд. – 1054 с.                                                       _ 

Дата выдачи задания 17.02.2011

     

Дата защиты проекта 08.06.2011

     

Руководители                                      ст.пр. С.П. Некрашевич

      (подпись) (должность, Ф.И.О.)                                        

                 асс. О.О. Савельев    

      (подпись) (должность, Ф.И.О.)                                  

             асс. Е.В. Курило       

      (подпись) (должность, Ф.И.О.)

Разработчик                                             М.А. Боковой         

      (подпись) (Ф.И.О.)

РЕФЕРАТ

     Пояснительная записка: 37 с., 9 рис., 6 табл., 5 источников, 4 прил.

     Объектом  разработки является система имитационного  моделирования «работы оптового магазина».

     Целью курсового проектирования является разработка программного продукта –  системы имитационного моделирования.

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

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Имитационное моделирование, ОО анализ, ОО проектирование, ОО программирование, диаграммы, Booch, UML

          Д050103.1.01.10/059.КП
         
    Фамилия Подпись Дата
Разработал М.А. Боковой      Имитация  работы оптового магазина Литера Лист Листов
Рук. проекта С.П. Некрашевич       у   3 37
  О.О. Савельев     ГУИ и ИИ, каф. ПОИС

группа  ПО-10В

  Е.В. Курило    
Н.контроль О.О. Савельев    
  Е.В. Курило    
Зав. каф. А.И. Шевченко    
 
 
 
 
СОДЕРЖАНИЕ

Введение 6

1 Поставновка задачи 7

1.1 Описание предметной области 7

1.2 Цели и задачи курсового проектирования 8

2 Выбор метода решения 9

2.1 Описание ОО подхода 9

3 Метод решения 10

3.1 Объектно-ориентированный анализ 10

3.2  Объектно-ориентированное проектирование 15

3.2.1 Диаграмма классов 15

3.2.2 Диаграмма объектов 17

3.2.3 Диаграмма состояний и переходов 19

3.2.4 Диаграмма взаимодействия 20

3.3  Объектно-ориентированное программирование 22

3.3.1 Диаграмма процессов 22

Выводы 23

Перечень ссылок 24

Приложение А. Техническое задание 25

Приложение Б. Руководство пользователя 29

Приложение В. Экранные формы 30

Приложение Г. Листинг программы 31

Разработал Фамилия Подпись Дата Д050103.1.01.10/059.КП Лист
ст.гр. ПО-10В М.А. Боковой     4
       
 
 
 
 
Перечень  обозначений, символов, единиц,  
сокращений и терминов
ООП Объектно-ориентированное  программирование
ОО Объектно-ориентированный
ООА Объектно-ориентированный  анализ
CRC Class-Responsibilities-Collaborators
UML Unified Modeling Language
ПП Программный продукт
ПО Программное обеспечение
ПрО Предметная  область
     
     
     
     
     
     
 
 
Разработал Фамилия Подпись Дата Д050103.1.01.10/059.КП Лист
ст.гр. ПО-10В М.А. Боковой     5
       
 

ВВЕДЕНИЕ 

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

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

      В ходе развития объектно-ориентированного программирования, получили второе рождение и другие направления, такие как имитационное моделирование.

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

  1. ПОСТАНОВКА  ЗАДАЧИ
 
    1.   Описание  предметной области.

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

     Это  время  нормально  распределено  с  математическим  ожиданием, равным утроенному числу искомых наименований, и среднеквадратичным отклонением,  равным  0.2  математического  ожидания.  Следовательно, если, например, со склада надо взять товар одного наименования, время на его поиск будет нормально  распределено с математическим ожиданием, равным 3 минуты и среднеквадратичным отклонением, равным 0.6 минут. Время  возвращения со склада равномерно распределено на интервале от 0.5 до 1.5 минут. По возвращении  со склада клерк рассчитывается со всеми клиентами, которых он обслуживает. Время расчета с клиентом равномерно распределено на интервале от 1 до 3 минут. Расчет производится в том порядке, в каком к клерку поступали заявки на товар. Интервалы между моментами поступления заявок на товары от клиентов экспоненциально распределены с математическим ожиданием, равным 2 минуты. Клиентов в магазине обслуживают три клерка. 

  

  

    

  

  

  

  

    
 

  

  Обозначения:            - i-ый клерк, i=1, 2, 3;         -клиенты, обслуживаемые i-ым клерком или ожидающие начала обслуживания клерком. 

  Рисунок 1.1 – Схема обслуживания клиентов клерком.

    1. Цели и задачи курсового проектирования.

Цели  курсового проектирования:

    – систематизировать, закрепить и расширить теоретические  знания по изучаемой дисциплине;

    –  закрепить  и развить навыки самостоятельного решения задач в области объектно-ориентированного анализа, проектирования и программирования;

    – закрепить  и развить навыки выбора средств  проектирования, программирования и  вычислительных средств для эффективной  реализации программных продуктов  с применением объектно-ориентированного подхода;

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

  Основная  задача курсового проектирования –  подготовка студентов к самостоятельной  практической инженерной деятельности в области создания программных  продуктов с применением объектно-ориентированного подхода на основе знаний, полученных в процессе обучения в ВУЗе.

  Курсовой  проект является самостоятельной работой  студента. За все принятые в курсовом проекте технические решения  и правильность всех данных несет  ответственность студент – автор  курсового проекта. 

Цель  моделирования - определить следующее:  

– загрузка клерков;

    – время, необходимое на обслуживание одного клиента с момента подачи заявки на товар до оплаты счета за покупку;

– число заявок, удовлетворяемых клерком за один выход на склад. 
 

 

  1. ВЫБОР МЕТОДА РЕШЕНИЯ.

  В данном разделе кратко приводятся основные теоретические положения  объектно-ориентированного подхода разработки программных  продуктов (класс, объект, инкапсуляция, наследование, полиморфизм).

      1. Теоретические данные.
 

  В этой главе приведены основные понятия  и определения:

  Класс — разновидность абстрактного типа данных в объектно-ориентированном программировании, характеризуемый способом своего построения. Наряду с понятием «объекта» класс является ключевым понятием в ООП (хотя существуют и бесклассовые объектно-ориентированные языки, например, JavaScript). Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен.  

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

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

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

  Полиморфизм  — возможность объектов с одинаковой спецификацией иметь различную реализацию. 
 
 
 
 
 

  1. МЕТОД РЕШЕНИЯ
 
    1.  Объектно-ориентированный  анализ

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

      1. Выделение субъектов
 

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

     После анализа задания были выделены такие  компоненты:

Активные  субъекты:

Клерк

Клиент

Пассивные объекты:

Товар

Очередь

 
      1. Сценарии  использования
 

      Сценарий  использования, описывающий процесс  получения клиентом товара, представлен  в таблице 3.1.1.

    Таблица 3.1.1 – Получение клиентом товара

Критерий Описание
Имя сценария Получение клиентом товара.
Имя субъекта Клиент
Предусловие Клиент выбрал очередь к клерку.
Постусловие Клиент получил  товар.
Режим
  1. Клиент становится в очередь;
  2. Ждет очереди на обслуживание;
  3. Заказывает товар;
  4. Ожидает товар;
  5. Оплачивает покупку;
 

      Сценарий  использования, описывающий формирование клиентом заявки, отображен в таблице 3.1.2.

      Таблица 3.1.2 – Формирование заявки

Критерий Описание
Имя сценария Формирование  заявки.
Имя субъекта Клиент
Предусловие Клиент приходит в оптовый магазин.
Критерий Описание
Постусловие Клиент выбирает очередь.
Режим
  1. Становится в очередь;
  2. Получает каталог;
  3. Формирует заказ;
 

      Сценарий  использования, отображающий процесс  обслуживания клерком клиента, описан в таблице 3.1.3.

      Таблица 3.1.3 – Обслуживание клиента

Критерий Описание
Имя сценария Обслуживание  клиента.
Имя субъекта Клерк
Предусловие Клерк свободен и очередь не пуста, а также  кол-во заявок в очереди не более 6.
Постусловие Товар выдан.
Режим
  1. Получает не более 6 заказов;
  2. Отправляется на склад за товаром;
  3. Рассчитывается с клиентами;
 

      Сценарий  использования, отображающий действия клиента после получения заявок, описан в таблице 3.1.4.

      Таблица 3.1.4. – Клерк отправляется за товаром

Критерий Описание
Имя сценария Клерк отправляется за товаром.
Имя субъекта Клерк
Предусловие Клерк получил  заявки.
Постусловие Клерк готов  рассчитаться с клиентами.
Режим
  1. Идет на склад;
  2. Ищет товар;
  3. Возвращается со склада;
 
      1. Описание  выделенных классов
 

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

     Поведение клерка в системе будет моделировать класс CClerk.

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

     Класс Clerk.

  1. Свойства:

         а) состояние;

         б) ссылка на очередь.

     2. Методы:

         а) конструктор;

         б) возврат состояния.

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

    Класс Client.

  1. Свойства:

         а) состояние;

      б) ссылка на очередь;

         в) ссылка на заявку.

     2. Методы

         а)конструктор;

         б) возврат состояния.

     Поведение очереди в системе будет моделировать класс CCQueue. Данный класс будет хранить  список всех клиентов, относящихся  к данной очереди, а также будет  иметь методы, возвращающие размер очереди,       добавляющие клиентов и удаляющие их.

     Класс Queue.

  1. Свойства:

         а) список клиентов.

     2. Методы:

         а) конструктор;

         б) возврат размера очереди;

         в) добавление нового клиента;

         г) удаление клиента.

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

     Класс Goods.

  1. Свойства:

         а) количество наименований товара.

     2. Методы:

         а) конструктор.

     Общее поведение системы, а также управление всеми классами будет совершать  класс CMarket. Он будет хранить массив ссылок на се очереди, массив ссылок на всех клерков. Кроме этого в данном классе будет храниться глобальное время моделирования системы.

     Класс Reactor.

  1. Свойства:

         а) массив ссылок на очереди;

         б) массив ссылок на клерков;

         в) глобальное время системы.

     2.  Методы:

         а) конструктор. 
     
     

     Следующим этапом разработки объектно-ориентированного программного продукта является построение диаграмм вариантов использования. 

     Диаграммы вариантов использования (Use-Case Diagrams) являются действенным методом анализа, относящимся к методологии UML. Варианты использования – это описание последовательности действий, которые может осуществить система в ответ на внешние воздействия. 

      Диаграммы вариантов использования объектов показаны на рисунках 3.1.1 и 3.1.2.

      

Рисунок 3.1.1 – Диаграмма вариантов использования для экземпляра класса CMarket 
 
 
 
 
 
 
 
 
 
 
 

Рисунок 3.1.2 – Диаграмма вариантов использования для экземпляра класса Clerk

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

    1. Объектно-ориентированное проектирование

     Результатами  объектно-ориентированного проектирования являются диаграммы, выполненные в  нотациях Booch или UML. В нотации Booch к фазе проектирования относятся – диаграммы классов, объектов, состояний и переходов, взаимодействия; а в нотации UML – диаграммы классов, последовательностей, кооперации, состояний, деятельности.

      1. Диаграмма классов
 
 
 
 
 
 
 

 
 
 

Рисунок 3.2.1 – Диаграмма классов

      Диаграмма классов описывает отношения  между объектами программы. На данной диаграмме использованы два вида отношений: ассоциация и агрегация. В основе расположен класс CMarket. У него в свойствах, как было оговорено раннее, есть все объекты, участвующие в программе, которые он имеет право создавать и удалять. Такому виду отношений (отношение часть-целое) соответствует агрегация. На схеме она показана линией с ромбиком возле главного класса. В свою очередь объекты классов, для своего функционирования, нуждаются в данных объектов других классов. Среди свойств они имеют указатели на соответствующие объекты. А на диаграмме это отражено отношением ассоциации (линией с кратностью возле каждого из классов).

      Диаграмма  классов изображена на рисунке 3.2.1.

      Некоторые свойства классов описаны в таблице 3.2.1

      Таблица 3.2.1 – Классы и их свойства

Переменная Описание
Класс CMarket
m_Clerk[3] Ссылки на всех клерков в магазине
m_ClerkQueue[3] Ссылки на очереди  к клеркам
m_CatalogueQueue Ссылка на первичную  очередь
m_GlobalTime Глобальное  время системы
m_TimeToNewClient Время до создания нового клиента
m_TimeToNewBid Время до подачи новой заявки
Класс CGoods
m_Num Кол-во наименований товаров
Класс CClerk
m_OwnNumber Личный номер  каждого клерка
m_State Текущее состояние  клерка
m_TimeToStateChange Время до изменения  состояния клерком
Переменная Описание
m_NumOfServicingClients Кол-во клиентов, обслуживаемых клерком
m_Queue Ссылка на очередь, которую обслуживает данный клерк
Класс CQueue
m_Queue Список всех клиентов данной очереди, в порядке  их добавления
m_OwnNumber Личный номер  каждой очереди
Класс CClient
m_State Текущее состояние  клиента
m_Queue Ссылка на очередь, в которой находится клиент
 

      Некоторые методы классов  описаны в таблице 3.2.2

      Таблица 3.2.2 – Классы и их методы

Метод Описание
Класс CClient
StateChange() Изменение состояния  клиента, который находится в  очереди к клерку
StateChange(CQueue *Queue) Изменение состояния  клиента, который находится в  первичной очереди (помещение его  в очередь, на которую указывает  Queue)
Класс CClerk
StateChange() Изменение текущего состояния клерка
Класс CQueue
int Size() Возвращает  значение длины очереди
Push(CClient *Client ) Добавление  в очередь нового клиента
CClient* Pop() Извлекает первого  клиента из очереди и возвращает указатель на него системе
Класс CMarket
Work() Обеспечивает  логику работы и управление системой
 
 
      1. Диаграмма объектов
 

      Диаграмма объектов отображает значения системы  в какой-то момент времени (в данном случае – 11ч, 5мин) и взаимосвязи  между конкретными объектами  системы. Объекты отображаются двумя  прямоугольниками. В верхнем написано имя, в нижнем – свойства объекта  и их значения.

      Объект  Market владеет всеми остальными объектами. Также на диаграмме изображены 3 очереди к клеркам (Queue) и одна очередь за каталогами (CatalogueQueue). Каждая очередь связана с клиентами (Cient), которых она содержит. Объекты, которые представляют собой заявки (Goods), сформированные клиентами, связаны только с клиентами. 

      Диаграмма объектов изображена на рисунке 3.2.2. 

      Рисунок 3.2.2. – Диаграмма  объектов
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

      1. Диаграмма состояний и переходов

      Диаграммы состояний для классов  CClerk и CClient показаны на рисунках 3.2.3.1 и 3.2.3.2 соответственно. 
 
 
 
 
 
 
 
 
 
 

Рисунок 3.2.3.1 – Диаграмма состояний  для класса Clerk 
 
 
 
 
 
 
 
 

Рисунок 3.2.3.2 – Диаграмма состояний для  класса Client 

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

     В данном случае такими  объектами  являются клерк и клиент.

     После создания клерк переходит в состояние  ожидания заявок         (isWaiting). Когда система сообщает клерку, что в очереди появились клиенты, клерк забирает заявки и переходит в состояние isGoingToWarehouse,    которое означает, что клерк идет на склад. Следующее состояние                    (isSearchingGoods) наступает, когда клерк пришел на склад. Из названия понятно, что это состояние отображает поиск товаров клерком. Когда товары найдены клерк возвращается со склада (isGoingFromWarehouse).                   По возвращении клерк рассчитывается со всеми обслуженными клиентами (соответственно состояние – IsSettlingUp). После чего вновь переходит в состояние isWaiting.

     Клиент  после создания имеет состояние  isMakingBid. И сохраняет его до тех пор, пока не перейдет в очередь на обслуживание клерком. Тогда состояние клиента меняется на isWaitingForServicing. В данном состоянии клиент находится, пока не подаст заявку клерку. Когда клерк пошел на склад за товаром, который заказывал данный клиент, то состояние клиента -            isWaitingForGoods. Во время расчета с клерком клиент принимает состояние isSettlingUp. 
 

      1. Диаграмма Взаимодействия

     Диаграмма взаимодействия показывает взаимодействие объектов на протяжении работы программы. В самой верхней части находится  независимый актант и действующие  объекты программы (по одному экземпляру из каждого класса). От них вниз идут так называемые «линии жизни» объектов (линии, обозначающие, что в данный момент объект существует). Прямоугольники обозначают, что объект в данное время выполняет действия. Стрелки  обозначают запрос или сигнал, посылаемый от одного объекта к другому (сплошные) и ответ на запрос (пунктирные).

     Объект  класса CMarket создает все остальные действующие объекты программы. Сначала он создает объекты Clerk, потом объекты Queue. После того, как наступит время создания нового клиента, произойдет данное действие. Новый клиент сначала добавляется в очередь (CatalogueQueue) , в которой клиенты работают с каталогом. Когда наступает время подачи новой заявки, первый в этой очереди клиент переходит в самую короткую очередь (ClerkQueue), которая обслуживается одним из клерков. Тут же создается экземпляр класса CGoods.  Далее клерк забирает максимально возможное число заявок (не более 6) и идет на склад. Потом ищет необходимые товары, а потом возвращается со склада. После чего рассчитывается с клиентами. За этим следует удаление клиентов и заказов (CGoods), связанных с ними.

     Диаграмма взаимодействия показана на рисунке 3.2.4. 

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

Рисунок 3.2.4 – Диаграмма взаимодействия 

    1.  Объектно-ориентированное  программирование
 
      1. Диаграмма процессов

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

Рисунок3.3- Диаграмма процессов  
 

ВЫВОДЫ

 

      При выполнении курсового проекта для  достижения поставленной цели был проведен объектно-ориентированный анализ, в  результате которого выделены активные объекты, пассивные субъекты, варианты использования, а также следующие  классы предметной области: CClerk (клерк), CClient (клиент), CQueue (очередь), CGoods (заявка), а также главный класс CMarket. Для указанных классов определены атрибуты и операции.

      По  результатам анализа было проведено  объектно-ориентированное проектирование, результатом которого стали следующие  диаграммы:

  1. варианты использования;
  2. статическое представление;
  3. диаграмма взаимодействия;
  4. диаграмма состояний;
  5. диаграмма компонентов;
  6. описание полей классов;

    ж) диаграмма  объектов;

    з)  диаграмма  пакетов.

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

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

 

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

 
   
    1. Г. Шилдт. Самоучитель C++. 3-е издание. – Санкт-Петербург: 2005г., 680с.
    2. Бьярн Страуструп, «Язык программирования C++, специальное издание»
    3. Хант, Эндрю, Томас, Дэвид. Программист-прагматик. Путь от подмастерья к мастеру. М.: Издательство "Лори", 2004. - 270 с.
    4. Г.Саттер, А. Александреску. Стандарты программирования на C++.: Пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 224с.
    5. Г. Буч, Д. Рамбо, А. Джекобсон, Программирование: Язык UML. Руководство пользователя.

 

Приложение  А 

ТЕХНИЧЕСКОЕ ЗАДАНИЕ 

     А.1 Общие сведения 

     Тема  курсового проекта: «Имитационное  моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. Имитация работы оптового магазина».

     Система проектируется студентом 1-го курса  Государственного университета информатики  и искусственного интеллекта, факультета СКИТ, группы ПО-10В, Боковым Максимом Андреевичем.

     Основанием  для разработки ПП является задание, выданное кафедрой ПОИС. Плановый срок начала работы по созданию системы  имитационного моделирования: 17.02.11, срок окончания: __________. Курсовой проект должен выполняться согласно графику, приведенному в таблице А.1. 
 

     Таблица А.1 – Этапы, результаты и сроки  разработки ПП

Этап работы Результат работы Срок выполнения

(№ недели)

Модуль 1
1 Получение задания  на КП Задание на разработку (1 стр.) 1-2
2 Выявление требований к разрабатываемому программному продукту Техническое задание 

(3-5 стр.)

3-4
3 Проведение  ОО анализа предметной области Словарь предметной области. Сценарии использования системы. ОО словарь предметной области. 3-4
4 Проведение  ОО проектирования Диаграммы классов, объектов 5-6
5 Проведение  ОО проектирования Диаграммы состояний  и переходов, взаимодействия 7-8
6 Проведение  ОО проектирования Диаграммы модулей, процессов 10-11
7 Проектирование  протоколов классов Протоколы классов 12-13
8 Реализация  классов Описание реализации классов 12-13
 
 
 

Продолжение таблицы  А.1

Этап работы Результат работы Срок выполнения

(№ недели)

Модуль 2
9 Реализация  и отладка программы. Проведение тестирования ПП. Текст программы. Описание программы и тестов. 13-14
10 Проведение  имитационного моделирования, получение  статистики работы. Экранные формы (1-2 стр.). Руководство пользователя (1 стр.). 13-14
11 Оформление  пояснительной записки и сопроводительных материалов. Прошитая ПЗ с CD-ROM (30-50 стр.), сдается преподавателю лично не позже чем за 3 дня до защиты КП. 14
12 Защита курсового  проекта   15-17

     А.2 Назначения и цели создания программы

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

      А.3 Характеристика объекта автоматизации 

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

     Это  время  нормально  распределено  с  математическим  ожиданием, равным утроенному числу искомых наименований, и среднеквадратичным отклонением,  равным  0.2  математического  ожидания.  Следовательно, если, например, со склада надо взять товар одного наименования, время на его поиск будет нормально  распределено с математическим ожиданием, равным 3 минуты и среднеквадратичным отклонением, равным 0.6 минут. Время возвращения со склада равномерно распределено на интервале от 0.5 до 1.5 минут. По возвращении со склада клерк рассчитывается со всеми клиентами, которых он обслуживает. Время расчета с клиентом равномерно распределено на интервале от 1 до 3 минут. Расчет производится в том порядке, в каком к клерку поступали заявки на товар. Интервалы между моментами поступления заявок на товары от клиентов экспоненциально распределены с математическим ожиданием, равным 2 минуты. Клиентов в магазине обслуживают три клерка.

     А.4 Требования к программному продукту

     А.4.1 Требования к системе в целом

    В целом  к системе предъявляются следующие  требования:

    а) имитация работы  оптового магазина;

    б) возможность имитации поведения при различных значениях времени появления нового клиента и подачи заявки;

    в) вывод статистики: загрузку клерков, время обслуживания одного клиента, число заявок, удовлетворяемых клерком за один выход на склад.

    А.4.2 Требования к задачам и функциям программного продукта

     В процессе работы необходимо обеспечить выполнение следующих функций:

    1. ввод начальных параметров для моделирования;
    2. вывод  характеристик  объектов  на  каждом  шаге моделирования на экран;
    3. вывод результатов моделирования на экран и в файл.

     А.4.3 Требования к техническому обеспечению

     К техническому обеспечению предъявляются  следующие требования:

    1. процессор – 32-битный x86-совместимый (уровня Pentium и выше);
    2. объем оперативной памяти – не менее 32Мб;
    3. свободное дисковое пространство – около 10 Мб. Не менее 5 Мб свободного дискового пространства для временных файлов;
    4. графический адаптер – VGA-совместимый;
    5. монитор – VGA-совместимый;
    6. клавиатура.

     А.4.4 Требования к программному обеспечению

     Для стабильной работы к программному обеспечению  предъявляется следующее требования:

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

           Программным обеспечением для проектирования программы является CASE-средство CS Odessa Concept Draw, а для разработки – Microsoft Visual Studio 2010. Для запуска программы необходимо наличие операционной системы Windows 7, и соответствующих библиотек Microsoft Visual C++ Redistributable.

     А.4.5 Требования к организационному обеспечению

     В программную документацию должны входить:

    1. пояснительная записка;
    2. приложения:
    • техническое задание;
    • руководство пользователя;
    • экранные формы;
    • листинг программы.

     А.4.6 Требования к комплекту поставки ПП

     Программный продукт поставляется с пояснительной  запиской к курсовому проекту  в файле ПЗ.doc, руководством пользователя в файле Help.doc, исходными кодами в виде проекта среды разработки в папке SRC, исполнительным файлом программы start.exe и файлом с данными о разработчике readme.txt. 
 
 
 
 
 
 
 
 
 
 

Приложение  Б

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

 

      Интерфейс программного продукта оформлен на английском языке.

      После запуска программы вы увидите  окно, в котором вам необходимо последовательно ответить на пять запросов:

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

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

      - ввести значение нижней границы  промежутка времени, в течении  которого происходит подача новой  заявки;

      - ввести значение верхней границы  промежутка времени, в течении  которого происходит подача новой  заявки;

      - ввести время, в течение которого  будет происходить моделирование  системы;

      Данные  значения измеряются в минутах. Позволяется  вводить дробные значения – они  будут преобразованы в целое  с округлением.

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

      В результате вы увидите всю необходимую  статистическую информацию. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Приложение  В 
 
ЭКРАННЫЕ ФОРМЫ

        
 
 
 
 
 
 
 
 
 

Рисунок В.1 – Статистические данные моделирования  системы

 

Приложение  Г 
 
ЛИСТИНГ ПРОГРАММЫ
 

Г.1. Файл “Total.h” 

#include <deque>

#include <iostream>

using namespace std;

class CGoods

{

public:

      int m_Num;

      CGoods(int Num);

};

class CClient;

class CQueue

{

public:

      deque <CClient*> m_Queue;

      int m_OwnNumber;

      CQueue(int OwnNumber, int *CurrTime);

      int GetNumOfGoods(int NumOfServicingClients);

      bool IsEmpty();

      int GetNumOfWaitingClients();

      int Size();

      void OnWaiting(int NumOfClients);

      void Push(CClient *Client);

      CClient* Pop(void);

      int *m_CurrTime;

};

class CClerk

{

public:

      enum ClerkState {IsWaiting, IsGoingToWarehouse, IsSearchingGoods, IsGoingFromWarehouse, IsSettlingUp };

      enum ClerkState m_State;

      int m_OwnNumber;

      int m_TimeToStateChange;

      int m_NumOfServicingClients;

      CQueue *m_Queue;

      CClerk(CQueue *Queue, int OwnNumber, int *CurrTime, int *Stat1, int *Stat2);

      void StateChange();

      int *m_CurrTime;

      int *m_Stat1;

      int *m_Stat2;

};

class CClient

{

public:

      enum ClientState {IsMakingBid, IsWaitingForServicing, IsWaitingForGoods, IsSettlingUp};

      enum ClientState m_State;

      CQueue *m_Queue;

      CGoods *m_Goods;

      CClient(CQueue *Queue, int *CurrTime, int *Stat, unsigned int *ServTime);

      void StateChange();

      void StateChange(CQueue *Queue);

      ~CClient(void);

      int GetServicingTime();

      int m_SSTime;

      int *m_CurrTime;

      int *m_Stat;

      unsigned int *m_ServTime;

};

class CMarket

{

public:

      CClerk *m_Clerk[3];

      CQueue *m_ClerkQueue[3];

      CQueue *m_CatalogueQueue;

      int m_GlobalTime;

      int m_TimeToNewClient;

      int m_TimeToNewBid;

      CMarket(float NewClient[2], float NewBid[2]);

      void Work(int MaxTime);

      int m_Workload[3];

      int m_NumOfServClients;

      unsigned int m_TotalServTime;

      int m_NumGOTWh;

      int m_TNBids;

      int m_NewClient[2];

      int m_NewBid[2];

      int m_NumOfClients;

}; 
 

Г.2. Файл “Clerk.cpp” 

#include "Total.h"

#include <iostream>

using namespace std; 

CClerk::CClerk(CQueue *Queue, int OwnNumber, int *CurrTime, int *Stat1, int *Stat2)

{

      m_Queue=Queue;

      m_OwnNumber=OwnNumber;

      m_State=IsWaiting;

      m_TimeToStateChange=-1;

      m_CurrTime=CurrTime;

      m_Stat1=Stat1;

      m_Stat2=Stat2; 

}

void CClerk::StateChange()

{

      if (m_State==IsWaiting&&!m_Queue->IsEmpty())

      {

            m_State=IsGoingToWarehouse;

            (*m_Stat1)++;

            m_TimeToStateChange=3+rand()%6;

            m_NumOfServicingClients=m_Queue->GetNumOfWaitingClients();

            if (m_NumOfServicingClients>6) m_NumOfServicingClients=6;

            m_Queue->OnWaiting(m_NumOfServicingClients);

            return;

      }

      if (!m_TimeToStateChange&&m_State==IsGoingToWarehouse)

      {

            m_State=IsSearchingGoods;

            m_TimeToStateChange=m_Queue->GetNumOfGoods(m_NumOfServicingClients)*(15+rand()%7);

            (*m_Stat2)+=m_NumOfServicingClients;

            return;

      }

      if (!m_TimeToStateChange&&m_State==IsSearchingGoods)

      {

            m_State=IsGoingFromWarehouse;

            m_TimeToStateChange=3+rand()%6;

            return;

      }

      if (!m_TimeToStateChange&&m_State==IsGoingFromWarehouse)

      {

            m_State=IsSettlingUp;

            m_TimeToStateChange=5+rand()%11;

            m_Queue->m_Queue.front()->StateChange();

            return;

      }

      if (!m_TimeToStateChange&&m_State==IsSettlingUp)

      {

            m_NumOfServicingClients--;

            CClient *Client=m_Queue->Pop();

            delete Client;

            if (!m_NumOfServicingClients)

            {

                  if (m_Queue->IsEmpty())

                  {

                        m_State=IsWaiting;

                        m_TimeToStateChange=-1;

                        return;

                  }

                  m_State=IsGoingToWarehouse;

                  (*m_Stat1)++;

                  m_TimeToStateChange=3+rand()%6;

                  m_NumOfServicingClients=m_Queue->GetNumOfWaitingClients();

                  if (m_NumOfServicingClients>6) m_NumOfServicingClients=6;

                  m_Queue->OnWaiting(m_NumOfServicingClients);

                  return;

            }

            m_TimeToStateChange=5+rand()%11;

            m_Queue->m_Queue.front()->StateChange();

      }

} 

Г.3. Файл “Client.cpp” 

#include "Total.h"

#include <iostream> 

CClient::CClient(CQueue *Queue, int *CurrTime, int *Stat, unsigned int *ServTime)

{

      m_Queue=Queue;

      m_State=IsMakingBid;

      m_CurrTime=CurrTime;

      m_Stat=Stat;

      m_ServTime=ServTime;

}

void CClient::StateChange()

{

      if (m_State==IsWaitingForServicing)

      {

            m_SSTime=*m_CurrTime;

            m_State=IsWaitingForGoods;

            return;

      }

      *m_ServTime+=(*m_CurrTime-m_SSTime);

      m_State=IsSettlingUp;

}

void CClient::StateChange(CQueue *Queue)

{

      m_State=IsWaitingForServicing;

      m_Queue=Queue;

    m_Goods=new CGoods(2+rand()%4);

}

int CClient::GetServicingTime()

{

      return m_SSTime;

}

CClient::~CClient(void)

{

      (*m_Stat)++;

      delete m_Goods;

} 
 

Г.4. Файл “Market.cpp” 

#include "Total.h"

#include <queue>

#include "conio.h" 

CMarket::CMarket(float NewClient[2], float NewBid[2])

{

      m_NewClient[0]=int(NewClient[0]*5); m_NewClient[1]=int(NewClient[1]*5);

      m_NewBid[0]=int(NewBid[0]*5); m_NewBid[1]=int(NewBid[1]*5); 

      m_GlobalTime=0;

      for (int i=0; i<3; i++)

      {

            m_ClerkQueue[i]=new CQueue(i+1, &m_GlobalTime);

            m_Clerk[i]=new CClerk(m_ClerkQueue[i], i+1, &m_GlobalTime, &m_NumGOTWh, &m_TNBids);

            m_Workload[i]=0;

      }

      m_CatalogueQueue=new CQueue(0, &m_GlobalTime);

      m_NumOfServClients=0;

      m_TotalServTime=0;

      m_NumGOTWh=0;

      m_TNBids=0;

      m_NumOfClients=0;

}

void CMarket::Work(int MaxTime)

      m_TimeToNewClient=m_NewClient[0]+rand()%(m_NewClient[1]-m_NewClient[0]+1);

      m_TimeToNewBid=m_NewBid[0]+rand()%(m_NewBid[1]-m_NewBid[0]+1);

      for(; m_GlobalTime<=MaxTime; m_GlobalTime++) 

      {

            for (int i=0; i<3; i++) m_Workload[i]+=m_ClerkQueue[i]->Size();

            m_TimeToNewClient--;

            if (m_TimeToNewBid>0) m_TimeToNewBid--;

            for (int i=0; i<3; i++)

            {

                  if (m_Clerk[i]->m_State!=CClerk::IsWaiting) m_Clerk[i]->m_TimeToStateChange--;

            }

            if (m_TimeToNewClient==0)

            {

                  CClient *Client=new CClient(m_CatalogueQueue, &m_GlobalTime, &m_NumOfServClients, &m_TotalServTime);

                  m_NumOfClients++;

                  m_CatalogueQueue->Push(Client);

                  m_TimeToNewClient=m_NewClient[0]+rand()%(m_NewClient[1]-m_NewClient[0]+1);

            }

            if (m_TimeToNewBid==0)

            {

                  if (!(m_CatalogueQueue->IsEmpty()))

                  {

                        int Smaller=0;

                        for (int i=1; i<3; i++)

                        {

                              if (m_ClerkQueue[i]->Size()<m_ClerkQueue[Smaller]->Size()) Smaller=i;

                        }

                        CClient *Client=m_CatalogueQueue->Pop();

                        m_ClerkQueue[Smaller]->Push(Client);

                        Client->StateChange(m_ClerkQueue[Smaller]);

                  }

                  m_TimeToNewBid=m_NewBid[0]+rand()%(m_NewBid[1]-m_NewBid[0]+1);

            }

            for (int i=0; i<3; i++)

            {

                  m_Clerk[i]->StateChange();   

            }

            //getch();

      }

      cout<<"\n*** Statisctics ***\n\n";

      cout<<"Total number of clients : "<<m_NumOfClients<<endl;

      cout<<"Total number of served clients : "<<m_NumOfServClients<<endl;

      cout<<"Workload:\n";

      for (int i=0; i<3; i++) cout<<"  Clerk #"<<i+1<<" : "<<float(m_Workload[i])/m_GlobalTime<<endl;

      cout<<"The average time of client servicing : "<<float(m_TotalServTime)/5/m_NumOfServClients<<endl;

      cout<<"The average number of allowed bids for one going to warehouse : "<<float(m_TNBids)/m_NumGOTWh<<endl;

      cout<<endl<<endl<<"To quit press any key...";

      getch();

} 
 

Г.5. Файл “Goods.cpp” 

#include "Total.h"

#include <iostream> 

CGoods::CGoods(int Num)

{

      m_Num=Num;

} 
 

Г.6. Файл “main.cpp” 

#include "Total.h"

#include <iostream>

using namespace std; 

int main()

{

      float NewClient[2];

      float NewBid[2];

      float WorkTime; 

      cout<<"Enter LOWER BOUND of time of new client appearance(in minutes)>";

      cin>>NewClient[0];

      cout<<"Enter UPPER BOUND of time of new client appearance(in minutes)>";

      cin>>NewClient[1];

      cout<<"Enter LOWER BOUND of time of new bid appearance (in minutes)> ";

      cin>>NewBid[0];

      cout<<"Enter UPPER BOUND of time of new bid appearance (in minutes)> ";

      cin>>NewBid[1];

      cout<<"Enter time of working (in minutes)> ";

      cin>>WorkTime;

      CMarket Market(NewClient, NewBid);

      Market.Work(int(WorkTime*5));

      return 0;

} 
 

Г.7. Файл “Queue.cpp” 

#include <deque>

#include "Total.h"

#include <iostream>

using namespace std; 

CQueue::CQueue(int OwnNumber, int *CurrTime)

{

      m_OwnNumber=OwnNumber;

      m_CurrTime=CurrTime;

}

int CQueue::GetNumOfWaitingClients()

{

      return m_Queue.size();

}

void CQueue::OnWaiting(int NumOfClients)

{

      for(deque<CClient*>::iterator i=m_Queue.begin(); NumOfClients; i++)

      {

            (*i)->StateChange();

            NumOfClients--;

      };

}

int CQueue::GetNumOfGoods(int NumOfServicingClients)

{

      int k=0;

      for(deque<CClient*>::iterator i=m_Queue.begin(); NumOfServicingClients; i++)

      {

            k+=(*i)->m_Goods->m_Num;

            NumOfServicingClients--;

      };

      return k;

}

int CQueue::Size()

{

      return m_Queue.size();

}

bool CQueue::IsEmpty()

{

      return m_Queue.empty();

}

void CQueue::Push(CClient *Client)

{

      m_Queue.push_back(Client);

}

CClient* CQueue::Pop()

{

      CClient *C=m_Queue.front();

      m_Queue.pop_front();

      return C;

}

Информация о работе Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. Имитация работы оптовог