程序设计基础 · 第3次课 · 第2课时
从脉搏数据计算模块到菜单驱动的健康数据助手
else if 可以吗?if (op == '+')
...
else if (op == '-')
...
else if (op == '*')
...
else if (op == '/')
...
共同特点:反复比较同一个变量与若干固定值。
0:退出程序
用户怎样告诉程序:“我现在要做第3项”?
choice输入的是一个值,决定的是一条执行路径。
switch 表达更直接switch 先看表达式的值,再找匹配的 caseswitch (表达式) {
case 常量1:
语句段1;
break;
case 常量2:
语句段2;
break;
default:
默认语句段;
break;
}
看哪个变量/表达式。
与哪个固定值匹配。
执行完当前分支后离开。
switch 骨架int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Record pulse\n");
break;
case 2:
printf("Show range hint\n");
break;
case 3:
printf("Compare two readings\n");
break;
case 4:
printf("Simple calculator\n");
break;
case 0:
printf("Exit\n");
break;
default:
printf("Invalid choice\n");
break;
}
case 用来匹配固定的离散值case 1:
case 2:
case '+':
case 'A':
固定整数或字符常量。
case p < 60:
case 60 <= p && p <= 100:
范围判断仍应使用 if-else。
范围判断找 if,固定选项想 switch。
casebreak?break,输入 1 会输出什么?switch (choice) {
case 1:
printf("Record pulse\n");
case 2:
printf("Show range hint\n");
case 3:
printf("Compare readings\n");
default:
printf("End\n");
}
break:会继续向后执行case 1break;
不是“结束程序”,而是离开当前 switch。
这也是为什么删除一个 break 会改变后续所有输出。
9 怎么办?default:
printf("Invalid choice\n");
break;
if,什么时候用 switch?switch (op) {
case '+':
printf("= %.2f\n", value1 + value2);
break;
case '-':
printf("= %.2f\n", value1 - value2);
break;
case '*':
printf("= %.2f\n", value1 * value2);
break;
case '/':
if (value2 != 0)
printf("= %.2f\n", value1 / value2);
else
printf("Divisor cannot be 0!\n");
break;
default:
printf("Unknown operator!\n");
}
同一个程序里可以同时存在 switch 和嵌套的 if。
if-else 与 switch 各自擅长什么?| 问题 | 更自然的结构 | 原因 |
|---|---|---|
p < 60 |
if |
范围比较 |
60 <= p && p <= 100 |
if |
复合条件 |
choice = 1/2/3/4 |
switch |
固定离散选项 |
op = '+'/'-'/'*'/'/' |
switch |
固定字符值 |
switch (choice) {
case 2:
// 查看状态提示
...
}
固定菜单值 → switch
if (p < 60)
...
else if (p <= 100)
...
else
...
连续范围 → if-else
程序结构不是“二选一”,而是根据问题把不同结构组合起来。
#include <stdio.h>
int main(void)
{
int choice, p;
scanf("%d", &choice);
switch (choice) {
case 1:
scanf("%d", &p);
break;
case 2:
scanf("%d", &p);
if (p < 60)
printf("Slow pulse\n");
else if (p <= 100)
printf("Suitable\n");
else
printf("Fast pulse\n");
break;
default:
printf("Invalid choice\n");
}
return 0;
}
这里只展示结构骨架;循环菜单将在后续循环结构中继续升级。
判断脉搏是否小于60。
?
选择菜单1/2/3/4。
?
选择 + - * /。
?
A:if B:switch C:switch(也可用else-if)
switch。case 的情况。if,固定离散值优先 switch。switch,菜单内部仍可继续使用 if。