2.1 数组 课件 2022—2023学年浙教版(2019)高中信息技术选修1(22张PPT)

文档属性

名称 2.1 数组 课件 2022—2023学年浙教版(2019)高中信息技术选修1(22张PPT)
格式 pptx
文件大小 3.9MB
资源类型 教案
版本资源 浙教版(2019)
科目 信息技术(信息科技)
更新时间 2022-10-11 10:24:57

图片预览

文档简介

(共22张PPT)
XX中学
数组
新课导入
现实中表示一批数据,不仅需要描述数据对象本身,还需要描述数据所处的位置或数据之间的前后顺序关系,可以采用数组这种数据结构来实现。
第一个是李彤;
第二个是张强;
第三个是胡洁;
第四个是杜刚。
如何描述如图所示的队伍?采用何种数据结构?
a[1] = “李彤”
a[2] = “张强”
a[3] = “胡洁”
a[4] = “杜刚”
数组组织数据,既可根据下标任意访问序列中的某个元素,又可通过下标按序遍历序列中的所有元素。
数组
数组是由相同类型的变量构成的一个序列。数组使用标识符命名(数组名),用编号区分数组中的各个变量(下标或索引),由数组名和下标组成的数组的各个变量称为数组的分量,也称数组元素。
创建数组时系统会分配一块连续的存储空间,每个数组元素按照下标顺序依次存储,数组名指向第一个数组元素存储的位置。
已知数组中第一个元素存放的位置是LOC(0),每个元素占用的存储空间大小为s,则元素a[i]的存放位置是?
LOC(i) = LOC(0) + s * i
牛刀小试
一个数组的第一个元素的存储位置为1000(表示在第1000个字节处),每个元素所占空间大小为8个字节,则第5个元素的位置是?
1000 B. 1040 C. 1032 D. 1256
C
存储结构
计算机中数据的存储结构主要分为顺序存储结构和非顺序存储结构。
顺序存储结构:逻辑上相邻的数据节点存储在物理位置相邻的存储单元中,如数组;
非顺序存储结构(链式存储结构):逻辑上相邻的数据节点在内存中分开存储,节点间的前后关系由节点中的指针来确定,如链表。
二维数组
二维数组中的数据元素有行、列两个维度的位置信息,因此需要两个下标来表示。其中,用第一个下标表示行位置,用第二个下标表示列位置。
qp[0][0] = 0
qp[0][1] = 1
qp[0][2] = 0
qp[0][3] = 0
qp[1][0] = 1
qp[1][1] = 2
qp[1][2] = 2
qp[1][3] = 0
……
二维数组的存储
二维数组在内存中采用顺序存储,有行优先存储和列优先存储两种方式。
数组名指向数组中第一行第一个元素存储的位置,其它数组元素可通过下标快速得到。
0
1
0
0
1
2
2
0

[0][0]
[0][1]
[0][2]
[0][3]
[1][0]
[1][1]
[1][2]
[1][3]
...
0
1
0
0
1
2
2
2

[0][0]
[1][0]
[2][0]
[3][0]
[0][1]
[1][1]
[2][1]
[3][1]
...
行优先存储
列优先存储
牛刀小试
按行优先顺序存储二维数组,已知数组中第一个元素存放的位置是LOC(a[0][0]),最大列数为C,最大行数为R,每个元素占用的存储空间大小为s,则元素a[i][j]的存放位置是?若按照列优先存储呢?
二维数组a中,每个元素所占空间大小为8个字节,行下标i从0到5,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素a[2][3]的起始地址是?
A. SA+160 B. SA+136 C. SA+184 D. SA+168
C
行优先存储:LOC(a[i][j]) = LOC(a[0][0])+(i*C+j)*s
列优先存储:LOC(a[i][j]) = LOC(a[0][0])+(j*R+i)*s
数组的特性
数组元素的数据类型相同。
定义数组后,系统会根据每个数组元素的数据类型和总元素个数,在内存中开辟一段地址连续且空间固定的存储空间,若数据类型不同,访问时容易出错。
通过数组名和下标对数组元素的值进行访问。
系统根据下标和数据类型自动计算内存地址以访问数组元素。
存储空间固定不变。
数组一旦创建,存储空间固定不变。即使数组中某些元素已经删除后,占用的空间仍会保留。
静态数组
元素数量在数组定义时已经确定,在程序运行过程中不会发生改变,适用于数据规模可预估且在处理过程中保持稳定的问题。
动态数组
数组定义时没有确定数据规模,可以在任何时候更改数据规模。
数组VS列表
当列表中每个数据元素所含数据项的数量和数据类型均相同时,可将该列表视作数组,列表索引视作数组下标。
数组中元素的存储是连续的,列表中元素的存储一般情况下是非连续的。
数组的创建:一维数组
数组的创建:在系统内存中划分一块连续的存储区域,用来保存数组所含的所有数据元素。
静态数组创建需指明数组中数据元素的类型和数量,系统会根据类型和数量自动计算出所需容量并进行内存分配,同时给数组中所有元素赋初值。
num = [0]*10
print(num)
num = [0 for i in range(10)]
print(num)
创建长度为10的整型数组,初始化元素值均为0
num = [i for i in range(10)]
print(num)
数组的创建:二维数组
直接定义法:适合创建规模较小的二维数组。
间接定义法:适合创建规模较大的二维数组。
创建3行3列的二维数组,初始化元素值均为0
num = [[0,0,0],[0,0,0],[0,0,0]]
for i in range(len(num)):
print(num[i])
num = [[0 for i in range(3)] for j in range(3)]
for i in range(len(num)):
print(num[i])
num = [[0]*3 for j in range(3)]
for i in range(len(num)):
print(num[i])
num = [[0]*3]*3
num[1][2] = 1
for i in range(len(num)):
print(num[i])

数组元素的访问
数组元素可通过数组名和下标快速定位其内存地址,因此可通过数组名和下标直接进行访问。
一维数组访问第i个元素:num[i-1]
二维数组访问第i行第j列个元素:num[i-1][j-1]
访问一维数组
访问二维数组
from random import randint
num = [randint(1,10) for i in range(5)]
print(num)
print(num[3])
num = [[1,2,3],[4,5,6],[7,8,9]]
for i in range(len(num)):
print(num[i])
print(num[1][2])
数据合并问题
a[0] a[1] a[2] a[3] a[4] b[0] b[1] b[2] b[3] b[4]
19 16 12 8 5 20 15 14 10 4
c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9]
20
19
16
15
14
12
10
8
5
4
数据合并问题
程序 备注
from random import randint
a = [0]*20
b = [0]*15
c = [0]*35 初始化a、b、c三个数组,数组长度分别为20、15、35。
a[0] = randint(95, 100)
for i in range(1, 20): # 随机产生降序数据序列一
a[i] = a[i-1] - randint(1, 5) 生成a数组序列:
[99, 97, 95, 94, 90, 87,83,79, 78, 73, 71, 69, 67, 66, 61,60, 56, 55, 52, 51]
b[0] = randint(95, 100)
for i in range(1, 15): # 随机产生降序数据序列二
b[i] = b[i-1]-randint(1, 5) 生成b数组序列:
[99, 96, 94, 91, 90, 88, 87,
82, 80, 79, 75, 73, 70, 66,62]
print("原始数据序列一为:")
print(a)
print("原始数据序列二为:")
print(b)
数据合并问题
程序 备注
while i < 20 and j < 15: #合并数据至某数组合并完成
if a[i] >= b[j]:
c[k] = a[i]
i, k = i+1, k+1
else:
c[k] = b[j]
j, k = j+1, k+1 C数组序列:j=15,i=14
[99,99,97,96,95,94,94,91,90,90,88,87,87,83,82,80,79,79,78,75,73,73,71,70,69,67,66,66,62,0,0,0,0,0,0]
while i < 20: #当数据序列一中还有数据时的处理
c[k] = a[i]
i, k = i+1, k+1 C数组序列:j=15,i=20
[99,99,97,96,95,94,94,91,90,90,88,87,87,83,82,80,79,79,78,75,73,73,71,70,69,67,66,66,62,61,60,56,55,52,51]
while j < 15: #当数据序列二中还有数据时的处理
c[k] = b[j]
j, k = j+1, k+1
print("合并后的数据序列为:\n", c) 输出合并后的C数组序列
数组元素的插入
当需要在数组中某个位置插入一个新数据时,必须先将该位置及其后的所有数据依次向后移动一位,在保证顺序不变的前提下保存这些数据,最后再修改该位置上的数据为新数据。
已知数组a所占存储空间为len(a),其实际元素个数为n。当nfor i in range(n, p, -1):
a[i] = a[i-1]
a[p] = x
n += 1
a.insert(i,x):在列表a中下标为i的位置插入元素x
a.append(x):在列表a末尾添加元素x
a = [1,2,3,4,5]
a.insert(2,10)
a.append(20)
print(a)
数组元素的删除
要删除数组中的某个元素,只需将其后的所有元素依次前移一位,并将数组长度减一即可。
注:若数组的实际长度为n,删除元素只是让n减1,并不改变数组所占用的存储空间。
已知数组a的实际长度为n,删除下标为p的数组元素?
a.pop(i):删除列表a中下标为i的元素,若是i省略,则默认为-1,即删除最后一个元素
for i in range(p, n-1):
a[i] = a[i+1]
n -= 1
a = [1,2,3,4,5]
a.pop(2)
a.pop()
print(a)
使用数组组织、存储数据时应尽量避免数组元素的增加或删除操作。
车牌摇号系统
尝试编写程序,实现从20个申请人编号(存储在文件bh.csv中)中抽取m个(待输入)车牌进行发放。
车牌摇号系统
程序 备注
from random import randint
luck = [""] * 20 # 初始化一个包含20个数据元素的数组
csv_file = open("bh.csv", "r", encoding="utf-8")
flines = csv_file.readlines() # 按行读取文件编号
csv_file.close 测试结果1:
请输入发放数:6
201997443642
201980097534
201976324666
201943067402
201997641213
201953603658
i = 0
for one_line in flines:
tmp = one_line.strip("\n") # 去除每行末尾的换行符
luck[i] = tmp # 按读取顺序将编号赋给luck[i]
i = i + 1 m = int(input("请输入发放数:"))
c = 0
while c < m:
k = randint(0, 19)
if luck[k] != "": # 判断luck[i]是否已被抽取
c = c + 1
print(luck[k])
luck[k] = "" # 表示该位置编号已被抽取 测试结果2:
请输入发放数:4
201997641213
201939040730
201923447327
201953603658
车牌摇号系统—优化
程序 备注
from random import randint
luck = [] # 新建列表
csv_file = open("bh.csv", "r", encoding='utf-8')
flines = csv_file.readlines() # 按行读入编号
csv_file.close 测试结果1:
请输入发放数:6
201993396076
201952182987
201948499683
201994656345
201900111228
201953603658
n = 0 # 记录编号总数
for one_line in flines:
tmp = one_line.strip("\n") # 去除末尾换行符
luck.append(tmp)
n += 1 m = int(input("请输入发放数:"))
for i in range(m):
k = randint(0, n-1)
print(luck[k])
luck.pop(k) # 编号抽取后删除
n -= 1 测试结果2:
请输入发放数:3
201952939329
201943067402
201948499683
m = int(input("请输入发放数:"))
line=random.sample(luck, m) #从luck中随机挑选m个元素
for i in line:
print(i)
感谢聆听
Thanks to listen