c++ - 循环不正常

标签 c++ arrays loops boolean

我在这个问题上被困了太久了(6+ 小时 -_-)。

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

to display all time slots that are available for booking (An example is shown in Figure 2. In the figure, ‘x’ means no swimming instructor is available in the time slot, ‘J/A/P/M/K’ means J (Jeff), A (Anna), P(Peter), M (Michael) and K(Kerry) are all available in the time slot, ‘J/A/P’ means J (Jeff), A (Anna), and P(Peter) are all available in the time slot, but M (Michael) and K(Kerry) are not available in the time slot.)

为了这个任务,我在我的“日程安排类”中创建了一个“获取可用性”功能(我将尝试解释它)。函数如下:

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;

}

此方法所做的只是访问一个 vector ,该 vector 将个人预订存储为我的“预订”类的对象。每个预订对象都包含日期、时间和培训师变量。此方法循环遍历 vector 并访问每个预订对象以获取上述信息。然后,它会根据调用该方法时输入的参数检查信息。

这很好用,我检查了很多次,它根据这个输入正确返回 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”函数,使用“row、col 和 x”作为参数。

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

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

output1

它显示所有其他培训师在该特定时间段内都有空,除了 jeff 有预订。但是现在,如果我与安娜进行第二次预订(相同的时间段,在星期一,与安娜),我会得到以下输出:

output2

与 jeff 的预订仍然保存(在屏幕截图中表格上方的调试输出中显示为 day: 0, time:0, trainer:0),但它在表格中显示为可用。安娜显示为已预订。

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

我曾尝试创建一个 boolean 数组,该数组将从训练循环内的“GetAvailability”函数中获取结果,但这也不起作用,只有最新的预订才会给出结果。因此,例如:如果我使用预订示例(jeff 和 anna 在同一天丢失的预订),则 boolean 数组应显示:

{ 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 == day) && (bTempTrainer == trainer)){ available= false; }...] 你应该立即返回或退出循环。

如果在匹配的预订之后数组中还有其他预订,则 available 将重置为 true。这就是为什么在出现多个预订后会发生这种情况。

关于c++ - 循环不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361295/

相关文章:

c++ - 在工厂方法中测试对象的创建

c++ - 访问 union 中相同类型的非事件成员

c++ - boost::function 指向参数的函数指针?

php - 将嵌套数组编码为没有数组索引的正确 json

java - 检查一个字符串是否匹配除另一个字符串之外的所有字符

php - 如果 VAR 在 mySQL 数据库中,则返回该行数据作为变量 PHP

C++ 模板 - 需要主要表达式

javascript - TypeError : t. map 不是函数

c - 函数返回不是预期的值

mysql - MySQL 中的 For Loop,循环遍历表并将其应用到 where 语句