Python, Cipher of Caesar, Strings

1

Hello, I would like to ask some tips to improve the code, especially in the 'geraMsgTraduzida' function, to make the code look better if it is possible.

def recebeModo():
    """
    Função que pergunta se o usuário quer criptografar ou
    decriptografar e garante que uma entrada válida foi recebida
    """

    while True:
        option = input("Deseja criptografar ou descriptografar? ")
        option = option.lower()
        if option == 'c' or option == 'criptografar' or option == 'descriptografar' or option == 'd':
            return option
        print("Entrada inválida. Escolha entre ('criptografar', 'c') ou ('descriptografar', 'd')")


def recebeChave():
    """
    Função que pede o valor da chave para o usuário
    e devolve a chave caso o valor desta esteja adequado
    """
    while True:
        chave = int(input("Digite o valor da chave: "))
        if 1 <= chave <= 26:
            break
        print("Entrada inválida")

    return chave

def geraMsgTraduzida(modo, mensagem, chave):
    """
    Traduz a mensagem do usuário de modo conveniente
    """
    cripto = ''

    if modo == 'c' or modo == 'criptografar':
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) + chave > ord('Z'):
                    cripto += chr((ord('A') + chave - (ord('Z')+1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)


            elif 'a' <= i <= 'z':
                if ord(i) + chave > ord('z'):
                    cripto += chr((ord('a') + chave - (ord('z')+1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            else:
                cripto += i

    elif modo == 'd' or modo == 'descriptografar':
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) - chave < ord('A'):
                    cripto += chr(ord('Z') - (chave - (ord(i)+1 - ord('A'))))

                else:
                    cripto += chr(ord(i) - chave)


            elif 'a' <= i <= 'z':
                if ord(i) - chave < ord('a'):
                    cripto += chr(ord('z') - (chave - (ord(i)+1 - ord('a'))))
                else:
                    cripto += chr(ord(i) - chave)
            else:
                cripto += i 

    return cripto

def main():
    """
    Função principal do programa
    """

    modo = recebeModo()
    chave = recebeChave()
    mensagem = input("Digite a mensagem: ")
    print(geraMsgTraduzida(modo, mensagem, chave))

main()
    
asked by anonymous 15.09.2018 / 03:57

2 answers

2
    option = input("Deseja criptografar ou descriptografar? ")
    option = option.lower()

For example, in this quote above, it is unnecessary to create a new variable for the function lower() , knowing that we can use option = input("Deseja criptografar ou descriptografar? ").lower() , that is: using lower() directly in the first variable.

I hope I have helped (even in a simple tip / feature)!

    
15.09.2018 / 04:20
1

I made some small suggestions in your code:

  • I changed the reps to not use white True (I did two possibilities, function receivesMode and receivesChave)
  • Modify your GeraMsgTraduzed method, creating two methods: decrypt and encrypt.

    def receivesMode ():         option = input ("Do you want to encrypt or decrypt?") .lower ()         while option! = 'c' and option! = 'encrypt' and option! = 'decrypt' and option! = 'd':             print ("ERROR: Invalid input. Choose between ('encrypt', 'c') or ('decrypt', 'd')")             option = input ("Do you want to encrypt or decrypt?") .lower () return option

    def recebeChave():
        chave = 1
        entrada_valida = False
        while not entrada_valida:
            chave = int(input("Digite o valor da chave: "))
            if 1 <= chave <= 26:
                entrada_valida = True
            else:
                print("ERRO: Entrada inválida para a chave (1 a 26)")
        return chave
    
    
    def encripta(modo, mensagem, chave):
        cripto = ''
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) + chave > ord('Z'):
                    cripto += chr((ord('A') + chave - (ord('Z') + 1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            elif 'a' <= i <= 'z':
                if ord(i) + chave > ord('z'):
                    cripto += chr((ord('a') + chave - (ord('z') + 1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            else:
                cripto += i
        return cripto
    
    
    def decripta(modo, mensagem, chave):
        cripto = ''
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) - chave < ord('A'):
                    cripto += chr(ord('Z') - (chave - (ord(i) + 1 - ord('A'))))
                else:
                    cripto += chr(ord(i) - chave)
            elif 'a' <= i <= 'z':
                if ord(i) - chave < ord('a'):
                    cripto += chr(ord('z') - (chave - (ord(i) + 1 - ord('a'))))
                else:
                    cripto += chr(ord(i) - chave)
            else:
                cripto += i
        return cripto
    
    
    def geraMsgTraduzida(modo, mensagem, chave):
        nova_mensagem = ''
        if modo == 'c' or modo == 'criptografar':
            nova_mensagem = encripta(modo, mensagem, chave)
        elif modo == 'd' or modo == 'descriptografar':
            nova_mensagem = decripta(modo, mensagem, chave)
        return nova_mensagem
    
    
    def main():
        modo = recebeModo()
        chave = recebeChave()
        mensagem = input("Digite a mensagem: ")
        print(geraMsgTraduzida(modo, mensagem, chave))
    
    
    main()
    
20.12.2018 / 13:23