内容正文:
单元素养检测卷(二)
(第二章 算法与问题解决 第三章 算法的程序实现 )
[时间:45分钟 满分:50分]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
一、选择题(本大题共12小题,每小题2分,共24分。在每小题给出的四个选项中,只有一个是符合题目要求的。)
1.某算法的流程图如图所示。若输入x 的值为15,则输出cnt 的值是( )
A.2 B.3
C.4 D.5
B
【解析】 x=15, 循环变量的变化范围是1~14,当x%i==0 时, cnt 加1,即cnt 计数器在统计1~14 之间能整除15 的值的个数,即统计15 的真因子的个数,为1、3、5,共3 个。选项B正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.某算法的部分流程图如图所示。
执行该部分流程后,输出的结果是( )
A.63 B.15
C.24 D.48
B
【解析】 执行过程如表所示,第三轮循环结束后,a的值为24,退出循环,此时s的值为15,选项B正确。
循环次数 s k a
初始值 0 1 3
第1次 3 0 6
第2次 3 1 12
第3次 15 0 24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3.下列 Python 表达式中,计算结果最小的是( )
A.2**3//3+8%2*3 B.5**2%3+7%2**2
C.1314//100%10 D.int(”1”+”5”)//3
【解析】 选项A,2**3//3+8%2*3=8//3+0*3=2;选项B,5**2%3+7%2**2=25%3+7%4=1+3=4;选项C,1314//100%10=13%10=3;选项D,int(”1”+”5”)//3=5。选项A符合题意。
A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.某APP 是中东地区最大的食品和杂货配送应用程序。世界杯期间球迷能够借助该APP在球场的座位上点餐。食物将直接被派送到座位上,因而球迷不会错过任何一个进球的精彩瞬间。该APP 每天都会推出限时满减活动,指定商家满50 减15,满80 减25,满110 减35,以此类推。假设某顾客会员订单原价为n(n≥50)元,其减免金额为r,下列Python 表达式正确的是( )
A.r=15+(n-50)%30*10 B.r=(n+10)//30*10-5
C.r=15+int((n-50)/30*10) D.r=10+(n-20)//30*15
B
【解析】 根据题干“满50 减15,满80 减25,满110 减35”可知,满减活动门槛为50 元,优惠15元,之后每满30元再减10 元。选项A,当n=60 时,r=115,故排除;选项C,当n=60 时,r=18,故排除;选项D,当n=50 时,r=25,故排除。选项B正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5.导入random模块后,随机生成一个[20,50)区间范围内的正整数的Python语句是( )
A.random.randint(20,50)
B.random.random()*20+30
C.int(random.random()*30+20)
D.random.uniform(20,50)
【解析】 选项A,能够取到50,选项错误;选项B,产生的是实数,选项错误;选项D,随机产生一个实数,选项错误。
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
6.用Python 语句描述:城市主干道中机动车平均行驶速度不低于30 为畅通,小于20 为堵塞,其余为拥挤。设v 为机动车平均行驶速度(单位: km/h) ,则下列选项正确的是( )
A.if v>=30:
print(”畅通”)
elif v<30:
print(”拥挤”)
else:
print(”堵塞”)
B.if v<20:
print(”堵塞”)
elif v>20:
print(”拥挤”)
else:
print(”畅通”)
D
【解析】 选项A,如果20<=v<30 应该是拥挤,小于20 应该是堵塞,此项仅能输出2 种结果:畅通和拥挤,选项错误;选项B,v=20时会输出畅通,选项错误;选项C,逻辑错误,v>=30 并且v<20,这样的数据不存在,选项错误。
C.if 20<=v<30:
print(”拥挤”)
elif v>=30 and v<20:
if v<20:
print(”堵塞”)
else:
print(”畅通”)
D.if v>=20:
if v<30:
print(”拥挤”)
else:
print(”畅通”)
else:
print(”堵塞”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
7.下列while循环的循环结果为( )
i=0
s=1
while s<10:
s=s*i+1
i+=1
print(s)
C
A.11 B.10
C.16 D.32
【解析】 第1次循环,s=1,i=1;第2次循环,s=2,i=2;第3次循环,s=5,i=3;第4次循环,s=16,i=4,跳出循环。s的值为16,选项C正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8.有如下Python 程序段:
s=”2019appreciate”
sum=0
a=[0]*26
for i in range(len(s)):
ch=s[i]
if ch>=”a” and ch<=”z”:
m=ord(ch)-ord(”a”)
a[m]=a[m]+1
for i in range(10):
if a[i]>0:
sum=sum+1
print(sum)
执行该程序段后,变量 sum 的值为( )
A.10 B.7 C.4 D.3
C
【解析】 从前往后遍历字符串s,提取第i个字符放在ch中,若ch是小写字母,找到ch在字母表中的位置m,并用a[m]统计ch出现的次数,输出前10个字母中出现次数大于0的字母数量,选项C正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
9.有如下Python程序段:
for num in range(1,10):
for i in range(2,int(num**0.5)+1):
if num%i==0:
break
else:
print(num,” ”,end=””)
执行该程序段后,输出的结果是( )
A.5 7 9 B.5 7
C.3 5 7 D.2 3 5 7
【解析】 当外循环变量num取1、2、3时,内循环的范围均为range(2,2),不符合循环条件,不会进入循环体,当外循环变量nun取4、6、8时,在i=2时,均符合条件“if num%i==0”,break提前结束内循环;当外循环变量num取5、7、9时,进入循环,i=2时,不符合条件“if num%i==0”,执行else后输出num,num取5、7时内循环执行1次,num取9时,i=2时输出9,i=3时执行break中止循环。选项A正确。
A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
10.编写了一个找最大值的Python程序,程序功能为:输入数字串(数据间用逗号分隔,以数字开头,逗号结尾),输出最大的数值。程序运行界面如图所示:
s=input()
i=0;j=0;max=0;t=””
while j<len(s):
c=s[j]
if c==”,”:
t=s[i:j]
if int(t)>max:
max=int(t)
①__________
②__________
print(max)
上述程序段中横线处应填入的代码分别为( )
B
A.①i=i+1 ②j=j+1 B.①i=j+1 ②j=j+1
C.①j=j+1 ②i=i+1 D.①j=i+1 ②i=i+1
【解析】 i是数值的起始位置,从前往后遍历字符串s,提取下标为j的字符放在c中,若c是”,”,可以确定数值的长度,且长度是j-i,t=s[i:j]是提取出来的数字字符串,若int(t)>max,说明遇到比max更大的数值,更新max的值,然后确定下一个数字的起始位置i=j+1,循环变量j变化,j=j+1,提取下一个字符,循环重复上述过程。选项B正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
11.Nilakantha 级数可用于计算Pi(π) 的无穷级数:Pi-3=
…它的计算机计算结果比莱布尼茨公式更快地接近Pi(π)的近似值。有下列代码,通过前n 项的计算,求Pi的近似值。
s=0;n=0;i=0
n=int(input(”请输入n 的值”))
for i in range(2,2*n+1,①________):
s=s+②________
print (s)
pi=3+s*4
print(pi)
上述程序段中横线处应填入的代码分别为( )
A.①1 ②(-1)**(i/2+1)(i*(i+1)*(i+2))
B.①2 ②(-1)**(i/2+1)(i*(i+1)*(i+2))
C.①1 ②(-1)**(i∥2)/(i*(i+1)*(i+2))
D.①2 ②(-1)**(i∥2)/(i*(i+1)*(i+2))
B
【解析】 根据代码pi=3+s*4,可得s 的表达式为1/(2*3*4)-1/(4*5*6)+1/(6*7*8)-1/(8*9*10)…,根据i的初值为2,可以推断i 的值为2,4,6,8,…,步长是2,所以①处为2。还要解决符号问题,i 为2 的时候是-,为4的时候是+,为6的时候是-,为8的时候是+,表达式(-1)**(i/2+1)能解决这个加减问题,所以②为(-1)**(i/2+1)(i*(i+1)*(i+2)),故选项B 正确。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
12.小明用Python 程序对大小为100×100像素的图像“上.jpg”(如图所示)进行简单处理,部分代码如下:
img=Image.open(”上.jpg”)
im=np.array(img.convert(”L”)) #转换成数字矩阵
rows,cols=im.shape
for i in range(rows):
for j in range(cols):
if j%10==0:
im[i,j]=0
程序执行后的图像效果是( )
【解析】 根据“大小为100×100像素的图像”和语句rows,cols=im.shape可知,rows和cols的值为100;语句im[i,j]=0即第i行第j列设置为黑色,j%10=0,即第0,10,20,…,90列为黑色,选项D正确。
A. B. C. D.
D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
二、非选择题(本大题共3小题,第13题7分,第14题7分,第15题12分,共26分)
13.小王编写了一个“查找最长区间”的Python 程序,功能为:依次输入各个区间的起点和终点(数据均为整数,都用逗号分隔并以逗号结尾),程序运行之后显示最长的区间。例如,三个区间为(1,6),(10,23),(21,29),输入格式和程序运行界面如图所示:
实现上述功能的Python程序段如下:
s=input()
i=0;maxn=0;r=0
k=0;temp=0;j=0
while i<len(s):
①_________________
if ch>=”0” and ch<=”9”:
temp=temp*10+int(ch)
ch=s[i] (2分)
else:
k=k+1
if k%2==1:
j=temp
else:
r=temp
if maxn<r-j+1:
②______________________
ans=r
temp=0
③____________________
print(”最长的区间是”+str(ans-maxn+1)+”到”+str(ans))
请回答下列问题。
(1)请在横线处填入合适的代码。
maxn=r-j+1 (2分)
i=i+1 (2分)
(2)若输入内容的结束符缺失(即输入内容为 1,6,10,23,21,29),则执行该程序段后,变量r的值为______________。
【解析】 (1)①从前往后遍历字符串s,提取第i个字符放在ch中,故正确答案是ch=s[i];②统计长度,结尾减去开头,r是结尾处,所以要加1;③temp用来存储当前提取出的连续数据,k用来统计提取出的连续数据的个数,j表示当前区间的左端点值,r代表当前区间的右端点值,maxn表示最长区间的长度,ans表示最长区间的右端点值,最后循环变量i变化,提取下一个字符,循环重复上述过程,故正确答案是i=i+1。
23 (1分)
(2)数字29后面没有”,”,当遍历到最后一个字符时,执行then右面的表达式,temp=29,没有给当前区间的右端点赋值,此时r是上一个区间的右端点值,故r=23。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
14.一般使用2B铅笔填涂答题卡,填涂好的答题卡经过扫描后得到如图所示的数字化图像。从一个像素点的灰度值是否大于132判断是否被填涂开始,进而判断一个信息点是否被填涂。编写Python程序用于识别并统计填涂好的答题卡中的答案。
请回答下列问题。
(1)答题卡通常使用红色印刷,如使用黑色印刷,对答案识别
_____________(选填:有/无)影响。
(2)实现上述功能的Python程序段如下,请在横线处填入合适的代码。
from PIL import Image
x_start=11 # 起始点坐标
y_start=92
fill_width=24 # 信息点宽度
无 (1分)
fill_height=10 # 信息点高度
space_width=15 # 间隔宽度
space_height=12 # 间隔高度
ans_cnt=5 # 题目个数
def bw_judge(R,G,B): # bw_judge用于判断一个像素的填涂情况
Gray_scale=0.299*R+0.587*G+0.114*B
return Gray_scale<132
def fill_judge(x,y): # fill_judge用于判断信息点的填涂情况
count=0
for i in range(x,x+fill_width+1):
for j in range(① _________________________________________):
R,G,B=pixels[i,j]
if bw_judge(R,G,B)==True:
count=count+1
①y,y+fill_height+1或其他等价答案 (2分)
if count>=fill_width*fill_height*0.64:
return True
total_width=fill_width+space_width
total_height=fill_height+space_height
image=Image.open(”card.bmp”)
pixels=Image.load()
ans=””
item=['A','B','C','D']
list=[]
for col in range(ans_cnt):
x=②________________________________
for row in range(4):
y=y_start+total_height*row
if fill_judge(x,y)==True:
③________________________________
list.append(ans)
x start+total width * col (2分)
ans=ans+str(item[row]) (2分)
ans=””
print(list)
【解析】 (1)读取填涂情况,与答题卡本身的颜色无关。
(2)读取答题文件后,total_width表示答案格与间隔的总宽度,total_height表示答案格与间隔的总高度;用先列再行的方式读取每个选项的开始位置,x,y为每个选项的开始位置,再调用函数fill_judge()判断填涂情况,x,x+fill_width表示选项的X轴范围,y,y+fill_height+1表示选项的Y轴范围。如果fill_judge(x,y)==True成立,则表示该点已经填涂,在ans中记下填涂的答案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
15.小张喜欢用英文传递消息,但又不想传递的内容被别人知道,因此他想了一个两全其美的方法。他先给对方准备两张有n*n 个格子的纸,一张在某些格子处挖孔,另一张有n*n 个字,并告诉对方阅读方法:首先把挖孔的纸盖在另一张纸上,然后把露出来的字母按行从左到右写下来并将每个字母向左循环移一位(如取出是D,则左移为C。如是A,则左移为Z),一行读完后再从下一行继续,直到行读完。最后将挖孔的纸顺时针旋转90°,再读一遍,这样一共读四遍,就得到传递的内容。请回答下列问题。
(1)若挖孔纸(0 表示挖孔,1 代表不挖孔)如图1所示,有字纸的内容如图2 所示,则获取内容的前八位是__________________________。
图1 图2
图3
ZDHRTWHG (2 分)
(2)小张根据上述阅读规则,设计了一个Python程序,其运行界面如图3 所示。请在横线处填入合适的代码。
import random as rd
def proempty(n,m): #在n*n 的矩阵中随机产生m 个“孔”
empty=[[1 for i in range(n)] for j in range(n)]
s=[] #s 存储“孔”的位置
k=0
while k<m:
i=rd.randint(0,n-1)
j=rd.randint(0,n-1)
if①_____________________________________________________:
empty[i][j]=0
s.append([i,j])
k+=1
return empty
def turn(array): #将矩阵顺时针旋转90°
not[i,j] in s 或empty[i][j]!=0 或empty[i][j]==1(2 分)
matrix=[[0 for i in range(len(array))] for j in range(len(array))]
for i in range(len(array)):
for j in range(len(array)):
matrix[i][j]=array②_________________________________
return matrix
def eleque(array): #查找“孔”的位置
q=[]
for i in range(len(array)):
[len(array)-1-j][i] (2 分)
for j in range(len(array)):
if ③___________________________:
q.append([i,j])
return q
n=int(input(”输入纸张的大小: ”))
m=int(input(”输入挖孔的个数: ”))
s=input(”输入有字纸的内容: ”)
array[i][j]==0 (2 分)
#将输入内容转换成二维列表,存储在mw 中并输出有字纸的内容(如图2),代码略
emptya=proempty(n,m) #产生挖孔纸,如图1
#输出挖孔纸,代码略
mwstring=””;s=””
for cs in range(4):
que=eleque(emptya)
for j in range(len(que)):
ch=mw[que[j][0]][que[j][1]]
mwstring+=④___________________________________________
______________________________________
⑤_______________________________
print(”传递内容为: ”)
print(mwstring)
【解析】 (1)根据题意模拟。在如图1、2 所示的两个二维数组中,第一次读出字符AEIS,第二次读出字符UXIH,经过k=-1 的凯撒加密后的
chr((ord(ch)-65+25)%26+65) 或chr((ord(ch)
-65-1)%26+65)或其他等价答案 (2 分)
emptya=turn(emptya) (2 分)
字符串为ZDHRTWHG。
(2)程序分为三个自定义函数和一个主程序。第①空,函数proempty() 的作用是在n*n 的二维数组中随机生成不重复的m 个点,是典型的标记数组生成不重复元素的代码段。当empty[i][j]==1 时表示该索引未生成,标记该索引为0,否则重新生成;第②空,关于二维数组的旋转,如下图所示,二维数组旋转后,如果按行优先来生成旋转后的数组,则第i 行的元素来自于原数组第i 列,同时第i 行从左往右生成时,需要从元素组从下往上读取。因此答案为[len(array)-j-1][i]。
第③空,eleque()函数将“孔”的位置(索引)记录到列表中,以方便根据“孔”的索引依次读取字符,即当前array[i][j]==0 时记录该索引;第④空,是凯撒加密,题干要求向左循环移动即k=-1 的逆时针循环移动,这里可以直接使用ord('A')=65 来简化代码,对字符ch凯撒加密:chr((ord(ch)-66)%26+65)。最后,第⑤空是在当前读取完毕后继续旋转打孔纸,用于下一次读取字符,直接调用turn()函数更新emptya数组:emptya=turn(emptya)。
感谢聆听,再见!
-
+-+-
$$