第三章 · 选择结构程序设计知识点精讲

知识点3 switch 语句

多分支选择结构 —— case匹配、break跳转与default默认

switch语法 case穿透 break/default 2道巩固练习
知识点3:switch语句。讲解switch语法、case穿透、break/default,配套真题和巩固练习。
真题回顾

2025年真题 · 程序填空

真题回顾:阶梯电价

📝 题目 居民月用电量C(度)按阶梯计费,用switch语句实现电费计算。
档次用电量C(度)单价(元/度)
第一档0 < C ≤ 2000.58
第二档200 < C ≤ 5000.73
第三档C > 5000.92
2025真题 #include<stdio.h> int main(){ int c; float m; float m1=200*0.58; // ① float m2=300*0.73; printf("C="); scanf("%d",&c); // ② if(c<0){ printf("error!"); return 1; } else { switch((c+99)/100) {
case 0: case 1: case 2: m=c*0.58; // ③ break; case 3: case 4: case 5: m=m1+(c-200)*0.73; break; default: // ④ m=m1+m2+(c-500)*0.92; } } printf("m=%.2f",m); return 0; }
2025年真题:阶梯电价。4个空:①float m1=200*0.58 ②scanf("%d",&c) ③m=c*0.58 ④default。
真题解析

答案解析 · 阶梯电价

真题解析:填空答案

float m1=200*0.58;

预计算第一档总费用(200度×0.58元/度)

scanf("%d",&c);

读取用户输入的用电量c

m=c*0.58;

第一档电费 = 用电量 × 0.58

default:

处理第三档(C>500)的情况

🔑 关键技巧:(c+99)/100

这是一个整数除法取整技巧,将用电量映射到switch的case值:

c范围(c+99)/100匹配case档次
1~1001case 0~2第一档
101~2002case 0~2第一档
201~3003case 3~5第二档
301~5004~5case 3~5第二档
501+6+default第三档
💡 考点
switch的case穿透、default分支、整数除法取整技巧
解析4个填空,重点讲解(c+99)/100的整数除法取整技巧和case穿透机制。
真题回顾

例2 · 程序分析结果题

嵌套switch语句分析

📝 题目 下列程序的运行结果是________。
例2 #include<stdio.h> main() { int x=2,y=7,z=5; switch(x>2) { case 1:switch(y>0) { case 1:printf("1");break; case 2:printf("2");break; } case 0:switch(z==5) { case 0:printf("3");break; case 1:printf("4");break; default:printf("5");break; } default:printf("6"); } }

🔍 执行流程分析

x>2 → 2>2 → 0(假)

匹配 case 0,进入内层switch

z==5 → 5==5 → 1(真)

匹配 case 1 → 输出"4"

break跳出内层switch

继续执行外层 default → 输出"6"

⚠️ 关键陷阱
break只跳出最近一层switch!不会跳出外层switch,因此继续执行外层default。
✅ 答案
输出:46
例2:x>2为0匹配case 0,z==5为1匹配case 1输出"4",break只跳内层,继续执行外层default输出"6",结果46。
知识点分析

switch 语句 · 基本语法

知识点分析(一):语法结构

switch语法模板 switch (表达式) { case 常量表达式1: // 匹配时执行 语句块1; break; case 常量表达式2: // 匹配时执行 语句块2; break; ... 更多case ... default: // 以上都不匹配时执行 默认语句块; break; }
1

switch表达式

表达式必须是整型(int/char等),不能是浮点型或字符串。计算后与各case比较。

2

case标签

必须是整型常量表达式,不能是变量。各case值必须互不相同。

3

break语句

每个case块末尾应使用break跳出switch,否则会继续执行后续case(穿透效应)。

switch语法:表达式必须整型,case必须常量表达式,break防止穿透。
知识点分析

switch 语句 · 进阶规则

知识点分析(二):case穿透与default

🔀 case穿透(Fall-through)

当case块没有break时,执行完该case后会继续执行下一个case的代码,直到遇到break或switch结束。

case 1: case 2: case 3: printf("春季"); break; // case 1/2/3共享同一段代码

✓ 利用穿透可实现多case共享代码

📦 default语句

default是可选的,用于处理所有case都不匹配的情况。如果没有default且无匹配,switch直接跳过。

switch(month) { case 12: case 1: case 2: printf("冬季"); break; default: printf("输入无效"); }

⚠️ default通常放在最后,但语法上可放任意位置

💡 记忆要点
switch = 多路开关。case匹配后开始执行,break结束执行。无break则穿透。default兜底处理。
case穿透:无break时继续执行下一个case。default:可选,处理无匹配情况。
巩固提高

练习1 · 程序填空

月份判断季节

📝 题目 输入1~12的整数(月份),输出对应季节。3/4/5→春季,6/7/8→夏季,9/10/11→秋季,12/1/2→冬季,其他→无效。
练习1 #include<stdio.h> int main() { int month; printf("请输入1~12的整数(代表月份):"); scanf("%d", &month); switch (month) { case 3: case 4: case 5: printf("春季\n"); break; case 6: case 7: case 8: printf("夏季\n"); break; case 9: case 10:

填空①   &month

scanf传入month的地址

填空②   case 5:

春季包含3、4、5月,利用穿透共享代码

填空③   break;

夏季输出后需要break跳出switch

📋 补充代码

case 11: printf("秋季\n");break; case 12: case 1: case 2: printf("冬季\n");break; default: printf("输入的月份无效!\n");
练习1:月份判断季节。填空①:&month ②:case 5: ③:break;。利用case穿透共享代码。
巩固提高

练习2 · 程序分析结果题

分析程序输出结果

📝 题目 下列程序的运行结果是________。
练习2 #include<stdio.h> int main() { int a=19; switch(a%7) { case 4:a++; case 5:a+=2; case 6:a+=3; default:a+=4; } printf("a=%d",a); return 0; }

🔍 逐步追踪

步骤操作a值
初始a=1919
a%7 = 19%7 = 519
匹配case 5: a+=221
穿透→case 6: a+=3 (无break!)24
穿透→default: a+=4 (无break!)28
⚠️ 关键点
所有case都没有break!从匹配的case 5开始,一路穿透执行到default结束。
✅ 答案
输出:a=28
练习2:a=19,a%7=5匹配case 5,无break一路穿透:a+=2→21,a+=3→24,default a+=4→28。输出a=28。

知识点3 · 完

switch 语句小结

switch表达式必须为整型,case必须为常量

无break会发生穿透,可利用此特性共享代码

break只跳出最近一层switch(嵌套时注意)

default处理无匹配情况,是可选的

下一篇:知识点4 巩固练习题 →

小结switch语句知识点,引导学生进入巩固练习环节。