🔲 C++ 二维数组 - L17 高级概念

学习表格数据和矩阵的处理,扩展数组的维度

📚 什么是二维数组?

从一维到二维

如果一维数组是"一排格子",那么二维数组就是"一个表格"或"一个棋盘"。

  • 两个维度:需要行和列两个索引来定位元素
  • 表格结构:像Excel表格一样有行有列
  • 矩阵表示:数学中的矩阵就是用二维数组表示
  • 嵌套循环:通常需要双重循环来遍历
💡 形象比喻:
• 二维数组就像教室的座位表:第几排第几列
• 也像棋盘:横坐标和纵坐标确定一个位置
• 还像Excel表格:行号和列号确定一个单元格
• 或者电影院的座位:第几排第几个座位

二维数组的可视化

一个3行4列的二维数组:

[0][0]
1
[0][1]
2
[0][2]
3
[0][3]
4
[1][0]
5
[1][1]
6
[1][2]
7
[1][3]
8
[2][0]
9
[2][1]
10
[2][2]
11
[2][3]
12

arr[3][4] 二维数组可视化(3行4列)

🎯 关键理解:
• 第一个索引 = 行号(从0开始)
• 第二个索引 = 列号(从0开始)
• arr[i][j] 表示第i行第j列的元素
• 总元素个数 = 行数 × 列数

二维数组的声明和初始化

#include <iostream> using namespace std; int main() { // 方式1:声明时指定行列 int arr1[3][4]; // 3行4列的二维数组 // 方式2:声明并初始化 int arr2[2][3] = { {1, 2, 3}, // 第0行 {4, 5, 6} // 第1行 }; // 方式3:自动推断大小 int arr3[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 自动推断为3行3列 // 方式4:全部初始化为0 int arr4[3][4] = {0}; // 所有元素都是0 return 0; }
💡 语法规则:
• 格式:类型 数组名[行数][列数];
• 可以省略行数,但不能省略列数
• 初始化时用大括号分组,每组代表一行
• 未初始化的元素自动为0

⚙️ 二维数组的基本操作

访问二维数组元素

#include <iostream> using namespace std; int main() { int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; // 访问特定位置的元素 cout << "第1行第1列:" << matrix[0][0] << endl; // 1 cout << "第2行第3列:" << matrix[1][2] << endl; // 7 cout << "最后1个元素:" << matrix[2][3] << endl; // 12 // 修改元素值 matrix[1][1] = 99; // 将第2行第2列改为99 cout << "修改后:" << matrix[1][1] << endl; // 99 return 0; }

遍历二维数组

#include <iostream> using namespace std; int main() { int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; // 使用双重循环遍历 cout << "按行输出:" << endl; for (int i = 0; i < 3; i++) { // 外层循环:遍历行 for (int j = 0; j < 4; j++) { // 内层循环:遍历列 cout << matrix[i][j] << "\t"; } cout << endl; // 每行结束后换行 } return 0; }
💡 遍历技巧:
• 外层循环控制(i)
• 内层循环控制(j)
• 先遍历完一行的所有列,再换到下一行
• 类似阅读书籍:从左到右,从上到下

输入二维数组

#include <iostream> using namespace std; int main() { const int ROWS = 3; const int COLS = 4; int matrix[ROWS][COLS]; // 从键盘输入二维数组 cout << "请输入" << ROWS << "行" << COLS << "列的数据:" << endl; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { cout << "第" << (i+1) << "行第" << (j+1) << "列:"; cin >> matrix[i][j]; } } // 输出二维数组 cout << "\n输入的矩阵:" << endl; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { cout << matrix[i][j] << "\t"; } cout << endl; } return 0; }
🎮 互动实验:二维数组可视化

输入行数和列数,生成二维数组并可视化

输入行列数后点击"生成矩阵"...

🛠️ 二维数组的常用算法

计算矩阵总和

#include <iostream> using namespace std; int main() { int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int sum = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { sum += matrix[i][j]; } } cout << "矩阵所有元素的总和:" << sum << endl; // 78 return 0; }

计算每行的和

#include <iostream> using namespace std; int main() { int matrix[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; // 计算每一行的和 for (int i = 0; i < 3; i++) { int rowSum = 0; for (int j = 0; j < 4; j++) { rowSum += matrix[i][j]; } cout << "第" << (i+1) << "行的和:" << rowSum << endl; } return 0; }

矩阵转置

#include <iostream> using namespace std; int main() { int matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; cout << "原矩阵:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << matrix[i][j] << "\t"; } cout << endl; } // 矩阵转置:行列互换 int transposed[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { transposed[j][i] = matrix[i][j]; // 行列互换 } } cout << "\n转置后:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << transposed[i][j] << "\t"; } cout << endl; } return 0; }
💡 转置原理:
• 转置就是把行变成列,列变成行
• 公式:transposed[j][i] = matrix[i][j]
• 对角线上的元素不变
• 常用于线性代数运算

查找矩阵中的最大值

#include <iostream> using namespace std; int main() { int matrix[3][4] = { {23, 45, 12, 67}, {34, 89, 56, 21}, {78, 43, 91, 15} }; // 假设第一个元素是最大值 int maxVal = matrix[0][0]; int maxRow = 0, maxCol = 0; // 遍历整个矩阵找最大值 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { if (matrix[i][j] > maxVal) { maxVal = matrix[i][j]; maxRow = i; maxCol = j; } } } cout << "最大值:" << maxVal << endl; cout << "位置:第" << (maxRow+1) << "行第" << (maxCol+1) << "列" << endl; return 0; }
🎯 矩阵计算器

选择要执行的矩阵操作

选择操作后查看结果...

🚀 二维数组的高级应用

实际应用:学生成绩表

#include <iostream> using namespace std; int main() { // 5个学生,3门课的成绩表 double scores[5][3] = { {85.5, 92.0, 78.5}, // 学生1:语文、数学、英语 {90.0, 88.5, 95.0}, // 学生2 {76.5, 82.0, 80.0}, // 学生3 {92.0, 95.5, 89.0}, // 学生4 {88.0, 90.0, 91.5} // 学生5 }; const char* subjects[] = {"语文", "数学", "英语"}; // 计算每个学生的平均分 for (int i = 0; i < 5; i++) { double sum = 0; for (int j = 0; j < 3; j++) { sum += scores[i][j]; } double avg = sum / 3; cout << "学生" << (i+1) << "平均分:" << avg << endl; } // 计算每门课的平均分 for (int j = 0; j < 3; j++) { double sum = 0; for (int i = 0; i < 5; i++) { sum += scores[i][j]; } double avg = sum / 5; cout << subjects[j] << "平均分:" << avg << endl; } return 0; }

二维数组的实际应用场景

二维数组在实际编程中有广泛应用:

  • 📊 表格数据:Excel表格、数据库记录
  • 🎮 游戏地图:贪吃蛇、俄罗斯方块、扫雷
  • 🖼️ 图像处理:像素矩阵、灰度图
  • 🔢 数学计算:矩阵运算、线性代数
  • 🗺️ 地图系统:网格地图、路径规划
  • 📅 日历系统:月历表格

内存存储方式

#include <iostream> using namespace std; int main() { int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} }; // 二维数组在内存中是连续存储的 cout << "matrix[0][0]地址:" << &matrix[0][0] << endl; cout << "matrix[0][1]地址:" << &matrix[0][1] << endl; cout << "matrix[1][0]地址:" << &matrix[1][0] << endl; // 计算总大小 cout << "总大小:" << sizeof(matrix) << " 字节" << endl; cout << "元素个数:" << sizeof(matrix) / sizeof(int) << endl; return 0; }
💡 内存布局:
• 二维数组在内存中是按行连续存储
• 先存第0行的所有元素,再存第1行
• 这种存储方式叫行优先存储
• 访问速度快,缓存友好

📝 实战练习

📝 理解测试

以下代码的输出是什么?

#include <iostream> using namespace std; int main() { int arr[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int sum = 0; for (int i = 0; i < 3; i++) { sum += arr[i][i]; } cout << sum << endl; return 0; }
选择答案查看解析...
💻 综合挑战

题目:创建一个程序,实现一个简单的井字棋(Tic-Tac-Toe)游戏棋盘。使用3×3的二维数组表示棋盘,用0表示空位,1表示玩家X,2表示玩家O。

点击"生成代码"查看完整实现...