二维数组基础题(题解)

二维数组简介

二维数组是一种特殊类型的数组,它允许以表格(行和列)的形式存储数据。以下是对二维数组的详细介绍:

定义与结构

  • 定义
    二维数组是一种数据结构,其元素本身为一维数组。在C++等编程语言中,二维数组可以被视为数组的数组,即数组的数组名[行号][列号]
  • 结构
    二维数组由多个一维数组组成,这些一维数组在内存中连续存储。每个一维数组代表二维数组中的一行,而一维数组中的元素则代表该行中的列

声明与初始化

  • 声明
    在C++中,二维数组的声明格式通常为数据类型 数组名[常量表达式1][常量表达式2],其常量表达式1表示第一维(行)的长度,常量表达式2表示第二维(列)的长度
  • 初始化
    二维数组可以在声明时进行初始化,也可以逐个元素地进行赋值。初始化时,可以使用嵌套的花括号来指定每个一维数组(即每行)的元素值

内存存储与访问

  • 内存存储
    二维数组在内存中是连续存储的,这种存储方式有助于提高数据访问的效率。连续的内存地址可以更快地被CPU访问,从而加快程序的运行速度
  • 访问方式
  • 通过指定行号和列号来访问二维数组中的元素。例如,在C语言中,可以使用“数组名[行号][列号]”的方式来访问二维数组中的特定元素

应用与实例

  • 应用
    二维数组在图像处理、游戏开发等领域有着广泛的应用。例如,在图像处理中,一个图像可以被表示为一个二维数组,其中每个元素代表图像中的一个像素。在游戏开发中,二维数组常用来表示游戏世界中的地图或者棋盘
  • 实例
  • 以下是一个简单的C++程序示例,展示了如何声明、初始化和访问二维数组
#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;

signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
	int shuzu[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 定义和初始化
	// 注意,数组的下标从0开始。第一个中括号表示该二维数组含有的一维数组数量,第二个中括号表示每个一维数组的元素个数。注意控制好元素个数,以免下标越界
	cout << shuzu[2][1] << endl; // 将会输出 8
}

在这个例子中,我们声明了一个33列的整型二维数组,并使用嵌套的大括号初始化了它的元素。然后,我们通过数组[2][1]访问了数组中第三行第二列的元素,并打印出了它的值(8)。

测试数据

注意事项

  • 越界问题
    在访问二维数组时,需要注意不要越界。如果尝试访问不存在的行或列,将会导致程序崩溃或产生未定义的行为
  • 初始化问题
    在初始化二维数组时,需要确保提供的元素数量与数组的大小相匹配。如果提供的元素数量少于数组的大小,则未初始化的元素将具有不确定的值

综上所述

二维数组是一种强大且灵活的数据结构,它允许以表格的形式存储和组织数据。通过深入理解和正确使用二维数组,可以编写出更加高效和可靠的程序。

二维数组练习题+详解

为了更好地理解二维数组,我上网找到了一道题目,将以此题作为样例讲解二维数组
题目
题目图片

读题与分析

题目中说到相邻的八个数,仔细观察它们的位置。
这时我们发现这几个数对于指定的坐标数的相对位置,也就是行和列有变化规律,例如:

  • 在正上方的数相对于指定数就是行数减一,列不变
  • 在正下方的数相对于指定数就是行数加一,列不变
  • 在右上方的数相对于指定数就是行数加一,列加一
  • ……
    发现了规律,再加入二维数组,题目就变得好做了

编程实现

首先,写好祖传的头文件、宏命令和main函数:

#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;

signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
}

接下来是定义和输入
输入时注意行和列的遍历,小心越界

int h, l, hh, ll; // 本人懒了,h l是行列数,hh ll是指定的数的坐标
int a[100][100] = {}; // 定义二维数组+初始化(初始化为零)
cin >> h >> l >> hh >> ll; // 输入数据
for(int i = 0; i < h; ++i){ // 循环行的个数
	for(int j = 0; j < l; ++j){ // 循环列的个数
		cin >> a[i][j]; // 输入数据(数组元素)
	}
}

数据保存完毕,然后是处理数据:访问目标位置周围的八个数字
存储下来后在求和

//  打表中......
    int c = a[hh - 1][ll - 1] + a[hh + 1][ll + 1]; // 左上+右下
    int d = a[hh - 1][ll + 1] + a[hh + 1][ll - 1]; // 右上+左下
    int f = a[hh + 1][ll] + a[hh][ll + 1]; // 正上+正右
    int g = a[hh - 1][ll] + a[hh][ll - 1]; // 正下+正左

数据存储完了,剩下的只剩求和、输出了
上代码:

    cout << c + d + f + g;

整理下思路,最后放完整代码

#include<bits/stdc++.h> // c++万能头文件
#define int long long // 宏命令,可省略
using namespace std;

signed main(){ // 因为将int定义为“long long”,mian函数返回值类型要改变
	int h, l, hh, ll; // 本人懒了,h l是行列数,hh ll是指定的数的坐标
	int a[100][100] = {}; // 定义二维数组+初始化(初始化为零)
	cin >> h >> l >> hh >> ll; // 输入数据
	for(int i = 0; i < h; ++i){ // 循环行的个数
		for(int j = 0; j < l; ++j){ // 循环列的个数
			cin >> a[i][j]; // 输入数据(数组元素)
		}
	}
	int c = a[hh - 1][ll - 1] + a[hh + 1][ll + 1]; // 左上+右下
    int d = a[hh - 1][ll + 1] + a[hh + 1][ll - 1]; // 右上+左下
    int f = a[hh + 1][ll] + a[hh][ll + 1]; // 正上+正右
    int g = a[hh - 1][ll] + a[hh][ll - 1]; // 正下+正左
    cout << c + d + f + g;
}

我们提交代码看看:
满分
获得了满分,看来二维数组我们已经初步掌握了,相信大家都学会了

点我!-> 更多题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心-远-地-自-偏

天生我材必有用,千金散尽还复来

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值