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]
G(i,j)
indica que el vértice "i"
está conectado al "j"
. La matriz del grafo es
simétrica si cada vez que el grafo contiene la
conexión i→j
también la arista
j→i
aparece en el grafo. El grafo que se muestra
aquí es un grafo dirigido.
1.a) [7 pts]
Suponga que las etiquetes del grafo son hileras.
Declare la
clase "grafo
" en la que las aristas son
punteros almacenados
en la lista de conexiones para cada etiqueta. Use el diccionario
std::map<>
.
Recuerde que la diferencia entre "definir" y "declarar" un objeto
en C++ es que las declaraciones se ponen en los archivos de
encabezados <*.h> y <*.hpp> ,
mientras que las definiciones están en los archivos de
implementación <*.c> y
<*.cpp> .
|
1.b) [5 pts]
Especifique el método booleano
"esGrafo()
" para la clase "grafo
" que
revisa que cada vez que aparece en el grafo la arista
i→j
también aparece la arista
j→i
.
Use el formato
Doxygen e incluya los datos
de prueba
BUnit.
1.c) [5 pts]
Especifique el método "agregueArista()
"
para la clase "grafo
".
Use el formato
Doxygen e incluya los datos
de prueba
BUnit.
1.d) [8 pts]
Implemente "agregueArista()
".
1.e) [8 pts]
Implemente "esGrafo()
".
2) [33 pts] Considere la clase
lista
cuyo
modelo (diagrama)
aparece en la
figura de abajo.
2.a) [7 pts] Haga las declaración para la clase
lista
. Incluya en el
Rep apenas lo
suficiente para implementar la operación
lista::K_pase(L, k)
.
2.b) [7 pts]
Especifique la
operación
lista::K_pase(L, k)
, que traslada de la lista
todos los valores que está en una posición
múltiplo de k
, y los deja en la lista
L
. Evite copiar los nodos al trasladarlos de lista.
2.c) [19 pts]
Implemente lista::K_pase(L, k)
.
2.d) [0 pts] Explique qué es la cirugía de punteros.
3) [33 pts] Una "
escalera
" es una clase que contiene una hilera de caracteres a la que
se le pueden aplicar estas operaciones:
suba(E,n)
Suba("!bcde",1) ==> "b!cde"
Suba("abcd!",5) ==> "abcd!"
aparea(E)
Aparea("abcdefg") ==> "badcfeg"
caiga(E)
Caiga("abcde!") ==> "!abcde"
cuenta(E)
E
".
Cuenta("abcde") ==> 5
print(E)
La rutina "circular()
" corre circularmente el primer
elemento de la "escalera
", imprimiéndola antes
de cada corrimiento. La invocación
circular("!abcd")
debería producir la
siguiente salida:
!abcd a!bcd ab!cd abc!d abcd! !abcd a!bcd etc...
3.a) [6 pts]
Implemente la rutina "circular()
" usando la
"escalera
", de forma que se produzca la salida arriba
descrita. Use únicamente las operaciones arriba indicadas
(No se le meta al
Rep).
3.b) [0 pts]
Se ha determinado que ninguna escalera será más
grande que 2387 caracteres. Escriba las declaraciones de una
implementación de la "escalera
" en que se usen
vectores de letras.
3.c) [5 pts]
Indique cómo modificaría usted el procedimiento
"circular()
" de la parte a) para que trabaje
adecuadamente en la nueva implementación usando arreglos.
3.d) [11 pts]
Si la "escalera
" inicial es "aicoca
",
indique cuáles de las siguientes escaleras pueden ser
impresas usando las operaciones arriba indicadas:
aicoca
"iaocac
"aocaci
"aoccai
"coacia
"
3.e) [11 pts]
¿Es posible usar únicamente estas operaciones del
Tipo de datos abstracto "escalera
" para
implementar un procedimiento que ordene [escaleras de
caracteres]? Si se puede hacer, impleméntelo. De lo
contrario... ¡explique!
Adolfo Di Mare <adolfo@di-mare.com>.
|