求助:如何编写Sentinel控制的while循环计算月平均低温
解决哨兵控制循环计算平均低温的问题
我来帮你搞定这个哨兵循环的写法,顺便修正你代码里的问题~首先咱们先理清楚核心要点:
一、哨兵值的选择原因
哨兵值必须是一个绝对不会出现在有效输入范围内的数值,这样才能明确告诉程序“我输入完所有温度了,可以停止循环了”。
对于气温来说,地球上自然环境下的低温很少会低于-100华氏度(约-73摄氏度),所以咱们可以选**-999**作为哨兵值——这个温度在现实中几乎不可能出现,完全不会和真实的低温数据混淆,是很合适的选择。
二、修正后的完整代码
你的原代码缺少循环条件、累加计数逻辑,还错误地在循环里直接覆盖了输入的温度值,咱们来调整一下:
import java.util.Scanner; public class AverageLowTemp { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 定义哨兵值,用于结束输入 final int SENTINEL = -999; // 初始化总和(用double保证精度)、计数 double totalTemp = 0.0; int count = 0; // 提示用户输入,说明哨兵值的作用 System.out.println("请输入每日的低温(华氏度),输入" + SENTINEL + "结束输入:"); int temp = scan.nextInt(); // 哨兵控制的while循环:只要输入不是哨兵值,就继续处理 while (temp != SENTINEL) { // 把华氏度转换为摄氏度 double celsiusTemp = 5.0 / 9.0 * (temp - 32.0); // 累加转换后的温度,计数加1 totalTemp += celsiusTemp; count++; // 读取下一个温度,准备下一次循环判断 temp = scan.nextInt(); } // 计算并输出平均温度(要避免除以0的情况) if (count > 0) { double averageTemp = totalTemp / count; System.out.printf("该月份的平均低温为:%.2f 摄氏度%n", averageTemp); } else { System.out.println("你没有输入任何温度数据!"); } scan.close(); } }
三、代码关键点解释
- 用
final int SENTINEL = -999定义哨兵值,方便后续维护和修改; - 用
double类型存储总和和平均值,保证计算精度(如果用int会丢失小数部分); - 循环前先读取第一个温度,这是哨兵循环的标准写法——先获取初始值,再判断是否进入循环;
- 循环内部先处理当前输入的温度,再读取下一个值,避免遗漏或重复处理;
- 最后加了
count > 0的判断,防止用户直接输入哨兵值导致除以0的错误。
这样写就能完美实现需求啦,你可以运行测试一下,输入几个温度后输入-999,就能看到正确的平均结果了~
内容的提问来源于stack exchange,提问作者Audrey Washington-Wright
相关产品推荐
相关产品推荐

