高效作业8 第8课 字符串2——字符串应用-【精彩三年】2024-2025学年高中信息技术选择性必修1课程探究与巩固Word教参(浙教版2019)
2025-08-08
|
17页
|
37人阅读
|
1人下载
资源信息
| 学段 | 高中 |
| 学科 | 信息技术 |
| 教材版本 | 高中信息技术浙教版选修1 数据与数据结构 |
| 年级 | 高二 |
| 章节 | 3.1 字符串 |
| 类型 | 作业-同步练 |
| 知识点 | 字符串的概念与特性,字符串的基本操作 |
| 使用场景 | 同步教学-新授课 |
| 学年 | 2024-2025 |
| 地区(省份) | 全国 |
| 地区(市) | - |
| 地区(区县) | - |
| 文件格式 | DOCX |
| 文件大小 | 3.12 MB |
| 发布时间 | 2025-08-08 |
| 更新时间 | 2025-08-08 |
| 作者 | 浙江良品图书有限公司 |
| 品牌系列 | 精彩三年·高中同步课程探究与巩固 |
| 审核时间 | 2025-07-11 |
| 下载链接 | https://m.zxxk.com/soft/52989638.html |
| 价格 | 3.00储值(1储值=1元) |
| 来源 | 学科网 |
|---|
内容正文:
高效作业8[第8课 字符串2——字符串应用](见学生用书P196)
【A级 新教材落实与巩固】
1.小王编写了一个“查找最长区间”的 Python 程序,功能如下:依次输入各个区间的起点和终点(数据均为整数,都用逗号分隔并以逗号结尾),程序运行之后显示最长的区间。例如,三个区间为(1,6),(10,23),(21,29),输入格式和程序运行界面如图所示。
(1)实现上述功能的Python程序如下,请在横线处填入合适的代码。
s=input()
i=0;maxn=0;r=0
k=0;temp=0;l=0
while i<len(s):
①__ch=s[i]__
if ch>=”0”and ch<=”9”:
temp=temp*10+int(ch)
else:
k=k+1
if k%2==1:
l=temp
else:
r=temp
if maxn < r-l+1:
②__maxn=r-l+1__
ans=r
temp=0
③__i=i+1____
print(”最长的区间是”+str(ans-maxn+1)+”到”+str(ans))
(2)若输入内容的结束符缺失(即输入内容为 1,6,10,23,21,29),则执行该程序后,变量 r 的值为__23__。
【解析】 (1)①从前往后遍历字符串s,提取第i个字符放在ch中,故填入ch=s[i]。②统计长度,结尾减去开头,r是结尾处,所以要加1。③temp用来存储当前提取出的连续数据,k用来统计提取出的连续数据的个数,l表示当前区间的左端点值,r代表当前区间的右端点值,maxn表示最长区间的长度,ans表示最长区间的右端点值,最后循环变量i变化,提取下一个字符,循环重复上述过程,故填入i=i+1。
(2)数字29后面没有“,”,当遍历到最后一个字符时,执行第2个else下面的表达式,temp=29,没有给当前区间的右端点赋值,此时r是上一个区间的右端点值,故r=23。
2. 某Python 程序的功能如下:输入由大小写字母组成的字符串s,将s中的字符按照大小写重新组合,大写字母在左,小写字母在右,且同类大小写字母间保持原相对顺序,输出一个新的字符串res,并计算大小写字母个数相差的绝对值。如图所示:
请输入字符串: bcdkAABJk
转换后:AABJbcdkk
大小写字母个数相差1个
(1)如果输入“abcAABBab”,则转换后新的字符串为__AABBabcab__。
(2)某同学尝试了两种思路,分别处理大写字母和小写字母,请在横线处填入合适的代码。
s=input(”请输入字符串: ”)
idx=[]
c=0
res=””
for ch in s:
if ”A”<=ch<=”Z”:
idx.append(c)
else:
res=①__res+ch__ #拼接小写字母
c+=1
delta=②__abs(len(res)-len(idx))__或__abs(len(idx)-len(res))__ #计算大小写字母个数相差的绝对值
for i in idx[-1::-1]: #拼接大写字母
res=③__s[i]+res__
print(”转换后: ”,res)
print(”大小写字母个数相差”,delta,”个”)
【解析】 (1)由题干描述结合题图可知,大写字母按照原相对顺序全部写在左边,小写字母全部写在右边。
(2)根据if条件和中文提示可知,要拼接字符和求长度差的绝对值。根据range的参数是从后往前可知,应该逆向向左拼接大写。
3.商店每个月的收入与支出数据用“收入-支出”格式表示, 依序给定一年12个月的“收入-支出”数据,中间用逗号隔开,如图所示。小李通过编写Python程序, 求“四个季度中季度净收入的最高值”。实现该功能的Python程序段如下, 请在横线处填入合适的代码。
请输入一年12个月的数据:
142-27,849-767,661-372,89-85,663-169,
908-244,764-255,241-128,900-488,458-
356,929-747,397-377
季度净收入的最高值是: 1162
#求出某个月的净收入
def mon(s):
i=0
while i<len(s) and s[i]!=”-”:
i+=1
①__income=int(s[:i])__或__income=int(s[0:i])__
expense=int(s[i+1:])
return income-expense
#求出某个季度的净收入
def quar(begin,end):
values=0
section=s[begin:end].split(”,”)
for i in range(len(section)):
②__values=values+mon(section[i])__
return values
s=input(”请输入一年12个月的数据: ”)
k=start=totmax=total=0
for i in range(len(s)):
if i==len(s)-1:
total=quar(start,len(s))
elif s[i]==”,”:
③__k+=1或k=k+1或其他等价答案__
if k%3==0:
④__total=quar(start,i)或其他等价答案__
start=i+1
if total>totmax:
totmax=total
print(”季度净收入的最高值是: ”,totmax)
【解析】 ①函数mon()用于统计每月的差值,传入的参数结构为“xxx-yyy”,例如“142-27”,利用循环找到“-”的位置,分别提取收入和支出,收入income=int(s[:i]),支出expense=int(s[i+1:])。
②函数quar()用于统计季度和,传入的参数begin和end为该季度的开始和结束位置,section=[“xxx-yyy”,“xxx-yyy”,“xxx-yyy”],在循环中调用函数mon(),并将返回值累加到values中。
③对月份进行计数,每遇到新月份,k+=1。
④k%3==0,则表示一个季度结束,调用函数quar()对季度进行统计。
4.2023·义乌中学检测某同学设计了一种加密算法,加密规则如下:
①若待加密字符中出现大写字母,就将其转换为它在字母表中的次序,如A→1,B→2,Y→25,Z→26;
②若待加密字符中连续出现小写字母,将这些小写字母反向添加进密码中,如出现“aeiou”将转换为“uoiea”;
③若待加密字符中出现数字,那么将数字0~9分别转换为字母A-J,如0→A,1→B,…,9→J;
④所有的密码之间用空格隔开。
例如:
输入要加密的字符串: ABCasdf12DZX
1 2 3 f d s a B C 4 26 24
实现该算法的部分Python程序代码如下,请回答下列问题。
s=input(”输入要加密的字符串: ”)
ans=''
temp=''
for ①__i__in__s__:
if 'a'<=i<='z':
temp=i+” ”+temp
elif 'A'<=i<='Z':
ans=ans+temp
t=str(ord(i)-65+1)
temp=''
elif '0'<=i<='9':
ans=ans+temp
t=②__chr(int(i)+65)__或__chr(int(i)+ord('A'))__
temp=''
③__ans=ans+temp(如果写了+””之类的也给分)____
print(ans)
(1)若待加密字符串为“ThuVMe50”,那么运行程序后输出的结果是__20__u__h__22__13__e__F__A__。
(2)程序中两处加框代码出现相同的错误,请改正:__ans=ans+t+''__。
(3)请在横线处填入合适的代码。
【解析】 (1)T h u V M e 5 0
20 u h 22 13 e F A
(2)需要空格隔开。
(3)①每个字符都要转换,结合“'a'<=i<='z'”可知,填i in s;②将逆序的小写字符加入结果;③将数字转换为对应的ASCII字符。
5.若从字符串中删除一些字符后,剩余的字符仍保持原顺序,则由剩余字符组成的新字符序列,我们称之为原字符串的子序列。例如:原始字符串“abcde”可以通过删除字符“b”“e”得到目标字符串“acd”,则“acd”为“abcde”的子序列;而原始字符串“abcde”通过删除字符无法得到目标字符串“ebd”,则“ebd”不是“abcde”的子序列。
根据对问题的分析,设计子序列的判断算法如下:
输入数据:原始字符串bg、目标字符串ed。
处理数据:
①从目标字符串ed 中依次读取字符;
②所取字符与原始字符串中仍未参与比较的字符逐位比较;
③若比较过程中存在相同字符,则转到①继续执行;若目标字符串已读取完毕,则转到⑤执行;
④若原始字符串中所有字符皆参与比较后,仍未出现相同字符,则终止判断,确定目标字符串不是原始字符串的子序列;
⑤上述过程执行后,目标字符串中所有字符都有序存在于原始字符串中,则确定目标字符串是原始字符串的子序列。
输出数据:子序列判断结果。
现根据该算法编写了如下Python 程序,运行界面如图所示。请结合算法和程序,回答下列问题。
def cgs(s,t):
①__pos=0__
for x in t:
while pos<len(s) and ②__s[pos]!=x__:
pos+=1
if pos==len(s):
return 1
pos+=1
return 0
jg=[”是”,”不是”]
bg=input(”请输入原始字符串: ”)
ed=input(”请输入目标字符串: ”)
print(ed,③__jg[cgs(bg,ed)]__,bg,”的子序列!”)
(1)请在横线处填入合适的代码。
(2)若输入原始字符串和目标字符串均为“abcde”,程序中函数调用返回的值为__0__。
【解析】 (1)①初始化位置变量pos,初始值pos=0。②若比较过程中不存在相同字符,从目标字符串ed 中依次读取字符,答案为s[pos]!=x。③利用函数cgs()返回值,得到列表jg的索引,答案为jg[cgs(bg,ed)]。
(2)“adcde”是“abcde”的子序列,故函数的返回值为0。
6.学校举办了“语文作文现场赛”,参赛同学的成绩存储在文本文件“gra.txt”中,如图1 所示(每一行记录一名同学的姓名和成绩,以“: ”分隔)。陈老师利用Python 程序对作文成绩进行处理,统计出各个分数等级的人数,并输出结果。程序运行界面如图2所示。
实现上述功能的Python 程序如下,请在横线处填入合适的代码。
def cla(x): #判断成绩等级
if x>=50:
return ”A”
elif x>=40:
return ”B”
elif x>=30:
return ”C”
else:
return ”D”
gra=[] #存储各个整数型成绩
num=[0]*4
f=open(”gra.txt”)
lines=f.readlines() #将对象f 的数据按行存入列表lines 中
f.close() #关闭文件
for line in lines: #循环读取列表lines 中的每个元素,并做相应处理
a=line.strip().split(”: ”) #去除结尾的换行符并以冒号为分割符进行分割返回列表
gra.append(①__int(a[1])__或int(a[-1])__ )
for i in range(len(gra)): #统计各等级人数
t=②__cla(gra[i])__
num[ord(t)-65]+=1
print(”成绩分布如下: ”)
for i in range(len(num)): #输出统计结果
print(chr(i+65)+”等级有”+③__str(num[i])__+”人”)
【解析】 ①由代码注释中可知,gra列表存储的为各个整数型成绩,所以使用append()函数添加的也是整数型成绩,列表a(正向索引)第0号索引的元素为同学姓名(字符串型)、第1号索引的元素为同学成绩(字符串型);a列表(负向索引)第-2号索引的元素为同学姓名(字符串型)、第-1号索引的元素为同学成绩(字符串型),要将成绩加入列表gra中,故应该为int(a[1])或int(a[-1])。②由“num[ord(t)-65]+=1”可得,t应该为当前学生成绩对应的等级,所以需要从gra列表中取出每名同学的整数型成绩作为参数传入自定义函数cla()中返回对应的等级,故应该为cla(gra[i])。③由题干可知同学成绩对应的等级有A、B、C、D共4种等级,num列表存储4种等级对应的人数并且为整型,程序最后数据的结果为字符串的“+”拼接,故应该为str(num[i])。
7.2023·绍兴鲁迅中学检测判断两个字符串是否相等:规定字符“?”为万能字符,即可与任意一个字符相等,在忽略字符串中空格以及不区分大小写的前提下,判断两个字符串是否相同。Python 程序运行界面如图所示。
(1)根据以上规则,字符串“?? ad?? dadwd”和字符串“a? ?? c?d?d? d”__相同__(选填:相同/不相同)。
(2)实现上述功能的Python 程序段如下,请在横线处填入合适的代码。
s1=input(”请输入一个字符串: ”)
s2=input(”请输入另一个字符串: ”)
s1=s1.upper()
s2=s2.upper()
s=””
for i in s1: #将字符串s1 中的空格去掉
if i!=” ”:
①__s=s+i__
s1=s
#同上,将字符串s2 中的空格去掉,代码略
i=0
if len(s1)!=len(s2):
print(”两个字符串不相同”)
else:
while i<len(s1):
c1=s1[i];c2=s2[i]
if c1==c2:
②__i=i+1__或i+=1__
else:
if ③__c1==”?”__or__c2==”?”__:
i+=1
else:
break
if i==len(s1):
print(”两个字符串相同”)
else:
print(”两个字符串不相同”)
【解析】 本题主要考查字符串的综合应用。(1)依照题意可知,“?”作为万能字符与任意字符相等,问题中的两个字符串依次比较是相同的。(2)填空①处实现去掉字符串s1的空格,所以遍历字符串时为非空的时候,进行字符的连接;填空②处当遍历至相同位置的字样相等时,则进行下一个位置的字符比较;填空③处当两个相同位置的字符不相等时,则考虑“?”作为万能字符的情况。
【B级 素养形成与评价】
8.某学校餐厅实行学生点餐系统, 每餐提供荤素搭配营养丰富的五个套餐(分别是A、B、C、D、E)让大家选择。小明根据所学知识,在班级同学均已完成点餐的情况下,对某一次的原始点餐数据(包含学号和套餐名称,部分界面如图1所示)进行了一系列处理,分析最受同学欢迎的套餐及其点餐率,便于向学校餐厅提出更好的建议。小明编写了以下程序, 运行结果的部分截图如图2所示。
图1 图2
请在横线处填入合适的代码。
#从文件”meal.txt”读取学生原始点餐数据,存储于列表text中
f=open(”meal.txt”,encoding=”utf——8”) #打开文件
text=[]
s=”ABCDE”
sno=””
line=f.readline( )
while line: #从文件中读取一行
for i in range(len(line)):
if line[i] in s:
①__meal=line[i]__
break
elif ”0”<=line[i]<=”9”:
sno=sno+line[i]
elif line[i]==””:
i+=1
text.append ([sno,meal])
sno=””
line=f.readline( )
f.close ()
#查找最受欢迎的套餐, 并统计其点餐率
maxn=0
num={”A”:0,”B”:0,”C”:0,”D”:0,”E”:0}
②__n=len(text)__
for i in range(n):
x=text[i][1]
③__num[x]+=1__
if num[x]>maxn:
maxn=num[x]
mealn=x
rate=round(maxn/n*100,2)
print(”最受欢迎的套餐是: ”,mealn)
print(”点餐率为: ”,rate,”%”)
【解析】 从“if num[x]>maxn:”语句可以看出num[x]代表某个套餐的数量。从下面的程序可以看出num是一个字典。在初值里放置各个套餐的数量为0。因此在num初值与if语句之间应该要对字典num记录的各个套餐数量进行统计, 统计的方式应该是出现一种套餐, 该套餐的数量要加1。从上下语句来看只有变量x才会可能是套餐的类别。因此③处填num[x]+=1。x代表套餐名,则text[i][1]代表套餐名。再向上查看text列表的产生过程。text列表的数据通过“text.append([sno,meal])”来产生,因此变量meal代表套餐名,而且meal变量值在前面没有产生过, 因此在①处必然填对变量meal的赋值语句。学生点餐的原始数据是从文件“meal.txt”读进来的,从语句“if line[i] in s”可以看出line[i]就是套餐名,因此①处填meal=line[i]。在统计各个套餐数量时, 必须全体参与。在“for i in range(n)”语句中, 变量n的值还没有初值,因此②处填n=len(text)。
9.2023·宁波中学检测某字符串加密程序的功能是:输入一个仅由小写英文字母组成的字符串,输出加密后的密文,加密规则如下:
①将明文字符串分成3个字符一组,对每组字符进行②③处理,剩余不足3个的字符不做处理。
②随机产生由26个不重复的小写英文字母组成的密文串,将明文中的每组字符分别替换为密文串中对应的字符,若密文串如表1所示,则明文“abcdefghijkl”替换为“jpgntkwmaery”。
小写字母
a
b
c
d
e
f
g
h
i
j
k
l
m
密文串
j
p
g
n
t
k
w
m
a
e
r
y
l
n
o
p
q
r
s
t
u
v
w
x
y
z
d
c
q
f
i
x
u
h
z
b
o
v
s
表1
③输入一串数字密钥(由1~9数字组成),密钥中每个数字依次为每组字符向右旋转次数,若密钥长度不足,则重复使用密钥,数字与对应旋转次数见表2。例如,数字密钥为“45”,则将第1组字符向右旋转1次,如“jpg”→“gjp”,将第2组字符向右旋转2次,如“ntk”→“knt”→“tkn”,第3组字符向右旋转1次,第4组字符向右旋转2次,依次类推。
数字
1
2
3
4
5
6
7
8
9
旋转次数
1
2
3
1
2
3
1
2
3
表2
④将每组处理后的字符串顺序连接,每组之间用“*”作为间隔符号,再将分组剩余的字符倒序连接,得到密文。
程序运行结果如下:
(1)若明文为“abc”,随机产生的密文串如图所示,数字密钥为“13”,则密文为__omg*__。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
def jmdic(): #随机生成由26个不重复的小写英文字母组成的密文串
#返回密文字符串,代码略
def rotate(array,k): #旋转
for i in range(k):
temp=array[len(array)-1]
for j in range(①__len(array)-2,-1,-1__ ):
array[j+1]=array[j]
array[0]=temp
ming=input(”请输入明文: ”)
mkey=input(”请输入一串数字密钥: ”)
n=len(ming);m=len(mkey)
a=[]
dic=jmdic()
print(”26个小写字母对应的密文串: ”,dic)
for i in range(n//3): #对每组字符进行处理
a.append([])#append():在列表末尾添加元素
for j in range(3):
a[i].append(dic[ ])
keynum=②__int(mkey[i%m])__
k=(keynum-1)%3+1
rotate(a[i],k)
ans=””
for i in range(n//3): #将每组字符进行连接
for j in range(3):
③__ans+=a[i][j]__
ans+=”*”*(i+1)
ans=ming[i*3+3:]+ans
print(”密文为: ”,ans)
(3)加框处代码有误,请改正:__ord(ming[i*3+j])-97__或__ord(ming[i*3+j])-ord(”a”)__。
【解析】 (1)先在密文串中找到密文字符mgo;再根据数字密钥为“13”可知,向右旋转1次,结果为omg;最后每组之间用“*”作为间隔符号,得到结果。
(2)①调用rotate(a[i],k),将每组进行k次选择;rotate()函数中,先将最后1个位置值记下,并将其余字符后移,最后把记下的值放置在第1个位置;循环从后往前进行移动;②根据组号获取相应的数字密文,并转换成整数型;③每3个一组将密文相连,i为组号,j为组内列号。
(3)明文3个1组,类似矩阵,i为行号,j为列号,求解下标。
10.某简易加密算法设计如下:
①在输入的字符串中从前往后提取英文字母,作为需要加密的明文(明文字符数必须为3 的倍数,不足3 位的字符舍去);
②将明文ASCII 码分成3 个字节(3 个英文字母)一组,一次连接后得到24 位二进制数;
③将得到的24 位二进制数字按每6 位一组分成4 组;
④将③中得到的4 组二进制数分别转换为4 个十进制数;
⑤将④中得到的十进制数之间用随机产生的大写字母连接起来,以大写字母结尾并输出。
按照上述规则,小张设计了一个加密Python 程序,程序运行结果如图所示。
(1)观察上面运行结果,字符串“one”的密文为:__27V54F57D37A__。
(2)请在横线处填入合适的代码。
from random import randint
s=input(”请输入字符串: ”)
a=[];n=0
for ch in s:
if ch>=”a” and ch<=”z” or ch>=”A” and ch<=”Z”:
a.append(ord(ch))
n=n+1
for i in range(n-1):
print(a[i],end=” ”)
print(a[n-1])
k=n//3
b=[0]*4*k
for i in range(k):
b[i*4+0]=a[i*3+0]//4
b[i*4+1]=①__a[i*3+0]%4*16+a[i*3+1]//16__
b[i*4+2]=a[i*3+1]%16*4+a[i*3+2]//64
b[i*4+3]=a[i*3+2]%64
mw=””
for i in range(4*k):
mw=mw+str(b[i])+②__chr(randint(65,90))__或__chr(randint(0,25)+65)__或__chr(randint(1,26)+64)__或其他等价答案__
# 利用randint() 函数随机产生大写字母
print(”加密后的密文为 :
”+mw)
【解析】 (1)one是第三组,故在密文中将数字4个分为一组, 找到对应的第三组,带上每个数之后的字母,故答案为27V54F57D37A。
(2)第一个for循环取出所有字母,转成ASCII 码后放入列表a 的末尾。第二个for 循环输出所有字母的ASCII码,并在最后一个后面换行。a列表中的元素3个一组,每个8位二进制,共k组。b列表存放不包含字母的结果,4个一组,每个6位二进制,共k组。第三个for 循环把每组a 中3 个8 位二进制转换成b 中4 个6 位二进制,i为组号,从0 开始,R=2。
X*Rn:把X表示成R进制后,后面添加n个零。
X//Rn:把X表示成R进制后,去掉低位n个。
X%Rn: 把X表示成R进制后,取出低位n个。
第四个for循环,添加随机字母,即随机生成65~90之间的整数。randint()函数生成两个参数之间的闭区间的整数,单独导入,直接写即可。
11.在单一密码表的基础上,维吉尼亚密码引入了一个26×26 的英文字母方阵密表(如下图所示),结合密钥,对信息加密。比如明文为“THEbookANDTHEpencil”,密钥为“BIG”,加密时,以明文为行,密钥为列,行和列交叉得到密文“UPKcwulITEBNFxkokom”。当密钥长度小于明文长度时,密钥循环使用。请编写一个Python程序,输入明文(仅有字母)和密钥,输出“维吉尼亚”密文。
(1)若输入明文“Python”,密钥“BIG”,则加密后的密文为__Qgziwt__。
(2)实现上述功能的程序段如下,请在横线处填入合适的代码。
mingwen=input(”请输入明文: ”)
miyao=input(”请输入密钥: ”)
miyao=miyao.upper() #将密钥的小写字母转为大写字母
print(”密文为: ”,end=””)
for i in range(len(mingwen)):
①__ch=mingwen[i]__
if ord(ch)<65 or ord(ch)>90 and ord(ch)<97 or ord(ch)>122:
print(ch,end=””)
continue # continue 跳出本次循环
flag=False
if ord(ch)>=97 and ord(ch)<=122: #将明文的小写字母转为大写字母
flag=True
ch=ch.upper()
②__p=i%len(miyao)__
ch2=miyao[p]
newp=③__(ord(ch)-65+ord(ch2)-65)%26+65__ #加密处理
if ④__flag__或__'a'<=mingwen[i]<='z'__:
newp=newp+32
print(chr(newp),end=””)
【解析】 (1)明文:P y t h o n
密钥:B I G B I G
密文:Q g z i w t
(2)①提取每个明文字符。②p 为密钥的位置,由于密钥长度小于明文,需要循环使用,利用明文位置转换为密钥位置。③根据维吉尼亚密码表转换密文,首先将明文和密钥都转换为英文字母表的位置,再将明文的位置后移密钥的位置数,移动时采用约瑟夫环形式。④将原来是小写的转换为小写,通过flag判断原来是否为小写。
12.甲、乙双方进行一场球类比赛,一局计分的规则是:赢1球得1分,用“1”表示;输一球失1分,用“0”表示。当任一方得分大于等于6分,且领先对方2分及以上,领先方赢一局。如甲选手一局比赛数据为“101110101”,表示甲选手得6分失3分,局比分6∶3。
小王用一个字符串记录了甲选手多局比赛数据,其中有一处错误,位于连续多个“0”的最后一个。为了找出错误,小王的处理方法如图1所示,对示例中疑似错误的位置6和20分别进行数据修改,并统计每局比分。他编写了Python程序,功能如下:输入记录数据,输出修改位置以及修改后每局的比分。程序运行界面如图2所示。
实现上述功能的Python程序如下,请回答下列问题:
rec=input("请输入记录数据: ")
s=list(rec)
①__n=len(rec)__或__n=len(s)__
k=m=i=0
pos=[]
while i<n:
k=i
while s[i]=="0"and i<n:
i=i+1
if ②__i-k>=2__:
m+=1
pos.append(i-1)
i=i+1
print("分析结果为: ")
print("修改位置以及修改后每局的比分: ")
for i in range(m):
f1=f2=0
k=pos[i]
s[k]="1"
sp=""+str(k)+""
for j in range(n):
if s[j]=="1":
f1+=1
else:
f2+=1
if :
sp=sp+"/"+str(f1)+":"+str(f2)
f1=f2=0
if f1+f2>0:
sp=sp+"/"+str(f1)+":"+str(f2)
print(sp)
③__s[k]="0"__
(1)请在横线处填入合适的代码。
(2)程序中加框处代码有误,请改正:__(f1>=6__or__f2>=6)__and__abs(f1-f2)>=2__。
【解析】 (1)本题的算法思想是首先找出01串中连续两个及以上“0”的位置(在列表中的索引位置),然后根据记录的位置,分别将记录的位置上的“0”修改为“1”,统计比分,记得统计好比分后,应将记录位置上的字符恢复为“0”。横线①处的功能是求01串中字符的个数,因此代码为n=len(rec),等价于n=len(s);②处代码的功能是判断连续“0”的个数是否为2个及以上,k为连续“0”字符串中的起始位置,i为连续“0”字符串后的第1个“1”的位置,则连续“0”的个数为i-k,因此②处代码为i-k>=2;③处代码的功能是恢复s[k]元素的值为“0”,因此代码为s[k]="0"。
(2)加框处的代码表示一局比赛结束的条件,根据题意可知当任一方得分大于等于6分,且领先对方2分及以上时一局比赛结束,因此加框处语句应修改为(f1>=6 or f2>=6) and abs(f1-f2)>=2。
13. 2023·金华一中检测在战场上发送的电报,通常需要加密成密文电报。现截获一份由小写字母和空格标点符号组成的敌军密文电报,需要对其进行解密。已知截获敌军的数据加密规则如下:
第一步,对数据进行栅栏密码加密,加密方法如下:
把明文按N 个字符为一栏进行拆分,剩余字符不足N 个也自成一栏,依次取每栏相同位置的字符生成N 组新的字符串,将这些字符串连在一起,得到栅栏密码加密的数据。
例如:明文M=“xinxijishu”,每栏个数N=3,进行栅栏密码加密:
明文
xinxijishu
每3个一栏
xin
xij
ish
u
取字符
每栏第1个字符
每栏第2 个字符
每栏第3个字符
xxiu
iis
njh
将3组字符串按顺序链接得到栅栏加密的密文: xxiuiisnjh
第二步,将第一步得到的数据进行维吉尼亚密码加密,加密方法如下:
对密文中的每一个小写字母,进行字母后移K 位操作,如K=3 时,a→d,b→e,…,x→a,y→b,z→c。
栅栏加密后的数据
x
x
i
u
i
i
s
n
j
h
每字母后移K=3之后
a
a
l
x
l
l
v
q
m
k
最终得到密文:aalxllvqmk
(1)已知栅栏密码的每栏个数N=2,密钥K=3,则明文”mevlqk”按照上述算法加密后的密文为__python__。
(2)小明根据上述加密算法,设计了一个解密程序,运行界面如下:
由于解密时不知道加密时采用的N、K 等参数,小明设定为,当解密结果中出现2 个以上常见英文单词(如“the”“is”……)时,就作为一个解密结果输出,虽然程序运行时可能有多个输出结果,但也不会太多,因此不再考虑继续优化参数,改为人工处理。
其Python程序如下,请在横线处填入合适的代码。
(3)程序中加框处代码有误,请改正:__dest=dest[:p]+tmps[i]+dest[p+1:]__或其他等价答案__。
Num=2
KeyWords=[”the”,”is”,”to”,”of”,”in”,”not”,”and”,”for”,”that”]
def check(s,n,words):
for word in words:
if (” ”+word+” ” in s) or (word+” ” in s) or (” ”+word in s):
n-=1
elif (” ”+word+”,” in s) or (” ”+word+”.” in s) or (word+”,” in s) or (word+”.” in s):
n-=1
elif (”.”+word+” ” in s) or (”,”+word+” ” in s) or (”.”+word in s) or (”,”+word in s):
n-=1
return ①__n<0__或其他等价答案__
def decypt(src):
result=[]
for N in range(1,10): #假定每栏最多9 个
for K in range(26):
tmps=””
for i in range(len(src)):
if ”a”<=src[i]<=”z”:
②__tmps=tmps+chr((ord(src[i])-97-K)%26+97)__或__tmps=tmps+chr((ord(src[i])-97+K)%26+97)__或其他等价答案__
else:
tmps=tmps+src[i]
dest=” ”*len(tmps)
p=0
for i in range(len(tmps)):
p=p+N
if p>=len(tmps):
③__p=p%N+1__或其他等价答案__
if check(dest,Num,KeyWords):
result.append(dest)
return result
f=open(”密文.txt”)
in_str=f.read()
f.close()
print(”待解密密文: ”,in_str)
out_str=[]
out_str=decypt(in_str)
print(f”解密候选结果有{len(out_str)}个,分别为: ”)
for i in range(len(out_str)):
print(f”[原文{i+1}]”,out_str[i])
【解析】 (1)栅栏密码的每栏个数N=2,则为mvqelk,小写字母在字母表循环后移k 个位置,答案为python。
(2)①由函数的调用位置可判断,返回的是逻辑值,由解密的附加条件可知,当常见英文单词出现2 个以上时,作为解密结果输出,确定为当n 小于0 时返回True,否则返回False 确定答案为n<0;②将字母循环前移k 个位置,固定写法,确定答案为tmps=tmps+chr((ord(src[i])-97-K)%26+97);③由栅栏加密规则,可以推导p 的取值规律为0369,147,258,可得出答案为p=p%N+1。
(3)将字符替换到p 位置上字符,由于字符串为不可变序列,不能使用dest[i]=tmps[p]语句,使用方法为切片取出p 位置前所有字符dest[:p],连接要替换字符tmps[i],然后连接p 以后所有字符dest[p+1:],确定答案为dest=dest[:p]+tmps[i]+dest[p+1:] 或其他等价答案。
学科网(北京)股份有限公司
$$
相关资源
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。