Почему моя программа смещает s и c на неправильную величину, если я ввожу 5 в мою программу, но не с помощью каких-либо других букв или цифр? - PullRequest
0 голосов
/ 03 октября 2018

Эта программа предназначена для запроса предложения и числа, затем она сдвигает буквы вниз по алфавиту на все введенное число, а затем позволяет отменить его, сдвинув его на минус то, что вы вводите.По какой-то причине, когда вы вводите 5 в качестве сдвига, буква смещается на разные случайные буквы и не дает правильного слова, когда вы пытаетесь сдвинуться назад, и я понятия не имею, почему.

import sys
import time
letters = ["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"]
(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) = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                                            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26) 
def program():

    def encryption():

        def encryption1():
            global message
            global shift
            message = list ((input ("Please enter the sentence you would like to be %s\n>" % (EnDe1))).lower())
            print ("To %s your message please %s your private key number (from 1 - 10)" % (EnDe2, EnDe3))
            shift = int (input (">"))
            if EnDe == "b":
                shift = - (shift)
            if shift < 11 or shift > 0:
                for x in range(len(message)):        
                    if message[x] != " ":
                        if eval(message[x]) > 26 - shift:
                            message[x] = letters[eval(message[x]) + shift - 27]
                        else:
                            message[x] = letters[eval(message[x]) + shift - 1]
            else:
                shift = int (input ("only numbers from 1 to 10 are accepted, try again\n>"))
                encryption1()

        def choice():
            global EnDe
            global EnDe1
            global EnDe2
            global EnDe3
            EnDe = (input ("would you like to A)encrypt or B)decrypt\n>")).lower()
            if EnDe == "a":
                EnDe1 = "encrypted"
                EnDe2 = "encrypt"
                EnDe3 = "pick"
                encryption1()
            elif EnDe == "b":
                EnDe1 = "decrypted"
                EnDe2 = "decrypt"
                EnDe3 = "enter"
                encryption1()
            else:
                print ("please pick either 'A' or 'B' , ONLY!")
                time.sleep(2)
                choice()

        choice()              
        output = ''.join(message)
        print (output)
        retry = input ("would you like to Decrypt/Encrypt another message? (Y/N)\n>")
        retry = retry.lower()

        while retry != ("y" or "n"):
            retry = input ("please select either y or n\n>")
            retry = retry.lower()

        while retry == "y":
            program()
        else:
            sys.exit()
    encryption()     

1 Ответ

0 голосов
/ 03 октября 2018

Проблема в том, что вы определяете глобальную переменную x, а также локальную.Локальный скрывает глобальный, и поэтому результат eval("x") уже не тот, который вы ожидали получить.

Решение: используйте другую переменную для цикла for.

В вашем коде многое можно улучшить.Вы можете воспользоваться оператором по модулю и функцией ord, избегая необходимости использовать все эти 26 буквенных имен.

Вот как может выглядеть этот цикл for без всего этого:

if 0 < shift < 11:
    for i, ch in enumerate(message): 
        if ch != " ":
            message[i] = chr((ord(ch)-ord('a')+shift)%26+ord('a'))

Не связано: обратите внимание, что retry != ("y" or "n") не работает так.Вы должны сделать retry not in "yn"

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