C++启蒙课程:第6章  分支语句和逻辑运算符

今天,我们将为程序安装“智慧大脑”和“逻辑中枢”,让它学会判断和决策!

🌳

决策树:if/else与逻辑

学习机器人如何通过 `if` 在分岔路口做决策,并认识“逻辑三剑客”。

🔠

多重选择与字符侦探

掌握 `switch` 指路牌和 `cctype` 侦探团,高效处理多重选择。

📜

循环超控与回忆卷轴

学会用 `break` 和 `continue` 控制循环,并用“回忆卷轴”读写文件。

课时一:决策树:if/else与逻辑英雄

(覆盖知识点 6.1 - 6.2)

6.1 机器人分岔路口

`if` 就像一个分岔路口。机器人 🤖 根据条件 (`true`/`false`) 决定走哪条路。

🤖
Path A (if) Path B (else)
if (score > 90) { // Path A: 条件为 true cout << "优秀!"; } else { // Path B: 条件为 false cout << "继续努力!"; }

6.2 逻辑三剑客

`&&` (与), `||` (或), `!` (非) 是组合条件的“逻辑英雄”。

A:
B:
...
// && (AND): 必须两边都为 true if (x > 5 && x < 10) { ... } // || (OR): 任意一边为 true if (score < 0 || score > 100) { ... } // ! (NOT): 取反 if (!(y == 0)) { ... } // (y 不等于 0)

课时二:多重选择与字符侦探

(覆盖知识点 6.3 - 6.5)

6.3 字符侦探团 (cctype)

`cctype` 库提供了一群“侦探”,帮你快速判断字符类型。

#include <cctype> // 引入侦探团 char ch = 'A'; // isalpha 侦探检查是否是字母 if (isalpha(ch)) { cout << "这是一个字母!"; } // isdigit 侦探检查是否是数字 if (isdigit(ch)) { ... }

6.4 三项选择转盘 (?:)

条件运算符 `?:` 是 `if else` 的简洁版,它会“返回”一个值。

(a > b) ? a : b
A: B:
Max Value = ?
int a = 10, b = 5; // "如果 a > b 为 true, 返回 a, 否则返回 b" int max_val = (a > b) ? a : b; // max_val 得到 10

6.5 魔法指路牌 (switch)

`switch` 语句根据一个“整数”值,直接“跳转”到对应的 `case` 标签。break 用来防止“穿透”到下一个标签。

💡 互动体验:

📜 代码支撑:

switch (choice) { case 1: cout << "你选了 1\n"; break; // <-- 阻止穿透 case 2: cout << "你选了 2\n"; break; default: cout << "无效选择\n"; }

课时三:循环超控与回忆卷轴

(覆盖知识点 6.6 - 6.8)

6.7 循环特遣队

`continue` 机器人跳过“当前”这轮。`break` 机器人按下“紧急停止”,跳出“整个”循环。

Loop: 1 2 3 4 5
for (int i = 1; i <= 5; i++) { if (i == 3) { continue; // 跳过 3, 直接去 i=4 } if (i == 5) { break; // 在 5 处停止 } cout << i; // 输出 1 2 4 }

6.7.1 “数据过滤器” (安全 cin)

当 `cin` 想要一个数字,你却输入了 "abc",`cin` 就会“卡住”(failbit)。我们必须用“三步魔法”修复它。

过滤器 🟢 (OK)
while (!(cin >> score)) { // 魔法 1: 重置标志 cin.clear(); // 魔法 2: 删除错误输入 while (cin.get() != '\n') continue; cout << "请输入一个数字: "; }

6.8 “回忆卷轴” (文件 I/O)

使用 <fstream> 库,我们可以用 `ofstream` (输出) 把数据写入“回忆卷轴”,用 `ifstream` (输入) 把数据读回来。

💡 互动:写入文件

📜 代码支撑:

#include <fstream> // 1. 包含头文件 using namespace std; // 写入 (ofstream = output file) ofstream fout; // 2. 创建对象 fout.open("out.txt"); // 3. 打开文件 fout << "Hello File!"; // 4. 像 cout 一样使用 fout.close(); // 5. 关闭文件 // 读取 (ifstream = input file) ifstream fin; fin.open("out.txt"); string data; fin >> data; // 像 cin 一样使用 fin.close();

编程实践与作业 (6.10 & 6.11)

是时候检验你作为“决策大师”的实力了!

练习 1:逻辑判断 (6.10 复习题 4)

任务:

编写一个程序,要求用户输入一个整数 `x`,判断 `x` 是否为偶数,但不是26的倍数。

点击查看参考答案
#include <iostream> using namespace std; int main() { int x; cout << "请输入一个整数 x: "; cin >> x; // 6.2.2 逻辑 AND // 6.2.5 逻辑 NOT if ((x % 2 == 0) && !(x % 26 == 0)) { cout << x << " 是偶数,但不是 26 的倍数。" << endl; } else { cout << "不满足条件。" << endl; } return 0; }
练习 2:字符侦探 (6.10 复习题 7)

任务:

编写一个程序,要求用户输入一个字符,使用 `cctype` 库和 `if else if` 结构,判断输入的字符是数字、字母还是其他字符。

点击查看参考答案
#include <iostream> #include <cctype> // 6.3 引入字符函数库 using namespace std; int main() { char ch; cout << "请输入一个字符: "; cin.get(ch); if (isdigit(ch)) { // 检查数字 cout << ch << " 是一个数字。" << endl; } else if (isalpha(ch)) { // 检查字母 cout << ch << " 是一个字母。" << endl; } else { cout << ch << " 是其他字符。" << endl; } return 0; }
练习 3:文件字符计数 (6.11 练习 8)

任务:

编写一个程序,打开一个名为 "file.txt" 的文件(请你先在同目录下手动创建一个!),逐个字符地读取该文件,直到到达文件末尾,然后指出该文件中包含多少个字符。

点击查看参考答案
#include <iostream> #include <fstream> // 6.8 引入文件I/O库 #include <cstdlib> // for exit() int main() { using namespace std; ifstream fin; fin.open("file.txt"); if (!fin.is_open()) // 检查文件是否打开成功 { cout << "错误:无法打开 file.txt!" << endl; exit(EXIT_FAILURE); } char ch; int count = 0; // 6.8.3 循环读取 while (fin.get(ch)) // 逐个读取, 包括空格 { count++; } cout << "文件中总共包含 " << count << " 个字符。" << endl; fin.close(); // 关闭文件 return 0; }

本章知识点总结与复习

核心概念 解释/功能 关键用法/运算符
if/else语句程序决策工具,`if else if` 可多选。if (cond) { ... } else { ... }
逻辑运算符组合或否定布尔表达式,`&&` `||` 有短路求值。&& (AND), || (OR), ! (NOT)
`cctype`库字符函数库,简化字符分类判断。isalpha(ch), isdigit(ch)
条件运算符 `?:`三元运算符,简洁地选择两个值之一。条件 ? 值1 : 值2
`switch`语句基于整数常量表达式的多重选择结构。switch, case, break, default
流程跳转`break` 立即退出循环;`continue` 跳过本次。break, continue
安全输入恢复 `cin` 状态的三步魔法。cin.clear(), cin.get()
文件I/O写入 (`ofstream`) 和读取 (`ifstream`) 文本文件。<fstream>, fout.open()