УКАЗАНО ДЛЯ КОДА: ошибка шифрования сообщения и вывода индекса из границ - PullRequest
0 голосов
/ 11 февраля 2019

Я пишу простую программу шифрования, и она работала до нескольких секунд.Он работает с простыми словами, такими как понедельник, но когда я делаю более длинные фразы, такие как «сегодня - понедельник», я получаю ошибку индекса за пределами границ.Мне было интересно, как я могу избежать этого и сделать так, чтобы он зашифровал все сообщение.

alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","w","y","z"]

print()
originalMessage = input("Enter a message: ") # user input for message to be encrypted
cipheredMessage = ''
shiftNumber = int(input("Enter a number to shift by (0-25): ")) # user input for value to shift by

# for loop to encrypt message using a ciphered alphabet

for letter in originalMessage:
    letter = letter.lower()
    if letter.isalpha():
        shift = alphabet.index(letter) + shiftNumber
        newPosition = alphabet[shift]
        cipheredMessage += newPosition
    elif ' ' or "!" or "." or "," or ";" or ":" or "-" in letter:
        cipheredMessage += letter
print("Encrypting message....")
print("\tEncrypted message: " + cipheredMessage)

# for loop to decrypt the message into its orginal form

decipheredMessage = ''
for letter in cipheredMessage:
    letter = letter.lower()
    if letter.isalpha(): # checks to make sure the message contains alphabets
        shift = alphabet.index(letter) - shiftNumber
        newPosition = alphabet[shift]
        decipheredMessage += newPosition
    elif ' ' or "!" or "." or "," or ";" or ":" or "-" in letter: # makes sure spaces and punctuation is not affected in the encryption
        decipheredMessage += letter
print("Decrypting message....")
print("\tDecrypted message: " + decipheredMessage)
print("\tOriginal message: " + originalMessage)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Проблема в том, что когда вы добавляете shift_number к буквенному индексу, он может вырасти больше 25. Тогда вы должны применить модуль по модулю.

Аналогичным образом, вычитая значение, вы можете перейти в отрицательное значение.В этом случае это безопасно, так как Python допускает отрицательную индексацию.Однако вы должны знать, что вы создаете там отрицательный индекс.

Я также исправил некоторые другие проблемы в вашем коде:

alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
            "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

if __name__ == '__main__':
    print()
    # you should use snake_case for local variables in Python
    original_message = input("Enter a message: ")  # user input for message to be encrypted
    ciphered_message = ''
    shift_number = int(input("Enter a number to shift by (0-25): ")) # user input for value to shift by

    # for loop to encrypt message using a ciphered alphabet

    for letter in original_message.lower():  # call lower() once for the whole string
        if letter.isalpha():
            shift = alphabet.index(letter) + shift_number
            # Add modulo to keep shift in 0..25 range
            shift = shift % len(alphabet)
            new_letter = alphabet[shift]
            ciphered_message += new_letter
        elif letter in ' !.,;:-':  # the condition was incorrect
            ciphered_message += letter
    print("Encrypting message....")
    print("\tEncrypted message: " + ciphered_message)

    # for loop to decrypt the message into its orginal form

    deciphered_message = ''
    for letter in ciphered_message.lower():
        if letter.isalpha():  # checks to make sure the message contains alphabets
            shift = alphabet.index(letter) - shift_number
            new_letter = alphabet[shift]
            deciphered_message += new_letter
        elif letter in ' !.,;:-':  # makes sure spaces and punctuation is not affected in the encryption
            deciphered_message += letter
    print("Decrypting message....")
    print("\tDecrypted message: " + deciphered_message)
    print("\tOriginal message: " + original_message)
0 голосов
/ 11 февраля 2019

Длина вашего сообщения не имеет значения.Проблема здесь:

if letter.isalpha():
    shift = alphabet.index(letter) + shiftNumber
    newPosition = alphabet[shift]

Если на входе shiftNumber установлено значение 25, что происходит?

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