Lesson 0004 · 循环与数组

① 程序设计基础 — 第 3 课

上节课:数据类型、if/else、自定义函数,你已经用 bool isLeapYear(int year) 写出了一个干净的函数。
这节课:学两个新工具 —— 更多循环写法(for / while / do-while)和 数组。循环负责「重复做」,数组负责「把一堆数据一起拿着」,两者一配合,处理一堆数据就是基本操作了。
三句话速览

1. 三种循环

循环适合场景结构
for 次数已知 for(初始化; 条件; 步进) { }
while 次数未知,先判断 while(条件) { }
do-while 次数未知,至少一次 do { } while(条件);

for — 已知次数

// 打印 1 到 10
for (int i = 1; i <= 10; i++) {
    cout << i << " ";
}
// 输出:1 2 3 4 5 6 7 8 9 10

while — 不知道要循环几次

// 一直读入,直到输入 0
int n;
cin >> n;
while (n != 0) {
    cout << "你输入了: " << n << endl;
    cin >> n;
}

do-while — 至少执行一次

// 猜数字(至少猜一次)
int secret = 7, guess;
do {
    cout << "猜一个数字: ";
    cin >> guess;
} while (guess != secret);
cout << "猜对了!" << endl;
循环三要素(缺一不可):① 初始化 ② 条件(什么时候停) ③ 步进(往停止方向走)。忘写步进 = 死循环!

2. break 和 continue

for (int i = 1; i <= 10; i++) {
    if (i == 5) break;    // 直接跳出整个循环
    cout << i << " ";
}
// 输出:1 2 3 4

for (int i = 1; i <= 10; i++) {
    if (i == 5) continue; // 跳过本次,继续下一轮
    cout << i << " ";
}
// 输出:1 2 3 4 6 7 8 9 10

3. 数组 — 存一堆同类型数据

int scores[5];              // 声明:5 个 int 的数组
scores[0] = 90;             // 索引从 0 开始!
scores[1] = 85;
scores[2] = 78;
scores[3] = 92;
scores[4] = 88;

// 配合循环输出
for (int i = 0; i < 5; i++) {
    cout << "第" << i + 1 << "个成绩: " << scores[i] << endl;
}
关键:C++ 数组索引从 0 开始,大小 5 的数组有效索引是 0~4。
scores[5] = 越界,不会报错但会破坏其它内存,是大坑!

初始化简写

int a[5] = {1, 2, 3, 4, 5};              // 全指定
int b[5] = {0};                           // 全初始化为 0
int c[]  = {1, 2, 3};                     // 自动推断大小 = 3

4. 循环 + 数组:三个经典操作

求和

int arr[] = {3, 1, 4, 1, 5};
int sum = 0;
for (int i = 0; i < 5; i++) {
    sum += arr[i];  // 等价于 sum = sum + arr[i]
}
cout << "总和: " << sum << endl;  // 16

找最大值

int arr[] = {3, 7, 2, 9, 1};
int maxVal = arr[0];          // 假设第一个是最大
for (int i = 1; i < 5; i++) {
    if (arr[i] > maxVal)
        maxVal = arr[i];      // 更新最大值
}
cout << "最大值: " << maxVal << endl;  // 9

查找

int arr[] = {3, 7, 2, 9, 1};
int target = 9;
bool found = false;
for (int i = 0; i < 5; i++) {
    if (arr[i] == target) {
        cout << "找到了,下标: " << i << endl;
        found = true;
        break;    // 找到就停
    }
}
if (!found) cout << "没找到" << endl;

5. 坑点清单

6. 小测

Q1. int a[3] = {5}; cout << a[1]; 输出什么?
Q2. 死循环是哪个?
for(int i=0; i<10; ) { cout << i; }
Q3. do { cout << 1; } while(false); 输出?

7. 动手练习

题目:反转数组

读入 5 个整数存入数组,然后 从后往前 输出它们。

示例:输入 1 2 3 4 5 → 输出 5 4 3 2 1

提示:从 i = 4 开始,i-- 往回走。
挑战题(选做):斐波那契

输出斐波那契数列的前 20 项:1 1 2 3 5 8 13 21 34 ...
规律:前两项是 1,之后每一项 = 前两项之和。

卡住时的自查顺序

  1. 读入对不对?先只打印这 5 个数,确认顺序没乱。
  2. 循环的起点和终点:从 i = 4 开始,条件是 i >= 0,步进 i--。
  3. 用 i >= 0 还是 i > 0?写错会少输出下标 0 那个数。
  4. 数字之间用空格还是换行?题目要的格式照抄样例。

本课小结

推荐阅读

下一课预告
0005 字符串与 vector —— 数组有个短板:大小写死了,题目一说「个数不固定」就不好办。下一课换两个能自动变长的家伙:string 管字符,vector 管一堆任意类型的数据。
这一课后面天天用:循环是处理数据的发动机,数组是最简单的容器。哪一句还不明白 —— 比如「while 和 for 能不能互相改写」「break 和 return 有什么区别」「数组到底存不存自己的长度」—— 直接问。

Lesson 0004 · 课程体系总览:curriculum-overview.html

上一课:变量、分支与函数 · Mission · Notes

书 C++ Primer 第 3、5 章 · 在线 cppreference 数组