备战大晨7月 GESP C++ 1级(11):一维数组,从"一个变量"到"一排变量"

上回说到

上篇(第10篇)咱们聊完了循环嵌套,大晨终于搞懂了”九九乘法表”里外两层 for 各自管什么。当时我留了个话头:循环搞定了,下一步就该上数组了。

这不,这周《一本通•编程启蒙C++版》正好翻到数组那一章,大晨第一次见 int a[100] 这种写法,盯了半天问我:”爸,这个中括号是啥意思?里面100是编号吗?”

从”一个变量”到”一排变量”

之前大晨写的程序,存数据就靠单个变量:int a; 存一个整数,int b; 再存一个。要是老师让他读入 5 个同学的成绩然后找最大值,他傻乎乎地写了 5 个变量——a b c d e,然后一堆 if 比较。

我说:”儿子,要是 50 个同学呢?100 个呢?你写到天亮?”

大晨嘿嘿一笑:”那不得写 100 个变量名……想想都累。”

数组就是解决这个问题的——一个名字管一排数据。

我给他打了个比方:变量就像一个停车位,你停一辆车进去就完了。数组呢,是一整排连号停车位,你给这排起个名字叫 a,然后每个位置有个编号——a[0]a[1]a[2]……一直排下去。

大晨立马接话:”哦!就像咱们小区地下车库B区,B-01、B-02、B-03那样?”

这孩子反应是真快,我给他竖了个大拇指。

下标从 0 开始,这是第一个坑

但接下来就翻车了。

我让大晨定义一个能放 5 个整数的数组,他写了 int a[5];,然后往里存数据,直接从 a[1] 开始写,写到 a[5]

我问他:”你的停车场有 5 个车位,编号从几到几?”

大晨脱口而出:”1 到 5 啊。”

这就是几乎所有初学者都会踩的坑——C++ 数组下标从 0 开始。

5 个位置的数组,下标是 0 到 4,不是 1 到 5。a[5] 已经越界了,访问到了不该访问的内存,轻则数据乱七八糟,重则程序直接崩。

大晨有点不服气:”为啥不从 1 开始?0 号车位听着怪别扭的。”

我说:”这就是 C++ 的规矩,没道理可讲,记住就行。你以后写循环遍历数组,for (int i = 0; i < n; i++) 这套模板得刻在脑子里。

实战:读入 N 个数,输出最大值

讲完概念,直接上题。我给大晨出了一道经典题:从键盘读入 n 个整数(n ≤ 100),求其中的最大值。

大晨先自己琢磨了五分钟,在草稿纸上画了画,然后敲出了这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

int main() {
int n;
cin >> n;

int a[100];
for (int i = 0; i < n; i++) {
cin >> a[i];
}

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

cout << maxNum << endl;
return 0;
}

输入:

1
2
5
78 92 65 88 70

输出:

1
92

说实话这段代码我基本没插手,他自己写的。 唯一一开始写错的地方是 maxNum 的初始值,他写的是 maxNum = 0,我让他想想:如果输入的 5 个数全是负数呢?

大晨愣了一下,马上改成了 maxNum = a[0]

这个思维习惯比写出正确代码本身更重要——初始化的时候,一定要拿一个实际存在的数据去初始化,别拿一个拍脑袋想出来的 0。

老父亲陪跑感悟

数组这章是大晨信奥路上的一道分水岭。之前顺序、分支、循环,不管怎么折腾,数据量都小,变量两三个就够用。但数组一上来,程序处理的数据量直接上一个数量级,思维方式也从”操作单个数据”变成了”操作一整批数据”。

大晨这周刷了《一本通》上数组部分的 12 道题,正确率大概 8 成左右。主要丢分点还是下标越界和循环边界条件——i < n 还是 i <= n,这俩他有时候还是会搞混。

我跟他说的办法很朴素:每次写循环条件,先在纸上画格子,数一数到底循环几次,别凭感觉。

小结与下篇预告

这周搞定了一维数组的定义、输入输出和基本遍历,最大值问题也过了。下周准备带大晨练数组的进阶操作——反向输出、求数组元素之和、还有那个经典到不行的”数组去重”。去重那题涉及一个标记数组的思路,估计大晨要卡一会儿。

到时候再给大家分享陪跑实录,咱们下篇见!


免责声明:本文仅为本人陪孩子学习信奥的真实记录,不构成任何教学建议。代码示例基于个人理解编写,如有错误欢迎指正。每个孩子的学习节奏不同,仅供参考。