如何在C语言中使用switch case实现该成绩统计程序功能
实现思路
我们可以通过整数除法将0100的分数映射为010的离散值,直接适配switch case的匹配规则,替换原if分支的分数段判断逻辑,同时保留原有合法性校验、及格/不及格统计的全部功能,还可以兼容你代码中已定义的等级统计变量。
修改后完整代码
#include <stdio.h> int main() { int i=0, marks=0, pass=0, fail=0; int A_Plus=0,A=0,A_minus=0,B_Plus=0,B =0,B_minus=0,C_Plus=0,C=0,C_minus=0,D_Plus=0,D=0,F=0; while(1) { scanf("%d", &marks); // 输入-1直接终止循环 if (marks == -1) { break; } // 合法性校验 if(marks < 0 || marks > 100) { printf("You enter invalid mark: %d \n",marks); continue; } // 分数有效,总计数+1 i++; // 整除10压缩为0~10的离散值 switch(marks / 10) { // 满分90-100属于A类,及格 case 10: A_Plus++; pass++; break; case 9: if (marks >= 95) A_Plus++; else if (marks >= 90) A++; pass++; break; // 80-89属于B类,及格 case 8: if (marks >= 85) B_Plus++; else if (marks >= 80) B++; pass++; break; // 70-79属于C类,及格 case 7: if (marks >= 75) C_Plus++; else if (marks >= 70) C++; pass++; break; // 60-69属于D类,及格 case 6: if (marks >= 65) D_Plus++; else if (marks >= 60) D++; pass++; break; // 0-59属于F,不及格 case 5: case 4: case 3: case 2: case 1: case 0: F++; fail++; break; } } // 可自行添加统计结果打印逻辑 printf("总人数:%d,及格:%d,不及格:%d\n", i, pass, fail); return 0; }
逻辑说明
- 修复了原代码中
marks未初始化就进入while判断的未定义行为问题,用break主动终止循环逻辑更清晰 - 利用switch的fall-through特性,将0~59分的多个case合并处理,无需写重复代码
- 保留了原代码的全部功能,同时补充了你预先定义的等级统计变量的赋值逻辑,不需要的话可以直接删除等级相关代码,仅保留pass/fail的计数即可
内容的提问来源于stack exchange,提问作者sk567
相关产品推荐
相关产品推荐

