簡體   English   中英

循環行為不正常

[英]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”作為參數。

在我的腦海中,這應該可以正常工作,每當我對此進行迭代時,都應在表中的單元格中添加可用教練名稱的第一個字母。 但這不是它的作用。

它僅適用於一個預訂,因此,如果我在星期一的第一個時隙進行預訂,則輸出將是正確的:

OUTPUT1

它顯示在該特定時間段內所有其他培訓師都可用,除了傑夫(Jeff)已有預訂。 但是現在,如果我與anna進行第二次預訂,(同樣的時隙,在星期一,與anna一起),我得到以下輸出:

OUTPUT2

使用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;

}

更改方法后,結果如下:

EDIT1

現在,表格中什么也沒顯示,有什么建議嗎?

我無法調試您的代碼,但令我印象深刻的是,在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM