L4 - 条件分支与逻辑运算

🎯 教学目标

  1. 掌握多条件判断的嵌套写法
  2. 理解逻辑运算符的优先级规则
  3. 能处理复合条件判断问题
  4. 应用短路运算优化代码逻辑

🔑 核心知识点

多条件判断模板

1
2
3
4
5
6
7
8
// 三分支温度预警系统
if(temp > 35){
cout << "红色高温预警";
} else if(temp > 30){
cout << "橙色高温预警";
} else {
cout << "正常温度范围";
}

执行流程解析:

  1. 严格顺序检查条件
  2. 首个满足条件的分支执行后立即退出
  3. else if本质是嵌套的if语句的语法糖
  4. 推荐使用大括号明确作用域,避免悬空else问题

逻辑运算符优先级表

运算符 描述 优先级 结合性
! 逻辑非 3 右到左
&& 逻辑与 11 左到右
|| 逻辑或 12 左到右

经典案例解析:

1
2
3
4
5
if(a > 5 || b < 3 && c == 10) 
// 等效于:a>5 || (b<3 && c==10)

if((x != 0) && (y/x > 0.5))
// 安全除法:利用短路特性避免除零错误

⚡ 短路运算深度解析

短路机制示意图

1
2
A && B → 当A为false时,B不执行
A || B → 当A为true时,B不执行

实际应用案例:

1
2
3
4
5
6
7
8
9
// 安全指针访问
if(p != nullptr && p->isValid()){
// 安全访问指针成员
}

// 高效循环终止
while(index < SIZE && array[index] != target){
index++;
}

性能优化实验

1
2
3
4
5
6
7
8
bool funcA() { /* 耗时操作 */ }
bool funcB() { /* 简单判断 */ }

// 优化前:总执行funcA()
if(funcA() || funcB()) {...}

// 优化后:funcB()可能跳过funcA()
if(funcB() || funcA()) {...}

🕹️ 互动案例系统

闰年判断器(ISO标准)

1
2
3
bool isLeapYear(int year) {
return (year%4 == 0 && year%100 != 0) || (year%400 == 0);
}

测试用例集:

年份 预期结果 测试要点
2000 true 世纪闰年
1900 false 世纪非闰年
2020 true 普通闰年
2021 false 平年

成绩等级转换系统

1
2
3
4
5
6
char getGrade(int score) {
if(score >= 90) return 'A';
if(score >= 80) return 'B'; // 隐含score<90
if(score >= 70) return 'C';
return 'D'; // 低于70分的情况
}

条件覆盖分析:

  • 边界值测试:89,90,0,100
  • 非法值处理:负分、超过100分
  • 数据类型验证:浮点数输入处理

💣 易错点详解

运算符优先级陷阱

1
2
3
4
5
if(a & 1 == 0) // 实际解析:a & (1 == 0)
// 正确写法:(a & 1) == 0

if(x < 5 || 10 < x < 20) // 错误逻辑!
// 正确表达:(x <5 || (x>10 && x<20))

浮点数比较危机

1
2
3
double d = 0.1 + 0.2;
if(d == 0.3) // 永远为false!
// 正确方法:fabs(d - 0.3) < 1e-6

悬空else问题

1
2
3
4
5
6
if(a > 0)
if(b > 0)
cout << "A";
else // 实际匹配内层if
cout << "B";
// 通过大括号明确归属关系

🛠️ 调试技巧

条件追踪法

1
2
3
4
5
6
7
8
9
10
11
12
#define DEBUG 1

if(
#if DEBUG
(cout << "检查条件1:" << cond1 << endl, cond1) &&
(cout << "检查条件2:" << cond2 << endl, cond2)
#else
cond1 && cond2
#endif
){
//...
}

真值表验证法

A B A&&B A||B !A
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

应用场景:

  • 验证复杂逻辑表达式的所有可能情况
  • 生成测试用例确保条件覆盖

🎓 教学提示

个人所得税计算器实现要点

  1. 税率区间处理:
1
2
3
4
5
6
7
8
9
10
double tax = 0;
if(income > 30000) {
tax += (income-30000)*0.2;
income = 30000;
}
if(income > 17000) {
tax += (income-17000)*0.1;
income = 17000;
}
// ...后续区间类似处理
  1. 精度处理方法:
  • 使用round(tax*100)/100进行四舍五入
  • 输出时使用fixed << setprecision(2)

电梯调度系统逻辑框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int current = 5; // 当前楼层
int target = 8; // 目标楼层

string direction = (target > current) ? "上行" : "下行";
int floors = abs(target - current);
int time = floors * 2;

cout << "方向:" << direction << endl;
cout << "预计耗时:" << time << "秒" << endl;

// 超载检测
if(totalWeight > 1000){
cout << "警告!超载" << endl;
}

🏋️ 配套练习

  1. 智能闰年检测

    • 输入:年份(1-9999)
    • 输出:
      • 闰年判断结果
      • 带世纪年说明(如2000是世纪闰年)
  2. 三角形检察官

    • 输入:三个边长
    • 输出:
      • 类型(普通/等腰/等边)
      • 是否直角三角形(误差<0.001)
  3. 自动售票机系统

    • 输入:票价、投入金额
    • 输出:
      • 应找零钱(优先用大面额)
      • 示例:
        输入:46 100
        输出:
        50元×1
        1元×4
  4. 个人所得税计算器

    • 规则:
      1
      2
      3
      4
      0-5000:0%
      5000-8000:3%
      8000-17000:10%
      17000-30000:20%
    • 输入:月收入
    • 输出:应纳税额(精确到分)
  5. 电梯调度系统

    • 输入:当前楼层,目标楼层
    • 输出:
      • 运行方向(上行/下行/停留)
      • 预计到达时间(每层2秒)
      • 超载检测(假设载重≤1000kg)