C++ 竞赛入门

9-数组

数组

本节学会什么

  • 用数组保存一组同类型的数据
  • 用从 0 开始的下标访问元素
  • 配合循环完成数组的读入、处理和输出

为什么需要它

要保存三个人的分数,可以写三个变量;要保存一百个人的分数,变量名很快失去意义。数组把一批同类型、按顺序排列的数据放在一个名字下,再用下标定位每一个位置。

最小可运行示例

读入 n 个分数,输出其中最大的分数:

#include <iostream>

int main() {
    const int max_n = 100;
    int n;
    int score[max_n];
    std::cin >> n;

    for (int i = 0; i < n; i += 1) {
        std::cin >> score[i];
    }

    int maximum = score[0];
    for (int i = 1; i < n; i += 1) {
        if (score[i] > maximum) {
            maximum = score[i];
        }
    }

    std::cout << maximum << '\n';
    return 0;
}

int score[max_n]; 创建了 max_nint 位置。合法下标是 0max_n - 1,因此当读入 n 个元素时,循环写成 i = 0; i < n

数组下标图:下标 0、1、2 到 n 减一分别定位 score 数组的对应元素

关键过程与易错点

  • a[0] 是第一个元素,a[n - 1] 才是第 n 个元素;a[n] 已经越界。
  • 普通数组的容量必须在编译时确定。竞赛中根据题目上界定义常量,例如 const int max_n = 100000 + 5;;额外的 5 是给边界留出的空间,不是让下标越界的许可。
  • int a[5] = {1, 2}; 会得到 1, 2, 0, 0, 0。而没有初始化的局部数组元素不保证是 0,读入前不要使用它们。
  • 数组不能整体用 = 复制。初学阶段,用循环逐个读写元素;之后会学习 vector 等更灵活的容器。

动手检查

定义一个容量为 10 的数组,读入 5 个整数,再按相反顺序输出。检查下标依次访问的是 4, 3, 2, 1, 0,而不是从 5 开始。

把最小示例改成求最小值。再试着同时维护最大值和最小值,输出它们的差。

立即练习

难度 题目 题解 训练目标
基础 洛谷 P1046:陶陶摘苹果 题解 读入固定数量的数据,逐个判断并计数。
巩固 洛谷 P5728:旗鼓相当的对手 题解 用数组保存多项成绩,再比较不同学生。
挑战 洛谷 P1428:小鱼比可爱 题解 使用两层循环比较数组中的元素。