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] Jimmy Neutron ha estado muy ocupado descubriendo los secretos de la CIA, para lo que ha interceptado mucho archivos que contienen renglones. Para pre-procesarlos, necesita encontrar los 2 renglones más largos de cada archivo, y almacenarlos en un archivo de texto. Recuerde que si hay varios renglones de longitud máxima, el programa debe extraerlos todos. Por ejemplo, si ha 3 renglones de 155 letras y 4 de 154 letras, en donde la longitud máxima del renglón es 155, el programa deberá extraer un total de 7 renglones. Implemente el programa completo. 2) [33 pts] Jimmy Neutron descubrió que muchos de textos de los estudiantes de la ECCI contienen comandos maléficos que es necesario censurar. Para eso, construyó un módulo que recibe como entrada un flujo de datos y produce una lista de las palabras que contiene el texto, en donde cada palabra queda asociada con todas las formas en que esa misma palabra aparece escrita, con las mismas letras pero en mayúsculas o minúsculas, con o sin tildes. Por ejemplo, la lista podría contener algo similar a ésto:
2.a) [3 pts]
+-------------------------------+ | ¿Cómo como? Como como COMO... | | Usted no nada NADA. | | Es que no traje TRAJE. | +-------------------------------+  | 
Muestre el resultado de aplicar su rutina a un archivo que contiene los renglones que aquí se muestran. Use el formato BUnit en su respuesta. | 
2.b) [10 pts]
Declare
esta clase de "lista_listas" como una clase derivada de
std::list<>. Incluya también la 
declaración de las otras clases que se necesita para 
implementar "lista_listas".
2.c) [10 pts]
Especifique la función "jalaPalabras()" 
que sirve para obtener construir las palabras y sus listas. 
Asegúrese de que la palabra que encabeza a las demás 
siempre esté escrita en letras minúsculas y sin 
tildes. Incluya datos de prueba BUnit en su especificación.
2.d) [10 pts]
Implemente 
"jalaPalabras()".
2.e) [0 pts]
Implemente 
"jalaPalabras()" pero use el diccionario
std::map<>.
3) [33 pts]
/ \ +--+ | 1 0 4 3 5 | | | \ | 1 0 4 3 5 | | | > [ 1 0 4 3 5 ] | 1 0 4 3 5 | ==\ |__| / | 2 2 7 8 1 | ==/ | | \ | 2 2 7 8 1 | | | > [ 2 2 7 8 1 ] | 2 2 7 8 1 | | | / \ / +--+  | 
     
Suponga que usted necesita almacenar en la clase 
MatrizRepetidora los valores de una matriz 
bidimensional de enorme tamaño, en donde ocurre que muchas 
de las filas están repetidas. Para ahorrar espacio, la idea 
es almacenar la matriz usando
punteros o
referencias a las filas comunes. | 
3.a) [3 pts]
Dibuje el
modelo de la clase 
MatrizRepetidora y muestre la relación entre 
todos los valores almacenados en el
Rep.
3.b) [6 pts]
Declare
la clase RenglonSote que contiene los valores 
numéricos de una fila de la matriz. Esta es una clase 
interna, usada para implementar el Rep de la 
MatrizRepetidora. Declare también la 
matriz.
     
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.c) [5 pts]
Especifique la operación quitaDup() que 
sirve para eliminar todas las filas duplicadas de la 
MatrizRepetidora sustituyéndolas por un 
único RenglonSote que es compartido por todas 
esas filas. Argumente en favor y en contra de que esta 
operación sea pública o privada.
3.d) [8 pts]
Implemente quitaDup(). No olvide que los renglones 
pueden estar compartidos entre varias filas de la matriz.
3.e) [6 pts]
Especifique e
implemente la 
operación swap() que permite intercambiar 2 
renglones de la MatrizRepetidora.
3.f) [0 pts]
Es bien sabido que una matriz siempre se puede multiplicar por su 
propia matriz traspuesta. Especifique e implemente el
método 
multiTras() que retorna el valor almacenado en la 
posición [i,j] de la matriz que resulta de 
multiplicar la matriz por su propia traspuesta.
3.g) [5 pts]
Implemente la función que verifica la
invariante
para la clase MatrizRepetidora.
3.h) [0 pts]
Muestre cómo es posible implementar una matriz rala usando 
el truco del RenglonSote.
3.i) [0 pts] Escriba de nuevo todas las especificaciones, pero ahora compleméntelas con datos de pueban BUnit.
  Adolfo Di Mare <adolfo@di-mare.com>.
    
       
   | 
  
    
       
   | 
  
    
       
   |