Помощь - Поиск - Пользователи - Календарь
Полная версия: моделирование работы банка
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
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

azithromycin for chlamydia side
Buy Propecia Paypal
gabriella
Your writings and news are really interesting to me. There are numerous advantages to the contents. Thank you so much. My site:: โอเล่777
reznit
Надо получить правильную дендрограмму, т.е все возможные кластера.
nishaknapp
Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. The South Koreans’ Love for Gambling
gabriella
I’m hoping you would share your thoughts on how important it is to reply to comments on your blog.
poker-dewa88.net

Добавлено через 16 мин.
I’m hoping you would share your thoughts on how important it is to reply to comments on your blog.
hunter-game.org
Pierce
It is critical to have high-quality content in terms of attracting people to come see the website, and that is exactly what this website provides. My site: 바카라
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.