① 程序设计基础 — 第 3 课
if/else、自定义函数,你已经用 bool isLeapYear(int year) 写出了一个干净的函数。for / while / do-while)和 数组。循环负责「重复做」,数组负责「把一堆数据一起拿着」,两者一配合,处理一堆数据就是基本操作了。
for,先判断用 while,至少做一次用 do-while。| 循环 | 适合场景 | 结构 |
|---|---|---|
for |
次数已知 | for(初始化; 条件; 步进) { } |
while |
次数未知,先判断 | while(条件) { } |
do-while |
次数未知,至少一次 | do { } while(条件); |
// 打印 1 到 10
for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
// 输出:1 2 3 4 5 6 7 8 9 10
// 一直读入,直到输入 0
int n;
cin >> n;
while (n != 0) {
cout << "你输入了: " << n << endl;
cin >> n;
}
// 猜数字(至少猜一次)
int secret = 7, guess;
do {
cout << "猜一个数字: ";
cin >> guess;
} while (guess != secret);
cout << "猜对了!" << endl;
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
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;
}
scores[5] = 越界,不会报错但会破坏其它内存,是大坑!
int a[5] = {1, 2, 3, 4, 5}; // 全指定
int b[5] = {0}; // 全初始化为 0
int c[] = {1, 2, 3}; // 自动推断大小 = 3
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;
int a[5] 的有效下标是 0~4,循环写 i <= 5 就越界了,应该是 i < 5。a[5] 能编译、能跑,但改的是别人的内存,结果可能莫名其妙。for (int i = 0; i < 10; ) 里没有 i++,条件永远成立,死循环。do-while 结尾少分号:写法是 } while (条件);,那个分号不能省。int a[5] = {0}; 会把剩下的四个元素都补成 0,不是只填第一个。arr[0] 起手:拿 0 当初始值,数组全是负数时就会输出 0,而不是真正的最大值。int a[3] = {5}; cout << a[1]; 输出什么?for(int i=0; i<10; ) { cout << i; }do { cout << 1; } while(false); 输出?1 2 3 4 5 → 输出 5 4 3 2 1i = 4 开始,i-- 往回走。
1 1 2 3 5 8 13 21 34 ...卡住时的自查顺序
i = 4 开始,条件是 i >= 0,步进 i--。i >= 0 还是 i > 0?写错会少输出下标 0 那个数。for(次数已知)/ while(先判断)/ do-while(先执行一次)。break 跳出循环,continue 跳过本轮,两者别用反。string 管字符,vector 管一堆任意类型的数据。
while 和 for 能不能互相改写」「break 和 return 有什么区别」「数组到底存不存自己的长度」—— 直接问。