Initial commit: C++ courseware

This commit is contained in:
xiaolinquan committed 2026-11-05 22:51:02 +08:00
commit 4a4ee7c287
1789 files changed
+373489

No files matched your search

@@ -0,0 +1,99 @@
### **C++ 逻辑表达式的构建 讲义**
#### **一、 目标**
我们的目标,是将生活中的复杂规则(自然语言)准确地翻译成计算机能懂的、没有歧义的逻辑表达式(代码)。
#### **二、 翻译的步骤公式**
无论规则多复杂,都可以遵循这三步:
1. **拆解**:将一句长长的规则,拆分成一个个最小的、不可再分的**独立判断条件**。
* 例:“一个数字 `x` 是大于4的偶数” -> 拆成 `x > 4` 和 `x是偶数`。
2. **观察连接词**:找出连接这些独立条件的**逻辑关系词**。
* “并且”、“同时”、“但” -> 对应 C++ 的 `&&`。**全真才为真,一假即为假。**
* “或者”、“至少一个” -> 对应 C++ 的 `||`。**一真即为真,全假才为假。**
* “不”、“不是” -> 对应 C++ 的 `!`,将一个条件的结果**取反**。
3. **组合**:用 C++ 的逻辑运算符将这些条件按顺序组合起来。
#### **三、 优先级**
计算机在计算表达式时,并不是简单地从左到右。也就是存在**运算符优先级**。**记忆口诀:非算关与或**
* **基本规则**:`!` (逻辑非) 的优先级最高,其次是 `&&` (逻辑与),最后是 `||` (逻辑或)。
* **使用括号 `()` 明确意图**
* 为了避免优先级带来的混淆和错误,当一个表达式中同时包含多个逻辑运算符的时候时,**使用括号 `()` 来明确你的逻辑分组**,这既能保证程序正确,也让代码更容易阅读。
* 例如:如果你数学**或者**英语考了100分,**并且**作业都写完了,我们就去游乐园。
* 错误写法: `数学100分 || 英语100分 && 作业都写完了`(错误原因: `&&` 的优先级比 `||` 高)
* 正确写法: `(数学100分 || 英语100分) && 作业都写完了`。
#### **四、 布尔变量**
以后当我们写条件表达式的时候,如果一个判断条件的结果,已经被保存在一个布尔(bool)变量里了,我们就可以直接根据它的语义来去使用。
假设我们已经将两个判断条件,分别存入了布尔变量 `a` 和 `b` 中:
* `bool a = (考试成绩 > 80);` // a 代表“考试成绩大于80分”这件事
* `bool b = (综合成绩 > 90);` // b 代表“综合成绩大于90分”这件事
当我需要写一个条件表达式来判断:“考试成绩大于80分 **并且** 综合成绩大于90分”时,我们就可以像翻译句子一样,把自然语言和我们的代码进行一一对照:
* “考试成绩大于80分” → 这正是我们的布尔变量 `a` 所代表的含义。
* “并且” → 在代码中对应的就是逻辑运算符 `&&`。
* “综合成绩大于90分” → 这正是我们的布尔变量 `b` 所代表的含义。
然后,把它们按顺序串联起来,就得到了最终的表达式:`a && b`。
这种方式让我们的代码逻辑和自然语言逻辑完全对应。而不需要通过 `a == true && b == true` 重复进行判断。
#### **五、 整除的逻辑表达式**
在编程中,我们经常需要判断一个数能否被另一个数整除。这在判断奇偶性、倍数关系时非常有用。
* **工具**:求余运算符 `%`。`a % b` 的意思是计算 `a` 除以 `b` 之后的**余数**。
* **逻辑**:如果 `a` 能被 `b` 整除,那么 `a` 除以 `b` 之后**没有余数**,所以 **`a % b` 的结果就是 `0`**。
* **实例**:
* `9 % 3` 的结果是 `0`,所以 `9 % 3 == 0` 为 `true`,代表9是3的倍数。
* `10 % 3` 的结果是 `1`,所以 `10 % 3 == 0` 为 `false`,代表10不能被3整除。
#### **六、 构建实例**
##### **实例1:闰年判断**
* **规则**:年份能被4整除**但**不能被100整除,**或者**能被400整除。
* **第一步:拆解**
* 条件A: 年份能被4整除 -> `year % 4 == 0`
* 条件B: 年份不能被100整除 -> `year % 100 != 0`
* 条件C: 年份能被400整除 -> `year % 400 == 0`
* **第二步:观察连接词**
* 条件A和B之间是“但”(也就是“并且”)的关系。
* (A和B的整体) 与 条件C之间是“或者”的关系。
* **第三步:组合(使用括号明确优先级)**
```cpp
bool a = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
```
##### **实例2:数字性质筛选**
* **规则**:一个数字 `x` 要满足“是3的倍数,但不是偶数”。
* **第一步:拆解,并用布尔变量存起来**
* 条件A:“是3的倍数”
```cpp
bool b = (x % 3 == 0); // "是3的倍数" 的结果存在布尔变量 b 里
```
* 条件B:“是偶数”
```cpp
bool c = (x % 2 == 0); // "是偶数" 的结果存在布尔变量 c 里
```
* **第二步:观察连接词**
* 条件A 和 “不是条件B” 之间是“但”(“并且”)的关系。
* **第三步:组合(使用布尔变量)**
```cpp
// 条件A和条件B的结果已经储存在布尔变量中了,可直接根据语义去使用。
bool d = b && !c;
```