上节课打印数组元素,都是一行一行手动写下标:
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 当成下标,代入 scores[i],循环几轮就自动访问了几个元素:
#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;
} 0~4。如果条件写成 i <= 5,
最后一轮 i 会等于 5,scores[5] 正好越界——
这是数组配合循环时最常见的 bug,一定要记住用 <。
把 print_loop.cpp 里的数组扩充成 10 个元素(自己随便填数字),
同步改好数组长度和循环条件里的数字,运行确认全部正确打印。
模块三学过的累加器套路,这里原样搬过来:循环外先声明
sum = 0,循环里每轮把当前元素加进去。平均分 = 总和 ÷ 元素个数:
#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;
} sum / 5.0 用了 5.0 而不是 5——回忆第 2 讲,
整数除以整数在 C++ 里会截断小数部分。除数写成 5.0,
结果才是带小数的平均分。
找最大值的经典思路叫“打擂台”:先假设第一个元素是最大值(当前的擂主), 然后从第二个元素开始,依次和擂主比较——遇到更大的就换新擂主, 比完所有元素,剩下的就是真正的最大值。
#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;
} maxScore 已经用 scores[0] 初始化过了,再拿
scores[0] 和自己比一次纯属浪费——所以比较从下标 1
(第二个元素)开始就够了。对比一下上面求和的循环:sum 从
0 开始,每个元素都要加,所以循环从
i = 0 开始;打擂台第一个元素已经被用掉了
(当了擂主),所以循环从 i = 1 开始——起点不同,是因为两种算法
对“第一个元素”的用法不一样。
把 find_max.cpp 的思路反过来,补全下面的骨架,找出最小值:
int minScore = scores[0]; // 先假设第一个是最小值
for (int i = 1; i < 5; i++) {
// 这里该怎么判断、怎么更新 minScore?
}
std::cout << "最低分:" << minScore << std::endl; 提示:把“更大就换人”反过来想——什么情况下应该把 minScore
换成 scores[i]?
声明一个 int scores[6] 并赋初值,用循环遍历,只打印其中
大于等于 60 的分数。
提示:循环体里加一个 if 判断,回忆模块二。
声明一个包含 8 个分数的数组,求出并打印它们的平均分 (保留小数,不用四舍五入)。
在找最大值的基础上,再额外打印一句:最高分是第几个人的成绩 (下标从 0 开始,可以打印“下标 + 1”当作“第几名”更符合日常习惯)。
提示:除了 maxScore,再维护一个变量
maxIndex,每次换擂主时,同步记录下当前的下标 i。
| 能力 | 用到的工具 |
|---|---|
| 批量遍历数组 | for (int i = 0; i < 长度; i++) |
| 求总和 / 平均分 | 累加器 sum + 遍历 |
| 找最大值 / 最小值 | “打擂台”:假设第一个,逐个比较更新 |
| 避免越界 | 循环条件用 i < 长度,不是 <= |
vector:
一种可以随时 push_back 添加元素、自动变长的容器。