第8课 字符串2——字符串应用-【精彩三年】2024-2025学年高中信息技术选择性必修1课程探究与巩固Word教参(浙教版2019)
2025-08-08
|
20页
|
23人阅读
|
1人下载
教辅
资源信息
| 学段 | 高中 |
| 学科 | 信息技术 |
| 教材版本 | 高中信息技术浙教版选修1 数据与数据结构 |
| 年级 | 高二 |
| 章节 | 3.1 字符串 |
| 类型 | 教案-讲义 |
| 知识点 | 字符串 |
| 使用场景 | 同步教学-新授课 |
| 学年 | 2024-2025 |
| 地区(省份) | 全国 |
| 地区(市) | - |
| 地区(区县) | - |
| 文件格式 | DOCX |
| 文件大小 | 1.81 MB |
| 发布时间 | 2025-08-08 |
| 更新时间 | 2025-08-08 |
| 作者 | 浙江良品图书有限公司 |
| 品牌系列 | 精彩三年·高中同步课程探究与巩固 |
| 审核时间 | 2025-07-11 |
| 下载链接 | https://m.zxxk.com/soft/52989618.html |
| 价格 | 4.00储值(1储值=1元) |
| 来源 | 学科网 |
|---|
内容正文:
第8课 字符串2——字符串应用(见学生用书P61)
——3.1 字符串,教材P64~73
1.掌握字符串的基本操作,并能编程实现。 2.通过案例分析,能够使用字符串思维解决实际问题。
1.字符串中子串的开始位置、结束位置、长度之间的转换
(1)i为开始位置、j为结束位置,p为长度,则三者之间的转换公式为:
(2)i为开始位置、j为结束位置的下一个位置,p为长度,则三者之间的转换公式为:
2.利用字符串实现加密与解密
将明文中的每个位置的字符用其他字符代替,通过换位来实现加密。例如:
明文ch
方向
代码
若key=3,则密文为
“A”
右移
chr((ord(ch)-65+key)%26+65)
“D”
“A”
左移
chr((ord(ch)-65-key+26)%26+65)
“X”
“a”
右移
chr((ord(ch)-97+key)%26+65)
“d”
“a”
左移
chr((ord(ch)-97-key+26)%26+65)
“x”
“0”
右移
str((int(ch)+key)%10)
“3”
“0”
左移
str((int(ch)-key+10)%10)
“7”
注意:若右移则为加密,若左移则为解密。
有如下Python程序段,它的功能是求两个字符串s1和s2的最长连续公共子串。若有多个答案,则输出首个答案;若无公共子串,则返回空串。请在横线处填入合适的代码。
s1=input("请输入字符串1: ")
s2=input("请输入字符串2: ")
max_len=0
ans=""
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
k=2
if i!=len(s1)-1 and j!=len(s2)-1:
while ① s1[i+k-1]==s1[j+k-1] :
k+=1
if k-1>max_len:
max_len=② k-1
ans=s1[i:i+max_len]
print(max_len,ans)
【解析】 题目中的程序求两个字符串s1和s2的最长连续公共子串,外层for循环遍历s1字符串位置,内层for循环遍历s2字符串位置,如果i,j位置的字符相等,则从这一对位置开始检测后面字符内容是否相同,通过while循环实现计算后面最长的相同字符内容,因此程序①处填写代码为s1[i+k-1]==s1[j+k-1],多轮循环计算相同字符长度,再比较出最长的公共子串和长度,程序②处代码为k-1。
变式12022·浙江7月学考查找与替换。从键盘上分别输入要查找和替换的字符串,对文本文件进行查找与替换,替换后保存到新的文本文件中。完成查找与替换功能的思路是:首先可从待检索文本文件“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) #写入文件
该程序段采用的算法是 B (单选,填字母: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 text
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 line[i:i+len(key)]==key :
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:
break 或 begin+=1
else:
line=line[0:pos]+new+line[pos+len(key):len(line)]
begin=pos+len(key)
return line
【解析】 (1)枚举算法指根据问题的本身性质,一一列举问题所有的情况并逐个进行判断,从中挑出符合条件的解。本题读取每一行,并一一查找是否有待替换的字符串,如有则进行替换并放入结果中,属于枚举算法。
(2)本处为程序输入,从文件中读取每一行后,将该行字符串添加到text列表中,因此最后返回的是text列表。
(3)该自定义函数功能为:查找line字符串是否有key字符串,如有则返回起点位置i,若没有则检查整个line字符串后返回-1。为查找key在字符串line中的位置,for循环从begin开始,每次循环从i下标位置截取len(key)长度的字符串与key字符串比较,若相等,则返回i下标,故答案:line[i:i+len(key)]==key。
(4)若查找函数的返回值pos为-1,则说明从这个当前位置出发查找整个line字符串并未找到key字符串,所以结束该自定义函数并返回line字符串。
变式2某停车场停车计费规则如下:
(1)停车时长不到半小时按2 元计费;
(2)停车半小时及以上则按每小时5 元计费。超过整小时的部分,不足半小时的时长则不计费,半小时及以上则按一小时计费。该停车场某天的停车记录存储在“parking.txt”文件中,文件内容如图所示,每一行共有3 项数据,用逗号分隔,第一项数据为进(出)场时间,第二项数据为车牌号,第三项数据为进出场状态(0 表示进场,1 表示出场)。
小明编写了Python 程序,从该文本文件中读取所有数据,计算该停车场一天的总收入及处于满位状态的总时长。请回答下列问题。
(1)“parking.txt”文件中的数据属于 A (单选,填字母:A.结构化数据/B.半结构化数据/C.非结构化数据)。
(2)实现上述功能的程序段如下,请在横线处填入合适的代码。
def trans(s):
return int(s[11:13])*60+int(s[14:16])
f=open(”parking.txt”,”r”)
line=f.readline()
dic={}
price,total=5,0
cnt,sumt=0,0
start=-1
p=300 #车场空位数量
while line!=””:
line=line.strip() #去除末尾换行符
a=line.split(”,”)
if a[2]==”0”:
dic[a[1]]=a[0]
cnt+=1
else:
① cnt-=1
m=trans(a[0])-trans(dic[a[1]])
if m<30:
fee=2
else:
② fee=int(m/60+0.5)*price 或fee=(m//60+m%60//30)*price或其他等价答案
total+=fee
if cnt==p:
if start==-1:
start=trans(a[0])
elif start>-1:
sumt=③ sumt+trans(a[0])-start
start=-1
line=f.readline()
f.close()
#若读取当天所有记录后,车场为满位状态时,则计算剩余满位时长,代码略
print(”该天停车费总收入为: ”, total)
print(”该天停车场满位总时长为: ”,sumt,”分钟”)
【解析】 (1)由二维表结构来进行逻辑表达和实现的数据是结构化数据。
(2)读取每一行数据,并转换为列表a,其中a[0]表示时间,a[1]表示车牌,a[2]表示进出,0表示进场,1表示出场,并记下停车场里的车辆数cnt;当a[2]==”0”时,记下车牌和进入时间;当a[2]==”1”,计算停留时间,并根据停车时间判断停车费;如果cnt==p,表示停车场已满,如果第1次出现,则利用start记下开始位置,如果不是第1次出现,则sumt记下累计时间。
小兰最近正在学习加密解析算法,两种简单的加密算法:第一种按顺序替换,例如把a~y 分别替换成b~z,把z 替换成a,这样可以把jinlan 替换成kjombo;第二种是打乱信息的顺序,例如位置号码 < 2 3 5 6 1 4> 的含义是把第2 个字符放在第1 位,而把第3 个字符放在第2 位,然后是第5、6、1、4 个字符放在第3、4、5、6 位。这样可以把kjombo 替换成jobokm。发现同时使用两种算法,加密效果更好。小兰决定采用Python 程序设计语言编程,加密过程规则如下:
1.原文只含小写字母;
2.替换顺序: a~y 分别替换成b~z,把z 替换成a;
3.加密方式(第二种加密方法)随机产生并记录(方便解密)。
实现上述功能的Python程序如下,请回答下列问题。
(1)如果原文为jlzz,加密密钥为4,2,3,1,则密文为 amak 。
(2)请在横线处填入合适的代码。
(3)程序中加框处代码有误,请改正: t=wz[j] 。
import random
def zf_change(x):
if x==”z”:
s=”a”
else:
① s=chr(ord(x)+1)
return s
yw=input(”请输入原文小写字母字符串: ”)
n=len(yw)
a=””;b=””;wz=[];cw=[];mw=[]
m=0
while m<n:
y=random.randint(0,n-1)
if y in wz:
continue
else:
wz.append(y)
m=m+1
for i in range(n): #原文字母转换成下一字母
② ch=zf_change(yw[i])
cw.append(ch)
for j in range(n): #转换后字母放到加密位置
mw.append(cw[t])
for i in range(n):
a+=” ”+str(wz[i]+1)
b+=mw[i]
print(”随机加密位置号码: ”,a)
print(”密文: ”,b)
【解析】 (1)按顺序替换例结果为kmaa;加密密钥为4,2,3,1,即将第4个位置的值放在第1个位置,将第2个位置的值放在第2个位置,依此类推。
(2)①zf_change()函数中,将字母后移一位,其中“z”变“a”已经分开转换了,只需考虑其他字母的后移操作,不需要考虑约瑟夫环结构了。
②的作用是将原文字母转换成下一字母,需要调用函数zf_change(),并传入参数,参数为需要转换的字母。
(3)利用密钥wz进行位置加密,利用j找到wz的值,再将第wz[j]个字符放在第j位上。
变式1某数字字符串(以下简称“明文”)的加密方法描述如下:
(1)密码由10 位字符组成,前8 位密码为明文字符对应的加密字符,后2 位为验证码;
(2)取明文的第1 位字符,若该字符第一次出现且该密文未被取出,则直接取其对应的加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该明文余下各位对应的加密字符(若取到的位置位于表中最后一个加密字符之后,则从表中的第一位置继续往后查找)。加密字符逆序连接。加密(验证码)字符对应表如下:
明文数值(十进制)
0
1
2
3
4
5
6
7
8
9
加密字符
K
n
G
j
L
t
W
b
0
a
(3)求出所有明文字符数值的和,将明文数值的和转换为二进制,取二进制前两位作为密码的后两位,验证码顺序连接。程序功能如下:
输入一个8 位数字明文:99902092
加密密文为:WtLjGnKa10
注释:其中取第1 个数值9 时,对应的加密字符为a 且a 未被取过,故取a;取第2 个数值9 时,9 位置a 已经取过,则循环取0 位置的K;第3 个数值9 时,9 位置a 和0 位置K 都取过,则往后取n;取第4 个数值0 时,对应的加密字符为K 且K 已被取过,下一个字符n 也被取过,则往后取G;取第5 个数值2 时,2 位置G 已经取过,则往后取j,以此类推。
请回答下列问题。
(1)若输入的明文为“20220909”,则加密后的密文为 WtanLjKG11 。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
def getchar(x):
code=”KnGjLtWbOa”
while True:
if x not in f:
char=code[x]
f[x]=1
break
else:
① x=(x+1)%10
return char
f={}
sq=””
mingwensum=0
mingwen=input(”请输入8 位数字明文: ”)
mingwenlen=len(mingwen)
if mingwenlen!=8:
print(”请重新输入明文: ”)
else:
for i in mingwen:
c=int(i)
② sq=getchar(c)+sq
mingwensum+=c
ss=”” #转二进制
k=0
while 2**k<=mingwensum:
k+=1
while k>0:
t=2**(k-1)
if mingwensum>=t:
ss=ss+”1”
③ mingwensum-=t 或mingwensum=mingwensum-t
else:
ss=ss+”0”
k=k-1
mw=sq+ss[:2]
print(”密文为: ”,mw)
【解析】 (1)①先进行的加密处理:
2 0 2 2 0 9 0 9
G K J L n a t W
逆序连接为:WtanLjKG
②将明文值相加结果为:24D
转换为二进制为:11000B
加密结果为:WtanLjKG11
(2)①getchar()函数获取密码,x not in f结果为True表示未被提取,则直接提取,并把标识f对应位置设为1,如果重复,则位置后移,采用约瑟夫环形式。②调用getchar()函数获取密码,并逆序连接。③将明文数值的和转换为二进制,取二进制前两位,当mingwensum>=t成立,相应二进制位为1,并将t值减去。
|随|堂|检|测|
1. 某APP为增加用户活跃度,采用“签到得积分换奖品”的形式来吸引用户。签到积分的规则与玩法如下:①第一天签到得1分,第二天签到得2分,第三天签到得3分,……第7天及7天以上签到得7分;一旦中途漏签,签到积分从1分开始重新计算;积分每年最后一天结束时清零。现在用“1”和“0”表示签到和未签到,如某用户下载APP后第一天到第九天的签到记录为“101111011”,则这9天共获得14个积分。②APP每年会给用户一次补签一天的机会,补签之后积分的连续性可以持续,例如上面的9天中如果补签第七天增加积分最多,补签后9天的签到记录将变为“101111111”,积分将达到29分。为了找出一年中最佳的补签日,设计如下程序:从文件中读取一年365天(2月以28天计)的签到记录并以字符串形式输出,然后统计出全年的积分,并分析出补签增加积分最多那天的日期及将这一天补签后可增加积分数,程序输出效果如下图所示:
请回答下列问题。
(1)若第1天到第18天的签到记录为“101110111001101111”,则补签第 6 天可增加积分最多。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
def tongji(s): #统计字符串中的积分
sum,pre=0,0
for i in range(len(s0)):
if s[i]==”1”:
if pre<7:
pre+=1
sum+=pre
else:
① pre=0
return sum
def check(ss):
month={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
max,index=0,0
for i in range(len(ss)):
if ss[i]==”0”:
head=i-1
tail=i+1
while head>=0 and ss[head]==”1”:
head-=1
while tail<=len(ss)-1 and ss[tail]==”1”:
tail+=1
s1=ss[head+1:tail]
② s2=ss[head+1:i]+”1”+ss[i+1:tail]
jfzj=tongji(s2)-tongji(s1)
if jfzj>max:
max=jfzj
index=i
k=1
day=index+1
while ③ day>month[k] :
day=day-month[k]
k+=1
result=”补签”+str(k)+”月”+str(day)+”日增加积分最多! 可增加”+str(max)+”分。 ”
return result
#将全年记录以字符串的形式保存到变量jl 中并输出,代码略
print(”年积分: ”,tongji(jl))
res=check(jl)
print(res)
【解析】 (1)可以看出,101110111001101111 改为101111111001101111,即修改第6 天的值,连续1 的天数最多,填6。
(2)①结合题意,当天数小于7 时,当日积分先加1 再累计;若遇到“0”则重新开始计分。else 分支处理遇“0”的情况,即pre 恢复初值,故填:pre=0。
②check 函数用于统计积分改变后的差值最大值。字符串操作中,我们可以模拟一组数据,跟踪几个指针的最终位置,确定指针位置后,接下来的代码就比较容易理解了。例如:当遇到字符串中的0 时,head 指针向前找0,tail 指针向后找0,如下图所示:
此时若将第i 位字符改为“1”, [head+1,tail-1]范围即为连续1,此时可以计算两种情况下积分的差值。s2 为将第i 位字符改为“1”后的字符串:故②空建立s2 字符串,填:s2=ss[head+1:i]+”1”+ss[i+1:tail]。
③check 函数最终返回的是一年中的某一天,接下来要计算出day 对应的年、月、日。方法是通过day=day-month[k]不断向后计算月份,直到无法减出完整月份,③空填:day>month[k]。
2.2023·丽水中学检测小明编写了一个字符串加密程序,功能如下:输入明文,显示加密后的密文,加密算法如下:
(1)若是大写字母,则进行字母替换:英文26个字母按键盘QWERT的顺序排列,从第一行到第三行连接起来再与字母表顺序进行替换,如Q用A来替换,Y用F替换,如下所示:
Q
W
E
R
T
Y
U
I
O
P
A
S
D
F
G
H
J
K
L
Z
X
C
V
B
N
M
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
(2)将经过字母替换后的明文每个字符的8位二进制ASCII码(不足8位的左端补0,补足8位)分成两段(左4位一段,右4位为另一段),如字符“A”的二进制ASCII值为01000001,分段后为0100,0001。
(3)将高位段(左边4位)转化为十六进制数(如0100转化为4)。
(4)对低位段(右边4位)执行0→1,1→0后转化为十六进制数(如0001→1110→14→E)。
(5)依次连接两位十六进制数,得到该字符的密文,如“Q”的密文为“4E”。
(6)将每个字符的密文按照明文的顺序依次连接。
程序运行结果如下图所示:
请回答下列问题。
(1)按照加密算法,字符“E”的密文是 4C 。
(2)实现上述功能的Python程序如下,请在横线处填入合适的代码。
def dtb(num): #十进制转8位二进制,高低4位分别处理
i=0;result=””
while i<8:
if i<4:
y=1-num%2
else:
y=num%2
num=num//2
result=str(y)+result
i+=1
return result
mw=input(”请输入待加密的字符: ”)
jm=””
mm={”Q”:”A”,”W”:”B”,”E”:”C”,”R”:”D”,”T”:”E”,”Y”:”F”,”U”:”G”,”I”:”H”,”O”:”I”,”P”:”J”,”A”:”K”,”S”:”L”,”D”:”M”,”F”:”N”,”G”:”O”,”H”:”P”,”J”:”Q”,”K”:”R”,”L”:”S”,”Z”:”T”,”X”:”U”,”C”:”V”,”V”:”W”,”B”:”X”,”N”:”Y”,”M”:”Z”}
for i in range(len(mw)):
if ”A”<=mw[i]<=”Z”:
① jm+=mm[mw[i]]
else:
jm+=mw[i]
jm1=””
for i in range(len(jm)):
② jm1+=dtb(ord(jm[i]))
zf=”0123456789ABCDEF”;result1=””;sum=0
for i in ③ range(0,len(jm1),4) 或range(0,len(jm1)-1,4) 或range(0,len(jm1)-2,4) 或range(0,len(jm1)-3,4) :
sum=int(jm1[i])*8+int(jm1[i+1])*4+int(jm1[i+2])*2+int(jm1[i+3])
result1+=zf[sum]
sum=0
print(”密文为: ”,result1)
【解析】 (1)将E替换为C,并将字符C转换为二进制为:01000011,将高段4为转换为十六进制为4;将低段4位反向为1100,再转换为十六进制为C,依次连接为加密结果。
(2)①在字典中查找替换字符。
②调用函数进行进制转换,将十进制转换为二进制,函数中将低段4位进行反向。
③以4位一组转换为十进制数,所以步长为4。
学科网(北京)股份有限公司
$$
相关资源
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。