[英]Loop doesn't behave properly
我已經在這個問題上停留了太長時間(6個多小時-_-)。
我正在嘗試用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(Michael)和K(Kerry)在該時隙中不可用。)
對於此任務,我在“ Schedule類”內部創建了一個“獲取可用性”功能(我將盡力解釋這一點)。 功能如下:
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”將是anna等)):
std::string _trainers [5] = {"Jeff", "Anna", "Peter", "Micheal", "Kerry"};
因此,在該循環中,將調用“ GetAvailability”函數,並以“ row,col和x”作為參數。
在我的腦海中,這應該可以正常工作,每當我對此進行迭代時,都應在表中的單元格中添加可用教練名稱的第一個字母。 但這不是它的作用。
它僅適用於一個預訂,因此,如果我在星期一的第一個時隙進行預訂,則輸出將是正確的:
它顯示在該特定時間段內所有其他培訓師都可用,除了傑夫(Jeff)已有預訂。 但是現在,如果我與anna進行第二次預訂,(同樣的時隙,在星期一,與anna一起),我得到以下輸出:
使用jeff的預訂仍會保存(在屏幕快照表上方的調試輸出中顯示為day:0,time:0,trainer:0),但在表中顯示為可用。 安娜正在預定。
我已經在這個問題上停留了很長時間了,無法弄清楚為什么會這樣。 我試圖對訓練器循環進行硬編碼(也就是:通過手動輸入訓練器編號來調用該函數:bool Availability0 = GetAvailability(col,row,0);),但是可以,但並不是我真正想要做的。
我嘗試過創建一個布爾數組,該數組將接受來自Trainer循環內“ GetAvailability”函數的結果,但是那也不起作用,只有最新的預訂才能給出結果。 因此,例如:如果我使用預訂示例(jeff和anna的預訂同時丟失了一天),則布爾數組應顯示為:
{false,false,true,true,true};
但它顯示
{true,false,true,true,true};
我只能假設自己的循環做錯了什么,但是我可以弄清楚。 任何幫助將不勝感激,如果需要更多信息,請告訴我。
編輯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;
}
更改方法后,結果如下:
現在,表格中什么也沒顯示,有什么建議嗎?
我無法調試您的代碼,但令我印象深刻的是,在您的Schedule :: GetAvailability(...)方法中,當該方法發現為培訓員預訂了廣告位時[例如if((bTempTime == time)&&(bTempDay = =天)&&(bTempTrainer ==培訓師)){available = false; } ...],您應該立即返回或退出循環。
如果在匹配的預訂之后陣列中還有其他預訂,則可用預訂會重置為true。 這就是為什么在存在多個預訂之后發生這種情況的原因。
以下各行中使用的邏輯是錯誤的:
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;
}
您可以在方法bool Schedule :: GetAvailability(int day,int time,int trainer)中進行for循環,如下所示。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.