Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #QUESTÃO 21 - ATIVIDADE ASSÍNCRONA PARTE 2
- #Função responsável por exebir o menu com as instruções de uso
- def menu():
- return (
- '''
- ----------------------------------------------------------
- Conversor de bases numéricas - Questão 21
- Você deverá fornecer ao sistema:
- - O número a ser convertido
- - De qual base você deseja converter
- - Para qual base você deseja converter
- ** OBS: Todos os números devem ser inteiros ( menos os HEX) **
- ----------------------------------------------------------
- ''')
- #Função resposável por verificar se o número binário é válido
- #Retorna True ou False
- def validador_bin(checar_numero):
- #Variável criada para armazenar a lista contendo números fornecidos na input)
- check_list = [int(item) for item in (sorted(set(list(str(checar_numero)))))]
- #Loop for para varrer os números na check list e verificar se consistem em 0 e/ou 1 (bin)
- for numero in check_list:
- if numero not in [0,1]:
- print (f'número binário inválido')
- return False
- return True
- #Função para verificar se os caracteres do número fornecido na input são válidos
- #Retorna True ou False
- def validador_entrada(numero_entrada):
- caracteres_validos = '0123456789abcdef'
- for numero in numero_entrada:
- if numero not in caracteres_validos:
- return False
- return True
- #Validador geral faz uso dos outros validadores e valida todas as entrada
- #Retorna True ou False
- def validador_geral(numero_entrada,base_entrada,base_saida):
- #isdigit retorna True caso todos os caracteres forem dígitos
- #Dessa forma é avaliado se o que foi inserido na input de "base_entrada" e "base_saida" é válido
- if validador_entrada(numero_entrada) and base_entrada.isdigit() and base_saida.isdigit():
- #Caso seja estabelecida a Base 2 para número de entrada, é utilizado o validador de binários
- if int(base_entrada) == 2:
- if not validador_bin(numero_entrada):
- print ('ERRO: Número binário inválido. Este deve conter 0 ou 1')
- return False
- #Caso seja inserido um número contendo letras (avaliado por isalpha)
- #a base_entrada tem que obrigatoriamente ser 16
- if numero_entrada.isdigit() and numero_entrada.isalpha():
- if int(base_entrada) != 16:
- print ('ERRO: Números hexadecimais requerem que a base seja 16')
- return False
- #Não existe sistema de base 1, caso seja solicitado a conversão DE ou PARA Base-1
- #o programa informará que é impssivel realizar tal procedimento
- if int(base_entrada) == 1 or int(base_saida) == 1:
- print (f'Não é possível converter "da" ou "para" Base1')
- return False
- return True
- #Função criada para fazer a conversão dos números
- #retorna int, número convertido para a base solicitada
- def sistema_convesor(numero_entrada, base_entrada, base_saida):
- #lista criada para armazenar os valores do resto da divisão mais a frente
- remainder_list = []
- #Valor inicial para sum_base_10, todos as conversões serão realizadas na base 10..
- sum_base_10 = 0
- #Caso a base_entrada seja diferente de 10: converter para a base 10 antes do cálculo real..
- if base_entrada != 10:
- #O número de entrada deve ser invertido por conta da fução enumerate utulizada mais a frente
- #para determinar o índice de cada número. Esta função faz a cotação da esquerda para direita.
- numero_entrada_invertido = numero_entrada[::-1]
- #Dicinário para estabeler o que cada letra em Hex equivale em números decimais
- hex_dicionario = {'a' : 10 , 'b' : 11 , 'c' : 12 , 'd' : 13 , 'e' : 14 , 'f' : 15}
- #Varredura do número de entrada invtertido, atribuindo seus determinados índices.
- for indice, numero in enumerate(numero_entrada_invertido):
- #Caso algum caractere do número na base-16 seja igual a uma das chaves,
- #será atribuindo o valor associado a chave.
- for key,value in hex_dicionario.items():
- if str(numero).lower() == key:
- numero = value
- #Cálculo de conversão de qualquer base para base-10
- sum_base_10 += (int(numero)*(int(base_entrada)**indice))
- #Nenhum cálculo necessário caso a base fornecida para o número seja 10
- elif base_entrada == 10:
- sum_base_10 = int(numero_entrada)
- #laço while que fará a conversão dos números na base-10 para a base solicidada em base_saida
- while sum_base_10 > 0:
- #Primeiro é feita a divisão que retorna o número inteiro
- dividido = sum_base_10 // int(base_saida)
- #Em seguida a divisão que retorna o resto e adicionada na lista remainder list
- remainder_list.append(str(sum_base_10 % int(base_saida)))
- #O valor da variável 'dividido' é atribuído a 'sum_base_10', até que em dado momento
- #a divisão será igual a 0 e o não terá mais resto, finalizando a lista remainder
- sum_base_10 = dividido
- return_number = ''
- #Caso a base de saída solicitada seja diferente de 16, os valores da remainder list
- #serão invertidos, obtendo assim a conversão.
- if base_saida != '16':
- for each_num in remainder_list[::-1]:
- return_number += each_num
- return (return_number)
- #Caso contrário será feita a atribuição das letras a valores >= 10, conforme
- #o dicionário definido no laço a seguir.
- else:
- hex_dicionario = {10 : 'a' , 11 : 'b' , 12 : 'c' , 13 : 'd' , 14 : 'e' , 15 : 'f'}
- #Laço for resposável por varrer os números e fazer a atribuição de valores conforme as keys.
- for indice, each_num in enumerate(remainder_list):
- for key, value in hex_dicionario.items():
- if each_num == str(key):
- remainder_list[indice] = value
- #Inversão da remainder list para voltar ao normal.
- for each_num in remainder_list[::-1]:
- return_number += each_num
- return (return_number)
- #Função responsável por obter e reproduzir os caracteres/valore.
- def executar_conversor():
- user_numero = ''
- user_entrada_base = ''
- user_base_saida = ''
- prosseguir = 's'
- while prosseguir.lower() == 's':
- invalid_input = False
- while invalid_input == False:
- user_numero = input('\nPor favor, digite o número que desejas converter: ')
- user_entrada_base = input('Por favor, digite DE qual base você deseja converter: ')
- user_base_saida = input('Por favor, digite PARA qual base você deseja converter: ')
- invalid_input = validador_geral(user_numero,user_entrada_base,user_base_saida)
- print (f'\nTentando converter o número {user_numero} da Base-{user_entrada_base} para a Base-{user_base_saida}: ')
- print (f'>> RESULTADO: {sistema_convesor(user_numero, user_entrada_base, user_base_saida)} <<')
- print (f'\nVocê deseja conveter outro número? Digite s/n: ')
- prosseguir = input('')
- print ('Saindo do conversor...')
- if __name__ == '__main__':
- print(menu())
- executar_conversor()
Advertisement
Add Comment
Please, Sign In to add comment