Files

7.8 KiB
Raw Permalink Blame History

第4课数据类型、ASCII码与分支结构

教学目标

  • 掌握五种常用数据类型int、char、double、bool、string
  • 理解 char 的 ASCII 码本质
  • 能用 ASCII 码判断和转换字符类型
  • 掌握 double 的格式化输出
  • 掌握输入输出、运算符、类型转换和多层分支
  • 认识 switch、三目运算和打擂台

核心考点:数据类型、类型转换与数据范围

考什么

选择正确的________判断表达式结果完成字符与整数转换并识别溢出或精度问题。

必须理解

两个整数相除会进行________除法小数部分会________。char 内部保存字符对应的________码。较大整数通常使用________。

核心写法

double avg = ________ * sum / n;
int d = c - ________;
char c = d + ________;
long long mul = ________ * a * b;

常见错误

  • 为什么 double avg = sum / n; 仍可能丢失小数________
  • 字符 '5' 和整数 5 是否相同________________
  • 怎样避免 a * b 在赋值前已经溢出________________

判断是否掌握

  • 我能根据范围选择数据类型。
  • 我能判断整数除法和类型转换结果。
  • 我能转换数字字符与整数。

一级、二级核心:运算、转换与分支

类型转换

double avg = ______ * sum / cnt;
int num = (int)ch;
char ch = (char)num;

整数除法会不会保留小数______。

多层分支

if (score >= 90) {
    cout << "A";
} else if (score >= 80) {
    cout << "B";
} else {
    cout << "C";
}

switch 语句

switch (op) {
    case 1: cout << "加法"; ______;
    case 2: cout << "减法"; ______;
    default: cout << "无效选择";
}

三目运算

int ma = (a > b) ? ______ : ______;

二次打擂台

先比较 ______相同时再比较 ______。擂主应使用第一个合法候选值初始化。

课堂编程题

数据类型部分

课堂1超大长方体体积【适中】

题目描述: 输入长方体的长、宽、高,输出体积。三个量都能用 int 保存,但乘积可能超过 int 范围。

输入格式: 输入三个正整数,依次表示长、宽和高。

输出格式: 长方体体积。

数据范围: 1≤a,b,c≤10^6,答案不超过 10^18

输入样例:

100000 100000 2

输出样例:

20000000000

解题思路:1LL*a*b*c 使第一次乘法就按 long long 计算。

易错提醒: 只把结果变量写成 long long 不够,右侧的乘法也必须提前转换。

课堂2比赛平均分【适中】

题目描述: 输入三名选手的总分和比赛场数,分别输出三人的平均分,保留两位小数;最后输出最高平均分。

输入格式: 依次输入三名选手的总分和比赛场数。

输出格式: 第一行三个平均分;第二行最高平均分,均保留两位小数。

数据范围: 1≤n≤1000≤s1,s2,s3≤10000

输入样例:

25 20 29 3

输出样例:

8.33 6.67 9.67
9.67

解题思路:1.0*s/n 触发浮点除法,使用 fixedsetprecision(2)

易错提醒: double a=s1/n 仍会先做整数除法,小数已经丢失。

课堂3字母变身与平移【适中】

题目描述: 输入一个英文字母和整数 k。先把字母转换为相反大小写,再在保持新大小写的前提下向后循环平移 k 位。

输入格式: 输入一个英文字母和向后平移的位数。

输出格式: 转换并平移后的字母。

数据范围: 0≤k≤10^9

输入样例:

Y 3

输出样例:

b

解题思路: 大小写互转可利用 ASCII 差值;平移只需使用 k%26,公式为 (c-base+k)%26+base

易错提醒: 平移必须循环;不能直接输出 c+k,否则可能越过字母范围。

课堂4账号检查器【适中】

题目描述: 输入一个不含空格的字符串。若长度不少于 6且同时含有大写字母、小写字母和数字输出 YES,否则输出 NO

输入格式: 一个字符串。

输出格式: YESNO

数据范围: 字符串长度不超过 100。

输入样例:

Abc123

输出样例:

YES

解题思路: 用三个 bool 变量记录是否出现三类字符,遍历 string 后综合判断。

易错提醒: bool 只记录真假;三个条件必须同时满足,应使用 &&

分支结构部分

课堂5阶梯电费【适中】

题目描述: 某月用电量不超过 180 度的部分每度 0.50 元181280 度的部分每度 0.60 元;超过 280 度的部分每度 0.80 元。若总电费超过 200 元再加收 5% 服务费。输出应付金额。

输入格式: 输入一个非负整数,表示本月用电量。

输出格式: 应付金额,保留两位小数。

数据范围: 0≤n≤10000

输入样例:

300

输出样例:

166.00

解题思路: 用多层 if-else if-else 分段累计;计算完成后再独立判断是否加收服务费。

易错提醒: 阶梯收费是分段累计,不是把全部用电量直接乘最高档单价。

课堂6游乐园购票方案【适中】

题目描述: 输入年龄、身高和是否有成人陪同。身高低于 120 厘米免费;否则年龄不满 12 岁时,有成人陪同票价 30 元无陪同不得入园1259 岁票价 80 元60 岁及以上票价 40 元。周末所有非免费票加收 10 元。

输入格式: 依次输入年龄、身高、是否有成人陪同和是否为周末;后两项用 0 或 1 表示。

输出格式: 免费输出 FREE,不得入园输出 DENIED,否则输出票价。

数据范围: 1≤age≤12050≤height≤220

输入样例:

10 135 1 1

输出样例:

40

解题思路: 先判断身高;不免费时再按年龄嵌套判断,儿童分支中继续判断陪同;最后对合法票价判断周末加价。

易错提醒: "不得入园"不是票价 0输出后应立即结束避免继续加价。

课堂7最佳选手【适中】

题目描述: 输入 n 名选手的分数,输出最高分和第一次取得该分数的选手编号。

输入格式: 第一行输入选手人数;第二行输入每名选手的分数。

输出格式: 最高分和选手编号(从 1 开始)。

数据范围: 1≤n≤100,分数为 0100

输入样例:

5
88 95 90 95 70

输出样例:

95 2

解题思路: 用第一名选手初始化擂主;只有出现严格更高分时才更新,便可保留最早编号。

易错提醒: 擂主必须用第一个合法数据初始化;相等时不更新才能保留第一次出现的位置。

课堂8最接近目标的候选人【适中】

题目描述: 输入目标分 target 以及 n 名候选人的编号和分数。选择与目标分距离最小者;距离相同时选分数较高者;仍相同则选编号较小者。

输入格式: 第一行输入候选人数和目标分;随后每行输入一名候选人的编号和分数。

输出格式: 入选者编号和分数。

数据范围: 1≤n≤100,编号互不相同,分数为 0100

输入样例:

4 80
3 76
8 84
2 84
5 90

输出样例:

2 84

解题思路: 依次比较距离、分数、编号,三层优先级构成完整更新条件。

易错提醒: 三层规则按先后顺序连接,每个次级规则都只能在前级相等时生效。

课后作业

请完成本课对应的课后作业,见编程题文件。