基于switch语句的成绩评级系统代码故障排查与优化请求
成绩评级代码问题排查与优化
问题根源
你这段代码的核心问题是完全误用了switch语句的匹配逻辑:
- switch是用输入的分数值去匹配case后的常量,比如输入85,switch会找
case 85:,但你写的case都是1、2、3这类固定数字,根本匹配不上任何有效分数,所以直接走到default输出F。 - 无效分数的判断放在
case 1:里,只有输入1才会进入这个分支,其他无效值(比如101、-5)根本不会触发这个判断。 - 每个case里嵌套if,完全浪费了switch的作用,代码冗余且逻辑混乱。
优化后的代码
#include <stdio.h> int main() { int score; printf("请输入0-100之间的成绩:"); scanf("%d", &score); // 先校验输入合法性 if (score < 0 || score > 100) { printf("无效成绩,请输入0-100之间的数值\n"); return 0; } // 通过score/10将分数映射到固定区间,适配switch匹配 switch (score / 10) { case 10: // 100分单独处理 case 9: // 90-99分 case 8: // 80-89分 printf("A+\n"); break; case 7: // 70-79分 printf("A\n"); break; case 6: // 60-69分 printf("A-\n"); break; case 5: // 50-59分 printf("B\n"); break; case 4: // 40-49分 printf("C\n"); break; case 3: // 32-39分,补充下限判断 if (score >= 32) { printf("D\n"); } else { printf("F\n"); } break; default: // 0-31分 printf("F\n"); break; } return 0; }
优化说明
- 提前做输入合法性校验,直接拦截无效分数,逻辑更清晰
- 用
score/10将分数段映射为固定整数,完美适配switch的匹配逻辑,避免冗余if判断 - 合并相同评级的case(比如80-100都对应A+),大幅简化代码结构
- 针对32-39分的特殊区间,在case3里补充下限判断,严格符合原需求
- 增加换行和友好提示,提升用户使用体验
内容的提问来源于stack exchange,提问作者Khabib Nurmagomedhov
相关产品推荐
相关产品推荐

