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

课程目标
- 掌握if语句的基本用法
- 理解if-else和if-else if结构
- 学会使用嵌套if解决复杂问题
- 掌握switch语句的适用场景和用法
- 能够编写具有分支逻辑的程序
- 理解选择结构在问题解决中的应用
第一部分:if语句(40分钟)
1.1 什么是选择结构?
比喻: 就像生活中的"如果…就…"
- 如果下雨,就带伞
- 如果成绩及格,就通过考试
- 如果年龄够大,就可以看电影
1.2 基本的if语句
语法:
if (条件) {// 条件为真时执行的代码
}
流程图:
开始↓
检查条件↓
条件为真? → 是 → 执行代码块↓否
继续后续代码
1.3 if语句示例
#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语句
当只有一条语句时,可以省略大括号:
#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结构
语法:
if (条件) {// 条件为真时执行的代码
} else {// 条件为假时执行的代码
}
流程图:
开始↓
检查条件↓
条件为真? → 是 → 执行if代码块↓否
执行else代码块↓
继续后续代码
2.2 if-else示例
#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 多个条件的判断
#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 多分支选择结构
语法:
if (条件1) {// 条件1为真时执行
} else if (条件2) {// 条件2为真时执行
} else if (条件3) {// 条件3为真时执行
} else {// 所有条件都不满足时执行
}
3.2 成绩等级评定示例
#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 月份天数判断
#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语句
if (外层条件) {if (内层条件) {// 两个条件都满足时执行}
}
4.2 嵌套if示例:游戏角色权限
#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的注意事项
避免过度嵌套:
// 不好的写法:嵌套太深
if (condition1) {if (condition2) {if (condition3) {if (condition4) {// 代码很难阅读}}}
}// 更好的写法:使用逻辑运算符组合条件
if (condition1 && condition2 && condition3 && condition4) {// 代码清晰易读
}
第五部分:switch语句(40分钟)
5.1 switch语句的基本结构
适用于多个固定值的判断
语法:
switch (表达式) {case 值1:// 代码块1break;case 值2:// 代码块2break;// ... 更多casedefault:// 默认代码块
}
5.2 switch示例:星期几判断
#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会发生什么?
#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// 执行选项3return 0;
}
5.4 多个case共享代码
#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 简易计算器(改进版)
#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 学生奖学金评定系统
#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 石头剪刀布游戏
#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 代码风格建议
良好的代码风格:
// 好的写法:清晰的缩进和括号
if (condition) {// 代码
} else if (anotherCondition) {// 代码
} else {// 代码
}// 不好的写法:混乱的格式
if(condition){
//代码}else{if(anotherCondition){
//代码}else{//代码}}
7.3 常见错误避免
常见错误1:赋值运算符误用
// 错误!
if (score = 60) { // 这是赋值,不是比较cout << "及格" << endl;
}// 正确
if (score == 60) { // 这是比较cout << "及格" << endl;
}
常见错误2:缺少break
// 错误:忘记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 实验
测试以下代码,理解执行流程:
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:条件组合实验
测试复杂的条件组合:
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循环,让程序能够重复执行特定任务!
