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:
- Ler o número e a base alvo a partir da entrada do utilizador.
- Implementar o algoritmo de conversão usando divisão e restos para converter o número decimal para a base alvo.
- 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.



