内容正文:
第3课 数组2——二维数组
第二章│数组与链表
——2.1 数组,教材P34~45
新课程目标
1.理解二维数组的概念和特性。 2.掌握二维数组的基本操作。
目录
CONTENTS
教材整体感悟 知本与探源
01
02
命题整体感知 尝试与研析
01
教材整体感悟 知本与探源
教材整体感悟 知本与探源
1.二维数组的概念与特性
(1)二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。二维数组又称为________,行列数相等的矩阵称为方阵。
(2)用二维数组表示的数据在内存中的存储方式也采用顺序存储,每个元素在存储器中占用的空间大小相同,有_____________和____________两种:
①行优先存储:首先将第一行(行下标为0)数组元素按照列下标顺序依次存储,再将下一行(行下标为1)数组元素按照列下标顺序依次存储,直至
矩阵
行优先存储
列优先存储
教材整体感悟 知本与探源
所有行存储完毕。
②列优先存储:首先将第一列(列下标为0)数组元素按照行下标顺序依次存储,再将下一列(列下标为1)数组元素按照行下标顺序依次存储,直至所有列存储完毕。
教材整体感悟 知本与探源
2.二维数组的基本操作
(1)二维数组的创建:在系统内存中划分一块连续区域,用来保存数组包含的所有数据元素。在Python中使用列表实现二维数组有两种方式:
①直接定义。例如,a=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]。二维数组a定义后,其结构如图所示:
教材整体感悟 知本与探源
②间接定义。例如,创建一个6行5列的二维数组,元素值都为0,代码为a=[[0 for j in range(5)]______________________]。二维数组定义后,是一个6×5的矩阵,其结构如图所示:
for I in range(6)
教材整体感悟 知本与探源
(2)二维数组元素的访问:通过数组名和下标直接访问数组元素。二维数组的行、列下标均从0开始,即a[0][0]表示数组的第一个元素,则第i行第j列的元素表示为___________;访问第i行的元素表示为________。
a[i][j]
a[i]
教材整体感悟 知本与探源
本课核心点 ● 重难点
1.注意:若使用语句qb=[[0]*4]*4来创建,则在修改某行元素时,4行中同一列的数据会同时被修改。
2.方阵及特征
教材整体感悟 知本与探源
(1)方阵是指行和列相等的二维数组矩阵,从左上至右下的数归为主对角线,从左下至右上的数为副对角线。
(2)方阵的特征
①主对角线上元素a[i][j]的特征是: i=j。
②左下角元素a[i][j]的特征是:i>j。
③右上角元素a[i][j]的特征是:i<j。
④副对角线元素a[i][j]的特征是:i+j=n-1。
02
命题整体感知 尝试与研析
命题整体感知 尝试与研析
例1下列关于数组的说法中,正确的是( )
A.在计算机内部存储时,一维数组是线性存储,二维数组是非线性存储
B.对数组进行操作过程中,若某些数据元素已删除,其占用的存储空间也会被删除
C.用语句qp=[[0]*4]*4创建二维数组,修改某行元素时,4行中同一列的数据会同时被修改
D.同一数组元素的数据类型可以不相同
C
命题整体感知 尝试与研析
【解析】 选项A,数组数据属于线性结构,选项错误;选项B,数组元素删除时,存储空间固定不变,选项错误;选项D,数组的数据元素类型相同,选项错误。
命题整体感知 尝试与研析
变式1 下列关于数组的说法中,正确的是( )
A.非顺序存储结构的典型代表为数组
B.一维数组适合用来表示具有线性特征的数据系列
C.二维数组表示的数据在内存中以二维的形式存储
D.仅通过数组名就能访问数组中的某个元素
【解析】 数组中的数据按顺序存储,是一种线性结构数据,二维数组的数据以一维形式存储,数组元素的访问需通过数组名和下标位置进行访问,选项A、B、D错误。
B
命题整体感知 尝试与研析
例2利用一个4×4的二维数组qp存储和处理棋盘上每个黑、白棋子的信息,将所有数组元素的值初始化为0,下列创建二维数组qp的方法中,不符合要求的是( )
A.qp=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
B.qp=[[0 for i in range(4)]for j in range(4)]
C.qp=[[0]*4 for i in range(4)]
D.qp=[[0]*4]*4
D
命题整体感知 尝试与研析
【解析】 数组的创建可以直接定义或间接定义,选项D的创建方式,在修改某个元素值后,会改变整列的数值。
命题整体感知 尝试与研析
变式1 有如下Python程序段:
a=[[1]*3]*4
a[1][2]=6
执行该程序段后,a[3][2]的值为( )
A.0 B.1
C.4 D.6
D
命题整体感知 尝试与研析
【解析】 在修改某行元素时,4行中同一列的数据会同时被修改,选项D正确。
命题整体感知 尝试与研析
例3已知二维数组a=[[8,1,6],[3,5,7],[4,9,2]],则数组元素a[1][2]的值为( )
A.1 B.6
C.5 D.7
【解析】 数组元素通过数组名和下标访问,下标位置从0开始,a[1][2]访问二维数组a的第2行中的第3个元素,即为7。
D
命题整体感知 尝试与研析
变式1 已知二维数组a=[[1,3,5],[2,4,6],[7,8,9]],执行语句s=a[1][2]+a[2][1]后,变量s的值为( )
A.5 B.11
C.13 D.14
【解析】 a[1][2]访问二维数组第2行的第3个元素,a[2][1]访问二维数组的第3行的第2个元素,即6+8=14。
D
命题整体感知 尝试与研析
例4使用一个二维数组a存储m 行m列的数据(即用a[i][j])来表示第i行、第j列的数据,现要求使用一个Python 程序实现如下功能:在m×m的方阵中寻找一个2×2的子方阵,要求该子方阵的元素之和为最大,例如m=4,4×4的方阵如图1所示,则找到的2×2子方阵如下表中虚线框所示,和为145。程序的运行界面如图2所示:
命题整体感知 尝试与研析
实现上述功能的Python程序如下,请在横线处填入合适的代码。
m=int(input("输入方阵的规模: "))
输入方阵的规模:4
方阵为:
[30,19,47,24]
[27,32,24,50]
[42,12,22,16]
[14,27,39,23]
子方阵为:
47 24
24 50
子方阵之和为145
图2
命题整体感知 尝试与研析
#输入方阵中的数据,存储在数组a中,代码略
posx=posy=-1
print("方阵为: ")
for i in range(0,m):
print(a[i])
maxsum=sum1=0
for i in range(m-1):
命题整体感知 尝试与研析
① _____________
for j in range(m-1):
②__________________________________________________
if sum1>maxsum:
maxsum=sum1
posx=i
③ _______________
sum1=0
sum1=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1]
posy=j
命题整体感知 尝试与研析
print("子方阵为: ")
print(a[posx][posy],a[posx][posy+1])
print(a[posx+1][posy],a[posx+1][posy+1])
print("子方阵之和为: ",maxsum)
【解析】 本题利用枚举算法对所有的相邻四格数据之和sum1进行逐一判断,如果sum1>maxsum,则记录当前的最大和maxsum,并记录子方阵左上角的位置posx和posy,在求子方阵的和之前,需初始化sum1的
命题整体感知 尝试与研析
值为0,因此①处代码为sum1=0。本题的难点是用二维数组表示相邻四格数据的位置,如子方阵左上角的元素为a[i][j],则它的相邻右元素为a[i][j+1],它的正下方元素为a[i+1][j],它的右下元素为a[i+1][j+1],横线②处代码的功能是求当前子方阵的和,因此②处代码为sum1=a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1],横线③处的功能是记录子方阵的左上角元素的列位置,因此③处代码为posy=j。
命题整体感知 尝试与研析
变式1 [2023·湖州中学检测]某音乐平台可以为用户推荐歌曲,推荐歌曲的算法如下:
第1步:系统根据用户的听歌行为,使用-2~5进行量化,单曲循环=5,分享=4,收藏=3,主动播放=2,听完=1,未听=0,跳过=-1,拉黑=-2,量化值大于0表示喜欢,建立如下表所示的数据。
命题整体感知 尝试与研析
第2步:分别计算待推荐用户与其他每位用户的听歌相似度(相似度=两位用户同时喜欢的歌曲数/两位用户中至少有一位喜欢的歌曲数)。
《孤勇者》 《如愿》 《后会无期》 《NUNA》 《蜗牛》 《心墙》 《对你说》 《与天齐》 《栀子花开》 《风吹半夏》 …
HelloK 0 4 2 0 0 1 0 -1 3 0 …
sime32 2 0 0 1 0 0 0 0 0 4 …
yigoo 0 3 0 -1 1 0 0 2 0 1 …
lucky 1 1 0 0 0 2 0 0 0 1 …
halbo 0 0 1 0 0 0 2 0 4 0 …
baby 0 2 0 -2 5 0 0 1 0 0 …
HaiT 3 0 0 0 0 1 0 0 0 1 …
bao_66 -1 0 1 0 0 -2 3 0 0 2 …
命题整体感知 尝试与研析
第3步:分别计算其他用户对每一首歌曲的推荐度(推荐度=某位用户该歌曲的量化值*两位用户的相似度)。
第4步:在其他用户所有量化值大于0的歌曲中找到推荐度最高的,且待推荐用户没有听过的歌曲,推荐给该用户。
小明用Python程序模拟了此推荐算法,请回答下列问题:
(1)在图1所示的10首歌曲中,“yigoo”与“lucky”两位用户的相似度为 _________ (四舍五入,保留两位小数)。
0.33
命题整体感知 尝试与研析
(2)实现上述功能的Python程序如下,运行结果如图1所示,请在横线处填入合适的代码。
def find(name,user):
#代码略
图1 图2
命题整体感知 尝试与研析
def simalar(music,data,k): #计算相似度
xsd=[0]*len(data)
for i in range(len(data)):
ms1=ms2=0
for j in range(len(music)):
if k!=i:
if data[k][j]>0 and data[i][j]>0:
命题整体感知 尝试与研析
ms1+=1
if ①___________________________:
ms2+=1
if ms2>0:
xsd[i]=ms1/ms2
return xsd
music=[”《孤勇者》”,”《如愿》”,”《后会无期》”,”
data[k][j]>0 or data[i][j]>0
命题整体感知 尝试与研析
《NUNA》”,”《蜗牛》”,”《心墙》”,”《对你说》”,”《与天齐》”,”《栀子花开》”,”《风吹半夏》”]
user=[”HelloK”,”sime32”,”yigoo”,”lucky”, ”halbo”,”baby”,”HaiT”,”bao_66”]
#读取听歌行为的量化数据存入data列表,如图2所示
name=input(”请输入您的用户名: ”)
命题整体感知 尝试与研析
k=find(name,user) #调用find()函数返回该用户在data列表中的索引号
xsd=simalar(music,data,k) #xsd[0]表示0号用户与k号待推荐用户的相似度
maxm=0
for i in range(len(data)):
for j in range(len(music)):
if data[k][j]==0 and data[i][j]>0:
命题整体感知 尝试与研析
like=② ___________________
if like>maxm:
maxm=like
p=j
print(”为您推荐的歌曲是: ”,③______________)
【解析】 (1)都喜欢的有2首,两位用户中至少有一位喜欢的歌曲数有6首。
(2)①ms1表示都喜欢的数量,ms2表示两位用户中至少有一位喜欢的歌
xsd[i]*data[i][j]
music[p]
命题整体感知 尝试与研析
曲数,k表示目标用户,i是所有用户的遍历,j是歌曲遍历,data列表存储听歌行为的量化数据,故答案为:data[k][j]>0 or data[i][j]>0;②like为推荐度,推荐度=某位用户该歌曲的量化值×两位用户的相似度,xsd列表存储与k号待推荐用户的相似度,故答案为xsd[i]*data[i][j];③p记录推荐歌曲的位置。
命题整体感知 尝试与研析
|随|堂|检|测|
1. 下列说法中不属于数组的特性的是( )
A.同一个数组中,每个数组元素的类型是相同的
B.数组适用于数据规模可预估且在处理过程中保持稳定的问题
C.通过数组名和下标可以对数组中任意位置的数组元素进行高效的访问
D.一维或二维数组的程序在使用前均需先初始化
D
命题整体感知 尝试与研析
【解析】 数组的特性有:数组元素的数据类型相同,可通过数组名和下标对数组元素的值进行访问,存储空间固定不变,初始化需在数组创建时完成。
命题整体感知 尝试与研析
2.小福将我国部分省份及省会城市存储到二维数组中,并依次输出各省及其省会名称,例如“湖南省的省会城市是长沙市”。实现该功能的Python程序段如下:
a=[["浙江省","杭州市"],["吉林省","长春市"],["湖南省","长沙市"],["湖北省","武汉市"],["江苏省","南京市"],["广东省","广州市"]]
for p in range(len(a)):
print(① +"的省会是"+② )
命题整体感知 尝试与研析
则①、②处填入的代码分别为( )
A.①p[1] ②p[0] B.①p[0] ②p[1]
C.①a[p][0] ②a[p][1] D.①p[1] ②p[2]
【解析】 数组元素的访问是通过数组名和下标实现,循环变量p遍历二维数组的元素,p为一维数组,直接以数组和下标方式进行访问。
C
命题整体感知 尝试与研析
3.有一个7行6列的数组a,其中每个元素占2个存储单元,将其按列优先存储在起始地址为1024的内存单元中,第4行第5列的元素的起始存储地址是( )
A.1068 B.1086
C.1084 D.1066
【解析】 a是一个二维数组,存储时按列优先,并且每个元素占据两个存储单元,有如下计算公式:1024+((5-1)×7)+4-1)×2=1086。
B
命题整体感知 尝试与研析
4.小金和小兰用m 行n 列的随机整数(1~10)矩阵num 做游戏。游戏规则:在所有行和列中取一行一列,将所取行、列中的数字相加求和,相同位置不重复计算,和大的赢;若和相同的情况下,行列数相加更大的赢。请你设计一个算法帮助他们快速地计算所有情况中和最大的行列组合来赢得游戏,并回答下列问题。程序运行界面如下图所示:
命题整体感知 尝试与研析
import random
m=int(input('请输入行数m: '))
n=int(input('请输入列数n: '))
num=[]
s=0
max=0
maxrow=0
命题整体感知 尝试与研析
maxcol=0
for i in range(m):
num.append([])
for j in range(n):
num[i].append(random.randint(1,10))
print(num)
for i in range(m):
命题整体感知 尝试与研析
for j in range(n):
for k in range(n):
①____________________________________
for l in range(m):
s+=num[l][j]
s=②____________________
if ③________________________:
s=s+num[i][k] 或s+=num[i][k]
s-num[i][j]
max<=s或max<s
命题整体感知 尝试与研析
max=s
maxrow=i+1
maxcol=j+1
s=0
print('取第',maxrow,'行','第',maxcol, '列, ','最大值是: ',max)
命题整体感知 尝试与研析
(1)若输入m的值为2、n 的值为3,且矩阵为[[3,5,6],[4,7,8]],则最后得到的最大值为__________。
(2)请在横线处填入合适的代码。
【解析】 (1)第2行、第3列和最大。
(2)①k循环按行遍历列,将该行的值累加;②重叠位置的值计算了2次,减去一次;③求解最大值,如果最大值小于当前值,则更新信息。
25
感谢聆听,再见!
$$