这是《C++算法宝典》C++基础篇的第21节文章啦~
如果你之前没有太多C++基础,请点击👉C++基础,如果你C++语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏:数据结构啦
目录
📕注意事项
🧠注意事项
🧠找货物
二维数组的概念
在上篇文章中我们提到,一维数组就像是一列火车。假设我们来到火车站,看见有很多辆长度一样的火车。为了区别这些火车,我们尝试分别命名为a1,a2,a3...那么a1[2]就可以用来表示第一辆火车2号车厢。
如果把火车当做一个元素,那么这些火车就会组成一个一维数组,而这个一维数组里面的每一个元素都是一个小的一维数组。这样就是二维数组,即一个数组需要使用两个数字来控制位置。
二维数组的定义
维数组就是用一个名字后面跟着两个数字,分别表示数组的行和列。二维数组就是一个矩阵------长方形方阵,有行有列。
定义:
数据类型 数组名[常量表达式1] [常量表达式2]
例如:int a[5][9]; //定义一个5行9列的二维整型数组a
引用数组元素
如果需要使用二维数组中的某个元素,就需要找到具体位置:
<数组名>[行下标][列下标]
如:a[1][2]
表示二维数组a中的第2行第3列元素。
注意事项
和一维数组一样,行下标和列下标都是从0开始编号的。
每个下标表达式取值不应超出下标所指定的范围。
例如,设有定义:int a[2][3];则表示a是2行3列的二维数组,共有2*3=6个元素,它们是:
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
因此可以看成一个矩阵(表格),a[1][2]即表示第2行第3列的元素,而a[2][3]就已经越界了。
二维数组的输入
int a[10][10]; //定义一个10行10列的二维数组 a
for(i=1;i<=3;i++) //控制行下标
{
for(j=1;j<=4;j++) //控制列下标
cin>>a[i][j];
}
二维数组的输出
for(i=1;i<=3;i++)
{
for(j=1;j<=4;j++)
cout<<a[i][j]<<" "; //每个元素之间用空格隔开
cout<<endl; //每一行输出结束之后需要手动换行
}
二维数组输入输出
给定一个m行n列的二维数组,请原样输出这个二维数组(m和n范围为2-20)
【输入描述】
m+1行:
第一行:m和n,分别表示二维数组的行数和列数
接下来m行,每行n个数字,表示二维数组中每个元素
【输出描述】
m行,每行n个数字,二维数组原样输出
【输入样例】
2 3
1 3 4
2 6 8
【输出样例】
1 3 4
2 6 8
二维数组输入输出参考代码
#include<iostream>
using namespace std;
int a[22][22],m,n;
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
cin>>a[i][j];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
注意事项
二维数组定义的时候尽量在主函数之外定义,因为一般情况下二维数组较大,占的空间较多。定义在主函数之外可以定义的比较大,且数组里面的所有元素都会默认赋值为0。(一维数组和变量也可以定义在主函数之外)。这样的定义叫做全局数组(变量)。
找货物
有m列火车,每列火车有n节车厢,车厢装有很多货物,需要对第x列火车第y节车厢进行抽查,请问这节车厢里有多少货物?(最多有20列火车,每列火车20节车厢)
【输入描述】
m+1行:
第一行:m,n,x,y,分别表示二维数组的行数、列数和要找的元素的所在行和列
接下来m行,每行n个数字,表示二维数组中每个元素
【输出描述】
一个数字,表示x行y列的元素
【输入样例】
3 4 2 2
1 2 3 4
4 5 6 7
7 8 9 10
【输出样例】
5
找货物参考代码
#include<iostream>
using namespace std;
int m,n,x,y,a[30][30];
int main()
{
cin>>m>>n>>x>>y;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cout<<a[x][y];
return 0;
}
有两列火车停反了位置该如何解决?
for(i=1;i<=n;i++) //对二维数组两行进行交换。
{
t=a[x][i];
a[x][i]=a[y][i]; //因为每行都有n个元素,所以一共需要交换n次。(循环n次)
a[y][i]=t;
}