下面我将为你提供一个详细的解释,包括基本思路、完整代码、代码解析以及一个更健壮的版本。

(图片来源网络,侵删)
核心思路
switch 语句的核心是 将一个整型或字符型表达式的值与多个 case 标签进行比较,当找到匹配的 case 时,程序就执行该 case 后面的代码。
对于成绩等级,我们通常使用字符(如 'A', 'B')或数字(如 90, 80)来代表,使用字符会更加直观,所以我们的例子将基于字符。
关键点:
- 输入:我们假设已经得到了一个代表分数的整数(
score)。 - 转换:我们需要将这个分数转换成一个等级字符('A', 'B', 'C'...),这是使用
switch的前提。 - 判断:将转换后的等级字符作为
switch的表达式,与各个case进行匹配。 - 输出:根据匹配的
case,输出相应的评语。
示例代码
这是一个完整的、可以直接运行的C语言程序。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int score;
char grade; // 用于存储成绩等级的字符
// 1. 提示用户输入成绩
printf("请输入学生的成绩 (0-100): ");
scanf("%d", &score);
// 2. 输入验证,确保成绩在有效范围内
if (score < 0 || score > 100) {
printf("输入无效,成绩必须在0到100之间,\n");
return 1; // 非正常退出程序
}
// 3. 将分数转换为等级字符 (这是 switch 的关键准备步骤)
// 使用整数除法,自动向下取整
// score / 10 的结果会是一个 0-10 之间的整数
switch (score / 10) {
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break:
default: // 处理 0-5 的情况
grade = 'F';
break;
}
// 4. 使用另一个 switch 语句根据等级输出评语
// 这样可以使逻辑更清晰,将“判断”和“输出”分离
switch (grade) {
case 'A':
printf("优秀!\n");
break;
case 'B':
printf("良好,\n");
break;
case 'C':
printf("中等,\n");
break;
case 'D':
printf("及格,\n");
break;
case 'F':
printf("不及格,需要努力,\n");
break;
default: // 虽然理论上不会执行到这里,但作为一种好的习惯
printf("未知等级,\n");
break;
}
return 0;
}
代码分步解析
包含头文件
#include <stdio.h>
包含了标准输入输出库,这样我们才能使用 printf (打印) 和 scanf (读取) 函数。
变量定义
int score; char grade;
score: 一个整型变量,用来存储用户输入的分数。grade: 一个字符型变量,用来存储最终评定的等级('A', 'B', 'C', 'D', 'F')。
输入与验证
printf("请输入学生的成绩 (0-100): ");
scanf("%d", &score);
if (score < 0 || score > 100) {
printf("输入无效,成绩必须在0到100之间,\n");
return 1;
}
scanf读取用户输入的整数并存入score变量。if语句检查输入是否合法(0到100之间),如果不合法,打印错误信息并退出程序。
核心转换逻辑(第一个 switch)
switch (score / 10) {
case 10:
case 9:
grade = 'A';
break;
// ... 其他 case
}
这是整个程序最巧妙的部分。
score / 10:这是整数除法,它会将分数“降维”到一个更小的范围。- 90-100分:
score / 10的结果是9或10。 - 80-89分:结果是
8。 - 70-79分:结果是
7。 - 60-69分:结果是
6。 - 0-59分:结果是
0到5。
- 90-100分:
case 10:和case 9::这里使用了case串联,因为90-100分都属于A级,所以当score / 10的结果是10或9时,都会执行grade = 'A';,这比写多个独立的if-else if要简洁得多。break;:至关重要!break语句会立即跳出switch语句,如果没有break,程序会“穿透”到下一个case继续执行,这通常不是我们想要的结果(除非是刻意为之的“fall-through”逻辑)。
输出评语(第二个 switch)
switch (grade) {
case 'A':
printf("优秀!\n");
break;
// ... 其他 case
}
这个 switch 结构非常清晰,它接收 grade 变量,根据其不同的值('A', 'B', 'C'...)执行对应的 printf 语句,这种将“数据转换”和“结果输出”分离的方式,使得代码结构更清晰,易于维护和扩展。
更健壮的版本(处理边界情况)
上面的代码已经很不错了,但我们可以让它更完善,比如处理 100 分的情况,并增加一些更细致的评语。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int score;
char grade;
printf("请输入学生的成绩 (0-100): ");
scanf("%d", &score);
if (score < 0 || score > 100) {
printf("输入无效,成绩必须在0到100之间,\n");
return 1;
}
// 更细致的转换逻辑
if (score == 100) {
grade = 'S'; // S for Super
} else {
switch (score / 10) {
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default:
grade = 'F';
break;
}
}
// 更详细的评语输出
switch (grade) {
case 'S':
printf("满分!太棒了!\n");
break;
case 'A':
printf("优秀!继续保持!\n");
break;
case 'B':
printf("良好,还有提升空间,\n");
break;
case 'C':
printf("中等,需要更加努力,\n");
break;
case 'D':
printf("刚刚及格,务必加油!\n");
break;
case 'F':
printf("很遗憾,不及格,请尽快找老师或同学帮助,\n");
break;
default:
printf("发生未知错误,\n");
break;
}
return 0;
}
这个版本增加了对 100 分的特殊处理,并为每个等级提供了更具鼓励性和指导性的评语,使其在实际应用中更加友好和有效。
使用 switch 语句处理成绩等级的关键在于:
- 巧妙地转换数据:利用整数除法 (
score / 10) 将连续的分数范围转换为离散的、适合switch判断的整数值。 - 使用
case串联:将多个情况合并到一个处理分支中(如case 9和case 10都处理为 'A')。 - 不要忘记
break:防止程序意外地“穿透”到下一个case。 - 善用
default:处理所有未明确列出的情况,增加代码的健壮性。
希望这个详细的解释能帮助你完全理解如何在C语言中使用 switch 语句来处理成绩等级!
