Модель функционирования морского порта
Проектирование объектно-ориентированных моделей реальных систем на примере модели функционирования морского грузового порта. Описание классов и методов. Структура и диаграмма классов. Особенности функционирования программы. Средство разработки и листинг.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 10.06.2013 |
Размер файла | 99,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Цель работы
Целью работы является приобретение навыков проектирования объектно-ориентированных моделей реальных систем.
программа модель объектный ориентированный
Задание
Морской грузовой порт
Включает: причалы (до 6) с погрузочно-разгрузочным оборудованием определенного типа: для металла, для леса, для зерна и т.п.; рейд (место в акватории порта, где пришедшие суда дожидаются очереди на погрузку/разгрузку); буксиры для проводки судов рейд-причал и обратно; диспетчерскую службу для контроля погрузки/разгрузки; гидрометеоролога (контроль за состоянием моря и атмосферы).
Пояснения: моделируем процесс погрузки - разгрузки кораблей. Корабль может быть с грузом определенного вида, разгруженный, находиться на причале или на рейде. При разгрузке/погрузке груз на корабле должен соответствовать п/р комплексу на причале. После разгрузки диспетчер переводит корабль от причала на рейд, а загруженный корабль - с рейда на причал. При проводке корабля сводка погоды должна быть удовлетворительной, для чего перед проводкой запрашивается прогноз. Если прогноз штормовой, то корабли остаются на рейде, а корабли от причалов буксируются на рейд. Все п/р работы прекращаются.
Описание классов и методов
Класс, описывающий корабль - Ship. Он, содержит информацию, такую как тип груза, перевозимого судном и состояние судна (на рейде или нет).
Класс, описывающий рейд - Raid. Он, содержит в себе контейнер с кораблями а также функции для взаимодействия с буксирами.
Класс, описывающий причал - Bay. Он, содержит в себе информацию о типе разгружаемого груза, состоянии причала (занят/свободен), а также включает в себя объект класса Ship и содержит в себе функции, сигнализирующие об изменении состояния, а также взаимодействии с буксиром и кораблём. От класса Bay есть четыре производных класса, по типу разгружаемого материала. Отличаются от родительского класса они конструкторами, инициализирующими при своём вызове соответствующие поля.
Класс, описывающий буксир - Buksir. Он, содержит в себе информацию о своём состоянии, включает в себя объект класса Ship, а также описывает методы для взаимодействия с причалом, кораблём и рейдом. А ещё, буксир в пути может сломаться, что приведёт к паузе в его работе, пока он чинится.
Класс, описывающий порт - Port. Он включает в себя объекты классов Bay, Raid и Buksir. В этом классе происходит инициализация всей структуры, а также описаны основные процессы работы порта.
Есть ещё класс Meteo, содержащий один единственный статический метод прогноза погоды, а также класс Dispetch, по сути являющийся интерфейсом пользователя. В классе Dispetch, реализован выбор пользователем количества буксиров и причалов в порту, а также последующий запуск работы самого порта.
Структура классов
Ship
CargoType Cargo;
bool IsOnRaid;
public Ship (int _cr)
public Ship SetCargoType (CargoType _carg)
public CargoType GetCargoType ()
Raid
List<Ship> Ships = new List<Ship> ();
public Raid ()
public int GetCount ()
public Ship GiveToBuks ()
Bay
protected CargoType Equipment;
protected bool IsBusy;
protected Ship BShip;
public Ship Unload ()
public Bay TakeFromBuks (Ship _ship)
public CargoType GetEqType ()
public bool GetState ()
public Ship ShowShip ()
MetalBay: Bay
public MetalBay ()
Остальные три производных класса аналогичны (отличаются только имена классов и их конструкторов соответственно), не будем тратить бумаг у на переписывание по сути, одного и того же.
Buksir
Ship BShip;
bool IsBusy;
bool IsOnRaid;
public Buksir ()
public Buksir TakeFromRaid (Ship _ship)
public Buksir TakeFromPort (Ship _ship)
public Buksir GoToRaid ()
public Buksir GoToPort ()
public bool GetState ()
public Buksir SetFree ()
public Ship ShowShip ()
public bool GetPosition ()
public bool BreakNRepair ()
Port
Bay [] PBays;
Buksir [] PBuksir;
Raid PRaid;
public void Start (int _bayCount, int _buksCount)
public void Process ()
public int FindFreeBuks ()
public void FreeBusyBuks ()
public int MatchBay (Buksir _buks)
Dispetch
public static void Start ()
Meteo
public static bool Prognose ()
Диаграмма классов
Функционирование программы
Программа является консольной. При старте пользователю предлагается задать количество причалов и буксиров в порту. Затем, выстраивается структура модели, количество судов на рейде рассчитывается псевдослучайным образом и может быть от 15 до 30. Как только структура будет создана, запустится метод Process () класса Port, и буксиры начну курсировать от рейда к порту и обратно. В случае плохого прогноза погоды, а также поломки одного из буксиров, работа приостанавливается. Работа программы заканчивается, когда на рейде не останется кораблей.
О средстве разработки
Для создания программы использовалась Microsoft Visual Studio 2012 Express for Desktop, которая является лицензионной. Использованный язык: C#.
Листинг программы
Класс Ship
namespace Port_Model
{
enum CargoType
{
Metal,
Tree,
Meal,
Coal,
Empty
}
class Ship
{
CargoType Cargo;
bool IsOnRaid;
public Ship (int _cr)
{
switch (_cr)
{
case 0:
Cargo = CargoType. Metal;
IsOnRaid = true;
break;
case 1:
Cargo = CargoType. Meal;
IsOnRaid = true;
break;
case 2:
Cargo = CargoType. Tree;
IsOnRaid = true;
break;
default:
Cargo = CargoType. Coal;
IsOnRaid = true;
break;
}
}
public Ship SetCargoType (CargoType _carg)
{
Cargo = _carg;
return this;
}
public CargoType GetCargoType ()
{
return Cargo;
}
}
}
Класс Raid
namespace Port_Model
{
class Raid
{
List<Ship> Ships = new List<Ship> ();
public Raid ()
{
Random rand = new Random ();
int r = rand. Next (10, 25);
for (int i = 0; i < r; i++)
{
int cr = rand. Next (0,4);
Ships. Add (new Ship (cr));
}
}
public int GetCount ()
{
return Ships. Count;
}
public Ship GiveToBuks ()
{
Ship BShip = Ships. Last ();
Ships. Remove (Ships. Last ());
return BShip;
}
}
}
Класс Bay
class Bay
{
protected CargoType Equipment;
protected bool IsBusy;
protected Ship BShip;
// virtual public Bay ();
// virtual public Ship Unload ();
public Ship Unload ()
{
Thread. Sleep (1000);
BShip. SetCargoType (CargoType. Empty);
return BShip;
}
public Bay TakeFromBuks (Ship _ship)
{
BShip = _ship;
return this;
}
public CargoType GetEqType ()
{
return Equipment;
}
public bool GetState ()
{
return IsBusy;
}
public Ship ShowShip ()
{
return BShip;
}
}
Класс MetalBay
class MetalBay: Bay
{
public MetalBay ()
{
Equipment = CargoType. Metal;
IsBusy = false;
}
}
Класс TreeBay
class TreeBay: Bay
{
public TreeBay ()
{
Equipment = CargoType. Tree;
IsBusy = false;
}
}
Класс MealBay
class MealBay: Bay
{
public MealBay ()
{
Equipment = CargoType. Meal;
IsBusy = false;
}
}
Класс CoalBay
class CoalBay: Bay
{
public CoalBay ()
{
Equipment = CargoType. Coal;
IsBusy = false;
}
}
Класс Buksir
namespace Port_Model
{
class Buksir
{
Ship BShip;
bool IsBusy;
bool IsOnRaid;
int Index;
public Buksir ()
{
IsBusy = false;
IsOnRaid = false;
}
public Buksir TakeFromRaid (Ship _ship)
{
BShip = _ship;
return this;
}
public Buksir TakeFromPort (Ship _ship)
{
BShip = _ship;
return this;
}
public Buksir GoToRaid ()
{
IsBusy = true;
Thread. Sleep (1000);
IsOnRaid = true;
return this;
}
public Buksir GoToPort ()
{
IsBusy = true;
Thread. Sleep (1000);
IsOnRaid = false;
return this;
}
public bool GetState ()
{
return IsBusy;
}
public Buksir SetFree ()
{
IsBusy = false;
BShip = null;
return this;
}
public Ship ShowShip ()
{
return BShip;
}
public bool GetPosition ()
{
return IsOnRaid;
}
public Buksir SetCounter (int _count)
{
Index = _count;
return this;
}
public bool BreakNRepair ()
{
int result = (new Random ()). Next (0,10);
if (result == 5)
{
return true;
}
else return false;
}
}
}
Класс Port
namespace Port_Model
{
class Port
{
Bay [] PBays;
Buksir [] PBuksir;
Raid PRaid;
public void Start (int _bayCount, int _buksCount)
{
PBays = new Bay [_bayCount];
PBuksir = new Buksir [_buksCount];
for (int i = 0; i < PBuksir. Count (); i++)
PBuksir [i] = new Buksir ();
PRaid = new Raid ();
PBays [0] = new MetalBay ();
PBays [1] = new TreeBay ();
PBays [2] = new MealBay ();
PBays [3] = new CoalBay ();
Random rand = new Random ();
for (int i = 4; i < PBays. Count (); i++)
{
int r = rand. Next (0,4);
switch (r)
{
case 0:
PBays [i] = new MetalBay ();
break;
case 1:
PBays [i] = new TreeBay ();
break;
case 2:
PBays [i] = new MealBay ();
break;
default:
PBays [i] = new CoalBay ();
break;
}
}
Process ();
}
public void Process ()
{
int BuksIndex, BayIndex;
while (PRaid. GetCount ()! = 0)
{
if (! Meteo. Prognose ())
{
Console. WriteLine ("Bad weather, work temporaly stopped. ");
}
Console. WriteLine ("{0} ships are on the raid", PRaid. GetCount ());
BuksIndex = FindFreeBuks ();
if (BuksIndex! = - 1)
{
if (! PBuksir [BuksIndex]. GetPosition ())
{
Console. WriteLine ("{0} buksir is on the way to raid", BuksIndex + 1);
PBuksir [BuksIndex]. GoToRaid ();
}
if (PBuksir [BuksIndex]. BreakNRepair ())
{
Console. WriteLine ("{0} buksir is broken, reparing.", BuksIndex + 1);
Thread. Sleep (3000);
}
PBuksir [BuksIndex]. TakeFromRaid (PRaid. GiveToBuks ());
BayIndex = MatchBay (PBuksir [BuksIndex]);
Console. WriteLine ("{0} buksir is on the way to {1} bay with the {2} ship", BuksIndex + 1, BayIndex + 1, PBuksir [BuksIndex]. ShowShip (). GetCargoType ());
PBuksir [BuksIndex]. GoToPort ();
PBays [BayIndex]. TakeFromBuks (PBuksir [BuksIndex]. ShowShip ());
Console. WriteLine ("Unloading. ");
PBays [BayIndex]. Unload ();
if (FindFreeBuks () == - 1) FreeBusyBuks ();
else BuksIndex = FindFreeBuks ();
PBuksir [BuksIndex]. TakeFromPort (PBays [BayIndex]. ShowShip ());
Console. WriteLine ("{0} buksir is on the way to raid with empty ship", BuksIndex + 1);
PBuksir [BuksIndex]. GoToRaid ();
PBuksir [BuksIndex]. SetFree ();
}
else
{
Console. WriteLine ("all buksirs are busy. ");
Thread. Sleep (1000);
FreeBusyBuks ();
}
Thread. Sleep (100);
}
}
public int FindFreeBuks ()
{
for (int i = 0; i < PBuksir. Count (); i++)
{
if (! PBuksir [i]. GetState ())
{
return i;
}
}
return - 1;
}
public void FreeBusyBuks ()
{
int BI;
for (BI = 0; BI < PBuksir. Count (); BI++)
{
if (PBuksir [BI]. GetState ())
{
if (PBuksir [BI]. ShowShip (). GetCargoType () == CargoType. Empty)
{
Console. WriteLine ("{0} buksir is on the way to raid", BI + 1);
PBuksir [BI]. GoToRaid ();
PBuksir [BI]. SetFree ();
}
else
{
Console. WriteLine ("{0} buksir is on the way to port", BI + 1);
PBuksir [BI]. GoToPort ();
int j = MatchBay (PBuksir [BI]);
PBays [j]. TakeFromBuks (PBuksir [BI]. ShowShip ());
PBuksir [BI]. SetFree ();
}
}
break;
}
}
public int MatchBay (Buksir _buks)
{
int num = 0;
for (int i = 0; i < PBays. Count (); i++)
{
if (_buks. ShowShip (). GetCargoType () == PBays [i]. GetEqType () &&! PBays [i]. GetState ()) num = i;
}
return num;
}
}
}
Класс Dispetch
namespace Port_Model
{
class Dispetch
{
public static void Start ()
{
Port port = new Port ();
string bays_count;
string buksir_count;
Console. WriteLine ("enter number of bays (number >= 4)");
bays_count = Console. ReadLine ();
Console. WriteLine ("enter number of buksirs");
buksir_count = Console. ReadLine ();
port. Start (Int32. Parse (bays_count), Int32. Parse (buksir_count));
Console. WriteLine ("FINISHED!");
Console. ReadKey ();
}
}
}
Класс Meteo
namespace Port_Model
{
class Meteo
{
public static bool Prognose ()
{
int result = (new Random ()). Next (0,3);
if (result == 0) return false;
else return true;
}
}
}
И, собственно, класс Program
namespace Port_Model
{
class Program
{
static void Main (string [] args)
{
Dispetch. Start ();
}
}
}
Размещено на Allbest.ru
Подобные документы
Построение модели прецедентов, модели пригодности для прецедента. Описание атрибутов и операций классов системы. Проектирование с применением методологии ICONIX. Построение диаграммы пригодности, диаграммы последовательностей и диаграмма классов.
курсовая работа [949,5 K], добавлен 25.05.2015Создание программы на языке C++, обеспечивающей ввод исходной информации, ее обработку, реализацию алгоритма имитации процесса и выдачу необходимой информации. Разработка имитационной модели очереди с разнотипными заявками (модели работы порта).
курсовая работа [563,8 K], добавлен 13.09.2012Основные теоретические положения объектно–ориентированной технологии программирования. Характеристика языка и словарь моделирования UML. Представление управления моделью. Построение диаграммы классов и описание функционирования предметной области.
курсовая работа [859,4 K], добавлен 11.05.2015Листинг класса для работы с регулярными выражениями. Особенности классов для проверки данных при регистрации и отправки сообщений. Отправка ссылки для активации на почту пользователя, описание основных классов, анализ их назначения и листинг функций.
курсовая работа [1,7 M], добавлен 17.09.2013Cтpyктypнaя модель функционирования пapикмaxepcкoй: описание временной диаграммы и Q-схемы системы. Разработка машинной имитационной модели на специализированном языке GPSS: составление блок-схемы, детализированного алгоритма и листинга программы.
курсовая работа [425,1 K], добавлен 02.07.2011Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.
курсовая работа [2,6 M], добавлен 17.11.2014Процесс проектирования программы, состоящий из следующих шагов: описание прецедентов, построение диаграммы прецедентов, диаграммы взаимодействий, создание модели программных классов. Тестирование программы входными тестовыми вариантами, ее листинг.
курсовая работа [1,9 M], добавлен 25.10.2012Разработка простейших классов на примере разработки моделей элементарных объектов и динамических информационных структур (одно и двунаправленных списков). Разработка простых классов. Вызывающая программа (main). Информационные динамические структуры.
творческая работа [17,5 K], добавлен 08.12.2007Унифицированный язык моделирования. Методы объектно-ориентированного анализа и проектирования. Создание диаграммы последовательности и диаграммы сотрудничества. Главная диаграмма классов. Добавление связей между классами. Зависимость между пакетами.
курсовая работа [2,7 M], добавлен 23.06.2011Описание модели в терминах PDEVS формализма с дискретными событиями DEJaView. Исследование принципов функционирования простейших моделей теории массового обслуживания, разработка ее алгоритма функционирования. Сущность терминов PDEVS под DEJaView.
курсовая работа [219,1 K], добавлен 31.10.2009