Цель работы
Целью работы является приобретение навыков проектирования объектно-ориентированных моделей реальных систем.
программа модель объектный ориентированный
Задание
Морской грузовой порт
Включает: причалы (до 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;
}CargoType GetEqType ()
{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 ();;
}
}();
}void Process ()
{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 ();
}
}
}