2025届信息技术一轮复习讲义:专题6 简单算法及程序实现

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

2025届信息技术一轮复习讲义:专题6 简单算法及程序实现

资源简介

专题6 简单算法及程序实现
学业要求 知 识 点 学业水平等级
1.掌握解析算法、枚举算法的算法特征,并会用计算机程序实现这两种算法 2
2.掌握程序调试与运行的方法,理解算法优化对解决问题的影响 2
知识点一 枚举算法
【知识梳理】
1.抽象指找到解决问题的主要________,________指影响问题各种因素之间的关系。根据问题的前提条件与所求结果之间的关系,找出求解问题的方法和步骤,并用相应过程描述出来。
2.解析算法的解题思路:先确定问题的________条件,找解决问题的数学表达式,再根据表达式确定问题要求的解。
3.枚举算法的基本思想:把问题所有________的解一一列举,然后________每一个列举出的可能解是否为正确的解。
4.枚举算法程序实现的三个主要环节:________解(循环语句),________解(条件判断),输出解(或统计解的个数)。其一般程序结构特点是循环包含分支结构语句,实现对枚举出的解进行判断与筛选。其中,循环包含分支结构语句,用于确定枚举对象枚举范围和判定条件。
5.枚举法的优化:尽可能地缩小解的列举________。
【经典案例】
抽象和建模是用程序实现算法前的重要步骤,抽象找出影响问题的主要因素,明确已知什么和求什么。建模是描述主要因素之间的关系,一是明确方法,往往采用遍历列表的方法;二是明确步骤,往往是求符合条件的和、个数、最值和平均值。遍历是按照一定的规则和次序访问数据元素中的所有节点,使得每个节点都被访问一次且仅被访问一次。在遍历过程中,可以对访问过的数据进行求和、计数、求平均值和求最大值或最小值操作。枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法,在遍历过程中求值与条件进行比对的过程。枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。
【例1】 某仓库有一排连续相邻的货位,编号依次为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 iif lst[i]==0 and lst[i+1]==0:
     ③________
     cnt2+=1
i+=1
print(″当前空货位数″,cnt1,″,还可放置A型箱子的最多数量:″,cnt2)
思维点拨
明考向 本题考查列表的遍历
精点拨 (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类型,因此下一个货位要跳过
听课笔记:____________________________________________________________
______________________________________________________________________
______________________________________________________________________
【变式1】 某Python程序段如下:
s1=input(″请输入字符串:″)
s2=″″
for i in range (len(s1)):
c=s1[i]
if ″0″<=c<=″9″:
c=str((int (c)+3)%10)
elif ″a″<=c<=″z″:
c=chr(ord(c)-32)
s2=s2+c
print (s2)
程序运行后,输入“9790,JiaYou″,输出的结果是(  )
A.6467,jiayou B.6467,JIAYOU
C.2023,jiayou D.2023,JIAYOU
【例2】 机器人移动路线管理。机器人在一平面内按照程序预置数据来完成移动操作(如图a所示),规则如下:①只能水平或垂直方向移动,方向取值:上:U、下:D、左:L、右:R,不能走斜线;每次移动1-5单位距离;②从起点出发,经过若干步后,尽可能返回到起点,如不能自动返回,则计算剩余移动次数。请在划线处填入合适的代码。
(1)解决上述问题的主程序如下:
bp=startpos() #输入起点坐标
dirt=[] #移动方向
step=[] #移动距离
readdata() #从data.csv文件中读取移动数据
pos=[bp] #从起点开始存储所有经过点的x、y坐标
for i in range(0,len(dirt)): #利用预置数据移动
tmp=move(pos[i],dirt[i],step[i])
pos.append(tmp)
print(″经过的位置点如下所示:″,″n″,pos)
if tmp==________: #判断能否返回起点
print(″可以直接返回起点位置!″)
else:
print(″不能直接返回起点位置!″,end=″″)
stpx=gettimes(pos[0][0],pos[-1][0])
stpy=gettimes(pos[0][1],pos[-1][1])
print(″至少需要移动″+str(stpx+stpy)+″次才能返回起点位置!″)
(2)编写函数startpos(),功能为输入起点坐标,返回坐标的值,返回值类型为列表。代码如下:
def startpos():
x=int(input('输入起点的x坐标:'))
y=int(input('输入起点的y坐标:'))
return________
(3)编写readdata()函数,功能为从CSV文件中读取预置的移动数据。代码如下:
def readdata():
import csv
f=open(″data.csv″,″r″,encoding=″utf-8″)
f_csv=csv.reader(f)
title=next(f_csv) #读取标题行
for line in f_csv:
dirt.append(line[0])
step.append(________)
f.close()
(4)编写位置移动函数move(),实现计算移动到的新位置。代码如下:
def move(pos,dr,lg): #位置移动
new_pos=[0,0]
if dr==″U″:
x=0;y=1
elif dr==″D″:
x=0;y=-1
elif dr==″L″:
x=-1;y=0
elif dr==″R″:
x=1;y=0
new_pos[0]=pos[0]+x*lg
______________
return new_pos
(5)编写函数gettimes(),计算剩余移动次数。代码如下:
def gettimes(p1,p2):
p=abs(p1-p2)//5
if abs(p1-p2)%5!=0:
   ________
return p
思维点拨
精点拨 (1)起点坐标保存在列表bp索引为零的位置。(2)功能为输入起点坐标,返回坐标[x,y]的值,返回值类型为列表。(3)函数调用代码move(pos[i],dirt[i],step[i]),step[i]对应参数lg,lg是一个整数。(4)new_pos[0]是横坐标,new_pos[1]是纵坐标。(5)根据returnp,可知变量p保存的是移动次数。根据p=abs(p1-p2)//5,如果条件语句不满足(能整除5),函数值就直接返回p了
听课笔记:_____________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
【变式2】 图书查询。所有正版图书均有唯一的国际标准书号(ISBN),ISBN由13位数字和字符“-”组成,字符“-”对数字间隔分段。如:某图书的ISBN为“978-7-5536-3176-9”(其中“978”表示图书类代码,“7”表示地区码,“5536”表示出版社代码,“3176”表示书序码,“9”为校验码)。小李为某校园书吧编写了图书查询的程序。请在划线处填入合适的代码。
(1)主程序
lst1=readfile(″in.csv″) #校园书吧库存图书信息存储在文件″in.csv″
while True:
print(″1.验证 ISBN 校验码;2.统计出版社费用;3.操作结束″)
opt=int(input(″请输入操作编号(1-3):″))
if opt==1:
isbn=input(″请输入 ISBN 号:″)
if check(isbn):
     print(″校验码正确″)
else:
     print(″校验码错误″)
elif opt==2:
code=input(″请输入出版社代码:″)
money=total(code)
print(″书吧中该出版社出版的图书总价:%.2f 元″ %money)#输出的总金额保留 2 位小数点
else:
print(″操作结束″)
break
运行程序,若输入opt值为4,程序将________(单选,填字母;A.运行时报错/B.输出“操作结束”)。
(2)读写文件
小李将校园书吧库存图书信息存储在文件″in.csv″中,内容如图所示。函数readfile()用于逐行读取文件数据存入列表并返回。
import pandas as pd
def readfile(filename): #读csv格式文件内容,将其存入列表并返回
df1=pd.read_csv(filename,encoding=″GBK″)
lst=[]
for i in df1.index:
isbn=df1[″ISBN″][i]
num=df1[″图书数量″][i]
price=df1[″单价(元)″][i]
lst.append([isbn,num,price]) #添加到列表
return____________
(3)校验码验证
ISBN最后一位的校验码用来检验前面12数字是否准确,是保护知识产权的一种检验方法。计算方法如下:
①将ISBN中前12位数字从左到右依次编号为“1、2、3、……、12”。
②若数字编号是奇数,则对应权值为1,否则权值为3。首先将ISBN中前12位的数字值与对应权值相乘,然后将计算所得值进行累加。
③最后,用10减去第②步结果对10整除的余数,所得结果即为校验码。
def check(ISBN): #对ISBN校验码验证
n=len(ISBN)
val=0;k=3
for i in range(0,n-1):
if '0'<=ISBN[i]<='9':
     k=4-k
     val+=int(ISBN[i])*k
______________________
if result==int(ISBN[-1]):
return True
else:
return False
(4)统计校园书吧中某出版社出版的所有图书总价
列表lst1中的部分数据如:[['978-7-5139-3066-6',7,59.80],['978-7-5063-3174-6',9,48.00],……]
def total(code):#统计书吧中出版社代码为code的所有图书总价
n=len(lst1)
money=0
for i in range(n):
isn=lst1[i][0].split('-') #将字符串list1[i][0]以“-”为分隔符,分割成多个字符串组成的列表
    if isn[2]==code:
    ____________
return money
知识点二 在一个序列中遍历元素
【知识梳理】
1.列表当前位置的索引为i,与他相邻的前面索引位置为________,后面数据的索引位置为________。
2.n个数据的序列中,若要进行两个数据之间的比较,那么比较次数为________。
3.数据在一个序列中可以________存在,即与前后数据没有特定的关系。
4.数据在一个序列中也可能是一段一段存在的。这个段指相同的元素、连续的几个数字或________、连续递增或递减的________等。
5.采用两个变量i和j分别表示某个子序列的开始位置和结束位置,从而计算子序列的________。
6.用变量i遍历序列时,用变量t计算子序列的长度,当变量i指向不符合条件的位置时,可以计算子序列的________位置。
【经典案例】
在一个序列中遍历元素可以分为两种情况,一是对单个元素进行遍历,如对字符串进行加密、压缩算法。二是要找出序列中一个连续的子序列,如找一个依次相连的子串,找一个连续递增或递减的子序列。在第二种情况中,将涉及该元素与他前面或后面元素的关系,因此需与他们依次进行比较,比较总次数比元素的个数少1个,因此往往最后一个元素得到遍历。若采用双重循环解决此类问题,就不存在没有遍历到的情况。
【例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有n个整型元素,当条件a[i]==a[i-1]成立时,表示有连续相等的数量c
精点拨 A 每找到一个相等的值,求解数量的最大值,并保存此时的索引位置v,若不相等时初始化c的个数为1
B 初始化c的个数就在两个不相等的值时
C 当两个数相等时进行计数,当两个数不相等时,进行最值的查找,同时初始c的值为1,但该选项c的初始化发生在找到最大值时
D 若长度的最大值发生在最后,即该列表最后的几个数是长度最大值时,只是在进行计数,并未进行最大值的查找
听课笔记:____________________________________________________________
______________________________________________________________________
【变式】 水往低处流,下雨时道路上的低洼地(两边高中间低的凹处)总会有积水。例如某地面高度数据为“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
【例2】 老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式比较麻烦,导致很多老年人不太会用。如下图是一款老年机的键盘,其字母的输入方式如下:
(1)若要输入英文字母“A”,则2键按1下;若要输入“B”,则2键按两下;其他英文字母的输入方式同理。
(2)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1键,直接按所要输入英文字母对应的数字键即可。
(3)若要输入空格,则按0键。
王老师依据该手机的字母输入规则,设计了一个Python程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。程序运行界面如图所示:
实现该功能的程序代码如下:
keyboard={″0″:″ ″,″2″:″ABC″,″3″:″DEF″,″4″:″GHI″,″5″:″JKL″,″6″:″MNO″,″7″:″PQRS″,″8″:″TUV″,″9″:″WXYZ″}
yw=input(″输入按键编号顺序:″)
①________
i=1;k=1
result=″″
while iif yw[i]==key:
k=k+1
else:
if yw[i]==″1″:
     ②________
result+=keyboard[key][k-1]
key=yw[i]
③________
i=i+1
result+=keyboard[key][k-1]
print(″输出的内容是:″,result)
请回答下列问题:
(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是________。
(2)要实现程序的功能,请完善划线处的代码。
思维点拨
精点拨 (1)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定。6为M,1表示在同一数字键中,666表示O,因此为MOON。(2)①key表示按下的数字。其初值为yw[0]。②条件yw[i]==″1″成立,表示在同一数字键的分隔符,直接读取下一个位置的数字。③在条件yw[i]==key不成立时,将对新的按键进行统计,其计数恢复为1。
听课笔记:_____________________________________________________________
______________________________________________________________________
______________________________________________________________________知识点三 组合问题
【知识梳理】
1.计算机解决问题的基本思维是枚举算法,在两个不同对象中分别枚举两个元素,或者在一个对象分别枚举两个元素,就形成了________问题。
2.两个不同对象元素个数分别为m和n,则枚举的总次数为________。算法采用双重循环描述为for i in range(m):for j in range(n)。
3.用一个二维矩阵来描述两个不同对象元素组合,每种组合可以用矩阵中每个________来表示。
4.在一个包含n个元素的对象中取出两个元素的组合,为了避免数量重复,往往采用的方法是外循环从0遍历到________,内循环从当前位置i后面的元素开始遍历。算法采用双重循环描述为for i in range(n-1):for j in range(i+1,n)。
5.用一个二维矩阵来描述一个不同对象不同元素组合,每种组合可以用矩阵中________线右上方的每个单元格来表示。
【经典案例】
从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的一个组合。当m为2时,是经常要讨论的情况,在同一线性结构中,用两个指针分别移动遍历。变量i表示第一个数位置,他的范围从0至n-2,变量j表示另一个元素的位置,为了两个数的重复组合,变量j的范围从i+1至n-1。当然也可以从后往前遍历,变量i从n-1至1,变量j从i-1至0,这样就不会重复了。
【例题】 每个人有智商QA和体力QB值,从m个申请人中挑选2人组队参加某挑战赛。条件一是2人的智商QA值都必须大于指定参数h;条件二是2人的体力QA值之差(较大值减较小值)小于h。在满足上述两个条件的所有2人组合中,挑选体力QB值之和最大的一个组合,若有多个相同最大的组合一并输出。(QA、QB和h的值均为正整数)程序运行的界面如图所示。
请输入参数h:30
组队结果:33 37 36 34
组队结果:33 37 33 34
(1)实现上述功能的Python程序如下,请在划线处填入合适的代码。
(2)程序中加框处代码有错,请改正。
#读入qa和qb的值,依次保存在列表中,代码略
ha=int(input(″请输入参数h:″))
imax=0;s=[]
n=len(qa)
for i in range(n-1):
if ①________:
continue
for j in range(②________):
if ③________:
     if qb[i]+qb[j]>imax:
       imax=qb[i]+qb[j]
       s=[qa[i],qb[i],qa[j],qb[j]]
    
       s.append([qa[i],qb[i],qa[j],qb[j]])
#输出最佳组合,代码略。
思维点拨
明考向 本题考查数据组合及最值查找
精点拨 (1)①条件一是2人的QA值都必须大于指定参数h,continue指略过此次循环,那么应该判断qa[i]的值。②是一个组合,n个人两两组合,变量i表示第1个的位置,索引位置从0至n-2,那么与他后面的人进行组合,不会发生重复。③条件二是2人的QA值之差(较大值减较小值)小于h,因此需判断qa[j]是否符合条件一,同时要判断两个人的QA值之差是否符合条件。(2)在符合条件中找最值,若有多个最值,则同时添加保存
听课笔记:____________________________________________________________
______________________________________________________________________【变式】 某音乐平台可以为用户推荐歌曲,推荐歌曲的算法如下:
第1步,系统根据用户的听歌行为,使用-2~5进行量化,单曲循环=5,分享=4,收藏=3,主动播放=2,听完=1,未听=0,跳过=-1,拉黑=-2,量化值大于0表示喜欢,建立如图a数据。
第2步,分别计算待推荐用户与其他每位用户的听歌相似度(相似度=两用户同时喜欢的歌曲数/两用户中至少有一人喜欢的歌曲数)。
第3步,分别计算其他用户对每一首歌曲的推荐度(推荐度=某用户该歌曲的量化值×两用户的相似度)。
第4步,在其他用户所有量化值大于0的歌曲中找到推荐度最高的,且待推荐用户没有听过的歌曲,推荐给该用户。
小明用Python程序模拟了此推荐算法,请回答下列问题。
(1)在图a所示的10首歌曲中,“yigoo”与“lucky”两用户的相似度为________。(四舍五入保留两位小数)
(2)实现上述功能的Python程序如下,运行结果如图b所示,请在划线处填上合适的代码。
图b
def find(name,user):
#代码略
def simalar(music,data,k): #计算相似度
xsd=[0]*len(data)
for i in range(len(data)):
ms1=ms2=0
for j in range(len(music)):
     if k!=i:
       if data[k][j]>0 and data[i][j]>0:
         ms1+=1
      if ①________:
        ms2+=1
if ms2>0:
     xsd[i]=ms1/ms2
return xsd
music=[″《孤勇者》″,″《Hug me》″,″《后会无期》″,″《NUNA》″,″《蜗牛》″,″《心墙》″,″《对你说》″,″《与天齐》″,″《栀子花开》″,″《风吹半夏》″]
user=[″HelloK″,″sime32″,″yigoo″,″lucky″,″halibo″,″baby″,″HaiT″,″bao_66″]
#读取听歌数据文件存入data列表,如图c所示
[[0,4,2,0,0,1,-1,3,0], [2,0,0,1,0,0,0,0,0,4], …… [3,0,0,0,0,1,0,0,0,1], [-1,0,1,0,0,-2,3,0,0,2]]
图c
name=input(″请输入您的用户名:″)
k=find(name,user)   #调用find函数返回该用户在data列表中的索引号
xsd=simalar(music,data,k) #xsd[0]表示0号用户与k号待推荐用户的相似度
maxm=0
for i in range(len(data)):
for j in range(len(music)):
if data[k][j]==0 and data[i][j]>0:
     like=②________
    if like>maxm:
       maxm=like
       p=j
print(″为您推荐的歌曲是:″,③________)
综合题 简单算法
【经典案例】
【例题】 某物品柜有5层,每层有10个格子,每个格子只能放一个物品。输入一组物品的高度值(按降序排列),将这些物品放在同一层的连续格子中。第一步:查找存放物品的格子。从第1层开始查找,若该层物品柜连续空格数量小于物品数量,则查找下一层。查找5层后还是不能找到连续存放位置,输出“不能连续存放”。若在某一层中找到符合要求的连续空格子,则进行第二步:将物品按中间高两端低的原则存放物品。先将高度最高的物品存放在连续空格的中间位置(若空格数量为偶数,则放在中间靠左位置),接着依次将物品按先右后左的顺序依次存放。如输入物品高度为8,5,2,1,则依次放在第1排的第5,6,4,7的位置。第一排各个格子存放物品高度如图所示,其中0表示未存放物品。
0 0 0 2 8 5 1 0 0 0
(1)输入第1组物品高度依次为8,5,2,第2组依次为9,6,3,1,则高度为3的物品存放在第1排第________(填数字)个格子中。
(2)实现该功能的Python程序段如下,将空白处填写完整。
#将已经存放的物品高度存储在数组a中,如:
[[0,9,6,2,8,5,1,0,0,0],[0,0,1,7,10,9,2,0,0,0],……],代码略。
s=input(″输入一组降序的物品高度,用逗号分开:″)
wp=list(map(int,s.split(″,″))) #输入的数字转换成列表
flag=False
i=0
while i <5 and not flag:
beg=0
for j in range(10):
  if a[i][j]==0: #物品柜格子为0表示没有存放物品
   if j-beg+1>=len(wp):
     hang=i
    end=j
     flag=True
else:
     if flag:
       break
    ①________
i+=1
if flag:
②________
a[hang][wz]=wp[0]
i=1
while iif ③________:
     wz-=i
else:
     wz+=i
a[hang][wz]=wp[i]
i+=1
else:
print(″不能连续存放″)
#输出物品柜的存放情况,代码略
思维点拨
明考向 本题考查二维数组的遍历和在一个序列中查找最值
精点拨 (1)高度8,5,2依次存放第5、6、4的格子中,因此左边还有3个空格,右边有4个空格。高度9,6,3,1依次存放第8、9、7、10的格子中。(2)①确定连续空格子的最左边位置beg,若格子为空,计算连续空格子数量为j-beg+1,若数量达到存放物品数量时,将flag设置为True。若格子不为空,则下一个空格子的位置只能在当前j的下一个位置。②中间位置的计算方法类似于二分查找,将左右位置相加再整除以2。③语句a[hang][wz]=wp[0]的功能是放置最中间的物品,接下来放在i为1的物品,在中间的右边,即wz等于i+1,当i的值为2时,放在左边的前面2个位置中,因此通过判断变量i的奇偶性来决定存放的位置。
听课笔记:_____________________________________________________________
______________________________________________________________________
【变式1】 某智能货架有一排货位,货位号从0开始编号,每个货位等宽。货架上可放置不同宽度(占1~3个货位)的箱子,箱子从左往右连续相邻摆放。每次放置箱子时,只能在货架上最后一个箱子的右侧放置新箱子。可以搬离中间的某个箱子,但该箱右侧所有箱子被自动左移。编写程序,模拟搬离或放置操作,操作结束后,输出当前货架上所有箱子的起始位置。
(1)若货架有5个箱子,状态如图所示,搬离第2个箱子后,当前货架上最后一个箱子的起始位置是________。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#共有n个箱子供操作,代码略
lst=[-1]*n
st=m=0
while True:
″操作序列如[″P1″, ″M0″,……., ″E″],依次读取序列元素,存入变量 op,″P1″表示放置宽度为 1 的箱子,″M0″表示搬离第 1 个箱子,代码略″'
if op[0]==″P″:
w=int(op[1:]) #表示箱子的宽度为w
lst[m]=st
st=st+w
①________
elif op[0]==″M″:
i=int(op[1:]) #表示第i+1个箱子将被搬离
if lst[i+1]!=-1: #计算移动的距离
     dis=②________
else:
     dis=st-lst[i]
while lst[i+1]!=-1:
     lst[i]=lst[i+1]-dis
     i=i+1
lst[i]=-1
st=③________
m=m-1
else:
break
#输出当前货架上所有箱子的起始位置,代码略
【变式2】 实现【变式1】功能的程序代码还可以如
#共有n个箱子供操作,代码略
lst=[-1]*n
wd=[0]*n
st=m=0
while True:
″操作序列如[″P1″, ″M0″,…….,″E″],依次读取序列元素,存入变量op,″P1″表示放置宽度为1的箱子,″M0″表示搬离第1个箱子,代码略″
if op[0]==″P″:
w=int(op[1:]) #表示箱子的宽度为w
lst[m]=st
①________
st=st+w
m+=1
elif op[0]==″M″:
i=int(op[1:]) #表示第i+1个箱子将被搬离
t=wd[i]
while :
     ②________
      wd[i]=wd[i+1]
     i=i+1
③________
st=st-t  
m=m-1
else:
break
#输出当前货架上所有箱子的起始位置,代码略
(1)将程序空白处填写完整。
(2)实现加框处功能的语句还可以是__________。
1.有如下Python程序段:
s=″Student Union!″
f=[0]*26
i=0
while iprint(s[i])
if ″a″<=s[i]<=″z″:
f[ord(s[i])-ord(″a″)]+=1
elif ″A″<=s[i]<=″Z″:
i+=1
continue
else:
break
i+=1
for i in range(26):
if f[i]==1:
print(chr(i+ord(″A″)),end=″″)
执行该程序段,输出结果为(  )
A.DENU B.DENTU
C.DEIOU D.denu
2.某Python程序段如下:
x=input(″请输入字符串:″)
i=0;j=len(x)-1
while ii+=1
j-=1
print(i,j)
程序运行后,输入字符串“123421″,输出的结果是(  )
A.2 3 B.3 4
C.3 2 D.4 3
3.某Python程序段如下:
a=[10,20,25,37,45,48,50]
p=1
for j in range(2,len(a)):
if a[j]-a[j-1]>a[p]-a[p-1]:
p=j
ans=a[p]-a[p-1]
print(ans)
该程序实现的功能是(  )
A.求a中的最小值 B.求a中的最大值
C.求a中相邻元素差值的最小值 D.求a中相邻元素差值的最大值
4.某密码强度判断程序功能如下:将密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型。输入一串密码字符,如果该字符串的长度小于8,则输出“密码长度不符合要求!”;若该字符串包含三种字符及以上,则输出“强度:强”;若该字符串包含两种字符,则输出“强度:中”;若该字符串仅包含一种字符,则输出“强度:弱”。
(1)请在划线处填入合适的代码。
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)若输入的密码字符串为“Assd?237”,则输出的结果为________。
5.中华人民共和国居民身份证号码共18位,其中前17位为数字本体码,第18位为校验码。作为尾号的校验码,是按统一的公式计算出来的,校验码的计算方法为:
(1)将身份证前17位分别乘以不同的系数,系数依次为7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
(2)将这17位数字和系数相乘的结果相加;
(3)求用上述相加的和除以11的余数;
(4)余数只可能有0,1,2…9,10共11个数字,分别对应校验码1,0,X,9,8,7,6,5,4,3,2。
例如:身份证号34052419800101001X,计算3*7+4*9+0*10+5*5+…+1*2=189,用189除以11得出余数2,对应的校验码是X。
编写Python程序,判断输入的身份证号码的校验码是否正确,正确输出“Yes”,否则输出“No”,请在划线处填入合适代码。
def judge(s):
v=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] #系数
m='10X98765432' #余数对应的校验码
①________
if n!=18:
return False
res=0
for i in range(n-1):
②________
res=res%11
code=m[res]
if ③________:
return True
else:
return False
s=input(输入身份证号码:')
if ④________:
print('Yes')
else:
print('No')
6.有如下Python程序代码,程序执行输出结果是(  )
list=[4,7,8,1,2,6]
s=0
for a in range(1,len(list)):
if list[a]s+=1
else:
s-=2
print(s)
A.3 B.4
C.-7 D.-3
7.有如下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的值为(  )
A.1 B.2
C.3 D.4
8.某Python程序段的功能是寻找列表中最先出现的最长连续升序段,代码如下:
a=[2,5,7,6,13,4,7,8,10,9]
#列表a中的元素均为正整数
a.append(-1)
b=[a[0]]
maxn=1;count=1
for i in range(1,len(a)):
if ____(1)____:
count+=1
else:
if count>maxn:
     maxn=count
     b=a[i-count:i]
   ____(2)____
print(b)
划线处(1)(2)应填入的代码是:①a[i]a[i-1] ③count=1 ④count=0其中正确的选项为(  )
A.①③ B.①④
C.②③ D.②④
9.有如下Python程序段:
s=input(″请输入字符串:″)
i=0;j=1;t=0;s1=″″;maxs=″″
while iif s[i]<=s[i+1]:
   j+=1
s1=s[t:t+j]
if len(maxs)<=len(s1):
  maxs=s1
else:
s1=″″
t=i+1
j=1
i+=1
print(maxs)
执行该程序,当输入“p8579yt559h6”时,输出的结果为(  )
A.579 B.579y
C.559h D.t559h
10.编写程序实现如下功能:统计某医院儿科100天中连续7天的日就诊人数最大差值,即任意连续7天内的就诊人数最多日与最少日的人数之差。
实现上述功能的Python程序如下,请回答下列问题:
(1)100天内某时间段的连续7天的日就诊人数为″15,26,55,39,16,51,23,19,58,51″,则该时间段内连续7天日就诊人数的最大差值为________________。
(2)请在程序划线处填入合适的代码。
#列表a中存储了100天的日就诊人数,代码略
ans=-1
for p in range(0,94):
i=p
①________
minrs=min(a[i:j])
maxrs=max(a[i:j])
if ②________:
ans=maxrs-minrs
print(″连续 7 天日就诊人数最大差值为:″,ans)
11.海面波浪实际上是各种不同波高、周期、行进方向的多种波的无规则组合。为了海洋工程设计的方便,实际工程中常采用具有某种统计特征值的波作为代表波,其中有效波(三分之一大波)应用较为广泛。将任一由n个波浪组成的波群的波高由大到小依次排列,其中前面n/3个波的平均波高即为有效波高。编写Python程序,实现有效波高的计算,结果四舍五入保留两位小数并输出,程序运行结果如图所示:
请输入波群(m):1.05,2.06,1.99,0.98,0.65,1.92,1.04,2.03,0.78,2.67
有效波高(m):2.25
请在划线处填入合适的代码。
s=input(″请输入波群(m)″)
a=[]
s=s+″,″
①________
for j in range(len(s)):
if s[j]==″,″:
t=float(s[i:j])
a.append(t) #append 方法用于在列表末尾添加新元素
②________
a.sort(reverse=True) #将a列表中的元素从大到小排列
sumbg=0
for k in range(len(a)//3):
sumbg=sumbg+a[k]
③________
print(″有效波高(m):″,aver)
12.输入一个嵌套列表,嵌套层次不限,根据层次求列表元素的加权和。第一层每个元素的值为:元素值*1,第二层每个元素的值为:元素值*2,第三层每个元素的值为:元素值*3, …,运行程序如图所示。
请回答以下问题
(1)输入列表[[[1,-2,3]]],输出结果是________。
(2)请在划线①②③④处填入合适的代码。
s=input(″请输入列表:″)
count=ans=0
flag=1
①________
while iif s[i]==″[″:
count+=1
elif s[i]==″]″:
count -=1
elif s[i]==″-″:
②________
elif ″9″>=s[i]>=″0″:
j=i
num=0
while ″9″>=s[j]>=″0″:
     num=③________
    j+=1
④________
ans=ans+count*num*flag
flag=1
i+=1
print(″输出结果:″,ans)
13.机器人从原点(0,0)开始在平面中移动。机器人只能通过用户给定的指令UP向上,DOWN向下,LEFT向左和RIGHT向右移动。如机器人收到的运动指令向上5步,向下3步,向左3步,向右2步,按回车键结束指令输入,程序运行界面如图所示:
请输入方向和步数 ,隔开UP,5 ,隔开DOWN,3 ,隔开LEFT,3 ,隔开RIGHT,2 ,隔开 经过4个指令 机器人距离原点2.24
左侧为运动方向,右侧数字为前进步数。请编写一个程序,计算经过一系列运动之后,机器人当前位置离开原点的距离(四舍五入保留两位小数)。
(1)若输入的指令依次为UP,2;RIGHT,4;DOWN,5和回车键,则机器人当前位置离开原点的距离是________。
(2)请把下面的代码补充完整。
pos=[0,0]
n=0
print(″请输入方向和步数″)
while True:
s=input(″,隔开″)
if len(s)==0: #按回车结束运行
break
①________
movement=s.split(',')
#用于字符串分割的常用方法。如:'a#b#c'split( # )结果为['a','b','c']
direction=movement[0]
②________
if direction==″UP″:
pos[1]+=steps
elif direction==″DOWN″:
pos[1]-=steps
③________:
pos[0]-=steps
elif direction==″RIGHT″:
pos[0]+=steps
print('经过'+ str(n) +″个指令″)
print(″机器人距离原点″,④________
14.上城小学将在本学期开展趣味运动会,一(10)班的班主任邀请你为他们设计一个Python程序,用于挑选参加集体项目的选手。挑选规则为:当班级有足够候选人员时,进行随机挑选,并输出人员名单;若无足够人员时,提示“无足够候选人员参加比赛!”,并规定每个学生最多参加一个集体项目。程序要求用户按照规范输入比赛项目及相关人员要求,例如输入“投篮:8,2”即篮球项目要求男生8人,女生2人。该程序的运行效果如图所示:
请输入比赛项目及相关人员要求:跳绳:5,5;赶猪:15,15;投篮:8,2 跳绳项目: 男:艾震宇 蔡温淼 叶埕奇 何夫 王子硕 女:王晓清 黄鑫橼 陈佳妮 陈昱彤 陈奕臻 赶猪项目: 无足够候选人员参加比赛! 投篮项目: 男:陈展骢 李俊翰 张子俊 刘泓成 胡海伟 王子涵 叶赛特 伍越 女:贾熙 钱梓涵
(1)实现挑选集体项目选手的Python代码如下,请在划线处填入合适代码。
(2)程序加框处代码有误,请改正。
from random import shuffle
def disp(inf):
#将输入的字符串整理为指定格式,当输入字符串为″跳绳:10,10;投篮:8,2″,则将其调整为{″跳绳″: [10, 10], ″投篮″:[8, 2]}并返回。
def player(x,n):
for p in range(len(x)):
if p>=n:
     ①________
print(x[p],end=″ ″)
return x[n:]
c=[[″陈浩琦″, ″男″],[″王慧敏″, ″女″], [″王子涵″, ″男″],…] #班级学生名单
ctemp=[[],[]]
for ②________ in c:
if p[1]==″男″:
ctemp[0].append(p[0]) #append()函数的功能为在列表末尾插入新元素
else:
ctemp[1].append(p[0])
inf=input(″请输入比赛项目及相关人员要求:″)
s=[″男″,″女″]
sj=disp(inf)
for t in sj: #变量遍历字典中的每个键
if sj[t][0]<=len(ctemp[0]) and sj[t][1]<=len(ctemp[1]):
print(t+″项目: ″)
for i in ③________:
    print(s[i],end=″:″)
     shuffle(ctemp[i]) #shuffle 用于将序列的所有元素进行随机排序
    
    print()
else:
print(t+″项目:\\n无足够候选人员参加比赛!″)
15.不同的两个单词或短语,字母异位词指的是由相同的字母组成且不区分大小写,但字母位置不同,比如″Heart″和″earth″是字母异位词,″Apple″和″Paper″不是字母异位词。现编写Python程序,文本文件“word.txt”中保存着若干对单词组,从文件“word.txt”中读取多对单词组,并判断该组中两个单词是否为字母异位词。
(1)请在划线处填入合适的代码。
def change(x): #将字母都转换为小写字母
for k in x:
if ″A″<=k<=″Z″:
    k=①________
  
     y+=k
return y
def fs(m, n):
cnt=[0]*26
for i in range(len(m)) :
ch=ord(m[i])
②________
for i in range(len(n)) :
ch=ord(n[i])
cnt[ch-ord(″a″)]-=1
return cnt
file=open(″words.txt″,″r″) #以只读的方式打开文件
text=[];s1=s2=″″
line=file.readline() #从文件中读取一行
while line: #当line非空(从文件中读取到数据)
line=line.strip() #把末尾的’\\n’去掉
text.append(line.split()) #方法是把空白字符去掉,把ine变成包含 2 个单词列表
line=file.readline()
file.close()
③________
for i in range(num) :
s1=text[i][0]
s2=text[i][1]
c=④__________
j=0
while jif c[j]!=0:
    print(sl,″和″,s2,″不是字母异位词″)
     break
j+=1
else:#在循环正常结束后执行
print(s1,″和″,s2,″是字母异位词″)
(2)下列程序代码中,加框处的语句________(选填:能/不能)改写成语句elif ″a″<=k<=″z″:
专题6 简单算法及程序实现
知识点一
知识梳理
1.因素 建模 2.前提 3.可能 判断 4.枚举 筛选 5.范围
经典案例
例1 (1)2或两 (2)①elif t==″B″ 或elif t==″B″或elif t==″'″或elif (t=='B') ②cnt1-=w或cnt1=cnt1-w ③i+=1或i=i+1
变式1 D [本题考查数组的遍历。依次遍历字符串中数字,若是数字,向后循环后移3个,若是小写字母,转换成相应的大写字母,其他字符(逗号和大写字母)不处理。]
例2 (1)pos[0]或bp (2)[x,y] (3)int(line[1]) (4)new_pos[1]=pos[1]+y*lg (5)p=p+1
变式2 (1)B (2)lst (3)result=10-val % 10 (4)money=money+lst1[i][1]*lst1[i][2]或money+=lst1[i][1]*lst1[i][2]
解析 (1)若输入opt的值为4,模拟程序运行过程,将选择else分支,此时输出内容为“操作结束”。(2)readfile函数将读取csv文件内容,同时将文件内容存储到列表lst中,最后返回lst列表。(3)依据算法中第③步描述,该算法步骤实现语句为:result=10-val % 10。(4)根据lst1[i]中存储的图书信息,找到对应图书数量(lst1[i][1])和单价(元)(lst1[i][2]),然后计算该出版社总费用,同时累加到变量money中。
知识点二
知识梳理
1.i-1 i+1 2.n-1 3.单个 4.字母 子序列 5.长度 6.开始
经典案例
例1 A
变式 C [本题考查在一个序列中查找一个下降子序列。flag是下降段的标志,从索引1开始遍历,若他比他前面的数小,表示处理下降段,将flag置为True。在下降过程中,若他比他前面的数大,表示从该位置开始处理上升段,因此将增加一个下降段,同时将标志设置为False。]
例2 (1)MOON (2)①key=yw[0] ②i=i+1 ③k=1
知识点三
知识梳理
1.组合 2.m*n 3.单元格 4.n-2 5.主对角
经典案例
例题 (1) ①qa[i]<=ha ②i+1,n ③qa[j]>ha and abs(qa[i]-qa[j])变式 (1)0.33 (2)①data[k][j]>0 or data[i][j]>0 ②xsd[i]*data[i][j] ③music[p]
解析 本题考查二维数组中数据元素和数据项的遍历。(1)相似度=两用户同时喜欢的歌曲数/两用户中至少有一人喜欢的歌曲数,因此为2/6。(2)①ms2表示两用户中至少有一人喜欢的歌曲数。②推荐度=某用户该歌曲的量化值×两用户的相似度。③在最大值查找过程中,p中推荐度最大歌曲的索引号,因此推荐的歌曲是music[p]。
综合题
经典案例
例题 (1)7 (2)①beg=j+1 ②wz=(beg+end)//2 ③i%2==0
变式1 (1)5 (2)①m=m+1 ②lst[i + 1]-lst[i] ③st-dis
解析 本题考查列表的遍历和数据的移动。(1)搬离第2个箱子,每个箱子向左移动3个单位,因此起始位置为5。(2)①从语句lst[m]=st和st=st+w来看,m表示箱子索引号,st表示起始位置,起始位置每次增加箱子长度,因此箱子索引也要增加。②计算移动距离,条件lst[i+1] !=-1表示后面还有箱子,因此移出箱子的距离为前后两个箱子起始位置的差值。③语句lst[i]=-1更新最后一个箱子往前移动后,少了一个箱子,因此起始位置也要相应往前移动。
变式2 (1)①wd[m]=w ② lst[i]=lst[i+1]-t ③lst[i]=-1或lst[m-1]=-1 (2)i解析 本题考查列表的遍历和数据的移动。(1)①记录当前放置箱子的宽度。②将后面所有箱子向左移动,每个箱子的开始放置位置也要发生变动,后一个箱子的开始位置就是当前箱子的结束位置,将该位置减去移动箱子的宽度,就是移动的距离。③将第m个箱子移动后,该位置初始值设置为-1。(2)一共有m个箱子,最后一个箱子的索引为m-1。
当堂过关检测
1.A [continue忽略该语句下方语句,进入下一轮循环。break是终止循环。因此只遍历到″Student″,uden的字符数量为1,经过从小到大并转化为大写输出后为DENU。]
2.A [从首尾两端遍历字符串,若相等则继续,当检测到“34″不相等,索引位置在2和3。]
3.D [表达式a[p]-a[p-1]表示相邻元素差值。p初值为1,第1个相邻元素差值的位置,再依次枚举相邻元素差值的最大值。]
4.(1)①n=len(s) ②i in range(len(s)) ③elif ″0″<=ch<=″9″ ④sum==2 
(2)强度:强
解析 (1)①在条件n<8中没有对n进行定义。②下面语句为ch=s[i],变量i没有定义。③第3种情况是判断是否是数字。④有两种类别,强度为中。(2)有4种类型的字符。
5.①n=len(s) ②res+=int(s[i])*v[i] ③code==s[-1] ④judge(s)==True或judge(s)
解析 自定义函数judge用于判断输入身份证号码s是否合法,若合法返回True。①处下方语句if n!=18,因此该处肯定与n有关。②将这17位数字和系数相乘的结果相加并存储到res中。③执行语句res=res%11后,求用上述相加的和除以11的余数;code对应校验码,若计算出来的校验码与身份证号码是最后一位相同,则表示身份证有效。④调用自定义函数并判断输入的号码是否合法。
6.C [从索引1开始,比前面数小,加1,否则减去2。比前面小的数对有8和1,因此4对数比前面数大。]
7.C [依次比较的条件为(3-2)/2<(5-3)/3、(5-3)/3<(9-5)/5、(9-5)/5<(17-9)/9、(17-9)/9<(30-17)/17,最后一个条件不成立,成立的条件有3个。]
8.C [本题考查枚举算法。查找一个最长连续升序段,从索引位置1开始,与他前面的数进行比较,若大于前面的数,表示还处在升序段中,否则i-1才是升序段的结束位置,索引位置i是下一段的开始位置,下一段中已经有一个元素,因此count的值为1。]
9.C [程序功能在一个序列中查找最长的递增子序列。]
10.(1)43 (2)①j=i+7或j=p+7 ②maxrs-minrs>ans
解析 本题综合考查了循环结构和最值的应用。
(1)按照题意,找出七天里人数最多为58,最少为15,因此差值最大为43。
(2)①每七天中选择人数最多的一天一级人数最少的一天,因此步长可以设置为7,可以表示为j=i+7或j=p+7。
②如果if后条件表达式成立,则更新ans的值为ans=maxrs-minrs,因此if后条件表达式应为找到了更大的差值,即maxrs-minrs>ans。
11.①i=0 ②i=j+1 ③aver=round(sumbg/(k+1),2)或aver=round(sumbg/(len(a)//3),2)或aver=int(sumbg/(k+1)*100+0.5)/100或aver=int(sumbg/(len(a)//3)*100+0.5)/100或其它等价答案
解析 ①在语句t=float(s[i:j])中,变量i是字符切片的初始位置,其初值应为0。②当条件s[j]==″,″成立时,表示找到一个数字串,下个数字串的起始位置为j+1。③前面n/3个波的平均波高即为有效波高。
12.(1)6 (2)①i=0 ②flag=-1 ③num*10+int(s[j]) ④i=j-1
13.(1)5 (2)①n+=1 ②steps=int(movement[1])
③elif direction==″LEFT″ ④round((pos[0]**2+pos[1]**2)**0.5,2)
14.(1)①break ②p ③range(len(ctemp))或range(2) (2)ctemp[i]=player(ctemp[i],sj[t][i])
15.(1)①chr(ord(k)+32)或chr(ord(k)+ord(″A″)-ord(″a″))或k.lower() ②cnt[ch-ord(a″)]+=1或cnt[ch-97]+=1 ③num=len(text) ④fs(change(s1),change(s2))或fs(change(s2),change(s1)) (2)不能

展开更多......

收起↑

资源预览