vectors with a queue of pointers
Думал решить самостоятельно, но у меня уже не хватает полученных мною знаний (а самое главное времени).
Суть такова: Перед открытием двух железнодорожных касс сформировались 2 очереди пассажиров, причем некоторые из них находятся сразу в обеих очередях. Для каждого пассажира известны его места в очередях и необходимое время обслуживания. Если у какого-либо пассажира очереди подходят одновременно, то он обслуживается в первой кассе.
Промоделировать работу касс, выдавая последовательно информацию об обслуживании пассажиров.
В итоге я не могу понять, почему не корректно работают условия по проверке пассажира в двух кассах. Я предполагаю, что я не правильно работаю с итераторами. Прошу помочь объяснить (а если и покажите верное решение, то я буду вам очень благодарен).
Тестовые данные в текстовом файле: [a 3] [b 2] [a 2] [a 3] [e 8] [b 2] [a 5] [a 2] [b 2] [b 3] [b 5] [a 3] [e 5] [b 3] [a 5] [b 6] (просто вставить), где a - 1 касса, b - 2 касса, e - в 2-ух кассах
#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
struct Passenger { //пассажир структура
char queue_pos;
int service_time;
Passenger* next;
};
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream file("passengers.txt"); //файл с которого читаем
vector<Passenger> cash_register_1; //касса 1
vector<Passenger> cash_register_2; //касса 2
Passenger* top = 0; //список пуст
string str;
char k, queue_cash;
int time = 0;
while (!file.eof()) //запись пассажиров в кассы
{
file >> k;
if (k == '[')
{
while (k != ']') //чтение данных пассажира
{
file >> k;
if ((k >= '1') && (k <= '9'))
{
time = k - '0';
}
if ((k == 'a') || (k == 'b') || (k == 'e'))
{
queue_cash = k;
}
}
Passenger* c = new Passenger; //запись пассажира в кассы
c->queue_pos = queue_cash;
c->service_time = time;
c->next = top;
top = c;
if (c->queue_pos == 'a')
{
cash_register_1.push_back({ queue_cash, time });
}
if (c->queue_pos == 'b')
{
cash_register_2.push_back({ queue_cash, time });
}
if (c->queue_pos == 'e')
{
cash_register_1.push_back({ queue_cash, time });
cash_register_2.push_back({ queue_cash, time });
}
}
}
if ((cash_register_1.empty()) && (cash_register_2.empty())) //свободны ли кассы
{
cout << "Ошибка: Обе кассы свободные" << endl;
}
else//заполнены
{
int reg1 = 0;
int reg2 = 0;
cash_register_1[reg1];
cash_register_2[reg2];
//проверка вектора
//for (int i = 0; i < cash_register_1.size(); i++)
//{
// printf("%d", cash_register_1[reg1].service_time);
// reg1 += 1;
//}
//cout << " ";
//for (int i = 0; i < cash_register_2.size(); i++)
//{
// printf("%d", cash_register_2[reg2].service_time);
// reg2 += 1;
//}
while ((!cash_register_1.empty()) || (!cash_register_2.empty()))
{//начало проверки пассажира в двух кассах
if ((cash_register_1[reg1].queue_pos == 'e') || (cash_register_2[reg2].queue_pos == 'e')) //проверка на наличие в двух кассах
{
if ((cash_register_1[reg1].queue_pos == 'e') && (cash_register_2[reg2].queue_pos == 'e')) //если в первой и в второй одновременно
{
cash_register_2.erase(cash_register_2.begin());
cash_register_1.erase(cash_register_1.begin());
}
else
{
if (cash_register_1[reg1].queue_pos == 'e') //если только в первой
{
vector<Passenger> ::iterator it = cash_register_2.begin();
auto& iter = *it;
do
{
if (it -> service_time == 'e')
{
cash_register_2.erase(it);
}
reg2 += 1;
it += 1;
} while (cash_register_2[reg2].queue_pos != 'e');
}
if (cash_register_2[reg2].queue_pos == 'e') //если только в второй
{
vector<Passenger> ::iterator it = cash_register_1.begin();
auto& iter = *it;
do
{
if (cash_register_1[reg1].queue_pos == 'e')
{
cash_register_1.erase(it);
}
reg1 += 1;
} while (cash_register_1[reg1].queue_pos != 'e');
}
}
}//конец проверки пассажира в двух кассах
if (cash_register_1[reg1].service_time > cash_register_2[reg2].service_time) //если 1 > 2
{
cash_register_1[reg1].service_time = cash_register_1[reg1].service_time - cash_register_2[reg2].service_time;
cash_register_2.erase(cash_register_2.begin());
printf("%d", cash_register_1[reg1].service_time);
printf("%s", " ");
printf("%d", cash_register_2[reg2].service_time);
printf("%s", "\n");
}
else
{
if (cash_register_1[reg1].service_time < cash_register_2[reg2].service_time) //если 1 < 2
{
cash_register_2[reg2].service_time = cash_register_2[reg2].service_time - cash_register_1[reg1].service_time;
cash_register_1.erase(cash_register_1.begin());
printf("%d", cash_register_1[reg1].service_time);
printf("%s", " ");
printf("%d", cash_register_2[reg2].service_time);
printf("%s", "\n");
}
else
{
if (cash_register_1[reg1].service_time == cash_register_2[reg2].service_time) //если равны
{
cash_register_1.erase(cash_register_1.begin());
cash_register_2.erase(cash_register_2.begin());
printf("%d", cash_register_1[reg1].service_time);
printf("%s", " ");
printf("%d", cash_register_2[reg2].service_time);
printf("%s", "\n");
}
}
}
}
}
return 0;
}
Ответы (1 шт):
Может кому поможет. Эта полностью рабочая программа. Если хотите, можете юзануть некоторые моменты в отдельные функции
#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
struct Passenger { //пассажир структура
char Name;
int service_time;
Passenger* next;
};
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream file("passengers.txt"); //файл с которого читаем
vector<Passenger> cash_register_1; //касса 1
vector<Passenger> cash_register_2; //касса 2
Passenger* top = 0; //список пуст
string str;
char k, name = ' ';
int time = 0, pos = 0, i = 0;
while (!file.eof()) //запись пассажиров в кассы
{
file >> k;
while (pos == 0)
{
file >> k;
if ((k >= 'A') && (k <= 'Z'))
{
while (k != ')')
{
if ((k >= 'A') && (k <= 'Z'))
{
name = k;
}
if ((k >= '1') && (k <= '9'))
{
time = k - '0';
}
file >> k;
}
Passenger* c = new Passenger;
c->Name = name;
c->service_time = time;
c->next = top;
top = c;
cash_register_1.push_back({ name, time });
}
if (k == ';')
{
pos = 1;
}
}
while (pos == 1)
{
file >> k;
if ((k >= 'A') && (k <= 'Z'))
{
while (k != ')')
{
if ((k >= 'A') && (k <= 'Z'))
{
name = k;
}
if ((k >= '1') && (k <= '9'))
{
time = k - '0';
}
file >> k;
}
Passenger* c = new Passenger;
c->Name = name;
c->service_time = time;
c->next = top;
top = c;
cash_register_2.push_back({ name, time });
}
if (k == ';')
{
pos = 2;
}
}
}
if ((cash_register_1.empty()) && (cash_register_2.empty())) //свободны ли кассы
{
cout << "Ошибка: Обе кассы свободные" << endl;
}
else//заполнены
{
int reg1 = 0, reg2 = 0;
cout << "Пассажиры 1 кассы: ";
for (int i = 0; i < cash_register_1.size(); i++)
{
printf("%c", cash_register_1[reg1].Name);
reg1 += 1;
cout << " ";
}
cout << endl;
cout << "Пассажиры 2 кассы: ";
for (int i = 0; i < cash_register_2.size(); i++)
{
printf("%c", cash_register_2[reg2].Name);
reg2 += 1;
cout << " ";
}
cout << endl;
reg1 = 0, reg2 = 0;
int total1 = 0, total2 = 0;
int i = 0, m = 1;
total1 = total1 + cash_register_1[reg1].service_time;
total2 = total2 + cash_register_2[reg2].service_time;
while ((reg1 != cash_register_1.size()) || (reg2 != cash_register_2.size()))
{
if ((reg1 == cash_register_1.size()) || (reg2 == cash_register_2.size())) //проверка, если остались какие-либо пустые вектора
{
break;
}
if (cash_register_1[reg1].Name == cash_register_2[reg2].Name)
{
vector<Passenger> ::iterator it = cash_register_2.begin(); //удаляем из 2 кассы
auto& iter = *it;
i = 0, m = 1;
char id_passenger = cash_register_1[reg1].Name;
while (i < cash_register_2.size())
{
if (it->Name == id_passenger)
{
cash_register_2.erase(it);
i = cash_register_2.size();
}
else
{
if (m != cash_register_2.size())
{
it += 1;
m += 1;
}
else
{
i = cash_register_2.size();
}
}
}
}
else
{
vector<Passenger> ::iterator it = cash_register_2.begin(); //удаляем из 2 кассы
auto& iter = *it;
i = 0, m = 1;
char id_passenger = cash_register_1[reg1].Name;
while (i < cash_register_2.size())
{
if (it->Name == id_passenger)
{
cash_register_2.erase(it);
i = cash_register_2.size();
}
else
{
if (m != cash_register_2.size())
{
it += 1;
m += 1;
}
else
{
i = cash_register_2.size();
}
}
}
vector<Passenger> ::iterator itt = cash_register_1.begin(); //удаляем из 1 кассы
auto& ites = *itt;
i = 0, m = 1;
id_passenger = cash_register_2[reg2].Name;
while (i < cash_register_1.size())
{
if (itt->Name == id_passenger)
{
cash_register_1.erase(itt);
i = cash_register_1.size();
}
else
{
if (m != cash_register_1.size())
{
itt += 1;
m += 1;
}
else
{
i = cash_register_1.size();
}
}
}
if (total1 > total2)
{
if (reg2 == cash_register_2.size())
{
break;
}
else
{
reg2 += 1;
total2 = total2 + cash_register_2[reg2].service_time;
}
}
else
{
if (total1 < total2)
{
if (reg1 == cash_register_1.size())
{
break;
}
else
{
reg1 += 1;
total1 = total1 + cash_register_1[reg1].service_time;
}
}
else
{
if (reg1 != cash_register_1.size())
{
reg2 += 1;
}
if (reg2 != cash_register_2.size())
{
reg1 += 1;
}
}
}
}
}
reg1 = 0, reg2 = 0, total1 = 0, total2 = 0;
cout << "Пассажиры 1 кассы, которые были обслужены: ";
for (int i = 0; i < cash_register_1.size(); i++)
{
printf("%c", cash_register_1[reg1].Name);
cout << '[' << total1 << ',';
total1 = total1 + cash_register_1[reg1].service_time;
cout << total1 << ']';
reg1 += 1;
cout << " ";
}
cout << endl;
cout << "Пассажиры 2 кассы, которые были обслужены: ";
for (int i = 0; i < cash_register_2.size(); i++)
{
printf("%c", cash_register_2[reg2].Name);
cout << '[' << total2 << ',';
total2 = total2 + cash_register_2[reg2].service_time;
cout << total2 << ']';
reg2 += 1;
cout << " ";
}
cout << endl;
}
cout << "Все пассажиры обслужены в кассах" << endl;
return 0;
}