cpp-basics.md
C++ 入门试读:从 Hello World 到用 cin/cout 和程序对话
本课目录(点击跳转)
↑ 目录第 1 节 为什么信息学竞赛用 C++
NOIP、CSP 等官方竞赛支持的编程语言主要是 C++。它运行速度快、贴近底层,同时有着丰富的标准库,是竞赛选手的不二选择。
本教程假设你完全零基础,我们从最小的程序开始。学完这一课,你就能写出"读入两个数、算出结果"的完整程序。
要不要先学 Python 再转 C++?我的建议:目标是竞赛就直接学 C++。Scratch 阶段积累的"顺序、循环、条件"概念已经够用,语法本身不难,难的是做题思路。
↑ 目录第 2 节 第一个程序:Hello World
打开开发环境(推荐 Dev-C++ 或 VS Code),新建一个文件,输入下面的代码:
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
编译并运行,屏幕上会输出:
Hello, World!
逐行看这段代码在做什么:
- #include <iostream>:引入输入输出库,这样我们才能使用 cin 和 cout。
- using namespace std;:声明使用标准命名空间,省去写 std:: 前缀。
- int main():程序入口,程序从这里开始执行,每个程序有且只有一个 main 函数。
- cout << "Hello, World!" << endl;:向屏幕输出内容,<< 是"流向",endl 表示换行。
- return 0;:告诉系统程序正常结束。
C++ 严格区分大小写,Main 和 main 是两个不同的名字。每条语句末尾都要有分号 ;,漏写分号时编译器常常在下一行报错,看到报错先往上看一行。
↑ 目录第 3 节 输入输出:与程序对话
光会输出还不够,程序常常需要读入数据。我们用 cin 读入,用 cout 输出。
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << "a + b = " << a + b << endl;
return 0;
}
运行后在屏幕上输入两个数再回车,程序会立刻给出答案:
输入:3 5
输出:a + b = 8
注意两个细节:
- cin >> a 会跳过输入中的空格和换行,自动读入下一个数据,所以一行写 3 5 或两行写都行。
- 字符串要写在双引号里,多个输出内容用 << 连接。cout << "a + b = " << a + b 会先输出文字,再输出算好的数。
cin >> a >> b 等价于先 cin >> a 再 cin >> b。连续读入多个数据是竞赛题最常见的输入格式,一定要熟练。
↑ 目录第 4 节 数据类型与运算符
程序要处理各种数据,C++ 最常用的类型如下:
int a = 100; // 整数,范围约 ±21 亿
long long b = 1e18; // 更大的整数,做加法乘法时常用
double c = 3.14; // 小数
char d = 'A'; // 单个字符,用单引号
bool e = true; // 布尔值:true / false
特别注意整数的除法行为和取余运算。下面这个程序演示最容易错的地方:
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 2;
double c = 1.0 * a / b; // 乘 1.0 让除法变成小数除法
cout << a << "/" << b << "=" << c << endl;
cout << a << "%" << b << "=" << a % b << endl;
long long big = 10000000000LL;
cout << "big = " << big << endl;
return 0;
}
5/2=2.5
5%2=1
big = 10000000000
- a / b(两个整数相除)结果是整数 2,小数部分直接被舍去,所以想得到 2.5 要先让一边变成小数,例如 1.0 * a / b。
- a % b 是取余数,5 % 2 = 1。"整除判断"(n % x == 0)和"拆数字"都靠它。
- 10000000000 有 11 位,超过 int 上限,要存进 long long,末尾加 LL 表示这是 long long 类型的字面量。
做竞赛题先估算结果会不会超过约 21 亿(2,147,483,647)。会的话就用 long long,否则答案错误(WA)。另外 int a = 3.99 不会四舍五入,而是直接截断成 3。
↑ 目录第 5 节 常见编译错误
初学者最常见的三种报错,认识了就不怕:
- 缺分号:报错 expected ';'。编译器指出的是出错那一行(或下一行),补上分号即可。
- 大小写写错:把 main 写成 Main,或 cout 写成 Cout,报 not declared。
- 中文符号:全角分号 ; 或中文引号 “ ” 混进代码,编译器无法识别。写代码时输入法务必保持英文状态。
看到报错不要慌,报错信息里通常带行号(如 hello.cpp:5)。先跳去那一行检查,比反复重写更高效。
↑ 目录第 6 节 动手练习
基础练习:
- 输入两个整数,输出它们的乘积。
- 输入一个小数,输出它的两倍(保留 2 位小数)。
- 输出一个三行的小诗,每行换行正确即可。
挑战练习:
- 输入一个三位数(如 358),用 / 和 % 拆出百位、十位、个位,输出三个数的和。提示:个位是 n % 10,十位是 n / 10 % 10,百位是 n / 100。
- 输入两个整数 a、b,判断 a 是否能被 b 整除,输出 yes 或 no。提示:能用 a % b == 0 判断。
建议先在纸上写出思路,再敲代码。练手平台:洛谷(从 P1000 入门题开始)、AcWing、Codeforces。把每道通过的题当成"里程碑",成就感是坚持的燃料。
