Ejercicio obligatorio 3
Fecha de entrega: Domingo 15 de mayo
Introducción
Queremos modelar una polilínea, para ello definimos la estructura:
typedef struct {
float (*puntos)[2];
size_t n;
} polilinea_t;
que permite almacenar en memoria una polilínea según el siguiente esquema:
Trabajo
Creación y destrucción
Se pide implementar la función
polilinea_t *polilinea_crear_vacia(size_t n);
que cree una nueva polilínea con n
puntos pero sin inicializar sus
coordenadas. La función debe devolver la polilínea creada o NULL
en caso de
falla.
Se pide implementar la función
polilinea_t *polilinea_crear(const float puntos[][2], size_t n);
que cree una nueva polilínea en base a los n
puntos
recibidos. La función
debe devolver la polilínea creada en memoria nueva o NULL
en caso de falla.
Se pide implementar la función void polilinea_destruir(polilinea_t *polilinea);
que libere la memoria asociada a la polilinea
previamente creada.
Getters y setters
Se pide implementar la función
size_t polilinea_cantidad_puntos(const polilinea_t *polilinea);
que devuelva la cantidad de puntos en la polilinea
recibida.
Se pide implementar la función
bool polilinea_obtener_punto(const polilinea_t *polilinea, size_t pos, float *x, float *y);
que devuelva por la interfaz las coordenadas (x
, y
) del punto que está
en la posición pos
de polilinea
. La función debe retornar true
de poder
completar la operación, false
en caso contrario.
Se pide implementar la función
bool polilinea_setear_punto(polilinea_t *polilinea, size_t pos, float x, float y);
que asigne el punto de coordenadas (x
, y
) en la posición pos
de la
polilinea
. La función debe retornar true
de poder completar la operación,
false
en caso contrario.
Memoria
Implementar la función
polilinea_t *polilinea_clonar(const polilinea_t *polilinea);
que dada una
polilinea
devuelva la copia de la misma en memoria nueva.
Aplicación y validación
Se provee el siguiente main()
que implementa una serie de pruebas:
int main(void) {
const float puntos[3][2] = {{0, 0}, {1, 0}, {0, 1}};
polilinea_t *p1 = polilinea_crear(puntos, 3);
if(p1 == NULL) {
fprintf(stderr, "Error en creacion de polilinea\n");
return 1;
}
float x, y;
assert(polilinea_cantidad_puntos(p1) == 3);
assert(! polilinea_obtener_punto(p1, 3, &x, &y));
assert(polilinea_obtener_punto(p1, 1, &x, &y));
assert(x == 1 && y == 0);
polilinea_t *p2 = polilinea_crear_vacia(2);
if(p2 == NULL) {
fprintf(stderr, "Error en creacion de polilinea\n");
return 1;
}
assert(polilinea_cantidad_puntos(p2) == 2);
assert(! polilinea_setear_punto(p2, 2, 0, 0));
assert(polilinea_setear_punto(p2, 1, 3, 1));
assert(polilinea_obtener_punto(p2, 1, &x, &y));
assert(x == 3 && y == 1);
polilinea_destruir(p2);
p2 = polilinea_clonar(p1);
polilinea_destruir(p1);
if(p2 == NULL) {
fprintf(stderr, "Error en creacion de polilinea\n");
return 1;
}
assert(polilinea_cantidad_puntos(p2) == 3);
assert(polilinea_obtener_punto(p2, 2, &x, &y));
assert(x == 0 && y == 1);
polilinea_destruir(p2);
assert(polilinea_crear(puntos, 1UL << 50) == NULL);
return 0;
}
El mismo debe ser utilizado y debe verificarse que funcione correctamente y sin fugas de memoria.
Este main()
, sin alteraciones, debe ser entregado como parte del ejercicio.
Entrega
Deberá entregarse el código fuente del programa desarrollado.
El programa debe:
Compilar correctamente con los flags:
-Wall -Werror -std=c99 -pedantic
pasar Valgrind correctamente,
validar las pruebas dadas.
La entrega se realiza a través del sistema de entregas.
El ejercicio es de entrega individual.