C# 加法计算器如何实现输入无效后重新请求用户输入
核心问题定位
- 输入流程的循环逻辑完全未闭环:单个数字输入无效时,你定义了
TryAgain标记变量但没有用它控制循环回退,既不重新索要当前位置的输入,也不阻止流程推进到下一个输入项,导致无效输入对应的数组位置保留上一次计算的残留值,后续求和时就会把旧值叠进去 - 无输入校验的硬转换风险:获取输入数量时直接用
int.Parse、获取单个数字时冗余的Parse逻辑,会在用户输入非数字字符时直接触发程序崩溃,且没有校验输入数量是否超过数组最大长度10,容易触发数组越界异常 - 重试交互逻辑冗余:原代码在输入无效时额外弹出“要不要重试”的问询,不符合“无效输入直接重新请求”的核心需求,反而增加无意义的交互步骤
修正后实现
class MainClass { const int MaxInputCount = 10; // 定义数组最大容量,避免硬编码魔法值 public static void Main(string[] args) { Console.WriteLine("Hello Ulises Sanchez"); float[] userInput = new float[MaxInputCount]; int numberOfUserInputs; string doMoreFunctions = "Add More Numbers Together - y = yes - anything else for no"; bool moreActions; do { Console.Clear(); Array.Clear(userInput, 0, userInput.Length); numberOfUserInputs = GetUserInput(userInput); Summation(userInput, numberOfUserInputs); moreActions = false; Console.WriteLine(doMoreFunctions); string inputString = Console.ReadLine(); if (inputString == "y" || inputString == "Y") moreActions = true; } while (moreActions); } static int GetUserInput(float[] inputArray) { string userInputPrompt = "How many numbers do you want to enter?"; string errorMessage = "Invalid Input, please try again"; int numberOfInputs; // 第一步:循环直到获取有效的输入数量 while (true) { Console.Write(userInputPrompt); string inputString = Console.ReadLine(); // 校验:必须是整数、范围在1到数组最大长度之间 if (int.TryParse(inputString, out numberOfInputs) && numberOfInputs >=1 && numberOfInputs <= inputArray.Length) { break; } Console.WriteLine(errorMessage); } // 第二步:逐个获取数字,无效输入直接卡当前步骤,不推进索引 for (int i = 0; i < numberOfInputs; i++) { while (true) { Console.Write("Enter variable number {0}: ", i + 1); string inputString = Console.ReadLine(); if (float.TryParse(inputString, out float result)) { inputArray[i] = result; break; } Console.WriteLine(errorMessage); } } return numberOfInputs; } static void Summation(float[] inputArray, int numberOfInputs) { float summationResult = 0.0f; for (int i = 0; i < numberOfInputs; i++) { summationResult += inputArray[i]; } Console.WriteLine("Summation = {0}", summationResult); } }
关键逻辑说明
- 每一个用户输入节点,都单独配置了「收到有效输入才退出」的内层循环:输入无效时直接打印提示,原地重新索要当前位置的输入,不会推进流程到下一个步骤,也不会残留无效值
- 所有类型转换全部使用
TryParse实现,从根源避免非数字输入导致的程序直接崩溃 - 每次进入新的计算流程前,强制清空整个输入数组,彻底杜绝上一轮计算的残留数据参与下一轮求和
- 移除了冗余的“是否重试”问询,输入错误时直接请求当前位置的有效输入,交互流程更贴合需求
内容的提问来源于stack exchange,提问作者Ulises Sanchez
相关产品推荐
相关产品推荐

