CSP-J教程——第一阶段——第五课:程序流程控制 - 选择结构

课程目标

  • 掌握if语句的基本用法
  • 理解if-else和if-else if结构
  • 学会使用嵌套if解决复杂问题
  • 掌握switch语句的适用场景和用法
  • 能够编写具有分支逻辑的程序
  • 理解选择结构在问题解决中的应用

第一部分:if语句(40分钟)

1.1 什么是选择结构?

比喻: 就像生活中的"如果...就..."

  • 如果下雨,就带伞
  • 如果成绩及格,就通过考试
  • 如果年龄够大,就可以看电影

1.2 基本的if语句

语法:

cpp 复制代码
if (条件) {
    // 条件为真时执行的代码
}

流程图:

plain 复制代码
开始
  ↓
检查条件
  ↓
条件为真? → 是 → 执行代码块
  ↓否
继续后续代码

1.3 if语句示例

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int score;
    
    cout << "请输入你的考试成绩: ";
    cin >> score;
    
    // 基本的if语句
    if (score >= 60) {
        cout << "恭喜!你及格了!" << endl;
    }
    
    cout << "程序继续执行..." << endl;
    
    return 0;
}

1.4 单行if语句

当只有一条语句时,可以省略大括号:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int age;
    
    cout << "请输入你的年龄: ";
    cin >> age;
    
    // 单行if语句(不推荐初学者使用)
    if (age >= 18)
        cout << "你已经成年了!" << endl;
    
    // 推荐始终使用大括号,即使只有一行代码
    if (age < 18) {
        cout << "你还是未成年人。" << endl;
    }
    
    return 0;
}

第二部分:if-else语句(40分钟)

2.1 if-else结构

语法:

cpp 复制代码
if (条件) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

流程图:

plain 复制代码
开始
  ↓
检查条件
  ↓
条件为真? → 是 → 执行if代码块
  ↓否
执行else代码块
  ↓
继续后续代码

2.2 if-else示例

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int number;
    
    cout << "请输入一个整数: ";
    cin >> number;
    
    // if-else语句
    if (number % 2 == 0) {
        cout << number << " 是偶数" << endl;
    } else {
        cout << number << " 是奇数" << endl;
    }
    
    return 0;
}

2.3 多个条件的判断

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int score;
    
    cout << "请输入考试成绩(0-100): ";
    cin >> score;
    
    // 检查输入有效性
    if (score < 0 || score > 100) {
        cout << "输入的成绩无效!" << endl;
    } else {
        if (score >= 60) {
            cout << "恭喜!你及格了!" << endl;
        } else {
            cout << "很遗憾,你需要继续努力!" << endl;
        }
    }
    
    return 0;
}

第三部分:if-else if-else语句(40分钟)

3.1 多分支选择结构

语法:

cpp 复制代码
if (条件1) {
    // 条件1为真时执行
} else if (条件2) {
    // 条件2为真时执行
} else if (条件3) {
    // 条件3为真时执行
} else {
    // 所有条件都不满足时执行
}

3.2 成绩等级评定示例

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int score;
    
    cout << "请输入考试成绩(0-100): ";
    cin >> score;
    
    // if-else if-else 多分支
    if (score >= 90) {
        cout << "优秀!等级:A" << endl;
    } else if (score >= 80) {
        cout << "良好!等级:B" << endl;
    } else if (score >= 70) {
        cout << "中等!等级:C" << endl;
    } else if (score >= 60) {
        cout << "及格!等级:D" << endl;
    } else {
        cout << "不及格!等级:E" << endl;
    }
    
    return 0;
}

3.3 月份天数判断

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int month, year;
    
    cout << "请输入年份: ";
    cin >> year;
    cout << "请输入月份(1-12): ";
    cin >> month;
    
    // 多条件判断月份天数
    if (month == 1 || month == 3 || month == 5 || month == 7 || 
        month == 8 || month == 10 || month == 12) {
        cout << "这个月有31天" << endl;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        cout << "这个月有30天" << endl;
    } else if (month == 2) {
        // 判断闰年
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            cout << "这是闰年,2月有29天" << endl;
        } else {
            cout << "这不是闰年,2月有28天" << endl;
        }
    } else {
        cout << "输入的月份无效!" << endl;
    }
    
    return 0;
}

第四部分:嵌套if语句(30分钟)

4.1 什么是嵌套if?

在if语句内部再包含if语句

cpp 复制代码
if (外层条件) {
    if (内层条件) {
        // 两个条件都满足时执行
    }
}

4.2 嵌套if示例:游戏角色权限

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int level;
    bool hasSpecialItem;
    string characterClass;
    
    cout << "请输入角色等级: ";
    cin >> level;
    cout << "是否有特殊物品(1有/0没有): ";
    cin >> hasSpecialItem;
    cout << "请输入职业(战士/法师/牧师): ";
    cin >> characterClass;
    
    // 嵌套if语句
    if (level >= 10) {
        if (characterClass == "战士") {
            cout << "你可以学习旋风斩技能!" << endl;
        } else if (characterClass == "法师") {
            cout << "你可以学习火球术技能!" << endl;
        } else if (characterClass == "牧师") {
            cout << "你可以学习治疗术技能!" << endl;
        }
        
        // 更深层的嵌套
        if (level >= 20) {
            if (hasSpecialItem) {
                cout << "你可以进入隐藏副本!" << endl;
            } else {
                cout << "你需要特殊物品才能进入隐藏副本" << endl;
            }
        }
    } else {
        cout << "等级不足,请继续升级!" << endl;
    }
    
    return 0;
}

4.3 嵌套if的注意事项

避免过度嵌套:

cpp 复制代码
// 不好的写法:嵌套太深
if (condition1) {
    if (condition2) {
        if (condition3) {
            if (condition4) {
                // 代码很难阅读
            }
        }
    }
}

// 更好的写法:使用逻辑运算符组合条件
if (condition1 && condition2 && condition3 && condition4) {
    // 代码清晰易读
}

第五部分:switch语句(40分钟)

5.1 switch语句的基本结构

适用于多个固定值的判断

语法:

cpp 复制代码
switch (表达式) {
    case 值1:
        // 代码块1
        break;
    case 值2:
        // 代码块2
        break;
    // ... 更多case
    default:
        // 默认代码块
}

5.2 switch示例:星期几判断

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int day;
    
    cout << "请输入星期几的数字(1-7): ";
    cin >> day;
    
    // switch语句
    switch (day) {
        case 1:
            cout << "星期一:新的一周开始了!" << endl;
            break;
        case 2:
            cout << "星期二:继续努力!" << endl;
            break;
        case 3:
            cout << "星期三:一周过去一半了!" << endl;
            break;
        case 4:
            cout << "星期四:周末快到了!" << endl;
            break;
        case 5:
            cout << "星期五:明天就周末了!" << endl;
            break;
        case 6:
            cout << "星期六:享受周末!" << endl;
            break;
        case 7:
            cout << "星期日:休息放松!" << endl;
            break;
        default:
            cout << "输入的数字无效!请输入1-7之间的数字。" << endl;
    }
    
    return 0;
}

5.3 break的重要性

没有break会发生什么?

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int option = 2;
    
    cout << "选项: " << option << endl;
    
    switch (option) {
        case 1:
            cout << "执行选项1" << endl;
            // 注意:这里没有break!
        case 2:
            cout << "执行选项2" << endl;
            // 注意:这里没有break!
        case 3:
            cout << "执行选项3" << endl;
            break;
        default:
            cout << "默认选项" << endl;
    }
    
    // 输出:
    // 执行选项2
    // 执行选项3
    
    return 0;
}

5.4 多个case共享代码

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    char grade;
    
    cout << "请输入成绩等级(A/B/C/D/E): ";
    cin >> grade;
    
    // 多个case共享相同的代码
    switch (grade) {
        case 'A':
        case 'B':
        case 'C':
            cout << "成绩合格!" << endl;
            cout << "可以获得学分" << endl;
            break;
        case 'D':
            cout << "成绩基本合格" << endl;
            break;
        case 'E':
            cout << "成绩不合格" << endl;
            cout << "需要补考" << endl;
            break;
        default:
            cout << "无效的等级!" << endl;
    }
    
    return 0;
}

第六部分:综合应用示例(40分钟)

6.1 简易计算器(改进版)

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    double num1, num2, result;
    char operation;
    
    cout << "=== 简易计算器 ===" << endl;
    cout << "请输入第一个数字: ";
    cin >> num1;
    cout << "请输入运算符 (+, -, *, /, %): ";
    cin >> operation;
    cout << "请输入第二个数字: ";
    cin >> num2;
    
    bool valid = true;
    
    // 使用switch处理不同的运算符
    switch (operation) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        case '*':
            result = num1 * num2;
            break;
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
            } else {
                cout << "错误:除数不能为0!" << endl;
                valid = false;
            }
            break;
        case '%':
            // 取模运算需要整数
            if (static_cast<int>(num2) != 0) {
                result = static_cast<int>(num1) % static_cast<int>(num2);
            } else {
                cout << "错误:取模运算的除数不能为0!" << endl;
                valid = false;
            }
            break;
        default:
            cout << "错误:不支持的运算符!" << endl;
            valid = false;
    }
    
    if (valid) {
        cout << "计算结果: " << num1 << " " << operation << " " << num2 << " = " << result << endl;
    }
    
    return 0;
}

6.2 学生奖学金评定系统

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    double gpa;         // 平均绩点
    int activities;     // 参与活动数量
    bool isLeader;      // 是否是班干部
    int leaderInput;
    
    cout << "=== 奖学金评定系统 ===" << endl;
    cout << "请输入平均绩点(0-4): ";
    cin >> gpa;
    cout << "请输入参与活动数量: ";
    cin >> activities;
    cout << "是否是班干部(1是/0否): ";
    cin >> leaderInput;
    isLeader = (leaderInput == 1);
    
    // 多重条件判断
    if (gpa >= 3.8) {
        if (activities >= 5) {
            if (isLeader) {
                cout << "恭喜!你获得一等奖学金!" << endl;
            } else {
                cout << "恭喜!你获得二等奖学金!" << endl;
            }
        } else if (activities >= 3) {
            cout << "恭喜!你获得三等奖学金!" << endl;
        } else {
            cout << "很遗憾,活动参与不足,无法获得奖学金。" << endl;
        }
    } else if (gpa >= 3.5) {
        if (activities >= 3 && isLeader) {
            cout << "恭喜!你获得三等奖学金!" << endl;
        } else {
            cout << "很遗憾,条件不满足,无法获得奖学金。" << endl;
        }
    } else {
        cout << "很遗憾,绩点不满足奖学金要求。" << endl;
    }
    
    return 0;
}

6.3 石头剪刀布游戏

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int playerChoice, computerChoice;
    
    cout << "=== 石头剪刀布游戏 ===" << endl;
    cout << "请选择:(1)石头 (2)剪刀 (3)布" << endl;
    cout << "你的选择: ";
    cin >> playerChoice;
    
    // 简单的随机数生成(使用时间相关,这里简化用固定算法)
    computerChoice = (playerChoice * 7 + 3) % 3 + 1;
    
    cout << "电脑选择了: ";
    switch (computerChoice) {
        case 1: cout << "石头"; break;
        case 2: cout << "剪刀"; break;
        case 3: cout << "布"; break;
    }
    cout << endl;
    
    cout << "你选择了: ";
    switch (playerChoice) {
        case 1: cout << "石头"; break;
        case 2: cout << "剪刀"; break;
        case 3: cout << "布"; break;
        default: cout << "无效选择"; break;
    }
    cout << endl;
    
    // 判断胜负
    if (playerChoice == computerChoice) {
        cout << "平局!" << endl;
    } else if ((playerChoice == 1 && computerChoice == 2) ||
               (playerChoice == 2 && computerChoice == 3) ||
               (playerChoice == 3 && computerChoice == 1)) {
        cout << "你赢了!" << endl;
    } else if (playerChoice >= 1 && playerChoice <= 3) {
        cout << "你输了!" << endl;
    } else {
        cout << "输入无效!" << endl;
    }
    
    return 0;
}

第七部分:选择结构的最佳实践(20分钟)

7.1 if vs switch 的选择

使用if的情况:

  • 条件涉及范围判断(如 score > 60)
  • 条件涉及多个变量的复杂逻辑
  • 条件不是离散的固定值

使用switch的情况:

  • 对单个变量的多个固定值进行判断
  • 条件值是离散的(如1,2,3或'A','B','C')
  • 代码需要更好的可读性

7.2 代码风格建议

良好的代码风格:

cpp 复制代码
// 好的写法:清晰的缩进和括号
if (condition) {
    // 代码
} else if (anotherCondition) {
    // 代码
} else {
    // 代码
}

// 不好的写法:混乱的格式
if(condition){
//代码}else{if(anotherCondition){
//代码}else{//代码}}

7.3 常见错误避免

常见错误1:赋值运算符误用

cpp 复制代码
// 错误!
if (score = 60) {  // 这是赋值,不是比较
    cout << "及格" << endl;
}

// 正确
if (score == 60) {  // 这是比较
    cout << "及格" << endl;
}

常见错误2:缺少break

cpp 复制代码
// 错误:忘记break
switch (day) {
    case 1: cout << "周一";
    case 2: cout << "周二";  // 会继续执行到这里
}

// 正确:记得break
switch (day) {
    case 1: 
        cout << "周一";
        break;
    case 2:
        cout << "周二";
        break;
}

练习与作业

基础练习(必做)

练习1:年龄阶段判断

编写程序根据输入的年龄判断所属阶段:

  • 0-2岁:婴儿
  • 3-12岁:儿童
  • 13-17岁:青少年
  • 18-64岁:成人
  • 65岁及以上:老年人

练习2:简单登录系统

创建一个用户名和密码验证系统:

  • 预设用户名"admin",密码"123456"
  • 用户输入用户名和密码
  • 根据输入给出相应的提示信息

练习3:三角形类型判断(改进版)

输入三角形三条边,判断:

  • 是否构成三角形(任意两边之和大于第三边)
  • 等边三角形、等腰三角形、普通三角形
  • 直角三角形(使用勾股定理)

挑战练习(选做)

挑战1:个人所得税计算器

根据收入计算个人所得税(使用中国的个税税率表):

  • 不同收入区间适用不同税率
  • 考虑起征点和速算扣除数
  • 输出应缴税款和税后收入

挑战2:智能交通信号系统

模拟交通信号灯控制系统:

  • 根据时间、车流量、紧急情况等条件
  • 决定信号灯的变化
  • 使用嵌套if处理复杂条件

挑战3:学生选课系统

实现一个简单的选课条件检查:

  • 检查先修课程是否完成
  • 检查时间冲突
  • 检查人数是否已满
  • 给出相应的提示信息

实验任务

任务1:if-else if-else 实验

测试以下代码,理解执行流程:

cpp 复制代码
int x = 75;
if (x >= 90) {
    cout << "A";
} else if (x >= 80) {
    cout << "B";
} else if (x >= 70) {
    cout << "C";
} else {
    cout << "D";
}
// 改变x的值,观察输出变化

任务2:switch穿透实验

故意在switch语句中省略break,观察代码的执行顺序,理解break的重要性。

任务3:条件组合实验

测试复杂的条件组合:

cpp 复制代码
int a = 5, b = 10, c = 15;
if (a > 3 && b < 20 || c == 15) {
    // 这个条件会成立吗?
}
// 尝试不同的组合,验证你的理解

学习总结

今天学到了:

  • if语句:基本的条件判断
  • if-else语句:二选一的分支
  • if-else if-else语句:多分支选择
  • 嵌套if:在条件内部再进行条件判断
  • switch语句:多固定值的选择结构

关键技能:

  • 条件表达式编写:使用关系运算符和逻辑运算符
  • 代码块组织:使用大括号明确代码范围
  • 流程控制:让程序根据不同情况执行不同代码
  • 错误处理:检查输入有效性并给出提示

下一课预告:

下一节课我们将学习程序流程控制:循环结构,包括for、while、do-while循环,让程序能够重复执行特定任务!


相关推荐
qqxhb4 个月前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
百锦再5 个月前
Git 使用大全:从入门到精通
git·version·版本·代码·分支·code·clone
网络研究院1 年前
不间断电源 (UPS) 对现代技术可靠性的影响
应用·选择·优势·不间断电源·ups
緑水長流*z1 年前
Git代码冲突原理与三路合并算法
git·github·分支·git代码合并·三路合并·递归三路合并·git的分支
风口猪炒股指标1 年前
选择大于努力,真的么?
选择
哎 你看1 年前
Git深入使用和分支管理策略:分享一些Git的高效方法和技巧,包括各种命令的使用,合并和变基等,以及分支的管理策略等
git·gitignore·版本管理·分支
di-Dora2 年前
Git学习(一)基于本地操作:Git初识、Git安装(Linux-ubuntu)、Git 基本操作、分支管理
git·分支
快乐的阿常艾念宝2 年前
我如何选择开源组件
开源·选择·开源组件
放羊的牧码2 年前
Git - 强制替换覆盖 master 分支解决方案
git·gitlab·github·分支·dev·master·强制 覆盖 替换