Функционирование программы




Цель работы

 

Целью работы является приобретение навыков проектирования объектно-ориентированных моделей реальных систем.

программа модель объектный ориентированный

Задание

 

Морской грузовой порт

 

Включает: причалы (до 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 ();

}

}

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: