2011-04-24 29 views
1

我几乎已经解决了这个问题,但由于某种原因,第一个If语句和else语句对于任何大写字母输入都是正确的。因此,如果ASCII值落在65和90之间,则if语句声明为true并打印出该值,但是else语句也声明为true并打印出语句。如果我在第一个if语句的底部加上'continue',这个程序就完美无缺。不过,我不知道为什么它像那样工作。你能帮我纠正我的逻辑缺陷,我不明白为什么这样做。这里是我的代码和输出:Python:凯撒密码,如果语句和其他语句同时为真?

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 

回答

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语句的语句被执行。

+0

啊...... :)辉煌非常感谢你! – yoshyosh 2011-04-24 19:05:26

0

试试这个:

#!/usr/bin/python 

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, 
     continue 

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

    print char, 

每一个成功的案例之后,你需要continue跳过其他案件。

补充说明:

>>> import string 
>>> transtab = string.maketrans(string.lowercase + string.uppercase,string.lowercase[k:] + string.lowercase[:k] + string.uppercase[k:] + string.uppercase[:k]) 
>>> "PLEASE HELP".translate(t) 
'CYRNFR URYC' 
+0

在这种情况下,我真的非常反对'继续',因为'elif'更清晰。事实上,我不赞成在任何情况下都可以避免“继续”。 – JasonFruit 2011-04-24 20:12:46

+0

@JasonFruit:因为所有其他的答案都是在做'elif',只是想记录另一种做同样事情的方式。就“继续”而言,我没有任何反对的意见。 – 2011-04-24 20:24:49

+0

没关系---这没有错,我没有降低它或什么,但我确实想要注册我的意见。 – JasonFruit 2011-04-24 21:30:48

1

你的问题是,你需要使用ELIF(见http://docs.python.org/tutorial/controlflow.html):

这如下也可以做。

如果字母不是小写,else:子句将运行。

顺便说一句,你不需要使“原始”的列表。蟒蛇中的字符串与列表的行为几乎完全相同。


K = INT(的raw_input( “对于k请输入一个值: ”))#Shifter数 原来的raw_input =(“ 明文”)#Message用户想要加密 original_as_array =表(原件)# #I正在转动输入到一个数组

对于i在范围(0,LEN(原始)):##现在每个分隔条件字符后添加K 炭= original_as_array [I] charint = ORD(炭)

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, 
+1

感谢smokey,关于输入已经是字符串的提示非常感谢! :) – yoshyosh 2011-04-24 19:06:27

4

还应该学习如何让代码更加pythonic。

第一件事: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, 
+0

真棒帖子,我真的很感激你花时间做到这一点!谢谢:) – yoshyosh 2011-04-24 20:37:25

-4
word=raw_input("ENTER YOUR MESSAGE IN CAPITAL LETTERS :") 

def cal(a): 
    if a=="A": 
     c="D" 
    elif a=="B": 
     c="E" 
    elif a=="C": 
     c="F" 
    elif a=="D": 
     c="G" 
    elif a=="E": 
     c="H" 
    elif a=="F": 
     c="I" 
    elif a=="G": 
     c="J" 
    elif a=="H": 
     c="K" 
    elif a=="I": 
     c="L" 
    elif a=="J": 
     c="M" 
    elif a=="K": 
     c="N" 
    elif a=="L": 
     c="O" 
    elif a=="M": 
     c="P" 
    elif a=="N": 
     c="Q" 
    elif a=="O": 
     c="R" 
    elif a=="P": 
     c="S" 
    elif a=="Q": 
     c="T" 
    elif a=="R": 
     c="U" 
    elif a=="S": 
     c="V" 
    elif a=="T": 
     c="W" 
    elif a=="U": 
     c="X" 
    elif a=="V": 
     c="Y" 
    elif a=="W": 
     c="Z" 
    elif a=="X": 
     c="A" 
    elif a=="Y": 
     c="B" 

    elif a=="Z": 
     c="C" 
    elif a==" ": 
     c=" " 
    else: 
     c=a 
    return c 

b=len(word) 
l="" 
a=0 
while a<b: 
    l=l+cal(word[a]) 
    a=a+1 

print l 
+0

简单得多的版本 – warunn 2012-03-13 02:06:57

+0

这是什么 – FreeMan 2017-12-07 11:37:51