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]
/ a - - \ a /// Imprime en \c std::cout todos los hijos de \c p. | - b - | /|\ template <class E> | - c - | / | \ void imprimeHijos( const Nodo<E> * p ) { | - - e | b c d const Nodo<E> * it; | - - f | / \ \ for ( it = p->begin(); it != p->end(); ++it ) { | - d - | e f g std::cout << it->val() << std::endl; \ - - g / } }Suponga que usted cuenta con un API (Application Program Interface) para manipular los nodos de los árboles usando iteradores como se muestra en la rutina
imprimeHijos()
.
1.a) [11 pts]
Implemente
la rutina "arbolDicc( std::map<E,std::list<E>>&
DDD , const Nodo<E> * p )
" que
almacena en el diccionario "DDD
" la lista de hijos
para todos los nodos del árbol cuya raíz es
"p
" (asuma que nunca hay valores duplicados en el
árbol).
1.b) [11 pts]
Especifique e implemente la función "arbolDim(
int & m, int & n, const Nodo<E> * p
)
" que determina cuantas filas y columnas se requieren para
almacenar el árbol de raíz "p
" en una
matriz
chirrisquitica.
1.c) [11 pts]
Implemente la rutina "arbolMatriz()
" que toma un
árbol y lo almacena en una matriz chirrisquitica, de manera
que la estructura jerárquica del árbol se mantenga
en el contenido de la matriz, como se muestra en el diagrama al
principio de este enunciado.
2) [33 pts] Implemente un programa completo que lea de un archivo un conjunto de palabras clave, todas escritas en letras minúsculas. El segundo argumento de su programa es un archivo lleno de renglones en los que usted buscará las palabras mencionadas en el archivo de palabras clave (ignore las diferencias entre minúsculas y mayúsculas). Después de examinar cada renglón, su programa debe imprimir, para cada palabra clave, todos los renglones del segundo archivo en donde esa palabra aparece. Evite leer más de una vez cualquiera de los archivos. Use los contenedores adecuados que le permitan lograr buena eficiencia en tiempo de ejecución.
3) [33 pts] El programa "
Nmbag.cpp
" sirve para leer
números y contar cuántas veces aparece cada uno.
Implemente la parte de la clase "Nmbag
" que se
necesita para que este programa funcione.
int main() { Nmbag B; // la mega-bolsota long n; // lee todos los valores while (cin >> n) { B.Inc(n); } for (n=0; n<LONG_MAX; ++n) { if (0 != B[n]) { cout << n << " está " << B[n]; cout << " veces en la bolsa" << endl; } } return 0; } // main() |
3.a) [7 pts]
Defina el
Rep
para la clase. Suponga que nunca ocurrirá que necesite
almancenar más de 4096
valores diferentes en
su "Nmbag
".
3.b) [1 pts] Implemente el constructor y el destructor para la clase.
3.c) [11 pts]
Especifique
e implemente la operación
examinadora
"B[n]
".
3.d) [14 pts]
Especifique e
implemente
la operación
mutadora
"B.Inc(n)
".
3.e) [0 pts]
Mejore la eficiencia de la operación "B[n]
" usando
búsqueda binaria. Explique por qué esto no
mejora la implementación de "B.Inc(n)
".
Adolfo Di Mare <adolfo@di-mare.com>.
|