【问题标题】:How to end a loop early in C?如何在 C 中尽早结束循环?
【发布时间】:2010-12-03 04:46:47
【问题描述】:

我有一个基本的 C 程序,它产生一个数字,用户必须猜测它(是的,你已经称之为:作业)。我能够得到几乎所有的东西,所以我有点自豪,但我对我犯的任何错误持开放态度,当然我还在学习。我的主要两个问题是

  1. 如何在用户选择正确的数字后,在尝试次数达到第 10 次之前提前结束该程序?并且
  2. 专家可以看出我没有使用我的代码的任何明显错误吗?

我正在尽我所能编程:)

int main(void)
{
    int x = 10;
    int i = 0;
    int target, guess;
    int numGuess = 0;

    /*create a random number*/
    //create random function
    srand(time(NULL));//this creates new number based on time which changes every second :)
    target = rand() % 99; //create a random number using the rand() function, from 0 -99



    do{
        //increase the loop until it meets the x variable
        i++;
        numGuess++;
        //allow user to input a number for guess
        scanf("%d", &guess);
        if (guess == target)
        {
            printf("You win! \n\n");

        }
        else if (guess > target)
        {
            printf("You are too high. Guess a number:\n\n");
        }
        else if (guess < target)
        {
            printf("You are too low. Guess a number:\n\n");
        }

    }while(i < x);
        printf("You lose, the number was %d. \n", target);

    printf("Number of tries %d\n", numGuess);
    printf("Enter any key to exit...");
    getchar();
    getchar();

    return 0;
}

【问题讨论】:

  • 您学习了基本的程序结构、do/while 循环、IO、sscanf、rand、为 rng 播种,但没有教过 break?
  • 很高兴看到您评论了您的代码 - 干得好:D
  • 为什么最后有两个 getchar() 调用,当你说只需要 1 个键来结束程序时?
  • @Dominic Bou-Samra:他还在上学(而且可能还有很长的路要走);他很快就会停止评论。 xD
  • 一个 nitpik, x%99 会给你一个 0-98 范围内的数字。你想要 x%100。一个真正的书呆子只需要 7 次猜测,10 次太多了:-)

标签: c loops


【解决方案1】:

我没有看到任何以前的海报没有提到的“明显错误”,除了事实上,随着休息,您不再需要“i”和“numGuess”,因为它们总是具有相同的值。只需在 while 的条件下使用 numGuess 而不是 "i"。

但我强烈建议您让您的代码更具可读性 - 现在是养成良好编码风格习惯的最佳时机,在您养成并巩固坏习惯之前。

  • 始终使用自描述标识符(变量/函数名称)。例如。你的“x”真的应该叫做“maxGuesses”。

  • 不要吝啬留白。例如。 "}while(i

  • 你似乎已经养成了不吝啬 cmets 的习惯——很好!!!

    请记住,cmets 应该始终描述代码执行操作背后的目的,而不是描述代码执行方式的机制,除非机制非常棘手和聪明以至于需要解释。

这很重要的原因有两个:

  • 80-90% 的开发时间/精力通常用于维护现有代码,无论是您自己的还是其他人的。有了有据可查且易于阅读的代码,该任务变得非常容易。 (你不知道在生产问题期间凌晨 2 点阅读不熟悉的代码会对某人造成多大的脑损伤,只是因为编写代码的笨蛋没有一致地缩进代码)。

  • 拥有良好文档化和可读性的代码可以让您更轻松地编写它,因为它可以澄清您自己的想法并阻止愚蠢的错字引发的错误(“oups,我的意思是使用 x 而不是 y”)。

【讨论】:

    【解决方案2】:

    这里有三种可能性。阅读他们! (goto 被认为是有害的)

     if (guess == target)
     {
         printf("You win! \n\n");
         break;
     }
    
     if (guess == target)
     {
         printf("You win! \n\n");
         goto end;
     }
    
    
     if (guess == target)
     {
         printf("You win! \n\n");
         i=n;
     }
    

    【讨论】:

    • 在某些情况下return some_value; 也是如此。
    【解决方案3】:

    为什么不将 while 条件设置为用户的猜测?比如:

     ...}while(i < x || guess !== target);
    

    【讨论】:

    • 最好使用break,因为代码的意图会更明显。
    • 你这么认为?我认为暂时结束它更明显。这就像说“我会一直问,直到你做对或没有机会”。休息会让人感觉好像发生了错误或者需要注意更重要的事情......
    • 我不同意。在这种情况下,可以看到它在结束时进入循环。使用break,必须阅读代码才能知道这一点。
    • 中断语句倾向于掩盖循环的终止逻辑。想象一下,试图推断一个非常大的循环的所有逻辑,其中一个 break 语句分散在各处,而结束逻辑可以在顶部或底部找到(取决于循环的类型)。
    【解决方案4】:

    您正在寻找break 命令。

    for (int i = 0; i < 10; i++) {
        if(i == 5)
           break;
    }
    

    This resource 看起来对你很有帮助。

    附带说明:无论如何,您的“你输了”文本将始终显示。您可能希望在 do{ } 循环中对其进行评估。


    在这个答案 Andrew Hare 上的帖子/编辑总是比我领先一步!

    【讨论】:

    • 不应该使用 For 循环的情况是正确的响应。虽然有些事情是处理这个问题的正确方法。
    【解决方案5】:

    使用break 语句跳出循环:在这种情况下,虽然这可能不是您想要的,因为一旦您跳出循环,您将立即看到“你输了”的消息。您可能需要重组您的程序来解决这个问题。

    试试这样的:

    int main(void)
    {
        int x = 10;
        int i = 0;
        int target, guess;
        int numGuess = 0;
    
        /*create a random number*/
        //create random function
        srand(time(NULL));//this creates new number based on time which changes every second :)
        target = rand() % 99; //create a random number using the rand() function, from 0 -99
    
        do {
            //increase the loop until it meets the x variable
            i++;
            numGuess++;
            //allow user to input a number for guess
            scanf("%d", &guess);
            if (guess == target)
            {
                printf("You win! \n\n");
                break;
            }
            else if (guess > target)
            {
                printf("You are too high. Guess a number:\n\n");
            }
            else if (guess < target)
            {
                printf("You are too low. Guess a number:\n\n");
            }
    
        }while(i < x);
    
        if (guess != target) {
            printf("You lose, the number was %d. \n", target);
        }
    
        printf("Number of tries %d\n", numGuess);
        printf("Enter any key to exit...");
        getchar();
        getchar();
    
        return 0;
    }
    

    【讨论】:

    • 你不应该发布完整的修改程序来回答家庭作业问题。即使发布者在没有应用给出的答案的情况下学习了材料,发布者仍然可能会因为有人向他们展示了完整的答案而遇到麻烦。
    【解决方案6】:

    就你的程序而言,实现这一点的最佳方法可能是调用

    无效退出(int status);

    (包括 stdlib.h )

    打印“You Win”后

    一般来说,您可以随时使用关键字“break”退出循环。这对您的情况没有预期的效果,因为它会继续打印 "you lost ...." 。如果您想使用“break”,则必须在“you lost ...”位周围放置一个“if”语句,并检查用户是否实际上没有赢。

    【讨论】:

    • 我非常不喜欢使用exit() 退出程序;我个人将其用于致命错误。在此示例中,使用 'break' 代替或更改 while 条件也很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多