2015-03-31 143 views
0

我一直在這個問題上停留太久(6個小時以上)。循環無法正常工作

我想在C++中做一個簡單的游泳課程預訂系統。我已經完成90%的話,那是給我麻煩的唯一事情是示出可用時隙,具體有:

顯示所有時隙可用於預約(一個例子 在圖 2中所示(J),A(安娜),P(彼得),M(邁克爾)等等。在這個圖中,'x'表示在時間段內沒有游泳教練可用,'J/A/P/M/(Jeff),A(Anna)和P(Peter)都可以在時隙中獲得,但是 M(Kerry)和K(Kerry)都可以在時隙中獲得,'J/A/P'意指J 邁克爾)和K(克里)在時間段內不可用。)

對於這個任務,我在我的「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 
} 

這個函數創建其中顯示了可用的教員表:

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] += ""; 
      } 
     } 

    } 
} 

「row 「循環遍歷每個時隙,」col「循環遍歷每一天。最後一個循環遍歷一個包含每個教練員姓名的數組(在預約對象中,教練員存儲一個從0到4的數字,這對應於_trainers數組中的教練員位置(所以,「0」將是jeff ,「1」將是安娜等)):

std::string _trainers [5] = {"Jeff", "Anna", "Peter", "Micheal", "Kerry"}; 

使環路中的「GetAvailability」函數被調用,以「行,列,且x」作爲參數範圍內。

在我的腦海裏,這應該可以正常工作,每次我遍歷它時,都應該將可用的培訓師姓名的第一個字母添加到表格中的單元格中。但這不是它所做的。

它僅適用於一個預訂,所以,如果我做一個預訂在星期一的第一時隙中,外認沽將是正確的:

output1

這表明,所有其他培訓師可以在特定的時間段使用,但有預訂的jeff除外。但現在如果我與安娜第二預訂,(所以同一時隙,一個星期一,與安娜)我得到這樣的輸出:

output2

與傑夫預訂仍保存(如圖一天:0 ,時間:0,在屏幕截圖中的表格上方的調試輸出中爲培訓員:0),但它在表格中顯示爲可用。安娜顯示爲預訂。

我一直被困在這個很長一段時間,並且無法弄清楚爲什麼會發生這種情況。我試圖硬編碼教練循環(又名:通過手動鍵入教練編號調用該函數:bool availability0 = GetAvailability(col,row,0);)這是有效的,但不是我真正想做的事情。

我已經嘗試創建一個布爾型數組,它將從培訓師循環中的「GetAvailability」函數獲取結果,但這也不起作用,只有最新的預訂會給出結果。舉例來說:如果我使用預訂的例子(與jeff和anna同時丟失和day的預訂),布爾數組應顯示:

{false,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; 

} 

改變方法後,這是結果:

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

感謝您的回覆,我嘗試使用您的代碼,但發生了不同的問題,我已經在編輯1下的原始文章中顯示它。 – user3496101 2015-03-31 06:02:52

+0

您需要在函數中保留最後一個'return'語句。在函數結束之前添加一行'return true;'。 – 2015-03-31 06:22:59

+0

非常感謝!我一直在這個問題上拉長頭髮太久了。真的,謝謝! – user3496101 2015-03-31 06:26:23

2

我無法調試你的代碼,但是我發現在你的Schedule :: GetAvailability(...)方法中,當方法發現插槽被預定給教練[例如if((bTempTime == time)& &(bTempDay == day)& &(bTempTrainer == trainer)){available = false; } ...]你應該立即返回或退出循環。

如果在匹配的數組之後存在其他預訂,則可用重置爲true。這就是爲什麼它發生在多個預訂之後。

+0

感謝您的回覆!我已經嘗試了你的建議,並在原文中顯示編輯1的結果 – user3496101 2015-03-31 06:02:08

1

你可以讓你的for循環中方法布爾附表:: 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 2015-03-31 06:22:13