如何在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
相关产品推荐
相关产品推荐

