成绩区间统计代码从if转换为switch后运行异常,错误原因是什么?
问题分析
你的switch版本代码存在两个核心错误,直接导致统计结果异常:
- 缺失遍历所有学生的循环逻辑
正常运行的if版本外层包了for (int i = 0; i < students.Length; i++)循环,会逐个处理每个学生的成绩。但switch版本只定义了int i = 0,仅处理了下标为0的第一个学生,其余所有学生完全没有进入统计逻辑,自然不会有计数。 - switch的case匹配逻辑完全错误
switch语句的case是全等匹配规则,你在switch括号中传入的是学生的成绩值(0-100的整数),但写的case 1、case 2等是把case当成了区间编号,只有当学生成绩刚好等于1/2/3/4时才会进入对应case分支,其余所有成绩都匹配不到预设case,直接走default分支,这也是为什么大部分分数都被统计到90+区间的原因。
修正后的switch实现
版本1(基于C# 7+的case when语法,逻辑更直观)
// 加上遍历所有学生的外层循环 for (int i = 0; i < students.Length; i++) { switch (students[i].Grade) { case int g when g <= 59: distributions[0] += 1; break; case int g when g >= 60 && g <= 69: distributions[1] += 1; break; case int g when g >= 70 && g <= 79: distributions[2] += 1; break; case int g when g >= 80 && g <= 89: distributions[3] += 1; break; // 90分及以上走默认分支 default: distributions[4] += 1; break; } } Console.WriteLine("0-59: {0}\n60-69: {1}\n70-79: {2}\n80-89: {3}\n90-100: {4}", distributions[0], distributions[1], distributions[2], distributions[3], distributions[4]);
版本2(传统switch写法,兼容旧版本C#)
利用成绩整除10的结果做固定值匹配,逻辑更简洁:
for (int i = 0; i < students.Length; i++) { int gradeLevel = students[i].Grade / 10; switch (gradeLevel) { case 0: case 1: case 2: case 3: case 4: case 5: distributions[0] += 1; break; case 6: distributions[1] += 1; break; case 7: distributions[2] += 1; break; case 8: distributions[3] += 1; break; // 9、10对应90-99、100分 default: distributions[4] += 1; break; } } Console.WriteLine("0-59: {0}\n60-69: {1}\n70-79: {2}\n80-89: {3}\n90-100: {4}", distributions[0], distributions[1], distributions[2], distributions[3], distributions[4]);
内容的提问来源于stack exchange,提问作者Walter Melon
相关产品推荐
相关产品推荐

