Day6-预习
2026-07-16 20:47:04
发布于:广东
🔄 C++ 循环嵌套与二维数组 · 课前预习笔记
明天要学的东西叫 “循环嵌套”和“二维数组” ——说白了就是让程序处理表格数据,比如成绩表、座位表、地图,都能用代码表示出来!
一、先搞懂:什么是循环嵌套?
1. 生活类比
假设你要把 5天的作业 都写完,每天写 3门课 的作业。
用程序思维来想:
- 外层循环 = 第1天、第2天、第3天、第4天、第5天(5天)
- 内层循环 = 写语文、写数学、写英语(3门课)
每天都要写完3门课,才能进入下一天。
for (int 天 = 1; 天 <= 5; 天++) { // 外层:5天
for (int 课 = 1; 课 <= 3; 课++) { // 内层:3门课
写作业(课);
}
}
2. 执行流程(特别重要!)
for (int i = 1; i <= 3; i++) { // 外层循环
cout << "i = " << i << endl;
for (int j = 1; j <= 3; j++) { // 内层循环
cout << " j = " << j << endl;
}
}
实际执行顺序:
i = 1 → j = 1, 2, 3 (内层循环全部跑完)
i = 2 → j = 1, 2, 3 (内层循环全部跑完)
i = 3 → j = 1, 2, 3 (内层循环全部跑完)
💡 记住:外层循环每走一步,内层循环都要完整地跑一遍!
3. 常见嵌套模式
| 模式 | 代码 | 执行次数 |
|---|---|---|
| 双重for | for(i) { for(j) { } } |
n × m 次 |
| 三重for | for(i) { for(j) { for(k) { } } } |
n × m × k 次 |
// 双重for:输出一个 3行×4列 的矩形
for (int i = 1; i <= 3; i++) { // 3行
for (int j = 1; j <= 4; j++) { // 4列
cout << "* ";
}
cout << endl; // 每行结束换行
}
// 输出:
// * * * *
// * * * *
// * * * *
二、二维数组
1. 什么是一维数组 vs 二维数组?
| 类型 | 生活类比 | C++定义 | 访问方式 |
|---|---|---|---|
| 一维数组 | 一排柜子,每个柜子有编号 | int a[10]; |
a[1]、a[2]…… |
| 二维数组 | 一个表格,有行号和列号 | int a[10][10]; |
a[1][1]、a[1][2]…… |
💡 一维数组 = 一排数据,二维数组 = 一张表格(行+列)
2. 怎么定义二维数组?
我们约定:下标从 1 开始,0 号位置不用!
int a[1005][1005]; // 最多 1004行 × 1004列
💡 如果题目说 n ≤ 1000,m ≤ 1000,就开
a[1005][1005]。
3. 二维数组在内存中怎么存的?
a[1][1] a[1][2] a[1][3] a[1][4] ← 第1行
a[2][1] a[2][2] a[2][3] a[2][4] ← 第2行
a[3][1] a[3][2] a[3][3] a[3][4] ← 第3行
a[4][1] a[4][2] a[4][3] a[4][4] ← 第4行
4. 怎么输入和输出二维数组?
int n, m;
cin >> n >> m; // 读入行数n,列数m
int a[1005][1005] = {0};
// 输入:双重for循环
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j]; // 读入第i行第j列
}
}
// 输出:双重for循环
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cout << a[i][j] << " ";
}
cout << endl; // 每行输出完换行
}
5. 二维数组的常见操作
① 求所有元素的和
int sum = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
sum += a[i][j];
}
}
cout << "总和 = " << sum;
② 求第 k 行的和
int k;
cin >> k; // 要算第几行
int sum = 0;
for (int j = 1; j <= m; j++) {
sum += a[k][j];
}
cout << "第" << k << "行的和 = " << sum;
③ 求第 k 列的和
int k;
cin >> k; // 要算第几列
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += a[i][k];
}
cout << "第" << k << "列的和 = " << sum;
④ 找最大值及其位置
int max_val = a[1][1];
int max_i = 1, max_j = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] > max_val) {
max_val = a[i][j];
max_i = i;
max_j = j;
}
}
}
cout << "最大值是 a[" << max_i << "][" << max_j << "] = " << max_val;
⑤ 求主对角线之和(方阵 n×n)
// 主对角线:行号 = 列号,即 a[1][1], a[2][2], a[3][3]...
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += a[i][i];
}
cout << "主对角线之和 = " << sum;
⑥ 求副对角线之和(方阵 n×n)
// 副对角线:行号 + 列号 = n + 1,即 a[1][n], a[2][n-1]...
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += a[i][n - i + 1];
}
cout << "副对角线之和 = " << sum;
三、综合练习:成绩表处理
题目
有 n 个同学,每个同学有 m 门课的成绩。要求:
- 读入所有成绩
- 计算每个同学的总分
- 计算每门课的平均分
- 找出总分最高的同学
完整代码
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int score[1005][1005] = {0};
// 1. 读入成绩
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> score[i][j];
}
}
// 2. 计算每个同学的总分
int total[1005] = {0}; // 存每个同学的总分
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
total[i] += score[i][j];
}
cout << "第" << i << "个同学的总分 = " << total[i] << endl;
}
// 3. 计算每门课的平均分
for (int j = 1; j <= m; j++) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += score[i][j];
}
double avg = 1.0 * sum / n;
cout << "第" << j << "门课的平均分 = " << avg << endl;
}
// 4. 找总分最高的同学
int max_score = total[1];
int max_id = 1;
for (int i = 2; i <= n; i++) {
if (total[i] > max_score) {
max_score = total[i];
max_id = i;
}
}
cout << "总分最高的同学是第" << max_id << "个,总分 = " << max_score;
return 0;
}
四、练习题目(自己试着写)
练习1:矩阵转置
把 n 行 m 列的矩阵转置成 m 行 n 列。
思路: 新矩阵的 b[j][i] = a[i][j]
// 输入
int a[1005][1005], b[1005][1005];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
// 转置
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
b[j][i] = a[i][j];
}
}
// 输出 b(m行n列)
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
练习2:杨辉三角
打印 n 行的杨辉三角。
规律:
- 第1列和对角线都是1
- 其他位置 = 上面 + 左上
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
int n;
cin >> n;
int a[1005][1005] = {0};
for (int i = 1; i <= n; i++) {
a[i][1] = 1; // 第1列都是1
a[i][i] = 1; // 对角线都是1
for (int j = 2; j < i; j++) {
a[i][j] = a[i-1][j-1] + a[i-1][j]; // 上面 + 左上
}
}
// 输出
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
📝 快速记忆卡
| 概念 | 一句话总结 |
|---|---|
| 循环嵌套 | 循环里面套循环,外层走一步,内层跑一遍 |
| 二维数组 | 表格数据,a[行][列] |
| 定义二维数组 | int a[1005][1005]; |
| 遍历二维数组 | 外层循环行,内层循环列 |
| 第k行和 | 固定行,遍历列 |
| 第k列和 | 固定列,遍历行 |
| 主对角线 | a[i][i] |
| 副对角线 | a[i][n-i+1] |
🔥 预习小任务
- 如果有一个 3×4 的二维数组,想输出所有元素,需要几个循环?怎么嵌套?
- 二维数组
a[1005][1005]最多能存多少行多少列?(提示:下标从1开始) - 杨辉三角中,
a[4][2]等于多少?(看上面的图)
明天上课带着这些问题来,效果翻倍!🚀
这里空空如也
















有帮助,赞一个