备战大晨7月 GESP C++ 1级(17):一维数组求最大值,大晨第一次跟"擂台赛"较劲

备战大晨7月 GESP C++ 1级(17):一维数组求最大值,大晨第一次跟"擂台赛"较劲
强仔从上一篇说起
上一篇讲完一维数组的输入输出,大晨已经能熟练地把 5 个数存进数组再原样输出了。我当时说了一句话:”数组能存东西只是第一步,真正的功夫在’用’上。”
这不,今天就碰到了第一个”用”的场景——求最大值。
擂台赛的比喻
《一本通》题目要求是:输入 5 个整数,输出其中的最大值。大晨看完题目直接愣住,问我:”爸爸,我怎么知道哪个最大?一个一个看吗?”
我说你想啊,5 个数站一排,就像打擂台。第一个选手先站擂主,第二个上来比,比赢了就换他当擂主,第三个再上……一直比完,最后站在擂台上的那个就是最大值。
大晨说:”那万一第一个就是最大的呢?”我说好问题,所以第一个选手直接当擂主,后面来挑战的赢了才换,没赢就继续站着。大晨点点头:”哦,就是一直比,谁赢了谁站着。”
打擂台的核心逻辑就一句话:先定擂主,逐个挑战,赢了才换。
代码实现
我跟大晨一起敲出来的代码:
1 |
|
输入:
1 | 3 7 1 9 4 |
输出:
1 | 9 |
两个坑,大晨踩了俩
第一个坑:擂主初始值。
大晨一开始写 int maxVal = 0;,我说不对,万一 5 个数全是负数呢?最大值变成了 0,但数组里根本没有 0 这个数。
大晨不信,我让他试了一组 -3 -7 -1 -9 -4,输出果然是 0,确实不对。他挠挠头改成了 a[0]。
擂主必须从数组第一个元素开始当,不能拿一个跟数组无关的数当擂主。
第二个坑:循环起点。
擂主已经是 a[0] 了,那挑战从谁开始?大晨写的是 for (int i = 0; i < 5; i++),等于让 a[0] 跟自己比了一次。虽然结果没错,但多比了一次没意义。我让他改成 i = 1 开始。
大晨嘀咕:”跟自己比有什么意思嘛,又不能赢自己。”
老父亲陪跑笔记
今天最让我欣慰的是大晨自己发现了 maxVal = 0 的问题——虽然是踩了坑才发现的,但他学会了一种重要的调试思路:用特殊数据测试边界。
全负数这种边界情况,在大晨目前的阶段还想不到,所以我主动给了这组数据引导他发现。以后这类”坑”还会很多,我现在能帮一把是一把,但目标是让他慢慢养成自己造测试数据的习惯。
另外,打擂台这个比喻确实好用,大晨立刻就理解了。比直接讲”遍历比较更新最大值”这种说法强太多。跟孩子讲算法,先讲故事,再上代码,事半功倍。
本篇小结
一维数组求最大值,记住三点:
- 擂主用
a[0]初始化,不要用 0 - 挑战从
i = 1开始,跳过自己 - 挑战赢了才更新,用
if判断
下一篇,我们要把擂台赛反过来——求最小值,而且这次不只是 5 个数,大晨要面对”先输入 n 再输入 n 个数”这种更灵活的格式。他第一次碰”n 个数的动态输入”,能不能接住?下篇见。
免责声明:本文仅记录我家大晨的备考过程,不构成任何教学建议。每个孩子学习节奏不同,请根据实际情况调整。代码基于 GESP C++ 1 级考纲,如有错误欢迎指正。


