第二阶段第4周

变量、字符串、数字、布尔与基本运算

这一周是语法基础的起点。重点不是背定义,而是会选对数据类型、写出可读表达式,并避免低级运算错误。

学完这周,你应该能写出完整的“输入 -> 计算 -> 输出”程序,并能解释每个变量为什么这样设计。

C++ 第二阶段第4周课程封面

4.1 本周学习路线

建议顺序:变量与类型 -> 字符串和数字混合处理 -> 布尔表达式 -> 运算综合练习。按这条路径学,错误会更少。

本周达成:会使用 `int`、`double`、`bool`、`string` 完成基础数据处理,会写清晰运算表达式,会解释计算流程。

4.2 变量与类型

变量是数据容器,类型决定容器规则。整数计数用 `int`,小数运算用 `double`,真假状态用 `bool`,文本用 `string`。类型选错会直接影响结果。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string playerName = "Leo";
    int level = 4;
    double hp = 98.5;
    bool isOnline = true;

    cout << playerName << " Lv." << level << " HP=" << hp << "\n";
    cout << "在线状态: " << isOnline << "\n";
    return 0;
}

4.3 基本运算与表达式

写运算时优先保证可读性。复杂表达式尽量加括号,并把关键中间结果拆成变量,调试时会非常省时间。

double chinese = 86.5;
double math = 91.0;
double english = 78.5;

double total = chinese + math + english;
double average = total / 3.0;
cout << "总分: " << total << "\n";
cout << "平均分: " << average << "\n";

4.4 布尔与比较

`bool` 只有真和假,但它是判断逻辑的核心。每写一个条件都口头读一遍,可以快速发现方向写反和边界遗漏。

double finalAtk = 162.5;
int critRate = 42;
bool isReady = (finalAtk >= 150.0) && (critRate >= 40);
cout << "是否达到推荐门槛: " << isReady << "\n";

4.5 深度讲解:类型转换、精度与输入校验

很多同学在这一周最大的困惑是:“我明明写的是同一个公式,为什么结果和计算器不一样?”答案通常不在公式本身,而在数据类型。比如你写 `5 / 2`,如果两个数都是 `int`,结果是 `2`;如果你写成 `5.0 / 2`,结果才是 `2.5`。这就是类型参与运算时的规则差异。学习 C++ 的关键不是把语法背熟,而是形成“先判断数据类型,再写表达式”的习惯。你可以在草稿上先写:输入是什么类型、中间值是什么类型、最后输出是什么类型,这样会减少大量隐蔽错误。

类型转换还会影响精度。比如 `double price = 19.99; int x = price;`,`x` 会变成 `19`,小数被截断。这个行为不是 bug,而是语言规则。如果你希望四舍五入,需要显式处理,而不是指望程序“猜到你的意图”。同理,`bool` 和数字也能相互转换:`0` 通常是 `false`,非 0 是 `true`。很多新手在条件里误把数字变量当布尔值,导致分支触发和预期不一致。建议你每次写 `if` 条件时,都明确写出比较关系,例如 `if (hp > 0)`,而不是写成 `if (hp)`。代码可读性提高后,排错会容易很多。

输入校验是本周必须建立的工程习惯。用户输入不一定按你的理想情况来,可能输入负数、超范围值、甚至格式错误。如果程序完全不校验,后面的计算和输出就不可信。比如“暴击率”应当在 0 到 100 之间;“等级”不应为负;“折扣率”不应超过 1。你不需要一步做到复杂容错,但至少要做到“发现异常 -> 提示原因 -> 终止或重输”。只要你建立这个意识,后续做项目时稳定性会明显提升。写完程序后,请主动用三类输入测试:正常输入、边界输入、错误输入。只有三类都过了,程序才算真正可用。

#include <iostream>
using namespace std;

int main() {
    double originalPrice = 0.0;
    double discountRate = 0.0;

    cout << "请输入原价和折扣率(0~1): ";
    cin >> originalPrice >> discountRate;

    if (originalPrice < 0) {
        cout << "原价不能为负数。\n";
        return 0;
    }
    if (discountRate < 0 || discountRate > 1) {
        cout << "折扣率必须在 0 到 1 之间。\n";
        return 0;
    }

    double finalPrice = originalPrice * (1.0 - discountRate);
    cout << "折后价: " << finalPrice << "\n";
    return 0;
}

4.6 学习方法:把“会做题”升级成“会建模”

这一周你可以开始训练一个真正能长期受益的方法:先建模,再编码。所谓建模,不是复杂数学,而是把问题拆成三个清晰部分:输入、处理、输出。比如“购物总价计算器”,输入是商品单价、数量、折扣率;处理是先算原价,再算折后价,再加税;输出是最终应付金额。只要你先写出这三行,代码就不会乱。反过来,如果一上来直接敲代码,常常写到一半发现变量不够、逻辑冲突、结果异常,最后只能反复重写。

建议你每个小题都固定用同一流程:第一步,写变量表(变量名、类型、含义、初始值);第二步,写伪代码(自然语言步骤);第三步,再翻译成 C++。这个流程看起来慢,但它会极大降低返工率。尤其是当题目稍复杂时,结构化步骤会让你保持清晰。你还可以在每个关键步骤后立刻打印中间值,检查程序是否按预期推进。不要把“打印调试”看成初学者手段,它其实是非常专业、非常高效的验证方式。

最后是复盘。每次写完练习,花 5 分钟回答三个问题:我这次最容易错在哪?我下次如何提前避免?我能否用更清晰的变量名重写一次?这个小复盘会让你进步速度远超“只刷题不总结”。编程学习不是一次性记忆,而是不断把经验沉淀成习惯。第二阶段第4周看似基础,但它决定了你后面写循环、写函数、写容器时是否稳定。如果你现在就把类型意识、校验意识、可读性意识建立起来,后面的学习会轻松很多。

4.7 课堂问答与进阶练习

问:为什么我把 `int` 改成 `double` 后,结果更“像人话”了? 因为 `int` 只保存整数,参与运算时会截断小数;`double` 才能表达小数精度。很多“结果差一点”的问题,本质都来自类型不匹配。你可以把类型当成“精度许可”:`int` 只许可整数,`double` 许可小数。

问:什么时候应该用 `bool` 变量,而不是把条件直接写进 `if`? 当条件比较长、会重复使用、或者你想提升可读性时,就该用 `bool` 中间变量。例如 `bool isInputValid = age >= 1 && age <= 120;` 这句本身就是可读注释。你后面写 `if (isInputValid)`,代码会更清晰,也更容易调试。

问:为什么我每次都能“跑通”,但一换数据就错? 这是因为你只测了理想输入,没有测边界和异常输入。建议你从现在开始固定三类测试:正常值、临界值、错误值。比如折扣率题目中,至少测试 `0`、`1`、`-0.1`、`1.1`。如果程序在这四类输入都行为可解释,可靠性就会大幅提升。

进阶练习建议:写一个“体能评分计算器”。输入跑步成绩、仰卧起坐数量和附加加分,输出总分与等级。要求: 第一,所有输入都做范围校验;第二,所有中间结果都拆成变量并打印;第三,至少准备 8 组测试,其中 3 组为异常输入。完成后再做一次重构:把“校验逻辑”单独封装成函数,提前为第6周函数学习做铺垫。

如果你想更进一步,可以给程序增加“批量输入模式”:连续录入 5 名同学数据,输出每人的总分,并统计平均分。这个挑战会让你把本周知识和下周控制流知识连接起来,形成连续学习链路。你会体会到:编程能力不是一节课突然学会,而是每周把一个小能力压实。

4.8 本周练习与自测清单

本周练习

  1. 完成“角色属性计算器”(基础攻击力 + 加成 + 门槛判断)。
  2. 再写一个“购物总价计算器”(折扣 + 税率)。
  3. 每个程序至少测试 5 组输入。

自测清单

补充复盘建议:把你本周最常见的 3 个错误写成“个人排错清单”,下次开写前先对照一遍。这个动作会显著降低重复犯错概率。

返回 C++ 第二阶段