一、二维数组的定义
int a[3][2]; //定义了一个整数的二维数组,3 行 2 列
double b[3][3][2]; //定义了一个浮点数的三维数组,3 个维度的长度分别是 3、3、2
二、二维数组的初始化
1、在定义的时候使用初始化列表
int a[3][2] = { { 1, 3 }, { 5, 7 }, { 9, 11 } };
或者
int a[3][2] = { 1, 3, 5, 7, 9, 11 };
4、数组定义后,可以通过循环语句进行初始化
例:初始化一个 5 行 10 列的二维数组
const int m = 5, n = 10;
int a[m][n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = ... //根据实际需要写表达式
}
}
三、二维数组的输入输出
1、输入
例:输入 50 个整数 到
一个 5 行 10 列的二维数组
const int m = 5, n = 10;
int a[m][n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
如果一个数组既没有输入,也没有初始化,那么数组元素的值不可以用。
2、输出(每列元素之间有一个空格,每行输出完毕后换行)
如果 int a[3][2] = { { 1, 3 }, { 5, 7 }, { 9, 11 } };
那么输出格式应该是
1 3
5 7
9 11
例:假设一个 m 行 n 列的数组已经初始化了,输出这个数组
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << a[i][j];
if (j == n - 1)
{
cout << endl;
//到一行的最后一列,不需要空格,直接换行
}
else
{
cout << " ";
//不是一行的最后一列,留空格,以间隔开下一个元素
}
}
}
四、动态定义二维数组
1、动态定义二维数组
如果数组的长度 m、n 是程序运行时输入的,那么不可以采用 int a[m][n]的方式来定义数组。
例:输入 m 和 n,定义一个 m 行 n 列的二维整型数组 a。
int m, n;
cin >> m >> n;
int** a = new int* [m];
for (int i = 0; i < m; i++)
{
a[i] = new int[n];
}
2、回收动态定义的二维数组
只有通过 new 语法动态定义的二维数组才可以使用 delete 语法回收。
例:回收之前定 义的 m 行 n 列的二维数组 a:
for (int i = 0; i < m; i++)
{
delete[]a[i];
}
delete[]a;
定义动态二维数组
定义动态一维数组
回收二维数组
回收一维数组
3、变通的方法
输入 m 和 n(1<=m<=100,1<=n<=100),定义一个 m 行 n 列的二维整型数组 a。
由于数组最大就 100 行 100 列,而且不占用太多内存,所以可以定义为 int a[100][100];
二维数组例题——
注意到
每当 i 的值多 1 时,数组元素的值多 5(上下两个元素的差值);
每当 j 的值多 1 时, 数组元素的值多 1(左右两个元素的差值)。
所以 a[i][j]的值肯定是 5*i+1*j+某个常数。
把 a[0][0]=1 代入,就可以求出那个常数的值为 1。
所以 a[i][j]=5*i+j+1。
#include<iostream>
using namespace std;
int main()
{
const int m = 5, n = 5;
int a[m][n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = i * n + j + 1;
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << a[i][j];
if (j == n - 1)
{
cout << endl;
}
else
{
cout << "\t";
}
}
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
//定义 m 行 n 列的二维数组
int m, n;
cin >> m >> n;
int** a = new int* [m];
for (int i = 0; i < m; i++)
{
a[i] = new int[n];//一维数组定义:int *a = new int[n];
}
//为数组各元素赋值
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (i == 0 || j == 0)
{
a[i][j] = 1;
}
else
{
a[i][j] = a[i - 1][j] + a[i][j - 1];
}
}
}
//输出
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << a[i][j];
if (j == n - 1)
{
cout << endl;
}
else
{
cout << " ";
}
}
}
//回收空间!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
for (int i = 0; i < m; i++)
{
delete[]a[i];//delete 先释放j再释放i
}
delete[]a;
return 0;
}
4、二维数组 的应用,将一个2*3矩阵转置变成3*2矩阵
#include<iostream>
using namespace std;
int main()
{
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int brr[4][3] = {};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
brr[j][i] = arr[i][j];
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
cout << brr[i][j];
}
cout<<endl;
}
}
6、有一个3*4的矩阵,求出最大的元素,和其对应的行号和列号
法一——
int main()
{
int arr[3][4] = { 12,23,3,4,56,62,7,81,89,10,11,12 };
int max = 0;
int max_i = 0;
int max_j = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (arr[i][j] > max)
{
max = arr[i][j];
max_i = i;
max_j = j;
}
}
}
cout<< max<< max_i<< max_j;
}
法二——
void fun1(int arr[3][4],int low)
{
int max = arr[0][0];
int c = 0;
int d = 0;
for (int i = 0; i <low; i++)
{
for (int j = 0; j < 4; j++)
{
if (arr[i][j] > max)
{
max= arr[i][j];
c = i;
d = j;
}
}
}
printf("%d %d\n", c, d);
}
int main()
{
int arr[3][4] = { 12,23,3,4,56,62,7,81,89,10,11,12 };
int low = sizeof(arr) / sizeof(arr[0]);//计算行数
fun1(arr,low);
}
行可以省略 列不能省略!!!!!!!!!!!!!!!!!!!!!!!!!!!!