循环行为不正常

时间:2015-03-31 05:38:11

标签: c++ arrays loops boolean

我已经坚持这个问题太久了(6个多小时-_-)。

我正在尝试用c ++制作一个简单的游泳课预订系统。我已经完成了90%,唯一给我带来麻烦的是显示可用的时间段,特别是:

  

显示可供预订的所有时段(例如   如图所示   2.在图中,'x'表示时间段内没有游泳教练,'J / A / P / M / K'表示J(杰夫),A(安娜),P(彼得),M(迈克尔) )   'K / K'在时间段都可用,'J / A / P'表示J   (杰夫),A(安娜)和P(彼得)都可以在时间段内使用,但是   M(Michael)和K(Kerry)在时间段不可用。)

对于此任务,我创建了一个"获取可用性"我的"日程表"内部的功能(我会尽力解释它)。功能如下:

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;

}

所有这些方法都可以访问一个向量,该向量将单独的预订存储为我的预订&#34;类。每个预订对象包含一天,一个时间和一个培训师变量。该方法遍历向量并访问每个预订对象以获得上述信息。然后,它会在调用方法时根据输入的参数检查信息。

这很好用,我已多次检查它并根据此输入正确返回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] += "";
             }
        }

    }
}

&#34; row&#34;循环遍历每个时隙,&#34; col&#34;循环遍历每一天。最后一个循环遍历一个包含每个培训师名称的数组(在预订对象中,培训师存储的数字从0到4,与_trainers数组中培训师的位置相对应(所以,&#34; 0&# 34;将是杰夫,&#34; 1&#34;将是安娜等)):

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

因此,在该循环中,&#34; GetAvailability&#34;调用函数,使用&#34; row,col和x&#34;作为参数。

在我的脑海中,这应该可以正常工作,每次迭代时都应该将可用培训师名称的第一个字母添加到表格中的单元格。但这不是它的作用。

它仅适用于一次预订,因此,如果我在星期一的第一个时段预订,那么输出将是正确的:

output1

它显示除了预订的杰夫之外,所有其他培训师都可以在该特定时段使用。但是现在如果我和安娜一起做第二次预订,(所以同一个时间段,星期一,还有安娜)我得到了这个输出:

output2

使用jeff的预订仍然保存(显示为日期:0,时间:0,培训师:屏幕截图中表格上方的调试输出中的0),但它显示在表格中可用。安娜正在预订。

我现在已经坚持了很长时间,并且无法弄清楚为什么会这样。我试图硬编码训练器循环(又名:通过手动输入训练编号来调用函数:bool availability0 = GetAvailability(col,row,0);)哪个有效,但不是我真正想做的事情。

我尝试过创建一个布尔数组,该数组将取得&#34; GetAvailability&#34;在教练循环中运行,但这也不起作用,只有最新的预订会给出结果。例如:如果我使用预订的例子(同时丢失杰夫和安娜的预订和白天),布尔数组应该显示:

  

{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

现在,表中没有任何内容,任何建议?

3 个答案:

答案 0 :(得分:2)

我无法调试您的代码,但令我震惊的是,在您的Schedule :: GetAvailability(...)方法中,当方法发现时,为培训师预订了插槽[例如if((bTempTime == time)&amp;&amp;(bTempDay == day)&amp;&amp;(bTempTrainer == trainer)){available = false; } ...]你应该立即返回或退出循环。

如果在匹配的数组之后数组中存在其他预订,则可用将重置为true。这就是为什么它会在多个预订出现后发生的。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

你可以让你在方法bool Schedule :: GetAvailability(int day,int time,int trainer)中循环,如下所示。

  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;
        }