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_n 个 int 位置。合法下标是 0 到 max_n - 1,因此当读入 n 个元素时,循环写成 i = 0; i < n。
关键过程与易错点
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:小鱼比可爱 | 题解 | 使用两层循环比较数组中的元素。 |