Files
project1/第01课-数据类型与分支结构/教案-学生版.md

290 lines
7.8 KiB
Markdown
Raw 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.
# 第4课数据类型、ASCII码与分支结构
## 教学目标
- 掌握五种常用数据类型int、char、double、bool、string
- 理解 char 的 ASCII 码本质
- 能用 ASCII 码判断和转换字符类型
- 掌握 double 的格式化输出
- 掌握输入输出、运算符、类型转换和多层分支
- 认识 switch、三目运算和打擂台
## 核心考点:数据类型、类型转换与数据范围
### 考什么
选择正确的________判断表达式结果完成字符与整数转换并识别溢出或精度问题。
### 必须理解
两个整数相除会进行________除法小数部分会________。`char` 内部保存字符对应的________码。较大整数通常使用________。
### 核心写法
```cpp
double avg = ________ * sum / n;
int d = c - ________;
char c = d + ________;
long long mul = ________ * a * b;
```
### 常见错误
- 为什么 `double avg = sum / n;` 仍可能丢失小数________
- 字符 `'5'` 和整数 `5` 是否相同________________
- 怎样避免 `a * b` 在赋值前已经溢出________________
### 判断是否掌握
- [ ] 我能根据范围选择数据类型。
- [ ] 我能判断整数除法和类型转换结果。
- [ ] 我能转换数字字符与整数。
---
## 一级、二级核心:运算、转换与分支
### 类型转换
```cpp
double avg = ______ * sum / cnt;
int num = (int)ch;
char ch = (char)num;
```
整数除法会不会保留小数______。
### 多层分支
```cpp
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else {
cout << "C";
}
```
### `switch` 语句
```cpp
switch (op) {
case 1: cout << "加法"; ______;
case 2: cout << "减法"; ______;
default: cout << "无效选择";
}
```
### 三目运算
```cpp
int ma = (a > b) ? ______ : ______;
```
### 二次打擂台
先比较 ______,相同时再比较 ______。擂主应使用第一个合法候选值初始化。
## 课堂编程题
### 数据类型部分
#### 课堂1超大长方体体积【适中】
**题目描述:** 输入长方体的长、宽、高,输出体积。三个量都能用 `int` 保存,但乘积可能超过 `int` 范围。
**输入格式:** 输入三个正整数,依次表示长、宽和高。
**输出格式:** 长方体体积。
**数据范围:** `1≤a,b,c≤10^6`,答案不超过 `10^18`
**输入样例:**
```text
100000 100000 2
```
**输出样例:**
```text
20000000000
```
**解题思路:**`1LL*a*b*c` 使第一次乘法就按 `long long` 计算。
**易错提醒:** 只把结果变量写成 `long long` 不够,右侧的乘法也必须提前转换。
#### 课堂2比赛平均分【适中】
**题目描述:** 输入三名选手的总分和比赛场数,分别输出三人的平均分,保留两位小数;最后输出最高平均分。
**输入格式:** 依次输入三名选手的总分和比赛场数。
**输出格式:** 第一行三个平均分;第二行最高平均分,均保留两位小数。
**数据范围:** `1≤n≤100``0≤s1,s2,s3≤10000`
**输入样例:**
```text
25 20 29 3
```
**输出样例:**
```text
8.33 6.67 9.67
9.67
```
**解题思路:**`1.0*s/n` 触发浮点除法,使用 `fixed``setprecision(2)`
**易错提醒:** `double a=s1/n` 仍会先做整数除法,小数已经丢失。
#### 课堂3字母变身与平移【适中】
**题目描述:** 输入一个英文字母和整数 `k`。先把字母转换为相反大小写,再在保持新大小写的前提下向后循环平移 `k` 位。
**输入格式:** 输入一个英文字母和向后平移的位数。
**输出格式:** 转换并平移后的字母。
**数据范围:** `0≤k≤10^9`
**输入样例:**
```text
Y 3
```
**输出样例:**
```text
b
```
**解题思路:** 大小写互转可利用 ASCII 差值;平移只需使用 `k%26`,公式为 `(c-base+k)%26+base`
**易错提醒:** 平移必须循环;不能直接输出 `c+k`,否则可能越过字母范围。
#### 课堂4账号检查器【适中】
**题目描述:** 输入一个不含空格的字符串。若长度不少于 6且同时含有大写字母、小写字母和数字输出 `YES`,否则输出 `NO`
**输入格式:** 一个字符串。
**输出格式:** `YES``NO`
**数据范围:** 字符串长度不超过 100。
**输入样例:**
```text
Abc123
```
**输出样例:**
```text
YES
```
**解题思路:** 用三个 `bool` 变量记录是否出现三类字符,遍历 `string` 后综合判断。
**易错提醒:** `bool` 只记录真假;三个条件必须同时满足,应使用 `&&`
### 分支结构部分
#### 课堂5阶梯电费【适中】
**题目描述:** 某月用电量不超过 180 度的部分每度 0.50 元181280 度的部分每度 0.60 元;超过 280 度的部分每度 0.80 元。若总电费超过 200 元再加收 5% 服务费。输出应付金额。
**输入格式:** 输入一个非负整数,表示本月用电量。
**输出格式:** 应付金额,保留两位小数。
**数据范围:** `0≤n≤10000`
**输入样例:**
```text
300
```
**输出样例:**
```text
166.00
```
**解题思路:** 用多层 `if-else if-else` 分段累计;计算完成后再独立判断是否加收服务费。
**易错提醒:** 阶梯收费是分段累计,不是把全部用电量直接乘最高档单价。
#### 课堂6游乐园购票方案【适中】
**题目描述:** 输入年龄、身高和是否有成人陪同。身高低于 120 厘米免费;否则年龄不满 12 岁时,有成人陪同票价 30 元无陪同不得入园1259 岁票价 80 元60 岁及以上票价 40 元。周末所有非免费票加收 10 元。
**输入格式:** 依次输入年龄、身高、是否有成人陪同和是否为周末;后两项用 0 或 1 表示。
**输出格式:** 免费输出 `FREE`,不得入园输出 `DENIED`,否则输出票价。
**数据范围:** `1≤age≤120``50≤height≤220`
**输入样例:**
```text
10 135 1 1
```
**输出样例:**
```text
40
```
**解题思路:** 先判断身高;不免费时再按年龄嵌套判断,儿童分支中继续判断陪同;最后对合法票价判断周末加价。
**易错提醒:** "不得入园"不是票价 0输出后应立即结束避免继续加价。
#### 课堂7最佳选手【适中】
**题目描述:** 输入 `n` 名选手的分数,输出最高分和第一次取得该分数的选手编号。
**输入格式:** 第一行输入选手人数;第二行输入每名选手的分数。
**输出格式:** 最高分和选手编号(从 1 开始)。
**数据范围:** `1≤n≤100`,分数为 `0100`
**输入样例:**
```text
5
88 95 90 95 70
```
**输出样例:**
```text
95 2
```
**解题思路:** 用第一名选手初始化擂主;只有出现严格更高分时才更新,便可保留最早编号。
**易错提醒:** 擂主必须用第一个合法数据初始化;相等时不更新才能保留第一次出现的位置。
#### 课堂8最接近目标的候选人【适中】
**题目描述:** 输入目标分 `target` 以及 `n` 名候选人的编号和分数。选择与目标分距离最小者;距离相同时选分数较高者;仍相同则选编号较小者。
**输入格式:** 第一行输入候选人数和目标分;随后每行输入一名候选人的编号和分数。
**输出格式:** 入选者编号和分数。
**数据范围:** `1≤n≤100`,编号互不相同,分数为 `0100`
**输入样例:**
```text
4 80
3 76
8 84
2 84
5 90
```
**输出样例:**
```text
2 84
```
**解题思路:** 依次比较距离、分数、编号,三层优先级构成完整更新条件。
**易错提醒:** 三层规则按先后顺序连接,每个次级规则都只能在前级相等时生效。
## 课后作业
> 请完成本课对应的课后作业,见编程题文件。