Cree un simple editor de arte ASCII cuyas operaciones de pintado pueden ser programadas con acciones, las cuales se pueden deshacer (undo) o rehacer (redo). Las acciones se reciben en la entrada estándar y se listan a continuación:
| Acción | Descripción |
|---|---|
|
Crea un lienzo (matriz) relleno del carácter ch de la cantidad indicada de filas y columnas. Si ya el editor tenía otro lienzo, el anterior se descarta junto con sus pilas de acciones, dado que el editor trabaja sólo en un lienzo a la vez. |
|
Pinta el carácter ch en la celda (row, col) del lienzo. La acción es agregada a la pila de Undo y se limpia la pila de Redo. |
|
Pinta un rectángulo relleno con el carácter ch desde la esquina superior izquierda (r1, c1) hasta la esquina inferior derecha (r2, c2). La acción es agregada a la pila de Undo y se limpia la pila de Redo. |
|
Deshace la última acción que está en la pila de Undo. La acción es trasladada a la pila de Redo. Note que si hay hay una figura A, y se dibuja una figura B que tapa parcial o completamente a A, y se hace deshace ( |
|
Rehace la última acción que fue deshecha en el lienzo. La acción es trasladada de regreso de la pila Redo a la pila Undo. |
|
Imprime el lienzo actual en la salida estándar. No altera las pilas de Undo ni Redo. |
|
Sale del programa |
Ejemplo de uso del programa. Los textos en negrita son ingresados en la entrada estándar. Note que las coordenadas ingresadas por sus usuarios inician en 1 y no en 0.
canvas . 5 8 dot @ 2 3 dot @ 2 6 rect " 4 3 5 6 print ........ ..@..@.. ........ .."""".. .."""".. rect X 3 6 5 8 print ........ ..@..@.. .....XXX .."""XXX .."""XXX undo print ........ ..@..@.. ........ .."""".. .."""".. undo print ........ ..@..@.. ........ ........ ........ redo print ........ ..@..@.. ........ .."""".. .."""".. quit
Evaluación. En todos los rubros se evalúan las buenas prácticas de programación, en especial la creación y uso de código reutilizable. Para este problema, no es necesario que sus estructuras de datos sean genéricas, pero sí reutilizables si se necesitan en varios lugares del programa. Para efectos de esta asignación, no está permitido utilizar colecciones de la biblioteca estándar de C++ (ej.: std::stack<>, std::list<>, std::vector<>, etc.). Sí puede utilizar la clase std::string, o en su defecto, utilizar el primer carácter de la acción (c para canvas, d para dot, r para rect, U para undo, R para redo, p para print y q para quit), pero sólo para el examen en papel.
-
[25%] Acción
canvas. Estructura de datos para representar el lienzo. Inicialización de memoria. Destrucción del viejo lienzo si lo hay. -
[25%] Pilas Undo y Redo. Estructura de datos para representar las pilas. Operaciones de insertar en el tope (
push), extraer del tope (pop), y limpiar la pila. -
[15%] Acciones
dotyrectangle. Almacenamiento de las acciones en la pila de Undo. Aplicación de las acciones sobre el lienzo. -
[15%] Acciones
undoyredo. Traslado de acciones entre una pila y otra. Aplicación de la acción opuesta (undo) sobre el lienzo, o rehacer (redo) la operación sobre el lienzo. -
[5%] Acción
print. Imprime el lienzo en la salida estándar. Acciónquitsale del programa. -
[15%] Lógica principal del programa que administra las estructuras de datos anteriores, lee acciones de la entrada estándar y las aplica.
En los rubros anteriores, para obtener el porcentaje respectivo, su programa no puede caerse si no hay suficiente memoria, si el usuario provee coordenadas inválidas, si las pilas están vacías, o si trata de aplicar una operación de dibujo cuando el programa no tiene un lienzo. Su programa debe hacer buena administración de memoria: no dejar fugas de memoria, no hacer doble liberación de memoria, ni accesos inválidos.