Diferencia entre revisiones de «Material»
De Wiki del curso de C
					
										
					
					|  (→Material de clase) |  (→Tareas) | ||
| Línea 26: | Línea 26: | ||
| |- | |- | ||
| | 1 | | 1 | ||
| − | |   | + | | | 
| |  Versión inicial | |  Versión inicial | ||
| * Completada la plantilla del juego de la vida | * Completada la plantilla del juego de la vida | ||
| Línea 102: | Línea 102: | ||
| * La memoria para los dos mundos se reserva de una vez. La referencia a este bloque de memoria se guarda en la estructura del objeto | * La memoria para los dos mundos se reserva de una vez. La referencia a este bloque de memoria se guarda en la estructura del objeto | ||
| * Se utiliza la misma lógica que antes para acceder a las células, con dos punteros a los mundos que vamos intercarbiando. | * Se utiliza la misma lógica que antes para acceder a las células, con dos punteros a los mundos que vamos intercarbiando. | ||
| + | |- | ||
| + | |||
| + | | rowspan="2" | 7 | ||
| + | | 7.1 | ||
| + | | Objetos: Reserva dinámica de memoria para la estructura `gol` | ||
| + | * Se cambia ligeramente la interfaz de la función `gol_alloc` para que devuelva un puntero a `struct gol` en lugar de recibirlo. | ||
| + | * Ahora se reservan dinámicamente dos bloques de memoria: uno para la estructura `struct gol` y otro para los arrays del mundo. | ||
| + | * La función `gol_free` debe liberar los dos bloques de memoria. | ||
| + | |- | ||
| + | |||
| + | | 7.2 | ||
| + | | Objetos: Ocultar la estructura `gol` | ||
| + | Mediante una declaración adelantada de `struct gol` en `gol.h` conseguimos | ||
| + | ocultar los campos de nuestro objeto (privatizar) a los usuarios de la librería. | ||
| + | |- | ||
| + | |||
| + | | rowspan="2" | 8 | ||
| + | | 8.1 | ||
| + | | Utilizar getopt para recibir argumentos de línea de comandos | ||
| + | * El programa ahora recibe como argumentos el ancho y el alto del mundo, además de el argumento `-u, --usage` que imprime el siguiente mensaje de ayuda: | ||
| + |  Usage: ./gol -w <width> -h <height> | ||
| + |       -u, --usage: Prints this help message | ||
| + |       -w, --width: Width of the world | ||
| + |       -h, --height: Height of the world | ||
| + | * Es obligatorio especificar el tamaño del mundo, si no se especifica se imprime un mensaje de error y se termina el programa. | ||
| + | * Se define el tipo `struct gol_options` para guardar los parámetros de entrada: `int width`, `int height` y `bool usage` | ||
| + | * Se crean dos funciones estáticas que encapsulan la lógica de tratar los argumentos y de imprimir el mensaje de ayuda: | ||
| + | * `static bool parse_args(struct gol_options *gol_opt, int argc, char *argv[]);` | ||
| + | * `static void print_usage(const char *argv0);` | ||
| + | |- | ||
| + | |||
| + | | 8.2 | ||
| + | | Implementar la opción de inicializar el mundo aleatoriamente | ||
| + | * Se añade un argumento opcional con un parámetro obligatorio. Indica el patrón de inicialización del mundo: "glider" o "random" | ||
| + | * Se añade otro argumento opcional con parámetro obligatorio. Proporcionará la semilla para `srand()`. Si no se pasa este parámetro, se toma como semilla el tiempo actual. Esta es ahora la salida de `./gol -u`: | ||
| + |  Usage: ./gol -w <width> -h <height> [-r[<seed>]] | ||
| + |       -u, --usage:             Prints this help message | ||
| + |       -w, --width:             Width of the world | ||
| + |       -h, --height:            Height of the world | ||
| + |       -s, --Seed [seed]:       Seed for random world. | ||
| + |       -p, --pattern [pattern]: Initialization pattern: | ||
| + |  				 - glider | ||
| + |  				 - random | ||
| + | * Se modifica el método `gol_init()` para recibir un enumerado, `enum gol_init_pattern`, que esta definido en `gol.h`. El método `gol_init()` llama a los métodos privados `gol_init_rand()` o `gol_init_glider()`, según el patrón de inicialización seleccionado. | ||
| + | * Se crea una función auxiliar en `main.c` que transforma del string recibido como argumento a el enumerado que acepta `gol_init()` | ||
| + | * Se modifica `mem_test.c` para adaptarlo al nuevo `gol_init()` | ||
| + | |- | ||
| + | |||
| + | | rowspan="2" | 8 | ||
| + | | 9.1 | ||
| + | | Cargar y guardar el mundo desde un archivo binario | ||
| + | * Implementar los métodos `gol_save()` y `gol_load()` para guardar y cargar el mundo desde un archivo binario. Estas funciones simplemente guardan el array tal cual en el archivo especificado y leen el archivo guardándolo en el array. | ||
| + |  bool gol_load(struct gol *gol, const char *file); | ||
| + |  bool gol_save(const struct gol *gol, const char *file); | ||
| + | * Modificar el main para que acepte los siguientes comandos, además de 'q' para cerrar: | ||
| + | * 'l': Si se pulsa este caracter, llamar a una función estática `load_world()` que pida al usuario que inserte el nombre de un archivo.  Luego carga este archivo con la función `gol_load()` | ||
| + | * 's': Si se pulsa este caracter, llamar a una función estática `save_world()` que pida al usuario que inserte el nombre de un archivo.  Luego guarda este archivo con la función `gol_save()` | ||
| + | * Si cualquiera de los nuevos comandos falla, se informa al usuario del error y se continua la ejecución. Para que el usuario pueda leer el mensaje de error se llama a `getchar()`, así se pausa la ejecución hasta que se pulse un caracter. | ||
| + | |- | ||
| + | |||
| + | | 9.1 | ||
| + | | Guardar y cargar el mundo desde un archivo de texto | ||
| + | Modificar `gol_save()` y `gol_load()` para guardar y cargar el estado del | ||
| + | mundo en un formato de texto parecido al que se usa en `gol_print()`. | ||
| + | |||
| + | Ejemplo de archivo para mundo de 10x20: | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| + |  . . . . . . # . . . . . . . . . . . . . | ||
| + |  . . . . . . . # . . . . . . . . . . . . | ||
| + |  . . . . . # # # . . . . . . . . . . . . | ||
| + |  . . . . . . . . . . . . . . . . . . . . | ||
| |- | |- | ||
Revisión del 02:27 3 jun 2019
Material de clase
- Transparencias (Se irá actualizando)
- Transparencias para imprimir (Se irá actualizando)
- Plantilla Juego de la vida
- Repositorio con la solución del trabajo de clase (se irá actualizando)
Vídeos
- https://youtu.be/C0UiG1uYgYQ
- https://youtu.be/gqzYwGdPfYM
- https://youtu.be/IDfllYxE7I4
- https://youtu.be/57-zWEnGxHU
- https://youtu.be/1SJ_fEXD7OA
- https://youtu.be/EhX3E8lLcUM
- No hay
- https://youtu.be/dk-0xF5pJpQ (incompleto)
Tareas
| Tarea | Subtarea | Descripción | 
|---|---|---|
| 1 | Versión inicial 
 | |
| 2 | 2.1 | Intercambiar mundos en lugar de copiarlos 
 | 
| 2.2 | Crear makefile y dividir el programa 
 | |
| 3 | 3.1 | Encapsular el juego de la vida en una estructura 
 | 
| 3.2 | Ocultar todas las funciones que el usuario no necesite 
 | |
| 4 | 4.1 | Memoria dinámica I: Añadir objetivos `debug` y `release` Se añaden dos nuevos objetivos al makefile que modifican los flags de gcc para crear dos ejecutables distintos según convenga. | 
| 4.2 | Memoria dinámica I: Reserva dinámica de memoria para el mundo 
 | |
| 5 | 5.1 | Memoria dinámica II: Implementar test de memoria 
 | 
| 5.2 | Memoria dinámica II: Una sola reserva de memoria por mundo 
 | |
| 6 | 6.1 | Memoria dinámica III: Macro funcional para acceder a las células Utilizar una macro para reutilizar y evitar repetir el mismo código en `get_cell` y `set_cell` | 
| 6.2 | Memoria dinámica III: Una reserva de memoria para los dos mundos 
 | |
| 7 | 7.1 | Objetos: Reserva dinámica de memoria para la estructura `gol` 
 | 
| 7.2 | Objetos: Ocultar la estructura `gol` Mediante una declaración adelantada de `struct gol` en `gol.h` conseguimos ocultar los campos de nuestro objeto (privatizar) a los usuarios de la librería. | |
| 8 | 8.1 | Utilizar getopt para recibir argumentos de línea de comandos 
 Usage: ./gol -w <width> -h <height>
     -u, --usage: Prints this help message
     -w, --width: Width of the world
     -h, --height: Height of the world
 | 
| 8.2 | Implementar la opción de inicializar el mundo aleatoriamente 
 Usage: ./gol -w <width> -h <height> [-r[<seed>]]
     -u, --usage:             Prints this help message
     -w, --width:             Width of the world
     -h, --height:            Height of the world
     -s, --Seed [seed]:       Seed for random world.
     -p, --pattern [pattern]: Initialization pattern:
				 - glider
				 - random
 | |
| 8 | 9.1 | Cargar y guardar el mundo desde un archivo binario 
 bool gol_load(struct gol *gol, const char *file); bool gol_save(const struct gol *gol, const char *file); 
 | 
| 9.1 | Guardar y cargar el mundo desde un archivo de texto Modificar `gol_save()` y `gol_load()` para guardar y cargar el estado del mundo en un formato de texto parecido al que se usa en `gol_print()`. Ejemplo de archivo para mundo de 10x20: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . . . . . . . . . . . . . . . . . # . . . . . . . . . . . . . . . . . # # # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | |
| ... | ... | ... | 

