Я в значительной степени решил это, но почему-то первый оператор if и оператор else говорят true для любых заглавных буквенных входов. Поэтому, если значение 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
Ваш первый оператор 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.
Вы также должны узнать, как сделать ваш код более питоническим.
Прежде всего: списки 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,
Ваша проблема в том, что вам нужно использовать elif (см. http://docs.python.org/tutorial/controlflow.html).
Предложение else: выполняется, если буква не является строчной.
Кстати, вам не нужно делать "оригинал" списка. Строки в питонах ведут себя почти идентично спискам.
k = int (raw_input ( "Пожалуйста, введите значение для k:" )) # Номер переключателя original = raw_input ( "plaintext:" ) #Message пользователь хочет зашифровать original_as_array = list (original) ## Я превращаю вход в массив
для я в диапазоне (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,
Попробуйте следующее:
#!/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'
continue
в этом случае, когда elif
намного яснее. На самом деле, я не одобряю continue
в любом случае, когда этого можно избежать.
elif
, я просто хотел документировать другой способ сделать то же самое. Что касается continue
, я не имею ничего против.
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