2015-03-31 3 views
0

Я слишком долго задерживался на этой проблеме (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 
} 

Эта функция создает таблицу, которая показывает доступные тренеры:

table

Соответствующая часть этой функции заключается в следующем :

//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» называется, с «строка, столбец, и х» в качестве параметров.

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

Он работает только для одного заказа, так, если я номер на первом временном интервале на понедельник, из-пут будет правильным:

output1

Это показывает, что все остальные тренеры доступны в этом конкретном временном интервале, за исключением jeff, у которого есть заказ. Но теперь, если я сделаю второй номер с анной, (так же временные интервалы, в понедельник, с анна) я получаю этот выход:

output2

Бронирования с Джеффом по-прежнему сохраняется (показанный в день: 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; 

} 

После изменения метода, это результат:

edit1

Теперь ничего не отображается в таблице, любые предложения ?

ответ

1

Логика используется в следующих строках неправильно:

if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){ 
    available= false; 
}else{ 
    available= true; 
} 

Вот почему:

if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){ 
    // At this point, you just need to return false 
    // and not worry about checking other slots. 
    // available= false; 
    return false; 

Учитывая, что вам не нужен else блок. Эти линии могут быть просто заменены:

if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){ 
    return false; 
} 
+0

Спасибо за ответ, я попытался использовать ваш код, но возникла другая проблема, как это произошло, я показал его в исходном посте под EDIT 1. еще раз спасибо! – user3496101

+0

Вам нужно было оставить последнее выражение 'return' в функции. Добавьте строку 'return true;' перед завершением функции. –

+0

СПАСИБО СМОТРЕТЬ! Я слишком долго вытягиваю волосы из этой проблемы. Серьезно, спасибо! – user3496101

2

Я не могу отлаживать ваш код, но меня поражает то, что в вашем методе Schedule :: GetAvailability (...), когда метод обнаруживает, что слот зарезервирован для тренера [например. if ((bTempTime == time) & & (bTempDay == день) & & (bTempTrainer == trainer)) {available = false; } ...] вы должны немедленно вернуться или выйти из цикла.

Если в массиве есть другие заказы после согласованного, тогда доступный сбрасывается на значение true. Вот почему это происходит после нескольких бронирования.

+0

Благодарим за ответ! я попробовал ваше предложение и показал результат в EDIT 1 в исходном сообщении – user3496101

1

Вы можете сделать вас цикл в методе BOOL Расписание :: GetAvailability (Int день, внутр время, внутр тренер), как показано ниже.

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; 
      break; 
     } 
+0

Спасибо за предложение, но, к сожалению, я все равно получаю такую ​​же проблему – user3496101

Смежные вопросы