综合核心素养测评卷(二) (原卷版+解析版)2025-2026学年浙江省高三信息技术一轮复习选择性必修一

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

综合核心素养测评卷(二) (原卷版+解析版)2025-2026学年浙江省高三信息技术一轮复习选择性必修一

资源简介

综合核心素养测评卷(二)
一、 选择题(本大题共12小题,每小题列出的四个备选项中只有一个是符合题目要求的)
1. 有中缀表达式为“4*6+(3+5)/2”,现利用栈计算该表达式:从左向右扫描,遇到数字时,直接将数字放到后缀表达式后方;当遇到运算符时,运算符入栈;若站内有多个运算符,优先级高的运算符必须先出栈放到后缀表达式中,然后优先级低的运算符再入栈。左右括号相遇后抵消。如此反复操作,直到栈为空为止。其后缀表达式是(  )
A. 46*35+2/+ B. 46*35+2+/
C. 4*635+2/+ D. 46*3+52/+
2. 有1个栈,从栈顶到栈底依次为元素a、b、c,并且已知元素d已入栈并出栈,则这四个元素的入栈顺序可能为(  )
A. c,d,b,a B. b,d,c,a
C. a,b,c,d D. d,a,b,c
3. 有如下Python程序段:
q,head,tail,ans=[""]*100,0,0,""
for i in range(len(s)):
  q[tail]=s[i]
  tail+=1
while head  ans=ans+q[head]
  head+=1
  if head    q[tail]=q[head]
    tail+=1
    head+=1
print(ans)
当s的值为字符串“QUEUE”时,程序输出的结果为(  )
A. QUEUE B. EUEUQ
C. QEUUE D. QEEUU
4. 已知二叉树的中序遍历序列是BEDAFHCIG,前序遍历序列是ABDECFHGI,则它的后序遍历序列是(  )
A. BDEFHCIGA B. IGHFEDCBA
C. EDBFHIGCA D. EDBHFIGCA
5. 有如下Python程序段:
def f(s):
  if len(s)==2:
    return s
  else:
    return f(s[len(s)//2+1:]+s[:len(s)//2])
print(f("abcde"))
当执行该程序段后,显示的结果是(  )
A. eb B. be
C. da D. ad
6. 有如下Python程序段:
s = I Love You HangZhou!
s1 =
for i in range(0, len(s), 3):
  c = s[i]
  if ord(c)>= ord( a ):
    c = chr(ord(c)- ord( a )+ ord( A ))
    s1 = c + s1
print(s1)
程序运行后,输出的值是(  )
A. OUAZU B. OUAU
C. UZAUO D. UAUO
7. 有如下Python程序段:
data= My Name is Tom!
imax,t=0,0
for ch in data:
  if ( A <=ch<= Z )or ( a <=ch<= z ):
    t+=1
  else:
    if t>imax:
      imax=t
    t=0
print(imax)
执行上述代码后,输出的内容是(  )
A. 2 B. 3
C. 4 D. 5
8. 有n名同学围成一圈,将同学们从1到n进行编号,然后从1号开始进行报数,报到m(m>1)的同学出局,输出每次出局同学的编号。画线处应填入的代码是(  )
que = [0] * 1000
n = int(input())
m = int(input())
tail, head = 0, 0
for i in range(1, n + 1):
  que[tail] = i
  tail += 1
num = 0
while head < tail:
    ①  
  head += 1
  num += 1
  if num == m:
      ②  
    num = 0
  else:
      ③  
    tail += 1
A. ①x = que[head] ②print(x, end=" ") ③que[tail] = x
B. ①x = que[tail] ②print(x, end=" ") ③que[tail] = x
C. ①x = que[head] ②x = que[head] ③print(x, end=" ")
D. ①x = que[tail] ②x = que[head] ③print(x, end=" ")
9. 数组元素d[0]至d[n-1]依次存放着n个不重复的升序数据,现需要将值为x的元素删除,例如,n为5,数组d为[2,3,6,8,9],待删除数x为8,删除操作后输出[2,3,6,9]。实现该功能的Python程序如下:
d=[2,3,6,8,9]
n=len(d)-1;i=0
x=int(input("请输入待删除数据:"))
while i   i+=1
for k in range(  ①  ):
    ②  
d=d[:-1]
画线处应填入的正确代码是(  )
A. ①i+1,n ②d[k+1]=d[k] B. ①i-1,n ②d[k-1]=d[k]
C. ①i,n-1 ②d[k]=d[k+1] D. ①i,n ②d[k]=d[k+1]
10. 有如下Python程序段:
#随机产生10个整型元素的非降序序列,依次存入列表a(a[0]!=a[9]),代码略
key=int(input())
i=0;j=9
n=0
while i<=j:
   m=(i+j)//2
   n+=1
   if a[m]     i=m+1
   else:
     j=m-1
执行上述程序段后,下列说法中,错误的是(  )
A. a[i+1]可能等于key B. a[j]可能等于key
C. i一定等于j+1 D. n的值一定大于2
11. 有如下Python程序段:
a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]
x=1
p=head=2
if x==a[p][0]:
  head=a[p][1]
else:
  while p!=-1:
    if x==a[p][0]:
      a[pre][1]=a[p][1]
    else:
      pre=p
    p=a[p][1]
运行该段程序后,a[2][1]的值为(  )
A. -1 B. 0
C. 1 D. 3
12. 有如下Python程序段:
head=4;tail=3
a=[3,6,7,12,4]
n=len(a)
while (head+1)%n!=tail:
  if a[head]%3!=0:
    head=(head+1)%n
  else:
    a[tail]=a[head]//3
    head=(head+1)%n
    tail=(tail+1)%n
print(a[head])
执行上述代码后,输出的内容是(  )
A. 2 B. 7
C. 3 D. 4
二、 非选择题(本大题共3小题)
13. 近期学校举办了运动会,小李协助老师完成实心球记分员的工作,他提前准备了Python程序,可以将每位运动员的成绩录入并存储。每位运动员均有自己的三位数编号(001—999)。实心球比赛采用三轮投掷模式,即第一轮全部运动员各投掷一次后,再进行第二轮、第三轮。每次运动员投掷后,小李将他的编号和此次成绩存入电脑,存储运动员的成绩时,采用链表结构进行存储。录入的同时,每条记录会按照选手编号进行升序排列。如图所示为小李最后一次输入后的数据截图。
请输入运动员编号:592
请输入该运动员成绩:13.2
head: 13
[[623,14.1,35],[766,12.5,39],[253,9.8,33],[277,10.2,42],[537,8.9,4],[674,13.1,31],[452,12.5,34],[176,10.6,40],[251,9.8,32],[831,15.1,-1],[247,8.7,38],[158,9.3,37],[293,10.5,36],[144,11.2,43],[592,14.1,30],[623,13.7,0],[766,9.9,1],[253,10.7,2],[277,10.2,3],[537,9.5,4],[674,11.6,5],[452,10.3,6],[176,10.3,7],[251,10.5,8],[831,14.5,9],[247,10.2,10],[158,10.5,11],[293,10.5,12],[144,13.0,41],[592,13.8,14],[623,14.0,15],[766,10.5,16],[253,10.2,17],[277,11.0,18],[537,11.3,19],[674,12.5,20],[452,13.0,211],[176,11.0,22],[251,9.5,23],[831,14.8,24],[247,9.5,25],[158,10.2,26],[293,9.3,27],[144,14.1,28],[592,13.2,29]]
例如,当前数据中,编号最小的运动员位于索引值为13的位置,值为[144,11.2,43],其中144是他的编号,11.2是他这一次的成绩,43是他另一条记录的索引地址。因此,他的另一条记录位于索引值为43的位置,值为[144,14.1,28],他的第三条记录位于索引值为28的位置,值为[144,13.0,41]。录入成绩的Python代码如下,请在画线处填入合适的代码。
d=[]
head=-1
bh=int(input( 请输入运动员编号: ))
cj=float(input( 请输入运动员成绩: ))
d.append([bh,cj,-1])
head,i=0,1
while i<=1000:
  bh=int(input( 请输入运动员编号: ))
  cj=float(input( 请输入运动员成绩: ))
  d.append([bh,cj,-1])
  p=head
  if bh       
    d[i][2]=p
  else:
    q=d[p][2]
    while d[q][0]      p=q
      q=d[p][2]
    d[p][2]=i
    d[i][2]=q
  i+=1
  print( head: ,head)
  print(d)
14. 自从学习了不同进制之后,小明设计了一个计算不同进制数的加法器,并用python编程实现。输入一个加法算式,加数可以是十进制数、二进制数或者十六进制数,程序的功能是输出它们的和。例如,输入形如“1010B+1DH+109D=”的加法算式后,执行程序,输出“和是148”的结果。Python代码如下。请回答下列问题:
s=input( 输入一个混合进制的加法算式: )
dic={ B :2, D :10, H :16}
st=[ ]*100
top, i, x, m=-1, 0, 0, 0
while i  if s[i]== + or s[i]== = :
    m=①   
    top=top-1
    t=0
    while top!=-1:
      if st[top]>= A and st[top]<= F :
        st[top]=ord(st[top])-ord( A )+10
      else:
        st[top]=int(st[top])
      ②   
      t=t+1
      top=top-1
  else:
    ③   
    st[top]=s[i]
  i=i+1
print( 和是 ,x)
(1)请在画线处填入合适的代码。
(2)若输入“1011B+2DH+178D”,则输出的结果是   。
15. 一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,那么称该序列为摇摆序列。小王同学想求出某个数列的最长摇摆子序列,以序列[3,14,7,6,9,12,10,8,13,5]为例,整体不是摇摆序列,但子序列[3,14,7,9]、[3,14,6,12]等都属于摇摆子序列,其中最长的摇摆子序列是[3,14,6,12,8,13,5]。根据图1分析得知,当序列有一段连续的递增(或递减)时,可形成摇摆子序列,我们只需要找到每一次转折中的拐点元素。
图1
小王编写了一个Python程序实现该功能:程序运行时,输入一串用逗号分隔和结束的数字,可以得到最长摇摆子序列的长度,以及具体的序列。程序运行界面如图2所示。
请输入以逗号分隔和结束的数据(不超过20个数):3,14,7,6,9,12,10,8,13,
最长摇摆子序列长度为:6
最长摇摆子序列为:3,14,6,12,8,13
图2
(1)若输入数据“2,4,5,3,2,1”,则最长摇摆子序列为   。
(2)实现上述功能的Python代码如下,请在画线处填入合适的代码。
s = input("请输入以逗号分隔和结束的数据(不超过20个数):")
a = [0] * 20; b = [False] * 20; flag, n, i, t, ans = 0, 0, 0, ,
def f(n):
  f = 1
  global ans     #global表示此处的ans就是全局变量ans
  ans = str(a[n - 1])
  for i in range(n - 2, -1, -1):
    if b[i]:
      f = f + 1
      ① ans=str(a[i])+ , +ans 
  return f
for ch in s:
  if ch == ",":
    a[i] = int(t); n += 1; i += 1; t = ""
  else:
    t = t + ch
for i in range(1, n):
  gd = True
  if flag == 0:
    if a[i] > a[i - 1]:
      flag = 1
    elif a[i] < a[i - 1]:
      flag = 2
    else:
      gd = False
  elif flag == 1 and a[i] < a[i - 1]:
    flag = 2
  elif ②   :
    flag = 1
  else:
    gd = False
  ③   
if f(n)< 3:
  print("不构成摇摆子序列")
else:
  print("最长摇摆子序列长度为", str(f(n)))
  print("最长摇摆子序列为:",ans)综合核心素养测评卷(二)
一、 选择题(本大题共12小题,每小题列出的四个备选项中只有一个是符合题目要求的)
1. 有中缀表达式为“4*6+(3+5)/2”,现利用栈计算该表达式:从左向右扫描,遇到数字时,直接将数字放到后缀表达式后方;当遇到运算符时,运算符入栈;若站内有多个运算符,优先级高的运算符必须先出栈放到后缀表达式中,然后优先级低的运算符再入栈。左右括号相遇后抵消。如此反复操作,直到栈为空为止。其后缀表达式是( A )
A. 46*35+2/+ B. 46*35+2+/
C. 4*635+2/+ D. 46*3+52/+
【解析】 本题考查栈操作的相关操作。依题意可得后缀表达式为:46*35+2/+ ,A正确。
2. 有1个栈,从栈顶到栈底依次为元素a、b、c,并且已知元素d已入栈并出栈,则这四个元素的入栈顺序可能为( A )
A. c,d,b,a B. b,d,c,a
C. a,b,c,d D. d,a,b,c
【解析】 本题考查栈的基本操作。根据题意栈中abc三个元素的状态,从栈顶到栈底依次是a、b、c,故入栈顺序c一定在b前,b一定在a前,B、C、D均错误。c入栈,d入栈,d出栈,b入栈,a入栈,即得到题干描述的状态,A正确。
3. 有如下Python程序段:
q,head,tail,ans=[""]*100,0,0,""
for i in range(len(s)):
  q[tail]=s[i]
  tail+=1
while head  ans=ans+q[head]
  head+=1
  if head    q[tail]=q[head]
    tail+=1
    head+=1
print(ans)
当s的值为字符串“QUEUE”时,程序输出的结果为( D )
A. QUEUE B. EUEUQ
C. QEUUE D. QEEUU
【解析】 本题考查队列的入队出队操作。该程序段由一个for循环和一个while循环构成。for循环:遍历字符串s,取出字符依次入队;while循环:若队列非空,队首元素出队并累加至字符串ans中,若队列仍非空,则当前的队首元素继续出队并在队尾入队,以此循环。循环结束后,ans的值应为“QEEUU”,程序输出的结果为QEEUU,D正确。
4. 已知二叉树的中序遍历序列是BEDAFHCIG,前序遍历序列是ABDECFHGI,则它的后序遍历序列是( D )
A. BDEFHCIGA B. IGHFEDCBA
C. EDBFHIGCA D. EDBHFIGCA
【解析】 根据二叉树的前序与中序,可画出如图所示的二叉树,再得出后序遍历序列是 EDBHFIGCA。D正确。
5. 有如下Python程序段:
def f(s):
  if len(s)==2:
    return s
  else:
    return f(s[len(s)//2+1:]+s[:len(s)//2])
print(f("abcde"))
当执行该程序段后,显示的结果是( A )
A. eb B. be
C. da D. ad
【解析】 本题考查递归算法及自定义函数知识。f( abcde )→f( deab )→f( bde )→f( eb )。A正确。
6. 有如下Python程序段:
s = I Love You HangZhou!
s1 =
for i in range(0, len(s), 3):
  c = s[i]
  if ord(c)>= ord( a ):
    c = chr(ord(c)- ord( a )+ ord( A ))
    s1 = c + s1
print(s1)
程序运行后,输出的值是( D )
A. OUAZU B. OUAU
C. UZAUO D. UAUO
【解析】 根据range函数的参数,是从字符串s中从索引0开始,依次取出下标为0、3、6……位置的字符,如果字符是小写,将它转为大写,并按逆序依次拼接。D正确。
7. 有如下Python程序段:
data= My Name is Tom!
imax,t=0,0
for ch in data:
  if ( A <=ch<= Z )or ( a <=ch<= z ):
    t+=1
  else:
    if t>imax:
      imax=t
    t=0
print(imax)
执行上述代码后,输出的内容是( C )
A. 2 B. 3
C. 4 D. 5
【解析】 本题考查字符串处理知识。根据代码可知,如果是大小写英文字母则计数器t+1,统计连续出现的字母数量(即单词的长度);如果非字母,即空格或感叹号,则取最长单词长度,并将t清0。由于字符串data中最长单词Name的字母数量为4,C正确。
8. 有n名同学围成一圈,将同学们从1到n进行编号,然后从1号开始进行报数,报到m(m>1)的同学出局,输出每次出局同学的编号。画线处应填入的代码是( A )
que = [0] * 1000
n = int(input())
m = int(input())
tail, head = 0, 0
for i in range(1, n + 1):
  que[tail] = i
  tail += 1
num = 0
while head < tail:
    ①  
  head += 1
  num += 1
  if num == m:
      ②  
    num = 0
  else:
      ③  
    tail += 1
A. ①x = que[head] ②print(x, end=" ") ③que[tail] = x
B. ①x = que[tail] ②print(x, end=" ") ③que[tail] = x
C. ①x = que[head] ②x = que[head] ③print(x, end=" ")
D. ①x = que[tail] ②x = que[head] ③print(x, end=" ")
【解析】 本题考查队列的基本操作及约瑟夫环问题的模拟思路。本题利用队列的数据结构解决约瑟夫环问题:报数的过程中,每个同学不断出列并入列,但是报到m的同学,出列但不入列,同时输出这个同学的编号。理解思路,并掌握队列的相关代码,可得出A正确。
9. 数组元素d[0]至d[n-1]依次存放着n个不重复的升序数据,现需要将值为x的元素删除,例如,n为5,数组d为[2,3,6,8,9],待删除数x为8,删除操作后输出[2,3,6,9]。实现该功能的Python程序如下:
d=[2,3,6,8,9]
n=len(d)-1;i=0
x=int(input("请输入待删除数据:"))
while i   i+=1
for k in range(  ①  ):
    ②  
d=d[:-1]
画线处应填入的正确代码是( D )
A. ①i+1,n ②d[k+1]=d[k] B. ①i-1,n ②d[k-1]=d[k]
C. ①i,n-1 ②d[k]=d[k+1] D. ①i,n ②d[k]=d[k+1]
【解析】 本题考查数组元素删除操作。由代码可知,第一个循环先找到值为x的数在列表d中的位置i,然后从位置i开始,自左向右将后面的值往前覆盖,直到最后一个位置n-1,此时数据往前覆盖的表达式为d[k]=d[k+1],D正确。
10. 有如下Python程序段:
#随机产生10个整型元素的非降序序列,依次存入列表a(a[0]!=a[9]),代码略
key=int(input())
i=0;j=9
n=0
while i<=j:
   m=(i+j)//2
   n+=1
   if a[m]     i=m+1
   else:
     j=m-1
执行上述程序段后,下列说法中,错误的是( B )
A. a[i+1]可能等于key B. a[j]可能等于key
C. i一定等于j+1 D. n的值一定大于2
【解析】 本题考查二分查找算法知识。由于这10个整型元素是非降序序列(相当于可能有相同数据的非严格升序排序),根据代码可知,若找到a[m]=key的值时,下标j向左移动,直到移出key所在的区域,因此循环结束后,a[j]的值肯定小于key,不可能等于key,B符合题意。a[i]的值肯定大于等于key值,若存在多个key值,则 a[i+1]也可能等于key。另外由于该二分查找找到key值后不退出(查找边界条件),因此循环结束后i一定等于j+1,且查找次数肯定大于2。B正确。
11. 有如下Python程序段:
a=[[1,3],[1,0],[7,1],[4,5],[1,-1],[6,4]]
x=1
p=head=2
if x==a[p][0]:
  head=a[p][1]
else:
  while p!=-1:
    if x==a[p][0]:
      a[pre][1]=a[p][1]
    else:
      pre=p
    p=a[p][1]
运行该段程序后,a[2][1]的值为( D )
A. -1 B. 0
C. 1 D. 3
【解析】 本题考查链表的遍历及删除节点操作。阅读代码可知,选择结构部分的操作为当x为当前链表头指针所指的节点的数据时,就删除头节点,如果不是就遍历后续节点并删除数据域为1的节点。因为删除需要记录当前节点的前驱节点,使用pre来存储。原链表为7→1→1→4→6→1。故删除了数据域为1的节点之后,数据7直接指向了数据4,故a[2][1]为3。D正确。
12. 有如下Python程序段:
head=4;tail=3
a=[3,6,7,12,4]
n=len(a)
while (head+1)%n!=tail:
  if a[head]%3!=0:
    head=(head+1)%n
  else:
    a[tail]=a[head]//3
    head=(head+1)%n
    tail=(tail+1)%n
print(a[head])
执行上述代码后,输出的内容是( A )
A. 2 B. 7
C. 3 D. 4
【解析】 本题考查循环队列知识。循环队列初始状态队列中有四个元素,从队首到队尾分别为4,3,6,7。当队列中仅剩一个元素时退出循环。第一次循环,a[head]为4,执行if语句第一个分支,队列元素为3,6,7;第二次循环,a[head]为3,执行else语句,队列元素为6,7,1;第三次循环,a[head]为6,执行else语句,队列元素为7,1,2;第四次循环,a[head]为7,执行if语句第一个分支,队列元素为1,2;第五次循环,a[head]为1,执行if语句第一个分支,队列元素为2,此时退出循环。A正确。
二、 非选择题(本大题共3小题)
13. 近期学校举办了运动会,小李协助老师完成实心球记分员的工作,他提前准备了Python程序,可以将每位运动员的成绩录入并存储。每位运动员均有自己的三位数编号(001—999)。实心球比赛采用三轮投掷模式,即第一轮全部运动员各投掷一次后,再进行第二轮、第三轮。每次运动员投掷后,小李将他的编号和此次成绩存入电脑,存储运动员的成绩时,采用链表结构进行存储。录入的同时,每条记录会按照选手编号进行升序排列。如图所示为小李最后一次输入后的数据截图。
请输入运动员编号:592
请输入该运动员成绩:13.2
head: 13
[[623,14.1,35],[766,12.5,39],[253,9.8,33],[277,10.2,42],[537,8.9,4],[674,13.1,31],[452,12.5,34],[176,10.6,40],[251,9.8,32],[831,15.1,-1],[247,8.7,38],[158,9.3,37],[293,10.5,36],[144,11.2,43],[592,14.1,30],[623,13.7,0],[766,9.9,1],[253,10.7,2],[277,10.2,3],[537,9.5,4],[674,11.6,5],[452,10.3,6],[176,10.3,7],[251,10.5,8],[831,14.5,9],[247,10.2,10],[158,10.5,11],[293,10.5,12],[144,13.0,41],[592,13.8,14],[623,14.0,15],[766,10.5,16],[253,10.2,17],[277,11.0,18],[537,11.3,19],[674,12.5,20],[452,13.0,211],[176,11.0,22],[251,9.5,23],[831,14.8,24],[247,9.5,25],[158,10.2,26],[293,9.3,27],[144,14.1,28],[592,13.2,29]]
例如,当前数据中,编号最小的运动员位于索引值为13的位置,值为[144,11.2,43],其中144是他的编号,11.2是他这一次的成绩,43是他另一条记录的索引地址。因此,他的另一条记录位于索引值为43的位置,值为[144,14.1,28],他的第三条记录位于索引值为28的位置,值为[144,13.0,41]。录入成绩的Python代码如下,请在画线处填入合适的代码。
d=[]
head=-1
bh=int(input( 请输入运动员编号: ))
cj=float(input( 请输入运动员成绩: ))
d.append([bh,cj,-1])
head,i=0,1
while i<=1000:
  bh=int(input( 请输入运动员编号: ))
  cj=float(input( 请输入运动员成绩: ))
  d.append([bh,cj,-1])
  p=head
  if bh      head=i 
    d[i][2]=p
  else:
    q=d[p][2]
    while d[q][0]      p=q
      q=d[p][2]
    d[p][2]=i
    d[i][2]=q
  i+=1
  print( head: ,head)
  print(d)
【解析】 本题考查链表节点的插入和删除。从图中可知,插入运动员编号为592,出现在列表的最后一个位置,根据题目要求,实现按运动员编号进行升序排列,当输入运动员编号和成绩时,语句d. append([bh,cj,-1])表示先产生一个新的节点,从链表的头节点开始查找运动员编号的位置,如果bh小于头指针的编号d[head][0],把新产生的节点插入到头节点前,作为新的头节点,因此需修改原头节点指针d[i][2]=p,同时修改头指针的值,因此此处应修改为head=i。
14. 自从学习了不同进制之后,小明设计了一个计算不同进制数的加法器,并用python编程实现。输入一个加法算式,加数可以是十进制数、二进制数或者十六进制数,程序的功能是输出它们的和。例如,输入形如“1010B+1DH+109D=”的加法算式后,执行程序,输出“和是148”的结果。Python代码如下。请回答下列问题:
s=input( 输入一个混合进制的加法算式: )
dic={ B :2, D :10, H :16}
st=[ ]*100
top, i, x, m=-1, 0, 0, 0
while i  if s[i]== + or s[i]== = :
    m=① dic[st[top]] 
    top=top-1
    t=0
    while top!=-1:
      if st[top]>= A and st[top]<= F :
        st[top]=ord(st[top])-ord( A )+10
      else:
        st[top]=int(st[top])
      ② x=x+st[top]*m**t 
      t=t+1
      top=top-1
  else:
    ③ top=top+1  
    st[top]=s[i]
  i=i+1
print( 和是 ,x)
(1)请在画线处填入合适的代码。
(2)若输入“1011B+2DH+178D”,则输出的结果是 和是68 。
【解析】 程序可知st列表中保存着当前加数的每一位。如对于式子“1010B+1DH+109D=”,当读到第一个加号时,st列表的值为["1","0","1","0","B"], 读到第二加号时,st的值是 ["1","D","H"],读到最后‘=’号时,st的值是["1", "0","9","D"]。(1)①st列表的最后一位是进制编号,读取st最后一位,通过字典dic得到进制值。②使用权值法把st列表中保存的进制数转换为十进制数。③读取到加数的每一位数字,都保存在st列表中的相应位置。(2)由于式子中的最后一位不是 + 或者 = , 所以st列表中的最后一个数字没有加上。故和是68。
15. 一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,那么称该序列为摇摆序列。小王同学想求出某个数列的最长摇摆子序列,以序列[3,14,7,6,9,12,10,8,13,5]为例,整体不是摇摆序列,但子序列[3,14,7,9]、[3,14,6,12]等都属于摇摆子序列,其中最长的摇摆子序列是[3,14,6,12,8,13,5]。根据图1分析得知,当序列有一段连续的递增(或递减)时,可形成摇摆子序列,我们只需要找到每一次转折中的拐点元素。
图1
小王编写了一个Python程序实现该功能:程序运行时,输入一串用逗号分隔和结束的数字,可以得到最长摇摆子序列的长度,以及具体的序列。程序运行界面如图2所示。
请输入以逗号分隔和结束的数据(不超过20个数):3,14,7,6,9,12,10,8,13,
最长摇摆子序列长度为:6
最长摇摆子序列为:3,14,6,12,8,13
图2
(1)若输入数据“2,4,5,3,2,1”,则最长摇摆子序列为 2,5,1 。
(2)实现上述功能的Python代码如下,请在画线处填入合适的代码。
s = input("请输入以逗号分隔和结束的数据(不超过20个数):")
a = [0] * 20; b = [False] * 20; flag, n, i, t, ans = 0, 0, 0, ,
def f(n):
  f = 1
  global ans     #global表示此处的ans就是全局变量ans
  ans = str(a[n - 1])
  for i in range(n - 2, -1, -1):
    if b[i]:
      f = f + 1
      ① ans=str(a[i])+ , +ans 
  return f
for ch in s:
  if ch == ",":
    a[i] = int(t); n += 1; i += 1; t = ""
  else:
    t = t + ch
for i in range(1, n):
  gd = True
  if flag == 0:
    if a[i] > a[i - 1]:
      flag = 1
    elif a[i] < a[i - 1]:
      flag = 2
    else:
      gd = False
  elif flag == 1 and a[i] < a[i - 1]:
    flag = 2
  elif ② flag==2 and a[i]>a[i-1] :
    flag = 1
  else:
    gd = False
  ③ b[i-1]=gd 
if f(n)< 3:
  print("不构成摇摆子序列")
else:
  print("最长摇摆子序列长度为", str(f(n)))
  print("最长摇摆子序列为:",ans)
【解析】 本题考查数组的应用。(2)①其中列表a用于存储输入的数据元素,列表b用于记录是否为拐点,n为输入的数据元素个数,ans记录最长摇摆子序列的具体元素,函数f(n)用于统计摇摆子序列的长度,若小于3,则不是摇摆子序列,若大于等于3,则构成摇摆子序列。函数f(n)中从后往前遍历b数组,若为True,则i为拐点,将元素a[i]记录到ans中,由于是从后往前遍历数组,因此此处应填ans=str(a[i])+ , +ans。②flag数组用于记录摇摆序列的前一次状态,若为初始状态则为0,若为递增状态则为1,若为递减状态则为2。联系前一个elif,则这次elif情况为:前一次状态为递减,且当前a[i]>a[i-1]时,变换状态为递增。因此此处应填flag==2 and a[i]>a[i-1]。③循环中i从1开始进行枚举a数组元素,gd记录是否为拐点,是拐点则为True,否则是False。flag状态未改变则不是拐点,gd值为False。由于flag是摇摆序列的前一次状态,因此状态变换时实际上拐点为i-1,因此此处应填b[i-1]=gd。

展开更多......

收起↑

资源列表