Menu
Coddy logo textTech

Repaso: Array genérico

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 53 de 61.

challenge icon

Desafío

Fácil

Construyamos un contenedor GenericArray: una estructura de datos flexible que puede contener una mezcla de enteros y cadenas en la misma colección mediante 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, agregar 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 en 0
    • add_element: almacena un puntero void* en la siguiente posición disponible e incrementa el conteo (supón 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 que se agregarán y, después, para cada elemento lee un indicador de tipo (i para entero, s para cadena) seguido del valor. Después de agregar todos los elementos, recorre el 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 que se agregarán
  2. Para cada elemento: un indicador de tipo (i o s) seguido del valor

Al agregar enteros, asigna memoria para el int y almacena el puntero. Al agregar cadenas, asigna memoria y copia la cadena. Al recuperar elementos, conviértelos de nuevo al tipo apropiado para imprimirlos.

Importante: para llevar un registro de los tipos al imprimir, puedes usar un arreglo paralelo simple de indicadores de tipo en main, o almacenar el carácter indicador de tipo junto con cada elemento.

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

42
Hello
100

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

World
Generic
-5
Arrays

Recuerda usar protectores de inclusión en tu archivo de encabezado. El contenedor en sí no necesita saber qué tipos almacena. Solo contiene punteros void*. La responsabilidad de conocer el tipo recae en el código que agrega 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: Crea un GenericArray con capacidad n
    
    // TODO: Crea un array paralelo para rastrear los tipos (array de char de tamaño n)
    
    // TODO: Para cada elemento:
    // - Lee el indicador de tipo (i o s)
    // - Lee el valor
    // - Si es entero: asigna memoria para int, almacena el valor, añade al array
    // - Si es string: asigna memoria para string, copia el valor, añade al array
    // - Almacena el indicador de tipo en tu array paralelo
    
    // TODO: Itera a través del array e imprime cada elemento
    // - Comprueba el tipo desde tu array paralelo
    // - Convierte el void* de vuelta al tipo apropiado e imprime
    
    // TODO: Libera toda la memoria asignada (enteros, strings y el array)
    
    return 0;
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online