Создание очереди банка

153
13 марта 2018, 02:56

Стоит задача смоделировать очередь банка. Поискал различную инфу в интернете и остановился на книге Каррано. Приведу похожий на мой код из какой-то статьи тут на форуме(мой код сейчас в статусе "перегрузка идей"). В данном коде, да и в книге, чтение нового клиента идет из файла, где уже в упорядоченном порядке расположены значения. Я же хочу сделать чтобы пользователь вводил только данные первого клиента, а далее клиенты появлялись в случайный промежуток времени, тем самым наполняя очередь, либо опустошая её. *И там еще несколько дополнений хочу ввести, но сейчас пока не о них". Вся проблема заключается в том, что в данной реализации очередь всегда пуста. Создаётся событие на приход, обрабатывается, создаётся событие на уход, создается событие на приход нового, обрабатывается событие ухода старого(удаление из очереди), обработка на приход нового(заполнение очереди). Я пытался сделать приход клиентов по времени. Т.е. чтобы их "создание" происходило через случайные промежутки времени(или в какой-то один промежуток времени, но в случайном количестве) и тем самым очередь бы оживала. Было много мыслей на этот счет, но все они оказались бредовыми(как мне кажется): пытался через 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);
}
READ ALSO
Проблема с кодировкой при работе с СУБД MySQL(Java JDBC)

Проблема с кодировкой при работе с СУБД MySQL(Java JDBC)

Здравствуйте при работе с СУБД MySQL возникла проблема с кодировкой русских символовВ базе данных все корректно отображаетсяи и в Java приложении...

170
Как закодировать запрос к API Yobit.net в HMAC_SHA512

Как закодировать запрос к API Yobit.net в HMAC_SHA512

Пытаюсь получить данные методом getInfo вот из этого API https://yobitnet/ru/api/

183
Не создается класс в IDEA?

Не создается класс в IDEA?

ЗдравствуйтеУстановил идею и возникла проблема не могу создать класс никакой - выходит сообщение -

121
Как узнать размер объекта (коллекции) в памяти?

Как узнать размер объекта (коллекции) в памяти?

Мне нужно узнать, сколько байт в оперативной памяти занимает определенная коллекция в моем приложении (ArrayList)Нужно это для того, чтобы представлять,...

217