C++启蒙课程:第3章  处理数据

数据英雄们,集合!今天我们将学习使用各种尺寸的魔法盒(数据类型)来精确地处理信息,并指挥运算机器人完成计算任务!

🎒

整数魔法盒与常量规则

为不同大小的整数选择合适的“背包”,并学习如何用`const`“上锁”。

🤖

小数的秘密与算术运算

认识处理小数的英雄,并指挥五位运算机器人进行精确计算。

🏭

计算机的思维模式

探索“数据类型转换工厂”的奥秘,看看数据是如何自动“变身”的。

课时一:整数魔法盒与常量规则

(覆盖知识点 3.1.1 - 3.1.9, 3.2)

🏷️ 变量命名规则

给“内存储物柜”贴标签。只能用字母、数字、下划线,且不能以数字开头。

int my_score; // 合法 int _topScore; // 合法 int 9Lives; // 错误!不能以数字开头 int my score; // 错误!不能有空格 int int; // 错误!不能使用关键字

🎒 不同容量的背包

C++提供不同大小的“背包”来装整数,`int` 是最常用的。

🎒
short
小背包
🎒
int
标准背包
🎒
long long
超大背包
short small_num = 10; int normal_num = 20000; // LL 后缀表示这是一个 long long 字面值 long long big_num = 9000000000LL;

➕ “只能装正数”的盒子

`unsigned` 关键字让盒子只能装0和正数,但最大容量翻倍!

Unsigned Box
// 只能存储 0 或正数 unsigned int count = 60000; // 错误!不能存储负数 // unsigned int score = -10;

🔡 字母与数字的魔法

`char` 盒子存放的是字符的**数字编码**(如ASCII码)。`cout` 会智能地将其显示为字符。

65
// 字符用单引号 char my_char = 'A'; // cout 会显示 'A' cout << my_char << endl; // 强制转换为 int 才能看到编码 65 cout << int(my_char) << endl;

🔒 带锁的宝箱 (const)

`bool` 存储 `true` 或 `false`。`const` 像一把锁,一旦上锁,值就永远不能改了!

📦

一个 'const' 宝箱

bool is_ready = true; // 'bool' 类型 // 'const' 关键字会“锁定”这个变量 const int MAX_PLAYERS = 100; // 编译错误!你不能修改一个 const 变量 // MAX_PLAYERS = 101;

🎰 三种计数牌

C++允许你用三种进制来书写数字:十进制、八进制 (前缀 0)、十六进制 (前缀 0x)。

十进制
42
八进制
052
十六进制
0x2A
// 三个变量的值都是 42 int x = 42; // 十进制 int y = 052; // 八进制 (5*8 + 2 = 42) int z = 0x2A; // 十六进制 (2*16 + 10 = 42)

课时二:小数的秘密与算术运算

(覆盖知识点 3.3.1 - 3.4.3)

🔬 E表示法放大镜

E表示法 (科学计数法) 用来表示非常大或非常小的数。

等于
252000000
// 3.14159 double pi = 3.14159; // 252,000,000 double giant = 2.52e+8; // 0.000012 double tiny = 1.2e-5;

📏 精度标尺

`double` 是默认类型,它的“标尺”更长,精度远高于 `float`。

3.1415926535...
float (f): 3.14159... (精度较短)
double: 3.14159265... (精度更长)
// 'f' 后缀表示这是 float f_num = 3.14159f; // 默认是 double,精度更高 double d_num = 3.14159265;

🤖 3.4.2 除法大揭秘 (整数 vs 浮点)

这是C++最重要的陷阱!整数除法会**截断**小数,而浮点除法会保留。

💡 互动体验:

/

计算结果:

📜 代码支撑:

#include <iostream> using namespace std; int main() { // --- 整数除法 (3.4.2) --- // 两个整数相除,结果也是整数 int int_result = 9 / 5; // 结果是 1 (小数部分被截断) cout << int_result << endl; // --- 浮点除法 (3.4.2) --- // 只要有一个数是小数 (9.0) // 结果就是小数 double float_result = 9.0 / 5; // 结果是 1.8 cout << float_result << endl; return 0; }

🍰 3.4.3 求模机器人 (%)

求模机器人 `%` 只吃整数,它会告诉你“余数”是多少。

%
1
// 19 除以 6,商 3 余 1 int remainder = 19 % 6; // remainder 的值是 1 // 错误!% 只能用于整数 // double d = 19.0 % 6.0;

👮 3.4.1 优先级警长

警长指挥:**先乘除,后加减**。括号 `()` 拥有最高优先级。

10 + 4 * 2
(10 + 4) * 2
// 警长先算 4 * 2 = 8 // 再算 10 + 8 = 18 int result1 = 10 + 4 * 2; // 18 // 括号优先!先算 10 + 4 = 14 // 再算 14 * 2 = 28 int result2 = (10 + 4) * 2; // 28

课时三:计算机的思维模式:转换与优先级

(覆盖知识点 3.4.1, 3.4.4, 3.4.5, 3.5)

🏭 3.4.4 赋值转换工厂

当把一个小数“原料”倒进一个整数“模具”时,小数部分会被无情地**截断**(不是四舍五入!)。

🏭
// 3.98 被装入整数盒子 int guess = 3.9832; // guess 的值变为 3 (小数部分被截断) double price = 10; // price 的值变为 10.0 (自动添加小数)

🚀 3.4.4 表达式转换

在表达式中,C++会自动“提升”较小的类型,以匹配较大的类型。

🎒
int
+
🚢
double
=
🚢
double
// 3 + 4.5 // 编译器先把 3 自动转换为 3.0 // 然后计算 3.0 + 4.5 // 结果是 7.5 (double 类型) auto result = 3 + 4.5;

🪄 3.4.4 强制类型转换

用魔法 `(double)` 告诉编译器:“你必须把这个整数当成小数来计算!”

1 = 9 / 5
int total = 9; int count = 5; // (double)total 强制将 total 变为 9.0 // 触发浮点除法 double avg = (double)total / count; // avg 的值是 1.8

🤖 3.4.5 `auto` 智能标签机

`auto` 关键字让编译器自动推断变量的类型,省去我们写类型的麻烦。

// 编译器看到 10.5,推断 speed 是 double auto speed = 10.5; // 编译器看到 100,推断 score 是 int auto score = 100; // 编译器看到 'C',推断 grade 是 char auto grade = 'C';

编程实践与作业

是时候检验你作为数据英雄的实力了!

练习 1:首字母与幸运数字 (课时一)

任务:

编写一个程序,用 `char` 变量存储您姓名的首字母,并使用 `const` 变量存储您的幸运数字。分别输出字符本身和字符的ASCII编码。

点击查看参考答案
#include <iostream> using namespace std; int main() { // 3.1.8 字符常量使用单引号 char first_initial = 'P'; // 3.2 const 限定符 const int LUCKY_NUMBER = 7; cout << "我的首字母是: " << first_initial << endl; // 3.1.8 强制类型转换,显示编码值 cout << "它对应的 ASCII 编码是: " << int(first_initial) << endl; cout << "我的幸运数字是: " << LUCKY_NUMBER << endl; return 0; }
练习 2:披萨分配器 (课时二)

任务:

有20块披萨,分给6个小朋友。每人能分到多少块完整的披萨?还剩下多少块?

点击查看参考答案
#include <iostream> using namespace std; int main() { int total_pizzas = 20; int kids = 6; // 3.4.2 整数除法,计算每人分到的块数 int per_kid = total_pizzas / kids; // 3.4.3 求模运算,计算余数 int remainder = total_pizzas % kids; cout << "每人分到完整的披萨: " << per_kid << " 块。" << endl; cout << "还剩下: " << remainder << " 块披萨。" << endl; return 0; }
练习 3:身高转换器 (课时三)

任务:

编写一个程序,要求用户输入一个整数身高(单位为英寸),然后将其转换为英尺和英寸。使用`const`常量表示转换因子(1英尺=12英寸)。

点击查看参考答案
#include <iostream> using namespace std; int main() { // 3.2 定义 const 符号常量 const int INCHES_PER_FOOT = 12; int total_inches; cout << "请输入您的身高(英寸): "; cin >> total_inches; // 3.4.2 整数除法,计算英尺数 int feet = total_inches / INCHES_PER_FOOT; // 3.4.3 求模运算,计算剩余英寸数 int inches = total_inches % INCHES_PER_FOOT; cout << "您的身高是 " << feet << " 英尺," << inches << " 英寸。" << endl; return 0; }
综合挑战:BMI 计算器 (本章总结)

任务:

编写一个程序,要求输入身高(英尺和英寸)和体重(磅),然后计算并报告其BMI。你需要使用`const`常量、浮点数、多种算术运算和类型转换。

提示公式:1英尺=12英寸;1英寸=0.0254米;1千克=2.2磅。 $BMI = \frac{体重(千克)}{身高(米)^2}$

点击查看参考答案
#include <iostream> #include <cmath> // for pow() function using namespace std; int main() { // 3.2 使用 const 定义转换因子 const int INCHES_PER_FT = 12; const double M_PER_INCH = 0.0254; const double LB_PER_KG = 2.2; int feet, inches; double weight_lbs; cout << "请输入身高 (英尺): "; cin >> feet; cout << "请输入身高 (英寸): "; cin >> inches; cout << "请输入体重 (磅): "; cin >> weight_lbs; int total_inches = feet * INCHES_PER_FT + inches; double height_m = total_inches * M_PER_INCH; // 3.4.2 浮点除法 double weight_kg = weight_lbs / LB_PER_KG; double bmi = weight_kg / pow(height_m, 2); cout << "您的BMI是: " << bmi << endl; return 0; }

本章知识点总结与复习 (3.5)

9 / 5 -> 1
核心概念 解释/功能 关键用法/示例
整型家族`short`, `int`, `long`, `long long`。unsigned int
char最小整型,存储字符编码。'A', int('A')
const将变量锁定为常量,不可修改。const int MAX = 100;
浮点类型`float`, `double`,用于带小数的数字。3.14f, 1.2e-5
算术运算符`+`, `-`, `*`, `/`, `%`。整数除法截断。
类型转换自动或强制改变数据类型。double(my_int)
auto (C++11)编译器根据初始值自动推断类型。auto score = 95.5;