第14课 多维数组

本文详细介绍了二维数组的定义、初始化方法,并通过实例探讨了矩阵转置问题。此外,还提供了课后练习,如矩阵元素累加、查找最小元素、矩阵复制和计算对角线元素和生成螺旋方阵的代码示例。
摘要由CSDN通过智能技术生成


前言

本课主要介绍如下内容。

  1. 二维数组的定义
  2. 二维数组的初始化
  3. 二维数组的使用举例

一、多维数组的定义

二、多维数组的初始化

三、多维数组的使用(以二维数组为例)

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时,程序输出的螺旋方正。
9阶螺旋方阵


总结

二维数组在使用中也是按元素逐个使用,使用时要给出行、列两个下标。当然,我们也可以以访问一维数组的方式来访问二维数组。在较大型复杂的项目中,将二维数组转换为一维数组来运行却可以大大简化代码的书写,使代码更加简洁美观,看起来更加工整,提高可读性。特别是在使用二维数组作为函数参数传递的时候,通过将二维数组转换为一维数组的访问方式 ,就能起到提高函数通用性,简化代码编写的目的,具体可以参考本人整理的文章——《定义矩阵相乘和转置的通用函数》。

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值