文章目录
- 前言
- 一、多维数组的定义
- 二、多维数组的初始化
- 三、多维数组的使用(以二维数组为例)
- 1. 矩阵转置问题
- 三、课后练习
- 1. 求一个m*n矩阵中所有元素的累加和
- 2. 查找并输出一个m*n矩阵中的最小元素以及其在矩阵中的位置
- 3. 将m*n矩阵A复制为m*n矩阵B(深度复制)
- 4. n阶方阵的对角线元素求和
- 2. 螺旋方阵生成问题
- 总结
前言
本课主要介绍如下内容。
- 二维数组的定义
- 二维数组的初始化
- 二维数组的使用举例
一、多维数组的定义
二、多维数组的初始化
三、多维数组的使用(以二维数组为例)
1. 矩阵转置问题
A=a(i, j),A为一个
m
×
n
m \times n
m×n阶矩阵,若
B
=
A
T
B=A^T
B=AT,即B=b(j, i)=a(i, j),则称B为A的转置矩阵。
编写程序,输入一个
m
×
n
m \times n
m×n阶矩阵A,求
B
=
A
T
B=A^T
B=AT。
三、课后练习
1. 求一个m*n矩阵中所有元素的累加和
2. 查找并输出一个m*n矩阵中的最小元素以及其在矩阵中的位置
3. 将mn矩阵A复制为mn矩阵B(深度复制)
4. n阶方阵的对角线元素求和
n阶方阵对角线有两条对角线——主对角线和次对角线。编程分别求一个n阶方阵的两条对角线上元素之和。
A
=
(
a
11
a
12
a
13
a
14
a
21
a
22
a
23
a
24
a
31
a
32
a
33
a
34
a
41
a
42
a
43
a
44
)
(3)
A = \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14}\\ a_{21} & a_{22} & a_{23} & a_{24}\\ a_{31} & a_{32} & a_{33} & a_{34}\\ a_{41} & a_{42} & a_{43} & a_{44} \end{pmatrix} \tag{3}
A=
a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44
(3)
代码如下:
#include <iostream>
using namespace std;
int main() {
const int n=4;
int diagonal1=0, diagonal2=0;
int a[][n] = {
{60, 61, 62, 63},
{70, 71, 72, 73},
{80, 81, 82, 83},
{90, 91, 92, 93}
};
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cout << a[i][j] << ' ';
}
cout << endl;
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(i==j) diagonal1 += a[i][j];
if(i+j==n-1) diagonal2 += a[i][j];
}
}
cout << diagonal1 << ' ' << diagonal2 << endl;
return 0;
}
2. 螺旋方阵生成问题
所谓螺旋方阵,是值对任意给定的n,将1到
n
×
n
n \times n
n×n的数字从左上角第一个格子开始,按顺时针螺旋方向顺序填入
n
×
n
n \times n
n×n的方阵中,见图1所示。
图1 5阶螺旋方阵
代码如下(示例):
#include <iostream>
#include <iomanip>
//#include <cmath>
using namespace std;
//printing a screwing square matrix
int main() {
int k = 1; // 方阵递增数,从1开始
int m, n; // m:轮数, n:阶数
cin >> n; // 输入阶数
int matrix[n][n]; // 螺旋矩阵
// m = ceil(n/2.0); // 确定轮数
m = (n+1)/2;
// m轮顺时针圈
for(int i=0; i<m; i++) {
// 1.往右:x = i, y值从i开始递增
for(int y=i; y<n-i; y++)
matrix[i][y] = k++;
// 2.往下:注意x从i+1开始递增,y=n-1-i
for(int x=i+1; x<n-i; x++)
matrix[x][n-1-i] = k++;
// 3.往左:x = n-1-i, y从n-1-1-i递减
for(int y=n-2-i; y>=i; y--)
matrix[n-1-i][y] = k++;
// 4.往上:x从n-1-1-i递减到i+1, y=i
for(int x=n-2-i; x>=i+1; x--)
matrix[x][i] = k++;
}
cout << endl;
for(int x = 0; x < n; x++) {
for(int y = 0; y < n; y++)
cout << setw(8) << matrix[x][y];
cout << endl << endl;
}
return 0;
}
下面是当n=9时,程序输出的螺旋方正。
总结
二维数组在使用中也是按元素逐个使用,使用时要给出行、列两个下标。当然,我们也可以以访问一维数组的方式来访问二维数组。在较大型复杂的项目中,将二维数组转换为一维数组来运行却可以大大简化代码的书写,使代码更加简洁美观,看起来更加工整,提高可读性。特别是在使用二维数组作为函数参数传递的时候,通过将二维数组转换为一维数组的访问方式 ,就能起到提高函数通用性,简化代码编写的目的,具体可以参考本人整理的文章——《定义矩阵相乘和转置的通用函数》。