← 课程目录
第 15 讲 模块五:批量处理数据

循环 + 数组

15 / 24
💡
本节课目标
把模块三的循环和上节课的数组结合起来。 学会用循环遍历数组的每个元素,再用这个套路解决两个经典问题: 求总和 / 平均分,以及找最大值 / 最小值
开场

5 行还能忍,50 行呢?

📖 理论讲解

上节课埋下的伏笔

上节课打印数组元素,都是一行一行手动写下标:

print_one_by_one.cpp CPP
int scores[5] = {90, 85, 70, 60, 95};

std::cout << scores[0] << std::endl;
std::cout << scores[1] << std::endl;
std::cout << scores[2] << std::endl;
std::cout << scores[3] << std::endl;
std::cout << scores[4] << std::endl;
// 5 个还能忍,50 个呢?
⚠️
下标是规律的数字,正好是循环的强项
0, 1, 2, 3, 4 这种按顺序递增的数字,正是模块三 for 循环里循环变量 i 最擅长生成的东西。
第一段

用循环变量当下标

📖 理论讲解

i 从 0 数到“长度减 1”

i 当成下标,代入 scores[i],循环几轮就自动访问了几个元素:

print_loop.cpp CPP
#include <iostream>

int main() {
    int scores[5] = {90, 85, 70, 60, 95};

    for (int i = 0; i < 5; i++) {
        std::cout << scores[i] << std::endl;
    }
    return 0;
}
⚠️
循环条件写 i < 长度,不是 i <= 长度
数组长度是 5,合法下标是 0~4。如果条件写成 i <= 5, 最后一轮 i 会等于 5scores[5] 正好越界—— 这是数组配合循环时最常见的 bug,一定要记住用 <
⚡ 动手实操 约 5 分钟

改成 10 个元素试试

print_loop.cpp 里的数组扩充成 10 个元素(自己随便填数字), 同步改好数组长度和循环条件里的数字,运行确认全部正确打印。

第二段

求总和与平均分

📖 理论讲解

累加器 + 遍历,还是熟悉的配方

模块三学过的累加器套路,这里原样搬过来:循环外先声明 sum = 0,循环里每轮把当前元素加进去。平均分 = 总和 ÷ 元素个数:

sum_loop.cpp CPP
#include <iostream>

int main() {
    int scores[5] = {90, 85, 70, 60, 95};

    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += scores[i];
    }

    double average = sum / 5.0;
    std::cout << "总分:" << sum << std::endl;
    std::cout << "平均分:" << average << std::endl;
    return 0;
}
5.0 而不是 5
sum / 5.0 用了 5.0 而不是 5——回忆第 2 讲, 整数除以整数在 C++ 里会截断小数部分。除数写成 5.0, 结果才是带小数的平均分。
第三段

找最大值:打擂台

📖 理论讲解

先选一个“擂主”,再逐个挑战

找最大值的经典思路叫“打擂台”:先假设第一个元素是最大值(当前的擂主), 然后从第二个元素开始,依次和擂主比较——遇到更大的就换新擂主, 比完所有元素,剩下的就是真正的最大值。

find_max.cpp CPP
#include <iostream>

int main() {
    int scores[5] = {90, 85, 70, 60, 95};

    int maxScore = scores[0];   // 先假设第一个是最大值

    for (int i = 1; i < 5; i++) {   // 从下标 1 开始比,0 已经当过擂主了
        if (scores[i] > maxScore) {
            maxScore = scores[i];   // 打擂台:更大就换人
        }
    }

    std::cout << "最高分:" << maxScore << std::endl;
    return 0;
}
💡
为什么循环从 i = 1 开始,不是 i = 0
maxScore 已经用 scores[0] 初始化过了,再拿 scores[0] 和自己比一次纯属浪费——所以比较从下标 1 (第二个元素)开始就够了。对比一下上面求和的循环:sum0 开始,每个元素都要加,所以循环从 i = 0 开始;打擂台第一个元素已经被用掉了 (当了擂主),所以循环从 i = 1 开始——起点不同,是因为两种算法 对“第一个元素”的用法不一样。
⚡ 动手实操 约 10 分钟

打擂台找最小值

find_max.cpp 的思路反过来,补全下面的骨架,找出最小值:

find_min_skeleton.cpp CPP
int minScore = scores[0];   // 先假设第一个是最小值

for (int i = 1; i < 5; i++) {
    // 这里该怎么判断、怎么更新 minScore?
}

std::cout << "最低分:" << minScore << std::endl;

提示:把“更大就换人”反过来想——什么情况下应该把 minScore 换成 scores[i]

实战

动手写三个遍历程序

练习 15-1

筛选及格分数

声明一个 int scores[6] 并赋初值,用循环遍历,只打印其中 大于等于 60 的分数。

提示:循环体里加一个 if 判断,回忆模块二。

练习 15-2

求平均分

声明一个包含 8 个分数的数组,求出并打印它们的平均分 (保留小数,不用四舍五入)。

练习 15-3

最高分是第几名

在找最大值的基础上,再额外打印一句:最高分是第几个人的成绩 (下标从 0 开始,可以打印“下标 + 1”当作“第几名”更符合日常习惯)。

提示:除了 maxScore,再维护一个变量 maxIndex,每次换擂主时,同步记录下当前的下标 i

收尾

小结

📖 理论讲解

这节课你掌握了

能力用到的工具
批量遍历数组for (int i = 0; i < 长度; i++)
求总和 / 平均分累加器 sum + 遍历
找最大值 / 最小值“打擂台”:假设第一个,逐个比较更新
避免越界循环条件用 i < 长度,不是 <=
💡
下节课预告
数组有一个绕不开的限制——长度声明好就定死了。下节课学 vector: 一种可以随时 push_back 添加元素、自动变长的容器。