Ejercicio obligatorio 3
Fecha de entrega: Jueves 2 de mayo
Vectores dinámicos de coordenadas
Se representa un vector dinámico de \(n\) coordenadas en
\(\mathbb{R}^m\) como un float **
según el siguiente esquema
donde cada uno de los elementos del vector es de longitud \(m\).
Destrucción de vector
Se pide implementar una función
void destruir_vector(float **v, size_t n, size_t m);
que libere la memoria asociada al vector de \(\mathbb{R}^{n\times m}\)
representado por v
.
Creación de vector desde matriz
Se pide implementar una función
float **matriz_a_vector(const float m[][2], size_t n);
que reciba una matriz m
de \(\mathbb{R}^{n\times2}\) y devuelva un
vector dinámico con los mismos elementos.
Densificación aleatoria de vectores de coordenadas
Se quiere implementar un código que dado un vector de coordenadas genere una versión densificada con puntos aleatorios. Por ejemplo
la entrada es el vector rojo de 5 puntos, en gris se señala el margen hacia arriba y hacia abajo con respecto a los segmentos definidos por este vector. Sobre él se ha generado un nuevo vector negro de 23 puntos. Notar que se conservan en el vector nuevo los puntos del vector original, que todos los puntos nuevos caen dentro de las franjas grises, y que los elementos del vector se encuentran ordenados por coordenada \(x\) creciente.
Implementar una función
float **densificar_vector(float **v, size_t nv, size_t nn, float margen);
que dado un vector v
de nv
coordenadas en \(\mathbb{R}^2\)
devueva un nuevo vector con nn
coordenadas generado con un margen de
\(\pm\)margen
con respecto a las rectas definidas por v
.
Se da plena libertad al respecto de la estrategia para implementar lo pedido, tanto en cuanto a cómo ubicar los puntos, la cantidad de puntos nuevos por segmento, etc. siempre y cuando el resultado sea aleatorio y se cumpla con el espíritu de lo pedido.
Consideraciones generales
A esta altura del desarrollo del cuatrimestre se espera que el alumno:
Realice pruebas no interactivas apropiadas para verificar el funcionamiento de las funciones desarrolladas.
Sea capaz de identificar dónde se requiere el uso de funciones auxiliares sea para aislar una funcionalidad o hacer más legible el código o para evitar la repetición innecesaria de código. Deben implementarse dichas funciones de forma genérica y debe diseñarse una interfaz apropiada para las mismas.
Documente cada una de las funciones implementadas. La documentación debe explicar qué representa cada parámetro, qué se devuelve, qué hace la función, cuáles son las precondiciones y las poscondiciones de la misma.
Los programas deben compilar correctamente sin advertencias (se recomienda el uso de
-Werror
en el GCC) y correr sin pérdidas de memoria (se exige el uso de Valgrind).
Entrega
Deberán entregarse los códigos fuentes desarrollados.
La entrega se realiza por correo a la dirección algoritmos9511entregas en gmail.com (reemplazar en por arroba).
El ejercicio es de entrega individual.