第三章 · 选择结构程序设计综合练习

知识点4 巩固练习题

选择结构综合练习 —— 涵盖if、if嵌套、switch全部考点

程序分析结果题 程序填空题 程序改错题 程序设计题
知识点4:巩固练习题。涵盖程序分析结果题、程序填空题、程序改错题和程序设计题四种题型,综合考查if、if嵌套和switch。
练习总览

综合练习 · 题目分布

练习题目总览

1

程序分析结果

if语句

分析if-else条件判断程序的输出

2

程序填空

switch语句

成绩等级转换switch填空

3

程序改错

if嵌套

找出并修正if嵌套中的错误

4

程序分析结果

switch穿透

分析switch穿透效应的输出

5

程序填空

if-else if

BMI指数分级填空

6

程序改错

switch语句

修正switch语句中的错误

7

程序设计

综合应用

if与switch转换设计题

共7道题:2道程序分析结果题、2道程序填空题、2道程序改错题、1道程序设计题。覆盖if、if嵌套、switch全部考点。
巩固练习

第1题 · 程序分析结果题

if-else条件判断 if语句

📝 题目 下列程序的运行结果是________。
第1题 #include<stdio.h> int main(){ int a=10, b=20, c=0; if(a>5 && b<15) c=a+b; else if(a>5 && b>=15) c=b-a; else c=a*b; printf("c=%d", c); return 0; }

🔍 条件分析

条件判断结果
a>5 && b<1510>5✓ && 20<15✗
a>5 && b>=1510>5✓ && 20≥15✓

💡 执行过程

① 第一个条件 a>5 && b<15 中,b=20不小于15,为
② 进入 else if,条件为
③ 执行 c=b-a=20-10=10

✅ 答案
c=10
第1题:a=10,b=20。第一个条件a>5&&b<15为假(b=20≥15),else if条件a>5&&b>=15为真,执行c=b-a=10。
巩固练习

第2题 · 程序填空题

成绩等级转换 switch语句

📝 题目 输入成绩(0~100的整数),用switch语句输出等级。90~100→A,80~89→B,70~79→C,60~69→D,60以下→E。
第2题 #include<stdio.h> int main(){ int score; printf("请输入成绩:"); scanf("%d",&score); if(score<0||score>100){ printf("输入无效!\n"); return 0; } switch(score/10) { // ① case 10: case 9: printf("A\n"); break; case 8: printf("B\n"); break; // ② case 7: printf("C\n"); break; case 6: printf("D\n"); break; default: // ③ printf("E\n"); } return 0; }

填空①   score/10

将成绩除以10取整,把0~100映射到0~10的case值。如95→9,82→8。

填空②   break;

case 8输出"B"后需要break跳出,否则会穿透到case 7输出"C"。

填空③   default:

score/10结果为0~5时(即60分以下),用default输出"E"。

💡 考点
整数除法取整映射、case穿透利用、break跳出、default默认分支
第2题:成绩等级转换。填空①:score/10(整数除法映射)②:break; ③:default:。
巩固练习

第3题 · 程序改错题

if嵌套改错 if嵌套

📝 题目 输入三个整数a、b、c,输出最大值。程序中有两处错误,请找出并改正。
原始代码(有错) #include<stdio.h> int main(){ int a,b,c,max; printf("请输入三个整数:"); scanf("%d%d%d",&a,&b,&c); if(a>b) ← 错误1 if(a>c) max=a; else max=c; else ← 错误2(else配对问题) if(b>c) max=b; else max=c; printf("max=%d\n",max); return 0; }

❌ 错误1(if(a>b)缺少花括号)

问题:if(a>b)没有花括号,导致else与内层if(a>c)配对
改正:添加花括号明确配对关系
if(a>b) { if(a>c)...else... } else {...}

❌ 错误2(else配对错误)

问题:else本意与if(a>b)配对,实际与最近的if(a>c)配对
改正:用花括号将内层if-else括起,使外层else正确配对

✅ 改正后代码

if(a>b) { if(a>c) max=a; else max=c; } else { if(b>c) max=b; else max=c; }
第3题:三数求最大值。错误1和2都是else配对问题——缺少花括号导致else与内层if配对。改正:添加花括号。
巩固练习

第4题 · 程序分析结果题

switch穿透分析 switch

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

🔍 逐步追踪

步骤操作y值break?
初始x=3, y=00
匹配case 3: y+=33
穿透→case 4: y+=47
break跳出switch7
⚠️ 关键点
case 3没有break,穿透到case 4。case 4有break,在此停止。case 5不会执行。
✅ 答案
y=7
第4题:x=3匹配case 3,无break穿透到case 4(y+=3→3, y+=4→7),case 4有break停止。输出y=7。
巩固练习

第5题 · 程序填空题

BMI指数分级 if-else if

📝 题目 输入体重(kg)和身高(m),计算BMI=体重/身高²,按标准输出分级。
第5题 #include<stdio.h> int main(){ float w,h,bmi; printf("输入体重(kg)和身高(m):"); scanf("%f%f",&w,&h); bmi=w/(h*h); // ① if(bmi<18.5) // ② printf("偏瘦"); else if(bmi<24) printf("正常"); else if(bmi<28) printf("偏胖"); else printf("肥胖"); return 0; }

填空①   w/(h*h)

BMI计算公式:体重÷身高²。注意使用浮点除法。

填空②   bmi<18.5

BMI<18.5为偏瘦,18.5~24正常,24~28偏胖,≥28肥胖。

📋 BMI分级标准

BMI范围等级
< 18.5偏瘦
18.5 ~ 23.9正常
24 ~ 27.9偏胖
≥ 28肥胖
第5题:BMI填空。①:w/(h*h)计算BMI ②:bmi<18.5判断偏瘦。使用if-else if-else链式判断。
巩固练习

第6题 · 程序改错题

switch改错 switch

📝 题目 输入星期几(1~7),输出对应英文。程序中有两处错误,请改正。
原始代码(有错) #include<stdio.h> int main(){ int day; scanf("%d",&day); switch(day) { ← 错误1 case 1: printf("Monday\n"); ← 错误2 case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default: printf("无效输入\n"); } return 0; }

❌ 错误1(switch语法错误)

分析:switch(day)语法本身正确,但应检查输入范围
修正:在switch前添加范围检查
if(day<1||day>7){printf("无效");return 0;}
或依赖default处理(非必须修正,看题目要求)

❌ 错误2(case 1缺少break)

问题:case 1输出"Monday"后没有break,会穿透到case 2
改正:添加break语句
case 1: printf("Monday\n"); break;

💡 考点
switch中break的必要性、case穿透效应、输入验证
第6题:星期转换。错误1:缺少输入范围验证(可选);错误2:case 1缺少break导致穿透输出两个结果。
巩固练习

第7题 · 程序设计题

if与switch转换 综合应用

📝 题目

某快递公司收费规则:重量w(kg)≤1kg收费10元;1kg<w≤5kg收费15元;5kg<w≤10kg收费20元;w>10kg收费25元。
要求:先用if-else if语句实现,再将if-else if转换为等价的switch语句实现。

方案一:if-else if 实现

if-else if #include<stdio.h> int main(){ float w; int fee; printf("输入重量(kg):"); scanf("%f",&w); if(w<=1) fee=10; else if(w<=5) fee=15; else if(w<=10) fee=20; else fee=25; printf("运费:%d元\n",fee); return 0; }

方案二:switch 转换实现

switch转换 #include<stdio.h> int main(){ float w; int fee; printf("输入重量(kg):"); scanf("%f",&w); int n=(int)(w+999)/1000; // 利用整数除法映射 switch(n){ case 0: // w=0,不处理 fee=10; break; default: if(w<=1) fee=10; else if(w<=5) fee=15; else if(w<=10) fee=20; else fee=25; } printf("运费:%d元\n",fee); return 0; } /* 注:范围判断用switch 需要巧妙映射,不如if直观 */
💡 设计要点
switch适合离散值匹配,if适合范围判断。范围问题转switch需要整数除法映射技巧。两种结构可以等价转换,但if-else if在范围判断场景更自然。
第7题:快递收费。if-else if直接判断范围;switch需要整数除法映射。展示if与switch的等价转换思路。
参考答案

全部题目 · 答案汇总

答案速查表

题号 题型 考点 答案 关键点
1 程序分析结果 if-else if条件判断 c=10 逻辑运算符&&、else if链
2 程序填空 switch成绩等级 ①score/10 ②break; ③default: 整数除法映射、case穿透
3 程序改错 if嵌套else配对 添加花括号{} 悬空else问题
4 程序分析结果 switch穿透效应 y=7 无break穿透到下一个case
5 程序填空 if-else if BMI分级 ①w/(h*h) ②bmi<18.5 浮点运算、范围判断
6 程序改错 switch缺break case 1添加break; break防止穿透
7 程序设计 if与switch转换 见第9页完整代码 范围问题映射技巧
答案汇总:1.c=10 2.score/10,break;,default: 3.添加花括号 4.y=7 5.w/(h*h),bmi<18.5 6.添加break 7.见代码

巩固练习 · 完

选择结构综合复习

if语句:非零为真、else配对、三目运算符

if嵌套:else与最近if配对,用花括号明确关系

switch:case穿透、break跳出、default默认

转换:if与switch可等价转换,注意范围映射

祝考试顺利!

总结全部知识点,鼓励学生备考。涵盖if、if嵌套、switch的核心要点和转换方法。