Diferencia entre revisiones de «Tareas»
De Wiki del curso de C
(→Tarea 2: Estructurado, estructuras y makefile) |
|||
Línea 49: | Línea 49: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
+ | |||
+ | == Tarea 4: Objetos: Reserva dinámica de memoria == | ||
+ | ==== Interfaz pública ==== | ||
+ | <code>gol.h</code> | ||
+ | |||
+ | struct world; | ||
+ | |||
+ | struct world *world_alloc(int size_x, int size_y); | ||
+ | void world_free(struct world *w); | ||
+ | |||
+ | void world_print(const struct world *w); | ||
+ | void world_iterate(struct world *w); | ||
+ | |||
+ | * <code>world_alloc</code>: Reserva en memoria e inicializa nuestro objeto <code>struct world</code>. Esto implica reservar memoria para la estrucutra y para los dos arrays que tiene dentro. | ||
+ | * <code>world_free</code>: Libera la memoria que ocupa nuestro objeto. Esto implica liberar primero la memoria de los arrays que tiene dentro la estrucutra, y luego la propia estructura. | ||
+ | * <code>world_print</code>: Imprime el mundo | ||
+ | * <code>world_iterate</code>: Realiza una iteración del juego de la vida | ||
+ | |||
+ | |||
+ | ==== Implementación (privada) ==== | ||
+ | <code>gol.c</code> | ||
+ | |||
+ | struct world | ||
+ | { | ||
+ | bool *cells[2]; | ||
+ | int size_x; | ||
+ | int size_y; | ||
+ | }; | ||
+ | |||
+ | static void fix_coords(const struct world *w, int *x, int *y); | ||
+ | static bool get_cell(const struct world *w, int x, int y); | ||
+ | static void set_cell(struct world *w, int buf, int x, int y, bool val); | ||
+ | static int count_neighbors(const struct world *w, int x, int y); | ||
+ | |||
+ | /* ... */ | ||
+ | /* Definiciones de funciones privadas y públicas */ | ||
+ | /* ... */ | ||
+ | |||
+ | * <code>fix_coords</code>: Recibe unas coordenadas (x,y) y las modifica para implementar un mundo toroidal | ||
+ | * <code>get_cell</code>: Devuelve la célula en la posición (x,y), arreglando las coordenadas. | ||
+ | * <code>set_cell</code>: Cambia el valor de la célula de la posición (x,y), arreglando las coordenadas. | ||
+ | * <code>count_neighbors</code>: Cuenta las células vecinas '''haciendo uso de''' la función <code>get_cell</code> | ||
+ | |||
+ | ==== NOTAS ==== | ||
+ | * No olvides comprobar que has podido realizar correctamente la reserva de memoria: | ||
+ | |||
+ | En <code>world_alloc()</code>: | ||
+ | w = (struct world *)malloc(sizeof(struct world)); | ||
+ | if (!w) | ||
+ | return NULL; | ||
+ | |||
+ | En <code>main()</code>: | ||
+ | w = world_alloc(WORLD_X, WORLD_Y); | ||
+ | if (!w) { | ||
+ | perror("Can't allocate world"); | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | |||
+ | * Las funciones privadas se declaran como <code>static</code> y '''no''' aparecen el el .h | ||
+ | * Ahora debes calcular a mano el offset en el array para llegar a la célula (x,y) con la fórmula: <code>size_x*y + x</code>. Encapsula esta fórmula en las funciones <code>get_cell</code> y <code>set_cell</code>. |
Revisión del 22:15 7 may 2017
Contenido
Tarea 1: Versión inicial del mundo
- Haz un fork del repositorio con tu nombre
- Clona tu repositorio
- Completa el esqueleto proporcionado para implementar una primera versión funcional del juego de la vida
- Sube los cambios al tu repositorio
- Haz un pull request
- Arregla las correcciones del profesor
- Sube las correcciones a tu repo
- ¿Has conseguido que te acepten el pull request?
- NO -> goto 6
- Sí -> ¡Enhorabuena! Ya has terminado la tarea 1
Tarea 2: Código modular, estructuras y makefile
a) Divide tu programa en 3 fichero:
-
main.c
: Implementará el bucle principal del juego -
gol.h
: Tendrá las declaraciones de las funciones relacionadas con el juego de la vida -
gol.c
: Tendrá las definiciones de las funciones anteriores
b) Crea un makefile
para gestionar la compilación y dependencias
Tarea 3: Primera aproximación a objetos
1. Encapsula tu mundo en la siguiente estructura:
struct world { bool w1[W_SIZE_X][W_SIZE_Y]; bool w2[W_SIZE_X][W_SIZE_Y]; };
2. Modifica tus funciones para que reciban un puntero a tu objeto. Añade el modificador const
siempre que no sea necesario modificar el objeto
Tu main.c
debería quedar más o menos así:
#include <stdio.h> #include <stdlib.h> #include "gol.h" int main() { int i = 0; struct world w; world_init(&w); do { printf("\033cIteration %d\n", i++); world_print(&w); world_step(&w); } while (getchar() != 'q'); return EXIT_SUCCESS; }
Tarea 4: Objetos: Reserva dinámica de memoria
Interfaz pública
gol.h
struct world; struct world *world_alloc(int size_x, int size_y); void world_free(struct world *w); void world_print(const struct world *w); void world_iterate(struct world *w);
-
world_alloc
: Reserva en memoria e inicializa nuestro objetostruct world
. Esto implica reservar memoria para la estrucutra y para los dos arrays que tiene dentro. -
world_free
: Libera la memoria que ocupa nuestro objeto. Esto implica liberar primero la memoria de los arrays que tiene dentro la estrucutra, y luego la propia estructura. -
world_print
: Imprime el mundo -
world_iterate
: Realiza una iteración del juego de la vida
Implementación (privada)
gol.c
struct world { bool *cells[2]; int size_x; int size_y; }; static void fix_coords(const struct world *w, int *x, int *y); static bool get_cell(const struct world *w, int x, int y); static void set_cell(struct world *w, int buf, int x, int y, bool val); static int count_neighbors(const struct world *w, int x, int y); /* ... */ /* Definiciones de funciones privadas y públicas */ /* ... */
-
fix_coords
: Recibe unas coordenadas (x,y) y las modifica para implementar un mundo toroidal -
get_cell
: Devuelve la célula en la posición (x,y), arreglando las coordenadas. -
set_cell
: Cambia el valor de la célula de la posición (x,y), arreglando las coordenadas. -
count_neighbors
: Cuenta las células vecinas haciendo uso de la funciónget_cell
NOTAS
- No olvides comprobar que has podido realizar correctamente la reserva de memoria:
En world_alloc()
:
w = (struct world *)malloc(sizeof(struct world)); if (!w) return NULL;
En main()
:
w = world_alloc(WORLD_X, WORLD_Y); if (!w) { perror("Can't allocate world"); exit(EXIT_FAILURE); }
- Las funciones privadas se declaran como
static
y no aparecen el el .h - Ahora debes calcular a mano el offset en el array para llegar a la célula (x,y) con la fórmula:
size_x*y + x
. Encapsula esta fórmula en las funcionesget_cell
yset_cell
.