繁体   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