📚 什么是二维数组?
从一维到二维
如果一维数组是"一排格子",那么二维数组就是"一个表格"或"一个棋盘"。
- ✅ 两个维度:需要行和列两个索引来定位元素
- ✅ 表格结构:像Excel表格一样有行有列
- ✅ 矩阵表示:数学中的矩阵就是用二维数组表示
- ✅ 嵌套循环:通常需要双重循环来遍历
💡 形象比喻:
• 二维数组就像教室的座位表:第几排第几列
• 也像棋盘:横坐标和纵坐标确定一个位置
• 还像Excel表格:行号和列号确定一个单元格
• 或者电影院的座位:第几排第几个座位
二维数组的可视化
一个3行4列的二维数组:
arr[3][4] 二维数组可视化(3行4列)
🎯 关键理解:
• 第一个索引 = 行号(从0开始)
• 第二个索引 = 列号(从0开始)
• arr[i][j] 表示第i行第j列的元素
• 总元素个数 = 行数 × 列数
二维数组的声明和初始化
#include <iostream>
using namespace std;
int main() {
int arr1[3][4];
int arr2[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int arr3[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int arr4[3][4] = {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;
cout << "第2行第3列:" << matrix[1][2] << endl;
cout << "最后1个元素:" << matrix[2][3] << endl;
matrix[1][1] = 99;
cout << "修改后:" << matrix[1][1] << 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}
};
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;
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() {
double scores[5][3] = {
{85.5, 92.0, 78.5},
{90.0, 88.5, 95.0},
{76.5, 82.0, 80.0},
{92.0, 95.5, 89.0},
{88.0, 90.0, 91.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。
点击"生成代码"查看完整实现...