Модель функционирования морского порта

Проектирование объектно-ориентированных моделей реальных систем на примере модели функционирования морского грузового порта. Описание классов и методов. Структура и диаграмма классов. Особенности функционирования программы. Средство разработки и листинг.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 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.2013

  • Cт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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.