内容正文:
2024学年第一学期期中考试高二技术选考试卷
出题:胡小英 审题:胡沛茹
考生须知:
1.本试卷分两部分,第一部分信息技术,第二部分通用技术。满分100分,考试时间90分钟。
2.考生答题前,务必将自己的姓名、准考证号用黑色字迹的签字笔或钢笔填写在答题纸上。
3.选择题的答案用2B铅笔将答题纸上对应题目的答案选项涂黑,如要改动,须将原填涂处用橡皮擦净。
4.非选择题的答案用黑色字迹的签字笔或钢笔写在答题纸上相应区域内,作图时可先使用2B铅笔,确定后用黑色字迹的签字笔或钢笔描黑,答案写在非答题纸上无效。
第一部分 信息技术(共50分)
一、选择题(本大题共12小题,每小题2分,共24分,每小题列出的四个备选项中只有一个是符合题目要求的,不选、错选、多选均不得分)
1. 下列关于数据、大数据、信息和知识的说法,正确的是( )
A. 数据处理过程中,不会有新的数据产生 B. 信息在交流的过程中会产生损耗
C. 大数据处理的数据一定是非结构化的 D. 相比于数据和信息,知识更接近行动,它与决策相关
2. 以下关于数据编码的说法正确的是( )
A. 一个基本的ASCII码用一个字符中的低7位编码 B. 计算机中的数据以二进制或十六进制存储
C. 位深度为8的图像可表达1024种颜色 D. 某段声音存储为Wave格式,其存储容量是唯一的
3. 下列关于人工智能说法,正确的是( )
A. 人工智能就是机器学习
B. 符号主义是从“交互一反馈”角度来刻画智能行为
C. 深度学习在图像分类、语音识别等领域表现出良好的性能
D. AlphaGo从围棋跨界到电力控制领域,属于混合增强智能
4. 用数组表示一棵二叉树:
0
1
2
3
4
5
6
7
8
9
10
11
'a'
'b'
'c'
'd'
'e'
'f'
'g'
'h'
'i'
下列说法正确的是( )
A. 这是一棵完全二叉树
B. 这棵树的叶子节点比度为1的节点多1个
C. 节点‘g’,‘h’是兄弟节点
D. 使用前序遍历和中序遍历方式查找字母‘e’,则访问节点个数相同
5. 假设完全二叉树的树根为第1 层,树中第10 层有5 个叶子节点,则完全二叉树最多有多少个节点?( )
A. 2047 B. 2048 C. 2037 D. 2038
6. 变量a,b均为布尔型,下列Python表达式与not a or b等价是( )
A. not(a or b) B. not(a and b) C. a !=True or b!=False D. a==False and b==False
7 某 Python 代码段如下,
x = 142; y = 125; z = 120
res = 0
if x > y:
res = x
elif y> z:
res = res + z
res = res - 5
print (res)
执行该程序段后输出的结果是( )
A. 115 B. 137 C. 140 D. 157
8. 有如下Python程序段:
s="Hello World"; s2=""
for i in s:
if "A"<=i<="Z":
i=chr(ord(i)+ord("a")-ord("A"))
if "a"<=i<="z":
s2=chr((ord(i)-ord("a")+3)%26+ord("a"))+s2
else:
s2=i+s2
print(s2)
执行该程序段后,输出的结果为( )
A. gour rooh B. gourz roohk C. khoor zruog D. hoor ruog
9. 某递归函数如下所示:
def hs(m):
if m<=1:
f=1
else:
f=hs(m-1)+hs(m-2)
return f
ans=0
for i in range(5):
if hs(i)%2==1:
ans+=1
print(ans)
程序运行后,输出的结果是( )
A. 2 B. 10 C. 4 D. 5
10. 某二分查找算法用于查找非降序序列arr中小于等于key的最后一个元素位置,python代码如下:
arr=[1,1,4,4,4,5,5,5]
key=int(input())
L=0; R=len(arr)-1
while (1) :
mid=(L+R+1)//2
if (2) :
L=mid+1
else:
R=mid-1
print((3) )
划线(1)(2)(3)处可供选择的语句有:
①L < R ②L<=R ③arr[mid] < key ④arr[mid]<=key ⑤L ⑥R
则正确的代码应为( )
A. ①③⑤ B. ①④⑥ C. ②③⑤ D. ②④⑥
11. 有如下程序段:
# 随机生成 5 个正整数并存入列表 s 中,代码略
def sort_indices(s) :
n=len(s)
y=[i for i in range(n)] # 生成序列 0 ~ n-1
for i in range(n-1) :
for j in range(n-i-1):
if s[y[j]]>=s[y [j+1]] :
y [j],y [j+1]=y [j+1],y[j]
return y
执行上述程序后,若返回的结果为[2,1,0,4,3],下列选项中,列表 s 中各元素值可能的是( )
A. [3,2,1,5,4] B. [4,2,1,5,3] C. [5,2,1,3,4] D. [3,2,5,1,4]
12. 有如下Python程序段
s="01357987"; k=3; stack=[s[0]]
for char in s[1:]:
while stack[-1] > char and k > 0:
stack.pop() #删除 stack 列表的最后一个元素
k-=1
stack.append( char) #在 stack 列表的结尾插入元素 char
while k > 0:
stack.pop()
k-=1
while stack[0] == "0":
stack.pop(0)
print( stack)
执行该程序段后,stack的值是( )
A. ['1','3','5','7'] B. ['7','9','8','7'] C. ['0','7','9','8','7'] D. ['0,'1','3','5','7']
二、非选择题(本大题共3小题,其中第13小题7分,第14小题9分,第15小题10分,共26分)
13. 有一个猜数字的魔术,魔术师让观众心中默想一个小于50的两位数,接着问该观众,在如图1所示的6张卡片中哪几张有他想的数。最后,魔术师总能准确地猜出这个数。
图1 图2
小温学习了信息编码相关知识后,很快发现了该魔术的奥秘。他发现卡片1中所有的数字转成二进制后最低位都是1,卡片2的所有数字转成二进制后倒数第二位(从最低位开始数第二位)的数字都是1,卡片3的所有数字转成二进制后倒数第三位(从最低位开始数第三位)的数字都是1……以此类推。现编写程序,验证小温的想法,运行结果如图2所示,程序代码如下,请回答下列问题。
def judge(a, i):#参数a代表需要验证卡片的数据列表,参数i代表卡片编号
flag=False; ans=0
for j in a:
k=j//2**(i-1)
ans+=①____
if ans==len(a):
②____
return flag
#生成6张卡片中值,并存储在a中a=[[1,3,5……47,49],[2,3,6……50],……]
for i in range(6):#依次验证卡片1到卡片6
if ③____:
print('卡片'+str(i+1)+'验证成功')
(1)请在横线处填入合适的代码。
(2)小温的父亲的年龄在50岁以下,其年龄仅在卡片1、卡片3、卡片4、卡片6出现过,则小温父亲的年龄为____(填数字)岁。
14. 已知某校高一年级第一、二学期期中、期末考试4次成绩存储在“exam. xlsx”中,如图1所示。教务管理员对历次考试中七门选考科目考试成绩(赋分)进行处理,本着分数优先原则,将平均分最高的两门科目作为备选科目,为高一学生选课提供参考.
图1
(1)若某生考试缺考则该科目分数标记为0,已知总分列是所有考试科目分数总和,请对数据进行整理,剔除缺考考生数据,划线处能实现该功能的语句是____
import pandas as pd
df=pd. read_ excel("exam. xlsx")
df=
(2)计算每个同学历次考试的平均成绩
gf=
若gf对象输出后图2所示,请为划线处选择合适的代码____(单选,填字母)
A.df. groupby('姓名', as_ index=False). mean() B.df. groupby('姓名', as_ index=True). mean()
C.df. groupby('姓名'). mean() D.df. groupby('班级', as_ index=False). mean()
图2
(3)计算每个同学的两门优势学科,请在划线①②③处完善代码。
km=gf. columns[4:11]#获取七门选考科目学科名称
gf. insert(12,"优势学科","")
#在总分列后插入新的一列,列标题名为“优势学科”初始值为""
for i in gf.①____:
subjectl=subject2=""
max1=max2=0
for j in range(0,len(km)):
②____
if cj>max1:
③____
subject1=km[j]
max2=max1
max1=cj
elif cj>max2:
subject2=km[j]
max2=cj
gf. at[i,"优势学科"]=subject1+subject2
15. 某工厂有两个生产车间,现要为两个车间生产的产品进行分组,以便后续进行检测。分组前先将每个车间每天生产的产品排在一起:先是第一车间第一天生产的产品,再是第二车间第一天生产的产品;接着是第一车间第二天和第二车间第二天生产的产品……。这些产品用正整数1,2,3,…进行编号。其中,第一车间产品用0表示,第二车间产品用1表示。连续排在一起的同一车间的产品可以视为一个“块”。
假设,有初始产品序列如下表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0
0
0
0
1
1
1
0
0
0
1
1
0
1
1
0
1
1
1
1
如编号1,2,3,4为第一车间第一天生产的产品块,5,6,7为第二车间第一天生产的产品块,依次类推。分组时,取每一块最左边的第一个产品组成一组,直至所有产品抽取完。注意,当取完一个车间的产品后,其左右两块同一车间的产品会合并成一个块。例如第一组抽取的产品是(序号):1,5,8,11,13,14,16,17,剩余产品是:
2
3
4
6
7
9
10
12
15
18
19
20
0
0
0
1
1
0
0
1
1
1
1
1
此时,剩余最左边编号是12,15,18的三块会合成同一块,那么第二组抽取的产品只有4个,分别是(序号):2,6,9,12。而后第三组抽取的产品是:3,7,10,15。第四组抽取的产品是4,18。第五组抽取的产品是19。第六组抽取的产品是20。所有产品抽完后,分组结束。
以下程序完成并输出了原始产品序列的分组情况,请回答以下问题:
(1)若产品序列是“001100010011”,则第二组抽取的产品序号是____(用正整数按递增的顺序作答)。
(2)主程序对原始产品序列进行处理,输出了每次分组的结果。
对于题述产品序列,其输出的分组结果如下图所示,请将程序补充完整。
# 采集原始产品序列,如“001100010011”,并保存至变量 s 中,代码略
s = s + "." # 产品序列串末尾放置一个点号,表示结束符
sel = [False] * len(s)
q, k, begin = [], 0, 0
for i in range(1, len(s)):
if (①____):
q.append([begin, i-1, s[i-1]]) # 为 q 追加一个元素
begin = i
i = 0
cnt = len(s) – 1
while cnt > 0:
print("第" + str(i+1) + "组:", end="")
q2 = selection(q, 0, len(q))
i += 1;
print("")
q = mergence(q2, 0, len(q2))
(3)selection 函数实现了产品的抽取,请将程序补充完整。
def selection(q, head, tail):
global cnt # 定义 cnt 为全局变量,即与主程序 cnt 变量通用
q2 = []
while head < tail:
F = q[head]
head += 1
while ②____:
F[0] += 1
print(F[0] + 1, end=" ")
cnt -= 1
sel[F[0]] = True
if F[0] == F[1]:
continue
③____
q2.append(F)
return q2
(4)mergence 函数实现了产品抽取后剩余产品的调整,请将程序补充完整。
def mergence(q2, head2, tail2):
q = []
while head2 < tail2:
X = q2[head2]
head2 += 1
while head2 < tail2:
Y = q2[head2]
if X[2] == Y[2]:
④____
head2 += 1
else:
break
q.append(X)
return q
第1页/共1页
学科网(北京)股份有限公司
$$
2024学年第一学期期中考试高二技术选考试卷
出题:胡小英 审题:胡沛茹
考生须知:
1.本试卷分两部分,第一部分信息技术,第二部分通用技术。满分100分,考试时间90分钟。
2.考生答题前,务必将自己的姓名、准考证号用黑色字迹的签字笔或钢笔填写在答题纸上。
3.选择题的答案用2B铅笔将答题纸上对应题目的答案选项涂黑,如要改动,须将原填涂处用橡皮擦净。
4.非选择题的答案用黑色字迹的签字笔或钢笔写在答题纸上相应区域内,作图时可先使用2B铅笔,确定后用黑色字迹的签字笔或钢笔描黑,答案写在非答题纸上无效。
第一部分 信息技术(共50分)
一、选择题(本大题共12小题,每小题2分,共24分,每小题列出的四个备选项中只有一个是符合题目要求的,不选、错选、多选均不得分)
1. 下列关于数据、大数据、信息和知识的说法,正确的是( )
A. 数据处理过程中,不会有新的数据产生 B. 信息在交流的过程中会产生损耗
C. 大数据处理的数据一定是非结构化的 D. 相比于数据和信息,知识更接近行动,它与决策相关
【答案】D
【解析】
【详解】本题考查数据信息知识。D选项正确,相比于数据(单纯的事实记录)和信息(有一定组织和意义的数据),知识更接近行动,它是经过提炼和总结的,可以用于指导决策。A选项错误,在数据处理过程中,是会产生新的数据的。B选项错误,信息在交流过程中不会产生损耗。C选项错误,大数据处理的数据包括结构化数据、半结构化数据和非结构化数据。因此本题选择D。
2. 以下关于数据编码的说法正确的是( )
A. 一个基本的ASCII码用一个字符中的低7位编码 B. 计算机中的数据以二进制或十六进制存储
C. 位深度为8的图像可表达1024种颜色 D. 某段声音存储为Wave格式,其存储容量是唯一的
【答案】A
【解析】
【详解】本题考查编码。A选项正确,ASCII 码使用 7 位二进制数来表示一个字符,基本的 ASCII 码用一个字节(8 位)中的低 7 位进行编码,这样可以表示 128 个不同的字符,包括字母、数字、标点符号和一些控制字符,B选项错误,计算机中的数据是以二进制存储的。C选项错误,对于图像的颜色表示,位深度决定了可以表示的颜色数量。位深度为n的图像可以表达2n种颜色。当位深度为8时,可以表达256种颜色,D选项错误,Wave 格式是一种音频文件格式,其存储容量取决于采样频率、量化位数、声道数和时长等多个因素。不同的采样频率、量化位数等参数设置会导致不同的存储容量。因此本题选择A。
3. 下列关于人工智能的说法,正确的是( )
A. 人工智能就是机器学习
B. 符号主义是从“交互一反馈”角度来刻画智能行为
C. 深度学习在图像分类、语音识别等领域表现出良好的性能
D. AlphaGo从围棋跨界到电力控制领域,属于混合增强智能
【答案】C
【解析】
【详解】本题考查人工智能相关内容。A选项,机器学习是人工智能的一个分支,选项错误。B选项,行为主义从“交互—反馈”角度来刻画智能行为,认为智能体可以在与环境的交互中不断学习,从而提升自己的智能水平。C选项,深度学习算法利用多层神经网络模拟人脑的工作原理,通过大量训练数据,由模型自动归纳提取出图像特征,在效率和准确率方面都远超传统算法,深度学习技术逐步取代了传统图像算法,成为当前的主流解决方案,在图像分类、物体检测、语义分割和人脸识别等任务上表现出优异的性能,选项正确。D选项,AlphaGo从围棋人工智能应用到电力控制领域,属于跨领域人工智能,选项错误。故本题答案是C选项。
4. 用数组表示一棵二叉树:
0
1
2
3
4
5
6
7
8
9
10
11
'a'
'b'
'c'
'd'
'e'
'f'
'g'
'h'
'i'
下列说法正确的是( )
A. 这是一棵完全二叉树
B. 这棵树的叶子节点比度为1的节点多1个
C. 节点‘g’,‘h’是兄弟节点
D. 使用前序遍历和中序遍历方式查找字母‘e’,则访问节点个数相同
【答案】D
【解析】
【详解】本题考查二叉树。D选项正确,前序遍历顺序:根节点 - 左子树 - 右子树。对于这棵二叉树,前序遍历依次为:“abdge”,在查找字母 “e” 时,访问了 5个节点。 中序遍历顺序:左子树 - 根节点 - 右子树。对于这棵二叉树,中序遍历依次为:“dgbhe”。在查找字母 “e” 时,同样访问了5 个节点。A选项错误,完全二叉树的定义是除了最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干节点。而题中这颗二叉树,第三层(非最后一层)已经存在空节点。B选项错误,这棵树的度为1的节点(“c”,“d”,“e”,“f”)比叶子节点(“g”,“h”,“i”)多1个,C选项错误,在二叉树中,兄弟节点是指具有相同父节点的节点。 节点“g”的父节点是索引为 3 的节点“d”,节点“h” 的父节点是索引为 4 的节点 “e”,它们的父节点不同。因此本题选择D。
5. 假设完全二叉树的树根为第1 层,树中第10 层有5 个叶子节点,则完全二叉树最多有多少个节点?( )
A. 2047 B. 2048 C. 2037 D. 2038
【答案】C
【解析】
【详解】本题考查二叉树相关内容。由题目内容可知,若求该完全二叉树最多有多少个节点,两种方法可解决:(1)该二叉树共11层,前10层为满二叉树,第10层有5个叶子节点,说明这5个节点没有孩子,则第11层将缺少10个节点才可以达到节点数最多。前10层节点数为:210-1=1023,第11层节点数最多为:211-1-10=210-10=1014。1023+1014=2037。(2)一棵完全二叉树达到最多节点,则该二叉树可以为满二叉树,但题目中告知第10层有5个叶子节点,则其最多节点数为11层满二叉树节点数-10,即:211-1-10=2037。以上两种方法都可得结果:2037。故本题答案是C选项。
6. 变量a,b均为布尔型,下列Python表达式与not a or b等价的是( )
A. not(a or b) B. not(a and b) C. a !=True or b!=False D. a==False and b==False
【答案】C
【解析】
【详解】本题考查逻辑表达式。
当a为真,b为真时,not a or b为真,a !=True or b!=False为真。排除选项A、B、D。
当a为真,b为假时,not a or b为假,a !=True or b!=False为假。
当a为假,b为真时,not a or b为真,a !=True or b!=False为真。
当a为假,b为假时,not a or b为真,a !=True or b!=False为真。
通过以上表达式计算,可知选项C与题目表达式真值相同。故正确答案:选项C。
7. 某 Python 代码段如下,
x = 142; y = 125; z = 120
res = 0
if x > y:
res = x
elif y> z:
res = res + z
res = res - 5
print (res)
执行该程序段后输出的结果是( )
A. 115 B. 137 C. 140 D. 157
【答案】B
【解析】
【详解】本题考查的是Python多分支语句。x = 142; y = 125; z = 120,满足x > y故执行res = x=142,跳过elif,再执行res = res-5=142-5=137。故选B。
8. 有如下Python程序段:
s="Hello World"; s2=""
for i in s:
if "A"<=i<="Z":
i=chr(ord(i)+ord("a")-ord("A"))
if "a"<=i<="z":
s2=chr((ord(i)-ord("a")+3)%26+ord("a"))+s2
else:
s2=i+s2
print(s2)
执行该程序段后,输出的结果为( )
A. gour rooh B. gourz roohk C. khoor zruog D. hoor ruog
【答案】B
【解析】
【详解】本题考查Python编程基础。
这段Python代码的目的是将字符串s中的字母进行加密处理,其中大写字母转换为小写字母,并接着将每个小写字母按照字母表顺序向后移动3位。如果是小写字母则直接按照字母表顺序向后移动3位,而非字母字符则保持不变。最后将转换后的字符向前拼接到空串s2。根据以上分析可知,H转换成k,e转换成h,l转换成o,同理可知最后运行结果为gourz roohk。故正确答案为:选项B。
9. 某递归函数如下所示:
def hs(m):
if m<=1:
f=1
else:
f=hs(m-1)+hs(m-2)
return f
ans=0
for i in range(5):
if hs(i)%2==1:
ans+=1
print(ans)
程序运行后,输出的结果是( )
A 2 B. 10 C. 4 D. 5
【答案】C
【解析】
【详解】本题考查递归。C选项正确,分析该递归程序可知,hs(0)=1,hs(1)=1,hs(2)=2,hs(3)=3,hs(4)=5,……该函数产生的序列,后一项等于前两项的和,是斐波那契数列。而在for循环中,i的值为0,1,2,3,4,每次循环中,如果hs(i)为奇数,则计数器ans加一,所以ans=1+1+0+1+1=4。故答案为C选项。
10. 某二分查找算法用于查找非降序序列arr中小于等于key的最后一个元素位置,python代码如下:
arr=[1,1,4,4,4,5,5,5]
key=int(input())
L=0; R=len(arr)-1
while (1) :
mid=(L+R+1)//2
if (2) :
L=mid+1
else:
R=mid-1
print((3) )
划线(1)(2)(3)处可供选择的语句有:
①L < R ②L<=R ③arr[mid] < key ④arr[mid]<=key ⑤L ⑥R
则正确的代码应为( )
A. ①③⑤ B. ①④⑥ C. ②③⑤ D. ②④⑥
【答案】D
【解析】
【详解】本题考查二分查找。D选项正确,这段代码的目的是在非降序序列 arr 中查找小于等于 key 的最后一个元素位置。二分查找的基本思想是通过不断缩小查找范围,每次比较中间元素与目标值(这里是 key),然后根据比较结果决定下一步在左半部分还是右半部分继续查找。在二分查找中,循环需要持续进行直到查找范围缩小到无法再缩小为止。通常的判断条件是左指针 L 小于等于右指针 R,因为当 L > R 时,说明查找范围已经为空,查找结束。 所以填空(1)处应该填 L <= R,这样循环才能在合理的范围内不断迭代,逐步逼近目标元素位置。计算中间元素的索引 mid 后,需要比较中间元素 arr[mid] 与 key 的大小关系来决定下一步的操作。 如果 arr[mid] <= key,说明 mid 以及可能其右边的元素满足小于等于 key 的条件,但我们要找的是最后一个这样的元素,所以此时应该将左指针 L 移动到 mid + 1,继续在右半部分查找。 因此,填空(2)处应该填 arr[mid] <= key,如果不包含等号,即arr[mid] < key时才更新L,那么当arr[mid]==key时,就不会向右继续查找了。这样可能会错过真正的最后一个小于等于key的元素。当循环结束后,此时 L 和 R 的位置关系已经确定,而我们要找的是小于等于 key 的最后一个元素位置,这个位置应该是 R(因为循环结束时,R 所在的位置就是满足条件的最后一个元素可能所在的位置)。 所以填空(3)处应该填 R。因此本题选择D。
11. 有如下程序段:
# 随机生成 5 个正整数并存入列表 s 中,代码略
def sort_indices(s) :
n=len(s)
y=[i for i in range(n)] # 生成序列 0 ~ n-1
for i in range(n-1) :
for j in range(n-i-1):
if s[y[j]]>=s[y [j+1]] :
y [j],y [j+1]=y [j+1],y[j]
return y
执行上述程序后,若返回的结果为[2,1,0,4,3],下列选项中,列表 s 中各元素值可能的是( )
A. [3,2,1,5,4] B. [4,2,1,5,3] C. [5,2,1,3,4] D. [3,2,5,1,4]
【答案】A
【解析】
【详解】本题考查Python基础。
该函数通过冒泡排序算法对列表 s 的索引进行排序,但排序的依据是列表 s 中对应索引的元素值。最终返回的索引列表 [2,1,0,4,3] 表示了 s 中元素的一个排序后的索引序列,即 s[2] 是最小的,然后是 s[1],接着是 s[0],之后是 s[4],最后是 s[3]。[3,2,1,5,4]:根据索引序列 [2,1,0,4,3],s[2] = 1 是最小的,然后是 s[1] = 2,接着是 s[0] = 3,之后是 s[4] = 4,最后是 s[3] = 5。这符合索引序列所指示的排序。故正确答案为:选项A。
12. 有如下Python程序段
s="01357987"; k=3; stack=[s[0]]
for char in s[1:]:
while stack[-1] > char and k > 0:
stack.pop() #删除 stack 列表的最后一个元素
k-=1
stack.append( char) #在 stack 列表的结尾插入元素 char
while k > 0:
stack.pop()
k-=1
while stack[0] == "0":
stack.pop(0)
print( stack)
执行该程序段后,stack的值是( )
A. ['1','3','5','7'] B. ['7','9','8','7'] C. ['0','7','9','8','7'] D. ['0,'1','3','5','7']
【答案】A
【解析】
【详解】本题考查的是栈的操作。阅读程序可知,将s中字符按一定的规则进行出入stack栈中,如果要操作的字符比上一个字符小同时k值大于0,则进行出栈,然后再入栈;否则直接进行入栈。最后将栈中k个元素出栈,如果栈低元素为0,也删除。初始s="01357987",k=3,开始栈的中元素为:0,依次将1、3、5、7、9入栈;8的时候先将9出栈后,再入栈,此时栈低到栈顶依次是:0、1、3、5、7、8,k=2;7的时候先将8出栈后,再入栈,此时栈低到栈顶依次是:0、1、3、5、7、7,k=1;最后将栈中k(k=1)个元素出栈,即7出栈,栈低元素为0,也删除。故最后栈中元素为:1、3、5、7,选项A正确。
二、非选择题(本大题共3小题,其中第13小题7分,第14小题9分,第15小题10分,共26分)
13. 有一个猜数字的魔术,魔术师让观众心中默想一个小于50的两位数,接着问该观众,在如图1所示的6张卡片中哪几张有他想的数。最后,魔术师总能准确地猜出这个数。
图1 图2
小温学习了信息编码相关知识后,很快发现了该魔术的奥秘。他发现卡片1中所有的数字转成二进制后最低位都是1,卡片2的所有数字转成二进制后倒数第二位(从最低位开始数第二位)的数字都是1,卡片3的所有数字转成二进制后倒数第三位(从最低位开始数第三位)的数字都是1……以此类推。现编写程序,验证小温的想法,运行结果如图2所示,程序代码如下,请回答下列问题。
def judge(a, i):#参数a代表需要验证卡片的数据列表,参数i代表卡片编号
flag=False; ans=0
for j in a:
k=j//2**(i-1)
ans+=①____
if ans==len(a):
②____
return flag
#生成6张卡片中值,并存储在a中a=[[1,3,5……47,49],[2,3,6……50],……]
for i in range(6):#依次验证卡片1到卡片6
if ③____:
print('卡片'+str(i+1)+'验证成功')
(1)请在横线处填入合适的代码。
(2)小温的父亲的年龄在50岁以下,其年龄仅在卡片1、卡片3、卡片4、卡片6出现过,则小温父亲的年龄为____(填数字)岁。
【答案】 ①. k%2 ②. flag=True ③. judge(a[i],i+1) ④. 45
【解析】
【详解】本题考查算法的综合应用。
①处答案为k % 2。函数 judge 的目的是验证给定卡片上的数字是否符合某种二进制编码规律。具体来说,对于每张卡片,它要检查卡片上的每个数字转成二进制后特定位置的数字是否都为 1。 在循环中,对于卡片 a 中的每个数字 j,先通过 k = j // 2 ** (i - 1) 计算出一个值。这个值实际上相当于j小数点向左移动i-1位取整数部分的结果。 接下来要根据这个值判断是否符合条件并累加到 ans 中。如果 k % 2 == 1,说明该数字转成二进制后指定位置(第 i 位)的数字是 1,符合卡片的规律,应该将其累加到 ans 中。
②处答案为 flag = True。当循环结束后,如果 ans == len(a),这意味着卡片上所有数字转成二进制后特定位置(第 i 位)的数字都是 1,符合该卡片的编码规律,此时应该将标志 flag 设置为 True,表示这张卡片验证成功。
③处答案为 judge(a[i], i + 1)。在主程序的循环中,对于每张卡片(从 i = 0 到 i = 5),都要调用函数 judge 进行验证。在 judge 函数内部,它会根据传入的卡片编号来检查卡片上每个数字转成二进制后特定位置(与卡片编号对应的二进制位)的数字是否都为 1。 例如,当验证卡片 1 时,在 judge 函数内部应该检查每个数字二进制的最低位(也就是 i = 0 时检查二进制的倒数第 1 位);当验证卡片 2 时,应该检查二进制的倒数第二位(即 i = 1 时检查二进制的倒数第 2 位),因此我们需要传入i+1这个参数,如果函数 judge 返回 True,说明这张卡片验证成功,应该输出相应的提示信息。
④处答案为45。已知卡片 1 中所有数字转成二进制后最低位(从右往左第 1 位)都是 1;卡片 3 中所有数字转成二进制后倒数第三位(从右往左第 3 位)的数字都是 1;因此,从最低位开始,将出现该年龄的卡片对应二进制位设为 1,未出现的设为 0。则得到二进制数:101101,转换为十进制数为45。
14. 已知某校高一年级第一、二学期期中、期末考试4次成绩存储在“exam. xlsx”中,如图1所示。教务管理员对历次考试中七门选考科目考试成绩(赋分)进行处理,本着分数优先原则,将平均分最高的两门科目作为备选科目,为高一学生选课提供参考.
图1
(1)若某生考试缺考则该科目分数标记为0,已知总分列是所有考试科目分数总和,请对数据进行整理,剔除缺考考生数据,划线处能实现该功能的语句是____
import pandas as pd
df=pd. read_ excel("exam. xlsx")
df=
(2)计算每个同学的历次考试的平均成绩
gf=
若gf对象输出后图2所示,请为划线处选择合适的代码____(单选,填字母)
A.df. groupby('姓名', as_ index=False). mean() B.df. groupby('姓名', as_ index=True). mean()
C.df. groupby('姓名'). mean() D.df. groupby('班级', as_ index=False). mean()
图2
(3)计算每个同学的两门优势学科,请在划线①②③处完善代码。
km=gf. columns[4:11]#获取七门选考科目学科名称
gf. insert(12,"优势学科","")
#在总分列后插入新的一列,列标题名为“优势学科”初始值为""
for i in gf.①____:
subjectl=subject2=""
max1=max2=0
for j in range(0,len(km)):
②____
if cj>max1:
③____
subject1=km[j]
max2=max1
max1=cj
elif cj>max2:
subject2=km[j]
max2=cj
gf. at[i,"优势学科"]=subject1+subject2
【答案】 ①. df [df. 总分>0] ②. A ③. index ④. cj=gf. at[i, km[j]] ⑤. subject2=subject1
【解析】
【详解】本题考查pandas数据处理。(1)剔除缺考考生数据,故需要筛选出总分字段大于0的所有数据。正确写法是df[df.总分>0]或df[df["总分"]>0]。(2)计算每个学生历次考试平均成绩,需要对姓名字段分类后(调用方法groupby),统计其平均值(调用方法mean)。需要注意的是设置as_index参数为False。因为数据没有将姓名作为新的索引。故正确答案为:选项A。(3)①处: 整体思路是要遍历 gf 数据中的每一行,以便为每个同学找到两门优势学科,直接使用索引进行遍历,所以①处应该填入index,这样就可以通过索引 i 依次访问 gf 数据中的每一行。 ②处: 在内部循环中,我们要遍历七门选考科目,获取每门科目的成绩,并与当前记录的优势科目成绩进行比较。这里需要获取当前同学在第 j 门选考科目上的成绩,根据前面定义的 km 是七门选考科目学科名称列,所以可以通过 gf.at[i, km[j]] 来获取当前行(同学)在第 j 门选考科目上的成绩,所以②处应填入 cj = gf.at[i, km[j]]。 ③处: 当cj成绩大于第一优势科目成绩,说明当前科目成绩更高,同时原来的最大成绩 max1 就变成了次大成绩,此时需要把原来的 max1 对应的科目名称 subject1 赋值给 subject2,这样做的目的是为了在后续继续寻找次大成绩的选考科目时,能够正确地更新 subject2 的值,从而准确地找到每个同学的两门优势学科。所以③处应填入subject2=subject1。
15. 某工厂有两个生产车间,现要为两个车间生产的产品进行分组,以便后续进行检测。分组前先将每个车间每天生产的产品排在一起:先是第一车间第一天生产的产品,再是第二车间第一天生产的产品;接着是第一车间第二天和第二车间第二天生产的产品……。这些产品用正整数1,2,3,…进行编号。其中,第一车间产品用0表示,第二车间产品用1表示。连续排在一起的同一车间的产品可以视为一个“块”。
假设,有初始产品序列如下表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0
0
0
0
1
1
1
0
0
0
1
1
0
1
1
0
1
1
1
1
如编号1,2,3,4为第一车间第一天生产的产品块,5,6,7为第二车间第一天生产的产品块,依次类推。分组时,取每一块最左边的第一个产品组成一组,直至所有产品抽取完。注意,当取完一个车间的产品后,其左右两块同一车间的产品会合并成一个块。例如第一组抽取的产品是(序号):1,5,8,11,13,14,16,17,剩余产品是:
2
3
4
6
7
9
10
12
15
18
19
20
0
0
0
1
1
0
0
1
1
1
1
1
此时,剩余最左边编号是12,15,18的三块会合成同一块,那么第二组抽取的产品只有4个,分别是(序号):2,6,9,12。而后第三组抽取的产品是:3,7,10,15。第四组抽取的产品是4,18。第五组抽取的产品是19。第六组抽取的产品是20。所有产品抽完后,分组结束。
以下程序完成并输出了原始产品序列的分组情况,请回答以下问题:
(1)若产品序列是“001100010011”,则第二组抽取的产品序号是____(用正整数按递增的顺序作答)。
(2)主程序对原始产品序列进行处理,输出了每次分组的结果。
对于题述产品序列,其输出的分组结果如下图所示,请将程序补充完整。
# 采集原始产品序列,如“001100010011”,并保存至变量 s 中,代码略
s = s + "." # 产品序列串末尾放置一个点号,表示结束符
sel = [False] * len(s)
q, k, begin = [], 0, 0
for i in range(1, len(s)):
if (①____):
q.append([begin, i-1, s[i-1]]) # 为 q 追加一个元素
begin = i
i = 0
cnt = len(s) – 1
while cnt > 0:
print("第" + str(i+1) + "组:", end="")
q2 = selection(q, 0, len(q))
i += 1;
print("")
q = mergence(q2, 0, len(q2))
(3)selection 函数实现了产品的抽取,请将程序补充完整。
def selection(q, head, tail):
global cnt # 定义 cnt 为全局变量,即与主程序 cnt 变量通用
q2 = []
while head < tail:
F = q[head]
head += 1
while ②____:
F[0] += 1
print(F[0] + 1, end=" ")
cnt -= 1
sel[F[0]] = True
if F[0] == F[1]:
continue
③____
q2.append(F)
return q2
(4)mergence 函数实现了产品抽取后剩余产品的调整,请将程序补充完整。
def mergence(q2 head2, tail2):
q = []
while head2 < tail2:
X = q2[head2]
head2 += 1
while head2 < tail2:
Y = q2[head2]
if X[2] == Y[2]:
④____
head2 += 1
else:
break
q.append(X)
return q
【答案】 ①. 2 4 6 12 或 2,4,6,12 ②. s[i] != s[i-1] ③. sel[F[0]] 或sel[F[0]] == True ④. F[0] += 1 或q[head-1][0] + 1 ⑤. X[1] = Y[1]
【解析】
【详解】本题考查Python程序综合应用。
(1)用正整数按递增的顺序作答,序列表如下:
第一组抽取的产品,分别是(序号):1,3,5,8,9,11。第二组从剩余产品中抽取产品,其中6、7、10会合并
因此第二组抽取的序号是2,4,6,12。
(2)从第①空所处位置看,该处的循环遍历的整个产品序列字符串 s,当第①处条件成立时在 q “数组”末尾添加了一个元素。然后,主程序最后的 while 循环调用 selection()函数对 q 进行处理,结果赋给了 q2。而 mergence()函数对 q2 进行处理,结果重新赋给了 q,不断进行迭代直到cnt——产品序列字符串 s 中有效字符处理完毕为止。结合题目要求对于连续一段 0 或 者 1,要取最前面的值,取完之后剩余值中相邻两块序列若相同则需要合并。可以猜测这里就需要两个过程:抽取最前面的字符,然后进行合并处理。注意到第(3)小题中有取 q[head] 并输出 q[head][0](即程序中的 print(F[0]+1, end=“ ”),可以肯定 q“数组”表现得更像队列,队首元素就是第一块中的字符。因此第①空的程序,功能上应该处理各个块的数据, begin 变量相当于这个块的起始位置,i-1 是这个块的末尾位置。于是第①空表示当前字符与前一位字符不一样时,前面一块数据结束。答案是 s[i]!=s[i-1]。
(3)注意到 F 是队首元素,F[0]就是队首产品序列块的最前面产品的序号,输出 F[0]后 cnt 的值要减一,表示一个产品已被抽取。另外还注意到数组元素 sel[F[0]]随之赋值成了 True,可以断定 sel 数组的作用是做标记,当某一块内,甚至两块之间的数据被取完后,要做上标记。 如
5
6
7
8
9
10
0
0
0
1
0
0
当 5、8、9 被取后,剩余的 6、7、10 要合并成一块,其中的 8 号会被标记为 True,表示“已取”。
6
7
10
0
0
0
那么当遇到已被标记为 True 的元素时要忽略(比如 5 号元素),因此第②空的 while 循环条件是当前元素已标记为 True,答案是 sel[F[0]]==True。第③空处语句执行后,会把队首元素F整个加入到“数组”q2中,而此时队首元素F[0]是已被取走的元素,因此要调整队首元素产品序列的起止序号,即F[0]的值要加1,答案是F[0]+=1。
(4)mergence 函数实现了产品抽取后剩余产品的调整,容易想到它主要是合并相同的块。如:
6
7
10
0
0
0
这两块在原先 q 队列中值应该是[5,7,'0']和[9,10,'0'],取走最左边的元素后,q2 队列中相应的值应该是[6,7, '0']和[10,10,'0'],合并之后应该是[6,10, '0']。第④空处的关系表达式 X[2]==Y[2]判定了与队首元素字符相同的条件,因此第④空需要合并,合并的操作只需要将队首元 素 X 的结束位置更改为Y 的结束位置,答案是 X[1]=Y[1]。
第1页/共1页
学科网(北京)股份有限公司
$$