Convertir números entre bases en C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos cómo convertir números entre diferentes bases utilizando el lenguaje de programación C. El laboratorio cubre los siguientes pasos:

  1. Leer el número y la base objetivo de la entrada del usuario.
  2. Implementar el algoritmo de conversión utilizando división y residuos para convertir el número decimal a la base objetivo.
  3. Imprimir el número convertido.

El laboratorio proporciona una guía paso a paso para desarrollar un programa de conversión de bases en C, cubriendo los conceptos necesarios de teoría de números y matemáticas discretas.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/strings("Strings") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435169{{"Convertir números entre bases en C"}} c/operators -.-> lab-435169{{"Convertir números entre bases en C"}} c/for_loop -.-> lab-435169{{"Convertir números entre bases en C"}} c/strings -.-> lab-435169{{"Convertir números entre bases en C"}} c/math_functions -.-> lab-435169{{"Convertir números entre bases en C"}} c/user_input -.-> lab-435169{{"Convertir números entre bases en C"}} c/output -.-> lab-435169{{"Convertir números entre bases en C"}} end

Leer el Número y la Base Objetivo

En este paso, aprenderemos cómo leer un número y su base objetivo para la conversión en programación C. Crearemos un programa simple que permita a los usuarios ingresar un número decimal y especificar la base a la que desean convertirlo.

Primero, creemos un nuevo archivo C para nuestro programa de conversión de bases:

cd ~/project
nano base_converter.c

Ahora, escribamos el código inicial para leer el número y la base objetivo:

#include <stdio.h>

int main() {
    int number, base;

    // Solicitar al usuario que ingrese el número decimal
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Solicitar al usuario que ingrese la base objetivo
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Validar la entrada de la base
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    printf("Number entered: %d\n", number);
    printf("Target base: %d\n", base);

    return 0;
}

Compilemos y ejecutemos el programa:

gcc base_converter.c -o base_converter
./base_converter

Ejemplo de salida:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Number entered: 42
Target base: 2

Explicación del código:

  • Usamos scanf() para leer el número decimal y la base objetivo de la entrada del usuario.
  • Validamos la base para asegurarnos de que esté entre 2 y 16 (soportando de binario a hexadecimal).
  • El programa muestra de vuelta el número y la base ingresados para confirmar la entrada.

Convertir Utilizando División y Residuos

En este paso, implementaremos el algoritmo central para convertir un número decimal a otra base utilizando división y residuos. Modificaremos nuestro programa anterior para agregar la lógica de conversión.

Abra el archivo existente y actualice el código:

cd ~/project
nano base_converter.c

Reemplace el código anterior con la siguiente implementación:

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

// Función para convertir decimal a cualquier base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";

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

    // Convertir utilizando división y residuos
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Invertir la cadena
    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 32 bits + terminador nulo

    // Solicitar al usuario que ingrese el número decimal
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Solicitar al usuario que ingrese la base objetivo
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Validar la entrada de la base
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // Convertir e imprimir el resultado
    convertToBase(number, base, result);

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

    return 0;
}

Compile y ejecute el programa:

gcc base_converter.c -o base_converter
./base_converter

Ejemplo de salida:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Decimal 42 in base 2 is: 101010

Enter a decimal number to convert: 255
Enter the target base (2-16): 16
Decimal 255 in base 16 is: FF

Explicación del código:

  • La función convertToBase() implementa el algoritmo central de conversión.
  • Utiliza división y residuo para extraer los dígitos de derecha a izquierda.
  • Soporta bases desde 2 hasta 16 utilizando un conjunto de dígitos predefinido.
  • Maneja el caso especial de 0.
  • Invierte la cadena resultante para obtener el orden correcto de los dígitos.
  • Utiliza un arreglo de dígitos para mapear los residuos a los caracteres de la base correspondiente.

Imprimir el Número Convertido

En este último paso, mejoraremos nuestro programa de conversión de bases agregando opciones de salida y formato más completas para mostrar el número convertido.

Abra el archivo existente y actualice el código:

cd ~/project
nano base_converter.c

Actualice el código con una impresión y formato mejorados:

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

// Función para convertir decimal a cualquier base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";
    int original = number;  // Almacenar el número original para mostrar

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

    // Convertir utilizando división y residuos
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Invertir la cadena
    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;
    }
}

// Función para imprimir información detallada de la conversión
void printConversionInfo(int decimal, int base, const char *converted) {
    printf("\n--- Number Conversion Details ---\n");
    printf("Original Number (Decimal): %d\n", decimal);
    printf("Target Base: %d\n", base);
    printf("Converted Number: %s\n", converted);

    // Representaciones adicionales de bases
    printf("\nBase Representations:\n");
    printf("  Decimal:    %d\n", decimal);

    // Representación binaria
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binary:     %s\n", binaryResult);
    }

    // Representación 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 32 bits + terminador nulo

    // Solicitar al usuario que ingrese el número decimal
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Solicitar al usuario que ingrese la base objetivo
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Validar la entrada de la base
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // Convertir el número
    convertToBase(number, base, result);

    // Imprimir información detallada de la conversión
    printConversionInfo(number, base, result);

    return 0;
}

Compile y ejecute el programa:

gcc base_converter.c -o base_converter
./base_converter

Ejemplo de salida:

Enter a decimal number to convert: 42
Enter the target base (2-16): 16

--- Number Conversion Details ---
Original Number (Decimal): 42
Target Base: 16
Converted Number: 2A

Base Representations:
  Decimal:    42
  Binary:     101010
  Hexadecimal: 2A

Explicación del código:

  • Se agregó la función printConversionInfo() para proporcionar una salida detallada de la conversión.
  • Muestra el número decimal original, la base objetivo y el resultado convertido.
  • Incluye representaciones adicionales de bases (binaria y hexadecimal).
  • Imprime condicionalmente representaciones de bases alternativas para evitar redundancia.
  • Proporciona una salida más informativa y educativa.

Resumen

En este laboratorio, aprendimos cómo leer un número y su base objetivo para la conversión en programación C. Creamos un programa simple que permite a los usuarios ingresar un número decimal y especificar la base a la que desean convertirlo. También implementamos el algoritmo central para convertir un número decimal a otra base utilizando división y residuos. Finalmente, aprendimos cómo imprimir el número convertido en la base deseada.

Los puntos clave de aprendizaje de este laboratorio incluyen comprender cómo usar la función scanf() para leer la entrada del usuario, validar la entrada para asegurarse de que la base objetivo esté dentro del rango válido e implementar la lógica de conversión de bases utilizando división y residuos. El programa demuestra una aplicación práctica de estos conceptos en programación C.