Advertisement
LucasEloi

Conversor de bases numéricas em Python

Nov 17th, 2020
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.86 KB | None | 0 0
  1. def menu():
  2.     '''
  3.    Esta função contem o menu a ser exibido
  4.    Returns: string
  5.    '''
  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. numero = 0    
  19.  
  20. def validador_bin(checar_numero):
  21.     '''
  22.    Esta função verifica se a entrada consiste em 0 ou 1.
  23.    Retorna: Verdadeiro / Falso
  24.    '''
  25.     check_list = [int(item) for item in (sorted(set(list(str(checar_numero)))))]
  26.  
  27.     for numero in check_list:
  28.         print (f'checando {numero} - {type(numero)}')
  29.         if numero not in [0,1]:
  30.             print (f'número binário inválido')
  31.             return False
  32.     return True
  33.  
  34. def validador_entrada(numero_entrada):
  35.     '''
  36.    Esta função verifica se a entrada consiste em caracteres válidos.
  37.    Retorna: Verdadeiro / Falso
  38.    '''
  39.     caracteres_validos = '0123456789abcdef'
  40.     for numero in numero_entrada:
  41.         if numero not in caracteres_validos:
  42.             return False
  43.     return True
  44.  
  45. def validador_geral(numero_entrada,base_entrada,base_saida):
  46.     '''
  47.    Esta função faz uso dos outros validadores e valida todas as entradas
  48.    para então prosseguir com a conversão.
  49.    '''
  50.     if validador_entrada(numero_entrada) and base_entrada.isdigit() and base_saida.isdigit():
  51.  
  52.         if int(base_entrada) == 2:
  53.             if not validador_bin(numero_entrada):
  54.                 print ('ERRO: Número binário inválido. Este deve conter 0 ou 1')
  55.                 return False
  56.  
  57.         if numero_entrada.isdigit() and numero_entrada.isalpha():
  58.             if int(base_entrada) != 16:
  59.                 print ('ERRO: Números hexadecimais requerem que a base seja 16')
  60.                 return False
  61.  
  62.         if int(base_entrada) == 1 or int(base_saida) == 1:
  63.             print (f'Não é possível converter "da" ou "para" Base1')
  64.             return False
  65.         return True
  66.  
  67.  
  68.  
  69.  
  70. def sistema_convesor(numero_entrada, base_entrada, base_saida):
  71.     '''
  72.    Esta função calcula os números de uma base para outra
  73.    Retorna: int, numero convertido
  74.    '''
  75.  
  76.     #Lista para armazenar os números que serão produzidos no final
  77.     remainder_list = []
  78.  
  79.     #Valor inicial para a soma da base 10. Todos os cálculos passam pela base 10.
  80.     sum_base_10 = 0
  81.  
  82.     #validador_entrada
  83.     if base_saida == 2:
  84.         binario = bin(numero_entrada)
  85.         return (binario[2:])
  86.  
  87.     # Converter para a base 10 antes do cálculo real
  88.     elif base_entrada != 10:
  89.  
  90.         #Inverte a string para começar a calcular a partir do número menos significativo
  91.         numero_entrada_invertido = numero_entrada[::-1]
  92.  
  93.         #check if user typed in letter outside HEX range.
  94.         hex_dicionario = {'a' : 10 , 'b' : 11 , 'c' : 12 , 'd' : 13 , 'e' : 14 , 'f' : 15}
  95.  
  96.        
  97.         for indice, numero in enumerate(numero_entrada_invertido):
  98.             for key,value in hex_dicionario.items():
  99.                 if str(numero).lower() == key:
  100.                     numero = value
  101.  
  102.             sum_base_10 += (int(numero)*(int(base_entrada)**indice))
  103.             #print(indice)
  104.             #print(numero)
  105.             # print(sum_base_10)
  106.  
  107.     # Se o número já estiver na Base10, podemos iniciar a conversão
  108.     elif base_entrada == 10:
  109.         sum_base_10 = int(numero_entrada)
  110.  
  111.  
  112.     # Fazemos um loop até chegar a 0. Quando chegar a 0, temos nosso numero.
  113.     while sum_base_10 > 0:
  114.  
  115.         #Encontrar o número para passar mais adiante no loop
  116.         dividido = sum_base_10 // int(base_saida)
  117.  
  118.         #Encontrar o resto para manter no loop
  119.         remainder_list.append(str(sum_base_10 % int(base_saida)))
  120.  
  121.         # O novo value para enviar para a próxima iteração
  122.         sum_base_10 = dividido
  123.  
  124.  
  125.     #Consertar a lista e enviar um numero::
  126.     return_number = ''
  127.  
  128.     # Caso seja solicitado uma saída hexadecimal, precisamos converter qualquer número de 10 para cima.
  129.     if base_saida == 16:
  130.         hex_dicionario = {10 : 'a' , 11 : 'b' , 12 : 'c' , 13 : 'd' , 14 : 'e' , 15 : 'f'}
  131.  
  132.         #Percorrer a lista de resto e converter 10+ em letras.
  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.     #Retorna o numero:
  139.     else:
  140.         for each_num in remainder_list[::-1]:
  141.             return_number += each_num
  142.  
  143.         return (return_number)
  144.  
  145. def executar_conversor():
  146.     '''
  147.    Interação com o usuário e aquisição dos dados
  148.    '''
  149.     user_numero = ''
  150.     user_entrada_base = ''
  151.     user_base_saida = ''
  152.  
  153.     prosseguir = 's'
  154.  
  155.     while prosseguir.lower() == 's':
  156.         valid_input = False
  157.         while valid_input == False:
  158.             user_numero = input('\nPor favor, digite o número que desejas converter: ')
  159.             user_entrada_base = input('Por favor, digite DE qual base você deseja converter: ')
  160.             user_base_saida = input('Por favor, digite PARA qual base você deseja converter: ')
  161.  
  162.             valid_input = validador_geral(user_numero,user_entrada_base,user_base_saida)
  163.  
  164.         print (f'\nTentando converter o número {user_numero} da Base-{user_entrada_base} para a Base-{user_base_saida}: ')
  165.         print (f'>> RESULTADO: {sistema_convesor(user_numero, user_entrada_base, user_base_saida)} <<')
  166.  
  167.         print (f'\nVocê deseja conveter outro número? Digite s/n: ')
  168.         prosseguir = input('')
  169.  
  170.  
  171.     print (f'Saindo do conversor...')
  172.  
  173. if __name__ == '__main__':
  174.     print(menu())
  175.     #execute o conversor definitivo:
  176.     executar_conversor()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement