首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复这个无限循环?(美联社电脑科学)

如何修复这个无限循环?(美联社电脑科学)
EN

Stack Overflow用户
提问于 2015-11-12 22:38:29
回答 3查看 206关注 0票数 1
代码语言:javascript
复制
public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        System.out.print("Please enter a digit: ");
        int digit = in.nextInt();

        boolean isAnInteger = false;
        while (isAnInteger)
        {
            if (digit >= 10)
            {
                System.out.println("Please enter an integer: ");
            }
            else
            {
                System.out.println("Correct! " + digit + " is an integer!");
            }
        }
    }

我目前正在选修AP计算机科学课程,我很好奇如何解决这个(尽管是基本的)问题。我知道,当圆括号中的条件仍然满足时,循环会继续它们各自的花括号中的任何内容。

当我尝试将while条件设置为while (digit >= 10)时,它会产生一个无限循环(纠正我的错误,但这是因为如果用户输入的数字为10或更高,该条件将一直被满足并无限地继续)。因此,我尝试将while条件设置为一些布尔值,并在其中嵌套一个if,该条件与前面的条件嵌套在一起。现在,当用户输入10,之后什么都不会发生,程序就结束了。

如何编写上述代码,以便系统继续打印“请输入整数:”,如果继续满足(输入10或更大和相反)的条件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-12 23:21:54

有一个基本的“糟糕的设计”问题,就是变量isAnInteger的作用域比需要的要宽(它存在于需要它的最后一行之后)。

“正确”方法是循环,它包含确定输入的“完整性”的逻辑,在循环结束时不将变量留在作用域中,当然,除了digit中捕获的输入之外。

接下来,您希望将捕获输入的关注点与检查分离开来,因此首先创建一个获取数字的方法:

代码语言:javascript
复制
private static int readNumber(Scanner in) {
    System.out.print("Please enter a digit: ");
    int digit = in.nextInt();
    in.nextLine(); // you must clear the newline char from the buffer
    return digit;
}

接下来,编写一个简单的while()循环,该循环一直在读取,直到得到良好的输入:

代码语言:javascript
复制
int digit = 10; // bad input
while (digit > 9) {
    digit = readNumber(in);
}

把这一切和最后的信息放在一起:

代码语言:javascript
复制
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int digit = 10; // initialize with "bad" input
    while (digit > 9) {
         digit = readNumber(in);
    }
    System.out.println("Correct! " + digit + " is an integer!");
}

private static int readNumber(Scanner in) {
    System.out.print("Please enter a digit: ");
    int digit = in.nextInt();
    in.nextLine(); // you must clear the newline char from the buffer
    return digit;
}

这种方法使代码更易于阅读和理解。

还请注意,没有重复的代码(例如要求一个数字的行,或读取输入)。

票数 1
EN

Stack Overflow用户

发布于 2015-11-12 22:44:14

这里的主要概念部分是,您不会在循环中的任何地方更新您的值。因为它不更新,所以它将始终保持它进入循环时的值(也就是说,在程序停止运行之前,digit >= 10将保持为真)。

必须在循环中更新值。

但是,您缺少另一个概念:保证至少运行一次循环,因此您应该利用do...while循环。

请注意,我使用nextLine()来避免任何不稳定的nextInt()问题。

(哦,顺便说一句:你要找的任何数字都是整数。你应该告诉你,你在寻找小于10的整数。)

代码语言:javascript
复制
System.out.print("Please enter a digit: ");
int digit = Integer.parseInt(in.nextLine());

boolean isAnInteger;

do {
    if (digit >= 10) {
        System.out.println("Please enter an integer: ");
        digit = Integer.parseInt(in.nextLine());
        isAnInteger = false;
    } else {
        System.out.println("Correct! " + digit + " is an integer!");
        isAnInteger = true;
    }
} while (isAnInteger);
票数 0
EN

Stack Overflow用户

发布于 2016-06-20 14:39:46

是的,Makoto说得对。

您从不在while循环中更新您的值。在最初的情况下,当您只想继续打印Please enter an integer:时,就不会在该行之后要求输入。您的原始digit值将继续大于或等于10,并将保持循环运行。

即使使用当前代码,如果digit值小于10,仍然会遇到无限循环。注意布尔值isAnInteger是如何独立于digit是否小于10的。

解决这一问题的最佳方法是使用这样的方法:

代码语言:javascript
复制
    in = new Scanner(System.in);

    System.out.print("Please enter a digit: ");
    int digit = in.nextInt();

    while (digit >= 10)
    {
        System.out.println("Please enter an integer: ");
        digit = in.nextInt();
    }
    System.out.println("Correct! " + digit + " is an integer!");

这样做是不断检查数字是否大于或等于10。如果是,它将继续要求用户输入。如果在循环迭代期间的任何时候,用户输入的值小于10,它将不会执行下一次迭代,并留下循环。然后,它将执行最后一个println

但是,如果第一个输入小于10,它将跳过while循环并在底部执行println

如果您想像以前一样使用布尔值,可以这样做:

代码语言:javascript
复制
    in = new Scanner(System.in);

    System.out.print("Please enter a digit: ");
    int digit = in.nextInt();

    bool isAnInteger = true;
    if (digit >= 10)
        isAnInteger = false;

    while (!isAnInteger)  // checks if digit is not an integer
    {
        System.out.println("Please enter an integer: ");
        digit = in.nextInt();

        if !(digit >= 10)
            isAnInteger = true;
    }
    System.out.println("Correct! " + digit + " is an integer!");

Makoto使用do while循环的方式可能更好,尽管这可能是一种更好的可视化方法(因为您使用了while循环)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33682767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档