Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

Реализация банковской очереди - C++

09.04.2012, 18:52. Просмотров 663. Ответов 4
Метки нет (Все метки)

На вход подаются по 2 числа. Первое - время, во сколько человек пришел и второе - сколько времени провел он в очереди.
Необходимо написать программу, реализующую данную очередь.
Программа написана, но есть небольшая проблема.
Вот мой код, описание проблемы ниже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// bank.cpp: определяет точку входа для консольного приложения.
//
 
#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);
}
В правильном варианте должно получиться следующее (на различия в выводимых сообщениях не смотрите, потом поправлю)
Время Событие
20 Посетитель № 1 прибыл в банк и начал оформление сделки
22 Посетитель № 2 прибыл в банк и встал в очередь
23 Посетитель № 3 прибыл в банк и встал в очередь
25 Посетитель № 1 покинул банк; началось обслуживание посетителя № 2
29 Посетитель № 2 покинул банк; началось обслуживгшие посетителя № 3
30 Посетитель № 4 прибыл в банк и встал в очередь
31 Посетитель № 3 покинул банк; началось обслуживание посетителя № 4
34 Посетитель № 4 покинул банк
Но получается следующее:
Время Событие
20 Посетитель встал в очередь
22 Посетитель встал в очередь
25 Посетитель покинул банк
23 Посетитель встал в очередь
29 Посетитель покинул банк
30 Посетитель встал в очередь
31 Посетитель покинул банк;
34 Посетитель № 4 покинул банк
Никак не могу исправить данную ошибку, прошу помощи.

Так же необходимо модифицировать данную программу на случай 3-х очередей, то есть клиент приходит и выбирает в какую очередь встать на основании количества человек в каждой очереди
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 18:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация банковской очереди (C++):

Реализация очереди из файла - C++
Здравствуйте! Возникла такая проблема. При считывании информации с файла, на экран выводится мусор.С int-овскими числами вывод очереди...

Реализация очереди на указателях - C++
Очередь на указателях: #include &lt;iostream&gt; using std::cin; using std::cout; using std::endl; const int Number = 10; enum...

Реализация очереди массивом - C++
Как реализовать очередь с помощью массива????

Программная реализация очереди - C++
Друзья, подскажите, почему не правильно работает программа, ругается на функцию EmptyQ программу надо запускать в консольном приложении в...

Реализация очереди: код не компилируется - C++
Все сделал по методичке где ошибка? не компилируется.... #include&quot;stdafx.h&quot; #include&quot;iostream&quot; #include&quot;conio.h&quot; using...

Реализация очереди на базе массива - C++
реализация очереди на базе массива . код С

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.04.2012, 18:58 #2
После беглого просмотра не нашёл в коде нигде других строчек кроме " Клиент встал в очередь" и "Клиент покинул очередь"
Что ты ожидал кроме них увидеть?
Ты же сам писал код?
Или ты просишь помочь дописать строчки вроде "Посетитель № 1 покинул банк; началось обслуживание посетителя № 2"
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
10.04.2012, 16:28  [ТС] #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
После беглого просмотра не нашёл в коде нигде других строчек кроме " Клиент встал в очередь" и "Клиент покинул очередь"
Что ты ожидал кроме них увидеть?
Ты же сам писал код?
Или ты просишь помочь дописать строчки вроде "Посетитель № 1 покинул банк; началось обслуживание посетителя № 2"
Я привел то что должно быть и то, что есть. клиент с временем прибытия 25 встает в очередь раньше, чем из нее выходит клиент с временем отбытия 23!
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
10.04.2012, 17:39 #4
По-моему ты выбрал не ту структуру данных. Да, задача называется "Банковская очередь", но по условию в файле может запросто оказаться, что первый клиент пришёл в очередь и простоял в ней весь день, а второй-третий и четвёртый клиенты успели прийти и уйти. Такое поведение не характерно для очереди.
тут скорее нужен просто список событий, для добавления в который элемента нужно его вставить в список в соответствии с порядком времени события.
Например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
struct event{
    bool is_arrive;
    int its_time;
    int id;
};
int main(){
    list<struct event> the_queue;
    list<struct event>::iterator it;
    struct event new_event;
    int id=0;
    int arrived, departed;
    while(!feof(arrivalFile)){
        id++;
        scanf("%d %d", &arrived, &departed);
        departed=departed+arrived
        it=the_queue.begin();
        while (it->its_time<arrived)it++;
        new_event.id=id;
        new_event.is_arrive=true;
        new_event.its_time=arrived;
        the_queue.insert(it, new_event);  
 
        while (it->its_time<arrived)it++;
        new_event.id=id;
        new_event.is_arrive=false;
        new_event.its_time=departed;
        the_queue.insert(it, new_event);
    }
 
 
    it=the_queue.begin();
    while (it!=the_queue.end()){
        printf("Время %d. Посетитель %d ");
        if (is_arrive) printf("пришёл в банк\n"); else printf("ушёл из банка\n");
    }
    return 0;
}
Но предупреждаю: я в STL плохо разбираюсь, мог ошибиться с итераторами.
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
10.04.2012, 18:53  [ТС] #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
По-моему ты выбрал не ту структуру данных. Да, задача называется "Банковская очередь", но по условию в файле может запросто оказаться, что первый клиент пришёл в очередь и простоял в ней весь день, а второй-третий и четвёртый клиенты успели прийти и уйти. Такое поведение не характерно для очереди.
тут скорее нужен просто список событий, для добавления в который элемента нужно его вставить в список в соответствии с порядком времени события.
Например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
struct event{
    bool is_arrive;
    int its_time;
    int id;
};
int main(){
    list<struct event> the_queue;
    list<struct event>::iterator it;
    struct event new_event;
    int id=0;
    int arrived, departed;
    while(!feof(arrivalFile)){
        id++;
        scanf("%d %d", &arrived, &departed);
        departed=departed+arrived
        it=the_queue.begin();
        while (it->its_time<arrived)it++;
        new_event.id=id;
        new_event.is_arrive=true;
        new_event.its_time=arrived;
        the_queue.insert(it, new_event);  
 
        while (it->its_time<arrived)it++;
        new_event.id=id;
        new_event.is_arrive=false;
        new_event.its_time=departed;
        the_queue.insert(it, new_event);
    }
 
 
    it=the_queue.begin();
    while (it!=the_queue.end()){
        printf("Время %d. Посетитель %d ");
        if (is_arrive) printf("пришёл в банк\n"); else printf("ушёл из банка\n");
    }
    return 0;
}
Но предупреждаю: я в STL плохо разбираюсь, мог ошибиться с итераторами.

спасибо, но это задание на работу с очередями...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2012, 18:53
Привет! Вот еще темы с ответами:

Реализация списков , стеков, очереди - C++
Скажите где можно почитать про создание односвязных\двусвязных списков, стеков, очередей. Интересует порядок создания. Что за чем должно...

Простейшая реализация стека и очереди - C++
Имеется пример реализации стека: #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class Stack { private: ...

Реализация в виде класса очереди с приоритетом. - C++
День добрый, возникла проблема с представлением требования от задачи: если разбирать по компонентом, то я понимаю что они из себя...

Реализация очереди на основе связанного списка - C++
Реализация очереди на основе связанного списка в строках хэдэра tmp-&gt;ch.name = ch1.name; tmp-&gt;ch.surname = ch1.surname; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2012, 18:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru