内容正文:
高效作业2[第2课 数组1——一维数组](见学生用书P163)
【A级 新教材落实与巩固】
1.有如下Python程序段:
a=[1,3,4,2,3]
max=a[0]
s=0
for i in range(1,len(a)):
if a[i]>max:
max=a[i]
s=s+max
print(s)
执行该程序段后,变量s的值为( A )
A.15 B.13 C.12 D.7
【解析】 执行过程:
i
0
1
2
3
4
a[i]
1
3
4
2
3
max
1
3
4
4
4
s
0
3
7
11
15
选项A正确。
2. 有如下Python程序段:
list=[4,7,8,1,2,6]
s=0
for a in range(1,len(list)):
if list[a]<list[a-1]:
s+=1
else:
s-=2
print(s)
执行该程序段后,输出的结果是( C )
A.3 B.4 C.-7 D.-3
【解析】 程序功能:当列表中的后一项小于前一项时,s+=1;否则,s-=2。s=s-2-2+1-2-2=-7,选项C正确。
3.有如下Python 程序段:
n=0;s=[1,1,2,2,2,3,1,1,3,3]
for i in range(0,len(s)-1):
if s[i]==s[i+1]:
n+=1
else:
n-=1
print(n)
执行该程序段后,变量n 的值为( B )
A.0 B.1 C.-1 D.2
【解析】 程序功能:若列表中前后两项相等,则n=n+1,若不相等,则n=n-1。有5处相等、4处不相等,选项B正确。
4.有如下Python 程序段:
a=[2,3,5,9,17,30]
k=0
for i in range(1,len(a)-1):
if (a[i]-a[i-1])/a[i-1]<(a[i+1]-a[i])/a[i]:
k+=1
执行该程序段后,k 的值为( C )
A.1 B.2 C.3 D.4
【解析】 若if条件成立(当前项与前一项的差与前一项的比值小于后一项与当前项的差与当前项的比值),则k+=1。故选项C正确。
5. 2023·平湖中学检测有如下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
【解析】 若列表第3项等于前2项之和,则c=c+1。“7=5+2”“17=10+7”“42=25+17”,选项B正确。
6.有如下Python 程序段:
a=[2,2,6,1,8,5,3,6,4,3,6,4,9,5,3]
dic={}
for i in a:
if i not in dic:
dic[i]=0
else:
dic[i]+=1
执行该程序段后,dic[3]的值为( B )
A.1 B.2 C.3 D.4
【解析】 利用字典统计列表a中元素出现的次数,dic[3]即值为3的元素在列表a中出现的次数,出现的次数为3,但第1次出现时初始值为0,故选项B正确。
7.有如下Python程序段:
ma=a[0];mb=a[0];pa=0;pb=0
for i in range(1,10):
if ma<a[i]:
ma=a[i];pa=i
if mb>a[i]:
mb=a[i];pb=i
下列关于该程序段功能的说法中,正确的是( D )
A.变量pa用于存储a[0]至a[9]中的最大值
B.变量ma用于存储a[0]至a[9]中的最小值
C.变量pb用于存储a[0]至a[9]中的最大值
D.变量mb用于存储a[0]至a[9]中的最小值
【解析】 ma存储列表中的最大值,pa存储最大值位置;mb存储列表中的最小值,pb存储最小值位置,选项D正确。
8.有如下Python程序段:
a=[5,19,9,22,3,10,24]
n=len(a)
c=0
for i in range(1,n):
if a[0]<a[i]:
t=a[0];a[0]=a[i];a[i]=t
c=c+1
print(c)
执行该程序段后,输出的结果是( C )
A. 5 B. 4 C. 3 D.2
【解析】 将列表中的最大值交换到索引为0的位置,并用c记下交换次数。“5,19”交换,“19,22”交换,“22,24”交换,故选项C正确。
9.有如下Python 程序段:
a=[28,29,79,14,24,43]
m=int(input(”请输入一个整数: ”))
pos=-1
for i in range(len(a)):
if a[i]>m:
if pos==-1 or a[i]<a[pos]:
pos=i
若输入40,执行该程序段后,则变量pos 的值为( D )
A.-1 B.2 C.3 D.5
【解析】 程序功能为查找大于m(40)的最小值位置,选项D正确。
10.有如下Python 程序段:
a=[2,4,3,5,1]
min=a[0]
s=10
for i in range(1,5):
if a[i]<min:
min=a[i]
s-=min
print(s)
执行该程序段后,输出的结果是( B )
A.1 B.3 C.6 D.9
【解析】 执行过程:
i
0
1
2
3
4
a[i]
2
4
3
5
1
min
2
2
2
2
1
s
10
8
6
4
3
选项B正确。
11.有如下Python程序段:
a=[1,3,5,7,9]
b=[2,4,6,8,10]
list=[]
for i in range(-1,-5,-1):
s=a[i]+b[i]
list.append(s) #append方法用于在列表末尾添加新元素
print(list)
执行该程序段后,输出的结果是( C )
A.[3,7,11,15,19]
B.[12,34,56,78,910]
C.[19,15,11,7]
D.[19,15,11,7,3]
【解析】 执行过程:
i
-1
-2
-3
-4
a[i]
9
7
5
3
b[i]
10
8
6
4
s
19
15
11
7
选项C正确。
12.有如下Python程序段:
L=[8,10,9,14,13,4,9,13,10]
k=int(input(”请输入k 值: ”))
j=0
for i in range(8):
if L[i]<=k:
L[j]=L[i]
j=j+1
print(L[:j])
执行该程序段时,输入下列选项中的数据 k 之后,输出的相应结果不正确的是( C )
A.k=8;输出:[8,4]
B.k=9;输出:[8,9,4,9]
C.k=10;输出:[8,10,9,4,9,10]
D.k=13;输出:[8,10,9,13,4,9,13]
【解析】 该程序的功能为:将列表中小于等于k的元素从索引为0的位置开始放置。选项C,k=10时,L=[8,10,9,4,9,4,9,13,10],则输出结果为[8,10,9,4,9],选项错误。
13.有如下Python程序段:
n=input(”输入若干个非负整数, 以逗号分隔: ”).split(”,”)
a=list(map(int,n));s=0
for i in range(0,len(a)//2):
if i%2==0:
s+=a[i]*2
else:
s-=a[i]
print(s)
执行该程序段时,若输入“2,0,1,8,1,1,1,6”,则输出的结果是( A )
A.-2 B.0 C.-5 D.7
【解析】 执行过程:
i
0
1
2
3
a[i]
2
0
1
8
s
4
4
6
-2
选项A正确。
14.2023·瑞安中学检测有如下Python 程序段:
a=[1, 5, 3, 2, 1, 4, 5, 8, 4, 3]
i=1
max_list=[]
while i<=len(a)-2:
if a[i-1]<a[i] and a[i]>a[i+1]:
max_list.append(a[i]) #append()方法用于在列表末尾添加新的对象
i+=1
print(max_list)
执行该程序段后,列表max_list 的值为( C )
A.[1] B.[8] C.[5,8] D.[5,1,8]
【解析】 查找数字山峰的峰值,即当前项大于前一项及后一项,选项C正确。
15.有如下Python 程序段:
a=[0]*8
a[7]=49
a[6]=28
sum=1
for i in range(5,1,-1):
a[i]=a[i+2]-a[i+1]
if a[i]%3==0:
sum=sum+a[i]
print(a)
执行该程序段后,变量a 的值为( C )
A.22
B.43
C.[0,0,-7,14,7,21,28,49]
D.[-7,14,7,21,28,49]
【解析】 执行过程:
i
5
4
3
2
a[i]
21
7
14
-7
sum
22
22
22
22
选项C正确。
16. 有如下Python程序段:
a=[12,8,9,18,2,19,28,6]
for i in range(len(a)-1):
if a[i]<a[i+1]:
a[i],a[i+1]=a[i+1],a[i]
p=len(a)-1
for i in range(len(a)-2,0,-1):
if a[i]>a[p]:
p=i
tmp=a[p]
a[p]=a[0]
a [0]=tmp
print(a)
执行该程序段后, 输出的结果是( A )
A. [28,9,18,8,19,12,6,2]
B. [12,9,18,8,19,28,6,2]
C. [28,9,18,19,8,12,6,2]
D.[2,9,12,8,18,19,6,28]
【解析】 第1个循环将列表中的最小值交换到最后,执行后的结果为:[12,9,18,8,19,28,6,2];第2个循环将最大值放到a[0],选项A正确。
17. 计算一段斐波那契数列(该数列从第3 项开始,每一项都等于前两项之和)第n项的值并输出。实现上述功能的Python 程序段如下:
n=int(input(”输入斐波那契数列长度: ”))
a=[0]*n #生成列表a 为[0,0,0,…],列表中为n 个0
a[0]=a[1]=1
i=2 #①
while i<n: #②
a[i]=a[i-2]+a[i-1] #③
i+=1
print(a[i]) #④
执行该程序段后显示出错信息,则出错的语句是( D )
A.① B.② C.③ D.④
【解析】 由于i+=1,i是最后一项的下一个位置,会出现越界的错误,选项D正确。
18.2023·富阳中学检测有如下Python程序段:
a=[3,5,7,9,11,13,15]
p=2
del a[i] #从列表中删除元素a[i]
则与方框中程序段功能相同的语句是
(注:函数pop()删除列表最后一个元素,函数del()删除列表指定范围元素)( A )
A. a=a[:p]+a[p+1:]
B. a=a[:p]+a[p:]
C. a.pop( )
D.del a[p:]
【解析】 方框中的程序相当于把索引为P的位置以后的字符依次前移一个位置, 然后把最后一个元素删除,选项A实现同样功能。选项B内容不变,选项C只删除了最后一个元素,选项D则把P及以后元素全部删除了。
19.有如下Python 程序段:
a=[18,2,-1,-7,16,-2,12,8]
k1,k2=1,1
for i in range(len(a)):
if a[i]>a[k1]:
k2=k1;k1=i
elif a[i]>a[k2]:
k2=i
执行该程序段后,变量k1和k2 的值分别为( D )
A.2,5 B.4,0 C.5,2 D.0,4
【解析】 分析代码可知,k1 是最大值的下标,k2 是第二大值的下标,选项D正确。
20. 2023·余姚中学检测有如下Python 程序段:
a=[11,2,-3,-7,14,-2,16,8]
k1,k2=1,1
for i in range(len(a)):
if a[i]<a[k1]:
k2=k1
k1=i
elif a[i]<a[k2]:
k2=i
执行该程序段后,变量k1和k2 的值分别为( A )
A.3,2 B.2,3 C.6,4 D.4,6
【解析】 分析代码可知,k1是最小值的下标,k2是第二小值的下标,选项A正确。
【B级 素养形成与评价】
21.某Python 程序实现的功能是:执行程序,输入一个四位整数,判断该四位整数是否存在数字重复的位。程序代码如下:
n=int(input(”请输入一个四位正整数:”))
f=[0]*10
while n>0:
y=n%10
①____________
n=n//10
if ②____________:
print(”有重复的位。 ”)
else:
print(”没有重复的位。 ”)
则①、②处填入的代码分别为( A )
A. ①f[y]=1 ②sum(f)<4
B. ①f[y]+=1 ②sum(f)<4
C. ①f[y]=1 ②sum(f)==4
D.①f[y]+=1 ②sum(f)==4
【解析】 在该程序段中,列表f 用于存放该数字是否出现,为0 则未出现,为1 则出现。循环语句将正整数n 中每个数字进行分离,通过n%10 运算取n 对应个位上的数字并存放在y 中,每取一个y,将对应的f[y]修改为1,再通过n//10 运算将n 的个位数去掉,重复此操作。循环结束后,通过求和运算实现对是否重复的判断,若列表f 的和小于4 则说明是有重复数字,故选项A 正确。
22. 有如下Python 程序段:
import random
fibo=[1]*11
for i in range(2,11):
fibo[i]=fibo[i-1]+fibo[i-2]
n=random.randint(1,10)
print(fibo[n])
执行该程序段后,输出的结果不可能是( C )
A.1 B.21 C.35 D.89
【解析】 前11项的值为:1,1,2,3,5,8,13,21,34,55,89,没有35,选项C错误。
23.2023·丽水中学检测有如下Python 程序段:
from random import randint
a=[0]*6
for i in range(len(a)):
a[i]=randint(1,10)
if a[i]%2==i%2 :
a[i]+=i%2
print(a)
执行该程序段后,输出的值不可能为( C )
A.[6,2,10,2,5,10]
B. [8,8,8,10,6,6]
C.[1,4,11,6,4,6]
D.[5,2,7,4,8,2]
【解析】 “a[i]%2==i%2”说明索引和值的奇偶性相同时,若原来为奇数则加1后转化为偶数,其余情况不变。选项C,i=2时,值为11,是奇数,随机数只能产生10,选项错误。
24.有如下Python 程序段:
import random
a=[0]*7
for i in range(0,7,1):
a[i]=2**i*(random.randint(0,1))+i
for i in range(0,6,1):
if a[i]%2>a[i+1]%2:
a[i],a[i+1]=a[i+1],a[i]
print(a)
执行该程序段后,输出的结果可能是( A )
A.[1,6,3,20,11,70,37]
B.[0,1,1,4,3,6,5]
C.[1,6,1,20,3,5,70]
D.[0,2,3,7,11,6,37]
【解析】 初始情况下,i为偶数时,值为偶数或0;i为奇数时,值为奇数或0。第2个循环将除以2后余数大的元素后移。选项B,当有产生0时,不会同时产生两个1,选项错误;选项C,5和70应该要交换,选项错误;选项D,7和11不可能产生,选项错误。
25.2023·宁波中学检测有如下Python程序段:
import random
a=[0]*6
a[0]=random.randint(95,100)
for i in range(1,6):
a[i]=a[i-1]-random.randint(0,5)
if i%2==0:
a[i]=a[i]+a[i]%10
print(a)
执行该程序段后,输出的结果不可能是( B )
A. [99,96,98,93,96,96]
B. [99,96,97,93,99,96]
C. [100,98,106,106,104,103]
D.[97,94,98,98,102,100]
【解析】 a[0]的初始值在95到100之间,之后每个元素减去0到5不等,如果i为偶数,则再加上除以10后的余数。选项B,第3个数无法产生97,选项错误。
26.有如下Python 程序段:
import random
nums=[0]*6
for i in range(6):
nums[i]=random.randint(1,10)
i=0
j=len(nums)-1
while i<j:
if nums[i]%2==0 and nums[j]%2==1:
nums[i],nums[j]=nums[j],nums[i]
elif nums[i]%2==1:
i=i+1
elif nums[j]%2==0:
j=j-1
print(nums)
执行该程序段后,输出的结果不可能是( B )
A.[1,3,1,5,1,7]
B.[1,4,3,6,5,8]
C.[1,3,5,7,9,10]
D.[6,4,2,8,2,10]
【解析】 nums 是有6 个元素的列表,每个元素为[1,10]区间内任意一个整数。观察while 循环的循环体可知,每次循环都对左、右边界进行奇偶判断,只有左边界为偶数、右边界为奇数时,交换两数的位置。其他情况下,如果左边界为奇数,则左边界右移一位,如果右边界为偶数,则右边界左移一位。由此可知,循环的结果为列表按先奇数后偶数排序,选项B符合题意。
27.有如下Python程序段:
import random
a=[0]*6
for i in range(6):
a[i]=random.randint(1,5)*2+1
i=0
while i<5:
if a[i]>a[i+1]:
a[i],a[i+1]=a[i+1],a[i]
else:
a[i]+=1
i+=1
print(a)
执行该程序段后,列表a 的值可能为( C )
A.[2,5,10,10,10,9]
B.[3,8,7,13,3,9]
C.[8,12,3,5,3,11]
D.[6,10,9,7,10,8]
【解析】 列表a 各元素的初值可以为3、5、7、9、11,循环遍历的算法:若当前数大于后数,则交换,若当前数不大于后数,则当前数加1。即程序执行后,若该数还是3、5、7、9、11,则该数是与后数交换所得,若该数为4、6、8、10、12,则该数的原数大于后数,且是原数加1 所得。不可能出现2和13,选项A、B 错误;选项D 的第三个数字9 有问题,选项错误;选项C 的原始数可能为[7,11,11,3,5,3],运行代码后可得选项C 的结果,选项正确。
28.2023·永嘉中学检测现有一小块矿石,质量不超过200 g,用托盘天平来称重,已知砝码规格有50 g、20 g、10 g、5 g、2 g、1 g,共6 种规格,每种规格的砝码数量均满足需求,游码置于标尺零刻度位置且无需拨动,将该矿石放至托盘天平左盘,不断往右盘加砝码(先大后小),直至平衡。根据输入的矿石质量(只考虑正整数),输出平衡时所需的各规格砝码的数量。
该程序运行的部分界面如下图所示,请在横线处填入合适的代码。
ore=int(input(”请输入矿石质量: ”))
weights=[50,20,10,5,2,1] #砝码规格
#初始化所需的各规格砝码数量
num=[0]*len(weights) #生成列表num 为[0,0,0,…],列表中为len(weights)个0
res=”所需的砝码: ”
①__i=0__
while ore>0:
num[i]=ore//weights[i]
②__ore=ore-weights[i]*num[i]__
i+=1
for i in range(len(num)):
if ③__num[i]>0__:
res=res+str(weights[i])+”g:”+str(num[i])+”个;”
print(res[:-1])
【解析】 ①先从大的砝码开始选用,i=0;②num[i] 存储需要weights[i]砝码的个数,接着计算剩余质量;③num[i] 存储需要weights[i]砝码的个数,如果num[i]大于0,则输出。
29.如果集合a 的任意一个元素都是集合b 的元素,那么集合a 称为集合b 的子集。例如集合a 为[1,3,5],集合b 为[1,2,3,4,5],集合a 的任意一个元素都是集合b 中的元素,所以集合a 称为集合b 的子集。编写Python 程序,用于判断集合a 是否为集合b 的子集,其功能如下:程序运行时随机产生na个不重复的整数存储在集合a 中,随机产生nb 个不重复的整数存储在集合b 中。显示判断的结果,程序运行界面如图所示。
(1)集合a 为[3,6,7],集合b 为[6,19,7,13,2,10,3],集合a __是__(填“是”或“不是”)集合b 的子集。
(2)请在横线处填入合适的代码。
import random
na=3;nb=10
#随机产生na 个不重复的整数存储在列表a 中,随机产生nb 个不重复的整数存储在列表b 中,代码略
print(a);print(b)
①__flag=True__
i=0
while②__i<na__and__flag或i<na__and__flag==True或i<3__and__flag__或i<3__and__flag==True__:
j=0
while j<nb:
if ③__a[i]==b[j]__:
break
j+=1
if j==nb:
flag=False
i+=1
if flag:
print(”a 是b 的子集”)
else:
print(”a 不是b 的子集”)
【解析】 (1)列表a中[3,6,7],在列表b中都存在。
(2)①由后续代码flag=False,flag需要赋初值;②列表a中的每个元素分别进行判断,如果某一个元素在列表b中没有找到,则循环结束;③while j<nb:在列表b中查找,如果已经找到,则该元素查找成功。
30.2023·瓯海中学检测某国研发出一种导弹拦截系统,但存在缺陷:第一次发射能拦截任意高度的导弹,以后每一次拦截的高度都不能高于前一次拦截的高度。现输入导弹依次飞来的高度,计算至少需要配备多少套拦截系统才能拦截所有飞来的导弹。例如导弹飞来的高度依次为“293 287 295 286 292”,第1 套拦截系统拦截的导弹高度分别为“293 287 286”,第2 套拦截系统拦截的导弹高度分别为“295 292”,因此至少需要2 套拦截系统才能拦截所有导弹。
(1)若导弹飞来的高度依次为“389 207 300 155 299 170 170 65”,则至少需要__2__套拦截系统才能拦截所有导弹。
(2)实现上述功能的Python 程序如下,请在横线处填入合适的代码。
dd=input(”请输入导弹依次飞来的高度, 以空格间隔: ”)
h=list(map(int,dd.split())) #将字符串转换为列表,例如“2 4 5”,转换为[2,4,5]
xt=[h[0]]
n=1
for i in h:
①__flag=False__
for j in range(len(xt)):
if i<=xt[j]:
②__xt[j]=i__
flag=True
break
if not flag:
xt.append(i)
③__n+=1__或n=n+1__
print(”至少需要”,n,”套拦截系统。 ”)
【解析】 导弹拦截是一个经典算法题,从“一个拦截系统,每次拦截高度都不能高于前一次拦截的高度”可以看出,一个拦截系统拦截的导弹高度,应该是一个递减子序列。拦截系统的数量就是最长递减子序列的个数。
(1)“389 207 155 65”和“300 299 170 170 ”构成2 个递减子序列,答案为2。
(2)要统计所有数据可以形成的递减子序列数量,本题的基本思想是利用一个列表xt,保存每个递减子序列的最小值。具体做法如下:外循环遍历所有的导弹高度i,内循环遍历列表xt。若i<=xt[j],即当前导弹高度不大于xt 中的值,可以构成递减子序列,此时替换xt[j]=i,始终让xt 中保存当前子序列中的最小值。这样下一个新值只需要与x[j]做比较,若更小则替换。若i>xt[j],说明无法与前面的导弹构成递减子序列,此时序列数n的值加1,同时将新序列的高度追加到列表xt 中。变量flag 用来标记导弹高度i 与xt 中已有元素是否构成递减,故①处设置flag 的初值,填flag=False;若i<=xt[j],构成递减,则替换xt[j]的值,故②处填xt[j]=i;若与xt 中的值不能构成递减,此时xt 中新增元素,同时序列数量要加一。从最后的输出可以看出,计数器为n,故③处填n+=1。
学科网(北京)股份有限公司
$$