首页 > 解决方案 > 使用 for 循环和 if/else 语句创建凯撒密码

问题描述

我必须为我的班级创建一个凯撒密码。规定是我不能导入任何东西,我必须使用 for 循环和 if/else 语句。我的代码已经接近完成,但目前卡住了。该程序当前运行没有抛出任何错误代码,但不输出所需的答案。我附上了下面的代码。目前有两个问题我正在寻求解决方案。首先,我写了一个 if/else 语句来环绕这些值,如果它们低于 65 或高于 96。这是所有必要的,因为输出应该全部大写。但是,这个声明似乎没有做任何事情。我目前不确定这是为什么。其次,代码在每个空格后添加一个字符到输出。我已经告诉代码基本上忽略空格,所以我不知道为什么会这样。例如:如果我的消息是“在黎明攻击虫族”,而我的编码密钥是“3”,则输出应该是“DWWDFN CHUJ DW GDZQ”,只需将所有内容大写并将它们移动 3。但是,我得到“DWWDFN =] HUJ =DW =GDZQ”。如您所见,它基本上是正确的。我似乎无法弄清楚不是的部分。感谢您提供的任何帮助。

enter def caesar_cipher():
text = str.upper(input("Your message? "))
shift = int(input("Encoding key? "))
for i in range(0, len(text)):
    a = text[i]
    o = a.find(" ")
    if o == 0:
        print(" ", end='')
    p = a.find("'")
    if p == 0:
        print("'", end='')
    s = a.find("!")
    if s == 0:
        print("!", end='')
    d = a.find('"')
    if d == 0:
        print('"', end='')
    new = ord(str(a)) + shift
    if int(new) >= 97:
        new2 = int(new) - 26
        new3 = chr(int(new2))
    elif int(new) <= 64:
        new2 = int(new) + 26
        new3 = chr(int(new2))
    else:
        new3 = chr(int(new))
    print(new3, end='')


caesar_cipher()

标签: python

解决方案


一些一般性评论:

  • 你在使用一个函数,这是一件好事,但是函数基本上就是整个程序,包括输入、处理和输出;通常,如果函数具有明确定义的函数,例如“计算字符串的凯撒密码”,则编写函数是一个好主意
  • 您将打印语句与函数的结果混淆了;尽管您可能需要打印输出,但在大多数情况下,首先计算结果然后打印它更有意义;让您的函数返回结果,然后打印该结果
  • 您正在通过检查in的位置a来检查是否等于,但您可以' '' 'aif a == ' '
  • 您正在检查a四个不同的值,但最终会执行四次相同的操作,即将该值添加到结果中;你可以很容易地结合这些
  • 即使a是这些值之一,你仍然去计算new,你需要一个else那里(这实际上回答了你的第二个问题)
  • 您创建了多个变量(和) new,即使您可以将这些语句中的大多数组合成一个,或者如果需要,也可以覆盖变量的值;因此,紧随其后可以很容易地紧随其后,或者只是new2new3new = 65 + 3new2 = chr(new)new = 65 + 3new = chr(new)new = chr(65 + 3)
  • ord()返回 anint并且shift是 an int,所以它们的总和也是 an int,无需继续铸造东西int()
  • 您在边缘情况下有一个小错误,但无论如何在测试工作代码时您会发现这是一件小事

将所有这些应用于您的代码:

def caesar_cipher(text, shift):
    result = ''
    for i in range(0, len(text)):
        a = text[i]
        if a in [' ', '\'', '!', '"']:
            result += a
        else:
            new = ord(str(a)) + shift
            if new > 90:
                new = chr(new - 26)
            elif new < 65:
                new = chr(new + 26)
            else:
                new = chr(new)
            result += new
    return result


def main():
    message = str.upper(input("Your message? "))
    key = int(input("Encoding key? "))
    print(caesar_cipher(message, key))


main()

或者,如果您想告诉老师您在 StackOverflow 上得到了答案,请提交:

def caesar_cipher(text, shift):
    return ''.join(
        ch if ch in ' \'!"' else chr((ord(ch) + shift - 65) % 26 + 65) for ch in text
    )

推荐阅读