7.4 KiB
第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,才会保留小数。赋值或运算时发生类型转换,可能扩大范围,也可能丢失信息。
核心写法
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,掌握算术、关系和逻辑运算:
int a, b;
cin >> a >> b;
cout << a + b << endl;
bool valid = (a >= 0 && a <= 100);
整数除法会丢弃小数部分;需要小数时,应让至少一个运算数先转成 double。
隐式转换与强制转换
double average = 1.0 * sum / count; // 隐式转换为 double
int code = (int)letter; // 强制转换为 int
char letter = (char)code; // 强制转换为 char
类型范围变大通常较安全;从浮点数转成整数会丢弃小数部分。
多层分支
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 60) {
cout << "C";
} else {
cout << "D";
}
多个条件互斥时使用 else if,避免多个独立 if 重复执行。
switch 语句
switch (choice) {
case 1: cout << "加法"; break;
case 2: cout << "减法"; break;
default: cout << "无效选择";
}
switch 适合根据一个整数或字符的不同取值进行分支。每个 case 后通常需要 break,否则会继续执行后面的分支。
三目运算
int bigger = (a > b) ? a : b;
三目运算适合简单的二选一,不适合代替复杂的多层分支。
打擂台与二次规则
寻找最接近目标值的数时,先比较距离;距离相同再比较数值:
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)
真实代码
#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;
}
方法二(用自带函数,更简洁)
if (isupper(ch)) {
cout << "大写字母" << endl;
} else if (islower(ch)) {
cout << "小写字母" << endl;
} else if (isdigit(ch)) {
cout << "数字" << endl;
} else {
cout << "其他字符" << endl;
}
注意点
char能直接比大小:ch >= 'A'就是在比较 ASCII 码值,不需要先转成 int。- 字符写单引号:
'A'不是"A",单引号是 char,双引号是字符串。 - ASCII 码值记忆技巧:
'0'=48,'A'=65,'a'=97。小写字母 = 大写字母 + 32。 - 大小写互转:大写转小写
ch + 32,小写转大写ch - 32。或者用tolower(ch)/toupper(ch)(返回 int,需要转回 char)。 - 不要混用 string 和 char:
string是字符串(双引号),char是单个字符(单引号),两者不同。
题目二:(待橙子补充)
建议覆盖:double 格式化输出、int vs long long 范围等
核心代码(一句话)
自然语言思路
伪代码
真实代码
注意点
题目三:(待橙子补充)
建议覆盖:bool 类型、string 基本操作等
核心代码(一句话)
自然语言思路
伪代码
真实代码
注意点
本课打油诗
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.