如何从用户输入获取最值?Java do-while循环实现问题求助
问题排查:do-while循环求最值始终使用初始化值的问题
问题描述
在计算机科学课程作业中,要求用do-while循环找出用户输入的[-100,100]范围内数值的最大值和最小值。但代码运行后,最值始终保持初始化值,无法正确获取用户输入的有效数值;尝试用Integer.MAX_VALUE/Integer.MIN_VALUE初始化变量后,问题依然存在。
用户提供的代码如下:
public static void main(String[] args) { Scanner input = new Scanner(System.in); double number; double max = 0; double min = 0; // Do while loop that asks the user for values from -100, 100, and determine max and min do { System.out.print("Enter value:"); number = input.nextDouble(); if(number == -19.5) { break; } if (number >= -100 && number <= 100) { if (number > max) { max = number; } if (number < min) { min = number; } } else { System.out.print("There were no valid values"); } } while (true); System.out.println("The max value was " + max); System.out.println("The min value was " + min); }
错误原因分析
初始化值逻辑错误
- 用
0初始化max和min时,若用户输入的所有有效数都小于0,max会一直保留0;若所有数都大于0,min也会一直保留0,无法正确更新。 - 换成
Integer.MAX_VALUE/Integer.MIN_VALUE时,这两个值转成double后分别是2147483647.0和-2147483648.0,远超出[-100,100]的范围:用户输入的数永远不会大于max初始值,也永远不会小于min初始值,导致最值始终无法更新。
- 用
未处理第一个有效输入的情况
第一个有效输入时,应该直接将max和min设置为该数值,之后再通过比较更新,否则初始值会干扰后续判断。无效输入提示逻辑错误
当前代码只要输入不在[-100,100]范围内就输出"There were no valid values",但这个提示应该是在循环结束后,确认没有任何有效输入时才输出,否则会出现多次重复提示的问题。
修正后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); double number; double max; double min; boolean hasValidInput = false; // 标记是否有有效输入 do { System.out.print("Enter value:"); number = input.nextDouble(); // 终止条件:输入-19.5时退出循环 if (number == -19.5) { break; } // 判断输入是否在有效范围内 if (number >= -100 && number <= 100) { if (!hasValidInput) { // 第一个有效输入,直接赋值给max和min max = number; min = number; hasValidInput = true; } else { // 后续有效输入,比较更新最值 if (number > max) { max = number; } if (number < min) { min = number; } } } else { System.out.println("输入无效,请输入[-100,100]范围内的数值"); } } while (true); // 循环结束后,根据是否有有效输入输出结果 if (hasValidInput) { System.out.println("The max value was " + max); System.out.println("The min value was " + min); } else { System.out.println("There were no valid values"); } input.close(); // 关闭Scanner资源 } }
关键修改说明
- 新增
hasValidInput布尔变量,标记是否存在有效输入,避免无有效输入时输出初始化值。 - 第一个有效输入时直接将
max和min赋值为该数值,解决初始值干扰问题。 - 调整无效输入的提示信息,改为单次输入无效时的提示,而非错误的全局提示。
- 循环结束后根据
hasValidInput判断输出结果,逻辑更严谨。 - 新增
input.close()关闭Scanner资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者GrilledCatEggs
相关产品推荐
相关产品推荐

