第三章 课时8 解析、枚举算法及程序实现 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

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

第三章 课时8 解析、枚举算法及程序实现 教案 浙教版(2019)必修1(课件 学案 教案三份打包)

资源简介

课时8 解析、枚举算法及程序实现
课时目标
1.掌握解析和枚举算法的基本思想。2.掌握使用解析和枚举算法解决实际问题的基本方法,并通过编写程序实现问题求解。
一、解析算法的基本思想
解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式,并通过表达式的计算来实现问题的求解。
二、解析算法解题的基本思路
1.建立正确的数学模型,即得出正确的数学代数式。
2.将数学代数式转化为Python式子。
三、解析算法程序实现的步骤
1.运用解析算法分析问题,寻找问题中各要素之间的关系,用数学表达式表示它们的关系。
2.写出解决问题的解析步骤,编写程序实现,通过运行程序求得问题的正确解。
四、枚举算法的基本思想
枚举算法的基本思想是把问题所有可能的解一一列举,然后判断每一个列举出的可能解是否为正确的解。
枚举算法常用于解决是否存在或有多少种可能等类型的问题。
五、枚举算法的基本框架
1.枚举算法三要素
枚举范围、枚举对象、判断条件。
2.基本框架
循环结构
分支结构
枚举范围是用来表示枚举对象存在的一个连续区间,用循环结构语句实现。
判断条件用来检测当前枚举的对象是否为问题的解。
                
例1 已排序的列表a有n个整型元素,现要查找出现次数最多的值并输出。若出现次数最多的值有多个,则输出最前面的一个。实现该功能的程序段如下,方框中应填入的正确代码为 (  )
c,m,v =1,1,0
for i in range(1,n):
    
print(a[v])
A.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
 else:
   c=1
B.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
   else:
    c=1
C.if a[i]==a[i-1]:
   c+=1
 else:
   if c>m:
    m=c
    v=i-1
    c=1
D.if a[i]==a[i-1]:
   c+=1
 else:
  if c>m:
    m=c
    v=i-1
  c=1
答案 A
解析 本题考查一维列表的遍历和最值的查找。 已排序的列表a有n个整型元素,当条件a[i]==a[i-1]成立时,表示有连续相等的数量c。A选项每找到一个相等的值,求解数量的最大值,并保存此时的索引位置v,若不相等时初始化c的个数为1。B选项初始化c的个数就在两个不相等的值时。C选项当两个数相等时进行计数,当两个数不相等时,进行最值的查找,同时初始c的值为1,但该选项c的初始化发生在找到最大值时。D选项若长度的最大值发生在最后,即该列表最后的几个数是长度是最大值时,只是在进行计数,并未进行最大值的查找。
例2 某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
箱子类型 操作类型 货位编号
B 放置 5
A 放置 2,3
B 放置 0
A 放置 7,8
A 搬离 2,3
(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为    个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取货位总数存入n,代码略。
cnt1=n
lst=[0]*n #货位状态,0表示对应的货位为空
while True:
  #读取本次已描过数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略
  if t=="A":
    w=2
  ①    :
    w=1
  else: #不是"A"或"B"时退出循环
    break
  if d== "P": #d为P时表示放置,否则表示搬离
    ②    
  else:
    cnt1+=w
  lst[s]=1-lst[s]
  if t=="A":
    lst[s+1]=1-lst[s+1]
  i,cnt2=0,0
  while i< n-1:
    if lst[i]==0 and lst[i+1]== 0:
      ③   
      cnt2+= 1
    i+=1
  print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)
答案 (1) 2或两 (2)①elif t=="B"或elif (t=='B') ②cnt1-=w或cnt1=cnt1 - w ③i +=1或i=i+1
解析 本题考查列表的遍历。(1)经过放置或搬离操作后,索引位置1-4是空的,6和9是空的,因此可以放置A型箱子2个。(2)① w是两种箱子所占货位,因此当输入是B是占位为1。②cnt1是当前空货位数,d为P时表示放置,否则表示搬离,条件不成立时,空位增加,因此条件成立时,空位减少。③cnt2表示还可放置A型箱子的最多数量,当条件lst[i]==0 and lst[i+1]== 0成立时,表示可以放置A类型,因此下一个货位要跳过。
例3 快递分拣机器人会根据指令将快递送到指定的位置。某款快递分拣机器人有“东西南北”四个方向移动的指令,比如指令“西1”表示朝西移动1个单位的距离。机器人的起点位置在(0,0),当服务器下达指令“西3”“北2”“东5”“南7”“东3”后,机器人行走路线如图a所示。
图a
根据快递分拣机器人行走规则,小明编写程序实现功能如下:程序运行时,输入机器人的起点坐标位置(输入x坐标和y坐标并以逗号分隔),根据给定的指令模拟机器人行走,依次输出机器人经过点的坐标位置,最后输出终点离起点的直线距离并保留两位小数。
(1)如果机器人的起点坐标位置为(0,0),执行指令“西1”“北1”“东5”“南3”“东2”后,终点z坐标位置为    。
(2)请在划线处填入合适的代码。
d = ['西','北','东','南','东'] #行走方向
s = [3,2,5,7,3] #行走长度
start = input('请输入起点坐标位置(逗号分隔):')
for i in range(len(start)):
  if start[i] == ',':
    ①   
x0 = int(start[0:pos])
y0 = int(start[pos+1:len(start)])
x,y = x0,y0
②   
for i in range(n):
  if d[i] == '东':
    x = x + s[i]
  elif d[i] == '西':
    x = x - s[i]
  elif d[i] == '南':
    y = y - s[i]
  else:
    ③   
  print('(', x ,',' , y,')')  #输出经过点的坐标
④   
dist = round(dist,2)
print('距离起点的直线距离为',dist)
答案 (1)(6,-2) (2)①pos = i
②n = len (d)
③y = y+s [i]
④dist =((x-x0)**2+(y-y0 )**2)**0.5
解析 本题考查解析算法。(1)依次经过的坐标为(-1,0),(-1,1),(4,1),(4,-2)(6,-2)。
(2)①输入起点坐标位置(逗号分隔),找到逗号位置并赋值给pos。②d表示行走方向,需要行走的步子。③方向依次为东南西北,向北y的值增加,x的值不变。④利用两点公式计算两点(x0,y0)、(x,y)之间的距离。
变式训练1 某Python程序段如下:
info=["男",79,"女",97,"女",94,"男",91,"女",85,"女",100,"男",82]
tot=0
c=0
for i in range(0,len(info),2):
  if info[i]=="男":
    continue
  tot+=info[i+1]
  c+=1
print(round(tot/c,1))
运行该程序段,输出结果是    。
答案 94.0
解析 本题考查循环中continue的相关知识,程序中用到计数器和累计器。男生跳过循环,那么只统计女生的数值,平均数=总计/数量。
例4 我国《算经》中经典的“百钱买百鸡”问题,描述如下:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何
现A、B、C三位同学分别编写了计算机程序解决该问题。程序代码如下,请回答下列问题。
A同学的程序:
na = 0
for x in range(21):
  for y in range(34):
    for z in range(101):
      na += 1
      if ①    :
        print(x,y,z)
B同学的程序:
nb = 0
for x in range(21):
  for y in range(34):
    nb += 1
    ②   
    if x * 5 + y * 3 + z / 3 == 100:
      print(x,y,z)
C同学的程序:
nc = 0
for x in range(0,21,③    ): #划线③处要求填入后算法效率最高
  nc += 1
  y = 25 - 7 * x ∥ 4
  z = 100 - x - y
  if x * 15 + y * 9 + z == 300 and y >= 0:
    print(x,y,z)
(1)A、B、C 三位同学解决“百钱买百鸡”问题均使用了    (单选,填字母:A.解析 /B. 枚举)算法。
(2)请在划线处填入合适的代码。
(3)程序运行后,变量 na、nb、nc 的大小关系为    (单选:填字母。选项中的表达式均为数学表达式)
A.na=nb=nc B.na>nb>nc
C.nanc
答案 (1)B (2)①x+y+z==100 and x*5+y*3+z/3==100或者x+y+z==100 and x*15+y*9+z==300 ②z=100-x-y ③4 (3)B
解析 本题考查枚举算法。(1)对每一种解进行判断,属于枚举算法。(2)表达式y=25-7*x∥4,若要保证y是整数,x必须是4的倍数,因此步长为4。(3)循环次数依次为21*34*101、21*34和6次。
变式训练2 有Python程序段如下,执行该程序段后,变量sum的值为 (  )
m="p25y3t12h8n5"
sum=t=0
flag=True
for ch in m:
  if "0"<=ch<="9":
    t=t*10+int(ch)
  else:
    if flag==True:
      sum+=t
    t=0
    flag=not flag
print(sum)
A.53 B.48 C.32 D.11
答案 D
解析 本题考查循环结构的综合应用。用ch来便遍历符串m,用t来存储数字,当找到第一个非数字字符且flag为True时,将t的值累加入sum,只有当遇到非数字字符时才将数字累加入sum,最终sum的值为11,答案为D。
例5 在“三位一体”招生考试中学考成绩占据一定的比例。表1为某高校学考等级成绩折算表(学考等级分为A、B、C、D、E),少于5A计0分;表2为某学生的学考等级成绩单。
表1 某高校学考等级成绩折算表
学业水平考试等级 A B C D
成绩折算(分) 10 8 6 4
表2 某学生学考等级成绩单
科目 语文 数学 英语 物理 化学 生物 政治 历史 地理 技术
等级 A A A A A B A C B A
编写Python程序实现学考成绩总分折算。表2学生的折合分数如图所示。
(1)若输入的学生学考等级为“AAAABBBBCC”,则折合分数为:    。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
s=input("请输入各学科学考等级:")
num=0
scores=0
for t in ①    :
  if t=="A":
②   
scores+=10
  elif t=="B":
scores+=8
  elif t=="C":
scores+=6
  elif t=="D": #③
scores+=4
if num<5:
  print("折合分数为0分")
else:
  print("折合分数为:",scores)
(3)若将③处代码改为“else:”,对程序运行结果是否有影响     (选填文字:是/否);并说明理由_______________________________。
答案 (1)0 (2)①s或其他等价答案
②num+=1或num=num+1 (3)是 无法排除“E”情况,“D”“E”统加4分
解析 本题考查枚举算法。(1)A等的个数为4,少于5,得分为0。(2)从条件t=="A"来看,t可能是AB等等级名称,因此t是s中某个字符,①处答案为s。从等级成绩折算表来看,A等为10分,scores为折算分。少于5A计0分,结合条件num<5来看,num应为A等的个数,②处统计A等个数。(3)题目中对ABC等级分别进行了赋值,等级还有DE的可能性,若直接用else,对E等也进行了赋值,不正确。
变式训练3 某密码强度判断程序功能如下:将密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型。输入一串密码字符,如果该字符串的长度小于8,则输出“密码长度不符合要求!”;若该字符串包含三种字符及以上,则输出“强度:强”;若该字符串包含两种字符,则输出“强度:中”;若该字符串仅包含一种字符,则输出“强度:弱”。
(1)实现上述功能的Python程序如下,请补充完整程序代码。
r =[0]*4;sum=0
s=input("输入密码:")
①     
if n<8:
  print("密码长度不符合要求!");
else:
  for②      :
    ch =s[i]
    if ch>="a" and ch<="z":
      r[0]=1
    elif ch>="A" and ch<="Z":
      r[1]=1
     ③      :
      r[2]=1
    else:
      r[3]=1
    sum=r[0]+r[1]+r[2]+r[3]
    if sum>=3:  
      print("强度:强")
    elif④      :
      print("强度:中")
    else:  
      print("强度:弱")
(2)若输入的密码字符串为“Asd 237”,则输出的结果为    。
答案 (1)①n=len(s) ②i in range(0,n,1)或i in range(0,n)或i in range(n)或i in range(len(s))或其它等价表达式 ③elif "0"<=ch<="9"或elif ch>="0" and ch<="9" ④sum==2或sum>1或sum>=2
(2)“密码长度不符合要求!”(双引号没有也正确)
解析 本题考查字符串遍历和多分支选择结构。(1)在条件语句if n<8中,将判断密码的长度,因此①处答案为n=len(s)。对符合长度的密码进行遍历,结合语句ch=s[i]来看,变量i是字符串索引值,因此②处通过循环获取密码各个字符的索引位置。密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型,因此③中将判断该字符ch是否属于数字字符类型。变量sum表示字符类型的种类数量,密码强度为中,需包含2种类型的字符,在第二分支中,条件sum>=3已经不成立,即sum的值只要大于1或大于等于2即可。(2)密码字符串“Asd 237”的长度值为7,属于密码长度不符合要求。
                
1.有如下Python程序段:
listn=[0]*10
for i in range(len(listn)):
  if i==0 or i==1:
    listn[i]=1
  else:
    listn[i]=listn[i-1]+listn[i-2]
执行该程序段后,listn[9]的值为 (  )
A.55 B.34 C.21 D.0
答案 A
解析 本题考查枚举算法。满足条件i==0 or i==1,表示列表前两项的值为1。从第3项开始,为前两项之和。
2.某Python程序代码如下:
a=[10,5,2,11,7,6]
c=0
i=0
while i  if a[i]%2==0:
    c-=a[i]
a[i]∥=2
  else:
    c+=a[i]
    i=i+1
print(int(c))
程序执行后,输出的结果是 (  )
A.5 B.14 C.23 D.51
答案 B
解析 本题考查枚举算法。将其中的偶数减去a[i],并将a[i]进行折半,加个奇数。
3.斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、……,即从数列的第三项开始,当前项
为前两项之和,编写程序实现求斐波那契数列的第n项的值。
(1)用Python语言编写的程序如下,请在划线处填入合适的代码,实现程序功能。
n=int(input("输入n的值:"))
a=b=1
for i in range(3,n+1):
c=a+b
①     
print("第n项为:"+②      )
(2)当输入n=10,则程序输出的第n项为    。
答案 (1)①a,b=b,c ②str(c) (2)55
解析 (1)本题采用迭代法求斐波那契数列,斐波那契数列的规律为:从第三项开始,当前项为前两项之和,因此求出c后,应更新a、b的值为b、c,以便求解数列的下一项,因此①处代码为a,b=b,c;第n项的值为c,由于print语句输出时使用了“+”号,因此需使用str函数将c转换为字符型,即②处代码为str(c)。
(2)可以根据斐波那契数列的特点推算出,第10项为55。
4.有如下Python程序段:
count=0
for i in range(100,1000,1):
  if i% 10==i∥100:
    count+=1
执行该程序段后,count的值为    。
答案 90
5.有如下Python程序段:
s="AAACBBBBCBBB"
count=1;cmax=1;last=s[0]
for i in s[1:len(s)]:
  if last==i:
    count+=1
  else:
    last=i
    count=1
  if cmax    cmax=count
执行该程序段后,cmax的值为    。
答案 4
6.某Python程序实现的功能:运行程序输入一个四位整数,能够判断该四位整数是否存在数字重复的位。程序代码如下:
n=int(input("请输入一个四位正整数:"))
f=[0]*10
while n>0:
  y=n%10
  ①   
  n=n∥10
if ②    :
  print("有重复的位。")
else:
  print("没有重复的位。")
划线处的代码应填 (  )
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
答案 A
解析 本题考查桶的算法思想。表达式n%10的功能是取出个位数,语句n=n ∥ 10的功能是去除个位数。语句f[y]=1的功能是y是否出现过,如果出现为1,没有出现为0。语句f[y]+=1的功能是统计y出现的次数。sum(f)是统计f列表元素之和。
7.水往低处流,下雨时道路上的低洼地(两边高中间低的凹处)总会有积水。例如某地面高度数据为“0,0,2,1,2,0,0,1”,则该地面有 2 处低洼地。实现该算法的程序段如下:
gd=input("请输入地面高度,以空格间隔开:")
h=list(map(int,gd.split(","))) #将字符串转换为列表,例如"1,0,2",转换为[1,0,2]
cnt=0  
f=False
for i in range(1,len(h)):
  if ①    :
    f=True
  elif h[i-1]    cnt+=1
    ②   
print("该地面有",cnt,"处低洼地。")
上述代码中划线处应填入的代码是 (  )
A.①h[i]>h[i+1] ②f=False
B.①h[i]>h[i+1] ②f=True
C.①h[i-1]>h[i] ②f=False
D.①h[i-1]>h[i] ②f=True
答案 C
解析 本题考查在一个序列中查找一个下降子序列。flag是下降段的标志,从索引1开始遍历,若他比他前面的数小,表示处理下降段,将flag置为True。在下降过程中,若他比他前面的数大,表示从该位置开始处理上升段,因此将增加一个下降段,同时将标志设置为False。
8.m钱买n鸡问题。用m元买n只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3只,输出用m钱买n鸡的所有方案及方案总数。
编写程序实现上述功能,程序运行效果如图所示。
请输入钱:50请输入要买的鸡的数量:20方案1:3 11 6方案2:7 4 9共有方案数:2
实现上述功能的程序如下,请在划线处填入合适的代码。
count=0
m=int(input("请输入钱:"))
n=int(input("请输入要买的鸡的数量:"))
for i in range(m∥5+1):
  for j in range(m∥3+1):
   k=①     
   if②      :
      count+=1
      print("方案",count,":",i,j,k)
print("共有方案数:",count)
答案 ①n-i-j ②5*i+3*j+k/3==m
解析 本题主要考查的是枚举算法的综合应用。本题的枚举对象有两个,分别是公鸡和母鸡的数量,i表示公鸡的数量,j表示母鸡的数量,k表示小鸡的数量,已知公鸡、母鸡和小鸡共有n只,因此①处的代码为n-i-j;如果买公鸡、母鸡和小鸡的钱正好是m元,表示当前的购买方案可行,则进行计数,并输出购买方案,因此,②处的代码为5*i+3*j+k/3==m,需注意的是判断条件不能写为5*i+3*j+k∥3==m。
                
一、基础巩固
1.有如下Python程序段:
str1=input("输入一组由身高和体重构成的有规律字符串:")
hmax=int(str1[0:3])
wmin=int(str1[4:6])
for i in range(0,len(str1),7):
  h=int(str1[i:i+3])
  w=int(str1[i+4:i+6])
  if h>hmax and w    hmax=h
    wmin=w
运行该程序段,输入"176/65/169/59/180/62/185/63/"(输入时,不含前后的双引号),待程序段结束后,变量hmax、wmin的值分别为 (  )
A.180 62 B.185 63 C.169 59 D.185 59
答案 A
解析 本题考查枚举算法。查找一个身高是最高的,同时体重也是最小的。
2.现要通过Python程序输出所有既是对称数,又是素数的三位数,比如:101、131、727等(对称数是它的各位数字是左右对称的数,素数是除了1和它本身以外,不能被其他任何整数整除的数),其功能实现的Python程序如下:
for num in range(100, (1)  ,1):
  flag1=False
  flag2=True
  a=num%10
  b= (2) 
  if a==b:
    flag1=True
  for i in range(2,num,1):
    if num%i==0:
      flag2= (3) 
  if flag1 and flag2:
    print(num)
上述程序中划线处可选语句为:
①999 ②1000 ③num∥100
④num∥10%10 ⑤False ⑥True
为了实现题干描述功能,则(1)(2)(3)划线处语句依次为 (  )
A.①④⑥ B.②④⑤ C.②③⑥ D.②③⑤
答案 D
解析 本题考查枚举算法。查找一个三位数,因此(1)中应为1000,取到的num最大值为999。(2)处b是最高位,因此需整除100。(3)处素数不能被2至num-1之间的数整除,如果除通,则设计标志为False。
3.有如下Python程序,程序执行,输入数据k之后输出的结果不正确的是 (  )
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])
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]
答案 C
解析 本题考查循环和分支结构的综合应用。综合分析程序可得for循环用循环变量i作为位置来遍历列表L的前八位元素,当相应位置上的值不大于输入的k值时,将i位置上的元素赋值到j位置上,并且更新j的的值,若是i位置上的值大于输入的k值,则不做任何处理,因此可以大致得到该程序的作用是将列表L前八位元素中不大于k的值依次前移并且输出新列表。C选项中最后一个10的索引值为8,访问不到,因此错误。
4.有如下程序段:
s=input("请输入字符串:")
count=0
for i in s:
   if i>="0" and i<="9":
     count+=1
print(s[count:count+3])
若输入的字符串为“AB12CCC222GGBD”则程序运行结果为 (  )
A.CCC B.GGBD C.CC2 D.C22
答案 C
解析 本题考查枚举算法,统计数字的个数,count的值为5,因此从索引5至7的字符串。
5.有下列Python程序段:
s="6p25y3t"
sum,t=0,0
flag=True
for ch in s:
  if "0"<=ch<="9":
    t=t*10+int(ch)
  else:
    if flag==True:
      sum+=t
    t=0
    flag=not flag
执行该程序段后,变量sum的值为 (  )
A.6 B.9 C.28 D.34
答案 B
解析 本题综合考查了算法的控制结构,特别是分支结构及循环结构的应用。ch作为循环变量遍历字符串s,分析内部分支结构可知,当ch取到非数字字符时,t归零,并结合第一个分支的语句块可得t用于表示当前通过ch遍历字符串得到的数字,题中分别为6,25,3,找到非数字字符时修改flag的值为not flag,因此flag的变化过程为T,F,T,F,而只有当flag为True时才会将t的值累加如sum,因此sum=0+6+3=9,选择B。
6.在一个包含数字和其他非数字字符混合的原始数据中,提取其中的连续数字,当数据中存在多个数字串,以“,”间隔不同数字串。如字符串China86USA1HK852中包含86,1,852三个数字串。
实现该功能的程序代码如下,请将空白处填写完整。
s="China86USA1HK852"
ans="";flag=False
for i in s:
  if ①     :
    ans+=i
    ②    
  ③     :
    ans+=","
    flag=False
print("提取的数字有:"+ans)
答案 ①"0"<=i<="9" ②flag=True
③elif flag
解析 ①遍历字符串s,如果遍历到数字。②flag是数字串开始的标志,如果是数字则flag值为True。③若不是数字,分为前面是数字和前面不是数字两种情况。
7.黑洞数。黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去数字组成的最小数,它们的差等于原来的整数。例如3位黑洞数是495,因为954-459=495,4位数字的黑洞数是6174,因为7641-1467=6174。编写程序,功能如下:输入整数n,输出3位~n位整数中的黑洞数。程序运行效果如图所示。
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=int(input("输入n:"))
count=0
for x in range(3,n+1):
  start=10**(x-1)
  ①     
  for i in range(start,end):
#把数字转换字符后拼接,并按降序排列
maxnum=".join(sorted(str(i),reverse=True)) 
minnum=".join(reversed(maxnum)) #将maxnum中字符升序排列后拼接
②     
   if dis==i:
     print(i)
     count=count+1
print("count="+③      )
答案 ①end=10**x ②dis=int(maxnum)-int(minnum) ③str(count)
解析 根据代码range(start,end)可知,长度为x位的整数范围为[start,end-1],因此①处代码end=10**x;②处代码的功能是求最大数与最小数的差,根据if语句可知,两数之差存储在变量dis中,因为maxnum和minnum是数字字符串,所以在求差之前应将其转换为整数类型,因此,②处代码为dis=int(maxnum)-int(minnum);count用来计数,统计黑洞数的个数,由于输出时使用了“+”后,因此需将count转换为字符串型,即③处代码为str(count)。
8.某网站要求新注册用户的密码必须以字母开头,并且含有字母(区分大小写)、数字和特殊符号(!、@、#、$、%、&、*,7个符号中只要有一个即可),密码长度为8~18个字符。
下列程序的功能是判断用户输入的密码是否合法。
password=input("please input password:")
check1=False #判断首字符和长度是否满足要求
check2=False #判断数字
check3=False #判断特殊字符
ss="!@ #$%&*"
n=len(password)
①     
if 7  check1=True
if check1:
  for i in range(1,n):
    ch=password[i]
    if "0"<=ch<="9":
      check2=True
    elif ②      :
      check3=True
if ③      :
  print("密码不合法")
else:
  print("密码合法")
请回答下列问题。
(1)若输入的密码为“mylo@e9”,则判断结果为      。
(2)请在程序划线处填入合适的代码。
答案 (1)不合法 (2)①ch=password[0]
②ch in ss ③not(check1 and check2 and check3)
解析 (1)由于密码“mylo@e9”的长度只有7位,因此判断结果为“不合法”。(2)check1的作用是判断首字符和长度是否满足要求,密码串的首字符为字符串password中的第一个字符,即password[0],因此①处代码为ch=password[0];check3的作用是判断密码中是否包含特殊字符,特殊字符串存放在ss中,当前判断的字符为ch,因此②处代码为ch in ss;当check1、check2和check3的值均为True时,密码合法,其他情况均为不合法,根据if下面的print语句可知,if条件为密码不合法时的情况,因此③处代码为not(check1 and check2 and check3)。
二、能力提升
9.用Python程序实现统计随机数出现的次数。下面程序的功能是:首先随机产生30个[10,99]之间的不重复整数,并以每行10个输出在屏幕上,然后统计[10,19]、[20,29]、…、[90,99]各区间段的整数个数,并输出统计结果。程序运行效果如图所示:
实现上述功能的程序如下,回答下列问题。
import random
def check(x):
check=True
if①      :
    check=False
  return check
list1=[]
list2=[0]*10
n=1
while n<=30:
num=random.randint(10,99)
if check(num):
    list1.append(num)
    ②     
    n+=1
print("30个不重复的随机整数为:")
for i in range(0,30):
  print(list1[i],end="")
  if③      :
    print()   #换行输出
print("各区间段统计结果为:a")
for i in range(1,10):
   if list2[i] =0:
    print(i*10,"-",i*10+9,":",list2[i])
(1)check函数的功能是  。
(2)请在程序划线处填入合适的代码。
答案 (1)check函数的功能是检查整数x是否与列表list1中的元素重复 
2)①x in list1
②list2[num∥10]+=1或②list2[num∥10]=list2[num∥10]+1 ③i%10==9
解析 (1)check函数的功能是检查整数x是否与列表list1中的元素重复,若重复则返回函数值False,否则返回函数值True。根据check函数的功能可知,①处代码为x in list1;②处循环的功能是统计各区间段中整数的个数,根据程序最后的for循环可知,区间[10,19]内的数统计在list2[1]中,而该区间内的数整除10的值均为1,其他区间的统计也是如此,因此,②处代码为list2[num∥10]+=1;③处代码的功能是以每行10个数输出随机整数,由于第一个整数的索引号为0,因此③处代码为i%10==9,而不是i%10==0。
10.某数据压缩方法描述如下:
①原始数据中,某数不为 0 且相邻无重复,压缩数据用该数据表示;②原始数据中,某数为0 且相邻无重复,压缩数据用两个数表示,第 1 个为 0,第 2 个为 0;③原始数据中,某数据相邻有重复,压缩数据用 3 个数表示:第 1 个为 0,第 2 个为重复数的个数,第 3 个为该数本身。
根据上述压缩方法,对应的解压缩方法示例如图所示。
压缩前的代码存储在"压缩数据.txt"文件中,每两个压缩数据间用逗号分隔。编写该文件每行的数据解压缩的Python程序代码。
(1)如果压缩数据为“23,0,21,66,0,0,77,0,5,0”,则解压缩数据的个数是     。
(2)实现上述功能的 Python 程序如下。请在划线处填入合适代码。
def jy(a):
  s=""
  i=0
  while i    if a[i]=="0":
      if ①    :
        s+="0"+","
        i+=2
      else:
        for j in range(int(a[i+1])):
          s+=a[i+2]+","
        ②    
    else:
      s+=a[i]+","
      i+=1
  return s[:-1]
f=open("压缩数据.txt","r",encoding="utf-8")
for i in f:
  s1=i.split(",\n")
  ③    
print(s2)
答案 (1)29 (2)①a[i+1]=="0" ②i+=3 ③s2=jy(s1)
解析 (1)解压缩后为1个23,21个66,1个0,1个77,5个0,数据个数为1+21+1+1+5=29。(2)①从语句s+="0"+","来看,解压缩为一个0,某数为0 且相邻无重复,压缩数据用两个数表示,第 1 个为 0,第 2 个为 0;②循环for j用于解压缩多个字符,因此压缩用3个单位的数据,因此i将加3。③语句s1= i.split(",\n")是对文件中一行按逗号和换行符进行分隔,并把分隔后的内容保存在列表s1中,因此需调用函数来计算解压缩后的数据。
11.用英文字母A~D数字字符0~9进行编码,编码规则如表所示:
例如,数字字符串“718”的编码为“BDABCA”。
用Python程序实现上述编码,功能如下:输入待编码的一串数字字符,输出编码结果,程序运行界面如图所示。
实现上述功能的Python程序如下,请回答下列问题:
(1)运行该程序,若输入的数字字符串为“5736”,则输出的编码结果为        。
(2)请在程序划线处填入合适的代码。
def dtob(x):
  st,r="",0
  for i in range(4):
    r=x%2
    ①     
    x=x∥2
  return st
code={'00':'A','01':'B','10':'C','11':'D'}
s=input('请输入数字字符串:')
result=""
for i in range(len(s)):
  ②     
  if "9">=ch>="0":
    ans=dtob(int(ch))
    ③     
  else:
    break
  if result!='':
    print('编码结果为:',result)
  else:
    print('输入有误!')
答案 (1)BBBDADBC
(2)①st=str(r)+st ②ch=s[i]
③result+=code[ans[0:2]]+code[ans[2:4]]或result=result+code[ans[0:2]]+code[ans[2:4]]或result+=code[ans[:2]]+code[ans[2:]]
解析 本题综合考查了循环结构和分支结构的应用、字符串的切片以及字典的访问。
(1)按照题意,可以推断得到5736为BBBDADBC。
(2)通读程序可得自定义函数的功能是将一个数字转换为二进制数字,以此作为访问字典code的键,一个数字转换为四位二进制,前两位对应一个字符,后两位对应一个字符,十进制转换为二进制的方法为除二倒取余,显然①需要将新产生的余数连接在原有的余数之前,并且r为数字,因此st=str(r)+st,②处后续if语句用到了变量ch进行判断,因此②对ch进行赋值ch=s[i];③处之前已应用自定义函数得到二进制数字字符串,分为两部分去得到相应的字符,result+=code[ans[0:2]]+code[ans[2:4]]或其他等价答案。
12.查找与替换。从键盘上分别输入要查找和替换的字符串,对文本文件进行查找与替换,替换后保存到新的文本文件中。
完成查找与替换功能的思路是:首先可从待检索文本文件“in.txt”逐行读取文本内容到列表text,然后从键盘上输入查找的字符串key和替换的字符串new,对列表text中的元素逐个进行查找并替换,结果保存到列表result,最后将result 写入文件“out. txt”。
(1)主程序。
text = readfile("in.txt")  #读入文件
key = input("请输入要查找的字符串:")
new = input("请输入要替换的字符串:")
result = []
for line in text:
  newline = replace(key, new, line) #替换
  result.append(newline) #添加到列表
writefile("out.txt",result) #写入文件
该程序段采用的算法是    (单选,填字母:A.解析算法 / B.枚举算法)。
(2)读写文本文件,如下的readfile函数,逐行读取文本文件数据存入列表并返回。请在划线处填入合适的代码。
def readfile(filename):
  f = open(filename,encoding = "utf-8")
#打开文件
  text = []
  line = f.readline() #从文件中读取一行
  while line:
    text.append(line) #添加到列表
    line = f.readline()
  f.close()
  return   
def writefile(filename,text):
  #将text写入filename文件,代码略
(3)查找字符串,如下的findstr函数,在字符串line中从begin位置开始查找key在字符串line中的位置,请在划线处填入合适的代码。
def findstr(key,line,begin):
  for i in range(begin, len(line) - len(key) + 1):
    if     :
      return i
  return -1
(4)替换字符串。如下的replace函数,在字符串line中检索所有的字符串key并替换为new,请在划线处填入合适的代码。
def replace(key,new,line):
  begin = 0
  while begin < len(line) - len(key) + 1:
    pos = findstr(key,line,begin)
    if pos == -1:
         
    else:
      line = line[0:pos] + new + line[pos + len(key) :len(line)]
      begin = pos + len(key)
  return line
答案 (1)B
(2)text
(3)line[i:i+len (key) ]==key
(4)break或begin+=1(共97张PPT)
课时8 解析、枚举算法及程序实现
第三章 算法的程序实现
1.掌握解析和枚举算法的基本思想。
2.掌握使用解析和枚举算法解决实际问题的基本方法,并通过编写程序实现问题求解。
目 录
CONTENTS
知识梳理
01
例题精析
02
随堂检测
03
巩固与提升
04
知识梳理
1
一、解析算法的基本思想
解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式,并通过表达式的计算来实现问题的求解。
二、解析算法解题的基本思路
1.建立正确的数学模型,即得出正确的数学代数式。
2.将数学代数式转化为Python式子。
三、解析算法程序实现的步骤
1.运用解析算法分析问题,寻找问题中各要素之间的关系,用数学表达式表示它们的关系。
2.写出解决问题的解析步骤,编写程序实现,通过运行程序求得问题的正确解。
四、枚举算法的基本思想
枚举算法的基本思想是把问题所有可能的解__________,然后判断每一个列举出的________是否为正确的解。
枚举算法常用于解决是否存在或有多少种可能等类型的问题。
五、枚举算法的基本框架
1.枚举算法三要素
枚举范围、__________、判断条件。
一一列举
可能解
枚举对象
2.基本框架
循环结构
分支结构
枚举范围是用来表示枚举对象存在的一个连续区间,用循环结构语句实现。
判断条件用来检测当前枚举的对象是否为问题的解。
例题精析
2
print(a[v])
A
A.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
 else:
   c=1
B.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
   else:
    c=1
C.if a[i]==a[i-1]:
   c+=1
 else:
   if c>m:
    m=c
    v=i-1
    c=1
D.if a[i]==a[i-1]:
   c+=1
 else:
  if c>m:
    m=c
    v=i-1
  c=1
解析 本题考查一维列表的遍历和最值的查找。 已排序的列表a有n个整型元素,当条件a[i]==a[i-1]成立时,表示有连续相等的数量c。A选项每找到一个相等的值,求解数量的最大值,并保存此时的索引位置v,若不相等时初始化c的个数为1。B选项初始化c的个数就在两个不相等的值时。C选项当两个数相等时进行计数,当两个数不相等时,进行最值的查找,同时初始c的值为1,但该选项c的初始化发生在找到最大值时。D选项若长度的最大值发生在最后,即该列表最后的几个数是长度是最大值时,只是在进行计数,并未进行最大值的查找。
例2 某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
箱子类型 操作类型 货位编号
B 放置 5
A 放置 2,3
B 放置 0
A 放置 7,8
A 搬离 2,3
(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为    个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取货位总数存入n,代码略。
cnt1=n
lst=[0]*n #货位状态,0表示对应的货位为空
while True:
  #读取本次已描过数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略
  if t=="A":
    w=2
  ①    :
    w=1
  else: #不是"A"或"B"时退出循环
    break
  if d== "P": #d为P时表示放置,否则表示搬离
    ②    
  else:
    cnt1+=w
  lst[s]=1-lst[s]
  if t=="A":
    lst[s+1]=1-lst[s+1]
  i,cnt2=0,0
  while i< n-1:
    if lst[i]==0 and lst[i+1]== 0:
      ③   
      cnt2+= 1
    i+=1
  print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)
答案 (1) 2或两 (2)①elif t=="B"或elif (t=='B') ②cnt1-=w或cnt1=cnt1 - w ③i +=1或i=i+1
解析 本题考查列表的遍历。(1)经过放置或搬离操作后,索引位置1-4是空的,6和9是空的,因此可以放置A型箱子2个。(2)① w是两种箱子所占货位,因此当输入是B是占位为1。②cnt1是当前空货位数,d为P时表示放置,否则表示搬离,条件不成立时,空位增加,因此条件成立时,空位减少。③cnt2表示还可放置A型箱子的最多数量,当条件lst[i]==0 and lst[i+1]== 0成立时,表示可以放置A类型,因此下一个货位要跳过。
例3 快递分拣机器人会根据指令将快递送到指定的位置。某款快递分拣机器人有“东西南北”四个方向移动的指令,比如指令“西1”表示朝西移动1个单位的距离。机器人的起点位置在(0,0),当服务器下达指令“西3”“北2”“东5”“南7”“东3”后,机器人行走路线如图a所示。
图a
根据快递分拣机器人行走规则,小明编写程序实现功能如下:程序运行时,输入机器人的起点坐标位置(输入x坐标和y坐标并以逗号分隔),根据给定的指令模拟机器人行走,依次输出机器人经过点的坐标位置,最后输出终点离起点的直线距离并保留两位小数。
(1)如果机器人的起点坐标位置为(0,0),执行指令“西1”“北1”“东5”“南3”“东2”后,终点z坐标位置为    。
(2)请在划线处填入合适的代码。
d = ['西','北','东','南','东'] #行走方向
s = [3,2,5,7,3] #行走长度
start = input('请输入起点坐标位置(逗号分隔):')
for i in range(len(start)):
  if start[i] == ',':
    ①   
x0 = int(start[0:pos])
y0 = int(start[pos+1:len(start)])
x,y = x0,y0
②   
for i in range(n):
  if d[i] == '东':
    x = x + s[i]
  elif d[i] == '西':
    x = x - s[i]
  elif d[i] == '南':
    y = y - s[i]
  else:
    ③   
  print('(', x ,',' , y,')')  #输出经过点的坐标
④   
dist = round(dist,2)
print('距离起点的直线距离为',dist)
答案 (1)(6,-2) (2)①pos = i
②n = len (d)
③y = y+s [i]
④dist =((x-x0)**2+(y-y0 )**2)**0.5
解析 本题考查解析算法。(1)依次经过的坐标为(-1,0),(-1,1),(4,1),(4,-2)(6,-2)。(2)①输入起点坐标位置(逗号分隔),找到逗号位置并赋值给pos。②d表示行走方向,需要行走的步子。③方向依次为东南西北,向北y的值增加,x的值不变。④利用两点公式计算两点(x0,y0)、(x,y)之间的距离。
变式训练1 某Python程序段如下:
info=["男",79,"女",97,"女",94,"男",91,"女",85,"女",100,"男",82]
tot=0
c=0
for i in range(0,len(info),2):
  if info[i]=="男":
    continue
  tot+=info[i+1]
  c+=1
print(round(tot/c,1))
运行该程序段,输出结果是    。
答案 94.0
解析 本题考查循环中continue的相关知识,程序中用到计数器和累计器。男生跳过循环,那么只统计女生的数值,平均数=总计/数量。
例4 我国《算经》中经典的“百钱买百鸡”问题,描述如下:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何
现A、B、C三位同学分别编写了计算机程序解决该问题。程序代码如下,请回答下列问题。
A同学的程序:
na = 0
for x in range(21):
  for y in range(34):
    for z in range(101):
      na += 1
      if ①    :
        print(x,y,z)
B同学的程序:
nb = 0
for x in range(21):
  for y in range(34):
    nb += 1
    ②   
    if x * 5 + y * 3 + z / 3 == 100:
      print(x,y,z)
C同学的程序:
nc = 0
for x in range(0,21,③    ): #划线③处要求填入后算法效率最高
  nc += 1
  y = 25 - 7 * x ∥ 4
  z = 100 - x - y
  if x * 15 + y * 9 + z == 300 and y >= 0:
    print(x,y,z)
(1)A、B、C 三位同学解决“百钱买百鸡”问题均使用了    (单选,填字母:A.解析 /B. 枚举)算法。
(2)请在划线处填入合适的代码。
(3)程序运行后,变量 na、nb、nc 的大小关系为    (单选:填字母。选项中的表达式均为数学表达式)
A.na=nb=nc B.na>nb>nc
C.nanc
答案 (1)B (2)①x+y+z==100 and x*5+y*3+z/3==100或者x+y+z==100 and x*15+y*9+z==300 ②z=100-x-y ③4 (3)B
解析 本题考查枚举算法。(1)对每一种解进行判断,属于枚举算法。(2)表达式y=25-7*x∥4,若要保证y是整数,x必须是4的倍数,因此步长为4。(3)循环次数依次为21*34*101、21*34和6次。
变式训练2 有Python程序段如下,执行该程序段后,变量sum的值为 (  )
m="p25y3t12h8n5"
sum=t=0
flag=True
for ch in m:
  if "0"<=ch<="9":
    t=t*10+int(ch)
  else:
    if flag==True:
      sum+=t
D
    t=0
    flag=not flag
print(sum)
A.53 B.48 C.32 D.11
解析 本题考查循环结构的综合应用。用ch来便遍历符串m,用t来存储数字,当找到第一个非数字字符且flag为True时,将t的值累加入sum,只有当遇到非数字字符时才将数字累加入sum,最终sum的值为11,答案为D。
例5 在“三位一体”招生考试中学考成绩占据一定的比例。表1为某高校学考等级成绩折算表(学考等级分为A、B、C、D、E),少于5A计0分;表2为某学生的学考等级成绩单。
表1 某高校学考等级成绩折算表
学业水平考试等级 A B C D
成绩折算(分) 10 8 6 4
表2 某学生学考等级成绩单
科目 语文 数学 英语 物理 化学 生物 政治 历史 地理 技术
等级 A A A A A B A C B A
编写Python程序实现学考成绩总分折算。表2学生的折合分数如图所示。
(1)若输入的学生学考等级为“AAAABBBBCC”,则折合分数为:    。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
s=input("请输入各学科学考等级:")
num=0
scores=0
for t in ①    :
  if t=="A":
②   
scores+=10
  elif t=="B":
scores+=8
  elif t=="C":
scores+=6
  elif t=="D": #③
scores+=4
if num<5:
  print("折合分数为0分")
else:
  print("折合分数为:",scores)
(3)若将③处代码改为“else:”,对程序运行结果是否有影响     (选填文字:是/否);并说明理由_______________________________。
答案 (1)0 (2)①s或其他等价答案
②num+=1或num=num+1 (3)是 无法排除“E”情况,“D”“E”统加4分
解析 本题考查枚举算法。(1)A等的个数为4,少于5,得分为0。(2)从条件t=="A"来看,t可能是AB等等级名称,因此t是s中某个字符,①处答案为s。从等级成绩折算表来看,A等为10分,scores为折算分。少于5A计0分,结合条件num<5来看,num应为A等的个数,②处统计A等个数。(3)题目中对ABC等级分别进行了赋值,等级还有DE的可能性,若直接用else,对E等也进行了赋值,不正确。
变式训练3 某密码强度判断程序功能如下:将密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型。输入一串密码字符,如果该字符串的长度小于8,则输出“密码长度不符合要求!”;若该字符串包含三种字符及以上,则输出“强度:强”;若该字符串包含两种字符,则输出“强度:中”;若该字符串仅包含一种字符,则输出“强度:弱”。
(1)实现上述功能的Python程序如下,请补充完整程序代码。
r =[0]*4;sum=0
s=input("输入密码:")
①     
if n<8:
  print("密码长度不符合要求!");
else:
  for②      :
    ch =s[i]
    if ch>="a" and ch<="z":
      r[0]=1
    elif ch>="A" and ch<="Z":
      r[1]=1
     ③      :
      r[2]=1
    else:
      r[3]=1
    sum=r[0]+r[1]+r[2]+r[3]
    if sum>=3:  
      print("强度:强")
    elif④      :
      print("强度:中")
    else:  
      print("强度:弱")
(2)若输入的密码字符串为“Asd 237”,则输出的结果为    。
答案 (1)①n=len(s) ②i in range(0,n,1)或i in range(0,n)或i in range(n)或i in range(len(s))或其它等价表达式 ③elif "0"<=ch<="9"或elif ch>="0" and ch<="9" ④sum==2或sum>1或sum>=2
(2)“密码长度不符合要求!”(双引号没有也正确)
解析 本题考查字符串遍历和多分支选择结构。(1)在条件语句if n<8中,将判断密码的长度,因此①处答案为n=len(s)。对符合长度的密码进行遍历,结合语句ch=s[i]来看,变量i是字符串索引值,因此②处通过循环获取密码各个字符的索引位置。密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型,因此③中将判断该字符ch是否属于数字字符类型。变量sum表示字符类型的种类数量,密码强度为中,需包含2种类型的字符,在第二分支中,条件sum>=3已经不成立,即sum的值只要大于1或大于等于2即可。(2)密码字符串“Asd 237”的长度值为7,属于密码长度不符合要求。
随堂检测
3
1.有如下Python程序段:
listn=[0]*10
for i in range(len(listn)):
  if i==0 or i==1:
    listn[i]=1
  else:
    listn[i]=listn[i-1]+listn[i-2]
执行该程序段后,listn[9]的值为(  )
A.55 B.34 C.21 D.0
A
解析 本题考查枚举算法。满足条件i==0 or i==1,表示列表前两项的值为1。从第3项开始,为前两项之和。
2.某Python程序代码如下:
a=[10,5,2,11,7,6]
c=0
i=0
while i  if a[i]%2==0:
    c-=a[i]
a[i]∥=2
  else:
    c+=a[i]
    i=i+1
print(int(c))
程序执行后,输出的结果是(  )
A.5 B.14 C.23 D.51
解析 本题考查枚举算法。将其中的偶数减去a[i],并将a[i]进行折半,加个奇数。
B
3.斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、……,即从数列的第三项开始,当前项
为前两项之和,编写程序实现求斐波那契数列的第n项的值。
(1)用Python语言编写的程序如下,请在划线处填入合适的代码,实现程序功能。
n=int(input("输入n的值:"))
a=b=1
for i in range(3,n+1):
c=a+b
①     
print("第n项为:"+②      )
(2)当输入n=10,则程序输出的第n项为    。
答案 (1)①a,b=b,c ②str(c) (2)55
解析 (1)本题采用迭代法求斐波那契数列,斐波那契数列的规律为:从第三项开始,当前项为前两项之和,因此求出c后,应更新a、b的值为b、c,以便求解数列的下一项,因此①处代码为a,b=b,c;第n项的值为c,由于print语句输出时使用了“+”号,因此需使用str函数将c转换为字符型,即②处代码为str(c)。
(2)可以根据斐波那契数列的特点推算出,第10项为55。
4.有如下Python程序段:
count=0
for i in range(100,1000,1):
  if i% 10==i∥100:
    count+=1
执行该程序段后,count的值为    。
答案 90
5.有如下Python程序段:
s="AAACBBBBCBBB"
count=1;cmax=1;last=s[0]
for i in s[1:len(s)]:
  if last==i:
    count+=1
  else:
    last=i
    count=1
  if cmax    cmax=count
执行该程序段后,cmax的值为    。
答案 4
6.某Python程序实现的功能:运行程序输入一个四位整数,能够判断该四位整数是否存在数字重复的位。程序代码如下:
n=int(input("请输入一个四位正整数:"))
f=[0]*10
while n>0:
  y=n%10
  ①   
  n=n∥10
if ②    :
  print("有重复的位。")
else:
  print("没有重复的位。")
划线处的代码应填(  )
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
A
解析 本题考查桶的算法思想。表达式n%10的功能是取出个位数,语句n=n ∥ 10的功能是去除个位数。语句f[y]=1的功能是y是否出现过,如果出现为1,没有出现为0。语句f[y]+=1的功能是统计y出现的次数。sum(f)是统计f列表元素之和。
7.水往低处流,下雨时道路上的低洼地(两边高中间低的凹处)总会有积水。例如某地面高度数据为“0,0,2,1,2,0,0,1”,则该地面有 2 处低洼地。实现该算法的程序段如下:
gd=input("请输入地面高度,以空格间隔开:")
h=list(map(int,gd.split(","))) #将字符串转换为列表,例如"1,0,2",转换为[1,0,2]
cnt=0  
f=False
for i in range(1,len(h)):
  if ①    :
    f=True
  elif h[i-1]    cnt+=1
    ②   
print("该地面有",cnt,"处低洼地。")
上述代码中划线处应填入的代码是(  )
A.①h[i]>h[i+1] ②f=False
B.①h[i]>h[i+1] ②f=True
C.①h[i-1]>h[i] ②f=False
D.①h[i-1]>h[i] ②f=True
C
解析 本题考查在一个序列中查找一个下降子序列。flag是下降段的标志,从索引1开始遍历,若他比他前面的数小,表示处理下降段,将flag置为True。在下降过程中,若他比他前面的数大,表示从该位置开始处理上升段,因此将增加一个下降段,同时将标志设置为False。
8.m钱买n鸡问题。用m元买n只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3只,输出用m钱买n鸡的所有方案及方案总数。
编写程序实现上述功能,程序运行效果如图所示。
请输入钱:50
请输入要买的鸡的数量:20
方案1:3 11 6
方案2:7 4 9
共有方案数:2
实现上述功能的程序如下,请在划线处填入合适的代码。
count=0
m=int(input("请输入钱:"))
n=int(input("请输入要买的鸡的数量:"))
for i in range(m∥5+1):
  for j in range(m∥3+1):
   k=①     
   if②      :
      count+=1
      print("方案",count,":",i,j,k)
print("共有方案数:",count)
答案 ①n-i-j ②5*i+3*j+k/3==m
解析 本题主要考查的是枚举算法的综合应用。本题的枚举对象有两个,分别是公鸡和母鸡的数量,i表示公鸡的数量,j表示母鸡的数量,k表示小鸡的数量,已知公鸡、母鸡和小鸡共有n只,因此①处的代码为n-i-j;如果买公鸡、母鸡和小鸡的钱正好是m元,表示当前的购买方案可行,则进行计数,并输出购买方案,因此,②处的代码为5*i+3*j+k/3==m,需注意的是判断条件不能写为5*i+3*j+k∥3==m。
4
巩固与提升
基础巩固
能力提升
1.有如下Python程序段:
str1=input("输入一组由身高和体重构成的有规律字符串:")
hmax=int(str1[0:3])
wmin=int(str1[4:6])
for i in range(0,len(str1),7):
  h=int(str1[i:i+3])
  w=int(str1[i+4:i+6])
  if h>hmax and w    hmax=h
    wmin=w
运行该程序段,输入"176/65/169/59/180/62/185/63/"(输入时,不含前后的双引号),待程序段结束后,变量hmax、wmin的值分别为 (  )
A.180 62 B.185 63
C.169 59 D.185 59
解析 本题考查枚举算法。查找一个身高是最高的,同时体重也是最小的。
A
2.现要通过Python程序输出所有既是对称数,又是素数的三位数,比如:101、131、727等(对称数是它的各位数字是左右对称的数,素数是除了1和它本身以外,不能被其他任何整数整除的数),其功能实现的Python程序如下:
for num in range(100, (1)  ,1):
  flag1=False
  flag2=True
  a=num%10
  b= (2) 
  if a==b:
    flag1=True
  for i in range(2,num,1):
    if num%i==0:
      flag2= (3) 
  if flag1 and flag2:
    print(num)
上述程序中划线处可选语句为:
①999 ②1000 ③num∥100
④num∥10%10 ⑤False ⑥True
为了实现题干描述功能,则(1)(2)(3)划线处语句依次为(  )
A.①④⑥ B.②④⑤ C.②③⑥ D.②③⑤
D
解析 本题考查枚举算法。查找一个三位数,因此(1)中应为1000,取到的num最大值为999。(2)处b是最高位,因此需整除100。(3)处素数不能被2至num-1之间的数整除,如果除通,则设计标志为False。
3.有如下Python程序,程序执行,输入数据k之后输出的结果不正确的是 (  )
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])
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]
C
解析 本题考查循环和分支结构的综合应用。综合分析程序可得for循环用循环变量i作为位置来遍历列表L的前八位元素,当相应位置上的值不大于输入的k值时,将i位置上的元素赋值到j位置上,并且更新j的的值,若是i位置上的值大于输入的k值,则不做任何处理,因此可以大致得到该程序的作用是将列表L前八位元素中不大于k的值依次前移并且输出新列表。C选项中最后一个10的索引值为8,访问不到,因此错误。
4.有如下程序段:
s=input("请输入字符串:")
count=0
for i in s:
   if i>="0" and i<="9":
     count+=1
print(s[count:count+3])
若输入的字符串为“AB12CCC222GGBD”则程序运行结果为(  )
A.CCC B.GGBD C.CC2 D.C22
C
解析 本题考查枚举算法,统计数字的个数,count的值为5,因此从索引5至7的字符串。
5.有下列Python程序段:
s="6p25y3t"
sum,t=0,0
flag=True
for ch in s:
  if "0"<=ch<="9":
    t=t*10+int(ch)
  else:
    if flag==True:
      sum+=t
    t=0
    flag=not flag
执行该程序段后,变量sum的值为 (  )
A.6 B.9 C.28 D.34
解析 本题综合考查了算法的控制结构,特别是分支结构及循环结构的应用。ch作为循环变量遍历字符串s,分析内部分支结构可知,当ch取到非数字字符时,t归零,并结合第一个分支的语句块可得t用于表示当前通过ch遍历字符串得到的数字,题中分别为6,25,3,找到非数字字符时修改flag的值为not flag,因此flag的变化过程为T,F,T,F,而只有当flag为True时才会将t的值累加如sum,因此sum=0+6+3=9,选择B。
B
6.在一个包含数字和其他非数字字符混合的原始数据中,提取其中的连续数字,当数据中存在多个数字串,以“,”间隔不同数字串。如字符串China86USA1HK852中包含86,1,852三个数字串。
实现该功能的程序代码如下,请将空白处填写完整。
s="China86USA1HK852"
ans="";flag=False
for i in s:
  if ①     :
    ans+=i
    ②    
  ③     :
    ans+=","
    flag=False
print("提取的数字有:"+ans)
答案 ①"0"<=i<="9" ②flag=True
③elif flag
解析 ①遍历字符串s,如果遍历到数字。②flag是数字串开始的标志,如果是数字则flag值为True。③若不是数字,分为前面是数字和前面不是数字两种情况。
7.黑洞数。黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去数字组成的最小数,它们的差等于原来的整数。例如3位黑洞数是495,因为954-459=495,4位数字的黑洞数是6174,因为7641-1467=6174。编写程序,功能如下:输入整数n,输出3位~n位整数中的黑洞数。程序运行效果如图所示。
实现上述功能的程序如下,请在程序划线处填入合适的代码。
n=int(input("输入n:"))
count=0
for x in range(3,n+1):
  start=10**(x-1)
  ①     
  for i in range(start,end):
#把数字转换字符后拼接,并按降序排列
maxnum=".join(sorted(str(i),reverse=True)) 
minnum=".join(reversed(maxnum)) #将maxnum中字符升序排列后拼接
②     
   if dis==i:
     print(i)
     count=count+1
print("count="+③      )
答案 ①end=10**x ②dis=int(maxnum)-int(minnum) ③str(count)
解析 根据代码range(start,end)可知,长度为x位的整数范围为[start,end-1],因此①处代码end=10**x;②处代码的功能是求最大数与最小数的差,根据if语句可知,两数之差存储在变量dis中,因为maxnum和minnum是数字字符串,所以在求差之前应将其转换为整数类型,因此,②处代码为dis=int(maxnum)-int(minnum);count用来计数,统计黑洞数的个数,由于输出时使用了“+”后,因此需将count转换为字符串型,即③处代码为str(count)。
8.某网站要求新注册用户的密码必须以字母开头,并且含有字母(区分大小写)、数字和特殊符号(!、@、#、$、%、&、*,7个符号中只要有一个即可),密码长度为8~18个字符。
下列程序的功能是判断用户输入的密码是否合法。
password=input("please input password:")
check1=False #判断首字符和长度是否满足要求
check2=False #判断数字
check3=False #判断特殊字符
ss="!@ #$%&*"
n=len(password)
①     
if 7  check1=True
if check1:
  for i in range(1,n):
    ch=password[i]
    if "0"<=ch<="9":
      check2=True
    elif ②      :
      check3=True
if ③      :
  print("密码不合法")
else:
  print("密码合法")
请回答下列问题。
(1)若输入的密码为“mylo@e9”,则判断结果为      。
(2)请在程序划线处填入合适的代码。
答案 (1)不合法 (2)①ch=password[0]
②ch in ss ③not(check1 and check2 and check3)
解析 (1)由于密码“mylo@e9”的长度只有7位,因此判断结果为“不合法”。(2)check1的作用是判断首字符和长度是否满足要求,密码串的首字符为字符串password中的第一个字符,即password[0],因此①处代码为ch=password[0];check3的作用是判断密码中是否包含特殊字符,特殊字符串存放在ss中,当前判断的字符为ch,因此②处代码为ch in ss;当check1、check2和check3的值均为True时,密码合法,其他情况均为不合法,根据if下面的print语句可知,if条件为密码不合法时的情况,因此③处代码为not(check1 and check2 and check3)。
9.用Python程序实现统计随机数出现的次数。下面程序的功能是:首先随机产生30个[10,99]之间的不重复整数,并以每行10个输出在屏幕上,然后统计[10,19]、[20,29]、…、[90,99]各区间段的整数个数,并输出统计结果。程序运行效果如图所示:
实现上述功能的程序如下,回答下列问题。
import random
def check(x):
check=True
if①      :
    check=False
  return check
list1=[]
list2=[0]*10
n=1
while n<=30:
num=random.randint(10,99)
if check(num):
    list1.append(num)
    ②     
    n+=1
print("30个不重复的随机整数为:")
for i in range(0,30):
  print(list1[i],end="")
  if③      :
    print()   #换行输出
print("各区间段统计结果为:a")
for i in range(1,10):
   if list2[i] =0:
    print(i*10,"-",i*10+9,":",list2[i])
(1)check函数的功能是 。
(2)请在程序划线处填入合适的代码。
答案 (1)check函数的功能是检查整数x是否与列表list1中的元素重复 
(2)①x in list1 ②list2[num∥10]+=1或②list2[num∥10]=list2[num∥10]+1 
③i%10==9
解析 (1)check函数的功能是检查整数x是否与列表list1中的元素重复,若重复则返回函数值False,否则返回函数值True。根据check函数的功能可知,①处代码为x in list1;②处循环的功能是统计各区间段中整数的个数,根据程序最后的for循环可知,区间[10,19]内的数统计在list2[1]中,而该区间内的数整除10的值均为1,其他区间的统计也是如此,因此,②处代码为list2[num∥10]+=1;③处代码的功能是以每行10个数输出随机整数,由于第一个整数的索引号为0,因此③处代码为i%10==9,而不是i%10==0。
10.某数据压缩方法描述如下:
①原始数据中,某数不为 0 且相邻无重复,压缩数据用该数据表示;②原始数据中,某数为0 且相邻无重复,压缩数据用两个数表示,第 1 个为 0,第 2 个为 0;③原始数据中,某数据相邻有重复,压缩数据用 3 个数表示:第 1 个为 0,第 2 个为重复数的个数,第 3 个为该数本身。
根据上述压缩方法,对应的解压缩方法示例如图所示。
压缩前的代码存储在"压缩数据.txt"文件中,每两个压缩数据间用逗号分隔。编写该文件每行的数据解压缩的Python程序代码。
(1)如果压缩数据为“23,0,21,66,0,0,77,0,5,0”,则解压缩数据的个数是     。
(2)实现上述功能的 Python 程序如下。请在划线处填入合适代码。
def jy(a):
  s=""
  i=0
  while i    if a[i]=="0":
      if ①    :
        s+="0"+","
        i+=2
      else:
        for j in range(int(a[i+1])):
          s+=a[i+2]+","
        ②    
    else:
      s+=a[i]+","
      i+=1
  return s[:-1]
f=open("压缩数据.txt","r",encoding="utf-8")
for i in f:
  s1=i.split(",\n")
  ③    
print(s2)
答案 (1)29 (2)①a[i+1]=="0" ②i+=3 ③s2=jy(s1)
解析 (1)解压缩后为1个23,21个66,1个0,1个77,5个0,数据个数为1+21+1+1+5=29。(2)①从语句s+="0"+","来看,解压缩为一个0,某数为0 且相邻无重复,压缩数据用两个数表示,第 1 个为 0,第 2 个为 0;②循环for j用于解压缩多个字符,因此压缩用3个单位的数据,因此i将加3。③语句s1= i.split(",\n")是对文件中一行按逗号和换行符进行分隔,并把分隔后的内容保存在列表s1中,因此需调用函数来计算解压缩后的数据。
11.用英文字母A~D数字字符0~9进行编码,编码规则如表所示:
例如,数字字符串“718”的编码为“BDABCA”。
用Python程序实现上述编码,功能如下:输入待编码的一串数字字符,输出编码结果,程序运行界面如图所示。
实现上述功能的Python程序如下,请回答下列问题:
(1)运行该程序,若输入的数字字符串为“5736”,则输出的编码结果为        。
(2)请在程序划线处填入合适的代码。
def dtob(x):
  st,r="",0
  for i in range(4):
    r=x%2
    ①     
    x=x∥2
  return st
code={'00':'A','01':'B','10':'C','11':'D'}
s=input('请输入数字字符串:')
result=""
for i in range(len(s)):
  ②     
  if "9">=ch>="0":
    ans=dtob(int(ch))
    ③     
 else:
    break
  if result!='':
    print('编码结果为:',result)
  else:
    print('输入有误!')
答案 (1)BBBDADBC
(2)①st=str(r)+st ②ch=s[i]
③result+=code[ans[0:2]]+code[ans[2:4]]或result=result+code[ans[0:2]]+code[ans[2:4]]或result+=code[ans[:2]]+code[ans[2:]]
解析 本题综合考查了循环结构和分支结构的应用、字符串的切片以及字典的访问。
(1)按照题意,可以推断得到5736为BBBDADBC。
(2)通读程序可得自定义函数的功能是将一个数字转换为二进制数字,以此作为访问字典code的键,一个数字转换为四位二进制,前两位对应一个字符,后两位对应一个字符,十进制转换为二进制的方法为除二倒取余,显然①需要将新产生的余数连接在原有的余数之前,并且r为数字,因此st=str(r)+st,②处后续if语句用到了变量ch进行判断,因此②对ch进行赋值ch=s[i];③处之前已应用自定义函数得到二进制数字字符串,分为两部分去得到相应的字符,result+=code[ans[0:2]]+code[ans[2:4]]或其他等价答案。
12.查找与替换。从键盘上分别输入要查找和替换的字符串,对文本文件进行查找与替换,替换后保存到新的文本文件中。
完成查找与替换功能的思路是:首先可从待检索文本文件“in.txt”逐行读取文本内容到列表text,然后从键盘上输入查找的字符串key和替换的字符串new,对列表text中的元素逐个进行查找并替换,结果保存到列表result,最后将result 写入文件“out. txt”。
(1)主程序。
text = readfile("in.txt")  #读入文件
key = input("请输入要查找的字符串:")
new = input("请输入要替换的字符串:")
result = []
for line in text:
  newline = replace(key, new, line) #替换
  result.append(newline) #添加到列表
writefile("out.txt",result) #写入文件
该程序段采用的算法是    (单选,填字母:A.解析算法 / B.枚举算法)。
(2)读写文本文件,如下的readfile函数,逐行读取文本文件数据存入列表并返回。请在划线处填入合适的代码。
def readfile(filename):
  f = open(filename,encoding = "utf-8")
#打开文件
  text = []
  line = f.readline() #从文件中读取一行
  while line:
    text.append(line) #添加到列表
    line = f.readline()
  f.close()
  return   
def writefile(filename,text):
  #将text写入filename文件,代码略
(3)查找字符串,如下的findstr函数,在字符串line中从begin位置开始查找key在字符串line中的位置,请在划线处填入合适的代码。
def findstr(key,line,begin):
  for i in range(begin, len(line) - len(key) + 1):
    if     :
      return i
  return -1
(4)替换字符串。如下的replace函数,在字符串line中检索所有的字符串key并替换为new,请在划线处填入合适的代码。
def replace(key,new,line):
  begin = 0
  while begin < len(line) - len(key) + 1:
    pos = findstr(key,line,begin)
    if pos == -1:
         
    else:
      line = line[0:pos] + new + line[pos + len(key) :len(line)]
      begin = pos + len(key)
  return line
答案 (1)B
(2)text
(3)line[i:i+len (key) ]==key
(4)break或begin+=1课时8 解析、枚举算法及程序实现
课时目标
1.掌握解析和枚举算法的基本思想。2.掌握使用解析和枚举算法解决实际问题的基本方法,并通过编写程序实现问题求解。
一、解析算法的基本思想
解析算法的基本思想是指根据问题的前提条件与所求结果之间的关系,找出求解问题的数学表达式,并通过表达式的计算来实现问题的求解。
二、解析算法解题的基本思路
1.建立正确的数学模型,即得出正确的数学代数式。
2.将数学代数式转化为Python式子。
三、解析算法程序实现的步骤
1.运用解析算法分析问题,寻找问题中各要素之间的关系,用数学表达式表示它们的关系。
2.写出解决问题的解析步骤,编写程序实现,通过运行程序求得问题的正确解。
四、枚举算法的基本思想
枚举算法的基本思想是把问题所有可能的解________________,然后判断每一个列举出的________是否为正确的解。
枚举算法常用于解决是否存在或有多少种可能等类型的问题。
五、枚举算法的基本框架
1.枚举算法三要素
枚举范围、____________、判断条件。
2.基本框架
循环结构
分支结构
枚举范围是用来表示枚举对象存在的一个连续区间,用循环结构语句实现。
判断条件用来检测当前枚举的对象是否为问题的解。
例1 已排序的列表a有n个整型元素,现要查找出现次数最多的值并输出。若出现次数最多的值有多个,则输出最前面的一个。实现该功能的程序段如下,方框中应填入的正确代码为 (  )
c,m,v =1,1,0
for i in range(1,n):
    
print(a[v])
A.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
 else:
   c=1
B.if a[i]==a[i-1]:
   c+=1
   if c>m:
    m=c
    v=i
   else:
    c=1
C.if a[i]==a[i-1]:
   c+=1
 else:
   if c>m:
    m=c
    v=i-1
    c=1
D.if a[i]==a[i-1]:
   c+=1
 else:
  if c>m:
    m=c
    v=i-1
  c=1
听课笔记:                                    
                                    
                                    
                                    
例2 某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
箱子类型 操作类型 货位编号
B 放置 5
A 放置 2,3
B 放置 0
A 放置 7,8
A 搬离 2,3
(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为    个。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读取货位总数存入n,代码略。
cnt1=n
lst=[0]*n #货位状态,0表示对应的货位为空
while True:
  #读取本次已描过数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略
  if t=="A":
    w=2
  ①    :
    w=1
  else: #不是"A"或"B"时退出循环
    break
  if d== "P": #d为P时表示放置,否则表示搬离
    ②    
  else:
    cnt1+=w
  lst[s]=1-lst[s]
  if t=="A":
    lst[s+1]=1-lst[s+1]
  i,cnt2=0,0
  while i< n-1:
    if lst[i]==0 and lst[i+1]== 0:
      ③   
      cnt2+= 1
    i+=1
  print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)
听课笔记:                                    
                                    
                                    
                                    
例3 快递分拣机器人会根据指令将快递送到指定的位置。某款快递分拣机器人有“东西南北”四个方向移动的指令,比如指令“西1”表示朝西移动1个单位的距离。机器人的起点位置在(0,0),当服务器下达指令“西3”“北2”“东5”“南7”“东3”后,机器人行走路线如图a所示。
图a
根据快递分拣机器人行走规则,小明编写程序实现功能如下:程序运行时,输入机器人的起点坐标位置(输入x坐标和y坐标并以逗号分隔),根据给定的指令模拟机器人行走,依次输出机器人经过点的坐标位置,最后输出终点离起点的直线距离并保留两位小数。
请输入起点坐标位置(逗号分隔):0,0(-3,0)(-3,2)(2,2)(2,-5)(5,-5)距离起点的直线距离为7.07
(1)如果机器人的起点坐标位置为(0,0),执行指令“西1”“北1”“东5”“南3”“东2”后,终点z坐标位置为    。
(2)请在划线处填入合适的代码。
d = ['西','北','东','南','东'] #行走方向
s = [3,2,5,7,3] #行走长度
start = input('请输入起点坐标位置(逗号分隔):')
for i in range(len(start)):
  if start[i] == ',':
    ①   
x0 = int(start[0:pos])
y0 = int(start[pos+1:len(start)])
x,y = x0,y0
②   
for i in range(n):
  if d[i] == '东':
    x = x + s[i]
  elif d[i] == '西':
    x = x - s[i]
  elif d[i] == '南':
    y = y - s[i]
  else:
    ③   
  print('(', x ,',' , y,')')  #输出经过点的坐标
④   
dist = round(dist,2)
print('距离起点的直线距离为',dist)
听课笔记:                                    
                                    
                                    
                                    
变式训练1 某Python程序段如下:
info=["男",79,"女",97,"女",94,"男",91,"女",85,"女",100,"男",82]
tot=0
c=0
for i in range(0,len(info),2):
  if info[i]=="男":
    continue
  tot+=info[i+1]
  c+=1
print(round(tot/c,1))
运行该程序段,输出结果是    。
例4 我国《算经》中经典的“百钱买百鸡”问题,描述如下:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何
现A、B、C三位同学分别编写了计算机程序解决该问题。程序代码如下,请回答下列问题。
A同学的程序:
na = 0
for x in range(21):
  for y in range(34):
    for z in range(101):
      na += 1
      if ①    :
        print(x,y,z)
B同学的程序:
nb = 0
for x in range(21):
  for y in range(34):
    nb += 1
    ②   
    if x * 5 + y * 3 + z / 3 == 100:
      print(x,y,z)
C同学的程序:
nc = 0
for x in range(0,21,③    ): #划线③处要求填入后算法效率最高
  nc += 1
  y = 25 - 7 * x ∥ 4
  z = 100 - x - y
  if x * 15 + y * 9 + z == 300 and y >= 0:
    print(x,y,z)
(1)A、B、C 三位同学解决“百钱买百鸡”问题均使用了    (单选,填字母:A.解析 /B. 枚举)算法。
(2)请在划线处填入合适的代码。
(3)程序运行后,变量 na、nb、nc 的大小关系为    (单选:填字母。选项中的表达式均为数学表达式)
A.na=nb=nc B.na>nb>nc
C.nanc
听课笔记:                                    
                                    
                                    
                                    
变式训练2 有Python程序段如下,执行该程序段后,变量sum的值为 (  )
m="p25y3t12h8n5"
sum=t=0
flag=True
for ch in m:
  if "0"<=ch<="9":
    t=t*10+int(ch)
  else:
    if flag==True:
      sum+=t
    t=0
    flag=not flag
print(sum)
A.53 B.48 C.32 D.11
例5 在“三位一体”招生考试中学考成绩占据一定的比例。表1为某高校学考等级成绩折算表(学考等级分为A、B、C、D、E),少于5A计0分;表2为某学生的学考等级成绩单。
表1 某高校学考等级成绩折算表
学业水平考试等级 A B C D
成绩折算(分) 10 8 6 4
表2 某学生学考等级成绩单
科目 语文 数学 英语 物理 化学 生物 政治 历史 地理 技术
等级 A A A A A B A C B A
编写Python程序实现学考成绩总分折算。表2学生的折合分数如图所示。
(1)若输入的学生学考等级为“AAAABBBBCC”,则折合分数为:    。
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
s=input("请输入各学科学考等级:")
num=0
scores=0
for t in ①    :
  if t=="A":
②   
scores+=10
  elif t=="B":
scores+=8
  elif t=="C":
scores+=6
  elif t=="D": #③
scores+=4
if num<5:
  print("折合分数为0分")
else:
  print("折合分数为:",scores)
(3)若将③处代码改为“else:”,对程序运行结果是否有影响     (选填文字:是/否);并说明理由_______________________________。
听课笔记:                                    
                                    
                                    
                                    
变式训练3 某密码强度判断程序功能如下:将密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型。输入一串密码字符,如果该字符串的长度小于8,则输出“密码长度不符合要求!”;若该字符串包含三种字符及以上,则输出“强度:强”;若该字符串包含两种字符,则输出“强度:中”;若该字符串仅包含一种字符,则输出“强度:弱”。
(1)实现上述功能的Python程序如下,请补充完整程序代码。
r =[0]*4;sum=0
s=input("输入密码:")
①     
if n<8:
  print("密码长度不符合要求!");
else:
  for②      :
    ch =s[i]
    if ch>="a" and ch<="z":
      r[0]=1
    elif ch>="A" and ch<="Z":
      r[1]=1
     ③      :
      r[2]=1
    else:
      r[3]=1
    sum=r[0]+r[1]+r[2]+r[3]
    if sum>=3:  
      print("强度:强")
    elif④      :
      print("强度:中")
    else:  
      print("强度:弱")
(2)若输入的密码字符串为“Asd 237”,则输出的结果为    。
1.有如下Python程序段:
listn=[0]*10
for i in range(len(listn)):
  if i==0 or i==1:
    listn[i]=1
  else:
    listn[i]=listn[i-1]+listn[i-2]
执行该程序段后,listn[9]的值为 (  )
A.55 B.34 C.21 D.0
2.某Python程序代码如下:
a=[10,5,2,11,7,6]
c=0
i=0
while i  if a[i]%2==0:
    c-=a[i]
a[i]∥=2
  else:
    c+=a[i]
    i=i+1
print(int(c))
程序执行后,输出的结果是 (  )
A.5 B.14 C.23 D.51
3.斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、……,即从数列的第三项开始,当前项
为前两项之和,编写程序实现求斐波那契数列的第n项的值。
(1)用Python语言编写的程序如下,请在划线处填入合适的代码,实现程序功能。
n=int(input("输入n的值:"))
a=b=1
for i in range(3,n+1):
c=a+b
①     
print("第n项为:"+②      )
(2)当输入n=10,则程序输出的第n项为    。
4.有如下Python程序段:
count=0
for i in range(100,1000,1):
  if i% 10==i∥100:
    count+=1
执行该程序段后,count的值为    。
5.有如下Python程序段:
s="AAACBBBBCBBB"
count=1;cmax=1;last=s[0]
for i in s[1:len(s)]:
  if last==i:
    count+=1
  else:
    last=i
    count=1
  if cmax    cmax=count
执行该程序段后,cmax的值为    。
6.某Python程序实现的功能:运行程序输入一个四位整数,能够判断该四位整数是否存在数字重复的位。程序代码如下:
n=int(input("请输入一个四位正整数:"))
f=[0]*10
while n>0:
  y=n%10
  ①   
  n=n∥10
if ②    :
  print("有重复的位。")
else:
  print("没有重复的位。")
划线处的代码应填 (  )
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
7.水往低处流,下雨时道路上的低洼地(两边高中间低的凹处)总会有积水。例如某地面高度数据为“0,0,2,1,2,0,0,1”,则该地面有 2 处低洼地。实现该算法的程序段如下:
gd=input("请输入地面高度,以空格间隔开:")
h=list(map(int,gd.split(","))) #将字符串转换为列表,例如"1,0,2",转换为[1,0,2]
cnt=0  
f=False
for i in range(1,len(h)):
  if ①    :
    f=True
  elif h[i-1]    cnt+=1
    ②   
print("该地面有",cnt,"处低洼地。")
上述代码中划线处应填入的代码是 (  )
A.①h[i]>h[i+1] ②f=False
B.①h[i]>h[i+1] ②f=True
C.①h[i-1]>h[i] ②f=False
D.①h[i-1]>h[i] ②f=True
8.m钱买n鸡问题。用m元买n只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3只,输出用m钱买n鸡的所有方案及方案总数。
编写程序实现上述功能,程序运行效果如图所示。
请输入钱:50请输入要买的鸡的数量:20方案1:3 11 6方案2:7 4 9共有方案数:2
实现上述功能的程序如下,请在划线处填入合适的代码。
count=0
m=int(input("请输入钱:"))
n=int(input("请输入要买的鸡的数量:"))
for i in range(m∥5+1):
  for j in range(m∥3+1):
   k=①     
   if②      :
      count+=1
      print("方案",count,":",i,j,k)
print("共有方案数:",count)

展开更多......

收起↑

资源列表