程序设计基础 · 第3次课 · 第1课时
从脉搏状态判断到混合数据输入与多分支
核心不是“多写几个 if”,而是把规则变成互斥、完整、有顺序的分支。
p 表示每分钟脉搏次数。int p;
scanf("%d", &p);
if (p >= 60 && p <= 100)
printf("Suitable\n");
else
printf("Need further classification\n");
问题:55 和 108 都进入 else,但它们应该是同一种情况吗?
else if:前面不成立,才继续判断if (条件1) {
语句1;
} else if (条件2) {
语句2;
} else {
语句3;
}
else。int p;
scanf("%d", &p);
if (p < 60) {
printf("Slow pulse\n");
} else if (p <= 100) {
printf("Suitable\n");
} else {
printf("Fast pulse\n");
}
为什么第二个条件只写 p <= 100?
因为走到这里已经意味着 p >= 60。
if (p < 60)
printf("Slow\n");
else if (p <= 100)
printf("Suitable\n");
else
printf("Fast\n");
if (p <= 100)
printf("Suitable\n");
else if (p < 60)
printf("Slow\n");
else
printf("Fast\n");
输入 55,版本B会进入哪一支?
| 输入 | 预期分支 | 为什么有用 |
|---|---|---|
| 59 | Slow | 检查60左侧 |
| 60 | Suitable | 检查下边界 |
| 100 | Suitable | 检查上边界 |
| 101 | Fast | 检查100右侧 |
72 + 76,程序要保存什么?double value1
第1个数值
char op
一个字符
double value2
第2个数值
新的问题:'+' 不是数字,怎样输入?
char:保存一个字符'+' '-' '*' '/'
'A' '1' ' '
字符常量用单引号括起来。
char op;
op = '+';
op 保存用户选择的运算符。
scanf 按数据类型读取double value1, value2;
char op;
scanf("%lf %c %lf", &value1, &op, &value2);
%lf
读取 double
%c
读取一个字符
%lf
读取 double
%c 意外读到前面的空格或换行。if (op == '+')
计算 value1 + value2;
else if (op == '-')
计算 value1 - value2;
else if (op == '*')
计算 value1 * value2;
else if (op == '/')
计算 value1 / value2;
else
提示 Unknown operator;
连续区间 → 比较数值;固定运算符 → 比较字符。
if-else if 版本double value1, value2;
char op;
scanf("%lf %c %lf", &value1, &op, &value2);
if (op == '+') {
printf("= %.2f\n", value1 + value2);
} else if (op == '-') {
printf("= %.2f\n", value1 - value2);
} else if (op == '*') {
printf("= %.2f\n", value1 * value2);
} else if (op == '/') {
if (value2 != 0)
printf("= %.2f\n", value1 / value2);
else
printf("Divisor cannot be 0!\n");
} else {
printf("Unknown operator!\n");
}
op == '/'
用户选择了除法。
value2 != 0
除法还有自己的前提条件。
这就是“分支内部继续分支”的最小例子。
p < 60 / p <= 100 / 其它
条件来自连续数值区间。
op == '+' / '-' / '*' / '/'
条件来自若干固定字符。
下一课时:固定选项很多时,能不能写得更清楚?
else if 按顺序检查多个条件。char 可保存运算符等单字符信息。%lf %c %lf 读取不同类型数据。