C#控制台程序:如何实现嵌套while循环独立执行?
解决嵌套while循环冲突的问题
我看了你的代码,问题出在内层循环的逻辑设计上——当用户输入错误的薪资发放类型时,你把AskQuestion设为false,导致内层循环结束,但外层的while(wageCalculated == false)还在运行,所以整个程序就重启了。而且内层循环没有重新读取用户的输入,根本达不到“重复询问直到输入正确”的目的。
下面是修复后的思路和代码:
关键修复点
- 内层循环应该持续运行直到用户输入
W或B,所以要在输入错误时重新读取用户输入,保持循环条件为true直到输入正确。 - 把“是否重启程序”的逻辑移到内层循环外面,确保只有当用户完成一次正确的薪资计算后,才会触发重启询问。
- 重置内层循环的状态变量,避免后续循环出现异常。
修改后的完整代码
using System; namespace WageCalc { class Program { static void Main(string[] args) { // Variables string hourWorkedInput; string wageInput; double hourlyWage = 0.00; int hoursWorkedAWeek = 0; double payCheck; bool wageCalculated = false; // Actual Code while (!wageCalculated) { Console.WriteLine("Welcome to the Monthly Wage Calculator"); Console.WriteLine("Please enter how much you are paid an hour"); wageInput = Console.ReadLine(); // 新增:处理非数字输入的异常情况 while (!double.TryParse(wageInput, out hourlyWage)) { Console.WriteLine("请输入有效的数字!"); wageInput = Console.ReadLine(); } Console.WriteLine("Please enter how many hours you work a week"); hourWorkedInput = Console.ReadLine(); // 新增:处理非整数输入的异常情况 while (!int.TryParse(hourWorkedInput, out hoursWorkedAWeek)) { Console.WriteLine("请输入有效的整数!"); hourWorkedInput = Console.ReadLine(); } Console.WriteLine("Do you get paid (W)eekly or (B)iweekly?"); string often = Console.ReadLine(); bool askQuestion = true; // 内层循环:仅处理薪资类型输入错误的重复询问 while (askQuestion) { if (often.Equals("W", StringComparison.OrdinalIgnoreCase)) { payCheck = hoursWorkedAWeek * hourlyWage; Console.WriteLine("You will make {0} on every paycheck", payCheck); askQuestion = false; // 输入正确,结束内层循环 } else if (often.Equals("B", StringComparison.OrdinalIgnoreCase)) { payCheck = (hoursWorkedAWeek * 2) * hourlyWage; Console.WriteLine("You will make {0} on every paycheck", payCheck); askQuestion = false; // 输入正确,结束内层循环 } else { Console.WriteLine("Please pick W or B"); often = Console.ReadLine(); // 重新读取用户输入,继续循环 } } // 内层循环结束后,统一询问是否重启程序 Console.WriteLine("Would you like to Calculate another Paycheck?"); string repeat = Console.ReadLine(); switch (repeat.ToUpper()) { case "Y": wageCalculated = false; break; case "N": wageCalculated = true; break; default: Console.WriteLine("Invalid input, exiting program."); wageCalculated = true; break; } } } } }
额外优化说明
- 新增了
double.TryParse和int.TryParse逻辑,避免用户输入非数字内容导致程序崩溃。 - 用
StringComparison.OrdinalIgnoreCase实现不区分大小写的输入识别,用户输入w或b也能正常响应,提升交互友好度。 - 彻底分离了两个循环的职责:内层循环只负责修正薪资类型的错误输入,外层循环只控制整个程序的重启逻辑,两者不再互相干扰。
这样修改后,输入错误的薪资类型时只会重复询问该问题,不会触发整个程序重启,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Recht88
相关产品推荐
相关产品推荐

