Universidad de Costa Rica. Escuela de Ciencias de la Computación e Informática.
CI-0113 Programación II. I-2026. Examen 01 [20-May-2026]

Instrucciones. Dispone de 3 horas para realizar el examen. Es obligatorio apagar celular y cualquier otro dispositivo de comunicación. Si su solución es ilegible, se calificará con cero. No se permiten hojas de anotaciones elaboradas previo al examen. Al entregar el examen puede tomarle fotografías a su solución para realizar el ejercicio extraclase. Asegúrese de firmar la hoja de asistencia al salir. Se podrán realizar actividades adicionales posteriores al examen como entrevistas con efecto en la calificación.

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

canvas ch rows cols

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.

dot ch row col

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.

rect ch r1 c1 r2 c2

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.

undo

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 (undo) la figura B, la figura A se mostrará nuevamente.

redo

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.

print

Imprime el lienzo actual en la salida estándar. No altera las pilas de Undo ni Redo.

quit

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.

  1. [25%] Acción canvas. Estructura de datos para representar el lienzo. Inicialización de memoria. Destrucción del viejo lienzo si lo hay.

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

  3. [15%] Acciones dot y rectangle. Almacenamiento de las acciones en la pila de Undo. Aplicación de las acciones sobre el lienzo.

  4. [15%] Acciones undo y redo. 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. [5%] Acción print. Imprime el lienzo en la salida estándar. Acción quit sale del programa.

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