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或更大和相反)的条件?
发布于 2015-11-12 23:21:54
有一个基本的“糟糕的设计”问题,就是变量isAnInteger的作用域比需要的要宽(它存在于需要它的最后一行之后)。
“正确”方法是循环,它包含确定输入的“完整性”的逻辑,在循环结束时不将变量留在作用域中,当然,除了digit中捕获的输入之外。
接下来,您希望将捕获输入的关注点与检查分离开来,因此首先创建一个获取数字的方法:
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;
}这种方法使代码更易于阅读和理解。
还请注意,没有重复的代码(例如要求一个数字的行,或读取输入)。
发布于 2015-11-12 22:44:14
这里的主要概念部分是,您不会在循环中的任何地方更新您的值。因为它不更新,所以它将始终保持它进入循环时的值(也就是说,在程序停止运行之前,digit >= 10将保持为真)。
必须在循环中更新值。
但是,您缺少另一个概念:保证至少运行一次循环,因此您应该利用do...while循环。
请注意,我使用nextLine()来避免任何不稳定的nextInt()问题。
(哦,顺便说一句:你要找的任何数字都是整数。你应该告诉你,你在寻找小于10的整数。)
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);发布于 2016-06-20 14:39:46
是的,Makoto说得对。
您从不在while循环中更新您的值。在最初的情况下,当您只想继续打印Please enter an integer:时,就不会在该行之后要求输入。您的原始digit值将继续大于或等于10,并将保持循环运行。
即使使用当前代码,如果digit值小于10,仍然会遇到无限循环。注意布尔值isAnInteger是如何独立于digit是否小于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循环)。
https://stackoverflow.com/questions/33682767
复制相似问题