我试图从用户输入中找到列表中的最小数字。我需要询问用户列表中将包含多少个数字(并且只接受正数而不是字母),然后询问他们列表中的数字是什么(仅接受数字)。如何检查并保持循环直到数字有效?
public class SmallestInt {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Initialize a Scanner to read input from the command line
Scanner input = new Scanner(System. in );
int totalIntegers = 1;
int num = 0;
int smallest = 0;
boolean inputValid = false;
/* Prompt the user and validate their input to ensure they've entered a positive (greater than zero) integer. Discard/ignore any other data.
*/
while (!inputValid)
{
System.out.print("How many integers shall we compare? (Enter a positive integer): ");
try {
totalIntegers = input.nextInt();
inputValid = true;
} catch (NumberFormatException e) {
System.out.println("Invalid input!");
}
/* Read in the candidates for smallest integer
* Validate this input as well, this time ensuring that the user has provided a valid int (any int will do at this point) and discarding any other data
*/
for (int ii = 1; ii <= totalIntegers; ii++) {
// Prompt
System.out.print("Enter value " + ii + ": ");
num = input.nextInt();
if (ii == 1) smallest = num;
else if (num < smallest) smallest = num;
}
// display smallest int
System.out.println("The smallest number entered was: " + smallest);
}
}
}
答案 0 :(得分:2)
由于这显然是一项家庭作业/学习练习,我不会给你代码。如果您自己进行实际编码,您将了解更多信息。
使用循环嵌套修复问题后......
此代码存在三个问题:
while (!inputValid) {
System.out.print("How many integers? (Enter a positive integer): ");
try {
totalIntegers = input.nextInt();
inputValid = true;
} catch (NumberFormatException e) {
System.out.println("Invalid input!");
}
}
第一个问题是您正在捕获错误的异常。 Read the javadoc
第二个问题是如果nextInt
失败(由于解析整数问题),它会将扫描仪的输入光标放回到调用之前的位置。当你再次调用它时(在下一个循环迭代中),它将尝试读取相同的&#34; bad&#34;再次,再一次,......,
您必须告诉扫描仪跳过无效的输入行,以便它可以读取用户的下一次尝试。
第三个问题是你没有检查你刚读过的号码是否正确!!
最后提示:考虑使用while (true)
和条件break
,而不是while (condition)
。我认为它提供了更优雅的解决方案。
@Kick Buttowski的解决方案通过在每次循环迭代中创建新的Scanner
来处理错误的输入跳过。显然它有效...但我有一些怀疑 1 ,你可以依靠它始终工作。 IMO更好的解决方案是在整个过程中使用一个Scanner
,并使用nextLine()
调用来读取和丢弃字符,直到并包括行尾。
1 - 我主要担心的是当你泄漏Scanner
它可能(在某些实现中)关闭终结器中的基础输入流。如果确实发生了,那么应用程序将停止接受输入。当前的实现不会这样做,但是没有明确规定(AFAIK)。
答案 1 :(得分:2)
让我们为您提供示例,以便您可以按照蓝图
进行操作首先,我选择了while while循环,因为你需要至少问一次这个问题。
do ... while循环的语法是:
do
{
//Statements
}while(Boolean_expression);
请注意,布尔表达式出现在循环的末尾,所以 循环中的语句在测试布尔值之前执行一次。
如果布尔表达式为true,则控制流会跳回 要做,,循环中的语句再次执行。这个流程 重复,直到布尔表达式为假。
接下来,你需要看看当输入正确时你如何能够满足boolean_experssion,所以你可以停止循环,或者如果它是错误的,你就会不断提问。
我真正喜欢的方式是使用哨兵价值,因为使用break
关键字真的让我感到害怕。
在编程中,一个用于终止循环的特殊值。该 通常选择哨兵值以便不是合法数据 循环将遇到并尝试执行的值。对于 例如,在计算非负整数的循环算法中, 价值&#34; -1&#34;可以像计算一样设置为sentinel值 永远不会将这个价值作为合法的处理输出。
因此,当输入正确时,您可以更改i的值,这样您就可以停止循环或其他方式,显示消息并反复询问问题,直到使用正确答案为止。
<强>代码强>:
int i = 0;
Scanner input = new Scanner(System.in);
while (i == 0) {
System.out.println("Enter number zero plz");
int result = input.nextInt();
if(result == 0 ){
System.out.println("I entered right number");
i = 1;
} else
System.out.println("you entered the wrong number \nplz try again");
}
<强>输出强>:
答案 2 :(得分:1)
你的while循环在阻止用户前进方面确实没有为你做任何事情。你可以点击for循环,因为它在你的循环中。更改while循环和for循环,以便for循环在while循环之外。
while (!inputValid)
{
System.out.print("How many integers shall we compare? (Enter a positive integer): ");
try {
totalIntegers = input.nextInt();
inputValid = true;
} catch (NumberFormatException e) {
System.out.println("Invalid input!");
}
} // End while //
/* Read in the candidates for smallest integer
* Validate this input as well, this time ensuring that the user has provided a valid int (any int will do at this point) and discarding any other data
*/
for (int ii = 1; ii <= totalIntegers; ii++) {
// Prompt
System.out.print("Enter value " + ii + ": ");
num = input.nextInt();
if (ii == 1) smallest = num;
else if (num < smallest) smallest = num;
} // End for //