0

我正在尝试学习如何用 C 编程并偶然发现了一个似乎应该是一个简单的解决方法的问题,但它给了我比我预期的更多的问题。我正在尝试创建一个数字猜谜游戏,您有 3 次猜测数字的机会,但我的问题是,当猜到正确答案时,Do While 循环不会中断。这是功能:

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
            }
        }
    } while(user_entry==lucky[i]||j<3);

}

基本上它应该遍历数组 lucky[i] 并检查 user_entry 是否等于数组中的 20 个数字中的任何一个。截至目前,它循环通过,识别是否已从数组中选择了中奖号码,但不会从数组中中断。

当我将其更改为

}while(user_entry!=lucky[i]||j<3);  

它完全忽略了计数器,只是永远循环。

我不想使用 break 因为我读到的所有关于它的内容都在谈论它是糟糕的编程实践。有没有另一种方法可以打破,或者只是犯了一个导致这个问题的错误。

提前致谢。

4

4 回答 4

3

考虑一下您的索引变量“i”的来源。找到正确的用户条目后会发生什么?控制流去哪儿了?

我建议看一下“break”关键字。

于 2012-10-23T22:37:49.467 回答
2

你写while (user_entry == lucky[i]..)的翻译成as long as user_entry is equal to lucky[i] keep on looping. 这显然不是你打算做的。

将您的条件转换为} while (user_entry != lucky[i] && j < 3);,您应该会没事的。这将用简单的英语翻译成as long as user_entry is different of lucky[i] AND j is inferior to 3, keep looping.

但是使用它,您可以测试lucky[i]即使i没有任何意义的值(当 i 等于 max 时,您不想测试它,这属于未定义行为的领域)。

但是,如果您真的不想使用break关键字,一种解决方案是使用标志。在开始循环之前将其设置为 1,并在找到好的答案时将其更改为 0。您的代码将变为

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    char flag = 1;

    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                printf("winner\n");
                flag = 0;
            }
        }
    } while(flag&&j<3);

}
于 2012-10-23T22:38:38.733 回答
0

}while(user_entry!=lucky[i]||j<3);

这是一个糟糕的逻辑 - 当用户输入的不是幸运数字或 j 低于三时循环?当然你真的想要这个:

}while(user_entry!=lucky[i]&&j<3);

这只是您忽略计数器的第二个问题的解决方案 - 主要问题已在其他答案中解决。

于 2012-10-23T22:36:32.053 回答
0

唯一独立的条件是用户还有更多的猜测。试试这个”

while(j <= 3);

小于应该是显而易见的,但等于属于那里,因为你在循环之前增加你的 j 所以它将是

j = 1 => 第一个猜测

j = 2 => 第二次猜测

j = 3 => 第三次猜测

在那之后,用户应该没有更多的猜测

您应该会发现这不起作用,那是因为如果用户猜对了,我们想退出循环。为此,您可以将 int 用作 bool(0-false,1-yes)。

void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
    int j=0;
    int exitCase = 0;
    do {
        j++;
        printf("Please enter a number between 0 and 100\n");
        scanf("%d",&user_entry);

        for(i = 0; i < MAX; i++)
        {
            if(user_entry==lucky[i])
            {
                exitCase = 1;
                printf("winner\n");
            }
        }
    } while(exitCase == 0 || j <= 3);

}
于 2012-10-23T22:55:38.497 回答