std::cin 在运行时读取用户输入,完成“输入 → 处理 → 输出”的完整流程。
你还会练习两数求和、交换变量、购物小票,并了解 char 和数字编号的关系。
std::cin 在运行时读取用户输入,完成“输入 → 处理 → 输出”的完整流程。
你还会练习两数求和、交换变量、购物小票,并了解 char 和数字编号的关系。
上节课的购物小票,单价 29.9、数量 3 都直接写在代码里。
想换个价格算一遍,就得改代码、重新编译。
更常见的做法是让程序在运行时接受用户的数据。同一份代码, 输入不同的价格和数量,就能得到不同结果。
读取输入用 std::cin,配合 >> 运算符,
把用户敲进来的值存进一个变量:
std::cin >> age;
注意:变量必须先声明(告诉 C++ 它是 int 还是 double),
cin 才知道该按哪种类型来读。
std::cin >> age;,程序会停下来等待输入。
每个 cin 前面先用 cout 打一句提示,比如
std::cout << "请输入年龄:";。
上节课的 <<(流插入)和这节课的 >>(流提取)方向正好相反。
记住一个口诀:箭头指向数据流动的方向。
| 写法 | 方向 | 含义 |
|---|---|---|
std::cout << age | 数据流出到屏幕 | 输出 |
std::cin >> age | 数据流入到变量 | 输入 |
Python:用 input()
age = int(input("请输入年龄:"))
input() 读进来是文字,要 int() 转成数字
C++:用 cin
int age;
std::cout << "请输入年龄:";
std::cin >> age;
类型在声明时就定了,cin 自动按 int 读
#include <iostream>
int main() {
int age;
std::cout << "请输入你的年龄:"; // 先提示用户
std::cin >> age; // 把用户输入存进 age
std::cout << "你明年就 " << age + 1 << " 岁了" << std::endl;
return 0;
} 下面这个两数求和程序分三步:先读两个数,再相加,最后打印结果。
#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;
} double,cin 就能读 29.9 这样的小数。
double price;
std::cout << "请输入单价:";
std::cin >> price; // 能读 29.9 这样的小数
std::cout << "单价是 " << price << " 元" << std::endl; 写一个完整程序:
int 变量3 + 5 = 8 这样的格式double,试试输入 3.5 和 2.1,看看结果对不对。
和 cout 能连续 << 一样,cin 也能连续 >>,
一次读入多个值。用户输入时,用空格或回车隔开。
int a, b;
std::cout << "请输入两个数(空格或回车隔开):";
std::cin >> a >> b; // 一次读两个,按顺序对应
std::cout << "和是 " << a + b << std::endl;
读入 a 和 b 后,怎么把它们的值互换?
a = b; b = a; 是错的。
执行完 a = b; 后,a 原来的值已经被覆盖。
正确做法是用临时变量 temp 先保存旧值。
读入两个数,输出交换前后的值,再对照下面的写法。
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 在恰好整除时看不出问题,
但一旦不整除就会丢掉小数。算平均分、百分比时尤其要注意。
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 就对了
读入三个学生的分数(int),求平均分。
先故意用 int 存平均分跑一次,观察结果不对;
再改用 double + (double) 修复它。
C++ 用 char 类型存单个字符,要用单引号,比如 'A'。
在常见的 ASCII / UTF-8 环境里,'A' 对应的编号是 65。
用强制类型转换 (int) / (char),可以在字符和编号之间切换:
#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 码 |
|---|---|
'A' ~ 'Z' | 65 ~ 90 |
'a' ~ 'z' | 97 ~ 122 |
'0' ~ '9' | 48 ~ 57 |
' '(空格) | 32 |
大写字母和对应的小写字母正好差 32。所以 (char)('A' + 32) 就是 'a'。
对 ASCII 英文字母来说,大小写转换其实就是一道加减法。
Python:用 ord / chr
ord('A') → 65
chr(66) → 'B'
C++:用强制类型转换
(int)'A' → 65
(char)66 → 'B'
ASCII 装不下几万个汉字。UTF-8 这样的编码会用多个字节表示一个汉字。
下面这段代码里,"你好" 是 2 个汉字,
length() 却会输出 6:
#include <iostream>
#include <string>
int main() {
std::string name = "你好"; // 2 个汉字
std::cout << name.length() << std::endl; // UTF-8 下通常输出 6
return 0;
} 2 × 3 = 6。
如果源码或编译器执行编码是 GBK / CP936,可能是 4;Windows 控制台直接输出中文有时还会乱码。
现在先记住:std::string 的 length() 数的是里面有多少个 char;
对 UTF-8 字符串来说,这通常就是字节数,不是汉字个数。
Python 3:数的是“字符”
len("你好") → 2
C++:数的是“字节”
name.length() → 6
读入两个数 a 和 b,依次输出它们的和、差、积、商,每行一个。
要求:
(double)让用户自己输入单价和数量,再计算购物小票。
要求:
double 读单价,int 读数量参考写法:
#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;
} 从下面三个里挑一个。都只需要“读几个数 → 算 → 输出”:
0.1 这种不该被改的值,可以声明成常量:const double TAX = 0.1;,
后面就不能再修改它。8.97 而不是 8.9700001),可以在文件顶部
#include <iomanip>,输出前加一句
std::cout << std::fixed << std::setprecision(2);。
string 读入姓名,拼接出一张“个人信息卡”。