我正在写一个电脑游戏的程序。当我第一次写的时候,老师并没有告诉我们不能用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
的最终值也满足所有其他条件。