一、核心概念:选择结构的作用
选择结构是程序三大基本结构(顺序、选择、循环)之一,用于实现“根据条件执行不同操作”的逻辑,让计算机具备“判断决策”能力。
二、二分支选择结构(二选一)
二分支结构根据条件真假,从两个操作中选择一个执行,核心实现方式为if语句和条件运算符。
1. if语句实现二分支
(1)基本格式
if (表达式) 语句1;
else 语句2;
(2)执行逻辑
- 计算“表达式”的值,C语言中非0为真,0为假。
- 若表达式为真(非0),执行语句1后退出选择结构;若为假(0),执行语句2后退出。
(3)常见条件表达式类型
- 关系表达式:
if(x != 0)(x不等于0时为真)、if(a >= b)(a大于等于b时为真)。
- 逻辑表达式:
if(x > 0 && y > 0)(x和y都大于0时为真)。
- 算术表达式:
if(x + 3.5)(x+3.5不等于0时为真)。
- 变量/常量:
if(x)(x非0为真)、if(1)(常量非0为真)、if(0)(常量0为假)。
(4)示例1:求两个整数的最大值
#include<stdio.h>
int main() {
int a, b, max;
printf("Input a,b:\n");
scanf("%d,%d", &a, &b);
if(a >= b) max = a; // 条件真时执行
else max = b; // 条件假时执行
printf("max=%d", max);
return 0;
}
(5)示例2:求解一元二次方程ax²+bx+c=0的根
#include<stdio.h>
#include<math.h> // 调用平方根函数sqrt需引入
int main() {
double a, b, c, disc, x1, x2, p, q;
scanf("%lf%lf%lf", &a, &b, &c);
disc = b*b - 4*a*c; // 计算判别式
if(disc < 0)
printf("This equation hasn't real roots."); // 无实根
else {
p = -b/(2.0*a);
q = sqrt(disc)/(2.0*a);
x1 = p + q;
x2 = p - q;
printf("real roots:\nx1=%7.2lf\nx2=%7.2lf", x1, x2); // 输出两个实根
}
return 0;
}
2. 条件运算符实现二分支
(1)基本格式
表达式1 ? 表达式2 : 表达式3;
(2)执行逻辑
- 表达式1为真(非0)时,结果为表达式2的值;为假(0)时,结果为表达式3的值。
- 条件运算符是三目运算符,需搭配3个操作对象,可简化简单的二分支逻辑。
(3)示例:大写字母转小写字母
#include<stdio.h>
int main() {
char ch;
scanf("%c", &ch);
ch = (ch >= 'A' && ch <= 'Z') ? (ch + 32) : ch; // 是大写则+32转小写,否则不变
printf("%c", ch);
return 0;
}
三、多分支选择结构(多选一)
多分支结构根据条件的多种结果,从多个操作中选择一个执行,核心实现方式为if嵌套和switch语句。
1. if嵌套实现多分支
(1)基本格式
if (表达式1) 语句1;
else if (表达式2) 语句2;
else if (表达式3) 语句3;
...
else 语句n;
(2)关键规则
else总是与上方“最近的未配对if”配对,可通过花括号{}强制指定配对关系。
- 多个
if-else if依次判断,满足一个条件后执行对应语句,不再判断后续条件。
(3)示例1:成绩等级评定(优秀/良好/及格/不及格)
#include<stdio.h>
int main() {
float score;
printf("Please input a score:\n");
scanf("%f", &score);
if(score >= 85) printf("优秀");
else if(score >= 75) printf("良好");
else if(score >= 60) printf("及格");
else printf("不及格");
return 0;
}
(4)示例2:分段函数计算(y根据x的范围取不同值)
// 函数定义:y = -1(x<0);y=0(x=0);y=1(x>0)
#include<stdio.h>
int main() {
int x, y;
scanf("%d", &x);
if(x < 0) y = -1;
else if(x == 0) y = 0;
else y = 1;
printf("y=%d\n", y);
return 0;
}
2. switch语句实现多分支
(1)基本格式
switch (表达式) {
case 常量1: 语句1; break;
case 常量2: 语句2; break;
...
case 常量n: 语句n; break;
default: 语句n+1; // 可选
}
(2)核心规则
- 表达式需为整数类型(int、char等),case后常量需与表达式类型一致,且不能重复。
- 执行逻辑:找到与表达式值匹配的case,执行对应语句;若无匹配case,执行default语句(若有)。
break语句用于跳出switch结构,若无break,会继续执行后续case语句(穿透现象)。
- 多个case可共用一组执行语句(无break分隔),case顺序不影响结果。
(3)示例:根据成绩等级输出分数段
#include<stdio.h>
int main() {
char grade;
printf("Your score:");
scanf("%c", &grade);
switch(grade) {
case 'A': printf("85~100\n"); break;
case 'B': printf("75~84\n"); break;
case 'C': printf("60~74\n"); break;
case 'D': printf("<60\n"); break;
default: printf("enter data error\n"); // 输入无效等级时执行
}
return 0;
}
(4)共用语句示例
// A、B、C等级均输出“60分以上”,D等级输出“60分以下”
switch(grade) {
case 'A':
case 'B':
case 'C': printf("60分以上"); break;
case 'D': printf("60分以下"); break;
default: printf("输入错误");
}
四、综合案例:判断闰年
1. 闰年规则
- 能被4整除但不能被100整除,或能被400整除的年份为闰年,否则为平年。
2. 程序实现
#include<stdio.h>
int main() {
int year, leap = 0; // leap为标记变量,0表示平年,1表示闰年
printf("enter year:");
scanf("%d", &year);
if(year % 4 == 0) {
if(year % 100 == 0) {
if(year % 400 == 0) leap = 1; // 能被400整除
else leap = 0; // 能被100整除但不能被400整除
} else leap = 1; // 能被4整除但不能被100整除
} else leap = 0; // 不能被4整除
if(leap) printf("%d is a leap year.", year);
else printf("%d is not a leap year.", year);
return 0;
}
五、核心要求与注意事项
1. 核心要求
- 灵活使用
if语句解决二分支问题,用if嵌套解决多分支问题。
- 读懂并合理使用
switch语句,理解break的作用和穿透现象。
2. 注意事项
- 区分“真”“假”:C语言中无专门布尔类型,非0值(正数、负数、非0小数)为真,0为假。
if嵌套中注意if-else配对关系,必要时用{}明确代码块。
switch语句中表达式必须为整数类型,case常量不可重复。
六、思考题
- C语言中如何表示“真”和“假”?
- 系统如何判断一个量的“真”和“假”?