Цезарь Шифрование, не может напечатать окончательное сообщение - PullRequest
0 голосов
/ 25 ноября 2018
def message():
    answer1 = input('Welcome to the Caesar Cipher! What do you want to encrypt?')
    key = input('Enter the key number that you want to encrypt with. (1 - 26)')


def getMessage():
    while leng <= lengthOfInput1-1:
        lengthList.append(chr(ord(answer1[len]) + key))
        len += 1
    print(lengthList)


key = 0
answer1 = ''
maxKeySize = 26
lengthOfInput1 = len(answer1)
leng = 0
lengthList = []
message()
getMessage()

Когда я запускаю этот код, я всегда получаю ответ как «[]».Я не знаю, что происходит, и подумал, что переменная lengthList является списком и будет добавлять буквы.Мне также нужна помощь в объединении отдельных букв в зашифрованное сообщение.Спасибо, Эрик

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

С минимальными изменениями в вашем исходном коде рабочий код составляет

def message():
    answer = input('Welcome to the Ceaser Cipher! \nWhat do you want to encrypt? ')
    key = input('Enter the key number that you want to encrypt with (1 - 26): ')
    return answer, int(key)


def getMessage(answer, key):
    lengthList = []
    leng = 0
    while leng < len(answer):
        lengthList.append(chr(ord(answer[leng]) + key))
        leng += 1
    print("".join(lengthList))


answer, key = message()
getMessage(answer, key)

Объяснение:

  1. Ваша message() функция заполненияanswer1 и key переменные с пользовательским вводом, но затем выбрасывают их , потому что это только локальные переменные - answer1 и key из определения этогофункции другие переменные.Поэтому я включил команду return, чтобы сохранить их (и переименовал answer1 в просто answer).

  2. Тип ключевой переменной в вашей функции message () - str (строка), но вам нужно Int.Таким образом, int(key) в операторе возврата.

  3. В основном коде я сохранил эти возвращаемые значения - команда answer, key = message().

  4. Ваша функция getMessage() нуждается в этих значениях, поэтому я добавил их в качестве параметров - def getMessage(answer, key):

  5. Я переместил команды

    lengthList = []
    leng = 0
    

    в определениефункция getMessage().

  6. Я изменяю вашу команду while leng <= lengthOfInput1-1: на while leng < len(answer): - примечание < вместо <=.

  7. В результате вы хотите напечатать строку , а не list отдельных символов - поэтому я изменил этот список на строку с помощью команды "".join(lengthList).(Пустая строка "" используется в качестве разделителя между отдельными присоединенными буквами, поэтому они будут объединены без пробелов и других символов.)

  8. И я удалил все лишние (бесполезные) выражения.

0 голосов
/ 25 ноября 2018

Это происходит потому, что вы не присвоили переменную answer1 во внешнем.В методе message() вы присвоили значения переменным, локальным для его области, а не переменной answer1 во внешней области, как вы хотели.

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

Аналогично, getMessage () не может получить доступ к переменным, которые находятся вне его области видимости.Таким образом, вы также должны передать их в качестве параметра!

Правильная форма этого кода будет выглядеть следующим образом:

def message():
    answer1 = input('Welcome to the Ceaser Cipher! What do you want to encrypt?')
    key = int(input('Enter the key number that you want to encrypt with. (1 - 26)'))
    return answer1, key


def getMessage(lengthOfInput1, lengthList, answer1, key, leng):
    while leng <= lengthOfInput1-1:
        lengthList.append(chr(ord(answer1[leng]) + key))
        leng += 1
    print(lengthList)


key = 0
answer1 = ''
answer1, key = message()
# Here I am returning both of the values from
# message method.

# LOCAL VARIABLES
maxKeySize = 26
lengthOfInput1 = len(answer1)
leng = 0
lengthList = []

getMessage(lengthOfInput1, lengthList, answer1, key, leng)
# Inorder to access the local variables, you will
# have to pass them to getMessage() method.

Этот фрагмент кода, приведенный выше, создаст список lengthListкоторый содержит буквы шифра.Тем не менее, он является локальным для getMessage().Вам нужно будет вернуть его в родительскую область, чтобы получить к нему доступ.

Более того, чтобы сделать преобразование списка в строку, вам нужно будет выполнить итерации в списке и продолжать добавлять пустую строку.Примерно так:

messageCoded = ""
for i in messageList:
    messageCoded += i

print(messageCoded)

Убедитесь, что вы правильно держите прицелы, и у вас все получится. Эта статья объясняет хорошо и хорошо.

...