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] Considere la rutina
bUNga()
:
template <class T> void starList( std::string& str, const std::list<T>& L ); void bUNga(long BUNGA,std::list<long>&bunga ){long BunGa=1;bool noEs = false;while ( (!noEs)&&(BunGa<BUNGA/2)){++ BunGa;noEs=(BUNGA%BunGa==0);}if( noEs){bunga.push_back(BunGa);bUNga (BUNGA/BunGa,bunga);}}
1.a) [0 pts] Justifique cada una de las reglas de indentación usadas en el curso. Discuta si esas reglas son convenciones de programación apropiadas para C++.
1.b) [0 pts]
Especifique e implemente la rutina emplantillada
starList()
que toma la lista L=(1,2,17)
y la almacena en "str
" separando los valores de la
lista con una estrella '*'
.
bUNga()
de
acuerdo a las convenciones de
programación que ha practicado
en sus programas.
1.d) [9 pts]
Escriba la
especificación completa para esta rutina. Incluya los
datos de prueba
BUnit.
1.e) [15 pts]
Muestre el resultado de ejecutar la rutina con el valor
20
y una lista vacía. Muestre cómo se
ve la pila de ejecución junto con los registros de
activación,
paso por paso, en la
recursividad.
1.f) [0 pts]
Modifique su rutina para que funcione correctamente.
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 función booleana
obtieneMasa()
retorna
"false
" cuando termina de proveer datos (los que obtiene
leyéndolos de archivos o de la red). De otra forma, retorna
"true
" y un contenedor
"Masa
" lleno de valores de tipo "Token
". En cada invocación,
obtieneMasa()
retorna un contenedor "Masa
"
completo.
3.a) [0 pts]
Haga un diagrama que muestre cómo están organizadas las
clases "Masa
" y "Token
".
3.b) [5 pts]
Especifique la función
obtieneMasa()
. El contenedor "Masa
" debe estar
diseñado de manera que pueda ser recorrido con iteradores, de
manera similar a como se recorren los contenedores de la biblioteca
estándar. Recuerde incluir suficientes ejemplos BUnit.
3.c) [3 pts]
Escriba la declaración de las clase "Masa
".
Incluya los métodos que usa en las implementaciones. Recuerde:
¡No se le meta al Rep!
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> .
|
3.d) [3 pts]
Escriba la declaración de la clase
"Token
".
Incluya los métodos que usa en las implementaciones.
Recuerde: ¡No se le meta al Rep!
3.e) [6 pts] La clase "Token
" incluye el
método booleano "estaMarcado()
" que retorna
"true
" para los tokens que están marcados.
Implemente una función que recorra el contenedor
"Masa
" y almacene sus tokens marcados en una
lista.
3.f) [11 pts]
Escriba un programa que utilice "obtienMasa()
" y un contenedor
std::map<>
para almacenar en él todos los
contenedores "Masa
" que corresponden a cada uno de los
tokens marcados, de manera que cada token marcado
sirva como llave para obtener la lista de contenedores
"Masa
" en los que aparece ese token (si un
contenedor "Masa
" contiene varios tokens marcados,
ese contenedor "Masa
" deberá aparecer en varias
listas). Suponga que es posible copiar objetos de tipo
"Masa
" y de tipo "Token
" usando sus
respectivos métodos de copia (recuerde: pierde el 33% de los
puntos si no usa std::map<>
).
3.g) [5 pts]
Suponga que tanto la clase "Token
" como "Masa
"
ya tiene definido el operator<<()
para grabar el
valor del token en un flujo de salida. Modifique el programa
que escribió en el punto anterior para que también
imprima, para cada token, todas las "masas" en que aparece.
3.h) [0 pts]
Use "Masa
" y "Token
" para escribir un programa similar al definido para
spamTico.com.
Adolfo Di Mare <adolfo@di-mare.com>.
|