Стоит задача смоделировать очередь банка. Поискал различную инфу в интернете и остановился на книге Каррано. Приведу похожий на мой код из какой-то статьи тут на форуме(мой код сейчас в статусе "перегрузка идей"). В данном коде, да и в книге, чтение нового клиента идет из файла, где уже в упорядоченном порядке расположены значения. Я же хочу сделать чтобы пользователь вводил только данные первого клиента, а далее клиенты появлялись в случайный промежуток времени, тем самым наполняя очередь, либо опустошая её. *И там еще несколько дополнений хочу ввести, но сейчас пока не о них". Вся проблема заключается в том, что в данной реализации очередь всегда пуста. Создаётся событие на приход, обрабатывается, создаётся событие на уход, создается событие на приход нового, обрабатывается событие ухода старого(удаление из очереди), обработка на приход нового(заполнение очереди). Я пытался сделать приход клиентов по времени. Т.е. чтобы их "создание" происходило через случайные промежутки времени(или в какой-то один промежуток времени, но в случайном количестве) и тем самым очередь бы оживала. Было много мыслей на этот счет, но все они оказались бредовыми(как мне кажется): пытался через alarm, делал рандомные промежутки через которые запускалось бы создание, но получается что, если через 3 секунды(или другой промежуток времени) создалось событие на приход нового(аля создался клиент), то оно обрабатывается быстрее, чем заполняется очередь(моё предположение). Думал вставлять после определённых операций генератор случ. чисел, и если число попадало в определённый диапозон, то создавать событие прибытия. Думал создать цикл for с условием от 1 до n, где n случайно генерируемое число, и в цикле создавать клиентов, но мне кажется , что есть более рациональные способы.
Подскажите как мне создать "живую" очередь.
(P.S. далее я собираюсь попробовать все это анимировать, поэтому мне нужно, чтобы элементы в очереди не шли в строгом порядке(один пришел-обслужился и ушел- пришел другой-обслужился и ушел и т.д.) а были случайны (пришел один стал в очередь, другой пришел стал в очередь, оба успели сделать свои дела и пока что очередь пуста, потом снова набралась очередь т.д.))
P.S. время прибытия (.time) и продолжительность обслуживания(.duration) задаются случайно, думаю, что придется в списке событий еще проводить сортировку по события прихода в порядке возрастания времени прибытия(хотел так сделать: curentTime = rand()%10+cerentTime, но все равно придётся сортировку делать)
И еще, немного не по теме, но мне кажется в данном операторе(его теле) if(!bankQueue.empty()), что-то не так, т.к. я вижу, что там в поле duration просто записывается продолжительность первого клиента, а поидее там надо записывать данные след клиента, если я все верно понимаю.
Слишком много текста, прошу прощения, я хотел как можно более подробно расписать проблему
Прошу тапками не закидывать, мне всего лишь надо узнать как создать более менее живую очередь.
#include "stdafx.h"
#include<list>
#include<queue>
#include <iostream>
using namespace std;
struct ListItem
{
int time,duration;
bool is_arrive;
};
struct QueueItem //кто пришёл, кто стоит время и продолжительность
{
int time, duration;
};
//глобальные переменные, используем шаблоны
list<ListItem> eventList;
queue<QueueItem> bankQueue;
int currentTime=0;
FILE *arrivalFile;
void processArrival(ListItem arrivalEvent)
{
bool atFront=bankQueue.empty();
QueueItem newQElem;
newQElem.time=arrivalEvent.time;
newQElem.duration=arrivalEvent.duration;
bankQueue.push(newQElem);
eventList.pop_front();
//cout<<newQElem.time<<" "<<newQElem.duration<<endl;
//если очередь была пустой, создаем новое событие отбытия
if (atFront)
{
ListItem dipEvent;
currentTime=currentTime+newQElem.duration;
dipEvent.duration=newQElem.duration;
dipEvent.time=currentTime;
dipEvent.is_arrive=false;
eventList.push_back(dipEvent);
//cout<<dipEvent.time<<" "<<dipEvent.duration<<endl;
}
if(!feof(arrivalFile))
{
cout<<currentTime<<endl;
ListItem curEvent;
fscanf(arrivalFile,"%d %d", &curEvent.time,&curEvent.duration);
//cout<<curEvent.time<<" "<<curEvent.duration<<endl;
curEvent.is_arrive=true;
eventList.push_back(curEvent);
cout<<curEvent.time<<" Клиент встал в очередь"<<endl;
//cout<<curEvent.time<<" "<<curEvent.duration<<endl;
}
}
void processDeparture(ListItem depEvent)
{ bankQueue.pop();
bool atFront=bankQueue.empty();
QueueItem newQElem;
newQElem.time=depEvent.time;
newQElem.duration=depEvent.duration;
eventList.pop_front();
if(!bankQueue.empty())
{
ListItem dipEvent;
currentTime=currentTime+newQElem.duration;
dipEvent.duration=newQElem.duration;
dipEvent.time=currentTime;
dipEvent.is_arrive=false;
eventList.push_back(dipEvent);
}
}
void main()
{
setlocale(LC_ALL,"rus");
int t1=0,t2=0,k=0,sum=0;
double sr=0;
ListItem cur_event;
arrivalFile=fopen("text.txt","r");
fscanf(arrivalFile,"%d %d", &cur_event.time,&cur_event.duration);
cout<<cur_event.time<<" Клиент встал в очередь"<<endl;
cur_event.is_arrive=true;
currentTime=cur_event.time;//текущее время когда пришел первый
eventList.push_back(cur_event);
while(!eventList.empty())
{
ListItem newEvent=eventList.front();
if (newEvent.is_arrive)
{
//cout<<"processArrival"<<endl;
processArrival(newEvent);
//cout<<newEvent.time<<" "<<newEvent.duration<<endl;
t1=newEvent.time;
}
else
{
//cout<<"processDeparture"<<endl;
processDeparture(newEvent);
//cout<<newEvent.time<<" "<<newEvent.duration<<endl;cout<<endl;
if(k!=0)
sum+=t2-t1;
t2=newEvent.time;
k++;
cout<<newEvent.time<<" Клиент покинул очередь"<<endl;
}
}
//cout<<sum<<" "<<k<<endl;cout<<endl;
sr=double(sum)/double(k);
cout<<"Среднее значение: "<<sr<<endl;cout<<endl;
fclose(arrivalFile);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте при работе с СУБД MySQL возникла проблема с кодировкой русских символовВ базе данных все корректно отображаетсяи и в Java приложении...
Пытаюсь получить данные методом getInfo вот из этого API https://yobitnet/ru/api/
ЗдравствуйтеУстановил идею и возникла проблема не могу создать класс никакой - выходит сообщение -
Мне нужно узнать, сколько байт в оперативной памяти занимает определенная коллекция в моем приложении (ArrayList)Нужно это для того, чтобы представлять,...