Universidad de Costa Rica
|
|
|
|
|
Duración: Ciento veinte minutos. Lea bien el examen antes de hacerlo. El examen es a libro abierto. Cuenta la documentación. Cuenta la redacción y la ortografía. Puede hacer el examen con lápiz. Resuelva todas las preguntas. ¡No haga más de lo que se le pide!
1) [33 pts] En 1878 Samuel Loyd inventó el "Juego de los Quince" que se juega en una matriz 4x4 moviendo piezas a la casilla vacía hasta que queden ordenadas. Un ejemplo del comienzo y fin del juego es el siguiente:
|
→ |
|
1.a) [0 pts]
Dibuje el
modelo para la clase "J15" que sirve para
almacenar de una forma eficiente los números del Juego de
los Quince. Indique si vale la pena usar un
enum para los valores { up down left right }.
1.b) [5 pts] Defina la abstracción y explique cuáles operaciones son importantes para esta clase.
1.c) [20 pts]
Escriba el archivo de encabezado con la
especificación en formato
"Doxygen" para la
clase "J15". Incluya el
Rep y los datos
de prueba
BUnit.h para la
clase.
1.d) [8 pts]
Use una lista en donde almacene valores de tipo "J15"
para representar los movimientos del juego.
Especifique e
implemente
una rutina que comience en una configuración del juego y
genere la lista de los movimientos que resuelven el juego. Su
algoritmo no tiene que ser eficiente. Puede usar una estrategia de
prueba y error para obtener la solución del juego, por lo
que es válido escribir y borrar de la lista configuraciones
de juego de prueba. Recuerde que en algunos casos el juego no
tiene solución. No se le meta al
Rep de
"J15".
1.e) [0 pts]
Explique si es mejor usar las rutinas str2list.h para hacer
los ejemplos de prueba de los métodos del juego
"J15" o si más bien es mejor usar inicializaciones de matrices (pues ambas requieren
de un método para cargar los valores a partir de una matriz
cuadrada).
2) [33 pts] Una ventaja de los iteradores Java es que basta una sola variable para recorrer un contenedor.
2.a) [22 pts]
Escriba el
archivo de encabezado para el iterador itrAcum.h
que sirve para recorrer una lista visitando el primer elemento una
vez, el segundo dos, hasta retornar el
n-ésimo n veces. Por ejemplo, si L==(a,b,c)
el iterador retornará a los elementos en el orden (a b b c
c c). Incluya la
especificación de
su
iterador junto con
los datos de prueba
BUnit.h. En su
respuesta usted debe usar el siguiente
Rep para el iterador:
TYPE
Rep_Acum = RECORD
c : Lpos_T; { list<>::iterator actual }
i : UNSIGNED; { Número del elemento actual }
{ 0 <= i <= L.size() }
countL, { L.size() }
k : UNSIGNED; { Veces que se ha retornado }
{ el i-ésimo elemento }
L : ^List_P; { Puntero a la lista que se recorre }
END;
2.b) [11 pts] Implemente el iterador.
3) [33 pts] La matriz chisquirrisquitirrisquititica no incluye una clase vector que le permita al programador cliente de la clase manipular una fila completa. Diseñe 2 clases amigas, "
Matriz" y "Fila", de
manera que el programador cliente pueda obtener y manipular una
fila completa de la matriz.
m_ptr[]
/[*]--->[*][*][*][*][*][*][*]
| [*]--->[*][*][*][*][*][*][*]
| [*]--->[*][*][*][*][*][*][*] Matriz[NxM]:
N| [*]--->[*][*][*][*][*][*][*] - N filas
| [*]--->[*][*][*][*][*][*][*] - M Columnas
| [*]--->[*][*][*][*][*][*][*]
\[*]--->[*][*][*][*][*][*][*]
|----------------->
M
|
3.a) [6 pts]
Declare el
Rep
de las clases "Matriz" y "Fila" de
manera que cada "Fila" contenga un vector y
"Matriz" contenga un vector de
punteros a cada una
de las filas. Suponga que la matriz es densa. Respecte los
siguientes requerimientos en el Rep:
m_ptr[]" es un vector de "N" punteros.m_ptr[i]" es un vector de "M" valores.Matriz[i][j]" siempre toma 2 brincos,
pues es necesario usar el vector indirecto de "N"
punteros.3.b) [7 pts] Especifique e implemente una operación que le permita al programador cliente obtener una fila completa de la matriz. No copie la fila.
3.c) [7 pts] Especifique e implemente una operación que le permita al programador usuario accesar uno de los valores de la matriz.
3.d) [7 pts] Especifique e implemente una operación que le permita al programador usuario intercambiar 2 filas de la matriz.
3.e) [6 pts] Especifique e implemente una operación que le permita al programador usuario intercambiar 2 columnas de la matriz.
Adolfo Di Mare <adolfo@di-mare.com>.
|
|
|