Модель функционирования морского порта
Цель работы
Целью работы является приобретение навыков проектирования
объектно-ориентированных моделей реальных систем.
программа модель объектный ориентированный
Задание
Морской
грузовой порт
Включает: причалы (до 6) с погрузочно-разгрузочным
оборудованием определенного типа: для металла, для леса, для зерна и т.п.; рейд
(место в акватории порта, где пришедшие суда дожидаются очереди на
погрузку/разгрузку); буксиры для проводки судов рейд-причал и обратно;
диспетчерскую службу для контроля погрузки/разгрузки; гидрометеоролога
(контроль за состоянием моря и атмосферы).
Пояснения: моделируем процесс погрузки - разгрузки
кораблей. Корабль может быть с грузом определенного вида, разгруженный,
находиться на причале или на рейде. При разгрузке/погрузке груз на корабле
должен соответствовать п/р комплексу на причале. После разгрузки диспетчер
переводит корабль от причала на рейд, а загруженный корабль - с рейда на
причал. При проводке корабля сводка погоды должна быть удовлетворительной, для
чего перед проводкой запрашивается прогноз. Если прогноз штормовой, то корабли
остаются на рейде, а корабли от причалов буксируются на рейд. Все п/р работы
прекращаются.
Описание
классов и методов
Класс, описывающий корабль - Ship. Он, содержит
информацию, такую как тип груза, перевозимого судном и состояние судна (на
рейде или нет).
Класс, описывающий рейд - Raid. Он, содержит в себе
контейнер с кораблями а также функции для взаимодействия с буксирами.
Класс, описывающий причал - Bay. Он, содержит в себе
информацию о типе разгружаемого груза, состоянии причала (занят/свободен), а
также включает в себя объект класса Ship и содержит в себе функции, сигнализирующие об
изменении состояния, а также взаимодействии с буксиром и кораблём. От класса Bay есть четыре производных
класса, по типу разгружаемого материала. Отличаются от родительского класса они
конструкторами, инициализирующими при своём вызове соответствующие поля.
Класс, описывающий буксир - Buksir. Он, содержит в себе
информацию о своём состоянии, включает в себя объект класса Ship, а также описывает
методы для взаимодействия с причалом, кораблём и рейдом. А ещё, буксир в пути
может сломаться, что приведёт к паузе в его работе, пока он чинится.
Класс, описывающий порт - Port. Он включает в себя
объекты классов Bay, Raid и Buksir. В этом классе происходит инициализация всей структуры, а также
описаны основные процессы работы порта.
Есть ещё класс Meteo, содержащий один единственный статический
метод прогноза погоды, а также класс Dispetch, по сути являющийся
интерфейсом пользователя. В классе Dispetch, реализован выбор пользователем
количества буксиров и причалов в порту, а также последующий запуск работы
самого порта.
Структура
классов
Ship
CargoType Cargo;
bool IsOnRaid;Ship (int _cr)Ship
SetCargoType (CargoType _carg)CargoType GetCargoType ()
Raid
List<Ship> Ships = new
List<Ship> ();Raid ()int GetCount ()Ship GiveToBuks ()
Bay
protected CargoType
Equipment;bool IsBusy;Ship BShip;Ship Unload ()Bay TakeFromBuks (Ship
_ship)CargoType GetEqType ()bool GetState ()Ship ShowShip ()
MetalBay: Bay
public MetalBay ()
Остальные три производных класса аналогичны (отличаются
только имена классов и их конструкторов соответственно), не будем тратить бумаг
у на переписывание по сути, одного и того же.
Buksir
Ship BShip;IsBusy;IsOnRaid;Buksir
()Buksir TakeFromRaid (Ship _ship)Buksir TakeFromPort (Ship _ship)Buksir
GoToRaid ()Buksir GoToPort ()bool GetState ()Buksir SetFree ()Ship ShowShip
()bool GetPosition ()bool BreakNRepair ()
Port
Bay [] PBays;[]
PBuksir;PRaid;void Start (int _bayCount, int _buksCount)void Process ()int
FindFreeBuks ()void FreeBusyBuks ()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
{,,,,
}Ship
{Cargo;IsOnRaid;Ship (int _cr)
{(_cr)
{0:= CargoType. Metal;=
true;;1:= CargoType. Meal;= true;;2:= CargoType. Tree;= true;;:= CargoType.
Coal;= true;;
}
}Ship SetCargoType (CargoType
_carg)
{= _carg;this;
}CargoType GetCargoType ()
{Cargo;
}
}
}
Класс Raid
namespace Port_Model
{Raid
{<Ship> Ships = new
List<Ship> ();Raid ()
{rand = new Random ();r = rand.
Next (10, 25);(int i = 0; i < r; i++)
{cr = rand. Next (0,4);. Add
(new Ship (cr));
}
}int GetCount ()
{Ships. Count;
}Ship GiveToBuks ()
{BShip = Ships. Last ();. Remove
(Ships. Last ());BShip;
}
}
}
Класс Bay
class Bay
{CargoType Equipment;bool
IsBusy;Ship BShip;
// virtual public Bay ();
// virtual public Ship Unload
();Ship Unload ()
{. Sleep (1000);. SetCargoType
(CargoType. Empty);BShip;
}Bay TakeFromBuks (Ship _ship)
{= _ship;this;
{Equipment;
}bool GetState ()
{IsBusy;
}Ship ShowShip ()
{BShip;
}
}
Класс MetalBay
class MetalBay: Bay
{MetalBay ()
{= CargoType. Metal;= false;
}
}
Класс TreeBay
class TreeBay: Bay
{TreeBay ()
{= CargoType. Tree;= false;
}
}
Класс MealBay
class MealBay: Bay
{MealBay ()
{= CargoType. Meal;= false;
}
}
Класс CoalBay
class CoalBay: Bay
{CoalBay ()
{= CargoType. Coal;= false;
}
}
Класс Buksir
namespace Port_Model
{Buksir
{BShip;IsBusy;IsOnRaid;Index;Buksir
()
{= false;= false;
}Buksir TakeFromRaid (Ship
_ship)
{= _ship;this;
}Buksir TakeFromPort (Ship
_ship)
{= _ship;this;
}Buksir GoToRaid ()
{= true;. Sleep (1000);=
true;this;
}Buksir GoToPort ()
{= true;. Sleep (1000);=
false;this;
}bool GetState ()
{IsBusy;
}Buksir SetFree ()
{= false;= null;this;
}Ship ShowShip ()
{BShip;
}bool GetPosition ()
{IsOnRaid;
}Buksir SetCounter (int _count)
{= _count;this;
}bool BreakNRepair ()
{result = (new Random ()). Next
(0,10);(result == 5)
{true;
}return false;
}
}
}
Класс Port
namespace Port_Model
{Port
{[] PBays;[] PBuksir;PRaid;void
Start (int _bayCount, int _buksCount)
{= new Bay [_bayCount];= new
Buksir [_buksCount];(int i = 0; i < PBuksir. Count (); i++)[i] = new Buksir
();= new Raid ();[0] = new MetalBay ();[1] = new TreeBay ();[2] = new MealBay
();[3] = new CoalBay ();rand = new Random ();(int i = 4; i < PBays. Count
(); i++)
{r = rand. Next (0,4);(r)
{0:[i] = new MetalBay ();;1:[i]
= new TreeBay ();;2:[i] = new MealBay ();;:[i] = new CoalBay ();;
}
}();
{BuksIndex, BayIndex;(PRaid.
GetCount ()! = 0)
{(! Meteo. Prognose ())
{. WriteLine ("Bad weather,
work temporaly stopped. ");
}. WriteLine ("{0} ships
are on the raid", PRaid. GetCount ());= FindFreeBuks ();(BuksIndex! = - 1)
{(! PBuksir [BuksIndex].
GetPosition ())
{. WriteLine ("{0} buksir
is on the way to raid", BuksIndex + 1);[BuksIndex]. GoToRaid ();
}(PBuksir [BuksIndex].
BreakNRepair ())
{. WriteLine ("{0} buksir
is broken, reparing.", BuksIndex + 1);. Sleep (3000);
}[BuksIndex]. TakeFromRaid
(PRaid. GiveToBuks ());= MatchBay (PBuksir [BuksIndex]);. WriteLine ("{0}
buksir is on the way to {1} bay with the {2} ship", BuksIndex + 1,
BayIndex + 1, PBuksir [BuksIndex]. ShowShip (). GetCargoType ());[BuksIndex].
GoToPort ();[BayIndex]. TakeFromBuks (PBuksir [BuksIndex]. ShowShip ());.
WriteLine ("Unloading. ");[BayIndex]. Unload ();(FindFreeBuks () == -
1) FreeBusyBuks ();BuksIndex = FindFreeBuks ();[BuksIndex]. TakeFromPort (PBays
[BayIndex]. ShowShip ());. WriteLine ("{0} buksir is on the way to raid
with empty ship", BuksIndex + 1);[BuksIndex]. GoToRaid ();[BuksIndex].
SetFree ();
}
{. WriteLine ("all buksirs
are busy. ");. Sleep (1000);();
}. Sleep (100);
}
}int FindFreeBuks ()
{(int i = 0; i < PBuksir.
Count (); i++)
{(! PBuksir [i]. GetState ())
{i;
}
}- 1;
}void FreeBusyBuks ()
{BI;(BI = 0; BI < PBuksir.
Count (); BI++)
{(PBuksir [BI]. GetState ())
{(PBuksir [BI]. ShowShip ().
GetCargoType () == CargoType. Empty)
{. WriteLine ("{0} buksir
is on the way to raid", BI + 1);[BI]. GoToRaid ();[BI]. SetFree ();
}
{. WriteLine ("{0} buksir
is on the way to port", BI + 1);[BI]. GoToPort ();j = MatchBay (PBuksir
[BI]);[j]. TakeFromBuks (PBuksir [BI]. ShowShip ());[BI]. SetFree ();
}
};
}
}int MatchBay (Buksir _buks)
{num = 0;(int i = 0; i <
PBays. Count (); i++)
{(_buks. ShowShip ().
GetCargoType () == PBays [i]. GetEqType () &&! PBays [i]. GetState ())
num = i;
}num;
}
}
}
Класс Dispetch
namespace Port_Model
{Dispetch
{static void Start ()
{port = new Port
();bays_count;buksir_count;. WriteLine ("enter number of bays (number
>= 4)");_count = Console. ReadLine ();. WriteLine ("enter number
of buksirs");_count = Console. ReadLine ();. Start (Int32. Parse
(bays_count), Int32. Parse (buksir_count));. WriteLine
("FINISHED!");. ReadKey ();
}
}
}
Класс Meteo
namespace Port_Model
{Meteo
{static bool Prognose ()
{result = (new Random ()). Next
(0,3);(result == 0) return false;return true;
}
}
}
И, собственно, класс Program
namespace Port_Model
{Program
{void Main (string [] args)
{. Start ();
}
}
}