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

备战大晨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 |
|
输入:
1 | 5 |
输出:
1 | 92 |
说实话这段代码我基本没插手,他自己写的。 唯一一开始写错的地方是 maxNum 的初始值,他写的是 maxNum = 0,我让他想想:如果输入的 5 个数全是负数呢?
大晨愣了一下,马上改成了 maxNum = a[0]。
这个思维习惯比写出正确代码本身更重要——初始化的时候,一定要拿一个实际存在的数据去初始化,别拿一个拍脑袋想出来的 0。
老父亲陪跑感悟
数组这章是大晨信奥路上的一道分水岭。之前顺序、分支、循环,不管怎么折腾,数据量都小,变量两三个就够用。但数组一上来,程序处理的数据量直接上一个数量级,思维方式也从”操作单个数据”变成了”操作一整批数据”。
大晨这周刷了《一本通》上数组部分的 12 道题,正确率大概 8 成左右。主要丢分点还是下标越界和循环边界条件——i < n 还是 i <= n,这俩他有时候还是会搞混。
我跟他说的办法很朴素:每次写循环条件,先在纸上画格子,数一数到底循环几次,别凭感觉。
小结与下篇预告
这周搞定了一维数组的定义、输入输出和基本遍历,最大值问题也过了。下周准备带大晨练数组的进阶操作——反向输出、求数组元素之和、还有那个经典到不行的”数组去重”。去重那题涉及一个标记数组的思路,估计大晨要卡一会儿。
到时候再给大家分享陪跑实录,咱们下篇见!
免责声明:本文仅为本人陪孩子学习信奥的真实记录,不构成任何教学建议。代码示例基于个人理解编写,如有错误欢迎指正。每个孩子的学习节奏不同,仅供参考。


