Я слишком долго задерживался на этой проблеме (6+ часов -_-).Loop не ведет себя правильно
Я пытаюсь создать простую систему бронирования плавания в C++. Я закончил 90% из них, единственное, что дает мне неприятности показывает доступные временные интервалы, а именно:
для отображения всех временных интервалов, которые доступны для бронирования (Пример показан на рис 2 На рисунке «x» означает, что во временном интервале нет плавающего инструктора, «J/A/P/M/K» означает J (Jeff), A (Anna), P (Peter), M (Michael) и K (Kerry) доступны во временном интервале, «J/A/P» означает, что J (Jeff), A (Anna) и P (Peter) доступны во временном интервале, но M (Майкл) и K (Керри) недоступны в временном интервале.)
Для этой задачи я создал функцию «Получить доступность» внутри моего «класса расписания» (я попытаюсь объяснить это, когда пойду). Функция выглядит следующим образом:
bool Schedule::GetAvailability(int day, int time, int trainer){
bool available;
if(_bookingVector.empty()){
return true;
} else{
for(int i = 0; i < _bookingVector.size(); ++i){
int bTempTime = _bookingVector[i].GetTime();
int bTempDay = _bookingVector[i].GetDay();
int bTempTrainer = _bookingVector[i].GetTrainer();
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
available= false;
}else{
available= true;
}
}
}
return available;
}
Все это делает метод является доступ вектор, который хранит индивидуальные заказы как объекты моего класса «заказы». Каждый объект бронирования содержит день, время и переменную тренера. Этот метод проходит через вектор и обращается к каждому объекту бронирования, чтобы получить вышеупомянутую информацию. Затем он проверяет информацию на входные параметры при вызове метода.
Это нормально работает, я проверил его несколько раз и вернул true/false правильно в зависимости от этого ввода.
Я называю этот метод в моем методе отображения, который является:
void Schedule::DisplaySchedule(){
// Create the 2d array
std::string **table;
table = new string*[_rows];
for (unsigned int row = 0; row < _rows; row++){
table[row] = new string[_cols];
}
//Fill 2d array with ""
for(int row = 0; row < _rows; row++){
for(int col = 0; col < _cols; col++){
table[row][col] = "";
}
}
//insert available trainers to correct cell
for(unsigned int row = 0; row < _rows; row++){
for(unsigned int col = 0; col < _cols; col++){
for(unsigned int x = 0; x < sizeof(_trainers)/sizeof(_trainers[0]); x++){
bool available = GetAvailability(col, row, x);
if(available == true){
table[row][col] += _trainers[x][0];
}else{
table[row][col] += "";
}
}
}
}
//DisplayDebug(); //shows debugging display
// Print out table
cout << "---------------------------------------------------------------" << endl;
for(unsigned int i = 0; i < ((sizeof(_days))/(sizeof(_days[0]))); i++){
cout << setw(_width) << _days[i];
}
cout << endl;
cout << "---------------------------------------------------------------" << endl;
cout << endl;
for(int row = 0; row < _rows; row++){
int x = 0;
cout << _timeslots[row];
for (int col = 0; col < _cols; col++){
cout << setw(_width) << table[row][col];
}
cout << endl;
}
delete table; //clean up
}
Эта функция создает таблицу, которая показывает доступные тренеры:
Соответствующая часть этой функции заключается в следующем :
//insert available trainers to correct cell
for(unsigned int row = 0; row < _rows; row++){
for(unsigned int col = 0; col < _cols; col++){
for(unsigned int x = 0; x < sizeof(_trainers)/sizeof(_trainers[0]); x++){
bool available = GetAvailability(col, row, x);
if(available == true){
table[row][col] += _trainers[x][0];
}else{
table[row][col] += "";
}
}
}
}
«ряд "цикл повторяется через каждый временной интервал, а цикл" col "повторяется каждый день. Последний цикл повторяется через массив, который содержит имя каждого тренера (в объектах бронирования, тренер хранит число от 0 до 4, что соответствует положению тренера в массиве _trainers (так что «0» будет jeff , «1» будет анна и т.д.)):
std::string _trainers [5] = {"Jeff", "Anna", "Peter", "Micheal", "Kerry"};
Таким образом, в пределах этого цикла функция «GetAvailability» называется, с «строка, столбец, и х» в качестве параметров.
В моей голове это должно работать нормально, каждый раз, когда я повторяю это, он должен добавить первую букву названия доступных тренеров в ячейку таблицы. Но это не то, что он делает.
Он работает только для одного заказа, так, если я номер на первом временном интервале на понедельник, из-пут будет правильным:
Это показывает, что все остальные тренеры доступны в этом конкретном временном интервале, за исключением jeff, у которого есть заказ. Но теперь, если я сделаю второй номер с анной, (так же временные интервалы, в понедельник, с анна) я получаю этот выход:
Бронирования с Джеффом по-прежнему сохраняется (показанный в день: 0 , время: 0, тренер: 0 в отладочном выводе над таблицей на скриншоте), но он отображается как доступный в таблице. Анна показывает, как забронировано.
Я давно застрял в этом, и не могу понять, почему это происходит. Я пытался жестко закодировать цикл тренера (ака: вызов функции, вручную набрав номер тренера: bool availability0 = GetAvailability (col, row, 0);), который работает, но это не то, что я действительно хочу сделать.
Я попытался создать булевский массив, который будет принимать результаты функции GetAvailability внутри цикла тренера, но это тоже не сработало, только результат будет самым последним. Так, например: Если я использую пример заказа (в бронировании с Джеффом и анна в то же время, потерянное и день) логический массив должен показать:
{ложь, ложь, правда, правда, правда} ;
, но вместо этого он показывает
{истина, ложь, правда, правда, правда};
Я могу только предположить, что я делаю что-то не так с моими петлями, но я могу понять это. Любая помощь будет оценена, и если потребуется какая-либо дополнительная информация, пожалуйста, дайте мне знать.
EDIT 1:
Спасибо за первоначальные ответы ребят, действительно ценит это. Как было предложено, вы, ребята, я изменил функцию GetAvailability к этому:
bool Schedule::GetAvailability(int day, int time, int trainer){
if(_bookingVector.empty()){
return true;
} else{
for(int i = 0; i < _bookingVector.size(); ++i){
int bTempTime = _bookingVector[i].GetTime();
int bTempDay = _bookingVector[i].GetDay();
int bTempTrainer = _bookingVector[i].GetTrainer();
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
return false;
}
}
}
//cout << " RETURNING " << availible;
}
После изменения метода, это результат:
Теперь ничего не отображается в таблице, любые предложения ?
Спасибо за ответ, я попытался использовать ваш код, но возникла другая проблема, как это произошло, я показал его в исходном посте под EDIT 1. еще раз спасибо! – user3496101
Вам нужно было оставить последнее выражение 'return' в функции. Добавьте строку 'return true;' перед завершением функции. –
СПАСИБО СМОТРЕТЬ! Я слишком долго вытягиваю волосы из этой проблемы. Серьезно, спасибо! – user3496101