I am a teacher!

导航

习题解析之:字符串加密

【问题描述】

用户在一行中输入一个包括大小写字母和数字的字符串,编程实现字符串加密。加密规则如下:

将字符串中的大写字母用字母表中该字母后的第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个字母替代。

        如何得到字母在字母表中的序号,由字母在字母表中的序号又如何得到对应字母呢?

        Python 中有两个内置函数ord() 和 chr() 用于实现字符与 ASCII 码的转换。具体方法如下:
        ord() 函数: 将单个字符转换为其对应的ASCII码(整数)。
        例如,print(ord('A'))    # 输出:65
                   print(ord('a'))      # 输出:97
        chr() 函数:将整数(0-1,167,772,151)转换回对应的 ASCII 字符。
        例如,print(chr(65))    # 输出:A
                   print(chr(97))     # 输出:a
        由这两个函数可知,对于大写字母 c,其在 26 个大写字母表中的序号为 ord(c) - 65。序号 x 对应的字母为 chr(x + 65)。
        对于小写字母 c,其在 26 个小写字母表中的序号为 ord(c) - 97。序号 x 对应的字母为 chr(x + 97)。
        按这一思路,可以编写源程序如下:

     image

【编程思路2】

         本题字符串加密实质是将一个字母转换成另一个字母。可以构造两个字符串
            old_str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
            new_str = 'FGHIJKLMNOPQRSTUVWXYZABCDEdefghijklmnopqrstuvwxyzabc'
            这两个字符串的长度相同,为一一对应的关系。
        例如,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] 来替代即可。 
编写的源程序如下:

    image

【编程思路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

        构造一个 outtab 字符串 outtab = string.ascii_lowercase[3:] + string.ascii_lowercase[:3] + string.ascii_uppercase[5:] + string.ascii_uppercase[:5]。
        编写的源程序如下:

     image

posted on 2025-11-19 15:49  aTeacher  阅读(31)  评论(0)    收藏  举报