我一直在這個問題上停留太久(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
}
這個函數創建其中顯示了可用的教員表:
此功能的相關部分是這樣的:
//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」作爲參數範圍內。
在我的腦海裏,這應該可以正常工作,每次我遍歷它時,都應該將可用的培訓師姓名的第一個字母添加到表格中的單元格中。但這不是它所做的。
它僅適用於一個預訂,所以,如果我做一個預訂在星期一的第一時隙中,外認沽將是正確的:
這表明,所有其他培訓師可以在特定的時間段使用,但有預訂的jeff除外。但現在如果我與安娜第二預訂,(所以同一時隙,一個星期一,與安娜)我得到這樣的輸出:
與傑夫預訂仍保存(如圖一天: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;
}
改變方法後,這是結果:
現在,沒有在表中顯示出來,有什麼建議?
感謝您的回覆,我嘗試使用您的代碼,但發生了不同的問題,我已經在編輯1下的原始文章中顯示它。 – user3496101 2015-03-31 06:02:52
您需要在函數中保留最後一個'return'語句。在函數結束之前添加一行'return true;'。 – 2015-03-31 06:22:59
非常感謝!我一直在這個問題上拉長頭髮太久了。真的,謝謝! – user3496101 2015-03-31 06:26:23