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或更大,相反)?
答案 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,您仍会遇到无限循环。请注意布尔值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
循环)。