Appearance
第8章 输入输出与头文件
🎯 本章学习目标
读完本章,你将能够:
- ✅ 理解头文件的作用,知道
<iostream>和<cstdio>分别提供什么工具 - ✅ 理解
using namespace std;的含义,记住它的写法和位置 - ✅ 熟练使用
cout进行输出,掌握endl和\n两种换行方式 - ✅ 熟练使用
cin进行输入,掌握多变量连续输入的写法 - ✅ 掌握
scanf和printf的基本用法,记住常见格式符(%d、%lld、%f、%lf、%c) - ✅ 特别注意
scanf必须加&(取地址符)这个易错点 - ✅ 知道
cout/cin和scanf/printf两套输入输出的区别和适用场景 - ✅ 理解命名空间的概念,知道为什么可以用
std::cout全限定名 - ✅ 写出完整规范的 C++ 程序框架(头文件 + 命名空间 + main + return 0)
🗺️ 本章知识图谱
第8章 输入输出与头文件
├── 一、头文件
│ ├── #include <iostream> → cin、cout、endl
│ ├── #include <cstdio> → scanf、printf
│ ├── using namespace std;(开箱口令)
│ └── 标准程序骨架
├── 二、cout 输出
│ ├── << 插入运算符(水流向屏幕)
│ ├── 连续拼接输出
│ ├── 换行:endl 和 \n
│ └── 字符单引号、字符串双引号
├── 三、cin 输入
│ ├── >> 提取运算符(数据流进变量)
│ ├── 先声明再输入
│ ├── 连续输入多个变量
│ └── 自动跳过空格和换行
├── 四、scanf/printf
│ ├── 格式符:%d(int) %lld(long long) %lf(double) %c(char)
│ ├── scanf必须加&(取地址符)
│ └── printf格式字符串
└── 五、两套对比与选用
├── cin/cout:方便、自动匹配类型
└── scanf/printf:格式化、速度快📖 引言
前七章里,我们认识了变量、数据类型、分支、循环和运算符,已经能写出不少小程序了。不过你有没有发现:程序里的数据都是我们提前"写死"的——int age = 10;,程序每次运行都只会处理 10,一点都不"机灵"。
今天,我们要让程序完成一次"进化":
- 🗣️ 长出嘴巴:
cout/printf——把结果说给用户听(输出) - 👂 长出耳朵:
cin/scanf——停下来听用户敲键盘(输入) - 🧰 学会借工具箱:
#include——C++ 自带了很多现成的"工具箱"(头文件),借来就能用
有了输入和输出,程序就能和人"对话"了:你敲它算、你问它答。而 scanf 漏写 &、格式符与类型不匹配,是一级编程题最常见的丢分点,今天一定要拿下!
准备好了吗?让程序学会"说话"和"听话",出发!🚀
一、头文件:向编译器"借工具箱"🧰
C++ 把各种好用的工具分门别类装在头文件(header file)里。用工具之前,必须先写 #include 把头文件"借"来——就像做手工前先把工具箱从柜子里搬上桌:
cpp
#include <iostream> // 借来"输入输出流"工具箱:cin、cout 就住在里面
#include <cstdio> // 借来"C风格格式化"工具箱:scanf、printf 住在里面| 头文件 | 借来的工具 | 什么时候必须包含 |
|---|---|---|
#include <iostream> | cin(输入)、cout(输出)、endl | 只要程序里用了 cin / cout |
#include <cstdio> | scanf(格式化输入)、printf(格式化输出) | 只要程序里用了 scanf / printf |
🔥 高频考点:用
cin/cout必须包含<iostream>;用scanf/printf必须包含<cstdio>。 两套工具可以只借一个,也可以两个都借、混着用。忘了借箱子就直接用工具,编译器会一脸懵地报错(常见提示是'cout' was not declared,意思是"我不认识 cout 这个名字")。
1.1 using namespace std;:开箱即用的口令🔑
借来的 iostream 箱子有个"品牌名"叫 std(standard,标准的意思)。如果不开口令,每次用工具都得报全名:
cpp
#include <iostream>
int main() {
std::cout << "你好" << std::endl; // 每次都要写 std:: ,好麻烦
return 0;
}在开头加上一句 using namespace std;(读作"使用 std 命名空间"),就像喊了一声"开箱即用!"——箱子里的工具全部摊在桌上,之后直接写 cout、cin、endl 就行:
cpp
#include <iostream>
using namespace std; // 开箱口令:写一次,全文生效
int main() {
cout << "你好" << endl; // 不用再写 std:: 了
return 0;
}⚠️ 易错点:
using namespace std;末尾有一个分号,漏了分号会编译报错;它和#include一样,都要写在程序最开头(main函数的外面、上面)。
1.2 一级标准程序骨架🦴
把工具箱和口令配齐,一个 C++ 程序的"标准身材"是这样的:
cpp
#include <iostream> // ① 借工具箱
#include <cstdio>
using namespace std; // ② 喊开箱口令
int main() { // ③ 主函数:程序从这里开始运行
// 我们的代码写在这里
return 0; // ④ 程序顺利结束
}📌 小知识:
#include后面的文件名有两种写法——<iostream>用尖括号,表示借"系统自带的工具箱";如果以后借自己写的头文件,会用双引号"..."。一级考试只用尖括号这种。
另外再认识一下骨架里的两位"老朋友":int main() 是主函数,是每个 C++ 程序的"大门",程序运行时永远从 main 大括号里的第一行开始执行;return 0; 写在 main 的最后,表示"程序顺利完工,向系统交差"。这两行是固定搭配,照抄即可,我们的输入输出语句都写在 main 的大括号里面。
二、cout:C++ 的"小喇叭"📢
cout(读作"C-out")是 C++ 的流式输出工具。它的用法特别形象:用 <<(两个小于号)把内容"推送"到屏幕上,箭头指向哪,数据就流向哪——cout 在左边代表屏幕,数据像水流一样 流进屏幕:
cpp
cout << "你好,世界!" << endl; // 输出文本,文本必须放在双引号里
cout << 123 << endl; // 输出数字,数字不用引号
cout << 3 + 5 << endl; // 输出 8:可以直接写算式,先算结果再输出2.1 连续 <<:想串几样就串几样
cout 最爽的地方是可以连续拼接:一个 << 接一个 <<,文字、数字、变量全串在一起输出:
cpp
int age = 10;
cout << "年龄是" << age << endl; // 年龄是10
cout << "我有" << 3 << "个苹果" << endl; // 我有3个苹果
int a = 3, b = 5;
cout << a << " + " << b << " = " << a + b << endl;
// 输出:3 + 5 = 8记忆画面:<< 就像一节节水管接头,把每样东西依次接到屏幕上,少接一个接头(漏写 <<),水就漏了——编译报错。
还有一个新手常问的问题:cout 输出文字和变量时,中间会不会自动加空格?答案是不会!cout 很"实在",你给它什么它就紧挨着输出什么:
cpp
int age = 10;
cout << "年龄是" << age << "岁" << endl; // 年龄是10岁(紧贴在一起)
cout << age << 3 << endl; // 103(两个数字直接首尾相接!)所以想让输出好看、有间隔,空格要自己写在字符串里,比如 cout << "a = " << a << endl;。
2.2 换行:endl 和 "\n"
cout 输出完不会自动换行,想换行有两种办法:
| 写法 | 含义 | 小区别 |
|---|---|---|
cout << endl; | 输出换行并"刷新"屏幕 | 最常用,考试推荐 |
cout << "\n"; | 输出一个换行符 | 写在字符串里更方便,如 "第一行\n第二行" |
cpp
cout << "第一行" << endl;
cout << "第二行" << "\n";
cout << "第三行\n第四行" << endl;
// 输出四行:第一行 / 第二行 / 第三行 / 第四行🔥 高频考点:
cout不像有些语言那样"一句一行",不写endl或\n,后面的内容会紧跟在同一行。程序阅读题里常靠这一点挖坑!
2.3 字符和字符串:引号不能乱配对
- 字符串(一段文字)用双引号:
"你好"、"abc" - 单个字符(char 类型)用单引号:
'A'、'9'、'+'
cpp
cout << "你好" << endl; // ✅ 字符串用双引号
cout << 'A' << endl; // ✅ 单个字符用单引号
// cout << '你好' << endl; // ❌ 错误!单引号里只能放一个字符⚠️ 易错点:所有引号、分号、括号都必须是英文半角符号。不小心切成中文输入法敲了
“你好”或;,编译器会直接报错。
三、cin:C++ 的"小耳朵"👂
cin(读作"C-in")是流式输入工具:程序运行到它会停下来等你敲键盘,敲完按回车,数据就通过 >> 流进变量里。注意箭头方向和 cout 正好相反——数据从键盘流进变量:
cpp
int age; // ① 先声明变量(告诉编译器:我要一个装整数的盒子)
cin >> age; // ② 再把敲进来的数据存进 age
cout << "你明年" << age + 1 << "岁" << endl;程序运行到 cin 这一行时发生了什么?我们一步步拆开看:
- 程序停住不动,屏幕上光标一闪一闪地等你(注意:
cin自己不会显示提示语,想要提示可以先用cout打一句"请输入年龄:"); - 你敲入
10,按回车; cin把10这个整数灌进变量age,程序继续往下运行;- 下一句
cout就把计算结果显示出来。
想要友好提示,可以"先输出、再输入"搭配着用:
cpp
int age;
cout << "请输入你的年龄:";
cin >> age;
cout << "你明年" << age + 1 << "岁" << endl;3.1 铁规矩:变量必须先声明、再输入!
cin 只是"搬运工",它不负责造盒子。用 cin 之前,变量必须已经声明好类型;而且 cin 很聪明,会按变量的类型自动匹配数据:
cpp
int a; // 整数盒子
double b; // 小数盒子
char c; // 字符盒子
cin >> a; // 敲 10 → a 里是整数 10
cin >> b; // 敲 3.14 → b 里是小数 3.14
cin >> c; // 敲 X → c 里是字符 'X'3.2 连续输入:cin >> a >> b;
一条 cin 可以连续读多个变量,输入时数据之间用空格或回车隔开都行,cin 会自动跳过这些"空白":
cpp
int a, b;
cin >> a >> b; // 一条语句读两个整数
cout << a + b << endl;运行时下面两种敲法效果完全一样:
3 5↵3↵
5↵🔥 高频考点:
cin >> a >> b;要求输入的两个数用空格或回车分隔;cin会自动跳过空格、回车、Tab,所以不用担心多敲了空格。读char字符时也会跳过空白,直接取第一个非空格字符。
⚠️ 易错点:箭头方向别记反!
- 输出:
cout << x;(数据流向屏幕,箭头朝cout)- 输入:
cin >> x;(数据流向变量,箭头朝变量)写成
cout >> x;或cin << x;都会编译报错。小口诀:"出用小于进大于"——输出<<、输入>>。
四、printf:格式化输出的"老管家"🎩
cout 像水管,接起来就用;printf 则像一位严谨的老管家,来自 C 语言,是考试里的常客。它的格式是:
cpp
printf("格式串", 变量1, 变量2, ...);格式串里,普通文字原样输出;遇到 % 开头的格式符,就"挖个坑",由后面的变量按顺序"填坑":
cpp
int age = 10;
printf("我今年%d岁\n", age); // 我今年10岁
int a = 3, b = 5;
printf("%d + %d = %d\n", a, b, a + b); // 3 + 5 = 8
// 坑1 坑2 坑3 ← 按顺序对应 a、b、a+b4.1 常用格式符对照表(必背!)
| 格式符 | 对应类型 | 例子 | 输出效果 |
|---|---|---|---|
%d | int 整数 | printf("%d", 10); | 10 |
%lld | long long 长整数 | printf("%lld", 1234567890123LL); | 1234567890123 |
%f | float 单精度小数 | printf("%f", 3.5f); | 3.500000 |
%lf | double 双精度小数 | printf("%lf", 3.14); | 3.140000 |
%c | char 单个字符 | printf("%c", 'A'); | A |
%s | 字符串(char 数组) | printf("%s", "你好"); | 你好 |
填坑时要遵守"一个坑对一个变量,坑和变量按排队顺序一一对应"的规则:格式串里有几个 %,后面就要给几个变量,类型还要按相同顺序配对。坑多变量少、或者顺序错位,都可能输出奇怪的结果。
🔥 高频考点:格式符必须和变量类型严格配对!
int→%d;long long→%lld(两个 l,记成"long long 俩兄弟 l+l")float→%f;double→%lf- 配错了不会报错提醒你,而是输出一串莫名其妙的数字——程序阅读题和编程题都爱在这挖坑!
📌 小补充:
printf输出double时写%f也能出结果(小数会自动"升级"处理),但考纲标准记法是double配%lf,与scanf保持一致最省心。
📋 考点深挖:printf 格式符完整速查表(一级够用版)
把一级考试中可能出现的格式符全部整理在这里,建议打印出来贴在桌边:
| 格式符 | 含义 | 对应类型 | 示例 | 输出 |
|---|---|---|---|---|
%d | 十进制整数 | int | printf("%d", 42); | 42 |
%lld | 长整数 | long long | printf("%lld", 123LL); | 123 |
%f | 浮点数(默认 6 位小数) | float | printf("%f", 3.5f); | 3.500000 |
%lf | 双精度浮点数 | double | printf("%lf", 3.14); | 3.140000 |
%c | 单个字符 | char | printf("%c", 'A'); | A |
%s | 字符串 | char 数组 | printf("%s", "hi"); | hi |
%.nf | 保留 n 位小数(四舍五入) | float/double | printf("%.2f", 3.14159); | 3.14 |
%md | 占 m 位宽度,靠右对齐 | int | printf("%5d", 42); | 42 |
%-md | 占 m 位宽度,靠左对齐 | int | printf("%-5d", 42); | 42 |
%% | 输出一个 % 本身 | — | printf("100%%"); | 100% |
🔥 一级必考的三个:
%d(整数)、%c(字符)、%.2f(保留两位小数)。选择题最爱考:保留小数是四舍五入还是直接截断?答案是四舍五入!
⚠️ 深度辨析:printf 和 scanf 的格式符陷阱
printf 和 scanf 长得像,但格式符的规则有几处关键不同,考试特别爱考:
| 对比项 | printf | scanf | 易错点 |
|---|---|---|---|
| double 用什么 | %f 和 %lf 都行 | 必须用 %lf | scanf 里 double 用 %f 会出大问题! |
| 变量前加 & 吗 | 不加 | 必须加 | scanf 漏 & 是最高频编程错误 |
%f 对应 | float / double(都行) | 只能 float | 别搞混 |
宽度格式 %5d | 支持(输出宽度) | 支持(读入宽度,了解) | 一级主要考 printf 的宽度 |
🏆 记忆口诀:scanf 是个"麻烦鬼"——double 用 lf,变量要加 &,两条铁律记牢!
而 printf 比较"随和"——double 用 f 或 lf 都行,变量也不用加 &。
一句话:scanf 严格,printf 宽松。考试时遇到 scanf,多留个心眼!
4.2 换行与特殊格式
printf 不会自动换行,换行要在格式串里写 \n:
cpp
printf("第一行\n");
printf("第二行\n");两个考试常考的"花式格式":
cpp
// ① %.2f:保留两位小数(会四舍五入)
double pi = 3.14159;
printf("%.2f\n", pi); // 3.14
printf("%.3f\n", pi); // 3.142
// ② %5d:占 5 个字符的宽度,数字靠右、左边补空格
printf("%5d|\n", 42); // " 42|"(42 前面有 3 个空格)
printf("%-5d|\n", 42); // "42 |"(加个减号表示靠左,了解即可)| 格式 | 作用 | 示例输出 |
|---|---|---|
%.2f | 保留 2 位小数 | 3.14 |
%.0f | 不保留小数 | 3 |
%5d | 宽度 5,右对齐补空格 | ···42(·表示空格) |
\n | 换行 | 光标跳到下一行开头 |
🔥 求圆面积、求平均分这类题目,题目经常要求"保留两位小数",标准答案就是
printf("%.2f\n", 面积);——用cout反而不好控制小数位数,这也是考试爱用printf的原因。
五、scanf:格式化输入,千万别漏 & 🚨
scanf 与 printf 是一对"老搭档",格式串里的格式符和 printf 完全对应:
cpp
int a;
scanf("%d", &a); // 读一个整数,存进 a看出区别了吗?——变量前面多了一个 &!
5.1 天字号陷阱:变量前必须加 &
& 叫取地址符,可以理解成"住址"。scanf 的工作方式很特别:它不是把数据"递给"变量,而是要你告诉它变量家住哪里(内存地址),它好把数据"送货上门"。&a 就是"变量 a 的家":
cpp
int a;
scanf("%d", &a); // ✅ 正确:告诉 scanf a 的住址
// scanf("%d", a); // ❌ 错误!没给住址,货送不到——程序可能崩溃或读到乱码🔥 高频考点(编程题头号丢分点):
scanf的每个普通变量前面都必须加&! 这是初学者最容易漏、漏了最难自查的错误:编译可能不报错,但程序一运行就"闪退"或得到奇怪结果。写完scanf立刻回头检查每个变量前的&,养成肌肉记忆!
5.2 连续读入与格式符配对
cpp
int a, b;
scanf("%d %d", &a, &b); // 一次读两个整数,输入时用空格或回车隔开
double r;
scanf("%lf", &r); // 读 double 必须用 %lf,且 &r 不能忘
long long n;
scanf("%lld", &n); // 读 long long 用 %lld
char ch;
scanf("%c", &ch); // 读字符用 %c,也要 &格式符与类型的配对和 printf 同一张表,但有一处要格外留神:
| 变量类型 | printf 用 | scanf 用 |
|---|---|---|
int | %d | %d |
long long | %lld | %lld |
float | %f | %f |
double | %lf(%f 亦可) | 必须 %lf 🚨 |
char | %c | %c |
⚠️ 易错点:
- 用
scanf("%f", &x);读double变量是经典错误,读进来的小数会变成乱码——double必须%lf;- 唯一的例外:读字符串用的
char数组(如char name[20]; scanf("%s", name);),数组名本身就代表住址,前面不加&。一级考试对字符串要求不高,先混个脸熟即可。
六、输入 → 处理 → 输出:完整程序实战
学完四件武器,我们来走通编程题的标准流水线:读入数据 → 计算处理 → 输出结果。
这三步几乎就是每一道一级编程题的"通用骨架":先用 cin / scanf 把题目给的数据读进变量,再用前几章学的运算符算出答案,最后用 cout / printf 把结果打印出来。读题时可以先在草稿纸上圈出"输入什么、输出什么、中间怎么算"这三件事,骨架就立起来了。
例题 1:读入两个整数,输出它们的和(编程题经典原型)
写法一:cin / cout 流式版
cpp
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b; // 输入:3 5
cout << a + b << endl; // 输出:8
return 0;
}写法二:scanf / printf 格式化版
cpp
#include <cstdio>
int main() {
int a, b;
scanf("%d %d", &a, &b); // 别忘了两个 &!
printf("%d\n", a + b);
return 0;
}得分点解析: ① 变量先声明后输入;② scanf 版的两个 & 是命门;③ 两套写法考试都认可,选你最顺手的一套写熟。
例题 2:读入圆的半径,输出圆的面积(保留两位小数)
cpp
#include <cstdio>
int main() {
double r;
scanf("%lf", &r); // double 输入用 %lf
double area = 3.14159 * r * r; // 处理:面积公式 πr²
printf("%.2f\n", area); // 输出保留两位小数
return 0;
}
// 输入:2
// 输出:12.57解析: 半径可能是小数,用 double;"保留两位小数"用 printf("%.2f", ...) 最方便。这道题把 %lf 输入 + %.2f 输出两个高频考点一次考完。
例题 3:读入长方形的长和宽,输出周长和面积
cpp
#include <iostream>
using namespace std;
int main() {
int length, width;
cin >> length >> width; // 输入:5 3
cout << "周长:" << 2 * (length + width) << endl; // 周长:16
cout << "面积:" << length * width << endl; // 面积:15
return 0;
}例题 4:读入三个成绩,输出平均分(保留两位小数)
cpp
#include <cstdio>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c); // 输入:85 90 96
double avg = (a + b + c) / 3.0; // 注意:除以 3.0 才能得到小数!
printf("平均分:%.2f\n", avg); // 平均分:90.33
return 0;
}解析: ① 三个变量都要带 &;② 整数除以整数 (a+b+c)/3 会丢掉小数部分,想得到小数结果,要让除数变成小数 3.0(这是第5、7章学过的"整数除法"陷阱);③ %.2f 负责把平均分四舍五入到两位小数。
两套体系怎么选?🤔
| 对比项 | cin / cout(流式) | scanf / printf(格式化) |
|---|---|---|
| 头文件 | <iostream> | <cstdio> |
| 写法 | cout << a << b; 水管拼接 | printf("%d%d", a, b); 挖坑填坑 |
| 类型匹配 | 自动识别变量类型,省心 | 格式符手写,必须和类型配对 |
输入要写 & | 不用 | 必须写 |
| 控制小数位/宽度 | 比较麻烦 | %.2f、%5d 很方便 |
| 考试建议 | 简单题用它,简洁不易错 | 需要保留小数、按格式输出时用它 |
📌 考场上两套都"合法"。建议:日常练习两套都认识,答题时选一套写熟;题目明确要求"保留几位小数""按宽度对齐"时,优先请出
printf这位老管家。
七、易错点红黑榜🚨
| ❌ 错误写法 | ✅ 正确写法 | 后果 |
|---|---|---|
用 cin/cout 不写 #include <iostream> | 开头补上 #include <iostream> | 编译报错:不认识 cin/cout |
用 scanf/printf 不写 #include <cstdio> | 开头补上 #include <cstdio> | 编译报错 |
scanf("%d", a); 漏 & | scanf("%d", &a); | 运行崩溃/读到乱码 |
double x; scanf("%f", &x); | scanf("%lf", &x); | 小数变乱码 |
long long n; 配 %d | 配 %lld | 大数输出错误 |
cout >> x; / cin << x; | cout << x; / cin >> x; | 编译报错 |
cout << "年龄是" age; 漏 << | cout << "年龄是" << age; | 编译报错 |
'你好' 单引号包多个字符 | "你好" 双引号 | 编译报错 |
cout 输出后忘了换行 | 加 endl 或 \n | 两行挤成一行 |
中文引号/中文分号 “”; | 全部用英文半角 ""; | 编译报错 |
八、📝 实战练习
练习题 1(单选题)
题目: 程序中使用了 cin 和 cout,程序开头必须包含的头文件是( )
A. #include <cstdio> B. #include <iostream> C. #include <cmath> D. #include <string>
🔑 点击查看答案与解析
答案: B
解析: cin / cout 住在 <iostream> 工具箱里;<cstdio> 是 scanf / printf 的家;用哪个工具就借哪个箱子。
练习题 2(单选题)
题目: 已知 long long n = 1234567890123;,想正确输出 n 的值,printf 的格式符应选用( )
A. %d B. %f C. %lld D. %lf
🔑 点击查看答案与解析
答案: C
解析: long long 是长整数,配 %lld(两个 l)。%d 装不下这么大的数,会输出错误结果;%f、%lf 是小数专用。
练习题 3(单选题)
题目: 下列语句中,语法正确的是( )
A. cout >> x; B. cin << x; C. cout << x << endl; D. printf("%d", x)
🔑 点击查看答案与解析
答案: C
解析: 输出用 <<、输入用 >>,A、B 方向写反;D 末尾漏了分号。口诀:"出用小于进大于"。
练习题 4(判断题)
题目: 判断下列说法是否正确(✅对 / ❌错):
- 使用
scanf读取变量时,变量名前通常要加取地址符&。( ) cin >> a >> b;输入两个整数时,只能用空格隔开,不能用回车。( )double类型的变量用scanf读入时,格式符应该用%lf。( )cout每执行一次输出会自动换一行。( )printf("%.2f", 3.14159);的输出结果是3.14。( )- 字符串要用双引号括起来,单个字符用单引号。( )
🔑 点击查看答案与解析
答案: 1.✅ 2.❌(空格和回车都可以) 3.✅ 4.❌(不会自动换行,要写 endl 或 \n) 5.✅ 6.✅
练习题 5(编程题)
题目: 输入两个整数 a 和 b,输出它们的和。
🔑 点击查看答案与解析
参考代码:
cpp
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}练习题 6(编程题)
题目: 输入长方形的长和宽(均为整数),输出它的面积。
🔑 点击查看答案与解析
参考代码:
cpp
#include <cstdio>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a * b);
return 0;
}解析要点: ① scanf 两个变量都带 &;② 整数相乘结果仍是整数,用 %d 输出。如果题目改成小数边长,记得整体换成 double + %lf。
练习题 7(单选题)
题目: 有语句 double x = 3.14159;,要输出 3.14,以下写法正确的是( )
A. printf("%d", x);
B. printf("%.2f", x);
C. printf("%c", x);
D. printf("%s", x);
🔑 点击查看答案与解析
答案: B
解析:
- A 错:
%d是整数格式符,不能输出小数; - B 对:
%.2f表示保留两位小数,3.14159 四舍五入后是 3.14 ✅; - C 错:
%c是单个字符; - D 错:
%s是字符串。
💡 记忆:d=int(整数)、f=float(小数)、c=char(字符)、s=string(字符串)。
练习题 8(单选题)
题目: 有定义 double r;,要用 scanf 读入 r 的值,写法正确的是( )
A. scanf("%f", r);
B. scanf("%lf", r);
C. scanf("%f", &r);
D. scanf("%lf", &r);
🔑 点击查看答案与解析
答案: D
解析: 这道题考了 scanf 的两个陷阱:
- 变量前必须加
&(取地址符),所以 A 和 B 都错; double类型在 scanf 中必须用%lf(不能用%f),所以 C 错。
只有 D 同时满足这两个条件:%lf + &r。
🏆 口诀:scanf 有两宝,& 和 lf 不能少!(针对 double 类型)
练习题 9(判断题)
题目: printf("%.2f", 3.145); 的输出结果是 3.14。( )
🔑 点击查看答案与解析
答案: ❌ 错误
解析: %.2f 保留两位小数时会四舍五入。3.145 的第三位小数是 5,要向前一位进 1,所以结果是 3.15,不是 3.14。
⚠️ 这是经典判断题坑点——很多同学以为是"直接砍掉后面的",实际是四舍五入!
练习题 10(程序阅读题)
题目: 阅读以下程序,写出运行结果。
cpp
#include <cstdio>
int main()
{
int a = 10, b = 3;
printf("%d+%d=%d\n", a, b, a + b);
printf("%d/%d=%d\n", a, b, a / b);
printf("%%\n");
return 0;
}🔑 点击查看答案与解析
输出:
10+3=13
10/3=3
%解析:
- 第一行:
a+b = 10+3 = 13 - 第二行:整数除法
10/3 = 3(直接丢掉小数部分,不是四舍五入) - 第三行:
%%输出一个百分号%本身(因为单个%被当成格式符了)
九、📊 考点总结表
| 考点 | 重要程度 | 出题形式 |
|---|---|---|
#include <iostream> / <cstdio> 与工具的对应关系 | ⭐⭐⭐⭐ | 选择/判断 |
using namespace std; 的作用与位置 | ⭐⭐⭐ | 选择/判断 |
cout << 连续拼接输出 | ⭐⭐⭐⭐ | 程序阅读/编程 |
endl 与 \n 换行、cout 不自动换行 | ⭐⭐⭐⭐ | 选择/程序阅读 |
cin >> 连续输入、空格/回车分隔 | ⭐⭐⭐⭐ | 选择/编程 |
变量先声明类型再 cin 输入 | ⭐⭐⭐⭐ | 编程 |
scanf 变量前必须加 & | ⭐⭐⭐⭐⭐ | 编程(必考) |
格式符与类型配对:%d/%lld/%f/%lf/%c/%s | ⭐⭐⭐⭐⭐ | 选择/判断/编程 |
scanf 读 double 必须 %lf | ⭐⭐⭐⭐⭐ | 编程/程序阅读 |
%.2f 保留两位小数、%5d 宽度 | ⭐⭐⭐⭐ | 选择/编程 |
<< 与 >> 方向(出用小于进大于) | ⭐⭐⭐⭐ | 选择/判断 |
| 字符串双引号、字符单引号;英文半角符号 | ⭐⭐⭐ | 判断/程序改错 |
| "输入→处理→输出"完整程序结构 | ⭐⭐⭐⭐⭐ | 编程大题 |
┌──────────────────────────────────────────────────────────────┐
│ ⭐ 输入输出与头文件必背速记卡 │
├──────────────────────────────────────────────────────────────┤
│ 1. cin/cout 要借 <iostream>;scanf/printf 要借 <cstdio> │
│ 2. using namespace std; 是"开箱口令",末尾分号别漏 │
│ 3. #include 和口令都写在程序最开头、main 的外面 │
│ 4. cout 用 << 把数据"推"上屏幕,可连续拼接 │
│ 5. cout 不自动换行:换行用 endl 或 "\n" │
│ 6. cin 用 >> 把数据"灌"进变量;变量必须先声明类型 │
│ 7. cin >> a >> b; 输入用空格或回车隔开都行 │
│ 8. 方向口诀:出用小于(<<)进大于(>>),写反必报错 │
│ 9. printf("格式串", 变量); %挖坑、变量填坑,按顺序对应 │
│ 10. int→%d long long→%lld float→%f double→%lf │
│ 11. char→%c 字符串→%s;字符串双引号、字符单引号 │
│ 12. scanf 读 double 必须 %lf;printf 保留小数用 %.2f │
│ 13. %5d 占宽度右对齐;\n 换行 │
│ 14. ★scanf 的普通变量前必须加 &(取地址符)!一号陷阱★ │
│ 15. char 数组读 %s 时数组名前不加 &(了解即可) │
│ 16. 编程题流水线:读入 → 处理 → 输出,写完检查 & 和格式符 │
└──────────────────────────────────────────────────────────────┘🧩 拓展:为什么 scanf 必须加 &?
很多同学问:"cin 不用加 &,为什么 scanf 非要加 &?"
答案藏在两种工具的工作原理里:
cin 是 C++ 的"流式"输入,它是"智能"的——你把变量名给它,它知道要把数据放到那个变量的盒子里。它背后用了 C++ 的"引用"特性(二级会学到),所以不用你手动传地址。
scanf 是从 C 语言继承来的"老式"工具,它比较"笨"——你得直接告诉它数据放到内存的哪个位置(门牌号)。
&就是"取地址符",&a的意思是"把 a 的地址给你,数据直接放到那个地址去"。
打个比方 📮:
- cin 像快递柜——你说"放到张三的柜子里",它自己去找柜子;
- scanf 像平邮——你得告诉它具体的门牌号"XX小区XX号楼XX室",它才知道往哪送。
&就是那个门牌号。
📌 一级要求:记住结论就行——
scanf普通变量前必须加&,漏了会导致运行时错误(程序可能崩溃、也可能输出奇怪的数)。至于背后的"指针"和"引用"原理,二级、三级再深入学习。
💡 选用建议:cin/cout 还是 scanf/printf?
| 对比项 | cin / cout | scanf / printf |
|---|---|---|
| 写法方便程度 | ⭐⭐⭐⭐⭐ 自动识别类型 | ⭐⭐⭐ 要记格式符 |
| 格式化能力 | 一般(要额外加库) | ⭐⭐⭐⭐⭐ 强大灵活 |
| 运行速度 | 较慢(大数据量时明显) | 快 |
| 出错概率 | 低(类型自动匹配) | 高(格式符写错就崩) |
| 适合场景 | 一般编程题、日常练习 | 需要格式化输出、大数据量 |
💡 一级考试建议:
- 如果你刚学,先把 cin/cout 用熟,不容易出错;
- 学有余力再学 scanf/printf,重点掌握
%d、%lf、&这三个点;- 编程题里两套可以混着用(比如用 cin 读、用 printf 格式化输出),都没问题。
📖 下章预告:第9章是 编程题实战!我们会把前 7 章学到的所有知识——变量、数据类型、分支、循环、运算符、输入输出——全部串起来,用一道一道经典 GESP 一级编程题带你从"会知识点"进化到"会做编程题"。准备好了吗?我们编程题战场上见!
