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
staticy 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_cellyset_cell.