Files

188 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第1课C++自带函数
## 教学目标
- 学会查阅和使用C++标准库自带函数
- 掌握 `<cmath>``<algorithm>``<cctype>` 三个常用头文件
- 能用自带函数解决计算问题,体会"站在巨人的肩膀上"
## 核心考点:正确选择并使用标准库函数
### 考什么
题目通常给出一个计算或处理任务,要求选择合适的标准库函数,并写对头文件、参数和返回值。例如开平方用 `sqrt`,求最大值用 `max`,判断字符用 `isdigit`。考试不只考“记住函数名”,还考能否把函数正确放进完整程序。
### 必须理解
调用标准库函数要过三关:第一,函数属于哪个头文件;第二,传入参数的类型和含义;第三,返回结果是什么类型。例如 `sqrt(x)` 返回浮点数,即使 x 是整数,也要注意精度和类型。
### 核心写法
```cpp
#include <cmath> // sqrt、pow
#include <algorithm> // max、min、swap
#include <cctype> // isdigit、isalpha
double root = sqrt(x);
int bigger = max(a, b);
```
先根据任务选函数,再补头文件,最后检查参数范围和返回类型。
### 常见错误
- 忘记包含对应头文件,导致函数未声明。
- 认为 `pow` 一定返回整数,直接用于要求精确整数的运算,可能受到浮点误差影响。
- 只背函数名,不检查参数是否满足要求,例如对负数直接开平方。
### 判断是否掌握
看到“开平方、绝对值、最值、交换、字符分类”时,能说出函数名、头文件、关键参数和返回结果,并能独立写出一段正确调用代码。
---
## 函数速查表
### 一、数学计算函数(头文件:`<cmath>`
| 函数 | 参数 | 返回值 | 示例 | 说明 |
|------|------|--------|------|------|
| `sqrt(x)` | `double x` — 一个非负数 | `double` — x 的平方根 | `sqrt(16)``4.0` | 开根号 |
| `abs(x)` | `int x` — 一个整数 | `int` — x 的绝对值 | `abs(-5)``5` | 去掉负号 |
| `pow(a, b)` | `double a` — 底数,`double b` — 指数 | `double` — a 的 b 次方 | `pow(2, 3)``8.0` | aᵇ |
### 二、最值与交换函数(头文件:`<algorithm>`
| 函数 | 参数 | 返回值 | 示例 | 说明 |
|------|------|--------|------|------|
| `max(a, b)` | 两个同类型的值 | 同类型 — 较大值 | `max(3, 7)``7` | 两数取大 |
| `min(a, b)` | 两个同类型的值 | 同类型 — 较小值 | `min(3, 7)``3` | 两数取小 |
| `swap(a, b)` | 两个同类型的**变量** | `void`(无返回值) | `swap(x, y)` → x和y交换 | 交换两变量的值 |
### 三、字符判断函数(头文件:`<cctype>`
| 函数 | 参数 | 返回值 | 示例 | 说明 |
|------|------|--------|------|------|
| `isalpha(c)` | `char c` — 一个字符 | `bool` — 是字母返回 `true` | `isalpha('A')``true` | 判断是否为字母A~Z 或 a~z |
| `isdigit(c)` | `char c` — 一个字符 | `bool` — 是数字返回 `true` | `isdigit('5')``true` | 判断是否为数字0~9 |
| `islower(c)` | `char c` — 一个字符 | `bool` — 是小写字母返回 `true` | `islower('a')``true` | 判断是否为小写字母a~z |
| `isupper(c)` | `char c` — 一个字符 | `bool` — 是大写字母返回 `true` | `isupper('A')``true` | 判断是否为大写字母A~Z |
### 四、字符转换函数(头文件:`<cctype>`
| 函数 | 参数 | 返回值 | 示例 | 说明 |
|------|------|--------|------|------|
| `tolower(c)` | `char c` — 一个字符 | `int` — 对应的小写字母 ASCII 码 | `tolower('A')``97`(即 `'a'` | 大写转小写 |
| `toupper(c)` | `char c` — 一个字符 | `int` — 对应的大写字母 ASCII 码 | `toupper('a')``65`(即 `'A'` | 小写转大写 |
> **注意**`tolower` 和 `toupper` 返回的是 `int`ASCII 码),输出时转回 `char``cout << (char)tolower('A');` 输出 `a`。
---
## 题目一:计算两点之间的距离
### 核心代码(一句话)
> 两点距离的核心:**勾股定理**`sqrt` 和 `pow` 配合使用,一行搞定。
### 自然语言思路
小明站在平面上的 A 点 `(x₁, y₁)`,小红站在 B 点 `(x₂, y₂)`,求两人之间的直线距离。
第一步,算出**水平方向**差了多少:`x₁ - x₂`
第二步,算出**垂直方向**差了多少:`y₁ - y₂`
第三步,把两个差值**分别平方**,平方就用 `pow(差值, 2)`
第四步,两个平方**加起来**。
第五步,对和**开根号**,用 `sqrt`,得到最终距离。
第六步,题目一般要求保留小数,用 `fixed << setprecision(2)` 保留两位。
> 其实就是把"勾股定理"翻译成代码:`c = sqrt(a² + b²)`。
### 伪代码
```
1. 输入 x1, y1, x2, y2 (四个浮点数)
2. 计算 dx = x1 - x2 (水平距离)
3. 计算 dy = y1 - y2 (垂直距离)
4. 计算 dist = sqrt( pow(dx, 2) + pow(dy, 2) )
5. 输出 dist保留两位小数
```
### 真实代码
```cpp
#include <iostream>
#include <cmath> // sqrt、pow 在这里
#include <iomanip> // fixed、setprecision 在这里
using namespace std;
int main() {
double x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
double dist = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
cout << fixed << setprecision(2) << dist << endl;
return 0;
}
```
### 注意点
1. **头文件别忘**`sqrt``pow``<cmath>` 里,格式化输出在 `<iomanip>` 里。
2. **pow 的第二个参数**`pow(底数, 指数)`,指数写 `2` 表示平方,写 `0.5` 也能表示开方(和 sqrt 等价)。
3. **坐标相减顺序无所谓**`pow(x1-x2, 2)``pow(x2-x1, 2)` 结果一样,因为平方消掉了负号。
4. **保留小数的另一种写法**`printf("%.2f", dist)` 也可以,需要 `<cstdio>`
---
## 题目二:(待橙子补充)
> 建议覆盖:`max/min`、`swap` 等 `<algorithm>` 函数
---
### 核心代码(一句话)
>
### 自然语言思路
### 伪代码
### 真实代码
```cpp
```
### 注意点
---
## 题目三:(待橙子补充)
> 建议覆盖:`isalpha`、`isdigit`、`islower`、`isupper`、`tolower`、`toupper` 等 `<cctype>` 函数
---
### 核心代码(一句话)
>
### 自然语言思路
### 伪代码
### 真实代码
```cpp
```
### 注意点
---
## 本课打油诗
> 自带函数真方便,头文件里全找见。
> 省心省力少出错,一行代码就实现。
---
## 课后作业
(待补充)
1.
2.