备战大晨7月 GESP C++ 1级(19):一维数组找最大值,大晨的"打擂台"思维

上篇说到大晨把for循环的嵌套搞明白后,老父亲我松了口气,但不敢飘——GESP 1级的知识点还剩几块没过完,其中一维数组的操作是重中之重。

这不,今天翻《一本通•编程启蒙C++版》,正好讲到一维数组找最大值。

从”一个数”到”一堆数”

之前大晨学的变量,一个int只能存一个数。我跟他说:”假设你现在有5个同学的身高,要找出最高的那个,怎么办?”

大晨脱口而出:”那就写5个变量呗,a、b、c、d、e,然后一个一个比。”

我笑了。这是初学者的第一反应,没错,但笨了。

“那要是50个同学呢?500个呢?”

大晨愣了一下:”那……写500个变量?”

“你自己试试打字打500个变量名。”

大晨想象了一下那个画面,自己先笑了。

数组登场

趁热打铁,我引入数组的写法,直接上代码:

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

int main() {
int n = 5;
int a[100]; // 定义一个数组,最多放100个数

for (int i = 0; i < n; i++) {
cin >> a[i]; // 循环读入5个数
}

int maxVal = a[0]; // 先假设第一个数最大

for (int i = 1; i < n; i++) {
if (a[i] > maxVal) {
maxVal = a[i]; // 发现更大的,就更新
}
}

cout << maxVal << endl;

return 0;
}

大晨盯着看了几秒,问:”为什么maxVal要先等于a[0]?”

这个问题问得好。 很多孩子学到这里都会卡一下。

“打擂台”比喻

我给大晨打了个比方:

“想象5个人打擂台,第一个选手先站上去,他就是’擂主’。第二个上来跟他打,赢了就当新擂主。第三个再上来打擂主……一直到最后一个人。最后站在台上的,就是最厉害的那个。”

大晨眼睛一亮:”哦!所以maxVal就是擂主,a[i]就是来挑战的人,如果a[i]比maxVal大,就把maxVal换掉!”

对,这就是找最大值的核心逻辑。

我又追问一句:”那如果擂台上一开始没人,行不行?”

大晨摇头:”不行,总得先站一个上去。”

思路对的。初始值必须是数组里真实存在的值,不能随便填个0——万一所有数都是负数呢? 这是很多孩子会踩的坑,待会儿就让他踩一次。

真的踩了坑

代码写完后,大晨兴冲冲输入5个数:3 7 2 9 4。

输出9,没问题。

然后我让他试一组负数:-3 -7 -2 -9 -4。

输出-2,大晨愣了一下:”不对吧?”

“你自己看看,-2是不是这五个里最大的?”

他仔细一看,确实是。他下意识觉得负数”没有最大的”,数感还得练。

我又问:”那如果我一开始把maxVal设成0呢?”

大晨改了一行代码跑了一下,输出变成0。他立马反应过来:”0比所有负数都大,擂主一直是0,永远不会被换掉!”

这个坑踩过一次,他就记住了。

老父亲陪跑笔记

今天核心就一句话:找最大值,先拿数组第一个元素当擂主,然后逐个比较、随时替换。

几个要点记一下:

  • 数组下标从0开始,别搞混
  • 比较循环从下标1开始(a[0]已经当擂主了)
  • 初始值用a[0],绝对不能用0
  • 数组大小定义时留够余量

大晨今天大概花了40分钟,理解”擂台”比喻不到5分钟,后面写代码调试花了快半小时。概念不难,但bug会教做人。

不过今天大晨问了句让我意外的话:”爸,那找最小值是不是也一样的道理,把大于号改成小于号就行?”

这小子开始有举一反三的意识了,老父亲甚慰。

下篇预告:大晨自己提出要挑战”同时找最大值和最小值”,但这里有个坑——只用一轮循环能不能同时搞定两个?我俩试了一下,结果……


免责声明:本文仅为自家孩子备赛记录,不构成任何教学建议。代码基于《一本通•编程启蒙C++版》练习整理,如有疏漏欢迎指正。