一、🧙♂️《C++ 王国的对话魔法》
—— 学会和电脑“说话”的第一课
在 C++ 王国里,电脑其实是个“小机器人🤖”,
它不会主动说话,也不会自己知道答案,
👉 你必须教会它两件事:1️⃣怎么听你说话(输入)
2️⃣怎么把话说出来(输出)
今天我们就来学这两种“魔法”。
1、先认识两位魔法师 ✨
在 C++ 王国里,有两位非常重要的魔法师:
| 名字 | 作用 | 记忆方法 |
|---|---|---|
cin | 输入(听) | c in→ 把东西“放进来” |
cout | 输出(说) | c out→ 把东西“送出去” |
2、输出魔法 🗣️ —— cout(电脑说话)
🎯 (1)cout 是干什么的?
👉让电脑在屏幕上显示内容
就像你对电脑说:
“嘿!把这句话写在黑板上!”
🎩 (2)最简单的输出例子
📺 运行结果
Hello, C++!🧠 (2) 一行一行解释
| 代码 | 意思 |
|---|---|
#include <iostream> | 请来“输入输出魔法书”📖 |
using namespace std; | 不用每次都写std:: |
cout | 电脑开始说话 |
<< | “送出去”的箭头 |
"Hello, C++!" | 要说的话 |
; | 这句话说完了 |
🎯 (4) 输出数字
cout << 10;输出:
⚠️注意:
字符串要加
" "数字不用加
" "
🎯 (5) 连续输出(像接火车 🚂)
cout << "我今年" << 10 << "岁";输出:
我今年10岁👉<<就像一节一节车厢连起来!
🎯 (6) 换行输出(另起一行)
方法一:\n
cout << "第一行\n"; cout << "第二行\n";方法二:endl(推荐给小学生)
cout << "第一行" << endl; cout << "第二行" << endl;3、输入魔法 👂 —— cin(电脑听你说)
🎯 (1) cin 是干什么的?
👉让电脑“听”你在键盘上输入的内容
你对电脑说:
“我来告诉你一个数字,你记好哦!”
🎩 (2) 第一个输入例子
#include <iostream> using namespace std; int main() { int age; cin >> age; cout << age; return 0; }🧠 (3) 发生了什么?(讲故事版)
1️⃣int age;
👉 准备一个“小盒子📦”,名字叫age
2️⃣cin >> age;
👉 电脑在等你输入
👉 你在键盘上输入一个数字,按回车
👉 数字被放进 age 盒子里
3️⃣cout << age;
👉 电脑把盒子里的东西拿出来说给你听
🎮 (4) 加点提示,更友好 (竞赛考试时,绝对不要加自己的任何注释和提示)
int age; cout << "请输入你的年龄:"; cin >> age; cout << "你的年龄是:" << age << endl;🖥️ 运行时画面:
请输入你的年龄:10 你的年龄是:104、输入 + 输出组合魔法 ✨✨
🎯 例子:计算两数之和
#include <iostream> using namespace std; int main() { int a, b; cout << "请输入第一个数:"; cin >> a; cout << "请输入第二个数:"; cin >> b; cout << "它们的和是:" << a + b << endl; return 0; }👦 学生输入:
3 5📺 输出:
它们的和是:85、cin 和 cout 的“方向箭头”口诀 🧠
💡超级好记口诀(一定要教!)
👉cin 是右箭头 >>(往盒子里装)
👉cout 是左箭头 <<(往外说)
cin >> 变量 (装进去) cout << 内容 (说出来)6、常见错误(小学生一定会犯 😄)
❌ 错误 1:忘记分号
cout << "Hello"❌ 会报错
✅ 每句后面要加;
❌ 错误 2:字符串忘记加双引号
cout << Hello;❌ 错
✅ 要写:
cout << "Hello";❌ 错误 3:cin 写反方向
cin << age; // ❌✅ 正确:
cin >> age;二、🧙♂️《C++ 王国的超级输入输出控制室》
—— 不只是说话,而是“怎么说、说多准、排多齐”
第一幕:为什么 cin / cout 还不够?
🎯 问题抛给学生(非常重要)
老师问:
“如果电脑要读一整句话呢?
比如:Hello C++ World(中间有空格)cin能不能读?”
👦 学生会说:能吧?
👉错!
第二幕:输入篇(完整版)👂
1、cin —— 一个“怕空格”的听话机器人 🤖
1️⃣ cin 的本质规则(必须讲清)
cin遇到空格 / 回车就停
string s; cin >> s;输入:
Hello C++ World结果:
s = "Hello"📌原因:cin >>只读到第一个“空白字符”为止。
2️⃣ cin 能读什么?
| 类型 | 是否可用 |
|---|---|
| int / double | ✅ |
| char | ✅ |
| string(无空格) | ✅ |
| 一整行(有空格) | ❌ |
2、getline —— “整句话捕捉大师” 🎤
🎯 出场原因
“电脑需要把一句话原封不动地听完!”
1️⃣ 基本用法(必须会)
string s; getline(cin, s);输入:
Hello C++ World结果:
s = "Hello C++ World"2️⃣ getline 的规则(非常重要)
📌getline 会一直读到回车键(Enter)
3、cin + getline 的“超级大坑” ⚠️(一定要重点讲)
❌ 错误示例
int age; string name; cin >> age; getline(cin, name);输入:
10 Tom结果:
name = "" (空的!)😱 为什么?
🧠 真相(老师一定要讲清)
cin >> age只读了10回车符
\n还留在输入缓冲区getline一来,直接读到这个回车 → 结束
✅ 正确写法 (在竞赛中尽量避免cin与getline混用)
cin >> age; cin.ignore(); // 忽略一个回车 getline(cin, name);第三幕:输出篇(真正的“控制输出”)🖨️
现在进入重点内容:
👉cout 不只是输出,而是“怎么输出”
1、控制精度(小数)🎯
1️⃣ 默认情况
double x = 3.1415926; cout << x << endl;输出:
3.141592️⃣ 固定小数位数(必须会)
cout << fixed << setprecision(2) << x << endl;输出:
3.14📌记忆法:
| 控制器 | 作用 |
|---|---|
| fixed | 固定小数 |
| setprecision(n) | 保留 n 位 |
3️⃣ 不用 fixed 会怎样?
cout << setprecision(2) << x;输出:
3.1📌这是“有效数字”,不是小数位
2、控制宽度(对齐用)📏
1️⃣ setw —— 给输出一个“格子”
cout << setw(5) << 10 << endl;输出:
10📌 默认:右对齐
2️⃣ 左对齐 / 右对齐
cout << left << setw(5) << 10 << endl; cout << right << setw(5) << 10 << endl;输出:
10 103️⃣ 表格实例(非常适合课堂)
cout << left; cout << setw(10) << "姓名" << setw(5) << "分数" << endl; cout << setw(10) << "Tom" << setw(5) << 95 << endl; cout << setw(10) << "Lucy" << setw(5) << 88 << endl;输出:
姓名 分数 Tom 95 Lucy 883、填充字符(进阶但很酷 😎)
cout << setfill('*') << setw(6) << 42 << endl;输出:
****424、常用输出控制器总表(一定要掌握)
| 控制器 | 作用 |
|---|---|
| fixed | 固定小数 |
| setprecision(n) | 控制精度 |
| setw(n) | 控制宽度 |
| left / right | 左右对齐 |
| setfill(c) | 填充字符 |
| endl | 换行+刷新 |
第四幕:综合实战(有学习含量 💥)
🎯 成绩单程序(cin + getline + 所有输出控制)
#include <iostream> #include <iomanip> using namespace std; int main() { string name; double score; cout << "请输入学生姓名:"; getline(cin, name); cout << "请输入成绩:"; cin >> score; cout << "\n===== 成绩单 =====\n"; cout << left; cout << setw(10) << "姓名" << setw(10) << "成绩" << endl; cout << setw(10) << name << setw(10) << fixed << setprecision(2) << score << endl; return 0; }三、📘 C++ 风格输入输出专项训练:
🟢 第一阶段:基础输入输出(1–5)
第 1 题:你好,C++
题目
使用cout输出一行文字:
Hello C++【训练目标】
cout字符串输出
分号
第 2 题:输出数字
题目
输出数字12345(不加引号)。
【训练目标】
数字输出
字符串 vs 数字的区别
第 3 题:输入一个整数
题目
输入一个整数n,输出它。
【训练目标】
cin >>变量
第 4 题:输入两个整数
题目
输入两个整数a和b,输出它们的和。
【训练目标】
连续输入
表达式输出
第 5 题:输入并提示
题目
提示用户输入年龄,并输出:
你的年龄是:X【训练目标】
提示语输出
输入 + 输出组合
🟡 第二阶段:cin 的规则与坑(6–9)
第 6 题:字符串(无空格)
题目
输入一个不包含空格的名字,用cin读取并输出。
【训练目标】
cin >> stringcin 遇空格停止
第 7 题:一句话(有空格)
题目
输入一整句话(可能包含空格),原样输出。
【训练目标】
getline区分 cin / getline
第 8 题:先数字,后整行
题目
先输入一个整数,再输入一整行字符串,分别输出。
【训练目标】
cin + getline输入缓冲区问题
⚠️本题必须正确处理回车
第 9 题:多行输入
题目
连续输入 3 行文字,使用getline读取,并逐行输出。
【训练目标】
多次
getline行输入概念
🟠 第三阶段:小数与精度控制(10–13)
第 10 题:输出浮点数
题目
输入一个double,直接输出。
【训练目标】
浮点输入输出
默认精度
第 11 题:保留 2 位小数
题目
输入一个浮点数,保留 2 位小数输出。
【训练目标】
fixedsetprecision
第 12 题:保留 3 位小数
题目
输入两个浮点数,输出它们的平均值,保留 3 位小数。
【训练目标】
浮点运算
精度控制
第 13 题:有效数字 vs 固定小数
题目
输入一个浮点数:
第一行用
setprecision(3)输出第二行用
fixed + setprecision(3)输出
【训练目标】
理解两种精度含义的区别
🔵 第四阶段:宽度、对齐、表格(14–17)
第 14 题:控制输出宽度
题目
输出数字42,占 5 个字符宽度。
【训练目标】
setw默认右对齐
第 15 题:左对齐
题目
输出字符串"Tom",占 10 个字符宽度,左对齐。
【训练目标】
left宽度 + 对齐
第 16 题:右对齐
题目
输出字符串"Tom",占 10 个字符宽度,右对齐。
【训练目标】
right
第 17 题:成绩表
题目
输入 2 个学生的姓名和成绩,按下表格式输出:
姓名 成绩 Tom 95.50 Lucy 88.00【训练目标】
getline + cinsetwfixed + setprecision表格输出
🔴 第五阶段:竞赛级输入输出(18–20)
第 18 题:多组数据
题目
第一行输入整数n,接下来输入n个整数,逐个输出。
【训练目标】
循环 + 输入输出
比赛常见格式
第 19 题:严格格式输出
题目
输入一个整数x,输出格式如下(注意空格和对齐):
Value: x其中x占 5 个字符宽度,右对齐。
【训练目标】
精确格式控制
OJ 判题思维
第 20 题:综合终极题(I/O 大魔王)
题目
输入:
一行姓名(可能有空格)
一个整数年龄
一个浮点数成绩
输出格式要求:
姓名左对齐,占 15
年龄右对齐,占 5
成绩保留 2 位小数,占 8
【训练目标】
cin + getline缓冲区处理
所有输出控制综合
竞赛级 I/O 能力
四、C++ 风格输入输出专项训练
—— 参考答案与详细讲解
🟢 第 1 题:你好,C++
✅ 参考答案
#include <iostream> using namespace std; int main() { cout << "Hello C++"; return 0; }🧠 讲解
cout:C++ 风格输出"Hello C++":字符串,必须加双引号;:一句话结束程序从
main开始,从return 0结束
🟢 第 2 题:输出数字
✅ 参考答案
#include <iostream> using namespace std; int main() { cout << 12345; return 0; }🧠 讲解
数字不是字符串
不需要双引号
"12345"和12345是完全不同的东西
🟢 第 3 题:输入一个整数
✅ 参考答案
#include <iostream> using namespace std; int main() { int n; cin >> n; cout << n; return 0; }🧠 讲解
cin >> n:把键盘输入的整数放进变量ncout << n:把变量里的值输出箭头方向记忆法:
cin >>:装进去cout <<:拿出来
🟢 第 4 题:输入两个整数求和
✅ 参考答案
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a + b; return 0; }🧠 讲解
cin >> a >> b:连续输入a + b:可以直接写在cout里不需要中间变量
🟢 第 5 题:带提示的输入输出
✅ 参考答案
#include <iostream> using namespace std; int main() { int age; cout << "请输入你的年龄:"; cin >> age; cout << "你的年龄是:" << age; return 0; }🧠 讲解
提示语只是普通输出
输入不会自动换行,是否换行由程序员决定
🟡 第 6 题:字符串(无空格)
✅ 参考答案
#include <iostream> #include <string> using namespace std; int main() { string name; cin >> name; cout << name; return 0; }🧠 讲解
cin >> string遇到空格就停只能读一个“单词”
非常重要的规则
🟡 第 7 题:一句话(有空格)
✅ 参考答案
#include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); cout << s; return 0; }🧠 讲解
getline:读整行一直读到回车为止
专门用来处理“有空格的输入”
🟡 第 8 题:先数字,后整行(重点)
✅ 参考答案
#include <iostream> #include <string> using namespace std; int main() { int n; string s; cin >> n; cin.ignore( ); getline(cin, s); cout << n << endl; cout << s << endl; return 0; }🧠 讲解(必须讲清)
cin >> n读完数字后,回车还留在缓冲区getline一来就读到了这个回车cin.ignore():清理缓冲区这是竞赛必会坑
🟡 第 9 题:多行输入
✅ 参考答案
#include <iostream> #include <string> using namespace std; int main() { string s; for (int i = 0; i < 3; i++) { getline(cin, s); cout << s << endl; } return 0; }🧠 讲解
每次
getline读一整行非常常见的输入形式(作文、日志)
🟠 第 10 题:输出浮点数
✅ 参考答案
#include <iostream> using namespace std; int main() { double x; cin >> x; cout << x; return 0; }🧠 讲解
默认输出不是全部小数
C++ 会自动控制精度
🟠 第 11 题:保留 2 位小数
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { double x; cin >> x; cout << fixed << setprecision(2) << x; return 0; }🧠 讲解
fixed:固定小数位setprecision(2):保留 2 位比赛中极其常用
🟠 第 12 题:平均值(3 位小数)
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { double a, b; cin >> a >> b; double avg = (a + b) / 2; cout << fixed << setprecision(3) << avg; return 0; }🧠 讲解
浮点计算要用
double精度控制只影响输出,不影响计算
🟠 第 13 题:精度对比
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { double x; cin >> x; cout << setprecision(3) << x << endl; cout << fixed << setprecision(3) << x << endl; return 0; }🧠 讲解(非常重要)
没有
fixed:有效数字有
fixed:小数位数这是很多 WA 的根源
🔵 第 14 题:宽度控制
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { cout << setw(5) << 42; return 0; }🧠 讲解
setw(5):占 5 个字符默认右对齐
🔵 第 15 题:左对齐
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { cout << left << setw(10) << "Tom"; return 0; }🧠 讲解
left是状态,会一直生效常用于表格输出
🔵 第 16 题:右对齐
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { cout << right << setw(10) << "Tom"; return 0; }🧠 讲解
right是默认状态数字通常右对齐更好看
🔵 第 17 题:成绩表
✅ 参考答案
#include <iostream> #include <iomanip> #include <string> using namespace std; int main() { string name1, name2; double s1, s2; cin >> name1 >> s1; cin >> name2 >> s2; cout << left; cout << setw(10) << "姓名" << setw(10) << "成绩" << endl; cout << setw(10) << name1 << fixed << setprecision(2) << setw(10) << s1 << endl; cout << setw(10) << name2 << fixed << setprecision(2) << setw(10) << s2 << endl; return 0; }🧠 讲解
setw每次只作用于下一个输出精度控制是状态
表格输出是竞赛必备技能
🔴 第 18 题:多组数据
✅ 参考答案
#include <iostream> using namespace std; int main() { int n, x; cin >> n; for (int i = 0; i < n; i++) { cin >> x; cout << x << endl; } return 0; }🧠 讲解
第一行是“控制数量”的输入
OJ 中极其常见
🔴 第 19 题:严格格式
✅ 参考答案
#include <iostream> #include <iomanip> using namespace std; int main() { int x; cin >> x; cout << "Value:" << setw(5) << right << x; return 0; }🧠 讲解
判题系统空格不允许多也不允许少
格式不对 = WA
🔴 第 20 题:终极综合题
✅ 参考答案
#include <iostream> #include <iomanip> #include <string> using namespace std; int main() { string name; int age; double score; getline(cin, name); cin >> age >> score; cout << left << setw(15) << name; cout << right << setw(5) << age; cout << fixed << setprecision(2) << setw(8) << score; return 0; }🧠 讲解(竞赛级)
getline + cin混用对齐 + 宽度 + 精度
这是完整 I/O 能力的体现