You need to enable JavaScript to run this app. for循环理解困难:Java多城市BMI统计程序开发求助
优惠活动
大模型
产品
解决方案
定价
更多

for循环理解困难:Java多城市BMI统计程序开发求助

BMI统计任务实现指引

核心认知:嵌套for循环运行规则

  • 执行顺序:外层循环每完成1次完整迭代,内层循环会从初始值开始跑完所有预设迭代次数,再回到外层循环推进下一次迭代
  • 变量作用域要求:需要跨迭代保留值的变量(如分类计数、统计结果),必须定义在循环外部,不能放在循环体或条件分支内部,否则每次进入作用域都会被重新初始化,之前的累加值会被清空

任务标准要求

  • 输入校验:待统计城市数≥6,单城市统计人数≥10
  • 个体数据处理:录入体重(kg)、身高(m),计算BMI,输出对应分类
    • BMI计算公式:BMI = 体重 / (身高 * 身高)
    • 分类标准:
      • <18.5:低体重
      • 18.5 ≤ BMI <25:正常体重
      • 25 ≤ BMI <30:超重
      • ≥30:肥胖
  • 分层统计输出:
    1. 单城市维度:各BMI分类人数、百分比占比
    2. 全局维度:总城市数、总统计人数、全样本各BMI分类占比、三类极值(正常占比最高的城市、肥胖占比最高的城市、低体重占比最低的城市)

原代码的核心问题

  • 输入校验失效:仅单次判断输入值是否达标,未设置循环引导用户重新输入,不达标时仍继续执行后续流程
  • 死循环风险:内层人员录入的循环未设置计数器更新逻辑,永远无法退出
  • 分类计数失效:BMI分类的计数变量定义在对应if分支内部,每次触发分支时都被重置为0,累加逻辑完全失效
  • BMI判断逻辑错误:
    • 对浮点数BMI值使用==做等值判断,永远无法命中区间条件
    • 所有分支用独立if而非else if,多条件会重复触发
    • 区间边界逻辑不符合分类标准
  • 数据存储缺失:未留存单城市、全局的分类统计值,无法支撑最终的汇总报告生成
  • 数值类型偏差:体重、身高使用整数类型接收,未统一单位,导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 13:06:01