Converter Números Entre Bases em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos a converter números entre bases diferentes usando programação em C. O laboratório cobre os seguintes passos:

  1. Ler o número e a base alvo a partir da entrada do utilizador.
  2. Implementar o algoritmo de conversão usando divisão e restos para converter o número decimal para a base alvo.
  3. Imprimir o número convertido.

O laboratório fornece um guia passo a passo para desenvolver um programa de conversão de base em C, cobrindo os conceitos necessários de teoria dos números e matemática discreta.

Ler o Número e a Base Alvo

Neste passo, aprenderemos a ler um número e sua base alvo para conversão em programação C. Criaremos um programa simples que permite aos usuários inserir um número decimal e especificar a base para a qual desejam convertê-lo.

Primeiro, crie um novo arquivo C para nosso programa de conversão de base:

cd ~/project
nano base_converter.c

Agora, vamos escrever o código inicial para ler o número e a base alvo:

#include <stdio.h>

int main() {
    int number, base;

    // Solicitar ao usuário para inserir o número decimal
    printf("Digite um número decimal para converter: ");
    scanf("%d", &number);

    // Solicitar ao usuário para inserir a base alvo
    printf("Digite a base alvo (2-16): ");
    scanf("%d", &base);

    // Validar a entrada da base
    if (base < 2 || base > 16) {
        printf("Base inválida. Por favor, digite uma base entre 2 e 16.\n");
        return 1;
    }

    printf("Número digitado: %d\n", number);
    printf("Base alvo: %d\n", base);

    return 0;
}

Vamos compilar e executar o programa:

gcc base_converter.c -o base_converter
./base_converter

Exemplo de saída:

Digite um número decimal para converter: 42
Digite a base alvo (2-16): 2
Número digitado: 42
Base alvo: 2

Explicação do código:

  • Usamos scanf() para ler o número decimal e a base alvo da entrada do usuário.
  • Validamos a base para garantir que esteja entre 2 e 16 (suportando conversão de binário a hexadecimal).
  • O programa imprime o número e a base inseridos para confirmar a entrada.

Converter Usando Divisão e Restos

Neste passo, implementaremos o algoritmo central para converter um número decimal para outra base usando divisão e restos. Modificaremos nosso programa anterior para adicionar a lógica de conversão.

Abra o arquivo existente e atualize o código:

cd ~/project
nano base_converter.c

Substitua o código anterior pela seguinte implementação:

#include <stdio.h>
#include <string.h>

// Função para converter decimal para qualquer base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";

    // Lidar com o caso especial de 0
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Converter usando divisão e restos
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Inverter a string
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

int main() {
    int number, base;
    char result[33];  // Máximo de 32 bits + terminador nulo

    // Solicitar ao usuário para inserir o número decimal
    printf("Digite um número decimal para converter: ");
    scanf("%d", &number);

    // Solicitar ao usuário para inserir a base alvo
    printf("Digite a base alvo (2-16): ");
    scanf("%d", &base);

    // Validar a entrada da base
    if (base < 2 || base > 16) {
        printf("Base inválida. Por favor, digite uma base entre 2 e 16.\n");
        return 1;
    }

    // Converter e imprimir o resultado
    convertToBase(number, base, result);

    printf("Decimal %d na base %d é: %s\n", number, base, result);

    return 0;
}

Compile e execute o programa:

gcc base_converter.c -o base_converter
./base_converter

Exemplo de saída:

Digite um número decimal para converter: 42
Digite a base alvo (2-16): 2
Decimal 42 na base 2 é: 101010

Digite um número decimal para converter: 255
Digite a base alvo (2-16): 16
Decimal 255 na base 16 é: FF

Explicação do código:

  • A função convertToBase() implementa o algoritmo de conversão central.
  • Usa divisão e resto para extrair dígitos da direita para a esquerda.
  • Suporta bases de 2 a 16 usando um conjunto de dígitos pré-definido.
  • Lidar com o caso especial de 0.
  • Inverte a string de resultado para obter a ordem correta dos dígitos.
  • Usa um array de dígitos para mapear restos para caracteres de base correspondentes.

Imprimir o Número Convertido

Neste passo final, aprimoraremos nosso programa de conversão de base adicionando opções de saída e formatação mais abrangentes para exibir o número convertido.

Abra o arquivo existente e atualize o código:

cd ~/project
nano base_converter.c

Atualize o código com impressão e formatação aprimoradas:

#include <stdio.h>
#include <string.h>

// Função para converter decimal para qualquer base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";
    int original = number;  // Armazenar o número original para exibição

    // Lidar com o caso especial de 0
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Converter usando divisão e restos
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Inverter a string
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

// Função para imprimir informações detalhadas de conversão
void printConversionInfo(int decimal, int base, const char *converted) {
    printf("\n--- Detalhes da Conversão do Número ---\n");
    printf("Número Original (Decimal): %d\n", decimal);
    printf("Base Alvo: %d\n", base);
    printf("Número Convertido: %s\n", converted);

    // Representações adicionais da base
    printf("\nRepresentações em Bases:\n");
    printf("  Decimal:    %d\n", decimal);

    // Representação binária
    if (base != 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binário:     %s\n", binaryResult);
    }

    // Representação hexadecimal
    if (base != 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  Hexadecimal: %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // Máximo de 32 bits + terminador nulo

    // Solicitar ao usuário para inserir o número decimal
    printf("Digite um número decimal para converter: ");
    scanf("%d", &number);

    // Solicitar ao usuário para inserir a base alvo
    printf("Digite a base alvo (2-16): ");
    scanf("%d", &base);

    // Validar a entrada da base
    if (base < 2 || base > 16) {
        printf("Base inválida. Por favor, digite uma base entre 2 e 16.\n");
        return 1;
    }

    // Converter o número
    convertToBase(number, base, result);

    // Imprimir informações detalhadas de conversão
    printConversionInfo(number, base, result);

    return 0;
}

Compile e execute o programa:

gcc base_converter.c -o base_converter
./base_converter

Exemplo de saída:

Digite um número decimal para converter: 42
Digite a base alvo (2-16): 16

--- Detalhes da Conversão do Número ---
Número Original (Decimal): 42
Base Alvo: 16
Número Convertido: 2A

Representações em Bases:
  Decimal:    42
  Binário:     101010
  Hexadecimal: 2A

Explicação do código:

  • Função printConversionInfo() adicionada para fornecer saída detalhada da conversão.
  • Exibe o número decimal original, a base alvo e o resultado convertido.
  • Inclui representações adicionais da base (binária e hexadecimal).
  • Imprime condicionalmente representações alternativas de base para evitar redundância.
  • Fornece uma saída mais informativa e educativa.

Resumo

Neste laboratório, aprendemos como ler um número e sua base alvo para conversão em programação C. Criamos um programa simples que permite aos usuários inserir um número decimal e especificar a base para a qual desejam convertê-lo. Também implementamos o algoritmo central para converter um número decimal para outra base usando divisão e restos. Finalmente, aprendemos como imprimir o número convertido na base desejada.

Os pontos principais de aprendizado deste laboratório incluem a compreensão de como usar a função scanf() para ler a entrada do usuário, validar a entrada para garantir que a base alvo esteja dentro do intervalo válido e implementar a lógica de conversão de base usando divisão e restos. O programa demonstra uma aplicação prática desses conceitos na programação C.