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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ средствами API реализовать http://www.cyberforum.ru/cpp-beginners/thread543597.html
средствами API реализовать. Определить суммарный размер всех файлов находящихся в каталоге(имя запрашиваем у пользователя).составить таблицу.которую записать в файл sum.txt,вида имя каталога/суммарный размер файлов в нём. если файл не входит. ни в какой подкаталог. то записи выглядят так: имя файла/его размер.Сделать проверку ошибок для всех функций из windows.h. модифицировать задачу, потребовав...
C++ Помогите пожалуйста написать программу в Microsoft Visual Studio 2010 (С++) Условие программы: Найти количество элементов, расположенных между минимальным и максимальным элементами массива. http://www.cyberforum.ru/cpp-beginners/thread543590.html
Как вводить в массивы переменные, различную символьную информацию C++
Всем доброго времени суток. Совсем недавно начал изучать самостоятельно язык C++ и уже появляются различного рода вопросы. Сейчас сижу на массивах. Тема как для меня лично сложная, не знаю ли, будет еще сложней какая-нибудь тема, но нужна сейчас именно помощь по массивам. Задач в учебнике много и я думаю по каждой будет появляться вопросы и чтобы не плодить много тем, буду спрашить все вопросы...
C++ задача на С++.(обработка строк)
Число записано в виде строки.Вывести самую большую цифру числа.Желательно поподробней ))
C++ Наследование http://www.cyberforum.ru/cpp-beginners/thread543527.html
Подскажите,пожалуйста,новичку в чем ошибка.Создал класс человек,создал класс студент,кот.наследует имя от класса человек.Может я тут чего лишнего налепил.Как-то с переменными типа int наследование понимаю,а вот с добавлением char,что-то не фурычит. Не судите строго.:) #include <iostream> #include <conio.h> #include <locale> using namespace std; class human { protected:
C++ Даны сведения о результатах аттестаци Добрый вечер. Помогите решить. Даны сведения о результатах аттестации: ФИО студента, название пяти предметов и баллы, полученные по каждому предмету. Вывести фамилии студентов, аттестованных по всем предметам. подробнее

Показать сообщение отдельно
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
09.04.2012, 18:52     Реализация банковской очереди
На вход подаются по 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-х очередей, то есть клиент приходит и выбирает в какую очередь встать на основании количества человек в каждой очереди
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru