Proyecto 1: Criptoaritmética [10%]

1.2

  1. src/, Makefile

  2. Implementación

  3. Documentación de doxygen

  4. 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):

Table 1. Operaciones de un grafo
Method Description

isEmpty()

Returns true if graph is empty.

isAdjacent(x, y)

Tests whether there is an edge from the vertex x to the vertex y.

getNeighbors(x)

Returns all vertices y such that there is an edge from the vertex x to the vertex y.

addVertex(x)

Adds the vertex x, if it was not there returns true, otherwise returns false.

removeVertex(x)

Removes the vertex x, if it was there returns true, otherwise returns false.

addEdge(x, y, value)

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.

removeEdge(x, y)

Removes the edge from the vertex x to the vertex y. Same return value and exception handling than addEdge().

getEdge(x, y)

Returns the value associated with the edge (x, y).

setEdge(x, y, v)

Sets the value associated with the edge (x, y) to v.

operator()(x, y)

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

  1. [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 o readme.adoc). Convención de estilos (cpplint).

  2. [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.

  3. [20%] Implementa las operaciones básicas de un grafo (véase Table 1).

  4. [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, …​)

  5. [20%] Pruebas unitarias para el grafo con un framework (ej.: Catch2). Pruebas manuales de caja negra para la aplicación (ej.: input/output###.txt).

  6. [+10%] Opcional. Usa biblioteca de terceros para generar gráficos de los grafos (ej.: Graphviz).

Avance 2.2 [40%] 08-jul

  1. [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.

  2. [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).

  3. [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.

  4. [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.

  5. [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:

  1. Herencia y polimorfimo.

  2. Programación orientada a eventos.

  3. Interfaces gráficas de usuario (GUI).

Debe acordarse con el docente antes de iniciar los avances.

Avance 3.1 [30%] 15-jul

  1. [40%] Análisis del problema (readme.md o readme.adoc). Manual de usuario preliminar (con maquetas/dibujos).

  2. [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

  1. [10%] Repositorio, build system, y análisis completo (véase 2.1.1).

  2. [20%] Diseño final (véase 3.1.2).

  3. [20%] Implementación de los eventos.

  4. [30%] Implementación de los objetos. Herencia y polimorfismo. Interfaz gráfica de usuario.

  5. [20%] Implementación de procedimientos y funciones.