Сборник задач и упражнений по курсу "Моделирование" (Событийный подход. Программное моделирование), страница 6

void inc_cur_cont(void) - увеличивает знначение cur_cont на 1;

void cur_cont_into_z(void) - обнуляет cur_cont:

void b_t(unsigned int t) - приравнивает begin_t к t;

void dmaxmin(unsigned int t) - корректирует максимальные и минимальные значения простоя самолета.

class Gen {

unsigned int time,

cont,

max_cont_t,

min_cont_t,

par_c[6500],

g_cont,

g_cont_t,

nonuse_time;

void maxmincont(unsigned t)

{

if(max_cont_t<t)

max_cont_t=t;

else if(min_cont_t>t)

min_cont_t=t;

}

void gen_cont(void);

public:

Gen() {time=0;cont=0;g_cont=0;

min_cont_t=max_cont_t=0;

g_cont_t=0;nonuse_time=0;

par_c[0]=0;}

void take_off_cont(void);

unsigned get_cont(void){return cont;}

unsigned get_time(void){return time;}

unsigned get_max(void){return max_cont_t;}

unsigned get_min(void){return min_cont_t;}

unsigned get_nt(void){return nonuse_time;}

unsigned get_g_cont(void){return g_cont;}

unsigned get_g_cont_t(void){return g_cont_t;}

void genarator(Fifo_a &fa,Aircraft *ac);

};

inline void Gen::gen_cont(void)

{time++;par_c[cont]=time;cont++;par_c[cont]=time;cont++;}

void Gen::genarator(Fifo_a &fa,Aircraft *ac)

{

unsigned char i=0;

gen_cont();

while(i<5){

if(time==ac[i].get_b()&&ac[i].get_f()==(unsigned char)1){

fa.write_f(i);

ac[i].write_f(0);

}

i++;

}

}

void Gen::take_off_cont(void)

{

unsigned i=0;

nonuse_time+=time-par_c[0];

if(g_cont==0)max_cont_t=min_cont_t=nonuse_time;

g_cont++;

g_cont_t=time;

maxmincont(time-par_c[0]);

cont--;

while(i<cont){

par_c[i]=par_c[i+1];

i++;

}

}

Класс Gen используется для создания объекта, который генерирует контейнеры и управляет самолетами:

time - переменная используется для хранения значения модельного времени;

cont - значение текущего количества контейнеров на складе;

max_cont_t,min_cont_t - максимальное и минимальное время нахождения контейнера на складе;

par_c[6500] - массив из 6500 элементов используется для хранения значения времени поступления на склад каждого контейнера;

g_cont - текущее количество взятых со склада контейнеров с начала моделирования;

g_cont_t - текущее время изъятия со склада последнего контейнера;

nonuse_time - сумма времени нахождения контейнеров на складе, включая время их погрузки;

void maxmincont(unsigned t) - корректирует значения max_cont_t и min_cont_t, сравнивая их с временем t;

void gen_cont(void) - данная функция записывает в конец массива 2 контейнера и увеличивает time на 1.Для каждого контейнера записывается время его поступления на склад в массив par_c ;

Конструктор класса устанавливает в 0 переменные time,max_cont_t,min_cont_t,cont,g_cont,nonuse_time, а также элемент массива par_c[0].

void take_off_cont(void) - функция берет один контейнер со склада для погрузки.Берется контейнер, который прибыл на склад раньше всех.

Работа функции.

К переменной nonuse_time прибавляется время простоя погружаемого контейнера.Если с начала моделирования контейнеры еще не отгружались,то max_cont_t=min_cont_t=nonuse_time.

Далее увеличивается на 1 число погруженных  и запоминается время погрузки контейнеров. Вызывается  функция maxmincont. В качестве параметра функции - простой контейнера. Затем уменьшается количество складируемых контейнеров на 1. Передвигаем информацию в массиве par_c о всех складируемых контейнерах на 1 элемент в направлении 0-го элемента начиная с 1-го элемента.

unsigned get_cont(void) - возвращает значение cont;

unsigned get_time(void) - возвращает значение time;

unsigned get_max(void),unsigned get_min(void) - возвращают значения переменных max_cont _t и min_cont_t;

unsigned get_nt(void) - возвращает значение  nonuse_time;

unsigned get_g_cont(void) - возвращает значение g_cont;

unsigned get_g_cont_t(void) - возвращает значение  g_cont_t.

Функция void genarator(Fifo_a &fa,Aircraft *ac) отводит память под счетчик i, вызывает функцию gen_cont. Для каждого из 5 самолетов сравнивается модельное время с временем прилета самолета, если он находится в полете. Если времена совпадают, то самолет ставится в очередь на обслуживание и у него изменяется флаг состояния.