Ejercicio: El Acuario Dinámico
El Escenario:
• ¡Bienvenidos a la tienda de mascotas virtual!
• Tenemos un "Acuario" que es un arreglo dinámico (‘int *acuario‘).
• Cada pez se representa por un "tipo" (un número: 1=Guppy, 2=Tetra, etc.).
• Nuestro software para gestionar el acuario (las funciones) se descompuso.
El Reto (¡Ayuda!)
Necesitamos programar la lógica de main y las 3 funciones que faltan para que el acuario
vuelva a operar y (lo más importante) no tenga fugas de memoria.
9 / 16 Ejercicio
Objetivo del Ejercicio
El Reto
Vamos a simular un "Acuario Dinámico". Es un arreglo de enteros (int *acuario) que
guarda los tipos de peces.
Conceptos a Aplicar
• malloc: Para crear el acuario inicial.
• realloc: Para "expandir" el acuario cuando se llene.
• free: Para liberar toda la memoria al final.
• Funciones y Punteros: Escribir una función que crea y devuelve un *nuevo* arreglo
en el Heap.
• Punteros como Parámetros: Usar punteros para que una función "devuelva" más
de un valor (ej. el tamaño de un arreglo).
10 / 16 Ejercicio
Regla del Ejercicio: ¡Solo Punteros!
La Restricción Principal
Para este ejercicio, está prohibido usar la notación de corchetes ([]) para acceder a los
elementos del arreglo.
11 / 16 Ejercicio
Regla del Ejercicio: ¡Solo Punteros!
La Restricción Principal
Para este ejercicio, está prohibido usar la notación de corchetes ([]) para acceder a los
elementos del arreglo.
NO USAR (Notación de Arreglo) SÍ USAR (Notación de Puntero)
1 // No permitido : 1 // Requerido :
2 miArreglo [ i ] = 10; 2 *( miArreglo + i ) = 10;
3 x = miArreglo [ i ]; 3 x = *( miArreglo + i ) ;
Objetivo de esta regla
El propósito es practicar y entender la aritmética de punteros y cómo un arreglo es, en
esencia, un puntero a un bloque de memoria contigua.
11 / 16 Ejercicio
Funciones de Ayuda (Provistas) Parte 1
¡No tienen que escribir esto!
Para hacerlo más visual, les proporcionamos la función imprimirNombrePez.
1 // 1= Guppy , 2= Tetra , 3= Betta , 4= Pez Á ngel
2 void imp rimirNombrePez ( int tipoPez ) {
3 switch ( tipoPez ) {
4 case 1: printf ( " Guppy " ) ; break ;
5 case 2: printf ( " Tetra " ) ; break ;
6 case 3: printf ( " Betta " ) ; break ;
7 case 4: printf ( " Pez Á ngel " ) ; break ;
8 default : printf ( " Especie Desconocida (?) " ) ;
9 }
10 }
12 / 16 Ejercicio
Funciones de Ayuda (Provistas) Parte 2
¡No tienen que escribir esto!
Para hacerlo más visual, les proporcionamos la función imprimirArreglo.
1 void imprimirArreglo ( int * arr , int tam ) {
2 if ( arr == NULL ) return ;
3
4 for ( int i = 0; i < tam ; i ++) {
5 printf ( " % d " , *( arr + i ) ) ;
6 }
7 printf ( " ]\ n " ) ;
8 }
13 / 16 Ejercicio
¡Manos al Código! (Tarea 1 de 3)
Tarea 1: mostrarAcuario (Función void)
• Objetivo: Mostrar el censo completo del acuario.
• Regla: Recorrer el arreglo y usar imprimirNombrePez para cada pez.
• Concepto Clave: Arreglos como punteros.
14 / 16 Ejercicio
¡Manos al Código! (Tarea 1 de 3)
Tarea 1: mostrarAcuario (Función void)
• Objetivo: Mostrar el censo completo del acuario.
• Regla: Recorrer el arreglo y usar imprimirNombrePez para cada pez.
• Concepto Clave: Arreglos como punteros.
Prototipo Requerido
1 // Muestra el censo del acuario
2 void mostrarAcuario ( int * acuario , int numPeces ) ;
14 / 16 Ejercicio
¡Manos al Código! (Tarea 2 de 3)
Tarea 2: contarEspecies (Función void)
• Objetivo: Contar cuántos peces hay de un tipo específico.
• Regla: Recorrer el arreglo y usar un contador.
• Concepto Clave: Arreglos como punteros.
15 / 16 Ejercicio
¡Manos al Código! (Tarea 2 de 3)
Tarea 2: contarEspecies (Función void)
• Objetivo: Contar cuántos peces hay de un tipo específico.
• Regla: Recorrer el arreglo y usar un contador.
• Concepto Clave: Arreglos como punteros.
Prototipo Requerido
1 // Cuenta una especie especifica
2 void contarEspecies ( int * acuario , int numPeces , int tipoAContar ) ;
15 / 16 Ejercicio
¡Manos al Código! (Tarea 3 de 3)
Tarea 3: filtrarPecesPorTipo (¡El Desafío!)
• Objetivo: Crear y devolver un NUEVO arreglo solo con los peces filtrados.
• Regla 1: Usar malloc para la memoria del nuevo arreglo.
• Regla 2: Usar *conteoDestino para "devolver" el tamaño del nuevo arreglo.
• Concepto Clave: Funciones que devuelven punteros, malloc, Parámetros de salida.
16 / 16 Ejercicio
¡Manos al Código! (Tarea 3 de 3)
Tarea 3: filtrarPecesPorTipo (¡El Desafío!)
• Objetivo: Crear y devolver un NUEVO arreglo solo con los peces filtrados.
• Regla 1: Usar malloc para la memoria del nuevo arreglo.
• Regla 2: Usar *conteoDestino para "devolver" el tamaño del nuevo arreglo.
• Concepto Clave: Funciones que devuelven punteros, malloc, Parámetros de salida.
Prototipo Requerido
3 // D e v u e l v e un NUEVO arreglo en el Heap con los peces f i l t r a d o s
4 int * f i l t r a r Pe c e s P o r T i p o ( int * acuarioPrincipal , int numPecesTotal , int tipoAFiltrar , int * conteoDestino ) ;
16 / 16 Ejercicio