Crie um código que pergunte ao usuário um número, em seguida se o número informado é binário ou decimal, então realize a conversão para a base oposta a que o número informado se encontra. O código deve trabalhar tanto com a forma inteira quanto com a forma fracionária dos números informados.

Passo 1

Beleza, o exercício pede um programinha que pergunte ao usuário um número e diga se ele é binário ou decimal. Aí a ideia é converter esse número para a outra base (binária↔decimal), funcionando tanto se tiver só parte inteira como se tiver parte fracionária.
Conteúdo: sistemas de numeração, conversão de bases, manipulação de strings e laços em programação. Vamos precisar de:
  • Separar parte inteira e fracionária (string split).
  • Converter de decimal pra binário (divisões sucessivas e multiplicações pra parte fracionária).
  • Converter de binário pra decimal (soma das potências de 2).

Passo 2

Primeiro a gente lê do usuário:
  1. O número como string (pra manter o ponto ‘.’, se existir).
  2. A base atual (1 para binário, 2 para decimal, por exemplo).
    Depois a gente faz num_str.split('.') pra pegar uma lista com [parte_inteira, parte_fracionaria]. Se não tiver ponto, a lista fica com só a parte inteira e a fracionária a gente assume como "0".

Passo 3

Agora, se o usuário disse que o número é binário, precisamos transformar cada parte em decimal:
  • Para a parte inteira usamos Nint = sumi=0^k-1 di times 2^,k-1-i,
    onde os dígitos Nfrac = sumi=1^m di times 2^-i, são 0 ou 1 e é o comprimento da string.
    - Para a parte fracionária:
    com sendo o tamanho da parte após o ponto.
    Somando , temos o valor decimal.

Passo 4

Se o usuário disse que o número é decimal, viramos o processo ao contrário:
  • Parte inteira pra binário: repetimos divisões por 2 e guardamos os restos, depois lemos de trás pra frente.
  • Parte fracionária pra binário: multiplicamos por 2 várias vezes; a parte inteira de cada produto é o próximo bit, e continuamos com o resto fracionário.
    A gente pode controlar quantas casas binárias de fração gerar (por exemplo, até 10 ou parar quando a fração virar zero).

Passo 5

Juntamos tudo num código em Python, deixando cada etapa comentada e com funções claras para converter cada parte. No final, imprimimos o resultado na base oposta.

Resposta

def bin_int_to_dec(s):
    # s: '1011' -> 11
    valor = 0
    k = len(s)
    for i, dig in enumerate(s):
        valor += int(dig) * 2**(k-1-i)
    return valor

def bin_frac_to_dec(s):
    # s: '101' -> 1/2 + 0/4 + 1/8 = 0.625
    valor = 0.0
    for i, dig in enumerate(s, start=1):
        valor += int(dig) * 2**(-i)
    return valor

def dec_int_to_bin(n):
    # n: 13 -> '1101'
    if n == 0:
        return '0'
    bits = []
    while n > 0:
        bits.append(str(n % 2))
        n //= 2
    return ''.join(reversed(bits))

def dec_frac_to_bin(f, casas=10):
    # f: 0.625 -> '101'
    bits = []
    count = 0
    while f > 0 and count < casas:
        f *= 2
        bit = int(f)
        bits.append(str(bit))
        f -= bit
        count += 1
    return ''.join(bits) or '0'

def converter(num_str, base):
    partes = num_str.split('.')
    inte = partes[0]
    frac = partes[1] if len(partes) > 1 else '0'

    if base == 1:  # binário -> decimal
        dec_int = bin_int_to_dec(inte)
        dec_frac = bin_frac_to_dec(frac)
        return str(dec_int + dec_frac)
    else:  # base == 2, decimal -> binário
        dec_int = int(inte)
        dec_frac = float('0.' + frac) if frac != '0' else 0.0
        bin_int = dec_int_to_bin(dec_int)
        bin_frac = dec_frac_to_bin(dec_frac)
        return bin_int + '.' + bin_frac

# Programa principal
num_str = input("Digite um número (use '.' para a parte fracionária): ")
base = int(input("É binário [1] ou decimal [2]? "))
resultado = converter(num_str, base)
print("Resultado na outra base:", resultado)

Exercícios relacionados