Помощь - Поиск - Пользователи - Календарь
Полная версия: моделирование работы банка
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Tribunal
у меня такая задача:
В рамках системы массового обслуживания разработать программу для моделирования работы банка,обслуживающего клиентов.
Имеется банк,в котором N касс. Клиенты приходят в банк с интервалом F1(N1,N2) минут. Каждый кассир обслуживает клиента в течение F2(N3,N4) минут. Все клиенты находятся в очереди. После того, как кассир обслужил клиента, он может заняться другим клиентом, находящимся в очереди первым. Через определенный промежуток времени (N5 минут) у каждого кассира имеется перерыв (продолжительность N6 минут). После окончания времени работы (T минут ),все клиенты ,которые находятся в банке,должны быть обслужены. Здесь Fi(x,y) -некоторый закон распределения случайной велечины(может быть как равномерным,так и нормальным),зависящей от параметров x и y.
Нужен вывод результатов моделирования с указанием всех событий,призошедших в системе и статистика работы кассиров.

я хочу попробовать сделать так сказать взаимодействие между классами...
вот например
объект клиент,
объект-обработчик кассир,
объект-событие приход,очередь,начало обслуживания,конец обслуживание,и тд

только вот конкртено пока ничего сделать не могу.может есть какие-нибудь идеи?
или подскажете с чего начать?
volvo
Цитата
может есть какие-нибудь идеи?
yes2.gif
Есть... Например:

1) класс - "клиент":
class TClient {
// нужные тебе поля, скажем, ID клиента
};


2) класс - "очередь" (для универсальности сделай шаблонным):
template <class T>
class TQueue {
// реализация очереди, если нужно - могу привести
// реализацию С. Липпмана из "С++ Primer (2nd Edition)"
};


3) класс - "кассир"
class TCasher {
// Тут - все, что тебе нужно, например, состояние кассира
// (работает он или отдыхает), время окончания последнего перерыва, ...
};

(массив из N объектов TCasher для моделирования касс)

3) класс - "менеджер" - будет заниматься как раз управлением всеми процессами, происходящими в банке: приход клиента (поместили в очередь), проверили кассиров - есть свободный (проверили, не должен ли он отдохнуть, если должен - записали в статистику: "время такое-то, кассир №... - перерыв") - извлекли клиента из очереди, записали статистику: "время: ... клиент ID №... подошел к кассиру № ..."

как вариант: кассир САМ проверяет, не пришло ли ему время отдыха, и если он свободен и НЕ должен отдыхать, то посылает сообщение классу - "менеджеру", что, мол, "можно направить ко мне клиента"... НО все проходит через "менеджер" - статистика ведется именно им...
Tribunal
а как насчет взаимодействия классов?
мне особо непонятен именно этот момент...
не могли бы вы привести какой-нибудь пример?=)

кстати,реализация очереди не помешает=)...
только опять же непонятно,как её пименять...
volvo
Сейчас набросаю что-нибудь простое, чтобы понятна была структура...
Tribunal
а статус кассира стоит делать логической величиной?...)
и кстати как поступить с его конструктором?
volvo
Цитата
а статус кассира стоит делать логической величиной?...)
У кассира может быть больше 2-х состояний: он или занят, или отдыхает, или свободен и ждет клиента, так что здесь придется вводить свой тип - перечисление...

Вот такой набросок у меня получился (тестировал на TC++ 3.0, файл переименуй в *.CPP):
Tribunal
а что он делает и чего не делает?
и можно небольшие пояснения?=)

и еще вопрос:когда в классе переменные объвляются вне public,то с ними можно рабтать только внутри этого класса?
volvo
Цитата
а что он делает и чего не делает?
В принципе, делается все, что указано в задании, кроме того, что f1() и f2() возвращают не случайную функцию от 2-х аргументов, а просто случайное число...

Цитата
можно небольшие пояснения?
Позже в программу будут добавлены комментарии... А еще лучше - скажи, где именно непонятно, чтобы очевидные вещи не писать...

Цитата
когда в классе переменные объвляются вне public,то с ними можно рабтать только внутри этого класса?
Не только... Если они объявляются в protected (а это все-таки вне public), то доступ к ним есть из класса-наследника тоже... Кроме того, дружественная функция имеет полные права доступа к private-секциям класса...
Tribunal
мне бы смысловую нагрузку того,что написано....
а из конкретного мне не понятны выражения:
back -> next = pt;


exit(-1);


еще там есть строки с разделительными запятыми и последовательными присвоениями...ето как?=)
например:
if(!this_client) state = _waiting, changed = 1;


...?
TCasher(int _id, int _work):ID(_id), work_time(_work), state(_waiting)


и кстати,у меня вот в задании всё время измеряется в минутах...я так полагаю,что всё это дело нужно разделять на часы и минуты,так?
еще получается нужно задать время начала работы банка и конец работы...а как это сделать,если формат в часах-минутах?...может тогда изменять минутный счетчик...+часовой,если переваливают минуты за 60...хмм...или в программе просто работать только с минутами,а при выводе/вводе переводить в часы-минуты?
а в вашем "наброске" что есть work_time,working_time?...current_time я так понимаю и есть глобальный счетчик времени?
Tribunal
а где происходит передача начального значения current_time?здесь?
TManager :: TManager():current_time(0), after_prev_enter(0)
Tribunal
unsure.gif
в чем может быть причина того,что BorlandС++Builder5 ф-ия random считывается с stdlib.h,
а в CodeBlocks v1.0 нет?можно ли это исправить?
Tribunal
я вот попыталась написать ф-ию перевода времени из минут в часы-минуты...
int M,H;<-- глобальные переменные
...
clock(current_time);
cout << "casher #" << i << " goes to rest at:: " << H<<":"<<M << endl;
...
void clock(int time)
{
M=time;
H=0;
while (M>59)
{
M-=60;
H++;
};
}

ну и собственно что-то не так...на аргументы ругаются...
Алена
Цитата
я вот попыталась написать ф-ию перевода времени из минут в часы-минуты...
А зачем функция?
cout << "casher #" << i << " goes to rest at:: " << current_time / 60 <<":"<< current_time % 60 << endl;


Цитата
а из конкретного мне не понятны выражения:

1)
Цитата
back -> next = pt;
Ну попробуй начертить на бумаге очередь, и присоединить в ее хвост новый элемент... Что надо сделать? Ссылку старому "хвосту" на новый дать надо, чтобы очередь не закончилать на нем, а переходила дальше? Надо... Вот это и делается...

2)
Цитата
exit(-1);
Как ты собралась сигнализировать программе, что происходит попытка чтения из пустой очереди? Лучше уже корректно завершить программу, что сделает exit, чем программа вылетит с ошибкой "переход по нулевому указателю", например...

Цитата
еще там есть строки с разделительными запятыми и последовательными присвоениями...ето как?=)
Про оператор "запятая" не слышала? Выражения, перечисленные через запятую выполняются слева направо, то есть
if(!this_client) state = _waiting, changed = 1;
аналогично
if(!this_client) { 
state = _waiting; changed = 1;
}


А второй приведенный тобой случай - это форма вызова конструктора класса, так инициализируются, например, константные члены класса, ну, и остальные тоже можно инициализировать через запятую, хотя и не обязятельно, а вот константам ты обязана присвоить значения через "оператор - запятая"
Tribunal
а в принципе что за оператор -> ?=)
volvo
В Паскале разницу между
X.next
и
X^.next
чувствуешь? Второй - выбор поля по указателю... Это как раз и есть -> в С++
Tribunal
может всё-таки дадите комментарии по программе?=)
а то я никак не могу вникнуть в алгоритм=(
Tribunal
ну или опишите хотя бы сам алгоритм организации очереди и действия менеджера,пожалуйста...
volvo
Вот откомментированная программа (текст - файл в Unicode):
Нажмите для просмотра прикрепленного файла
Tribunal
огромное спасибо! smile.gif
Tribunal
а как насчет того,чтобы через какой-то промежуток времени давать клиенту возможность выбора уйти из очереди или нет,за исключением варианта,что он первый в очереди?
в общем вот здесь я добавила счетчик времени пребывания клиента в очереди.сделала для этого массив клиентов.есть ли в этом смысл?
if(after_prev_enter > f1())
{
after_prev_enter = 0;
TClient client(++client_entered);
clients[client_entered].time_in_queue=0;
queue.put(client);
}


и дальше добавила вот это:
 current_time += 1;

int k;
for (int i=0;i<client_entered;i++)
{
clients[i].time_in_queue++;
if (clients[i].time_in_queue==n7)
{
k=random(2)-1;
switch(k)
{
case 0: break;//клиент решает остаться
case 1: client(i-1)=queue.get;//клиент решает уйти<<---здесь вообще очень криво=(
}
}
}


может сделать как-то по-другому..подскажите,пожалуйста,Как? unsure.gif
volvo
Цитата
а как насчет того,чтобы через какой-то промежуток времени давать клиенту возможность выбора уйти из очереди или нет,за исключением варианта,что он первый в очереди?
Никак... Динамическая структура "Queue - Очередь" не допускает таких вольностей - это запрещено. Есть ВХОД и ВЫХОД. Доступа к определенному элементу (кроме первого) просто не существует... Если вошел - будь добр стоять до конца, иначе это должно реализовываться не очередью, а списком клиентов...

Переделывай всю программу... В следующий раз будешь СРАЗУ давать полное задание, что МОЖЕТ понадобиться, а что - нет...
Гость
Извините а на Паскале где-нибудь эту программку получить нельзя?

М
Здесь лежит программа на Паскале: Моделирование СМО
volvo

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.