Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ моделирование работы банка

Автор: Tribunal 2.12.2006 10:43

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

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

только вот конкртено пока ничего сделать не могу.может есть какие-нибудь идеи?
или подскажете с чего начать?

Автор: volvo 2.12.2006 20:15

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

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


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


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

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

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

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

Автор: Tribunal 2.12.2006 20:27

а как насчет взаимодействия классов?
мне особо непонятен именно этот момент...
не могли бы вы привести какой-нибудь пример?=)

кстати,реализация очереди не помешает=)...
только опять же непонятно,как её пименять...

Автор: volvo 2.12.2006 20:32

Сейчас набросаю что-нибудь простое, чтобы понятна была структура...

Автор: Tribunal 2.12.2006 22:00

а статус кассира стоит делать логической величиной?...)
и кстати как поступить с его конструктором?

Автор: volvo 2.12.2006 22:51

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

Вот такой набросок у меня получился (тестировал на TC++ 3.0, файл переименуй в *.CPP):



Прикрепленные файлы
Прикрепленный файл  BANK.PAS ( 3.86 килобайт ) Кол-во скачиваний: 479

Автор: Tribunal 2.12.2006 23:19

а что он делает и чего не делает?
и можно небольшие пояснения?=)

и еще вопрос:когда в классе переменные объвляются вне public,то с ними можно рабтать только внутри этого класса?

Автор: volvo 3.12.2006 0:14

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

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

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

Автор: Tribunal 3.12.2006 9:59

мне бы смысловую нагрузку того,что написано....
а из конкретного мне не понятны выражения:

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 3.12.2006 12:04

а где происходит передача начального значения current_time?здесь?

TManager :: TManager():current_time(0), after_prev_enter(0)

Автор: Tribunal 3.12.2006 12:30

unsure.gif
в чем может быть причина того,что BorlandС++Builder5 ф-ия random считывается с stdlib.h,
а в CodeBlocks v1.0 нет?можно ли это исправить?

Автор: Tribunal 3.12.2006 13:02

я вот попыталась написать ф-ию перевода времени из минут в часы-минуты...

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++;
};
}

ну и собственно что-то не так...на аргументы ругаются...

Автор: Алена 3.12.2006 13:22

Цитата
я вот попыталась написать ф-ию перевода времени из минут в часы-минуты...
А зачем функция?
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 3.12.2006 14:26

а в принципе что за оператор -> ?=)

Автор: volvo 3.12.2006 14:35

В Паскале разницу между

X.next
и
X^.next
чувствуешь? Второй - выбор поля по указателю... Это как раз и есть -> в С++

Автор: Tribunal 4.12.2006 17:13

может всё-таки дадите комментарии по программе?=)
а то я никак не могу вникнуть в алгоритм=(

Автор: Tribunal 4.12.2006 19:10

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

Автор: volvo 4.12.2006 21:55

Вот откомментированная программа (текст - файл в Unicode):
Прикрепленный файл  bank.txt ( 16.02 килобайт ) Кол-во скачиваний: 695

Автор: Tribunal 4.12.2006 22:56

огромное спасибо! smile.gif

Автор: Tribunal 25.01.2007 16:28

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

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 25.01.2007 16:36

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

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

Автор: Гость 28.01.2007 21:21

Извините а на Паскале где-нибудь эту программку получить нельзя?

М
Здесь лежит программа на Паскале: http://forum.pascal.net.ru/index.php?s=&showtopic=15420&view=findpost&p=90430
volvo


Автор: azithromycin for chlamydia side 5.12.2021 6:30

Buy Propecia Paypal

Автор: gabriella 12.04.2022 10:04

Your writings and news are really interesting to me. There are numerous advantages to the contents. Thank you so much. My site:: https://www.chokdeebacarrat.com/ole777/

Автор: reznit 9.06.2022 15:16

Надо получить правильную дендрограмму, т.е все возможные кластера.

Автор: nishaknapp 29.07.2022 16:58

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. https://www.tastybooktours.com/lifestyle/the-south-koreans-love-for-gambling/

Автор: gabriella 1.08.2022 9:40

I’m hoping you would share your thoughts on how important it is to reply to comments on your blog.
https://poker-dewa88.net

Добавлено через 16 мин.
I’m hoping you would share your thoughts on how important it is to reply to comments on your blog.
https://hunter-game.org

Автор: Pierce 15.10.2022 9:11

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: https://name-pics.com/ko-kr/바카라/