为什么竞赛选 C++:从 Python 过来的少年要知道的事

信息学奥赛(NOIP/CSP-J/S)官方指定语言是 C++。很多孩子已经学了一年 Python,到竞赛阶段必须切换到 C++。这一步听起来可怕,但其实 C++ 入门只需要两周,真正的难点在算法,不在语法。

选 C++ 的原因有三:第一,运行速度快,竞赛题对时间要求严格,Python 经常超时;第二,内存可控,用数组和指针直接操作内存,没有垃圾回收开销;第三,竞赛生态成熟,官方题库、教练、资料都是基于 C++ 建立的。

C++ 难的不是语法,而是它要求你像计算机一样精确地思考每一行代码。
本文核心知识点
  • 编译器把 .cpp 源文件翻译成可执行程序的工具。
  • 变量int 存整数、double 存小数、char 存字符。
  • 循环for 和 while 是 C++ 的两大循环结构。
  • 数组一排连续的格子,用下标访问,比如 a[0]、a[1]。
青少年 C++ 入门配图:蓝色渐变背景上少年坐在书桌前用笔记本电脑,屏幕上是抽象彩色花括号和代码符号,旁边堆着书和一杯咖啡,漂浮变量方块和循环箭头围着方格阵列
C++ 的世界:从第一行 hello 世界开始,慢慢建立起竞赛解题的语法直觉。

开发环境:Dev-C++ 与 Visual Studio Code 二选一

初学阶段推荐 Dev-C++——一个轻量级的 Windows 编辑器,自带编译器,安装完就能写代码,不需要配置环境变量。竞赛学校机房通常也是这个。

如果孩子已经用 Visual Studio Code 写过 Python,可以继续用 VS Code,装一个 C/C++ 扩展和 MinGW 编译器即可。两者只是编辑器不同,写出来的 .cpp 文件是一模一样的。

工具优点适合阶段
Dev-C++开箱即用、零配置零基础入门
VS Code插件丰富、界面现代有一定编程基础后
在线评测网站提交即判题、即时反馈刷题阶段

装好之后,新建一个 main.cpp 文件,准备写下第一行代码。

第一个程序:hello 世界与输入输出

C++ 的第一个经典程序长这样:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, world!" << endl;
    return 0;
}

逐行解释:第一行引入输入输出库;第二行使用标准命名空间,省略 std:: 前缀;main 函数是程序入口;cout 是输出语句,把"Hello, world!"打印到屏幕;return 0 表示正常结束。

竞赛题需要从键盘读入数字,用 cin:

int a, b;
cin >> a >> b;
cout << a + b << endl;

这段代码读入两个整数,输出它们的和。这就是竞赛里最基础的"A+B"题。

变量与数据类型:整数、浮点数与字符

C++ 是静态类型语言,每个变量必须先声明类型才能用。常用类型有:

int score = 100;         // 整数,范围约 -21 亿到 21 亿
double price = 9.99;     // 浮点数,存小数
char grade = 'A';        // 单个字符
string name = "Tom";     // 字符串

int 是竞赛里最常用的类型,绝大多数题目的数据范围都在 int 之内。如果题目说"数字可能达到 10 的 9 次方以上",就要用 long long 类型。

变量名要起得有意义。不要写 a、b、c,要写 score、price、name。这种习惯在竞赛里看似无关紧要,但代码长了之后,好的变量名能让调试速度翻倍。

条件与循环:用 if 和 for 解决判断问题

条件判断用 if-else:

if (score >= 60) {
    cout << "及格" << endl;
} else {
    cout << "不及格" << endl;
}

循环用 for 最常见:

for (int i = 1; i <= 10; i++) {
    cout << i << endl;
}

这段代码从 1 打印到 10。i 是循环变量,从 1 开始,每次加 1,直到 i 大于 10 停止。这和 Scratch 里的"重复执行 10 次"是同一个结构,只是写法更紧凑。

再写一个综合例子:求 1 到 100 的和:

int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum = sum + i;
}
cout << sum << endl;

这里 sum 初始为 0,循环每次把 i 加进去,最后输出 5050。这种"累加器"模式是竞赛里最高频的写法。

数组入门:把 100 个数字装进一排格子

当题目要求处理 100 个数字时,一个个声明变量不现实。C++ 用数组解决这个问题:

int a[100];  // 声明一个能装 100 个整数的数组

for (int i = 0; i < 100; i++) {
    cin >> a[i];  // 读入第 i 个数字
}

// 求总和
int sum = 0;
for (int i = 0; i < 100; i++) {
    sum += a[i];
}
cout << sum << endl;

数组的下标从 0 开始,不是从 1 开始。a[0] 是第一个元素,a[99] 是第 100 个元素。这个细节新手经常写错,必须一开始就记牢。

数组是竞赛算法题的核心容器。后面学排序、查找、动态规划,都建立在数组之上。孩子要练到能闭着眼睛写出"读入 N 个数存进数组"这段代码。

本节用到的核心结构
  • 声明数组int a[100] 表示 100 个连续格子。
  • 下标访问a[i] 取第 i 个格子里的数。
  • 累加求和sum += a[i] 是最高频写法。
  • 边界意识下标从 0 开始,到 99 结束,不要越界。