Автор работы: Пользователь скрыл имя, 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
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 находится
в очереди на отчаливание.
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_
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 находится
в очереди на отчаливание.
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_
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_
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_
}
void Tug::stormEnd()
{
to_sEnd=-1;
to_sStart=(int)(get_exp(storm_
if (to_sStart==0) to_sStart=1;
choice();
}
void Tug::Arrival_Sea() //прибытие танкера типов 1,2,3
{
to_arrival=get_uniform(arr_
entered++;
Tanker *ptr=new Tanker(); //создаем новый танкер
//Шторма нет, буксир свободен, танкер сразу идет на причаливание
if ((to_sEnd==-1)&&(serving==
{
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==
{
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==
{
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/
//Отбывает танкер типов 1,2,3
if (serving->type<4)
{
completed1++;
soj1_Ave=soj1_Ave*(1-1.0/
//Объект
для неименованной заявки
delete serving;
}
else //отбывает танкер четвертого типа
{
completed2++;
soj2_Ave=soj2_Ave*(1-1.0/
serving->state=9;
//Отправляем
танкер четвертого типа в
((Tanker4*)serving)->to_
//Сброс времени пребывания в порту
serving->minutes=0;
}
serving=NULL;
//Пока отчаливали, начался шторм. Буксир отдыхает
if (to_sEnd>0) return;
//Шторма
нет. Выбираем следующий
choice();
}
void Tug::Arrival()
{
to_in=-1;
//Сообщаем в порт о прибытии танкера на погрузку
((Port*)p)->Arrival(serving);
serving=NULL;
//Пока
причаливали, начался шторм.