typedef struct item
{
long arrive; /* время присоединения клиента к очереди */
int processtime; /* желаемое количество минут консультации */
} Item;
Для преобразования пакета очереди, чтобы он обрабатывал эту структуру, а не тип int, использованный в последнем примере, достаточно заменить предыдущее опрсде-
756 Глава 17 лсиие typedef типа Item приведенным выше. После этого вам не придется беспокоиться о деталях функционирования очереди. Вместо этого вы сможете сосредоточить все внимание на реальной задаче — моделировании очереди к киоску Зигмунда.
Рассмотрим один из возможных подходов. Пусть отсчет времени осуществляется одноминутными интервалами. Тогда каждую минуту необходимо проверять, не появился ли новый клиент. Если клиент подошел, и очередь не переполнена, клиента необходимо добавить в очередь. Это предусматривает запись в структуру Item времени прибытия клиента и длительности консультации, которую клиент желает оплатить, с последующим добавлением элемента в очередь. Однако если очередь полна, клиента нужно отправить. В целях учета мы будем отслеживать общее число клиентов и общее количество “отказов” (людей, которые не могут стать в очередь, поскольку она переполнена).
Далее потребуется обработать начало очереди. То есть, если очередь не пуста и Зигмунд не занят обслуживанием предыдущего клиента, необходимо удалить элемент из начала очереди. Вспомните, что элемент содержит показание времени присоединения клиента к очереди. Сравнивая это показание с текущим временем, мы получаем время нахождения клиента в очереди (в минутах). Элемент содержит также количество минут, в течение которых клиент желает получить консультацию; это значение определяет интервал, на протяжении которого Зигмунд будет занят обслуживанием нового клиента. Для отслеживания времени ожидания мы применяем переменную. Если Зигмунд занят, из очереди никто не удаляется, но значение переменной для отслеживания времени ожидания должно декрементироваться.
Основной код может выглядеть похожим на показанный далее, при этом каждый цикл соответствует одной минуте активности:

Обратите внимание, что разрешение времени является относительно грубым (одна мииуга), так что максимальное количество клиентов в час составляет всего 60.
Расширенное представление данных 757
Ниже представлены краткие описания некоторых переменных и функций.
• min per cust — среднее количество минут между прибытиями клиентов.
• newcustomer() использует функцию rand() языка С для определения, появляется ли клиент в течение этой конкретной минуты.
• turnaways — количество прибывших клиентов, которым было отказано в обслуживании.
• customers — количество прибывающих клиентов, которые становятся в очередь.
• temp — переменная типа Item, описывающая нового клиента.
• customertime() устанавливает члены arrive и processtime структуры temp.
• wait time — количество минут, остающееся до того момента, когда Зигмунд завершит консультирование текущего клиента.
• line wait — накапливаемое значение времени, потраченное в очереди всеми клиентами на текущий момент.
• served — количество действительно обслуженных клиентов.
• sum line — накапливаемое значение длины очереди на текущий момент.
Только подумайте, насколько более запутанным и непонятным выглядел бы код, если бы он оказался усыпанным вызовами функций malloc() и free() и указателями на узлы. Наличие пакета очереди позволяет сосредоточиться на задаче моделирования, не отвлекаясь на детали программирования.
Полный код для моделирования консультационного киоска в торговом центре представлен в листинге 17.9. В соответствие с методом, предложенным в главе 12, для генерации случайных значений применяются стандартные функции rand(), srand() и time(). Чтобы можно было использовать программу, обновите определение типа Item в файле queue.h следующим образом:
typedef struct item
{
long arrive; // время присоединения клиента к очереди
int processtime; // желаемое количество минут консультации
} Item;
Не забудьте также выполнить компоновку mall.с с queue.с.
Листинг 17.9. Программа mall.с

758 глава 17


Читать дальше