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:

../_images/20221_ej3.png

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:

  1. Compilar correctamente con los flags:

    -Wall -Werror -std=c99 -pedantic
    
  2. pasar Valgrind correctamente,

  3. validar las pruebas dadas.

La entrega se realiza a través del sistema de entregas.

El ejercicio es de entrega individual.