我正在尝试制作一个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;
}
}
}
}
答案 0 :(得分:1)
break
只会突破最里面的循环。有两种方法可以解决这个问题:
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 项目askingPrice
和ITEM
初始化price
和type
。
从那里开始,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
所以,你有它,是的,你是对的,这确实是一个逻辑错误。