Menu
Coddy logo textTech

Repaso: Array genérico

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 53 de 61.

challenge icon

Desafío

Fácil

Vamos a construir un contenedor GenericArray — una estructura de datos flexible que puede contener una mezcla de enteros y cadenas en la misma colección utilizando punteros void*.

Organizarás tu código en tres archivos:

  • generic_array.h: Define la estructura GenericArray con tres miembros: un arreglo void** para contener punteros, un int para el conteo actual y un int para la capacidad. Declara los prototipos de las funciones para crear el arreglo, añadir elementos, recuperar elementos por índice y liberar el arreglo.
  • generic_array.c: Implementa la funcionalidad de tu contenedor:
    • create_array — asigna un GenericArray con una capacidad inicial dada e inicializa el conteo a 0
    • add_element — almacena un puntero void* en el siguiente espacio disponible e incrementa el conteo (asume que la capacidad es suficiente)
    • get_element — devuelve el void* en el índice especificado
    • free_array — libera el arreglo de elementos y la propia estructura GenericArray
  • main.c: Demuestra tu arreglo genérico almacenando tanto enteros como cadenas. Lee el número de elementos a añadir, luego, para cada elemento, lee un indicador de tipo (i para entero, s para cadena) seguido del valor. Después de añadir todos los elementos, itera a través del arreglo e imprime cada valor. Para los enteros, imprime el número directamente. Para las cadenas, imprime el texto directamente.

Tu programa recibirá:

  1. El número de elementos a añadir
  2. Para cada elemento: un indicador de tipo (i o s) seguido del valor

Al añadir enteros, asigna memoria para el int y almacena el puntero. Al añadir cadenas, asigna memoria y copia la cadena. Al recuperar, realiza un cast de vuelta al tipo apropiado para imprimir.

Importante: Para rastrear los tipos para la impresión, puedes usar un arreglo paralelo simple de indicadores de tipo en main, o almacenar el carácter indicador de tipo junto a cada elemento.

Ejemplo de salida cuando las entradas son 3, luego i 42, s Hello, i 100:

42
Hello
100

Ejemplo de salida cuando las entradas son 4, luego s World, s Generic, i -5, s Arrays:

World
Generic
-5
Arrays

Recuerda usar guardas de inclusión en tu archivo de cabecera. El contenedor en sí no necesita saber qué tipos almacena — simplemente guarda punteros void*. La responsabilidad de conocer el tipo recae en el código que añade y recupera los elementos.

Pruébalo tú mismo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"

int main() {
    int n;
    scanf("%d", &n);
    
    // TODO: Crear un GenericArray con capacidad n
    
    // TODO: Crear un arreglo paralelo para rastrear los tipos (arreglo de char de tamaño n)
    
    // TODO: Para cada elemento:
    // - Leer el indicador de tipo (i o s)
    // - Leer el valor
    // - Si es entero: asignar memoria para int, almacenar el valor, añadir al arreglo
    // - Si es cadena: asignar memoria para la cadena, copiar el valor, añadir al arreglo
    // - Almacenar el indicador de tipo en tu arreglo paralelo
    
    // TODO: Iterar a través del arreglo e imprimir cada elemento
    // - Verificar el tipo desde tu arreglo paralelo
    // - Convertir el void* de nuevo al tipo apropiado e imprimir
    
    // TODO: Liberar toda la memoria asignada (enteros, cadenas y el arreglo)
    
    return 0;
}

Todas las lecciones de Object Oriented Programming