备战大晨7月 GESP C++ 1级(14):一维数组初体验

备战大晨7月 GESP C++ 1级(14):一维数组初体验
强仔上篇结尾我说”循环搞定了,接下来要进入一个新的阶段”,大晨问是什么,我卖了个关子。今天揭晓——一维数组。
说实话,这是大晨学C++以来我觉得最关键的一个转折点。之前所有的变量都是”一个名字装一个值”,到了数组,思路彻底变了:一个名字,装一串值。
为什么要学数组
我先给大晨举了个例子:
“你班上40个同学,期末考试要存40个成绩,你打算怎么办?”
大晨脱口而出:”那就 int a1, a2, a3… 一直写到a40呗。”
这回答太典型了,每个初学者都会这么说。
我说你写写看,写到第15个你就烦了。而且更要命的在后面——如果老师突然说”把所有成绩加起来求平均”,你得写 a1+a2+a3+…+a40,你崩溃不?
大晨愣了一下:”那循环也没法用啊,变量名都不一样。”
对,这就是数组要解决的问题。 一个名字管一整排数据,用下标(编号)去访问每一个,循环就能批量处理了。
数组怎么声明
最基础的写法:
1 | int a[100]; |
我跟大晨解释:a 是数组名,100 是”最多能装多少个”。注意,下标从 0 开始,不是从 1 开始。 这是无数初学者踩的坑,大晨也没能幸免。
a[0] 是第一个,a[99] 是最后一个,a[100] 是越界的,不能访问。
大晨第一反应:”为什么从0开始?从1不好记吗?”
我说这个问题我当年也问过老师,老师说”计算机就是这么设计的,内存地址从0开始算”。记住就好,别纠结为什么,coding里很多事就是这样。
来个完整例子
我让大晨写一个:输入n个整数,存到数组里,然后求它们的和。
1 |
|
大晨写的过程里犯了两个错:
第一个错:循环条件写成 i <= n。 我说你想清楚,n 个数,下标 0 到 n-1,你写 i <= n,最后一次访问 a[n],越界了。大晨改过来了,但嘴里嘟囔”从0开始真别扭”。
第二个错:第二个循环又重新写了个 cin >> a[i]。 他把输入和求和混一块了。我说你第一个循环已经把数据存好了,第二趟直接读数组就行,不用再输入。大晨恍然大悟。
这些错误特别真实,我估计每个孩子第一次写数组都会踩这两个坑。
数组初始化的几种方式
我顺便给他补充了几种写法:
1 | int a[5] = {10, 20, 30, 40, 50}; // 全部赋值 |
大晨看到第二种挺惊讶:”没写的就自动变0?那挺方便。” 我说对,但只在定义的时候才有这个待遇,后面单独赋值就不行了。
老父亲陪跑感悟
今天这节课,我发现数组最难的不是语法,而是思维方式的转变。之前一个变量对应一个值,现在一个数组对应一排值,还要用下标去定位——这对四年级的孩子来说,抽象程度上了一个台阶。
大晨目前的状态是:语法能记住,但”为什么这么用”还差一口气。我的经验是,这口气得靠刷题来补,光讲没用。
《一本通》上数组这章题目不少,我打算让大晨先做5-6道简单题,把”输入→存数组→遍历处理→输出”这个套路练熟,再往后走。
数组是信奥的分水岭,之前是入门,之后才算真正开始。 不急,慢慢来。
下篇预告:数组练了几个基础题,大晨碰到一道”求最大值”的题卡住了。怎么从一堆数里找最大的那个?思路其实特别简单,但大晨第一次就是想不到。 下篇聊聊数组遍历中的经典操作。
免责声明:本文仅为本人陪孩子学习信奥的个人记录,不构成任何教学建议。每个孩子学习节奏不同,参考即可,切勿照搬。代码示例基于 GESP C++ 一级考纲范围,如有错误欢迎留言指出。


