LucasEloi

Conversor de Bases numéricas - Comentado e Corrigido

Nov 18th, 2020 (edited)
927
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.38 KB | None | 0 0
  1. #QUESTÃO 21 - ATIVIDADE ASSÍNCRONA PARTE 2
  2.  
  3.  
  4. #Função responsável por exebir o menu com as instruções de uso
  5. def menu():
  6.     return (
  7.     '''
  8. ----------------------------------------------------------
  9. Conversor de bases numéricas - Questão 21
  10. Você deverá fornecer ao sistema:
  11. - O número a ser convertido
  12. - De qual base você deseja converter
  13. - Para qual base você deseja converter
  14. ** OBS: Todos os números devem ser inteiros ( menos os HEX) **
  15. ----------------------------------------------------------
  16.    ''')  
  17.  
  18.     #Função resposável por verificar se o número binário é válido
  19.     #Retorna True ou False
  20. def validador_bin(checar_numero):
  21.    
  22.     #Variável criada para armazenar a lista contendo números fornecidos na input)
  23.     check_list = [int(item) for item in (sorted(set(list(str(checar_numero)))))]
  24.    
  25.     #Loop for para varrer os números na check list e verificar se consistem em 0 e/ou 1 (bin)
  26.     for numero in check_list:
  27.         if numero not in [0,1]:
  28.             print (f'número binário inválido')
  29.             return False
  30.     return True    
  31.  
  32.     #Função para verificar se os caracteres do número fornecido na input são válidos
  33.     #Retorna True ou False
  34. def validador_entrada(numero_entrada):
  35.     caracteres_validos = '0123456789abcdef'
  36.  
  37.     for numero in numero_entrada:
  38.         if numero not in caracteres_validos:
  39.             return False
  40.     return True
  41.  
  42.     #Validador geral faz uso dos outros validadores e valida todas as entrada
  43.     #Retorna True ou False
  44. def validador_geral(numero_entrada,base_entrada,base_saida):
  45.  
  46.     #isdigit retorna True caso todos os caracteres forem dígitos
  47.     #Dessa forma é avaliado se o que foi inserido na input de "base_entrada" e "base_saida" é válido
  48.     if validador_entrada(numero_entrada) and base_entrada.isdigit() and base_saida.isdigit():
  49.  
  50.         #Caso seja estabelecida a Base 2 para número de entrada, é utilizado o validador de binários
  51.         if int(base_entrada) == 2:
  52.             if not validador_bin(numero_entrada):
  53.                 print ('ERRO: Número binário inválido. Este deve conter 0 ou 1')
  54.                 return False
  55.  
  56.         #Caso seja inserido um número contendo letras (avaliado por isalpha)
  57.         #a base_entrada tem que obrigatoriamente ser 16
  58.         if numero_entrada.isdigit() and numero_entrada.isalpha():
  59.             if int(base_entrada) != 16:
  60.                 print ('ERRO: Números hexadecimais requerem que a base seja 16')
  61.                 return False
  62.  
  63.         #Não existe sistema de base 1, caso seja solicitado a conversão DE ou PARA Base-1
  64.         #o programa informará que é impssivel realizar tal procedimento
  65.         if int(base_entrada) == 1 or int(base_saida) == 1:
  66.             print (f'Não é possível converter "da" ou "para" Base1')
  67.             return False
  68.         return True
  69.  
  70.     #Função criada para fazer a conversão dos números
  71.     #retorna int, número convertido para a base solicitada
  72. def sistema_convesor(numero_entrada, base_entrada, base_saida):
  73.  
  74.    
  75.  
  76.     #lista criada para armazenar os valores do resto da divisão mais a frente
  77.     remainder_list = []
  78.  
  79.     #Valor inicial para sum_base_10, todos as conversões serão realizadas na base 10..
  80.     sum_base_10 = 0
  81.    
  82.     #Caso a base_entrada seja diferente de 10: converter para a base 10 antes do cálculo real..
  83.     if base_entrada != 10:
  84.         #O número de entrada deve ser invertido por conta da fução enumerate utulizada mais a frente
  85.         #para determinar o índice de cada número. Esta função faz a cotação da esquerda para direita.
  86.         numero_entrada_invertido = numero_entrada[::-1]
  87.  
  88.         #Dicinário para estabeler o que cada letra em Hex equivale em números decimais
  89.         hex_dicionario = {'a' : 10 , 'b' : 11 , 'c' : 12 , 'd' : 13 , 'e' : 14 , 'f' : 15}
  90.  
  91.         #Varredura do número de entrada invtertido, atribuindo seus determinados índices.  
  92.         for indice, numero in enumerate(numero_entrada_invertido):
  93.             #Caso algum caractere do número na base-16 seja igual a uma das chaves,
  94.             #será atribuindo o valor associado a chave.
  95.             for key,value in hex_dicionario.items():
  96.                 if str(numero).lower() == key:
  97.                     numero = value
  98.            
  99.             #Cálculo de conversão de qualquer base para base-10
  100.             sum_base_10 += (int(numero)*(int(base_entrada)**indice))
  101.  
  102.     #Nenhum cálculo necessário caso a base fornecida para o número seja 10
  103.     elif base_entrada == 10:
  104.         sum_base_10 = int(numero_entrada)
  105.  
  106.     #laço while que fará a conversão dos números na base-10 para a base solicidada em base_saida
  107.     while sum_base_10 > 0:
  108.        
  109.         #Primeiro é feita a divisão que retorna o número inteiro
  110.         dividido = sum_base_10 // int(base_saida)
  111.         #Em seguida a divisão que retorna o resto e adicionada na lista remainder list
  112.         remainder_list.append(str(sum_base_10 % int(base_saida)))
  113.         #O valor da variável 'dividido' é atribuído a 'sum_base_10', até que em dado momento
  114.         #a divisão será igual a 0 e o não terá mais resto, finalizando a lista remainder
  115.         sum_base_10 = dividido      
  116.  
  117.     return_number = ''
  118.  
  119.     #Caso a base de saída solicitada seja diferente de 16, os valores da remainder list
  120.     #serão invertidos, obtendo assim a conversão.  
  121.     if base_saida != '16':
  122.         for each_num in remainder_list[::-1]:
  123.             return_number += each_num
  124.            
  125.         return (return_number)
  126.  
  127.     #Caso contrário será feita a atribuição das letras a valores >= 10, conforme
  128.     #o dicionário definido no laço a seguir.
  129.     else:
  130.         hex_dicionario = {10 : 'a' , 11 : 'b' , 12 : 'c' , 13 : 'd' , 14 : 'e' , 15 : 'f'}
  131.  
  132.         #Laço for resposável por varrer os números e fazer a atribuição de valores conforme as keys.
  133.         for indice, each_num in enumerate(remainder_list):
  134.             for key, value in hex_dicionario.items():
  135.                 if each_num == str(key):
  136.                     remainder_list[indice] = value
  137.  
  138.         #Inversão da remainder list para voltar ao normal.
  139.         for each_num in remainder_list[::-1]:
  140.             return_number += each_num
  141.            
  142.         return (return_number)
  143.  
  144.     #Função responsável por obter e reproduzir os caracteres/valore.
  145. def executar_conversor():
  146.  
  147.     user_numero = ''
  148.     user_entrada_base = ''
  149.     user_base_saida = ''
  150.  
  151.     prosseguir = 's'
  152.  
  153.     while prosseguir.lower() == 's':
  154.         invalid_input = False
  155.         while invalid_input == False:
  156.  
  157.             user_numero = input('\nPor favor, digite o número que desejas converter: ')
  158.             user_entrada_base = input('Por favor, digite DE qual base você deseja converter: ')
  159.             user_base_saida = input('Por favor, digite PARA qual base você deseja converter: ')
  160.  
  161.             invalid_input = validador_geral(user_numero,user_entrada_base,user_base_saida)
  162.  
  163.         print (f'\nTentando converter o número {user_numero} da Base-{user_entrada_base} para a Base-{user_base_saida}: ')
  164.         print (f'>> RESULTADO: {sistema_convesor(user_numero, user_entrada_base, user_base_saida)} <<')
  165.  
  166.         print (f'\nVocê deseja conveter outro número? Digite s/n: ')
  167.         prosseguir = input('')
  168.  
  169.     print ('Saindo do conversor...')
  170.  
  171. if __name__ == '__main__':
  172.     print(menu())
  173.     executar_conversor()
Advertisement
Add Comment
Please, Sign In to add comment