资源简介 专题6 简单算法及程序实现学业要求 知 识 点 学业水平等级1.掌握解析算法、枚举算法的算法特征,并会用计算机程序实现这两种算法 22.掌握程序调试与运行的方法,理解算法优化对解决问题的影响 2知识点一 枚举算法【知识梳理】1.抽象指找到解决问题的主要________,________指影响问题各种因素之间的关系。根据问题的前提条件与所求结果之间的关系,找出求解问题的方法和步骤,并用相应过程描述出来。2.解析算法的解题思路:先确定问题的________条件,找解决问题的数学表达式,再根据表达式确定问题要求的解。3.枚举算法的基本思想:把问题所有________的解一一列举,然后________每一个列举出的可能解是否为正确的解。4.枚举算法程序实现的三个主要环节:________解(循环语句),________解(条件判断),输出解(或统计解的个数)。其一般程序结构特点是循环包含分支结构语句,实现对枚举出的解进行判断与筛选。其中,循环包含分支结构语句,用于确定枚举对象枚举范围和判定条件。5.枚举法的优化:尽可能地缩小解的列举________。【经典案例】抽象和建模是用程序实现算法前的重要步骤,抽象找出影响问题的主要因素,明确已知什么和求什么。建模是描述主要因素之间的关系,一是明确方法,往往采用遍历列表的方法;二是明确步骤,往往是求符合条件的和、个数、最值和平均值。遍历是按照一定的规则和次序访问数据元素中的所有节点,使得每个节点都被访问一次且仅被访问一次。在遍历过程中,可以对访问过的数据进行求和、计数、求平均值和求最大值或最小值操作。枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法,在遍历过程中求值与条件进行比对的过程。枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。【例1】 某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:箱子类型 操作类型 货位编号B 放置 5A 放置 2,3B 放置 0A 放置 7,8A 搬离 2,3(1)若n为10,开始时货位全空,经过如图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为________个。(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取货位总数存入n,代码略。cnt1=nlst=[0]*n #货位状态,0表示对应的货位为空while True:#读取本次已描述数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略if t==″A″:w=2①________:w=1else: #不是″A″或″B″时退出循环breakif d==″P″: #d为P时表示放置,否则表示搬离②________else:cnt1+=wlst[s]=1-lst[s]if t==″A″:lst[s+1]=1-lst[s+1]i,cnt2=0,0while iif lst[i]==0 and lst[i+1]==0: ③________ cnt2+=1i+=1print(″当前空货位数″,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+cprint (s2)程序运行后,输入“9790,JiaYou″,输出的结果是( )A.6467,jiayou B.6467,JIAYOUC.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 csvf=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=1elif dr==″D″:x=0;y=-1elif dr==″L″:x=-1;y=0elif dr==″R″:x=1;y=0new_pos[0]=pos[0]+x*lg______________return new_pos(5)编写函数gettimes(),计算剩余移动次数。代码如下:def gettimes(p1,p2):p=abs(p1-p2)//5if 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 pddef 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=3for 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 Trueelse: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=0for 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,0for i in range(1,n):print(a[v])A.if a[i]==a[i-1]:c+=1if c>m:m=cv=ielse:c=1B.if a[i]==a[i-1]:c+=1if c>m:m=cv=ielse:c=1C.if a[i]==a[i-1]:c+=1else:if c>m:m=cv=i-1c=1D.if a[i]==a[i-1]:c+=1else:if c>m:m=cv=i-1c=1思维点拨明考向 本题考查一维列表的遍历和最值的查找。已排序的列表a有n个整型元素,当条件a[i]==a[i-1]成立时,表示有连续相等的数量c精点拨 A 每找到一个相等的值,求解数量的最大值,并保存此时的索引位置v,若不相等时初始化c的个数为1B 初始化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=0f=Falsefor i in range(1,len(h)):if ①________:f=Trueelif h[i-1]cnt+=1②________print(″该地面有″,cnt,″处低洼地。″)上述代码中划线处应填入的代码是( )A.①h[i]>h[i+1] ②f=FalseB.①h[i]>h[i+1] ②f=TrueC.①h[i-1]>h[i] ②f=FalseD.①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=1result=″″while iif yw[i]==key:k=k+1else:if yw[i]==″1″: ②________result+=keyboard[key][k-1]key=yw[i]③________i=i+1result+=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 ①________:continuefor 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所示,请在划线处填上合适的代码。图bdef find(name,user):#代码略def simalar(music,data,k): #计算相似度xsd=[0]*len(data)for i in range(len(data)):ms1=ms2=0for j in range(len(music)): if k!=i: if data[k][j]>0 and data[i][j]>0: ms1+=1 if ①________: ms2+=1if ms2>0: xsd[i]=ms1/ms2return xsdmusic=[″《孤勇者》″,″《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]]图cname=input(″请输入您的用户名:″)k=find(name,user) #调用find函数返回该用户在data列表中的索引号xsd=simalar(music,data,k) #xsd[0]表示0号用户与k号待推荐用户的相似度maxm=0for 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=jprint(″为您推荐的歌曲是:″,③________)综合题 简单算法【经典案例】【例题】 某物品柜有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=Falsei=0while i <5 and not flag:beg=0for j in range(10): if a[i][j]==0: #物品柜格子为0表示没有存放物品 if j-beg+1>=len(wp): hang=i end=j flag=Trueelse: if flag: break ①________i+=1if flag:②________a[hang][wz]=wp[0]i=1while iif ③________: wz-=ielse: wz+=ia[hang][wz]=wp[i]i+=1else: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]*nst=m=0while True:″操作序列如[″P1″, ″M0″,……., ″E″],依次读取序列元素,存入变量 op,″P1″表示放置宽度为 1 的箱子,″M0″表示搬离第 1 个箱子,代码略″'if op[0]==″P″:w=int(op[1:]) #表示箱子的宽度为wlst[m]=stst=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+1lst[i]=-1st=③________m=m-1else:break#输出当前货架上所有箱子的起始位置,代码略【变式2】 实现【变式1】功能的程序代码还可以如#共有n个箱子供操作,代码略lst=[-1]*nwd=[0]*nst=m=0while True:″操作序列如[″P1″, ″M0″,…….,″E″],依次读取序列元素,存入变量op,″P1″表示放置宽度为1的箱子,″M0″表示搬离第1个箱子,代码略″if op[0]==″P″:w=int(op[1:]) #表示箱子的宽度为wlst[m]=st①________st=st+wm+=1elif 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-1else:break#输出当前货架上所有箱子的起始位置,代码略(1)将程序空白处填写完整。(2)实现加框处功能的语句还可以是__________。1.有如下Python程序段:s=″Student Union!″f=[0]*26i=0while iprint(s[i])if ″a″<=s[i]<=″z″:f[ord(s[i])-ord(″a″)]+=1elif ″A″<=s[i]<=″Z″:i+=1continueelse:breaki+=1for i in range(26):if f[i]==1:print(chr(i+ord(″A″)),end=″″)执行该程序段,输出结果为( )A.DENU B.DENTUC.DEIOU D.denu2.某Python程序段如下:x=input(″请输入字符串:″)i=0;j=len(x)-1while ii+=1j-=1print(i,j)程序运行后,输入字符串“123421″,输出的结果是( )A.2 3 B.3 4C.3 2 D.4 33.某Python程序段如下:a=[10,20,25,37,45,48,50]p=1for j in range(2,len(a)):if a[j]-a[j-1]>a[p]-a[p-1]:p=jans=a[p]-a[p-1]print(ans)该程序实现的功能是( )A.求a中的最小值 B.求a中的最大值C.求a中相邻元素差值的最小值 D.求a中相邻元素差值的最大值4.某密码强度判断程序功能如下:将密码字符分为大写字母、小写字母、数字字符以及其他符号四种类型。输入一串密码字符,如果该字符串的长度小于8,则输出“密码长度不符合要求!”;若该字符串包含三种字符及以上,则输出“强度:强”;若该字符串包含两种字符,则输出“强度:中”;若该字符串仅包含一种字符,则输出“强度:弱”。(1)请在划线处填入合适的代码。r=[0]*4;sum=0s=input(″输入密码:″)①________if n<8:print(″密码长度不符合要求!″);else:for ②________:ch=s[i]if ch>=″a″ and ch<=″z″: r[0]=1elif ch>=″A″ and ch<=″Z″: r[1]=1 ③________: r[2]=1else: r[3]=1sum=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 Falseres=0for i in range(n-1):②________res=res%11code=m[res]if ③________:return Trueelse:return Falses=input(输入身份证号码:')if ④________:print('Yes')else:print('No')6.有如下Python程序代码,程序执行输出结果是( )list=[4,7,8,1,2,6]s=0for a in range(1,len(list)):if list[a]s+=1else:s-=2print(s)A.3 B.4C.-7 D.-37.有如下python程序段:a=[2,3,5,9,17,30]k=0for 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.2C.3 D.48.某Python程序段的功能是寻找列表中最先出现的最长连续升序段,代码如下:a=[2,5,7,6,13,4,7,8,10,9]#列表a中的元素均为正整数a.append(-1)b=[a[0]]maxn=1;count=1for i in range(1,len(a)):if ____(1)____:count+=1else: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+=1s1=s[t:t+j]if len(maxs)<=len(s1): maxs=s1else:s1=″″t=i+1j=1i+=1print(maxs)执行该程序,当输入“p8579yt559h6”时,输出的结果为( )A.579 B.579yC.559h D.t559h10.编写程序实现如下功能:统计某医院儿科100天中连续7天的日就诊人数最大差值,即任意连续7天内的就诊人数最多日与最少日的人数之差。实现上述功能的Python程序如下,请回答下列问题:(1)100天内某时间段的连续7天的日就诊人数为″15,26,55,39,16,51,23,19,58,51″,则该时间段内连续7天日就诊人数的最大差值为________________。(2)请在程序划线处填入合适的代码。#列表a中存储了100天的日就诊人数,代码略ans=-1for p in range(0,94):i=p①________minrs=min(a[i:j])maxrs=max(a[i:j])if ②________:ans=maxrs-minrsprint(″连续 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=0for 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=0flag=1①________while iif s[i]==″[″:count+=1elif s[i]==″]″:count -=1elif s[i]==″-″:②________elif ″9″>=s[i]>=″0″:j=inum=0while ″9″>=s[j]>=″0″: num=③________ j+=1④________ans=ans+count*num*flagflag=1i+=1print(″输出结果:″,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=0print(″请输入方向和步数″)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]+=stepselif direction==″DOWN″:pos[1]-=steps③________:pos[0]-=stepselif direction==″RIGHT″:pos[0]+=stepsprint('经过'+ str(n) +″个指令″)print(″机器人距离原点″,④________14.上城小学将在本学期开展趣味运动会,一(10)班的班主任邀请你为他们设计一个Python程序,用于挑选参加集体项目的选手。挑选规则为:当班级有足够候选人员时,进行随机挑选,并输出人员名单;若无足够人员时,提示“无足够候选人员参加比赛!”,并规定每个学生最多参加一个集体项目。程序要求用户按照规范输入比赛项目及相关人员要求,例如输入“投篮:8,2”即篮球项目要求男生8人,女生2人。该程序的运行效果如图所示:请输入比赛项目及相关人员要求:跳绳:5,5;赶猪:15,15;投篮:8,2 跳绳项目: 男:艾震宇 蔡温淼 叶埕奇 何夫 王子硕 女:王晓清 黄鑫橼 陈佳妮 陈昱彤 陈奕臻 赶猪项目: 无足够候选人员参加比赛! 投篮项目: 男:陈展骢 李俊翰 张子俊 刘泓成 胡海伟 王子涵 叶赛特 伍越 女:贾熙 钱梓涵(1)实现挑选集体项目选手的Python代码如下,请在划线处填入合适代码。(2)程序加框处代码有误,请改正。from random import shuffledef 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+=kreturn ydef fs(m, n):cnt=[0]*26for i in range(len(m)) :ch=ord(m[i])②________for i in range(len(n)) :ch=ord(n[i])cnt[ch-ord(″a″)]-=1return cntfile=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=0while jif c[j]!=0: print(sl,″和″,s2,″不是字母异位词″) breakj+=1else:#在循环正常结束后执行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-113.(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)不能 展开更多...... 收起↑ 资源预览