备战大晨7月 GESP C++ 1级(22):初探一维数组,存点成绩好不好

上篇咱们聊到了循环嵌套,大晨在屏幕前挠头算九九乘法表,最后总算是磕磕绊绊跑通了。今天继续往下推进《一本通•编程启蒙C++版》,咱们正式踏进一个新大门——一维数组

变量不够用了

之前大晨写代码,存个成绩就 int a;,存两个就 int a, b;。今天书上题目要求存全班50个人的数学成绩。大晨盯着屏幕发呆,转头问我:”爸爸,我是不是得写50个变量?a1, a2一直到a50?”

我没忍住笑出了声。要是存全校1000个人,你手不得敲抽筋了?

我跟他说,C++里有个神器叫”数组”,就像是一排连在一起的抽屉,你只要给它起个名字,就能一次性存一堆同类型的数据。

数组怎么开

定义一个数组的格式很简单:int scores[50];

这句话的意思是,我向电脑要50个连在一起的抽屉,名字都叫 scores,里面只能放整数。

大晨一听眼睛亮了:”那这个太省事了!”

不过我马上给他泼了盆冷水。C++的数组有个坑,下标是从0开始的。 也就是说,第一个抽屉叫 scores[0],第50个抽屉叫 scores[49],没有 scores[50] 这个东西。

大晨皱着眉头嘟囔:”为什么从0开始?从1开始多好,1号抽屉、2号抽屉,小孩子都懂。”

我跟他打了个比方:”你可以把 scores 当成这排抽屉的起点,scores[0] 就是起点往后偏移0个抽屉,也就是第一个抽屉。scores[1] 就是偏移1个抽屉。这是老外定的规矩,计算机底层的偏移量就是这么算的。” 大晨似懂非懂地点点头,反正先死记硬背下来再说。

来段能跑的代码

为了让他彻底弄懂,我让他写个简单程序:输入5个人的成绩,存在数组里,然后再把5个人的成绩按顺序打印出来,最后算个总分。

大晨敲了大概十分钟,中间忘了加分号,还把循环条件写成了 i <= 5,我提醒他下标越界了,他才改过来。

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

int main() {
int scores[5]; // 定义能装5个成绩的数组
int sum = 0;

// 输入5个人的成绩
for (int i = 0; i < 5; i++) {
cin >> scores[i];
}

// 输出并计算总分
for (int i = 0; i < 5; i++) {
cout << "第" << i + 1 << "个人的成绩是: " << scores[i] << endl;
sum = sum + scores[i];
}

cout << "总分是: " << sum << endl;
return 0;
}

他在终端输入 90 85 78 92 88,一回车,程序乖乖吐出结果。大晨兴奋地拍大腿:”这就跟点名一样!太好玩了!”

老父亲陪跑笔记

今天这关过得还算顺利。我觉得教小孩学编程,千万别一上来就讲什么”连续的内存空间”这种抽象概念,直接说”一排抽屉”最管用。

不过有个细节得盯紧:大晨在 for 循环里写 i <= 5 是惯性思维,平时数学里1到5就是包含5的。但在数组里,scores[5] 就越界了,这属于未定义行为,运气好不出错,运气差程序直接崩。养成 i < 5 的习惯,能省后面无数个Bug。

今天大晨算是把一维数组的定义、输入和输出基本拿下了,但对于数组里怎么找最大值、怎么排序,他还一无所知。这小子刚跑通程序,转头就去跟妈妈炫耀自己会存全班成绩了。

既然数组的基础走通了,下篇咱们就得上点强度了。下一篇文章,我准备教大晨用一维数组来找找班里谁的成绩最高,看看这小子能不能转过这个弯来。

免责声明:本文仅为大晨学习信奥的家庭陪跑真实记录,不构成任何专业编程教学指导。代码基于入门级理解编写,各路大神轻喷。