IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> моделирование работы банка, с++
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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

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

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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

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


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


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

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

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

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


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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

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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Сейчас набросаю что-нибудь простое, чтобы понятна была структура...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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


Прикрепленные файлы
Прикрепленный файл  BANK.PAS ( 3.86 килобайт ) Кол-во скачиваний: 479
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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

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

Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

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

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


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


мне бы смысловую нагрузку того,что написано....
а из конкретного мне не понятны выражения:
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 -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


а где происходит передача начального значения current_time?здесь?
TManager :: TManager():current_time(0), after_prev_enter(0)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


я вот попыталась написать ф-ию перевода времени из минут в часы-минуты...
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++;
};
}

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

Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






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


А второй приведенный тобой случай - это форма вызова конструктора класса, так инициализируются, например, константные члены класса, ну, и остальные тоже можно инициализировать через запятую, хотя и не обязятельно, а вот константам ты обязана присвоить значения через "оператор - запятая"
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






В Паскале разницу между
X.next
и
X^.next
чувствуешь? Второй - выбор поля по указателю... Это как раз и есть -> в С++
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Вот откомментированная программа (текст - файл в Unicode):
Прикрепленный файл  bank.txt ( 16.02 килобайт ) Кол-во скачиваний: 694
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 17:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name