Construir un comando que recibe niveles cuadrados de sudoku y encuentra su solución.
Fecha final de entrega: 27-jun-2020 23:55.

Evaluación

  1. Control de versiones. Proyecto en equipos de dos o tres integrantes. Se entrega en un repositorio de control de versiones privado alojado en el servicio de repositorios Git de la UCR. La nota de un participante será proporcional a la cantidad y calidad de los commits que realizó. No se deben agregar a control de cambios ejecutables, archivos objeto (.o), bibliotecas (.so), documentación generada por Doxygen, ni otras salidas automáticas. En su lugar, debe tener un archivo .gitignore adecuado. Se debe agregar al profesor (jeisson.hidalgo) y asistente del curso (bryan.ulate). Cualquier acto de plagio será sancionado severamente.

  2. [10%] Documentación externa. Cada equipo debe averiguar los detalles a implementar, y elaborar un documento de análisis. El documento será el README.md en la raíz del proyecto. Debe tener notación Markdown. Puede estar redactado en inglés o español. Este documento ha de constar de cuatro secciones:

    1. Problema a resolver. Debe expresar con detalles el problema a resolver en este documento.

    2. Equipo de desarrollo. Indicar quiénes desarrollan la solución, y que es parte del curso de programación 2.

    3. Manual de usuario. Explicar cómo invocar el programa, qué significa cada opción, proveer varios ejemplos de ejecución, y explicar la entrada y salida en cada caso. Debe incluir un ejemplo de invocación de las cuatro posibles combinaciones de entrada textual/binaria y salida textual/binaria.

    4. Manual de desarrollador. Explicar cómo compilar la solución, probarla, agregar casos de prueba, e instalar el ejecutable. Debe explicar cómo está estructurado el código fuente en el proyecto, en especial, cuáles archivos pertenecen a la biblioteca, al comando, y al programa de pruebas.

  3. [5%] Estructura de archivos del proyecto. Los archivos del repositorio no pueden aparecer todos en la raíz, sino que deben estar distribuidos en carpetas características de un proyecto de Unix como se lista en la Table 1.

  4. [5%] Casos de prueba textuales. Cada miembro del equipo debe crear al menos dos casos de prueba textuales. Uno de tamaño 3, y otro de tamaño mayor a 3. La notación de los casos de prueba será la misma del Progra1-19a-Examen01.

  5. [20%] Conversión de niveles. Importar el código fuente del ejemplo de convertidor de archivos de valores hecho en clase (valconv.7z). Se puede importar el Makefile incluido. Adaptar el convertidor de valores para que convierta de niveles de sudoku de formato de texto a binario y viceversa con la opción -c. Convertir no resuelve el nivel, sólo lo traduce de un formato a otro. El usuario controlará la conversión con los argumentos -ib, -it, -ob, y -ot. El orden de las opciones es arbitrario. Note que la salida de texto debe ser con formato, y por tanto, usar \$n\$ espacios en blanco como separadores entre bloques verticales y un cambio de línea entre bloques verticales. El análisis de argumentos lo debe realizar el comando, mientras que la conversión debe ser realizada por una biblioteca dinámica, de tal forma que sea código reutilizable. Ejemplo de invocaciones:

    sudoku -c               # text stdin -> text stdout
    sudoku -it -c           # text stdin -> text stdout
    sudoku -c -ib           # bin  stdin -> text stdout
    sudoku -c f1            # text f1 file -> text stdout
    sudoku -ib f1 -c        # bin f1 file -> text stdout
    sudoku -ob f2 -c        # text stdin -> bin f2 file
    sudoku -c f1 -ob f2     # text f1 file -> bin f2 file
    sudoku -ib f1 -c -ob f2 # bin f1 file -> bin f2 file
  6. [5%] Casos de prueba binarios. Cada miembro del equipo debe convertir sus casos de prueba a formato binario. La notación de los casos de prueba binarios será similar al ejemplo del convertidor de archivos de valores realizado en el curso. Consta del tamaño del bloque \$n\$ seguido de \$n^2\cdotn^2\$ números, todos enteros sin signo de 2 bytes. Los valores faltantes (puntos '.' en la versión de texto) serán representados por el valor cero.

  7. [15%] Convertir código inicial a C++. Realizar un diseño de clases. Si trabaja con el código fuente en C del proyecto valconv, debe convertir el código dado a C++ y usar la biblioteca estándar, en especial el contenedor std::vector para representar matrices. Convertir la entrada y salida de C a C++, por ejemplo std::cout y std::fstream. Si inició su código en C++ desde cero, esta conversión no es necesaria pero recuerde no debe usar entrada y salida de C.

  8. [25%] Resolución de un nivel. Cuando se invoca sin el parámetro -c. Implementa algún algoritmo de resolución de sudoku. Si el nivel no tiene solución, reporta unsolvable si la salida es textual, y el tamaño 0 si la salida es binaria. Si el nivel tiene múltiples soluciones, reportar la primera que se encuentre. Resolver en el orden tradicional de lectura: de izquierda a derecha y de arriba a abajo. El análisis de argumentos lo debe realizar el comando, mientras que la resolución del nivel debe ser realizada por la biblioteca dinámica, de tal forma que sea código reutilizable.

    sudoku level001.txt
    sudoku -it level001.txt
    sudoku -ib level001.bin
    sudoku -ib level001.bin -ot sol001.txt
  9. [15%] Documentación interna con Doxygen. Toda clase debe tener una descripción y un ejemplo de uso. Toda subrutina debe explicar sus parámetros y valor de retorno. La documentación debe considerar situaciones anómalas como parámetros inválidos o el reporte de errores (por ejemplo, lanzar excepciones). Debe proveerse un \mainpage que explique la intención del proyecto.

En todos los rubros se evaluarán las buenas prácticas de programación, como reutilización de código, apego a la convención de estilo camelCase, identificadores significativos, indentación, estilo de paréntesis, sin fugas ni accesos inválidos de memoria (valgrind), programación defensiva, y diseño por contratos.

Table 1. Estructura de archivos del proyecto
Recurso Descripción Versionado

bin/

Ejecutables del comando y del programa de pruebas

No

build/

Código objeto (.o) temporal

No

doc/

Documentación generada por doxygen en formato html

No

lib/

Biblioteca dinámica (.so) compartida por el comando y el programa de pruebas

No

src/

Código fuente (.h y .c)

test/

Casos de prueba propios, creados por el equipo

Makefile

Compila, prueba, instala, desinstala, genera documentación, limpia

Doxyfile

Configura Doxygen para extraer documentación del código fuente

README.md

Análisis del problema, autores, manual de usuario y de desarrollador

.gitignore

Ignora los recursos que NO deben estar en control de versiones (columna Versionado)

La columna "Versionado" indica si los recursos deben estar o no en control de versiones. Note que NO puede haber redundancia de código entre el comando y el programa de pruebas. El código común debe estar alojado en la biblioteca dinámica.