C#程序平均成绩字母等级错误、哨兵值大小写不敏感实现问题求助
C#成绩统计程序问题修复方案
问题1:平均成绩等级与最后一次输入等级一致
你的猜测完全正确,问题确实出在共用了全局的grade字符串变量。
- 原因:每次输入单条成绩时,你都会将
grade覆盖为当前成绩对应的等级,循环结束后grade存储的永远是最后一次输入成绩的等级。你在计算平均成绩后并没有重新调用DetermineGrade方法计算平均分数对应的等级,直接复用了旧的grade值,所以才会出现平均等级和最后一次输入等级完全一致的问题。 - 修复方案:
- 将单次成绩对应的等级改为局部变量,避免污染全局变量
- 计算平均成绩后,将平均值转换为整数,调用
DetermineGrade单独计算平均分数对应的等级再输出
问题2:哨兵值大小写不敏感匹配及ToLower()报错
- 报错原因:你遇到的
CS0019错误是因为调用ToLower方法时遗漏了方法必需的括号(),编译器会把没有括号的ToLower识别为方法组(方法本身的引用),而不是调用方法后返回的小写字符串,自然不能直接和字符串做相等判断。 - 正确实现:所有判断哨兵值的位置,都将输入字符串转小写后和小写的
quit匹配,写法为entry.ToLower() == "quit"。注意需要同时修改Main方法和GetEntry方法中的两处哨兵判断逻辑,否则大小写不敏感不会生效。
修复后的完整代码
using System; class Program { public static void Main (string[] args) { int sum=0; int count = 0; bool KeepGoing = true; while (KeepGoing){ string entry = GetEntry(); if (entry.ToLower() == "quit") { KeepGoing = false; } else { int anInt = Convert.ToInt32(entry); // 单次成绩等级用局部变量,避免全局变量污染 string singleGrade = DetermineGrade(anInt); sum += anInt; count++; Console.WriteLine("A grade of {0} is a(n) {1}", anInt, singleGrade); } } double average = sum/ (double)count; // 单独计算平均成绩对应的等级 int averageRounded = Convert.ToInt32(average); string averageGrade = DetermineGrade(averageRounded); Console.WriteLine("The average is {0} is a(n) {1}", average, averageGrade); } public static string DetermineGrade(int anInt) { if (anInt >= 90){ return "A"; } // 原代码用的按位与&改为逻辑与&&,更符合条件判断的使用场景 if (anInt >= 80 && anInt <= 89){ return "B"; } if (anInt >= 70 && anInt <= 79){ return "C"; } if (anInt >= 60 && anInt <= 69){ return "D"; } else{ return "F"; } } public static string GetEntry() { while (true){ Console.WriteLine("Please enter your grade or enter Quit to end program."); string entry = Console.ReadLine(); if (entry.ToLower() == "quit"){ return entry; } int anInt; if (Int32.TryParse (entry, out anInt)) { if (anInt>= 0 && anInt <= 100) { return entry; } else { Console.WriteLine("Error: Please enter a valid integer between 0 and 100!"); } } else { Console.WriteLine("Error: Please enter a valid number or Quit to exit!"); } } } }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

