调整课次结构:前9节重新排序,新建第06课一维数组,后3节不变

This commit is contained in:
chengzi
2026-07-03 15:27:11 +08:00
parent 30f803784a
commit b973fb7825
29 changed files with 1301 additions and 13 deletions

View File

@@ -0,0 +1,283 @@
# 第4课数据类型、ASCII码与分支结构
## 教学目标
- 掌握五种常用数据类型int、char、double、bool、string
- 理解 char 的 ASCII 码本质
- 能用 ASCII 码判断和转换字符类型
- 掌握 double 的格式化输出
- 掌握输入输出、算术/关系/逻辑运算与类型转换
- 掌握 if、else if、else、switch 和三目运算
- 掌握普通打擂台与带并列规则的二次打擂台
## 核心考点:数据类型、类型转换与数据范围
### 考什么
考试会要求判断变量应使用哪种类型、计算表达式结果、完成字符与整数转换,或分析整数溢出和小数精度。真正的重点是:数据以什么形式存储,会直接影响运算结果。
### 必须理解
`int` 存整数,范围有限;较大的整数应使用 `long long``double` 存小数,但可能存在微小精度误差。`char` 表面是字符,内部保存对应的 ASCII 整数,因此 `'7' - '0'` 得到整数 7。两个整数相除仍做整数除法小数部分会被截掉只要一边先转成 `double`,才会保留小数。赋值或运算时发生类型转换,可能扩大范围,也可能丢失信息。
### 核心写法
```cpp
double average = 1.0 * sum / n; // 先变成浮点运算
int digit = c - '0'; // 数字字符转整数
char c = digit + '0'; // 0~9 转数字字符
long long product = 1LL * a * b;
```
`1.0` 触发浮点运算,`1LL` 让乘法从一开始就在 `long long` 范围内进行。
### 常见错误
- `double average = sum / n;` 中右边先做整数除法,赋给 double 时小数已经丢失。
- 把字符 `'5'` 当成整数 5它们的存储值不同。
- 结果变量使用 `long long`,但 `a * b` 已先按 int 溢出。
-`==` 直接比较复杂浮点计算结果,忽略精度误差。
### 判断是否掌握
能根据数据范围选择 `int``long long``double`,能手算整数除法与类型转换结果,并能完成数字字符和整数之间的转换。
---
## 一级、二级核心:运算、转换与分支
### 输入输出与运算符
一级要求熟练使用 `cin``cout`,掌握算术、关系和逻辑运算:
```cpp
int a, b;
cin >> a >> b;
cout << a + b << endl;
bool valid = (a >= 0 && a <= 100);
```
整数除法会丢弃小数部分;需要小数时,应让至少一个运算数先转成 `double`
### 隐式转换与强制转换
```cpp
double average = 1.0 * sum / count; // 隐式转换为 double
int code = (int)letter; // 强制转换为 int
char letter = (char)code; // 强制转换为 char
```
类型范围变大通常较安全;从浮点数转成整数会丢弃小数部分。
### 多层分支
```cpp
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 60) {
cout << "C";
} else {
cout << "D";
}
```
多个条件互斥时使用 `else if`,避免多个独立 `if` 重复执行。
### `switch` 语句
```cpp
switch (choice) {
case 1: cout << "加法"; break;
case 2: cout << "减法"; break;
default: cout << "无效选择";
}
```
`switch` 适合根据一个整数或字符的不同取值进行分支。每个 `case` 后通常需要 `break`,否则会继续执行后面的分支。
### 三目运算
```cpp
int bigger = (a > b) ? a : b;
```
三目运算适合简单的二选一,不适合代替复杂的多层分支。
### 打擂台与二次规则
寻找最接近目标值的数时,先比较距离;距离相同再比较数值:
```cpp
if (abs(x - target) < abs(best - target) ||
(abs(x - target) == abs(best - target) && x < best)) {
best = x;
}
```
擂主必须用第一个合法候选值初始化,不能随意设为 0。
## 题目一判断字符类型并输出ASCII码
### 核心代码(一句话)
> 字符类型判断的核心:**char 本质是整数ASCII码可以在字符范围和整数之间自由比较和转换。**
### 自然语言思路
键盘上敲的每个字符,在计算机里都存成了一个整数——这就是 **ASCII 码**
记住三个关键 ASCII 码:
- `'0'` = 48`'1'`~`'9'` 依次递增
- `'A'` = 65`'B'`~`'Z'` 依次递增
- `'a'` = 97`'b'`~`'z'` 依次递增
所以判断一个字符是什么类型,有两种方法:
**方法一(看 ASCII 码范围)**
- 如果 `c``'A'` ~ `'Z'` 之间(即 65~90→ 大写字母
- 如果 `c``'a'` ~ `'z'` 之间(即 97~122→ 小写字母
- 如果 `c``'0'` ~ `'9'` 之间(即 48~57→ 数字
- 否则 → 其他字符
**方法二用第1课学的自带函数**
- `isupper(c)` → 大写字母
- `islower(c)` → 小写字母
- `isdigit(c)` → 数字
最后,`int(c)``(int)c` 直接输出字符对应的 ASCII 码值。
### 伪代码
```
输入字符 ch
如果 ch 在 'A' ~ 'Z' 之间:
输出 "大写字母"
否则如果 ch 在 'a' ~ 'z' 之间:
输出 "小写字母"
否则如果 ch 在 '0' ~ '9' 之间:
输出 "数字"
否则:
输出 "其他字符"
输出 "ASCII码 = " + int(ch)
```
### 真实代码
```cpp
#include <iostream>
#include <cctype> // isupper、islower、isdigit
using namespace std;
int main() {
char ch;
cin >> ch;
// 方法一ASCII 码范围判断
if (ch >= 'A' && ch <= 'Z') {
cout << "大写字母" << endl;
} else if (ch >= 'a' && ch <= 'z') {
cout << "小写字母" << endl;
} else if (ch >= '0' && ch <= '9') {
cout << "数字" << endl;
} else {
cout << "其他字符" << endl;
}
// 输出 ASCII 码值
cout << "ASCII码 = " << (int)ch << endl;
return 0;
}
```
### 方法二(用自带函数,更简洁)
```cpp
if (isupper(ch)) {
cout << "大写字母" << endl;
} else if (islower(ch)) {
cout << "小写字母" << endl;
} else if (isdigit(ch)) {
cout << "数字" << endl;
} else {
cout << "其他字符" << endl;
}
```
### 注意点
1. **`char` 能直接比大小**`ch >= 'A'` 就是在比较 ASCII 码值,不需要先转成 int。
2. **字符写单引号**`'A'` 不是 `"A"`,单引号是 char双引号是字符串。
3. **ASCII 码值记忆技巧**`'0'`=48`'A'`=65`'a'`=97。小写字母 = 大写字母 + 32。
4. **大小写互转**:大写转小写 `ch + 32`,小写转大写 `ch - 32`。或者用 `tolower(ch)` / `toupper(ch)`(返回 int需要转回 char
5. **不要混用 string 和 char**`string` 是字符串(双引号),`char` 是单个字符(单引号),两者不同。
---
## 题目二:(待橙子补充)
> 建议覆盖double 格式化输出、int vs long long 范围等
---
### 核心代码(一句话)
>
### 自然语言思路
### 伪代码
### 真实代码
```cpp
```
### 注意点
---
## 题目三:(待橙子补充)
> 建议覆盖bool 类型、string 基本操作等
---
### 核心代码(一句话)
>
### 自然语言思路
### 伪代码
### 真实代码
```cpp
```
### 注意点
---
## 本课打油诗
> int 存整数范围广char 单字符本质藏。
> double 小数保精度bool 对错分两旁。
> string 处理字符串,五种类型记心上。
---
## ASCII 码速查表(常用)
| 字符 | ASCII 码 |
|------|----------|
| `'0'` ~ `'9'` | 48 ~ 57 |
| `'A'` ~ `'Z'` | 65 ~ 90 |
| `'a'` ~ `'z'` | 97 ~ 122 |
| 空格 `' '` | 32 |
> 记忆口诀:**4A = 65**,不是"4个A",是"数字4开头A是65"。小写比大写多32。
---
## 课后作业
(待补充)
1.
2.