我几乎已经解决了这个问题,但由于某种原因,第一个If语句和else语句都对任何大写字母输入都是正确的。因此,如果ASCII值位于65和90之间,则if语句声明为true并打印出该值,但else语句也声明为true并打印出一个语句。如果我把'continue'放在第一个if语句的底部,这个程序可以完美地运行。但是我不知道它为什么这样工作。能否帮助我纠正我的逻辑缺陷,我不明白为什么会这样做。这是我的代码和输出:
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
答案 0 :(得分: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,
否则(对于大写字母)第一个条件解析为true,第二个条件解析为false,并且因为语句解析为false,所以执行else语句。
答案 1 :(得分: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,
答案 2 :(得分:1)
您的问题是您需要使用elif(请参阅http://docs.python.org/tutorial/controlflow.html)。
如果字母不是小写,则运行else:子句。
顺便说一句,您不需要将“原始”列表。蟒蛇中的字符串与列表的行为非常相似。
k = int(raw_input(“请为k输入一个值:”))#Shifter number original = raw_input(“plaintext:”)#Message用户想要加密 original_as_array = list(original)##我正在将输入转换为数组
表示范围内的i(0,len(原始)):##现在分隔每个字符以添加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,
答案 3 :(得分: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'
答案 4 :(得分:-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