Skip to content

第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 这一行时发生了什么?我们一步步拆开看:

  1. 程序停住不动,屏幕上光标一闪一闪地等你(注意:cin 自己不会显示提示语,想要提示可以先用 cout 打一句"请输入年龄:");
  2. 你敲入 10,按回车;
  3. cin 把 10 这个整数灌进变量 age,程序继续往下运行;
  4. 下一句 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+b

4.1 常用格式符对照表(必背!) ​

格式符对应类型例子输出效果
%dint 整数printf("%d", 10);10
%lldlong long 长整数printf("%lld", 1234567890123LL);1234567890123
%ffloat 单精度小数printf("%f", 3.5f);3.500000
%lfdouble 双精度小数printf("%lf", 3.14);3.140000
%cchar 单个字符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十进制整数intprintf("%d", 42);42
%lld长整数long longprintf("%lld", 123LL);123
%f浮点数(默认 6 位小数)floatprintf("%f", 3.5f);3.500000
%lf双精度浮点数doubleprintf("%lf", 3.14);3.140000
%c单个字符charprintf("%c", 'A');A
%s字符串char 数组printf("%s", "hi");hi
%.nf保留 n 位小数(四舍五入)float/doubleprintf("%.2f", 3.14159);3.14
%md占 m 位宽度,靠右对齐intprintf("%5d", 42); 42
%-md占 m 位宽度,靠左对齐intprintf("%-5d", 42);42
%%输出一个 % 本身—printf("100%%");100%

🔥 一级必考的三个:%d(整数)、%c(字符)、%.2f(保留两位小数)。选择题最爱考:保留小数是四舍五入还是直接截断?答案是四舍五入!


⚠️ 深度辨析:printf 和 scanf 的格式符陷阱 ​

printf 和 scanf 长得像,但格式符的规则有几处关键不同,考试特别爱考:

对比项printfscanf易错点
double 用什么%f 和 %lf 都行必须用 %lfscanf 里 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(判断题) ​

题目: 判断下列说法是否正确(✅对 / ❌错):

  1. 使用 scanf 读取变量时,变量名前通常要加取地址符 &。( )
  2. cin >> a >> b; 输入两个整数时,只能用空格隔开,不能用回车。( )
  3. double 类型的变量用 scanf 读入时,格式符应该用 %lf。( )
  4. cout 每执行一次输出会自动换一行。( )
  5. printf("%.2f", 3.14159); 的输出结果是 3.14。( )
  6. 字符串要用双引号括起来,单个字符用单引号。( )
🔑 点击查看答案与解析

答案: 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 的两个陷阱:

  1. 变量前必须加 &(取地址符),所以 A 和 B 都错;
  2. 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 / coutscanf / printf
写法方便程度⭐⭐⭐⭐⭐ 自动识别类型⭐⭐⭐ 要记格式符
格式化能力一般(要额外加库)⭐⭐⭐⭐⭐ 强大灵活
运行速度较慢(大数据量时明显)快
出错概率低(类型自动匹配)高(格式符写错就崩)
适合场景一般编程题、日常练习需要格式化输出、大数据量

💡 一级考试建议:

  • 如果你刚学,先把 cin/cout 用熟,不容易出错;
  • 学有余力再学 scanf/printf,重点掌握 %d、%lf、& 这三个点;
  • 编程题里两套可以混着用(比如用 cin 读、用 printf 格式化输出),都没问题。

📖 下章预告:第9章是 编程题实战!我们会把前 7 章学到的所有知识——变量、数据类型、分支、循环、运算符、输入输出——全部串起来,用一道一道经典 GESP 一级编程题带你从"会知识点"进化到"会做编程题"。准备好了吗?我们编程题战场上见!

百炼成钢,融会贯通