Break语句不退出for循环

时间:2017-01-26 03:42:36

标签: c++

我正在尝试制作一个for循环,以便当有待售商品和想要价格较低的商品时,它会移除两个商品并使用'j'退出for循环。但是出于某种原因,askPrice的值保持不变,并以较低的价格删除所有项目,而不是仅删除它遇到的第一个项目,并打破循环。我是否应该以不同的方式退出循环,或者我只是在某处出现逻辑错误?

    for(int i = 0; i < elements; i++){
    if(itemArray[i].status == "for sale"){
        int askingPrice = itemArray[i].price;
        string ITEM = itemArray[i].type;
        for(int j = 0; j < elements; j++){
            SOLD = 0;
            position = 0;
            if(itemArray[j].status == "wanted" && itemArray[j].type == ITEM && itemArray[j].price >= askingPrice){
                soldArray[soldPosition].type = itemArray[j].type;
                soldArray[soldPosition].price = askingPrice;
                soldPosition += 1;
                //cout << soldPosition << endl;
                if(i > j){
                for(int k = i; k < elements; k++){
                    itemArray[k].price = itemArray[k+1].price;
                    itemArray[k].type = itemArray[k+1].type;
                    itemArray[k].status = itemArray[k+1].status;
                    if(k == elements - 2){
                        elements = elements - 1;
                    }
                }
                position = 1;
                }
                for(int k = j; k < elements; k++){
                    if(k == elements - 1){
                        elements = elements - 1;
                        break;
                    }
                    itemArray[k].price = itemArray[k+1].price;
                    itemArray[k].type = itemArray[k+1].type;
                    itemArray[k].status = itemArray[k+1].status;
                }
                if(position = 0){
                for(int k = i; k < elements; k++){
                    if(k == elements - 1){
                        elements = elements - 1;
                        break;
                    }
                    itemArray[k].price = itemArray[k+1].price;
                    itemArray[k].type = itemArray[k+1].type;
                    itemArray[k].status = itemArray[k+1].status;
                }
                }
                SOLD = 1;
            }
            if(SOLD == 1){
                i = i-2;
                break;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

break只会突破最里面的循环。有两种方法可以解决这个问题:

  1. 设置一个标志,如果被触发,则跳出每个后续循环。
  2. 从程序中提取函数,并使用return将单个循环中断与总循环中断区分开来,以便在单个循环中打破多个关联循环vs break。对于较大的问题,请始终使用此方法,它将使您的代码更易于阅读,结构更好,更易于维护。

答案 1 :(得分:0)

使用sentinel值并按顺序跳出每个循环。 (现代的做事方式)或引起大量的浪潮&#34;你做错了!&#34;尖叫,只是使用goto声明。我提倡goto只有你在第4或第5或更高阶段嵌套循环。如果是这样的话:&#34;你做错了!&#34;

答案 2 :(得分:0)

  

出于某种原因,askPrice的值保持不变

您不会在代码中的任何位置更改 askPrice

  

当有待售物品和想要的物品时

itemArray对象不能同时具有状态"for sale""wanted"

因此,我们可以在if(itemArray[i].status == "for sale")循环中说i true 。该控件进入if语句并使用 ith 项目askingPriceITEM初始化pricetype

从那里开始,j循环从 itemArray 中的第0个元素开始。您的j循环不考虑status = "for sale",此循环只知道价格类型。此时SOLD = 0;

现在控制检查这个

if(itemArray[j].status == "wanted" && itemArray[j].type == ITEM && itemArray[j].price >= askingPrice)

请注意,if以上可以是真或假。但无论如何,它没有考虑

status = "for sale";因此,当上述if条件为真时,它会运行代码并根据条件删除低价商品,当它为假时,代码永远不会达到{{1}这不允许SOLD = 1;循环中断为j

所以,你有它,是的,你是对的,这确实是一个逻辑错误。