Python:凯撒密码,if语句和else语句同时为真?

1 投票
5 回答
1747 浏览
提问于 2025-04-16 16:20

我基本上已经解决了这个问题,但不知为什么,第一个“如果”语句和“否则”语句对于任何大写字母的输入都显示为真。也就是说,如果输入的字母的ASCII值在65到90之间,第一个“如果”语句就会返回真,并打印出这个值,但接着“否则”语句也会返回真,并打印出一条信息。如果我在第一个“如果”语句的底部加上“继续”,这个程序就能完美运行。然而,我不知道为什么会这样。你能帮我找出我逻辑上的错误吗?我不明白为什么会这样。以下是我的代码和输出:

k = int(raw_input("Please enter a value for k: ")) #Shifter number
original = raw_input("plaintext:  ") #Message user wants ciphered
original_as_array = list(original) ##I am turning the input into an array

for i in range(0,len(original)): ##Now seperating each character to add k
    char = original_as_array[i]
    charint = ord(char)

    if charint >= 65 and charint <=90:
        cipher_int = ((charint-65 + k) % 26)+65
        code_char = chr(cipher_int)
        print code_char,

    if charint >= 97 and charint <=122:
        cipher_int = ((charint-97 + k) % 26)+97
        code_char = chr(cipher_int)
        print code_char,


    else:
        print char,

只有大写字母的示例输出:

Please enter a value for k: 13
plaintext:  PLEASE HELP
C P Y L R E N A F S R E   U H R E Y L C P

5 个回答

1

你的问题是需要使用elif(可以参考这个链接:http://docs.python.org/tutorial/controlflow.html)。

else: 这个部分会在字母不是小写的时候执行。

顺便说一下,你不需要把“original”变成一个列表。在Python中,字符串的行为和列表几乎是一样的。


k = int(raw_input("请输入一个k的值: ")) # 移位数字

original = raw_input("明文: ") # 用户想要加密的信息

original_as_array = list(original) ##我把输入的内容变成一个数组

for i in range(0,len(original)): ##现在把每个字符分开以便加上k

char = original_as_array[i]

charint = ord(char)

if charint >= 65 and charint <=90:
    cipher_int = ((charint-65 + k) % 26)+65
    code_char = chr(cipher_int)
    print code_char,

elif charint >= 97 and charint <=122:
    cipher_int = ((charint-97 + k) % 26)+97
    code_char = chr(cipher_int)
    print code_char,


else:
    print char,
4

你还应该学会如何让你的代码更符合Python的风格。

首先要明确:Python中的列表不是数组,它们是列表。这两者是不同的。

你不需要从字符串创建一个列表。Python中的字符串是字符的序列,已经支持直接访问字符:

>>> 'hello'[4]
'o'

不过,你并不需要列表或者直接访问来获取字符串中的字符。你可以,也应该这样遍历:

for char in original:
    ...

另外,Python中的比较运算符可以并且应该连着用:

if 65 <= charint <= 90:
    ...

这里有重复的代码。不要重复自己:

def cipher(ch_int, offset, lowest):
    return chr((ch_int - lowest + offset) % 26 + lowest)

for char in original:
    charint = ord(char)
    if 65 <= charint <= 90:
        print cipher(charint, k, 65),
    elif 97 <= charint <= 122:
        print cipher(charint, k, 97),
    else:
        print char,
7

你的第一个if语句和else语句没有关系。你想要的是

if charint >= 65 and charint <=90:
        cipher_int = ((charint-65 + k) % 26)+65
        code_char = chr(cipher_int)
        print code_char,

elif charint >= 97 and charint <=122:
    cipher_int = ((charint-97 + k) % 26)+97
    code_char = chr(cipher_int)
    print code_char,


else:
    print char,

否则(对于大写字母),第一个条件为真,第二个条件为假,因为这个条件结果是假的,所以就会执行else语句。

撰写回答