内容正文:
专题四 选择结构
【考纲要求】
知识要点
考试条目
3.选择结构程序设计
(3)掌握 if 语句的使用;
(5)掌握 switch 语句的使用。
【课时安排】
2课时
【知识梳理】
IF 语句
C语言中的选择结构是程序流程控制的重要组成部分,它允许根据不同的条件执行不同的代码块。
if语句是一种基本的控制结构,用于根据条件执行不同的代码块。
一、单分支结构(if)
语法:
if (条件表达式) {
// 条件为真时执行的代码
}
示例:
int age = 18;
if (age >= 18) {
printf("已成年!
");
}
二、双分支结构(if-else)
语法:
if (条件表达式) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
示例:
int num = 5;
if (num % 2 == 0) {
printf("偶数
");
} else {
printf("奇数
");
}
三、多分支结构(else if)
语法:
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件2为真时执行
} else {
// 所有条件都不满足时执行
}
示例(成绩等级判断):
int score = 85;
if (score >= 90) {
printf("A
");
} else if (score >= 80) {
printf("B
");
} else if (score >= 60) {
printf("C
");
} else {
printf("不及格
");
}
四、嵌套 if 结构
if 语句可以多层嵌套,但需注意代码可读性:
int age = 20;
char gender = 'M';
if (age >= 18) {
if (gender == 'M') {
printf("成年男性
");
} else {
printf("成年女性
");
}
}
五、? : 运算符(三元运算符)
条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。
? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个表达式的值。
Switch 语句
switch 语句是C语言中用于处理多分支选择的结构,适用于基于同一变量或表达式的不同离散值进行条件判断的场景。
一、基本语法结构
switch (表达式) {
case 常量1:
代码块1;
break;
case 常量2:
代码块2;
break;
...
default:
默认代码块;
}
关键组成:
表达式:必须为整型(int、char)或枚举类型,不支持浮点型或字符串。
case 常量:必须是编译时常量(如 5、'A'),不能是变量或范围表达式。
Break:用于跳出当前 case,避免执行后续代码(即“case穿透”)。
Default:处理未匹配所有 case 的情况,可选且位置灵活。
二、执行流程
计算表达式值:根据结果与各 case 常量进行严格值匹配。
匹配成功:执行对应 case 后的代码块,遇到 break 则退出 switch。
匹配失败:若存在 default,执行其代码块;否则跳过整个 switch。
穿透现象:若某 case 后无 break,代码会继续执行后续所有 case 的代码,直到遇到 break 或结束。
三、代码示例
示例1:基础用法(判断星期)
int day = 3;
switch (day) {
case 1: printf("周一
"); break;
case 2: printf("周二
"); break;
case 3: printf("周三
"); break;
default: printf("无效输入
");
}
// 输出:周三
示例2:利用穿透(判断元音字母)
char ch = 'e';
switch (ch) {
case 'a':
case 'e': // 穿透到下一case
case 'i':
case 'o':
case 'u':
printf("元音字母
");
break;
default:
printf("非元音字母
");
}
// 输出:元音字母
四、注意事项与常见错误
1. 表达式类型错误
float f = 2.5;
switch (f) { // 错误!表达式不能为浮点型
// ...
}
2. case 后使用变量
int x = 10;
switch (n) {
case x: // 错误!x 是变量,非常量
// ...
}
3. 遗漏 break 导致穿透
int num = 1;
switch (num) {
case 1: printf("1"); // 无 break
case 2: printf("2"); break;
}
// 输出:12(穿透到 case 2)
4. default 的位置
switch (x) {
default: printf("未知"); // 合法但不推荐
break;
case 1: printf("1"); break;
}
【限时练习】
1.以下关于switch语句的描述,正确的是( )
A. switch的表达式可以是float类型
B. case标签后必须是常量表达式
C. default子句必须放在switch的末尾
D. 每个case分支必须包含break
【答案】B
2.执行以下代码后,输出结果是( )
int x = 3;
switch (x) {
case 1: printf("A");
case 2: printf("B");
case 3: printf("C");
case 4: printf("D"); break;
default: printf("E");
}
A. C
B. CD
C. CDE
D. ABCD
【答案】B
3. 以下代码的输出是( )
int a = 2;
if (a = 0) printf("True");
else printf("False");
A. True
B. False
C. 编译错误
D. 运行时错误
【答案】B
4.以下代码的输出是( )
int main()
{
int score = 85;
if (score >= 90) {
printf("A");
}else if (score >= 80){
printf("B");
}else if (score >= 70) {
printf("C");
}else{
printf("D");
}
}
A. A
B. B
C. C
D. D
【答案】B
5.以下能正确判断闰年的代码是( )
A. if (year%4==0) printf("闰年");
B. if (year%400==0) printf("闰年");
C. if (year%4==0 && year%100!=0) printf("闰年");
D. if (year%400==0 || year%4==0 && year%100!=0) printf("闰年");
【答案】D
6.switch语句的表达式可以是double类型。( )
【答案】×
7.每个switch语句都必须包含default子句。
【答案】×
8.break语句可以用于终止switch语句。( )
【答案】√
9.补全代码,使其能根据输入的月份输出对应的季节
int month;
scanf("%d", &month);
switch (month) {
______
printf("春季");
______;
case 6: case 7: case 8:
printf("夏季");
break;
case 9: case 10: case 11:
printf("秋季");
break;
case 12: case 1: case 2:
printf("冬季");
break;
default:
printf("无效月份");
}
【答案】case 3: case 4: case 5:,break;
10.补全代码,使其能正确计算分段函数:
double x, y;
scanf("%lf", &x);
if (x < 0) {
y = -x;
} ______ (x <= 10) {
y = x * x;
} else {
______ ;
}
printf("y=%.2lf", y);
【答案】else if,y = 2 * x - 1
11. 编写程序:输入一个字符,判断其类型(字母、数字、空格、其他)。
答案:
#include <stdio.h>
int main() {
char c;
scanf("%c", &c);
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
printf("字母");
else if (c >= '0' && c <= '9')
printf("数字");
else if (c == ' ')
printf("空格");
else
printf("其他");
return 0;
}
12. . 编写程序:输入年份和月份,输出该月的天数(需考虑闰年)
答案:
#include <stdio.h>
int main() {
int year, month, days;
scanf("%d%d", &year, &month);
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31; break;
case 4: case 6: case 9: case 11:
days = 30; break;
case 2:
if ((year%400==0) || (year%4==0 && year%100!=0))
days = 29;
else
days = 28;
break;
default:
printf("无效月份");
return 1;
}
printf("%d年%d月有%d天", year, month, days);
return 0;
}
【内容小结】
学科网(北京)股份有限公司
$$