Ejercicio obligatorio 3
Fecha de entrega: Domingo 6 de junio
Introducción
Queremos modelar un polígono, para ello definimos la estructura:
typedef struct {
float (*vertices)[2];
size_t n;
} poligono_t;
que permite almacenar en memoria un polígono según el siguiente esquema:
Trabajo
Creación y destrucción
Se pide implementar la función
poligono_t *poligono_crear(float vertices[][2], size_t n);
que cree un nuevo polígono en base a los n
vertices
recibidos. La función
debe devolver el polígono creado en memoria nueva o NULL
en caso de falla.
Se pide implementar la función void poligono_destruir(poligono_t *poligono);
que libere la memoria asociada al poligono
previamente creado.
Getters
Se pide implementar la función
size_t poligono_cantidad_vertices(const poligono_t *poligono);
que devuelva la cantidad de vértices en el poligono
recibido.
Se pide implementar la función
bool poligono_obtener_vertice(const poligono_t *poligono, size_t pos, float *x, float *y);
que devuelva por la interfaz las coordenadas (x
, y
) del vértice que está
en la posición pos
de poligono
. La función debe retornar true
de poder
completar la operación, false
en caso contrario.
Memoria
Implementar la función
poligono_t *poligono_clonar(const poligono_t *poligono);
que dado un
poligono
devuelva la copia del mismo en memoria nueva.
Implementar la función
bool poligono_agregar_vertice(poligono_t *poligono, float x, float y);
que
agregue el punto de coordenadas (x
, y
) al final del poligono
recibido. En
caso de falla debe dejarse inalterado el poligono
recibido y devolver
false
, se devuelve true
en caso contrario.
Aplicación y validación
Se provee el siguiente main()
que implementa una serie de pruebas:
int main(void) {
float puntos[3][2] = {{0, 0}, {1, 0}, {0, 1}};
poligono_t *p1 = poligono_crear(puntos, 3);
if(p1 == NULL) {
fprintf(stderr, "Error en creacion de poligono\n");
return 1;
}
float x, y;
assert(poligono_cantidad_vertices(p1) == 3);
assert(! poligono_obtener_vertice(p1, 3, &x, &y));
assert(poligono_obtener_vertice(p1, 1, &x, &y));
assert(x == 1 && y == 0);
poligono_t *p2 = poligono_clonar(p1);
poligono_destruir(p1);
if(p2 == NULL) {
fprintf(stderr, "Error en creacion de poligono\n");
return 1;
}
assert(poligono_cantidad_vertices(p2) == 3);
assert(poligono_obtener_vertice(p2, 2, &x, &y));
assert(x == 0 && y == 1);
assert(poligono_agregar_vertice(p2, -1, 0.5));
assert(poligono_cantidad_vertices(p2) == 4);
assert(poligono_obtener_vertice(p2, 3, &x, &y));
assert(x == -1 && y == 0.5);
poligono_destruir(p2);
assert(poligono_crear(puntos, ~0UL) == 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.