替换c中的break



我正在写一个电脑游戏的程序。当我第一次写的时候,老师并没有告诉我们不能用break,所以我就用了。但不允许使用休息。我试图找到一种方法来取代打破,但改变逻辑对我来说很难理解。这是我的工作原始代码:

//If number of matches is not equal to length, print the hints and check for pica's
if(matches != LENGTH) {
//First, print as many fermi hints as matches
for(int i = 0; i < matches; i++) {
printf("fermi ");
}
//Then, second loop to check for pica hints
for(int i = 0; i < LENGTH; i++) {
//We use the i index if not used before
if(!usedNum[i]) {
for(int j = 0; j < LENGTH; j++) {
//Check if the digit is the same for given indices if not used already on guess
if(!usedGuess[j] && num[i] == guess[j]) {
//If so, we have a match but on incorrect position
usedNum[i] = true;
usedGuess[j] = true;
used++;
printf("pica ");
break;
}
}
}
}
//If no used numbers, we print "bagels"
if(used == 0) {
printf("bagels");
}
printf("n"); //line break after hints
}
//Finally, we return the num of matches
return matches;
}

和我试图把它变成一个do while循环。

if(matches != LENGTH) {
//First, print as many fermi hints as matches
for(int i = 0; i < matches; i++) {
printf("fermi ");
}
//Then, second loop to check for pica hints
for(int i = 0; i < LENGTH; i++) {
//We use the i index if not used before
if(!usedNum[i]) {
do {
//Check if the digit is the same for given indices if not used already on guess
int j = 0;
//If so, we have a match but on incorrect position
usedNum[i] = true;
usedGuess[j] = true;
used++;
printf("pica ");                        
} while (usedGuess[j] || num[i] == guess[j]);
} 
}
}
//If no used numbers, we print "bagels"
if(used == 0) {
printf("bagels");
}
printf("n"); //line break after hints
}
//Finally, we return the num of matches
return matches;
}

阅读植入。我的原始代码可以这样表述,直到。然而,使用while循环的新代码是在此语句为真时执行此操作。对于原始代码,我有停止条件对于新代码,我必须提出继续条件,对吧?会有更好的逻辑循环吗?

我看到另一篇文章提到子函数,但我们从来没有在课堂上介绍过它们,所以我认为我们不允许使用它们,无论我仍然不确定如何实现。

您可以使用几种方法来代替break;。由于限制break;的使用似乎是不合理的,可能还有其他一些限制,我不能说是否每种方法都会被接受。

修改j的值以退出循环:

for(int j = 0; j < LENGTH; j++) {
if(!usedGuess[j] && num[i] == guess[j]) {
/* snipped */
j  = LENGTH;
}
}

使用另一个标志退出循环:

bool found = false;
for(int j = 0; !found && j < LENGTH; j++) {
if(!usedGuess[j] && num[i] == guess[j]) {
/* snipped */
found = true;
}
}

使用goto(可能有些人不鼓励,但这是一个有效的语法):

for(int j = 0; j < LENGTH; j++) {
if(!usedGuess[j] && num[i] == guess[j]) {
/* snipped */
goto after_the_loop;
}
}
after_the_loop:;

你的while循环有问题,你在循环中将j初始化为0。

for(int i = 0; i < LENGTH; i++) {
if (!usedNum[i]) {
int j=0, k=0;
while (j < LENGTH && !k) {
if(!usedGuess[j] && num[i] == guess[j]) {
usedNum[i] = true;
usedGuess[j] = true;
used++;
k++;
printf("pica ");
}
j++;
}
}
}

我想这样就可以了。

对于像您这样的情况,我会强烈考虑将内部条件合并到循环条件中:

int j;
for (j = 0; j < LENGTH && (usedGuess[j] || num[i] != guess[j]); j++) /* empty */ ;
if (j < LENGTH) {
// we have a match, but on an incorrect position
usedNum[i] = true;
usedGuess[j] = true;
used++;
printf("pica ");
}

循环只搜索满足所有条件的索引j。如果它在终止时使j小于LENGTH,那么你就知道j的最终值也满足所有其他条件。

最新更新