You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的switch case内实现局部循环,解决BMI计算器输入校验重复录入身高问题

解决方案

核心实现逻辑是为每个需要校验的输入项设置独立的循环,校验失败时仅重复当前输入步骤,已经校验通过的数值会自动保留,不需要使用goto跳转整个case分支。
原代码还有两处可以优化的细节:

  • 没有使用double.TryParse的布尔返回值判断输入是否为合法数值,仅判断数值大于0的逻辑不够严谨
  • 体重输入错误后直接break退出case,没有实现重输逻辑
    修改后的完整代码如下:
switch (optionsIn)
{
    case 1:
        Console.Clear();
        double heightM;
        // 身高输入独立循环:校验不通过仅重复当前步骤
        while (true)
        {
            Console.WriteLine("请输入身高(单位:米):");
            string heightInput = Console.ReadLine();
            // 同时校验「是否为合法数值」和「数值范围是否合理(大于0)」
            if (double.TryParse(heightInput, out heightM) && heightM > 0)
            {
                Console.Clear();
                break; // 校验通过,跳出身高输入循环
            }
            // 校验不通过走以下错误提示,循环重输
            Console.Clear();
            Console.WriteLine("输入不合法,请输入类似2.1的有效正数");
            Console.WriteLine("按回车键重试");
            Console.ReadKey();
            Console.Clear();
        }

        double weightKgs;
        // 体重输入独立循环:校验不通过仅重复当前步骤,不会清空已录入的身高
        while (true)
        {
            Console.WriteLine("请输入体重(单位:千克):");
            string weightInput = Console.ReadLine();
            if (double.TryParse(weightInput, out weightKgs) && weightKgs > 0)
            {
                Console.Clear();
                break; // 校验通过,跳出体重输入循环
            }
            Console.WriteLine("输入不合法,请输入有效的正数值");
            Console.WriteLine("按回车键重试");
            Console.ReadKey();
            Console.Clear();
        }

        // 两个输入都校验通过后计算BMI
        double bmi = weightKgs / (heightM * heightM);
        Console.WriteLine($"BMI值为:{bmi:F2}"); // 保留两位小数显示更友好

        Console.WriteLine("按任意键退出");
        Console.ReadKey();
        break;
}

如果你想要代码更简洁,也可以把重复的数值输入校验逻辑封装成一个通用方法,后续新增其他输入项时直接调用即可,示例方法如下:

// 通用数值输入校验方法:传入提示文字,返回合法的正数值
static double GetValidPositiveNumber(string prompt)
{
    while (true)
    {
        Console.WriteLine(prompt);
        string input = Console.ReadLine();
        if (double.TryParse(input, out double result) && result > 0)
        {
            Console.Clear();
            return result;
        }
        Console.Clear();
        Console.WriteLine("输入不合法,请输入有效的正数值");
        Console.WriteLine("按回车键重试");
        Console.ReadKey();
        Console.Clear();
    }
}

封装后case1的代码可以简化为:

case 1:
    Console.Clear();
    double heightM = GetValidPositiveNumber("请输入身高(单位:米):");
    double weightKgs = GetValidPositiveNumber("请输入体重(单位:千克):");
    double bmi = weightKgs / (heightM * heightM);
    Console.WriteLine($"BMI值为:{bmi:F2}");
    Console.WriteLine("按任意键退出");
    Console.ReadKey();
    break;

内容的提问来源于stack exchange,提问作者Jjstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:08