← 课程目录
第 3 讲 模块一:认识编程

让程序接受输入

3 / 24
💡
本节课目标
今天你会用 std::cin 在运行时读取用户输入,完成“输入 → 处理 → 输出”的完整流程。 你还会练习两数求和、交换变量、购物小票,并了解 char 和数字编号的关系。
开场

从固定数字到用户输入

📖 理论讲解

写死的数字有什么问题

上节课的购物小票,单价 29.9、数量 3 都直接写在代码里。 想换个价格算一遍,就得改代码、重新编译。

更常见的做法是让程序在运行时接受用户的数据。同一份代码, 输入不同的价格和数量,就能得到不同结果。

第一段

cin 与 >> 运算符

📖 理论讲解

cin:从键盘读取数据

读取输入用 std::cin,配合 >> 运算符, 把用户敲进来的值存进一个变量:

std::cin >> age;

注意:变量必须先声明(告诉 C++ 它是 int 还是 double), cin 才知道该按哪种类型来读。

关键习惯:先提示,再读取
如果直接 std::cin >> age;,程序会停下来等待输入。 每个 cin 前面先用 cout 打一句提示,比如 std::cout << "请输入年龄:";
📖 理论讲解

>> 和 << 是一对镜像

上节课的 <<(流插入)和这节课的 >>(流提取)方向正好相反。 记住一个口诀:箭头指向数据流动的方向

写法方向含义
std::cout << age数据流到屏幕输出
std::cin >> age数据流到变量输入
Python

Python:input()

age = int(input("请输入年龄:"))

input() 读进来是文字,要 int() 转成数字

VS
C++

C++:cin

int age;

std::cout << "请输入年龄:";

std::cin >> age;

类型在声明时就定了,cin 自动按 int

read_age.cpp CPP
#include <iostream>

int main() {
    int age;
    std::cout << "请输入你的年龄:";   // 先提示用户
    std::cin >> age;                  // 把用户输入存进 age

    std::cout << "你明年就 " << age + 1 << " 岁了" << std::endl;
    return 0;
}
第二段

跑通三段式:两数求和

📖 理论讲解

输入 → 处理 → 输出

下面这个两数求和程序分三步:先读两个数,再相加,最后打印结果。

sum.cpp CPP
#include <iostream>

int main() {
    int a, b;                       // 准备两个变量

    std::cout << "请输入第一个数:";
    std::cin >> a;
    std::cout << "请输入第二个数:";
    std::cin >> b;

    int sum = a + b;

    std::cout << a << " + " << b << " = " << sum << std::endl;
    return 0;
}
💡
cin 也能读小数
变量声明成 doublecin 就能读 29.9 这样的小数。
read_double.cpp CPP
double price;
std::cout << "请输入单价:";
std::cin >> price;                  // 能读 29.9 这样的小数
std::cout << "单价是 " << price << " 元" << std::endl;
⚡ 动手实操 约 12 分钟

练习 3-1:两数求和器

写一个完整程序:

  1. 声明两个 int 变量
  2. 分别提示并读入两个数
  3. 计算它们的和,输出成 3 + 5 = 8 这样的格式
进阶
把变量改成 double,试试输入 3.52.1,看看结果对不对。
第三段

一次读多个与交换变量

📖 理论讲解

cin 可以连续读

cout 能连续 << 一样,cin 也能连续 >>, 一次读入多个值。用户输入时,用空格或回车隔开。

read_two.cpp CPP
int a, b;
std::cout << "请输入两个数(空格或回车隔开):";
std::cin >> a >> b;                 // 一次读两个,按顺序对应

std::cout << "和是 " << a + b << std::endl;
📖 理论讲解

经典难题:交换两个变量的值

读入 ab 后,怎么把它们的值互换? a = b; b = a; 是错的。

执行完 a = b; 后,a 原来的值已经被覆盖。 正确做法是用临时变量 temp 先保存旧值。

⚡ 动手实操 约 10 分钟

练习 3-2:交换两个数

读入两个数,输出交换前后的值,再对照下面的写法。

swap.cpp CPP
int a, b;
std::cin >> a >> b;
std::cout << "交换前:a=" << a << " b=" << b << std::endl;

int temp = a;       // ① 先把 a 的值暂存到 temp
a = b;              // ② 把 b 装进 a
b = temp;           // ③ 把暂存的旧 a 装进 b

std::cout << "交换后:a=" << a << " b=" << b << std::endl;
第四段

常见坑:排错训练

📖 理论讲解

新手最容易踩的三个坑

现象怎么修
变量没先声明就 cin 编译报错 age was not declared 先写 int age;
方向写反 std::cin << age 通常会编译报错 输入用 >>,输出才用 <<
两个 int 相除 结果莫名变成 0 或差很远 (double) 转一个再除
⚠️
整数除法要警惕
total / count 在恰好整除时看不出问题, 但一旦不整除就会丢掉小数。算平均分、百分比时尤其要注意。
div_trap.cpp CPP
int total, count;
std::cin >> total >> count;         // 比如输入 7 和 2

std::cout << total / count << std::endl;            // 3,小数被丢掉了
std::cout << (double)total / count << std::endl;    // 3.5,临时转 double 就对了
⚡ 动手实操 约 8 分钟

练习 3-3:求平均分

读入三个学生的分数(int),求平均分。 先故意int 存平均分跑一次,观察结果不对; 再改用 double + (double) 修复它。

番外

字符的秘密:它其实是个数字

💡
拓展内容
这一段不影响主线,暂时跟不上可以先跳过。
📖 理论讲解

char:存一个字符,本质是个小整数

C++ 用 char 类型存单个字符,要用单引号,比如 'A'。 在常见的 ASCII / UTF-8 环境里,'A' 对应的编号是 65

用强制类型转换 (int) / (char),可以在字符和编号之间切换:

char_secret.cpp CPP
#include <iostream>

int main() {
    char c = 'A';
    std::cout << c << std::endl;              // 输出 A
    std::cout << (int)c << std::endl;         // 输出 65
    std::cout << (char)(c + 1) << std::endl;  // 输出 B(65 + 1 = 66,而 66 就是 'B')
    return 0;
}
📖 理论讲解

几个常用的 ASCII 码

字符ASCII 码
'A' ~ 'Z'65 ~ 90
'a' ~ 'z'97 ~ 122
'0' ~ '9'48 ~ 57
' '(空格)32

大写字母和对应的小写字母正好差 32。所以 (char)('A' + 32) 就是 'a'。 对 ASCII 英文字母来说,大小写转换其实就是一道加减法。

Python

Python:ord / chr

ord('A') → 65

chr(66) → 'B'

VS
C++

C++:用强制类型转换

(int)'A' → 65

(char)66 → 'B'

📖 理论讲解

那中文呢?一个字不止一个字节

ASCII 装不下几万个汉字。UTF-8 这样的编码会用多个字节表示一个汉字。

下面这段代码里,"你好" 是 2 个汉字, length() 却会输出 6

chinese_bytes.cpp CPP
#include <iostream>
#include <string>

int main() {
    std::string name = "你好";                  // 2 个汉字
    std::cout << name.length() << std::endl;    // UTF-8 下通常输出 6
    return 0;
}
⚠️
输出不是 6 也正常
我们用的 CLion 默认按 UTF-8 保存代码,一个汉字占 3 字节,所以是 2 × 3 = 6。 如果源码或编译器执行编码是 GBK / CP936,可能是 4;Windows 控制台直接输出中文有时还会乱码。 现在先记住:std::stringlength() 数的是里面有多少个 char; 对 UTF-8 字符串来说,这通常就是字节数,不是汉字个数
Python

Python 3:数的是“字符”

len("你好") → 2

VS
C++

C++:数的是“字节”

name.length() → 6

第五段

实战:分层计算器

练习 3-4

两数计算器

读入两个数 ab,依次输出它们的和、差、积、商,每行一个。

要求:

  • 四个提示语都写清楚(“和:”、“差:”……)
  • 算“商”时注意整数除法陷阱——想让结果带小数,得用 (double)
练习 3-5

交互式购物小票

让用户自己输入单价和数量,再计算购物小票。

要求:

  • double 读单价,int 读数量
  • 计算小计、税费(小计 × 0.1)、总价并输出

参考写法:

receipt.cpp CPP
#include <iostream>

int main() {
    int quantity;
    double unitPrice;

    std::cout << "请输入单价:";
    std::cin >> unitPrice;
    std::cout << "请输入数量:";
    std::cin >> quantity;

    double subtotal = quantity * unitPrice;
    double tax      = subtotal * 0.1;
    double total    = subtotal + tax;

    std::cout << "小计:" << subtotal << " 元" << std::endl;
    std::cout << "税费:" << tax      << " 元" << std::endl;
    std::cout << "总计:" << total    << " 元" << std::endl;
    return 0;
}
挑战版

任选一个生活计算器

从下面三个里挑一个。都只需要“读几个数 → 算 → 输出”:

  • 长方形:读长和宽,输出面积和周长
  • BMI:读体重(千克)和身高(米),算 BMI = 体重 ÷ 身高²
  • 温度转换:读摄氏度,转成华氏度(华氏 = 摄氏 × 9.0 / 5 + 32,小心整数除法!)
学有余力:const 常量 + 小数格式化
像税率 0.1 这种不该被改的值,可以声明成常量:const double TAX = 0.1;, 后面就不能再修改它。
想让金额只显示两位小数(8.97 而不是 8.9700001),可以在文件顶部 #include <iomanip>,输出前加一句 std::cout << std::fixed << std::setprecision(2);
💡
下节课预告
这节课我们让程序读数字。下节课轮到文字—— 用 string 读入姓名,拼接出一张“个人信息卡”。