当前位置: 首页 > news >正文

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 (表达式) {case1:// 代码块1break;case2:// 代码块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循环,让程序能够重复执行特定任务!


http://www.dtcms.com/a/577398.html

相关文章:

  • 【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
  • 基于FPGA实现Mini-LVDS转LVDS
  • 做网站的是如何赚钱的哪个小说网站版权做的好处
  • Cache的基本原理
  • 如何提高外贸网站排名南京高端定制网站建设
  • 建网站需要多久网站模板怎么制作
  • 计算机网络:基于TCP协议的自定义协议实现网络计算器功能
  • SpringBoot3+ApolloClient2.3.0集成Apollo2.4.0示例
  • UDP的recvfrom会返回一个完整的数据报
  • Rust实战教程:做一个UDP聊天软件
  • 基于遥感解译与GIS技术生态环境影响评价图件制作
  • 用asp制作一个简单的网站零基础学电脑培训班
  • 广东如何进行网站制作排名做网站在哪里买空间域名
  • 数据结构(长期更新)第6讲:双向链表
  • Debian系统的多内核共存
  • HTTPS 请求抓包,从原理到落地排查的工程化指南(Charles / tcpdump / Wireshark / Sniffmaster)
  • Debian 12 笔记本合盖不休眠设置指南
  • 线性代数 - 奇异值分解(SVD Singular Value Decomposition)- 奇异值在哪里
  • 商城网站开发的完整流程图视频制作价格明细
  • 如何保证Redis和Mysql数据缓存一致性?
  • 八股-Mysql 基础篇(1)
  • 建设公司网站需要准备什么科目苏州建网站的公司
  • Git 某个分支恢复到某个特定的 commit 状态
  • 【Prompt学习技能树地图】生成知识提示技术的深度解析与应用
  • 家用电脑怎么做网站服务器创意设计之都
  • 使用 Spire.XLS for Python 将 Excel 转换为 PDF
  • vue3封装el-dialog
  • 河南郑州网站顾问大连建设工程信息网官网入口
  • 记录一次K8S跨命名空间访问 xxx.xxx.svc.cluster.local 类似内部服务不通的问题
  • Go Slice 实现原理深度解析:从底层机制到工程实践