Моделирование работы порта
Понятие объектно-ориентированного программирования и особенности применения его принципов при моделировании работы порта. Характеристика выделенных классов и состав результатов проектирования. Конечное описание полей классов. Описание результатов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.02.2012 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
Объектно-ориентированное программирование - технология программирования, при которой программа рассматривается как набор дискретных объектов, содержащих, в свою очередь, наборы структур данных и процедур, взаимодействующих с другими объектами.
Объектно-ориентированное программирование является хорошим инструментом в имитационном моделировании динамических систем.
Основные идеи объектно-ориентированного подхода опираются на следующие положения:
- программа представляет собой модель некоторого реального процесса, части реального мира;
- модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов;
- объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект;
- взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта;
- объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов.
Имитационное моделирование динамических систем приобрело в настоящий момент широкую популярность, в связи с быстрым развитием мировой экономики. Развитию частного и малого бизнеса уделяют большое внимание правительства множества современных государств. Следовательно, потребность в статистических данных, которые можно получить, не прибегая к реальному воплощению проектов жизнь, растет и растет.
Моделирование работы порта имеет тот же смысл, и помогает определить рентабельность будущих нововведений, наилучший график работы. Все необходимые математические модели уже разработаны учеными-статистами, поэтому моделирование такой системы не представляет большого труда, но дает исчерпывающие ответы.
1. Постановка задачи
В африканском порту танкеры загружаются сырой нефтью, которую морским путем доставляют затем по назначению. Мощности порта позволяют загружать не более трех танкеров одновременно. Танкеры, прибывающие в порт через каждые 11±7 часов (распределение равномерное на интервале 4-18), относятся к трем различным типам. Значения относительной частоты появления танкеров данного типа и времени, требуемого на их погрузку, приведены ниже:
Тип |
Относительная частота |
Время погрузки, ч |
|
1 |
0.25 |
182 |
|
2 |
0.55 |
243 |
|
3 |
0.20 |
364 |
В порту имеется один буксир, услугами которого пользуются все танкеры при причаливании и отчаливании. Причаливание и отчаливание занимают около 1 часа, причем, если в услугах буксира нуждаются сразу несколько танкеров, приоритет отдается операции причаливания.
Судовладелец предлагает дирекции порта заключить контракт на перевозку нефти в Великобританию и обеспечить выполнение условий контракта с помощью пяти танкеров особого, четвертого типа, которые на погрузку требуют 21 ±3 часов. После погрузки танкер отчаливает и следует в Англию, там разгружается и затем снова возвращается в африканский порт для погрузки. Время цикла обращения танкера, включая время разгрузки, составляет 240±24 часов. Фактором, осложняющим процесс перевозки нефти, являются штормы, которым подвергается порт. Интервал времени между штормами распределен экспоненциально с математическим ожиданием 48 часов, причем шторм продолжается 4±2 часа. Во время шторма буксир не работает.
Перед заключением контракта руководство порта решило определить влияние, которое окажут пять дополнительных танкеров на время пребывания в порту остальных судов. Выводы предложено сделать по результатам имитации работы порта в течение 5000 часов при условии принятия предлагаемого контракта. Оцениваемые величины:
- время пребывания в порту дополнительных танкеров и уже работающих танкеров трех типов.
2. Результаты анализа
2.1 Выделение субъектов
моделирование объектный программирование порт
Первым этапом создания объектно-ориентированного программного продукта является создание метамодели. В данном случае таковой является выделение из задания так называемых активных субъектов (предметов или существ, которые будут совершать какие-то действия), пассивных объектов (предметов или ресурсов, над которыми будут совершаться действия), сценариев использования (действий, совершаемых объектами) и создания общей концепции будущего продукта. Говоря иными словами, нужно выделить основные «действующие лица» будущего проекта, описать действия, которые они будут совершать, и создать общее представление, всего этого в рамках проекта.
После анализа задания были выделены такие компоненты:
Активные субъекты:ТанкерПортШтормБуксир |
Пассивные объекты:Нефть |
2.2 Сценарии использования
Сценарий использования, описывающий процесс загрузки танкера нефтью, представлен в таблице 2.1
Таблица 2.1 - Загрузка танкера нефтью
Критерий |
Описание |
|
Имя сценария |
Загрузка танкера нефтью. |
|
Имя субъекта |
Танкер |
|
Предусловие |
Буксир свободен, данный танкер - следующий в очереди на причаливание к порту, количество уже загружаемых танкеров меньше 3. |
|
Постусловие |
Танкер готов отчалить. |
|
Режим |
1. Танкер причаливает с помощью буксира;2. Танкер загружается нефтью;3. Танкер ожидает отчаливания. |
Данный сценарий является ключевым в данном проекте, так как именно работа танкера представляет целевой интерес в данной предметной области.
Сценарий использования, описывающий отчаливание танкера от порта, описан в таблице 2.2
Таблица 2.2 - Отчаливание танкера
Критерий |
Описание |
|
Имя сценария |
Танкер отчаливает от порта. |
|
Имя субъекта |
Танкер |
|
Предусловие |
Танкер загружен нефтью. |
|
Постусловие |
Танкер доставляет нефть в другую страну. |
|
Режим |
1. Танкер ожидает, пока буксир освободится;2. Танкер отчаливает с помощью буксира. |
Сценарий использования, отображающий работу буксира, описан в таблице 2.3
Таблица 2.3 - Работа буксира
Критерий |
Описание |
|
Имя сценария |
Работа буксира. |
|
Имя субъекта |
Буксир |
|
Предусловие |
Есть танкеры, ожидающие услуг буксира. |
|
Постусловие |
Нет танкеров, нуждающихся в услугах буксира. |
|
Режим |
1. Если есть танкеры, ожидающие причаливания, и есть свободные места в порту, причалить эти танкеры;2. Если есть танкеры, ожидающие отчаливания - отчалить. |
Сценарий использования, отображающий действия во время шторма, описан в таблице 2.4
Таблица 2.4 - Появление шторма
Критерий |
Описание |
|
Имя сценария |
Появление шторма. |
|
Имя субъекта |
Шторм |
|
Предусловие |
Настало время начала шторма. |
|
Постусловие |
Шторм прекращается. |
|
Режим |
1. Остановить все буксиры;2. Возобновить работу всех буксиров по окончании шторма. |
2.3 Описание выделенных классов
Исходя из постановки задачи и на основе уже проделанной работы, было выяснено, что будут необходимы некоторые классы.
Поведение танкера в системе будет моделировать класс CTanker.
Кроме конструктора, он будет хранить в себе переменную со своим типом, переменную, отображающую время, в течение которого танкер пробудет в пути (если он действительно в пути), и переменную со своим текущим состоянием.
Класс CTanker.
1. Свойства:
а) состояние;
б) тип;
в) время до изменения состояния.
2. Методы:
а) конструктор;
б) возврат состояния.
Поведение буксира в системе будет моделировать класс CTugboat. Данный класс будет хранить ссылку на танкер, который он в данный момент времени перевозит. Кроме того, он будет хранить переменную со своим текущим состоянием.
Класс CTugboat.
1. Свойства:
а) состояние;
б) ссылка на танкер;
2. Методы
а) конструктор;
б) возврат состояния.
Поведение порта, как системы загрузки нефтью, будет моделировать класс CPort. Данный класс будет хранить список всех танкеров, ожидающих обслуживания или уже обслуживаемых, а также будет иметь методы, возвращающие размер очереди, добавляющие клиентов и удаляющие их.
Класс CPort.
1. Свойства:
а) список танкеров.
2. Методы:
а) конструктор;
б) возврат размера очереди;
в) добавление нового танкера;
г) удаление танкера.
Шторм, который мешает работе буксира, будет отображать класс CStorm. Данный класс будет содержать переменную со своим текущим состоянием и переменную, которая будет отображать время до изменения текущего состояния, и метод, который будет отвечать за смену состояний.
Класс CStorm.
1. Свойства:
а) состояние;
б) время до смены состояния.
2. Методы:
а) конструктор.
Общее поведение системы, а также управление всеми классами будет совершать класс CApp. Он будет хранить массив ссылок на все танкеры, а также ссылки на порт, буксир и шторм. Кроме этого в данном классе будет храниться глобальное время моделирования системы.
Класс CApp.
1. Свойства:
а) массив ссылок на танкеры;
б) ссылка на порт;
в) ссылка на буксир;
г) ссылка на шторм.
2. Методы:
а) конструктор.
3. Результаты проектирования
3.1 Состав результатов проектирования
Следующим этапом разработки объектно-ориентированного программного продукта является разработка набора моделей (диаграмм, UML-схем), достаточного для полного описания реализации продукта. В данном случае достаточно разработать 9 схем:
а) варианты использования;
б) статическое представление;
в) диаграмма взаимодействия;
г) диаграмма состояний;
д) диаграмма компонентов;
е) описание полей классов;
ж) диаграмма объектов;
з) диаграмма пакетов.
3.2 Диаграммы вариантов использования
Диаграммы вариантов использования некоторых объектов показаны на рисунках 3.1 и 3.2.
Рисунок 3.1 - Диаграмма вариантов использования для экземпляра класса CTugboat
Рисунок 3.2 - Диаграмма Вариантов использования для экземпляра класса CTanker
Это диаграммы вариантов использования. Центральное место тут занимает вариант использования (основное действие, написанное в круге). Это действие связанно отношением ассоциации с актером (обозначается на диаграмме в форме человечка с подписью). Над отношением поставлена кратность. Актером на диаграмме является предмет или существо, которое участвует в действии. В данном случае это объекты классов. Основной вариант использования разделен на этапы. Эти этапы выведены в рамках отдельных вариантов и соединены с основным вариантом отношением включения (основной вариант включает в себя эти этапы). Так можно продолжать, пока не будет достигнут желаемый уровень конкретизации. Но в данном случае и эти варианты можно без особого труда описать в исходном коде, а значит их достаточно.
3.3 Диаграмма статического представления
Диаграмма статического представления (диаграмма классов) описывает отношения между объектами программы. На данной диаграмме использованы два вида отношений: ассоциация и агрегация. В основе расположен класс CApp. У него в свойствах, как было оговорено раннее, есть все объекты, участвующие в программе, которые он имеет право создавать и удалять. Такому виду отношений (отношение часть-целое) соответствует агрегация. На схеме она показана линией с ромбиком возле главного класса. В свою очередь объекты классов, для своего функционирования, нуждаются в данных объектов других классов. Среди свойств они имеют указатели на соответствующие объекты. А на диаграмме это отражено отношением ассоциации (линией с кратностью возле каждого из классов).
Диаграмма статического представления изображена на рисунке 3.3.
Рисунок 3.3 - Диаграмма статического представления
3.4 Диаграмма взаимодействия
Диаграмма взаимодействия показывает взаимодействие объектов на протяжении работы программы. В самой верхней части находится независимый актант и действующие объекты программы (по одному экземпляру из каждого класса). От них вниз идут так называемые «линии жизни» объектов (линии, обозначающие, что в данный момент объект существует). Прямоугольники обозначают, что объект в данное время выполняет действия. Стрелки обозначают запрос или сигнал, посылаемый от одного объекта к другому (сплошные) и ответ на запрос (пунктирные).
Размещено на http://www.allbest.ru/
Объект класса CApp создает все остальные объекты в системе в начале ее работы. Объекты класса CTanker создаются не все сразу. Вначале создаются танкеры последнего, исследуемого четвертого типа. Остальные танкеры появляются и удаляются из системы по оговоренным в задании случайным законам. Прежде, чем причаливать танкер к порту, буксир запрашивает информацию о наличии шторма. Если же шторм застает буксир в пути, то он просто останавливается и ожидает окончания шторма. После причаливания танкер определенное время загружается нефтью. До причаливания, необходимо убедиться, что в порту есть свободные места. После загрузки танкер, как правило, ожидает буксир, потому что в работе буксира более приоритетным считается причаливание к порту, чем отчаливание. После отчаливания, корабль четвертого типа уходит в транзит на Великобританию. Однако, если это танкер не четвертого типа, то он непременно удаляется, так как нас не интересует в данном случаем его дальнейшее направление движения и действия как таковые.
Диаграмма взаимодействия показана на рисунке 3.4.
Рисунок 3.4 - Диаграмма взаимодействия
3.5 Диаграмма состояний
Диаграммы состояний для классов CTugboat, CTanker и CStorm показаны на рисунках 3.5, 3.6 и 3.7 соответственно.
Рисунок 3.5 - Диаграмма состояний для класса CTugboat
Рисунок 3.6 - Диаграмма состояний для класса CTanker
Рисунок 3.7 - Диаграмма состояний для класса CStorm
Диаграмма состояний создается для объектов, у которых можно выделить какие-либо методы, подразумевающие не точечные действия, а действия, которые должны происходить на каком-то промежутке, к примеру, времени, изменение каких-либо параметров, переходов из одного состояния в другое с его течением.
В данном случае такими объектами являются буксир, танкер и шторм.
Сразу после создания класс CTugboat (буксир) переходит в состояние isOff, которое означает, что буксир находится в режиме ожидания. В этом же состоянии буксир пребывает во время шторма. Когда же имеются танкеры, ожидающие его услуг, буксир переходит в состояние isOn и остается в нем, пока не будут перевезены все танкеры.
Класс CTanker сразу после создания переходит в состояние WaitForLoad (ожидание загрузки), так как после создания все танкеры ожидают буксир. Когда приходит время причаливания к порту, танкер меняет состояние на TugForw (причаливание). Загружаясь, танкер переходит в состояние Load (загрузка). Когда буксир отчаливает танкер из порта, то новое состояние танкера - TugBack. Так как танкеры четвертого типа после этого отправляются в Великобританию, то для них введено специальное состояние inTransit, которое по прошествии определенного времени заменяется на WaitForLoad. Это происходит сразу же как только танкер прибывает обратно в порт в Африку.
Класс CStorm так же как и класс CTugboat имеет всего два состояния. Состояние isOff наступает сразу после создания и тогда, когда шторм прекращается. Состояние isOn соответственно наступает, когда шторм начинается и длится. Эти состояния зависят только от внутреннего времени самого объекта данного класса и никак не регулируются системой, подчиняясь лишь тем законам случайности, которые описаны в задании.
3.6 Конечное описание полей классов
В пункте «результаты анализа», были описаны классы, которые требуются для реализации программы. Теперь, проанализировав задание более глубоко, можно описать эти классы точнее.
Некоторые свойства классов описаны в таблице 3.1
Таблица 3.1 - Классы и их свойства
Переменная |
Описание |
|
Класс CApp |
||
m_Port |
Ссылка на порт |
|
m_Tugboat |
Ссылка на буксир |
|
m_EngTanker[5] |
Ссылки на пять танкеров, перевозящих нефть в Великобританию |
|
m_GlobalTime |
Глобальное время системы |
|
m_Storm |
Ссылка на шторм |
|
Класс CPort |
||
m_Queue |
Очередь из танкеров, ожидающих буксир |
|
Класс CTanker |
||
m_Type |
Тип данного танкера |
|
m_WrkTime |
Время до изменения состояния танкера |
|
m_State |
Текущее состояние танкера |
|
Класс CStorm |
||
m_State |
Текущее состояние объекта |
|
m_TimeToChage |
Время до изменения состояния |
|
Класс CTugboat |
||
m_State |
Текущее состояние буксира |
|
m_Tanker |
Ссылка на танкер, обслуживаемый буксиром |
Некоторые методы классов описаны в таблице 3.2
Таблица 3.2 - Классы и их методы
Метод |
Описание |
|
Класс CPort |
||
Add() |
Добавление танкера на загрузку |
|
Del() |
Удаление танкера из отсека загрузки |
|
Push() |
Добавление танкера в очередь на обслуживание |
|
Pop() |
Удаление танкера из очереди на обслуживание |
|
Класс CApp |
||
Work() |
Работа всего порта |
|
Класс CTugboat |
||
On() |
Перевод буксира в состояние работы |
|
Off() |
Перевод буксира в состояние ожидания |
|
Метод |
Описание |
|
TimeIsOver() |
Проверка на то, доставил ли буксир танкер (истекло ли время буксировки) |
|
Класс CTanker |
||
Work() |
Работа танкера (фактически - смена его состояний) |
|
GetState() |
Возвращает состояние объекта |
|
GetType() |
Возвращает тип танкера |
|
Класс CStorm |
||
Work() |
Работа шторма (смена его состояний) |
3.7 Диаграмма объектов
Диаграмма объектов отображает значения системы в какой-то момент времени (в данном случае - 225 часов) и взаимосвязи между конкретными объектами системы. Объекты отображаются двумя прямоугольниками. В верхнем написано имя, в нижнем - свойства объекта и их значения.
Объект App владеет всеми остальными объектами. Также на диаграмме изображены 5 танкеров, которые перевозят нефть в Великобританию, причем два из них загружаются в порту, а три остальных пребывают в поездке. Также на диаграмме присутствует класс Port, который связан с двумя обслуживаемыми танкерами. Буксир (Tugboat) связан с танкером третьего типа и причаливает его к порту. Однако объект Storm имеет состояние isOn, что означает что в данный момент времени походит шторм, поэтому буксир имеет состояние isOff и является выключенным.
Диаграмма объектов изображена на рисунке 3.6
Рисунок 3.8 - Диаграмма объектов
3.8 Диаграмма пакетов
Для большего удобства отображения, классы можно сгруппировать в пакеты. Диаграмма пакетов отображает взаимодействие между пакетами. Между пакетами есть связь, если между классами, находящимися в этих пакетах, есть связь. Если пакет «Б» использует в своей реализации данные пакета «А» стрелка связи проводится из пакета «А» в пакет «Б».
Диаграмма классов для данной предметной области изображена на рисунке 3.4.
В данном случае в каждом из пакетов находится по одному классу (имя пакета - <имя класса>.cpp).
Главный пакет, который содержит все остальные, не имеет своего собственного файла, но отображает общий смысл системы. Этот пакет существует лишь как проект программного продукта.
Рисунок 3.9 - Диаграмма пакетов
4. Описание реализации
Мною было спроектировано несколько диаграмм, в том числе и диаграмма пакетов, которая вызвала некоторые затруднения. После ее построения, оказалось, что она имеет циклы. Например, файлы реализующие классы порта и танкера, а также файлы, реализующие классы буксира и танкера, использовали друг друга. Данная проблема была решена удалением лишних ссылок в реализации соответствующих классов. Позднее оказалось, что действительно, танкеру не нужна ссылка на порт, если порт и так ссылается на танкер. Аналогичная ситуация прослеживалась и с другими циклами.
В данном проекте я реализовывал два класса: CApp и CPort.
Класс CPort при постановке задачи должен был отвечать за работу всей системы в целом. Однако при более детальном анализе проблемы мною было решено возложить на объект данного класса только управление портом, как загрузочной станцией.
Протокол класса CPort:
class CPort
{
public:
CPort();
int GetFreePlaces();
void Push (CTanker *Tanker);
CTanker* Pop();
void Add (CTanker *Tanker);
void Del (CTanker *Tanker);
void ChangeTime();
CTanker* Ready();
bool Empty();
private:
deque<CTanker*> m_Queue;
CTanker* m_Serv[3];
};
Пребывая в порт, танкер становится в очередь, которая ожидает буксировки. Для организации данной очереди было решено использовать контейнер <deque> стандартной библиотеки шаблонов.
Также в данном классе имеется массив танкеров, которые в данный момент загружаются. Для удобства были описаны специальные функции, которые добавляют танкер на загрузку, удаляют танкер из загрузки, а также возвращают количество свободных мест в порту. Подобные функции были реализованы и для очереди.
Главным классом в проектируемой системе является класс CApp.
Протокол класса CApp:
class CApp
{
public:
CApp (int MaxTime);
void Work();
int Rnd (int a, int b);
private:
CPort *m_Port;
CTugboat *m_Tugboat;
CTanker *m_EngTanker[5];
int m_TimeToUsTan;
int m_MaxTime;
int m_GlobalTime;
CStorm *m_Storm;
int m_Stat[4];
int m_Times[4];
};
Он реализует работу всего порта как такового. Следовательно, данный класс должен следить и за ходом времени. Для этого была введена переменная m_GlobalTime, которая и показывает время, прошедшее с начала работы системы в часах. Час, как квант времени был выбран не случайно, потому что в данной специализации за отрезок времени меньший, чем час, ничего произойти не может. Максимальное время моделирования ограничено заданием и составляет 5000 часов.
Данный класс отслеживает время, и создает объекты новых танкеров с той частотой, которая была дана в задании. Это вызвало небольшую проблему. Мною было решено поддерживать относительную частоту появления танкеров определенного типа следующим образом: на отрезке от 0 до единицы включительно, выбиралось случайное число. Заранее этот отрезок был поделен на части, пропорциональные относительным частотам появления танкером. В зависимости от того из какой области была случайная величина, такой тип и задавался новому танкеру. Изначально такая идея не вызывала доверия, однако при проверке на довольно больших отрезках времени моделирования (t>1000), данная методика работала правильно. А так как это время заранее установлено и равно 5000, как говорилось ранее, то было решено использовать эту идею.
Выводы
моделирование объектный программирование порт
При выполнении курсового проекта для достижения поставленной цели был проведен объектно-ориентированный анализ, в результате которого выделены активные объекты, пассивные субъекты, варианты использования, а также следующие классы предметной области: CTanker (танкер), CStorm (шторм), CPort (порт), CTugboat (буксир), а также главный класс CApp. Для указанных классов определены атрибуты и операции.
По результатам анализа было проведено объектно-ориентированное проектирование, результатом которого стали следующие диаграммы:
а) варианты использования;
б) статическое представление;
в) диаграмма взаимодействия;
г) диаграмма состояний;
д) диаграмма компонентов;
е) описание полей классов;
ж) диаграмма объектов;
з) диаграмма пакетов.
Результатом реализации диаграмм стал программный продукт, моделирующий работу порта.
Таким образом, в ходе работы к предметной области «Работа порта» были применены навыки имитационного моделирования с использованием ООП, результатом чего стал программный продукт, имитирующий работу порта, в котором танкеры загружаются нефтью.
Список использованной литературы
1. Г. Шилдт. Самоучитель C++. 3-е издание. - Санкт-Петербург: 2005 г., 680 с.
2. Бьярн Страуструп, «Язык программирования C++, специальное издание»
3. Хант, Эндрю, Томас, Дэвид. Программист-прагматик. Путь от подмастерья к мастеру. М.: Издательство «Лори», 2004. - 270 с.
4. Г. Саттер, А. Александреску. Стандарты программирования на C++.: Пер. с англ. - М.: Издательский дом «Вильямс», 2005. - 224 с.
5. Г. Буч, Д. Рамбо, А. Джекобсон, Программирование: Язык UML. Руководство пользователя.
Приложение А
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
А.1 Общие сведения
Тема курсового проекта: «Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. Работа порта».
Система проектируется студентом 1-го курса Государственного института информатики и искусственного интеллекта (ГУИиИИ), факультета СКИТ, группы ПО-07д. Кушниренко Д.П.
Основанием для разработки ПП является задание, выданное кафедрой ПОИС Плановый срок начала работы по созданию информационной системы: 7.04.2008 г., срок окончания: 22.05.2008 г. Курсовая работа должна выполняться согласно графику, приведенному в таблице А.1.
Таблица А.1 - Стадии и этапы разработки программного продукта
№ |
Этапы работы |
Сроки выполнения |
|
1. |
Получение задания |
7.04.2008 г. |
|
2. |
Объектно-ориентированный анализ предметной области |
10.04.2008 г. |
|
3. |
Составление технического задания |
15.04.2008 г. |
|
4. |
Построение диаграмм классов и объектов |
17.04.2008 г. |
|
5. |
Построение диаграмм взаимодействия, состояний и переходов. |
24.04.2008 |
|
6. |
Проектирование программы, построение диаграмм модулей и процессов |
30.04.2008 г. |
|
7. |
Отладка программы на верхнем уровне |
5.05.2008 г. |
|
8. |
Тестирование программы |
10.05.2008 г. |
|
9. |
Написание пояснительной записки |
17.05.2008 г. |
|
10. |
Защита курсового проекта |
22.05.2008 г. |
А.2 Назначение и цели создания программы
Данный программный продукт предназначен для имитации работы динамического объекта реального мира - порта и получения статистических данных на основе введения в работу системы пяти дополнительных танкеров, перевозящих нефть в Великобританию.
А.3 Характеристика объекта автоматизации
В африканском порту танкеры загружаются сырой нефтью, которую морским путем доставляют затем по назначению. Мощности порта позволяют загружать не более трех танкеров одновременно. Танкеры, прибывающие в порт через каждые 11±7 часов (распределение равномерное на интервале 4-18), относятся к трем различным типам. Значения относительной частоты появления танкеров данного типа и времени, требуемого на их погрузку, приведены ниже:
Тип |
Относительная частота |
Время погрузки, ч |
|
1 |
0.25 |
182 |
|
2 |
0.55 |
243 |
|
3 |
0.20 |
364 |
В порту имеется один буксир, услугами которого пользуются все танкеры при причаливании и отчаливании. Причаливание и отчаливание занимают около 1 часа, причем, если в услугах буксира нуждаются сразу несколько танкеров, приоритет отдается операции причаливания.
Судовладелец предлагает дирекции порта заключить контракт на перевозку нефти в Великобританию и обеспечить выполнение условий контракта с помощью пяти танкеров особого, четвертого типа, которые на погрузку требуют 21 ±3 часов. После погрузки танкер отчаливает и следует в Англию, там разгружается и затем снова возвращается в африканский порт для погрузки. Время цикла обращения танкера, включая время разгрузки, составляет 240±24 часов. Фактором, осложняющим процесс перевозки нефти, являются штормы, которым подвергается порт. Интервал времени между штормами распределен экспоненциально с математическим ожиданием 48 часов, причем шторм продолжается 4±2 часа. Во время шторма буксир не работает.
Перед заключением контракта руководство порта решило определить влияние, которое окажут пять дополнительных танкеров на время пребывания в порту остальных судов. Выводы предложено сделать по результатам имитации работы порта в течение 5000 часов при условии принятия предлагаемого контракта. Оцениваемые величины:
- время пребывания в порту дополнительных танкеров и уже работающих танкеров трех типов.
А.4 Требования к программному продукту
А.4.1 Требования к системе в целом
В целом к системе предъявляются следующие требования:
а) имитация работы порта;
б) вывод статистики: среднее время пребывания в порту танкеров всех типов.
А.4.2 Требования к задачам и функциям, выполняемым продуктом
В процессе работы необходимо обеспечить выполнение следующих функций:
а) вывод результатов моделирования на экран
А.4.3 Требования к техническому обеспечению
а) Использовать IBM-совместимые ЭВМ с учетом необходимых ресурсов машины, необходимых для функционирования проектируемого программного продукта.
б) Обеспечить достаточный объем внешней памяти для возможности работы с необходимым объемом информации.
А.4.4 Требования к программному обеспечению
Программный продукт должен функционировать в условиях ОС MS-DOS
К программному обеспечению предъявляются следующие требования:
а) использование удобного и понятного пользовательского интерфейса.
А.4.5 Требованию к организационному обеспечению
В программную документацию должны входить:
1) пояснительная записка;
2) приложения:
а) техническое задание;
б) руководство пользователя;
в) экранные формы;
г) листинг программы.
Приложение Б
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Интерфейс программного продукта оформлен на английском языке.
После запуска программы вы увидите окно, в котором будет предоставлена статистика, полученная в результате моделирования, в следующем виде:
TANKERS of type <тип>:
Total number of tankers: <кол-во танкеров данного типа>
Total number of loadings: <кол-во загрузок в порту>
Average time of staying in port is <кол-во часов> hours
Что соответствует требуемым статистическим величинам: общему количеству танкеров каждого типа, общему числу загрузок танкеров каждого типа, среднему времени пребывания танкеров каждого типа.
Для завершения программы необходимо нажать любую клавишу.
Приложение В
ЭКРАННЫЕ ФОРМЫ
Рисунок В.1 - Статистические данные моделирования системы
Приложение Г
ЛИСТИНГ ПРОГРАММЫ
Файл «General.h»
#include <deque>
using namespace std;
class CTanker
{
public:
CTanker (int Type, int *CurrTime, int *Stat, int *Times);
void Work();
void Statistic();
bool TimeIsOver();
int GetState();
int GetType();
void ChangeTime (bool Storm);
int Rnd (int a, int b);
private:
int m_Type;
int m_WrkTime;
int *m_CurrTime;
int m_TimeInPort;
int *m_Stat;
int *m_Times;
enum TankerState {WaitForLoad, TugForw, Load, TugBack, inTransit};
enum TankerState m_State;
};
class CTugboat
{
public:
CTugboat();
void On (CTanker *Tanker);
void Off();
int GetState();
void ChangeTime (bool Storm);
CTanker* GetTanker();
bool TimeIsOver();
private:
enum TugState {isOn, isOff};
enum TugState m_State;
CTanker *m_Tanker;
};
class CPort
{
public:
CPort();
int GetFreePlaces();
void Push (CTanker *Tanker);
CTanker* Pop();
void Add (CTanker *Tanker);
void Del (CTanker *Tanker);
void ChangeTime();
CTanker* Ready();
bool Empty();
private:
deque<CTanker*> m_Queue;
CTanker* m_Serv[3];
};
class CStorm
{
public:
CStorm();
int GetState();
void ChangeTime();
void Work();
int Rnd (int a, int b);
private:
enum StormState {isOff, isOn};
enum StormState m_State;
int m_TimeToChange;
};
class CApp
{
public:
CApp (int MaxTime);
void Work();
int Rnd (int a, int b);
private:
CPort *m_Port;
CTugboat *m_Tugboat;
CTanker *m_EngTanker[5];
int m_TimeToUsTan;
int m_MaxTime;
int m_GlobalTime;
CStorm *m_Storm;
int m_Stat[4];
int m_Times[4];
};
Файл «Constants.h»
namespace Constants
{
const int Loading[4] [2]={{16,20}, {21,27}, {32,40}, {18,24}};
const int TugTime=1;
const int Journey[2]={216,264};
const double Freq[3]={0. 25,0. 55,0.2};
const int Appear[2]={4,18};
const int StormTime[2]={2,6};
const int StormAppear[2]={28,68};
};
Файл «App.cpp»
#include «General.h»
#include «Constants.h»
#include <iostream>
#include <conio.h>
using namespace Constants;
using namespace std;
CApp:CApp (int MaxTime)
{
m_GlobalTime=0;
for (int i=0; i<4; i++)
{
m_Stat[i]=0;
m_Times[i]=0;
}
m_MaxTime=MaxTime;
m_Port=new CPort();
m_Tugboat=new CTugboat();
for (int i=0; i<5; i++)
{
m_EngTanker[i]=new CTanker (3, &m_GlobalTime,&m_Stat[3],&m_Times[3]);
m_Port->Push (m_EngTanker[i]);
}
m_Storm=new CStorm();
m_TimeToUsTan=Rnd (Appear[0], Appear[1]);
}
void CApp: Work()
{
int Total[4]={0, 0, 0, 5};
for (; m_GlobalTime<=m_MaxTime; m_GlobalTime++)
{
m_TimeToUsTan -;
m_Storm->ChangeTime();
for (int i=0; i<5; i++) m_EngTanker[i]->ChangeTime (m_Storm->GetState());
m_Port->ChangeTime();
m_Tugboat->ChangeTime (m_Storm->GetState());
if (m_TimeToUsTan==0)
{
int Type;
float P=float (Rnd(1,100))/100;
if (P<=Freq[0]) Type=0;
else
if (P<=Freq[0]+Freq[1]) Type=1;
else Type=2;
CTanker *Tanker=new CTanker (Type, &m_GlobalTime, &m_Stat[Type], &m_Times[Type]);
m_Port->Push(Tanker);
m_TimeToUsTan=Rnd (Appear[0], Appear[1]);
Total[Type]++;
}
for (int i=0; i<5; i++)
if (m_EngTanker[i]->TimeIsOver()&&m_EngTanker[i]->GetState()==4)
{
m_Port->Push (m_EngTanker[i]);
m_EngTanker[i]->Work();
}
if (m_Tugboat->TimeIsOver())
{
CTanker *Tanker=m_Tugboat->GetTanker();
m_Tugboat->Off();
if (Tanker->GetState()==1) m_Port->Add(Tanker);
if (Tanker->GetState()==3)
{
if (Tanker->GetType()==3) Tanker->Work();
else
{
Tanker->Statistic();
delete Tanker;
}
}
}
if (m_Port->GetFreePlaces()!=0&&m_Tugboat->GetState()==1)
{
if (! m_Port->Empty())
{
CTanker *Tanker=m_Port->Pop();
m_Tugboat->On(Tanker);
}
}
CTanker *Tanker1=m_Port->Ready();
if (Tanker1&&m_Tugboat->GetState())
{
m_Port->Del(Tanker1);
m_Tugboat->On(Tanker1);
}
}
cout<<«Moduling was lasting for «<<m_MaxTime<<» hours.\n\n»;
cout<< "***Results***\n\n»;
for (int i=0; i<4; i++)
{
cout<<«TANKERS of type «<<i+1<<»: \n»;
cout<<» Total number of tankers «<<Total[i]<<endl;
cout<<» Total number of loadings «<<m_Times[i]<<endl;
cout<<» Average time of staying in port is «<<float (m_Stat[i])/m_Times[i]<<» hours\n\n»;
}
}
int CApp: Rnd (int a, int b)
{
return a+rand()%(b-a+1);
}
Файл «main.cpp»
#include «General.h»
#include <conio.h>
int main()
{
CApp App(5000);
App. Work();
printf («Press any key to exit program…»);
getch();
return 0;
}
Файл «Port.cpp»
#include «General.h»
#include <deque>
CPort:CPort()
{
for (int i=0; i<3; i++)
m_Serv[i]=NULL;
}
int CPort: GetFreePlaces()
{
int k=3;
for (int i=0; i<3; i++) if (m_Serv[i]!=NULL) k -;
return k;
}
void CPort: Add (CTanker *Tanker)
{
int i=0;
for (; m_Serv[i]; i++);
if (i<3) m_Serv[i]=Tanker;
Tanker->Work();
}
void CPort: Del (CTanker *Tanker)
{
int i=0;
for (; m_Serv[i]!=Tanker; i++);
m_Serv[i]=NULL;
}
void CPort: Push (CTanker *Tanker)
{
m_Queue.push_back(Tanker);
}
CTanker* CPort: Pop()
{
if (! m_Queue.empty())
{
CTanker *Tanker=m_Queue.front();
m_Queue.pop_front();
return Tanker;
}
return NULL;
}
void CPort: ChangeTime()
{
for (int i=0; i<3; i++)
if (m_Serv[i]) m_Serv[i]->ChangeTime(0);
}
CTanker* CPort: Ready()
{
int Out=-1;
for (int i=0; i<3; i++)
if (m_Serv[i])
if (m_Serv[i]->TimeIsOver()) Out=i;
if (Out!=-1) return m_Serv[Out];
else return NULL;
}
bool CPort: Empty()
{
return m_Queue.empty();
}
Файл «Storm.cpp»
#include «General.h»
#include «Constants.h»
using namespace Constants;
CStorm:CStorm()
{
m_State=isOff;
m_TimeToChange=Rnd (StormAppear[0], StormAppear[1]);
}
int CStorm: GetState()
{
return m_State;
}
void CStorm: ChangeTime()
{
m_TimeToChange -;
if (m_TimeToChange==0) Work();
}
void CStorm: Work()
{
if (m_State==isOff)
{
m_State=isOn;
m_TimeToChange=Rnd (StormTime[0], StormTime[1]);
return;
}
m_State=isOff;
m_TimeToChange=Rnd (StormAppear[0], StormAppear[1]);
}
int CStorm: Rnd (int a, int b)
{
return a+rand()%(b-a+1);
}
Файл «Tanker.cpp»
#include «General.h»
#include «Constants.h»
using namespace Constants;
CTanker:CTanker (int Type, int *CurrTime, int *Stat, int *Times)
{
m_Type=Type;
m_State=WaitForLoad;
m_TimeInPort=*CurrTime;
m_CurrTime=CurrTime;
m_WrkTime=-1;
m_Stat=Stat;
m_Times=Times;
}
void CTanker: ChangeTime (bool Storm)
{
if (m_WrkTime>0)
{
if (Storm)
{
if (m_State!=TugForw&&m_State!=TugBack) m_WrkTime -;
return;
}
m_WrkTime -;
}
}
bool CTanker: TimeIsOver()
{
return m_WrkTime==0;
}
int CTanker: GetType()
{
return m_Type;
}
void CTanker: Work()
{
switch (m_State)
{
case WaitForLoad:
m_State=TugForw;
m_WrkTime=TugTime;
return;
case TugForw:
m_State=Load;
m_WrkTime=Rnd (Loading[m_Type] [0], Loading [m_Type] [1]);
return;
case Load:
m_State=TugBack;
m_WrkTime=TugTime;
return;
case TugBack:
m_State=inTransit;
Statistic();
m_WrkTime=Rnd (Journey[0], Journey[1]);
return;
case inTransit:
m_State=WaitForLoad;
m_TimeInPort=*m_CurrTime;
m_WrkTime=-1;
return;
}
}
void CTanker: Statistic()
{
*m_Stat+=(*m_CurrTime) - m_TimeInPort;
(*m_Times)++;
return;
}
int CTanker: GetState()
{
return m_State;
}
int CTanker: Rnd (int a, int b)
{
return a+rand()%(b-a+1);
}
Файл «Tugboat.cpp»
#include «General.h»
CTugboat:CTugboat()
{
m_State=isOff;
}
void CTugboat: On (CTanker *Tanker)
{
m_State=isOn;
m_Tanker=Tanker;
m_Tanker->Work();
}
void CTugboat: Off()
{
m_State=isOff;
m_Tanker=NULL;
}
int CTugboat: GetState()
{
return m_State;
}
void CTugboat: ChangeTime (bool Storm)
{
if (! Storm&&m_State==isOn) m_Tanker->ChangeTime(Storm);
}
CTanker* CTugboat: GetTanker()
{
return m_Tanker;
}
bool CTugboat: TimeIsOver()
{
if (m_State==isOn)
return m_Tanker->TimeIsOver();
return 0;
}
Размещено на Allbest.ru
Подобные документы
Проектирование объектно-ориентированных моделей реальных систем на примере модели функционирования морского грузового порта. Описание классов и методов. Структура и диаграмма классов. Особенности функционирования программы. Средство разработки и листинг.
лабораторная работа [99,7 K], добавлен 10.06.2013Анализ объектно-ориентированного программирования, имитирующего способы выполнения предметов. Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Понятие классов, полей, методов, сообщений, событий.
контрольная работа [51,7 K], добавлен 22.01.2013Изучение принципов объектно-ориентированного программирования, в котором основными концепциями являются понятия классов и объектов. Свойства этого вида программирования: инкапсуляция, полиморфизм, наследование. Описание класса. Конструкторы и деструкторы.
презентация [74,8 K], добавлен 14.10.2013Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).
курсовая работа [29,7 K], добавлен 29.10.2011Изучение базовых понятий объектно-ориентированного программирования. Исследование принципов работы с классами и объектами. Построение системы классов для описания плоских геометрических фигур. Анализ методов создания объектов, перемещения на плоскости.
лабораторная работа [212,0 K], добавлен 10.03.2013Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014Особенности реализации главных элементов разрабатываемой программы (цифровые элементы) с помощью объектно-ориентированного подхода. Применение принципа инкапсуляции для защиты данных. Конструирование классов, описание и тестирование программного продукта.
курсовая работа [2,3 M], добавлен 10.05.2015Цели объектно-ориентированного программирования, абстрактные классы и адреса базовых классов, множественное и виртуальное наследование. Инициализация элементов производного класса, программный вызов конструкторов базового и производного классов.
реферат [21,8 K], добавлен 31.10.2011Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.
курсовая работа [1,2 M], добавлен 22.01.2012Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.
курсовая работа [355,9 K], добавлен 18.06.2013