一、 数组及其基本操作同步学案(课件+学案) 2025-2026学年高中信息技术 选择性必修1 数据与数据结构

资源下载
  1. 二一教育资源

一、 数组及其基本操作同步学案(课件+学案) 2025-2026学年高中信息技术 选择性必修1 数据与数据结构

资源简介

一、 数组及其基本操作
1. 数组的概念
(1)数组在内存中的存储方式为顺序存储。
(2)数组是由相同类型的变量构成的一个序列。
(3)数组名和下标组成数组的各个变量称为数组的分量,也称为数组元素。
(4)创建数组时,系统会在内存中分配一块连续的存储空间,每个数组元素按照下标顺序存储。
(5)一维数组:只有一个下标,下标用来表示数据元素在该序列中的位置。
(6)二维数组:有两个下标,表示数据元素在该序列中的行、列位置,二维数组有行优先存储和列优先存储两种方式。
2. 数组的特性
(1)数组元素的数据类型相同。
(2)通过数组名和下标对数组元素的值进行访问。
(3)存储空间固定不变。
归纳总结
数组在创建时就分配好了存储空间,即其占用空间已固定,因此删除数组中的元素后,其占用的空间不变。
3. 数组的基本操作
(1)数组的创建。
数组的创建实质是在系统内存中划分一块连续区域,用来保存数组所含的所有数据元素。
(2)数组元素的访问。
①数组元素的访问,指的是寻址到特定的数据元素,并根据存储地址对该数据元素进行读取、修改等操作。
②数组元素可以通过数组名和下标直接进行访问。
(3)数组元素的插入与删除。
①当数组中某个位置要插入一个新数据时,必须先将该位置及后面的所有数据向后移动一个位置,然后将新数据插入。
例如,在数组元素a[1]前插入一个新数据datax,操作后的数组a如图所示。
②删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置。
例如,删除数组元素a[1]后的数组如图所示。
4. Python列表常用函数和方法
在Python中,常用列表来模拟实现数组的操作。
Python列表常用函数和方法
函数和方法 功能 实例
len(list1) 统计列表list1中元素的个数 list1=[1,2,3,4] print(len(list1)),输出为4
list1.append(x) 在列表list1末尾添加元素x list1=[1,2,3,4] list1.append(5) 列表中的内容为[1,2,3,4,5]
list1.insert(i,x) 在列表list1中下标为i位置处插入元素x list1=[1,2,3,4] list1.insert(2,5) 列表中的内容为[1,2,5 3,4]
list1.pop(i) 将列表list1中下标为i的元素删除;若i不指定,默认为-1,即删除最后一个元素 list1=[1,2,3,4] list1.pop() 列表中的内容为[1,2,3]
【例1】 (2024·浙江1月选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
a[x]=temp
A. a[i+1]=a[i] B. a[i-1]=a[i]
C. a[i]=a[i+1] D. a[i]=a[i-1]
【解析】 本题考查数组元素的移动操作。此算法实现的功能是将数组末尾元素a[n-1]移动到指定位置x。因此需要将下标位置范围为[x,n-2]区间内的元素整体向后移动一位。具体方式如下:
元素值 0 3 4 6 7
下标 x n-1
初始化
元素值 0 3 4 6 6
下标 x n-1
第1步:将6向后移一位覆盖7
元素值 0 3 4 4 6
下标 x n-1
第2步:将4向后移一位覆盖6
此时下标x所对应的位置空出,可以插入a[n-1]:
元素值 0 3 7 4 6
下标 x n-1
第3步:将7插入下标x处
因此移位的方向是前面的元素覆盖后面的元素,且参与移位的元素最左侧为下标x。
【例2】 (2024·浙江6月选考)某监控设备可定时采集红绿信号灯的状态数据,数据格式记为[a,b],其中a、b分别为红灯和绿灯的状态值,0表示灯灭,1表示灯亮,如[0,1]表示红灯灭、绿灯亮。现要编写程序,每隔1秒采集并检测信号灯是否存在如下异常状态:
第一类,红绿灯同时亮或同时灭;
第二类,红灯或绿灯超时,即保持同一状态的时长大于上限值(如300秒)。检测到异常状态时就发送相应信息。请回答下列问题:
(1)若检测到“红绿灯同亮”的异常,则采集到的数据是 D (单选,填字母)。
A. [0,0] B. [0,1]
C. [1,0] D. [1,1]
(2)实现上述功能的部分Python程序如下,请在画线处填入合适的代码。
tlimit = 300   # 设置信号灯保持同一状态的时长上限值
pre = [-1,-1]
t = [0,0] # t[0]、t[1]分别记录红灯、绿灯保持同一状态的时长
while True:
  # 接收一次采集到的状态数据,存入d,代码略
  if ① d[0]==d[1] :
    if d[0] == 1:
      # 发送“红绿灯同时亮”信息,代码略
    else:
      # 发送“红绿灯同时灭”信息,代码略
  for i in ② range(2)或range(len(pre))或range(len(d)) :
    if d[i] == pre[i]:
      t[i]+= 1
      if ③ t[i]>tlimit :
        if i == 0:
         # 发送“红灯超时”信息,代码略
        else:
         # 发送“绿灯超时”信息,代码略
    else:
      t[i] = 1
  pre = d
  # 延时1秒,代码略
【解析】 本题考查Python程序设计。(1)根据题意0表示灯灭,1表示灯亮可知,红绿灯同时亮需表示为[1,1],D正确。(2)程序①处需判断红绿灯是否处于相同状态,若d[0]和d[1]的值相等,同时d[0]=1,表示红绿灯同时亮;否则d[0]=0,表示红绿灯同时灭,故①处代码为“d[0]==d[1]”。②处相关代码的功能为读取一次数据存列表d后需遍历d,故i取值01,故②处代码为“range(2)”。若d[i]=pre[i],表示i所对应的红绿灯相邻两个时刻的状态相同,则相应的红绿灯时长t[i]计数;若时长超过上限值,则表示异常状态;若此时i=0,则表示红灯异常,否则表示绿灯异常,故③处代码为“t[i]>tlimit”。
【例3】 (2024·浙江7月学考)小张收集了章回体小说《三国演义》的第1章至第120章的120个文件,其文件名依次为sg1.txt、sg2.txt、…、sg120.txt。他编写 Python 程序,对书中人物同时出现的情况进行简单分析,人物及其别名(如“孟德”是“曹操”的别名)作同一人处理。运行程序,用户输入“曹操|孟德 刘备|玄德”,输出结果如图所示,图中[11,28]表示曹操,刘备在第11章至第28章同时出现。
人物同时出现的章数为:72,章依次为:
[[1,2],[5,6],[11,28],[31,45],[47,52],[54,58],[60,74],[77,82],[106,106],[119,120]]
人物同时出现的最大连续章数是:18
请回答下列问题:
(1)观察上图,可知曹操与刘备在第36章中 A (单选,填字母:A. 同时 /B. 没有同时)出现。
主程序如下:
#输入姓名、别名,姓名存入列表 names,如 names=["曹操","刘备"]
统计各个章中,列表 names 中每个人物(含别名)出现的次数,将结果存入字典total中,如 total={"曹操":[2,5,7,…], "刘备":[50,47,0,…]},表示曹操在第 1,2,3,…章分别出现了 2,5,7,…次 ,代码略
num, result=calculate(total)
mlen=getMaxLen(result)
print("人物同时出现的章数为:", num, ",章依次为:")
print(result)
print("人物同时出现的最大连续章数是:",mlen)
(2)定义函数 calculate(total),功能是统计列表 names 中人物同时出现的章回数,以及同时出现的章,结果示例如上图所示,请在画线处填入合适的代码。
def calculate(total):
  num, length=0,0  # num保存120章中人物同时出现的章数
  result=[]  # result[i][0]、result[i][1]分别存储第i+1段章的起、止章号
  k=-1
  for i in range(0, 120):
    if allIn(total, i):
       num+=1或num=num+1 
      if length==0:
        begin=i+1
        result.append([begin, begin]) # 在列表 result 末尾添加一个元素
        k+=1
      length+=1
      result[k][1]=i+1
    else:
      length=0
return num, result
(3)定义函数 getMaxLen(result),功能是统计最大连续章数,请在画线处填入合适的代码。
def getMaxLen(result):
  mlen=0
  for item in result:
    t=item[1]-item[0]+1
    if t > mlen :
      mlen=t
  return mlen
(4)定义函数allIn(total, cno),功能是判断列表names中人物是否同时出现在cno章中,若同时出现,返回True,请在画线处填入合适的代码。
def allIn(total, cno):
  for item in names:
    if  total[item][cno]==0 :
      return False
  return True
【解析】 本题考查Python语言基础及字符串处理的综合知识。(1)观察图可知,第36回出现在[31,45]中,表明曹操与刘备这两个人物在36回同时出现,A正确。(2)由于num保存120个章回中人物同时出现的章回数,其初值为0,因此若检查到符合条件时,即调用函数allIn(total, cno)且其值为True时,计数器num加1,因此其表达式为num+=1。(3)此处统计最大连续章回数,变量mlen即为返回值。在循环中,将连续章回数t与最大值mlen进行比较,若有比最大值mlen更大的值t,则将t赋值给mlen,故答案是mlen。(4)由于 total={"曹操":[2,5,7,…], "刘备": [50,47,0,…]},表示曹操在第 1,2,3,…章回分别出现了 2,5,7,…次,根据这个信息可知,total是一个字典,item是某人物名,cno是某章回号的值,因此若total[item][cno]==0,则表明人物item在章回号cno中出现的次数为0,故函数返回值为False,反之则返回True。
1. 已知列表a=[6,5],b=[6,5,4,3],则a*2+b的结果是( C )
A. [6,5] B. [6,5,4,3]
C. [6,5,6,5,6,5,4,3] D. 程序错误
【解析】 在Python中,乘号的作用是将元素在列表中重复一次,C正确。
2. (2023·浙江9+1联考)有如下Python程序段:
a=[5,3,8,9,7,3,11]
n=len(a)-1
cnt=0
for i in range(1,n):
  if a[i]==a[i+1]-a[i-1]:
    cnt+=1
  elif a[i]>a[i+1]-a[i-1]:
    cnt+=2
  else:
    cnt+=3
print(cnt)
执行该程序段后,变量cnt的值为( B )
A. 9 B. 10
C. 11 D. 12
【解析】 本题考查数组运算的知识。程序段通过for循环遍历列表a中的元素,对于列表a中的第i个元素,如果其等于其相邻两个元素的差,则计数器cnt加1,否则,如果a[i]大于其相邻两个元素的差,则计数器cnt加2,否则计数器cnt加3。列表a中的第2个元素等于其相邻两个元素的差,因此cnt加1,列表a中的第3个到第5个元素都大于其相邻两个元素的差,因此计数器cnt会加2,而第6个元素a[i]小于其相邻两个元素的差,因此cnt加3。因此,最终计数器cnt的值为1+2+2+2+3=10,B正确。
3. 有如下Python程序段:
a=[5,2,7,10,17,25,42,66]
c=0
for i in range(2,len(a)):
  if a[i-1]+a[i-2]==a[i]:
    c=c+1
print(c)
运行程序后,输出的内容是( B )
A. 2 B. 3
C. 6 D. 7
【解析】 本题考查对程序的阅读理解能力。变量c,记录的是列表a从下标2开始,满足每个数等于前两个数之和的个数。观察列表a中现有元素,c=3,B正确。
4. (2023·浙江9+1联考)有如下Python程序段:
a=[3,5,2,4,1]
sum1=m=a[0]
for i in range(1,len(a)):
  if a[i]    m=a[i]
  sum1+=m
执行该程序后,sum1的值为( C )
A. 6 B. 9
C. 11 D. 15
【解析】 本题考查数组的知识。本题程序的功能是每次将a[i]与m中的较小值累加到变量sum1中,因此sum1=3+3+2+2+1=11,C正确。(共27张PPT)
一、 数组及其基本操作
信息技术 选择性必修1 数据与数据结构
第二章 数组与链表
知识过关
1. 数组的概念
(1)数组在内存中的存储方式为顺序存储。
(2)数组是由相同类型的变量构成的一个序列。
(3)数组名和下标组成数组的各个变量称为数组的分量,也称为数组元素。
(4)创建数组时,系统会在内存中分配一块连续的存储空间,每个数组元素按照下标顺序存储。
(5)一维数组:只有一个下标,下标用来表示数据元素在该序列中的位置。
(6)二维数组:有两个下标,表示数据元素在该序列中的行、列位置,二维数组有行优先存储和列优先存储两种方式。
2. 数组的特性
(1)数组元素的数据类型相同。
(2)通过数组名和下标对数组元素的值进行访问。
(3)存储空间固定不变。
归纳总结
数组在创建时就分配好了存储空间,即其占用空间已固定,因此删除数组中的元素后,其占用的空间不变。
3. 数组的基本操作
(1)数组的创建。
数组的创建实质是在系统内存中划分一块连续区域,用来保存数组所含的所有数据元素。
(2)数组元素的访问。
①数组元素的访问,指的是寻址到特定的数据元素,并根据存储地址对该数据元素进行读取、修改等操作。
②数组元素可以通过数组名和下标直接进行访问。
(3)数组元素的插入与删除。
①当数组中某个位置要插入一个新数据时,必须先将该位置及后面的所有数据向后移动一个位置,然后将新数据插入。
例如,在数组元素a[1]前插入一个新数据datax,操作后的数组a如图所示。
②删除数组元素时,需要将被删除元素位置后的所有元素前移一个位置。
例如,删除数组元素a[1]后的数组如图所示。
4. Python列表常用函数和方法
在Python中,常用列表来模拟实现数组的操作。
Python列表常用函数和方法
函数和方法 功能 实例
len(list1) 统计列表list1中元素的个数 list1=[1,2,3,4]
print(len(list1)),输出为4
list1.append(x) 在列表list1末尾添加元素x list1=[1,2,3,4]
list1.append(5)
列表中的内容为[1,2,3,4,5]
函数和方法 功能 实例
list1.insert(i,x) 在列表list1中下标为i位置处插入元素x list1=[1,2,3,4]
list1.insert(2,5)
列表中的内容为[1,2,5 3,4]
list1.pop(i) 将列表list1中下标为i的元素删除;若i不指定,默认为-1,即删除最后一个元素 list1=[1,2,3,4]
list1.pop()
列表中的内容为[1,2,3]
典例精选
【例1】 (2024·浙江1月选考)数组元素a[0]至a[n-1]依次存放着n个数据,现需要将元素a[n-1]插入在下标为x(0≤xtemp=a[n-1]
for i in range(n-2,x-1,-1):
a[x]=temp
A. a[i+1]=a[i] B. a[i-1]=a[i]
C. a[i]=a[i+1] D. a[i]=a[i-1]
A
【解析】 本题考查数组元素的移动操作。此算法实现的功能是将数组末尾元素a[n-1]移动到指定位置x。因此需要将下标位置范围为[x,n-2]区间内的元素整体向后移动一位。具体方式如下:
元素值 0 3 4 6 7
下标 x n-1
初始化
元素值 0 3 4 6 6
下标 x n-1
第1步:将6向后移一位覆盖7
元素值 0 3 4 4 6
下标 x n-1
第2步:将4向后移一位覆盖6
此时下标x所对应的位置空出,可以插入a[n-1]:
元素值 0 3 7 4 6
下标 x n-1
第3步:将7插入下标x处
因此移位的方向是前面的元素覆盖后面的元素,且参与移位的元素最左侧为下标x。
【例2】 (2024·浙江6月选考)某监控设备可定时采集红绿信号灯的状态数据,数据格式记为[a,b],其中a、b分别为红灯和绿灯的状态值,0表示灯灭,1表示灯亮,如[0,1]表示红灯灭、绿灯亮。现要编写程序,每隔1秒采集并检测信号灯是否存在如下异常状态:
第一类,红绿灯同时亮或同时灭;
第二类,红灯或绿灯超时,即保持同一状态的时长大于上限值(如300秒)。检测到异常状态时就发送相应信息。请回答下列问题:
(1)若检测到“红绿灯同亮”的异常,则采集到的数据是__________(单选,填字母)。
A. [0,0] B. [0,1]
C. [1,0] D. [1,1]
D
(2)实现上述功能的部分Python程序如下,请在画线处填入合适的代码。
tlimit = 300   # 设置信号灯保持同一状态的时长上限值
pre = [-1,-1]
t = [0,0] # t[0]、t[1]分别记录红灯、绿灯保持同一状态的时长
while True:
  # 接收一次采集到的状态数据,存入d,代码略
  if ①__________________:
    if d[0] == 1:
      # 发送“红绿灯同时亮”信息,代码略
    else:
      # 发送“红绿灯同时灭”信息,代码略
  for i in ②________________________________________:
    if d[i] == pre[i]:
      t[i]+= 1
      if ③__________________:
        if i == 0:
         # 发送“红灯超时”信息,代码略
        else:
         # 发送“绿灯超时”信息,代码略
    else:
      t[i] = 1
  pre = d
  # 延时1秒,代码略
d[0]==d[1]
range(2)或range(len(pre))或range(len(d))
t[i]>tlimit
【解析】 本题考查Python程序设计。(1)根据题意0表示灯灭,1表示灯亮可知,红绿灯同时亮需表示为[1,1],D正确。(2)程序①处需判断红绿灯是否处于相同状态,若d[0]和d[1]的值相等,同时d[0]=1,表示红绿灯同时亮;否则d[0]=0,表示红绿灯同时灭,故①处代码为“d[0]==d[1]”。②处相关代码的功能为读取一次数据存列表d后需遍历d,故i取值01,故②处代码为“range(2)”。若d[i]=pre[i],表示i所对应的红绿灯相邻两个时刻的状态相同,则相应的红绿灯时长t[i]计数;若时长超过上限值,则表示异常状态;若此时i=0,则表示红灯异常,否则表示绿灯异常,故③处代码为“t[i]>tlimit”。
【例3】 (2024·浙江7月学考)小张收集了章回体小说《三国演义》的第1章至第120章的120个文件,其文件名依次为sg1.txt、sg2.txt、…、sg120.txt。他编写 Python 程序,对书中人物同时出现的情况进行简单分析,人物及其别名(如“孟德”是“曹操”的别名)作同一人处理。运行程序,用户输入“曹操|孟德 刘备|玄德”,输出结果如图所示,图中[11,28]表示曹操,刘备在第11章至第28章同时出现。
人物同时出现的章数为:72,章依次为:
[[1,2],[5,6],[11,28],[31,45],[47,52],[54,58],[60,74],[77,82],[106,106],[119,120]]
人物同时出现的最大连续章数是:18
请回答下列问题:
(1)观察上图,可知曹操与刘备在第36章中__________(单选,填字母:A. 同时 /B. 没有同时)出现。
主程序如下:
#输入姓名、别名,姓名存入列表 names,如 names=["曹操","刘备"]
统计各个章中,列表 names 中每个人物(含别名)出现的次数,将结果存入字典total中,如 total={"曹操":[2,5,7,…], "刘备":[50,47,0,…]},表示曹操在第 1,2,3,…章分别出现了 2,5,7,…次 ,代码略
num, result=calculate(total)
mlen=getMaxLen(result)
print("人物同时出现的章数为:", num, ",章依次为:")
print(result)
print("人物同时出现的最大连续章数是:",mlen)
A
(2)定义函数 calculate(total),功能是统计列表 names 中人物同时出现的章数,以及同时出现的章,结果示例如上图所示,请在画线处填入合适的代码。
def calculate(total):
  num, length=0,0  # num保存120章中人物同时出现的章数
  result=[]  # result[i][0]、result[i][1]分别存储第i+1段章的起、止章号
  k=-1
  for i in range(0, 120):
    if allIn(total, i):
      _____________________________
      if length==0:
        begin=i+1
        result.append([begin, begin]) # 在列表 result 末尾添加一个元素
        k+=1
      length+=1
      result[k][1]=i+1
    else:
      length=0
return num, result
num+=1或num=num+1
(3)定义函数 getMaxLen(result),功能是统计最大连续章数,请在画线处填入合适的
代码。
def getMaxLen(result):
  mlen=0
  for item in result:
    t=item[1]-item[0]+1
    if t >__________:
      mlen=t
  return mlen
mlen
(4)定义函数allIn(total, cno),功能是判断列表names中人物是否同时出现在cno章中,若同时出现,返回True,请在画线处填入合适的代码。
def allIn(total, cno):
  for item in names:
    if ______________________:
      return False
  return True
total[item][cno]==0
【解析】 本题考查Python语言基础及字符串处理的综合知识。(1)观察图可知,第36回出现在[31,45]中,表明曹操与刘备这两个人物在36回同时出现,A正确。(2)由于num保存120个章回中人物同时出现的章回数,其初值为0,因此若检查到符合条件时,即调用函数allIn(total, cno)且其值为True时,计数器num加1,因此其表达式为num+=1。(3)此处统计最大连续章回数,变量mlen即为返回值。在循环中,将连续章回数t与最大值mlen进行比较,若有比最大值mlen更大的值t,则将t赋值给mlen,故答案是mlen。(4)由于 total={"曹操": [2,5,7,…], "刘备": [50,47,0,…]},表示曹操在第 1,2,3,…章回分别出现了 2,5,7,…次,根据这个信息可知,total是一个字典,item是某人物名,cno是某章回号的值,因此若total[item][cno]==0,则表明人物item在章回号cno中出现的次数为0,故函数返回值为False,反之则返回True。
自我检测
1. 已知列表a=[6,5],b=[6,5,4,3],则a*2+b的结果是(  )
A. [6,5] B. [6,5,4,3]
C. [6,5,6,5,6,5,4,3] D. 程序错误

C
【解析】在Python中,乘号的作用是将元素在列表中重复一次,C正确。
2. (2023·浙江9+1联考)有如下Python程序段:
a=[5,3,8,9,7,3,11]
n=len(a)-1
cnt=0
for i in range(1,n):
  if a[i]==a[i+1]-a[i-1]:
    cnt+=1
  elif a[i]>a[i+1]-a[i-1]:
    cnt+=2
  else:
    cnt+=3
print(cnt)
执行该程序段后,变量cnt的值为(  )
A. 9 B. 10
C. 11 D. 12
B
【解析】 本题考查数组运算的知识。程序段通过for循环遍历列表a中的元素,对于列表a中的第i个元素,如果其等于其相邻两个元素的差,则计数器cnt加1,否则,如果a[i]大于其相邻两个元素的差,则计数器cnt加2,否则计数器cnt加3。列表a中的第2个元素等于其相邻两个元素的差,因此cnt加1,列表a中的第3个到第5个元素都大于其相邻两个元素的差,因此计数器cnt会加2,而第6个元素a[i]小于其相邻两个元素的差,因此cnt加3。因此,最终计数器cnt的值为1+2+2+2+3=10,B正确。
3. 有如下Python程序段:
a=[5,2,7,10,17,25,42,66]
c=0
for i in range(2,len(a)):
  if a[i-1]+a[i-2]==a[i]:
    c=c+1
print(c)
运行程序后,输出的内容是(  )
A. 2 B. 3
C. 6 D. 7
【解析】 本题考查对程序的阅读理解能力。变量c,记录的是列表a从下标2开始,满足每个数等于前两个数之和的个数。观察列表a中现有元素,c=3,B正确。
B
4. (2023·浙江9+1联考)有如下Python程序段:
a=[3,5,2,4,1]
sum1=m=a[0]
for i in range(1,len(a)):
  if a[i]    m=a[i]
  sum1+=m
执行该程序后,sum1的值为(  )
A. 6 B. 9
C. 11 D. 15
【解析】 本题考查数组的知识。本题程序的功能是每次将a[i]与m中的较小值累加到变量sum1中,因此sum1=3+3+2+2+1=11,C正确。
C

展开更多......

收起↑

资源列表