如何解决这个无限循环? (AP计算机科学)

时间:2015-11-12 22:38:30

标签: java

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条件设置为while (digit >= 10)时,它会导致无限循环(纠正我,但这是因为如果用户输入10或更大的数字,条件将保持满足并无限地继续)。所以,我尝试将while条件设置为某个布尔值,并使用先前条件嵌套在if内部。现在,当用户输入10时,之后没有任何反应,程序结束。

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

3 个答案:

答案 0 :(得分:1)

有一个基本的“糟糕设计”问题,变量isAnInteger的范围比需要的范围更广(它超过了需要它的最后一行)。

“正确”方法是包含确定输入“整数”的逻辑的循环,并且当循环结束时不会将变量留在范围内,当然除了digit中捕获的输入之外。< / p>

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

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()循环,一直读取,直到它获得良好的输入:

int digit = 10; // bad input
while (digit > 9) {
    digit = readNumber(in);
}

将所有内容与最终消息结合在一起:

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 :(得分:0)

这里的主要概念是你不会在循环内的任何地方更新你的价值。因为它不会更新,所以它将始终保持其进入循环时的值(即,digit >= 10将保持为真,直到程序停止运行。)

您必须更新循环内的值。

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

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

(哦,顺便说一下:你正在寻找的任何数字都是一个整数。你应该告诉你,你正在寻找一个小于10的整数。)< / p>

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);

答案 2 :(得分:0)

是的,Makoto说得对。

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

即使使用当前代码,如果digit值小于10,您仍会遇到无限循环。请注意布尔值isAnIntegerdigit是否相关无关不到10个。

解决此问题的最佳方法是使用以下内容:


    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

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


    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循环)。