【问题标题】:How can I restructure this control flow to avoid use of goto?如何重构此控制流以避免使用 goto?
【发布时间】:2011-04-27 22:00:35
【问题描述】:

作为我的入门编程课程的家庭作业,我必须设计和实现一个生成随机数(1-100)的程序,然后让玩家猜 7 次以正确猜出数字。我想出了这个算法:

但是,我不知道如何将算法的这种概念表示转换为控制结构。 (我们使用 Pascal,因此可用的结构是 if 语句、前序循环和后序循环)。前序循环和后序循环都不适合内循环,因为循环条件位于循环中间并且有两个退出点!

谁能给我一个关于如何更清楚地构造这个的指针?

【问题讨论】:

    标签: goto flowchart control-flow


    【解决方案1】:

    我根本不知道 Pascal,但我知道它有一个 while 循环...所以我会以类似于以下的方式构造它...(用伪代码编写)

    boolean userWishesToPlay = true;
    int userGuess = -1;
    int ranValue;
    int guessCount = 0;
    
        while (userWishesToPlay) {
            ranValue = generateRandomValue();
            while(userGuess != ranValue && guessCount < 7) {
                // Give hint if user has guessed more than once
                if (guessCount >= 1) {
                   // give hint
                }
                userGuess = // get input from user
                guessCount += 1;
            }
    
            if (userGuess == ranValue) {
               // print congrats!
            } else {
               // print game over
            }
    
            userWishesToPlay = // get input from user on whether to play again or not
            userGuess = -1; // since random value will be between 1 and 100 this is safe
            guessCount = 0;
        }
    

    【讨论】:

    • 这是因为它不是帕斯卡,还是因为它不正确而被否决?如果不正确,我认为指出原因会更有帮助。
    【解决方案2】:

    我会用c风格写出来

    bool gameover;
    
    int tries = 0;
    
    while(!gameover)
    {
        game over = (tries > 7);
        if(answer == correct)
            break;
        tries++
    
    }
    

    PASCAL 中的 WHILE 循环链接:http://www.hkbu.edu.hk/~bba_ism/ISM2110/pas024.htm

    【讨论】:

    • 您的伪代码不正确 - 循环中的第二行将覆盖第一行的结果
    • 顺序是固定的。我举了更多的例子,但你是对的,这个位置以前不是最好的。
    • 仍然不正确。最后一行会将“游戏结束”设置为 false 7 次,即使您在第一次尝试时猜到了数字。
    • @Groo 你说得对,先生。在早餐前为我提供正确的编码。
    【解决方案3】:

    对我来说它看起来很坚固。我不知道帕斯卡,但你不能“打破”内循环吗?内部循环正在读取用户的猜测,显示提示并增加计数。它还检查两件事:猜测是否正确,计数是否小于 7。如果其中任何一个为真,则显示适当的消息,然后跳出该内部循环,进入外部循环,然后询问用户是否想再玩一次。

    【讨论】:

    • 不幸的是,Pascal 设计者认为循环中的 break 语句太危险,不应该被允许。我倒霉:(
    • 我用谷歌搜索了一下,Pascal 中似乎有一个“中断”命令:baskent.edu.tr/~tkaracay/etudio/ders/prg/pascal/PasHTM1/pas/…。但是,我认为这里给出的 While 循环解决方案更优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多