Proyecto 1: Criptoaritmética [10%]
1.2
-
src/, Makefile
-
Implementación
-
Documentación de doxygen
-
Calidad de código: sanitizers, linter.
Proyecto 2: Grafo [10%]
Crear un tipo de datos abstracto grafo genérico reutilizable, aplicarlo a un contexto, y hacer programas de pruebas. Operaciones básicas de un grafo (adaptado de Wikipedia):
Method | Description |
---|---|
|
Returns true if graph is empty. |
|
Tests whether there is an edge from the vertex x to the vertex y. |
|
Returns all vertices y such that there is an edge from the vertex x to the vertex y. |
|
Adds the vertex x, if it was not there returns true, otherwise returns false. |
|
Removes the vertex x, if it was there returns true, otherwise returns false. |
|
Adds the edge from the vertex x to the vertex y with given value/weight. If graph is undirected, vertex is also available in the inverse direction. Returns true if the edge was not there, otherwise returns false. Launches an exception if a vertex does not exist within the graph or there is no enough memory to create the edge. |
|
Removes the edge from the vertex x to the vertex y. Same return value and exception handling than |
|
Returns the value associated with the edge (x, y). |
|
Sets the value associated with the edge (x, y) to v. |
|
Returns the value associated with the edge (x, y) in both, read-only and read-write mode. |
En su implementación puede usar los sinónimos node
o point
en lugar de vertex
, y los sinónimos link
, line
, o arc
en lugar de edge
.
Avance 2.1 [60%] 28-jun
-
[10%] Repositorio de control de versiones.
.gitignore
. Estructura de directorios de un proyecto (bin/
,build/
). Facilitar la construcción de la solución (ej.:Makefile
). Documento de análisis (readme.md
oreadme.adoc
). Convención de estilos (cpplint
). -
[25%] Plantilla para generar clases grafo representada con una matrix de adyacencia. Implementada con
std::vector<>
. Los tipos de datos para los vértices y las aristas son arbitrarios y podrían ser distintos. El grafo es dinámico, por lo que se pueden agregar o eliminar nodos y aristas en el tiempo. Se puede crear un grafo con una capacidad inicial de nodos para incrementar la eficiencia. Regla de los cinco. Documentación en Doxygen. -
[20%] Implementa las operaciones básicas de un grafo (véase Table 1).
-
[25%] Implementa una aplicación (ejecutable), a elección del equipo, que use el grafo. Implementa funcionalidad en el grafo requerida por la aplicación (ej.: Dijkstra, Kruskal, …)
-
[20%] Pruebas unitarias para el grafo con un framework (ej.: Catch2). Pruebas manuales de caja negra para la aplicación (ej.:
input/output###.txt
). -
[+10%] Opcional. Usa biblioteca de terceros para generar gráficos de los grafos (ej.: Graphviz).
Avance 2.2 [40%] 08-jul
-
[40%] Agrega implementación del grafo con lista de adyacencia. Usa arreglos asociativos (
std::map<>
) y listas (std::list<>
), o arreglos asociativos de arreglos asociativos. Permite al usuario de la plantilla escoger la implementación. Mantiene la interfaz del grafo indiferentemente de la representación interna. Reutiliza/preserva código común con la representación de matriz de adyacencia. -
[20%] Benchmark. Realiza mediciones de consumo de tiempo (procesamiento) y espacio (memoria) de la aplicación con tres casos de prueba (pequeño, mediano, grande). Hace al menos tres corridas por cada medición y toma la menor. Instrumento de recolección de resultados (ej.: hoja de cálculo).
-
[20%] Reporte del benchmark. Genera un gráfico con dos ejes-y combinados: tiempo y espacio. Eje-x para los casos de prueba. El tipo de representación (matriz o lista de adyacencia) se representa en series. Discute en máximo 500 palabras los resultados.
-
[20%] Pruebas unitarias para la representación con lista de adyacencia. Casos de prueba grandes de caja negra. Puede requerir hacer una rutina que genere grafos.
-
[10%] Documentación en Doxygen. Apego a una convención de estilos (linter).
Importante: Dado que habrá redundancia de código entre la implementación con matriz de adyacencia y con lista de adyacencia, el equipo debe aplicar algún mecanismo de control de redundancia. Diseñen uno y obtengan el visto bueno del profesor antes de implementarlo. De haber redundancia no controlada, la nota se afectará severamente.
Proyecto 3: GUI [10%]
Problema a elección del equipo que requiera obligatoriamente:
-
Herencia y polimorfimo.
-
Programación orientada a eventos.
-
Interfaces gráficas de usuario (GUI).
Debe acordarse con el docente antes de iniciar los avances.
Avance 3.1 [30%] 15-jul
-
[40%] Análisis del problema (
readme.md
oreadme.adoc
). Manual de usuario preliminar (con maquetas/dibujos). -
[60%] Diseño preliminar de eventos (autómata/máquina de estados finito), objetos polimórficos (UML), procedimientos (algoritmos), y funciones (matemática).
Avance 3.2 [70%] 27-jul
-
[10%] Repositorio, build system, y análisis completo (véase 2.1.1).
-
[20%] Diseño final (véase 3.1.2).
-
[20%] Implementación de los eventos.
-
[30%] Implementación de los objetos. Herencia y polimorfismo. Interfaz gráfica de usuario.
-
[20%] Implementación de procedimientos y funciones.