Автор работы: Пользователь скрыл имя, 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
if (to_sEnd>0) return;
choice();
}
void Tug::run()
{
int k;
if (to_sStart>0) to_sStart--;
if (to_sStart==0) stormStart();
if (to_sEnd>0) to_sEnd--;
if (to_sEnd==0) stormEnd();
if (to_arrival>0) to_arrival--;
if (to_arrival==0) Arrival_Sea();
if (to_in>0) to_in--;
if (to_in==0) Arrival();
if (to_out>0) to_out--;
if (to_out==0) Departure();
ListNode<Tanker> *ptr=queue_in;
//Инкремент времени пребывания для всех танкеров, которые в данный момент
//контролирует буксир
while(ptr!=NULL)
{
ptr->Data()->minutes++;
ptr=ptr->Next();
}
ptr=queue_out;
while(ptr!=NULL)
{
ptr->Data()->minutes++;
ptr=ptr->Next();
}
if (serving!=NULL) serving->minutes++;
//Запись статистики - один раз в час
if ((total+1)%60==0)
{
k=(total+1)/60;
// fprintf(q_tugIn,"%d\n", que_inLength);
q_tugInAve=q_tugInAve*(1-1.0/
// fprintf(q_tugOut,"%d\n", que_outLength);
q_tugOutAve=q_tugOutAve*(1-1.
}
if (serving!=NULL) ro_tug++;
}
void Tug::putPort(Port *a)
{
p=a;
}
void Tug::Print()
{
if (to_sStart==-1)
printf("Буксир не работает из-за шторма\n");
else if (to_in>0)
printf("Буксир
помогает причалить танкеру
else if (to_out>0)
printf("Буксир помогает отчалить танкеру типа %d\n", serving->type);
else
printf("Буксир простаивает, так как некого обслуживать\n");
}
//Конструктор для класса Port
Port::Port()
{
int i;
queue=NULL;
serving=new Tanker *[volume];
to_serve=new int[volume];
for(i=0;i<volume;i++)
{
serving[i]=NULL;
to_serve[i]=-1;
}
q_length=0;
}
//Деструктор для класса Port
Port::~Port()
{
delete[] to_serve;
delete [] serving;
}
void Port::Arrival(Tanker *t)
{
int i;
//Проверяем, есть ли свободный терминал
i=FirstAvail();
if (i!=-1) //есть, стразу ставим танкер на погрузку
{
serving[i]=t;
to_serve[i]=get_uniform(t->
serving[i]->state=5;
}
else //нет, ставим танкер в очередь
{
q_length++;
ListNode<Tanker> *ptr=new ListNode<Tanker>(t, NULL);
if (queue==NULL) queue=ptr;
else ListAdd<Tanker>(queue, ptr);
t->state=4;
}
}
void Port::Complete(int i)
{
//Отправляем загруженный танкер к буксиру
((Tug*)t)->Arrival_coast(
to_serve[i]=-1;
serving[i]=NULL;
if (queue==NULL) return;
//Очередь
не пуста, ставим на
serving[i]=queue->Data();
to_serve[i]=get_uniform(
serving[i]->state=5;
queue=queue->Next();
q_length--;
}
void Port::run()
{
int k;
//Проверка
завершения обслуживания и
for(int i=0;i<volume;i++)
{
if (to_serve[i]>0) { serving[i]->minutes++; to_serve[i]--; }
if (to_serve[i]==0) Complete(i);
}
ListNode<Tanker> *ptr=queue;
while(ptr!=NULL)
{
ptr->Data()->minutes++;
ptr=ptr->Next();
}
//Запись статистики - 1 раз в час
if ((total+1)%60==0)
{
k=(total+1)/60;
// fprintf(q_loading,"%d\n", q_length);
q_loadAve=q_loadAve*(1-1.0/k)+
ro_port=ro_port*(1-1.0/k)+((
}
}
void Port::Print()
{
printf("В очереди на погрузку находятся %d танкеров\n", q_length);
printf("Заняты погрузкой %d терминалов\n", Busy());
for(int i=0;i<volume;i++)
printf("%d-й терминал обслуживает танкер типа %d\n", i+1, serving[i]->type);
}
int Port::FirstAvail()
{
for(int i=0;i<volume;i++)
if (serving[i]==NULL) return(i);
return(-1);
}
int Port::Busy()
//вычисление текущего
{
int k=0;
for(int i=0;i<volume;i++)
if (serving[i]!=NULL) k++;
return(k);
}
void Port::putTug(Tug *a)
{
t=a;
}
А.3.
Файл list.h
template <class Type>
class ListNode {
public:
ListNode<Type> *next;
Type *data;
ListNode(Type *d, ListNode<Type> *n);
~ListNode();
Type *Data();
ListNode<Type> *Next();
void PutNext(ListNode<Type> *n);
void Print();
};
template <class Type>
ListNode<Type>::ListNode(Type *d, ListNode<Type> *n) : next(n), data(d) {}
template <class Type>
ListNode<Type>::~ListNode()
{
delete data;
}
template <class Type>
Type *ListNode<Type>::Data()
{
return data;
}
template <class Type>
ListNode<Type> *ListNode<Type>::Next()
{
return next;
}
template <class Type>
void ListNode<Type>::PutNext(
{
next=n;
}
template <class Type>
void ListNode<Type>::Print()
{
data->Print();
}
template <class Type>
void ListAdd(ListNode<Type> *head, ListNode<Type> *li)
{
ListNode<Type> *old, *v;
for (v=head; v!=NULL; v=v->Next())
old=v;
old->PutNext(li);
}
template <class Type>
ListNode<Type> *ListDelete(ListNode<Type> *head, ListNode<Type> *li)
{
int j;
ListNode<Type> *old, *o1;
if (li==head)
{
o1=head->Next();
delete li;
return o1;
}
for (ListNode<Type>* v=head; v!=li; v=v->Next())
old=v;
o1=li->Next();
old->PutNext(o1);
delete li;
return head;
}
template <class Type>
void ListPrint(ListNode<Type> *head)
{
for (ListNode<Type>* v=head; v!=NULL; v=v->Next())
v->Print();
}
template <class Type>
int ListCount(ListNode<Type> *head)
{
int i; i=0;
for (ListNode<Type>* v=head; v!=NULL; v=v->Next())
{
v->Print();
i++;
}
return i;
}
А.4.
Файл random.h
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
float get_exp(float mu) //генератор случайных чисел, распределенных
//экспоненциально (см. главу 3)
{
int r_num; float root, right;
r_num=rand();
right=((float)r_num)/(RAND_
root=-log(1-right)/mu;
return(root);
}
int get_uniform(int a, int b)
{ //Генерация
равномерно распределенной
int x, y;