Моделирование работы порта

Автор работы: Пользователь скрыл имя, 01 Февраля 2011 в 22:35, курсовая работа

Краткое описание

Целью данной курсовой работы является закрепление теоретических основ и практических аспектов имитационного моделирования систем.

В курсовой работе необходимо выполнить следующие задания:

- анализ предметной области;

- анализ программных средств, которые используются для моделирования систем;

- разработать программу;

- провести тестирование;

- оформить объяснительную записку.

Содержание работы

ВВЕДЕНИЕ……………………………………………………………………
РАЗДЕЛ 1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ……………………………

1.1. Основные понятия теории очередей……………………………………

1.2. Моделирование работы порта……………………………………………

1.3. Модельное время…………………………………………………………

1.4. Выводы……………………………………………………………………

РАЗДЕЛ 2 ОБОСНОВАНИЕ ВЫБОРА ПРОГРАММНЫХ СРЕДСТВ……

2.1. Стандартная библиотека STL……………………………………………

2.2. Выводы……………………………………………………………………

РАЗДЕЛ 3 ОПИСАНИЕ РАЗРАБОТАННОГО

ПРОГРАММНОГО ПРОДУКТА……………………………………………

3.1. Классы и объекты…………………………………………………………

3.2. События и методы…………………………………………………………

3.3. Реализация интерфейса……………………………………………………

3.4. Выводы……………………………………………………………………

РАЗДЕЛ 4 РУКОВОДСТВО ПРОГРАММИСТА……………………………

4.1. Назначение и условия применения программы…………………………

4.2. Состав программного продукта…………………………………………

4.3. Входные и исходные данные……………………………………………

РАЗДЕЛ 5 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ……………………………

5.1. Назначение программы…………………………………………………

5.2. Условия выполнения программы…………………………………………

5.3. Сообщение пользователю…………………………………………………

ВЫВОДЫ………………………………………………………………………

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………

Приложение А Текст программы……………………………………………
6

Содержимое работы - 1 файл

kursovoy.doc

— 324.50 Кб (Скачать файл)

void putPort(Port *a);

void choice();                    //выбор танкера для обслуживания

void Print();

};

//Класс  Порт

class Port

{

const static int volume=3;

ListNode<Tanker> *queue;          //очередь  на погрузку

Tanker **serving;                 //загружаемые танкеры

int *to_serve;                    //время до окончания погрузки

int q_length;                     //длина очереди

void *t;                          //указатель на буксир

public:

  Port();

  ~Port();

  void Arrival(Tanker *a);         //прибытие  танкера

  void Complete(int i);            //завершение погрузки

  void putTug(Tug *a);

  void Print();

  int FirstAvail();

  int Busy();

  void run();                      //диспетчер

};

Tanker::Tanker()

{

int r;

id=entered;

minutes=0;

//Разыгрывание  типа танкера

r=rand()%100+1;

if (r>=25) type=1;

else if (r<=55) type=2;

else type=3;

switch(type)

{

  case 1: median=1080; offset=120; break;

  case 2: median=1440; offset=180; break; 

  case 3: median=2160; offset=240; break; 

}

}

void Tanker::Print()

{

  switch(state)

  {

   case 1: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Штормит\n", id, type); break;

   case 2: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Шторма  нет\n", id, type); break;

   case 3: printf("Танкер № %ld типа %d причаливает\n", id, type); break;

   case 4: printf("Танкер № %ld типа %d находится  в порту в очереди на погрузку\n", id, type); break;

   case 5: printf("Танкер № %ld типа %d грузится  в порту\n", id, type); break;

   case 6: printf("Танкер № %ld типа %d находится  в очереди на отчаливание. Штормит\n", id, type); break;

   case 7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;

   case 8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;

  }

}

//Начальное  состояние танкера четвертого  типа - 9

Tanker4::Tanker4(int i)

{

id=i;

minutes=0;

state=9;

type=4;

to_arrival=get_uniform(median_path, offset_path);

median=1260;

offset=180;

}

void Tanker4::putTug(Tug *a)

{

  t=a;

}

void Tanker4::Print()

{

  switch(state)

  {

   case 1: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Штормит\n", id, type); break;

   case 2: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Шторма  нет\n", id, type); break;

   case 3: printf("Танкер № %ld типа %d причаливает\n", id, type); break;

   case 4: printf("Танкер № %ld типа %d находится в порту в очереди на погрузку\n", id, type); break;

   case 5: printf("Танкер № %ld типа %d грузится  в порту\n", id, type); break;

   case 6: printf("Танкер № %ld типа %d находится  в очереди на отчаливание. Штормит\n", id, type); break;

   case 7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;

   case 8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;

   case 9: printf("Танкер № %ld типа %d находится  в пути\n", id, type); break;

  }

 }

void Tanker4::run()

{

  if (state==9) to_arrival--;

//Танкер  прибыл из Великобритании и  сообщает об этом буксиру

  if (to_arrival==0) ((Tug*)t)->Arrival_Sea(this);

}

//В начальном  состоянии буксир свободен, очереди  пусты

Tug::Tug()

{

to_arrival=get_uniform(arr_median, arr_offset);

serving=NULL;

to_in=-1;

to_out=-1;

queue_in=NULL;

queue_out=NULL;

que_inLength=0;

que_outLength=0;

to_sStart=(int)(get_exp(storm_mu)*60);

if (to_sStart==0) to_sStart=1;

to_sEnd=-1;

}

void Tug::choice()

{

//Очередь на причаливание не пуста, ей - приоритет

if (queue_in!=NULL)

if (que_inLength>0)

{

  to_in=time_path;

  que_inLength--;

  serving=queue_in->Data();    //голову очереди - на обслуживание

  queue_in=queue_in->Next();   //продвижение очереди

}

//Заявок  на причаливание нет, а на отчаливание - есть

else if (que_outLength>0)

{

  to_out=time_path;

  que_outLength--;

  serving=queue_out->Data();

  queue_out=queue_out->Next();

}

return;

}

void Tug::stormStart()

{

to_sStart=-1;

to_sEnd=get_uniform(storm_median, storm_offset);

}

void Tug::stormEnd()

{

to_sEnd=-1;

to_sStart=(int)(get_exp(storm_mu)*60);

if (to_sStart==0) to_sStart=1;

choice();

}

void Tug::Arrival_Sea()        //прибытие танкера типов 1,2,3

{

to_arrival=get_uniform(arr_median, arr_offset); 

entered++;

  Tanker *ptr=new Tanker();    //создаем новый танкер

//Шторма  нет, буксир свободен, танкер сразу  идет на причаливание

if ((to_sEnd==-1)&&(serving==NULL))

{

  serving=ptr;

  to_in=time_path; 

  serving->state=3;

  return;

}

//Танкер  ставится в очередь

que_inLength++;

ListNode<Tanker> *ptr1=new ListNode<Tanker>(ptr, NULL);

/*if (queue_in)*/queue_in=ptr1;

//else ListAdd<Tanker>(queue_in, ptr1);

//Назначение  танкеру номера состояния в  зависимости от наличия шторма

if (to_sEnd>0) ptr->state=1;

else ptr->state=2;

return;

}

void Tug::Arrival_Sea(Tanker4 *t)

{

entered++;

t->to_arrival=-1;

if ((to_sEnd==-1)&&(serving==NULL))

{

  serving=t;

  to_in=time_path; 

  serving->state=3;

  return;

}

que_inLength++;

ListNode<Tanker> *ptr1=new ListNode<Tanker>(t, NULL);

if (queue_in==NULL) queue_in=ptr1;

else ListAdd<Tanker>(queue_in, ptr1);

if (to_sEnd>0) t->state=1;

else t->state=2;

return;

}

void Tug::Arrival_coast(Tanker *t)     //прибытие танкера  на отчаливание

{

if ((to_sEnd==-1)&&(serving==NULL))   //шторма нет, буксир свободен

{

  serving=t;

  to_out=time_path; 

  serving->state=8;

  return;

}

que_outLength++;

ListNode<Tanker> *ptr1=new ListNode<Tanker>(t, NULL);

if (queue_out==NULL) queue_out=ptr1;

else ListAdd<Tanker>(queue_out, ptr1);

if (to_sEnd>0) t->state=6;

else t->state=7;

return;

}

void Tug::Departure()

{

to_out=-1;

//Фиксация  времени пребывания в порту отбывающего танкера

// fprintf(sojourn,"%.3f\n", (float)serving->minutes/60);

completed++;

//Пересчет  среднего времени  пребывания

soj_Ave=soj_Ave*(1-1.0/completed)+(float)(serving->minutes)/completed;

//Отбывает  танкер типов 1,2,3

if (serving->type<4)

{

  completed1++;

  soj1_Ave=soj1_Ave*(1-1.0/completed1)+(float)(serving->minutes)/completed1;

//Объект  для неименованной заявки удаляется  из системы

  delete serving;

}

else   //отбывает танкер четвертого  типа

{

  completed2++;

  soj2_Ave=soj2_Ave*(1-1.0/completed2)+(float)(serving->minutes)/completed2;

  serving->state=9;

//Отправляем  танкер четвертого типа в Великобританию

  ((Tanker4*)serving)->to_arrival=get_uniform(((Tanker4*)serving)->median_path, ((Tanker4*)serving)->offset_path);

//Сброс  времени пребывания в порту

  serving->minutes=0;

}

serving=NULL;

//Пока  отчаливали, начался шторм. Буксир  отдыхает

if (to_sEnd>0)  return;

//Шторма  нет. Выбираем следующий танкер  на обслуживание

choice();

}

void Tug::Arrival()

{

to_in=-1;

//Сообщаем  в порт о прибытии танкера  на погрузку

((Port*)p)->Arrival(serving);

serving=NULL;

//Пока  причаливали, начался шторм. Буксир  отдыхает

Информация о работе Моделирование работы порта