Python: Cesar Cipher, если оператор и оператор else одновременно истинны? - PullRequest
1 голос
/ 24 апреля 2011

Я в значительной степени решил эту проблему, но по какой-то причине первый оператор If и оператор else оба имеют значение true для ввода любых заглавных букв. Таким образом, если значение ASCII находится между 65 и 90, оператор if объявляет true и печатает это значение, но тогда оператор else также объявляет true и выводит оператор. Если я поставлю «продолжить» внизу первого оператора 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

Ответы [ 5 ]

7 голосов
/ 24 апреля 2011

Ваш первый оператор 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.

4 голосов
/ 25 апреля 2011

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

Перво-наперво: списки 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,
1 голос
/ 24 апреля 2011

Ваша проблема в том, что вам нужно использовать elif (см. http://docs.python.org/tutorial/controlflow.html).

Предложение else: выполняется, если буква не в нижнем регистре.

Кстати, вы нене нужно создавать «оригинальный» список. Строки в питонах ведут себя почти одинаково со списками.


k = int (raw_input («Пожалуйста, введите значение для k:»)) # Число сдвигаoriginal = raw_input ("plaintext:") # Пользователь сообщения хочет зашифровать original_as_array = список (оригинал) ## Я превращаю вход в массив

для 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,
0 голосов
/ 13 марта 2012
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 голосов
/ 24 апреля 2011

Попробуйте это:

#!/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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...