Python: Cesar Cipher, если оператор и оператор else одновременно истинны?

1

Я в значительной степени решил это, но почему-то первый оператор 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
Теги:
encryption
if-statement

5 ответов

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.

  • 0
    ах ... гениально :) спасибо большое!
4

Вы также должны узнать, как сделать ваш код более питоническим.

Прежде всего: списки 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
    потрясающий пост, я очень ценю, что вы нашли время, чтобы сделать это! благодарю вас:)
1

Ваша проблема в том, что вам нужно использовать 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,
  • 1
    спасибо Смоки, отзыв о входных данных, уже являющихся строками, был высоко оценен! :)
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
    Я действительно, очень не одобряю continue в этом случае, когда elif намного яснее. На самом деле, я не одобряю continue в любом случае, когда этого можно избежать.
  • 0
    @JasonFruit: Поскольку все остальные ответы делали elif , я просто хотел документировать другой способ сделать то же самое. Что касается continue , я не имею ничего против.
Показать ещё 1 комментарий
-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
    гораздо более простая версия
  • 0
    Что, черт возьми это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню