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.
Desafío
FácilConstruyamos 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 estructuraGenericArraycon tres miembros: un arreglovoid**para contener punteros, unintpara el conteo actual y unintpara 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 0add_element: almacena un punterovoid*en la siguiente posición disponible e incrementa el conteo (supón que la capacidad es suficiente)get_element: devuelve elvoid*en el índice especificadofree_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 (ipara entero,spara 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á:
- El número de elementos que se agregarán
- Para cada elemento: un indicador de tipo (
ios) 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
100Ejemplo de salida cuando las entradas son 4, después s World, s Generic, i -5, s Arrays:
World
Generic
-5
ArraysRecuerda 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
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online