习题解析之:字符串加密
【问题描述】
用户在一行中输入一个包括大小写字母和数字的字符串,编程实现字符串加密。加密规则如下:
将字符串中的大写字母用字母表中该字母后的第5个字母替代
将字符串中的小写字母用字母表中该字母后的第3个字母替代
字符串中的其他字符原样输出
输入格式
输入一个至少包含一个字母的字符串
输出格式
输出加密后的字符串
示例
输入:
Life is short, you need Python!
输出:
Qlih lv vkruw, brx qhhg Ubwkrq!
【编程思路1】
将题目给出的加密规则抽象为表达式。
对于大写字母而言,若大写字母 c 在26 个大写字母表中的序号为 x(0 <= x < 26),则其替代的大写字母在字母表中的序号应为 (x + 5) % 26, 即大写字母用字母表中该字母后的第5个字母替代。
对于小写字母而言,若小写字母 c 在26 个小写字母表中的序号为 x(0 <= x < 26),则其替代的小写字母在字母表中的序号应为 (x + 3) % 26, 即小写字母用字母表中该字母后的第3个字母替代。
如何得到字母在字母表中的序号,由字母在字母表中的序号又如何得到对应字母呢?

【编程思路2】
本题字符串加密实质是将一个字母转换成另一个字母。可以构造两个字符串
例如,oid_str[0] 为大写字母 A,按加密规则,它应该用大写字母 F 来替代,new_str[0]正好是字母 F。
oid_str[25] 为大写字母 Z,按加密规则,它应该用大写字母 E 来替代,new_str[25]正好是字母 E。
为此,对于需要转换的字符 c ,可以通过调用 old_str.index(c) 函数来得到字符 c 在 old_str 字符串中的索引号 ind,直接用 new_str[ind] 来替代即可。
编写的源程序如下:

【编程思路3】
利用Python 提供的字符串处理函数 maketrans() 和 translate() 直接完成加密转换。
首先导入string 库,使用 import string 语句。
在string 库中,字符串有几个常量。其中:
string.ascii_uppercase 表示所有26个大写字母;
string.ascii_lowercase 表示所有26个小写字母;
string.ascii_letters表示26个小写字母和26个大写字母。
例如,print(string.ascii_uppercase) # 输出结果为 ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase) #输出结果为 abcdefghijklmnopqrstuvwxyz
print(string.ascii_letters) #输出结果为 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
字符串处理函数 maketrans() 用于给 translate() 函数创建一个字符映射转换表。
调用方法为 :str.maketrans(intab,outtab[,delchars])
其中,参数 intab 表示需要转换的字符组成的字符串,outtab 表示转换的目标字符组成的字符串。两个字符串的长度必须相同,为一一对应的关系。
delchars 为可选参数,表示要删除的字符组成的字符串。
调用该函数后,返回一个字符映射转换表供 translate() 函数调用。
函数 translate() 实现转换。
调用方法为 str.translate(table, del="")
根据 maketrans 函数创建的 table表转换 str 的字符,要过滤掉的字符放到 del 参数中。
为此,根据题意,构造一个 intab 字符串 intab = string.ascii_lowercase + string.ascii_uppercase

浙公网安备 33010602011771号