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.