for循环理解困难:Java多城市BMI统计程序开发求助
BMI统计任务实现指引
核心认知:嵌套for循环运行规则
- 执行顺序:外层循环每完成1次完整迭代,内层循环会从初始值开始跑完所有预设迭代次数,再回到外层循环推进下一次迭代
- 变量作用域要求:需要跨迭代保留值的变量(如分类计数、统计结果),必须定义在循环外部,不能放在循环体或条件分支内部,否则每次进入作用域都会被重新初始化,之前的累加值会被清空
任务标准要求
- 输入校验:待统计城市数≥6,单城市统计人数≥10
- 个体数据处理:录入体重(kg)、身高(m),计算BMI,输出对应分类
- BMI计算公式:
BMI = 体重 / (身高 * 身高) - 分类标准:
- <18.5:低体重
- 18.5 ≤ BMI <25:正常体重
- 25 ≤ BMI <30:超重
- ≥30:肥胖
- BMI计算公式:
- 分层统计输出:
- 单城市维度:各BMI分类人数、百分比占比
- 全局维度:总城市数、总统计人数、全样本各BMI分类占比、三类极值(正常占比最高的城市、肥胖占比最高的城市、低体重占比最低的城市)
原代码的核心问题
- 输入校验失效:仅单次判断输入值是否达标,未设置循环引导用户重新输入,不达标时仍继续执行后续流程
- 死循环风险:内层人员录入的循环未设置计数器更新逻辑,永远无法退出
- 分类计数失效:BMI分类的计数变量定义在对应if分支内部,每次触发分支时都被重置为0,累加逻辑完全失效
- BMI判断逻辑错误:
- 对浮点数BMI值使用
==做等值判断,永远无法命中区间条件 - 所有分支用独立
if而非else if,多条件会重复触发 - 区间边界逻辑不符合分类标准
- 对浮点数BMI值使用
- 数据存储缺失:未留存单城市、全局的分类统计值,无法支撑最终的汇总报告生成
- 数值类型偏差:体重、身高使用整数类型接收,未统一单位,导致BMI计算结果错误
修正后的可运行代码
import java.util.Scanner; public class BMISurvey { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 1. 校验并读取城市数 int numOfCity; while (true) { System.out.print("请输入待统计的城市数量(最少6个):"); numOfCity = input.nextInt(); if (numOfCity >= 6) break; System.out.println("输入不符合要求,请输入≥6的整数"); } // 初始化数据存储数组 String[] cityNames = new String[numOfCity]; int[] underweightArr = new int[numOfCity]; // 各城市低体重人数 int[] normalArr = new int[numOfCity]; // 各城市正常体重人数 int[] overweightArr = new int[numOfCity]; // 各城市超重人数 int[] obeseArr = new int[numOfCity]; // 各城市肥胖人数 int[] cityTotalArr = new int[numOfCity]; // 各城市总统计人数 // 全局统计计数器 int globalUnder = 0, globalNormal = 0, globalOver = 0, globalObese = 0, globalTotal = 0; // 外层for循环:遍历每个城市 for (int i = 0; i < numOfCity; i++) { System.out.println("\n=== 录入第" + (i+1) + "个城市信息 ==="); // 读取城市名称 System.out.print("请输入城市名称:"); cityNames[i] = input.next(); // 校验并读取单城市统计人数 int numOfPerson; while (true) { System.out.print("请输入该城市的统计人数(最少10人):"); numOfPerson = input.nextInt(); if (numOfPerson >= 10) break; System.out.println("输入不符合要求,请输入≥10的整数"); } cityTotalArr[i] = numOfPerson; // 单城市计数器,定义在城市循环内、人员循环外,保证累加有效 int cityUnder = 0, cityNormal = 0, cityOver = 0, cityObese = 0; // 内层for循环:遍历当前城市的每个统计对象 for (int j = 0; j < numOfPerson; j++) { System.out.println("\n--- 录入第" + (j+1) + "个统计对象信息 ---"); System.out.print("请输入体重(kg):"); double mass = input.nextDouble(); System.out.print("请输入身高(m):"); double height = input.nextDouble(); double bmi = mass / (height * height); System.out.printf("BMI值:%.1f,分类结果:", bmi); // 正确的分类判断 if (bmi < 18.5) { System.out.println("低体重"); cityUnder++; } else if (bmi < 25) { System.out.println("正常体重"); cityNormal++; } else if (bmi < 30) { System.out.println("超重"); cityOver++; } else { System.out.println("肥胖"); cityObese++; } } // 存储当前城市的统计结果 underweightArr[i] = cityUnder; normalArr[i] = cityNormal; overweightArr[i] = cityOver; obeseArr[i] = cityObese; // 累加全局计数器 globalUnder += cityUnder; globalNormal += cityNormal; globalOver += cityOver; globalObese += cityObese; globalTotal += numOfPerson; // 打印当前城市的统计结果 System.out.println("\n=== " + cityNames[i] + " 城市BMI统计 ==="); System.out.printf("低体重:%d人,占比%.1f%%\n", cityUnder, cityUnder*100.0/numOfPerson); System.out.printf("正常体重:%d人,占比%.1f%%\n", cityNormal, cityNormal*100.0/numOfPerson); System.out.printf("超重:%d人,占比%.1f%%\n", cityOver, cityOver*100.0/numOfPerson); System.out.printf("肥胖:%d人,占比%.1f%%\n", cityObese, cityObese*100.0/numOfPerson); } // 生成全局汇总报告 System.out.println("\n==================== 全局统计汇总报告 ===================="); System.out.println("总统计城市数:" + numOfCity); System.out.println("全样本总统计人数:" + globalTotal); System.out.println("\n全样本各BMI分类占比:"); System.out.printf("低体重:%.1f%%\n", globalUnder*100.0/globalTotal); System.out.printf("正常体重:%.1f%%\n", globalNormal*100.0/globalTotal); System.out.printf("超重:%.1f%%\n", globalOver*100.0/globalTotal); System.out.printf("肥胖:%.1f%%\n", globalObese*100.0/globalTotal); // 计算三类极值 int maxNormalIdx = 0, maxObeseIdx =0, minUnderIdx =0; double maxNormalRatio = normalArr[0]*100.0/cityTotalArr[0]; double maxObeseRatio = obeseArr[0]*100.0/cityTotalArr[0]; double minUnderRatio = underweightArr[0]*100.0/cityTotalArr[0]; for (int i=1; i<numOfCity; i++) { double currNormalRatio = normalArr[i]*100.0/cityTotalArr[i]; if (currNormalRatio > maxNormalRatio) { maxNormalRatio = currNormalRatio; maxNormalIdx = i; } double currObeseRatio = obeseArr[i]*100.0/cityTotalArr[i]; if (currObeseRatio > maxObeseRatio) { maxObeseRatio = currObeseRatio; maxObeseIdx = i; } double currUnderRatio = underweightArr[i]*100.0/cityTotalArr[i]; if (currUnderRatio < minUnderRatio) { minUnderRatio = currUnderRatio; minUnderIdx = i; } } // 打印极值结果 System.out.println("\n极值统计结果:"); System.out.printf("正常体重占比最高的城市:%s,占比%.1f%%\n", cityNames[maxNormalIdx], maxNormalRatio); System.out.printf("肥胖占比最高的城市:%s,占比%.1f%%\n", cityNames[maxObeseIdx], maxObeseRatio); System.out.printf("低体重占比最低的城市:%s,占比%.1f%%\n", cityNames[minUnderIdx], minUnderRatio); input.close(); } }
内容的提问来源于stack exchange,提问作者ZikaHany
相关产品推荐
相关产品推荐

