2011-04-24 55 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