C# While循环程序异常:输入未被识别,程序直接执行后续逻辑
你的C#程序问题分析与修复方案
嘿,我帮你定位到了代码里的几个核心问题,这就是为什么程序完全无视用户输入直接执行所有逻辑的原因,下面是问题拆解和修复后的完整代码:
主要问题点
- 错误使用
Console.Read()读取数字:Console.Read()返回的是输入字符的ASCII码值,不是你输入的整数。比如输入"5",它返回的是字符'5'的ASCII码53,输入"-999"时,第一个字符是'-'(ASCII码45),永远触发不了退出条件。而且这个方法只会读取一个字符,剩下的输入内容会被后续的Console.ReadLine()直接读取,导致会员状态的输入被跳过。 - 会员状态判断逻辑失效:你把输入转成了大写存在
upperstring变量里,但判断时却用memberStatus.Equals("Y"),这样输入小写"y"就不会触发会员折扣,逻辑完全没生效。 - 总费用未实现累加:你每次在循环里重新声明
TotalCharge并赋值为+charge,这相当于每次都把当前单次费用赋值给它,根本没有累计之前的总费用。 - 缺少输入合法性验证:如果用户输入非数字内容,程序会直接报错崩溃,没有容错处理。
修复后的完整代码
static void Main(string[] args) { // Local Variable Declaration const double rate1 = 10; const double rate2 = 3; const double maxCharge = 50; double charge; int hoursRented; // 把总费用声明移到循环外,初始化为0 double totalCharge = 0; while (true) { Console.WriteLine("Enter number of hours (-999 to quit) : "); // 使用int.TryParse处理输入,确保读取有效整数 if (!int.TryParse(Console.ReadLine(), out hoursRented)) { Console.WriteLine("请输入有效的数字!"); continue; } if (hoursRented == -999) break; // 计算基础费用 if (hoursRented <= 3) { charge = hoursRented * rate1; } else { charge = (3 * rate1) + ((hoursRented - 3) * rate2); } // 应用最高费用限制 if (charge > maxCharge) { charge = maxCharge; } Console.WriteLine("Are you a member? (Y/N) : "); string memberStatus = Console.ReadLine(); // 处理空输入的情况 if (string.IsNullOrWhiteSpace(memberStatus)) { Console.WriteLine("请输入有效的会员状态(Y/N)!"); continue; } string upperstring = memberStatus.ToUpper(); // 使用转成大写后的变量判断,支持大小写输入 if (upperstring.Equals("Y")) { charge = charge - (charge * 0.1); // 用0.1代替1/10,避免整数除法问题 } // 累加总费用 totalCharge += charge; Console.WriteLine("Customer Charge : {0} | Total Charge To Date : {1}", charge, totalCharge); } }
关键修改说明
- 替换输入读取方式:用
int.TryParse(Console.ReadLine(), out hoursRented)代替Console.Read(),既可以正确读取整数输入,还能在用户输入非数字时给出提示,避免程序崩溃。 - 修复总费用累加逻辑:把
totalCharge的声明移到循环外部,初始化为0,每次循环中用totalCharge += charge实现累计。 - 修正会员判断逻辑:使用转成大写后的
upperstring进行判断,不管用户输入"Y"还是"y"都能正确触发折扣。 - 优化数值计算:把
1 / 10改成0.1,避免整数除法导致结果为0的问题(C#中整数除以整数结果还是整数,1/10等于0,之前的折扣逻辑其实没生效)。 - 增加容错处理:对会员状态的空输入做了判断,避免空字符串调用
ToUpper()报错。
内容的提问来源于stack exchange,提问作者Crizzy K10
相关产品推荐
相关产品推荐

