繁体   English   中英

循环行为不正常

Loop doesn't behave properly

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已经在这个问题上停留了太长时间(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

现在,表格中什么也没显示,有什么建议吗?

3 个回复

我无法调试您的代码,但令我印象深刻的是,在您的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;
        }
1 循环不正常

使用数据框,这是我的代码。 但由于某些原因,当我运行此代码时,只有A的计数增加。 即如果索引中的数据具有'A','B','B',它仍然返回A = 3而B = 0,其中它应该返回A = 1,B = 2,并且C = 0 我究竟做错了什么? 再次感谢。 ...

2 我的循环不正常

我想用grundformen列表中的正确项目填充list_of_occurences 。 我的for循环无法正常运行。 它不会从头开始,只会在阅读器中的行中浏览一次。 因此,它不会完全填充列表。 这是它打印的内容(您可以看到缺少的部分-因为它没有从列表的开头-开始搜索): ...

2015-06-29 16:54:20 2 157   python
3 标签行为不正常

我正在开发一个在线航空公司预订系统,其中有两个下拉列表来选择来源和目的地,还有一个标签。如果没有从数据库中检索到匹配的航线,则此标签将显示“没有航班”(在这种情况下,其sqlserver 2008 )。我已经编写了以下代码来尝试这样做,但是当我回发或刷新页面时,带有“没有航班”的标签会一直可见。 ...

4 为什么我的CGRect行为不正常?

遵循《 The Big Nerd Ranch iOS》一书,我正在制作一个简单的应用程序。 我从CGRect得到这种特殊的响应,无论输入什么值,它都不会离开模拟器的起源。 我创建了一个名为HypnosisView的简单UIView类,其中没有任何代码。 这是我在AppDeleg ...

6 XS PPCODE行为不正常

我正在使用XS在Windows上的Cygwin下使用XS从我的Perl项目中调用第三方DLL。 DLL函数之一将结构作为参数,并在指向结构的指针中返回其主要结果。 现在,我传入一个由28个整数组成的平面列表,并填充第一个结构。 然后我调用该函数。 然后,我想将结果结构展平为最多54个整数 ...

2014-06-01 21:16:31 2 55   xs
7 MPMoviePlayerController行为不正常

我正在使用MPMoviePlayerController播放小视频作为我的应用程序的介绍视频。 我已经使用以下代码,并且可以正常工作。 但是视频继续播放。 结束并重新启动。 即使单击完成按钮,它也不会删除超级视图。 我也希望状态栏可见,但我保持半透明状态仍然没有结果。 我在Googl ...

8 scrollPathToVisible行为不正常

我有一个JTree ,我希望它向下滚动到最新的子条目。 我以以下方式使用了scrollPathToVisible 其中childNode是树中最新添加的子节点。 我遇到的问题是,每当添加root时,滚动都不会在添加第一个孩子时向下移动,而是仅从第二个孩子开始向下移动。 用户 ...

9 fwrite行为不正常

我有一个C程序,该程序使用fwrite(..)写入文件,并且结果与我提供的函数参数不一致。 当我以后检查文件时,它似乎包含不能转换为任何符号的符号 因为我应该得到这个 我检查了文件的权限,并对其进行了修改 我看到的方式是我有一个要写入文件的大小为32位整数的1元素 ...

10 Xaml TextBox行为不正常

我正在尝试在运行时从XAML创建UI,例如 如果我将其输入此XAML: 则复选框和列表的行为均符合预期,但是我的TextBox不响应键入,而是保持其初始值。 (对我而言)真正奇怪的部分是,如果我将RootVisual的KeyDown处理程序放在RootVisual上,并在其中显 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM