Universidad de Costa Rica
|
|
Duración: dos horas. 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 tres de las cuatro preguntas. ¡No haga más de lo que se le pide!
1) [33 pts]
class base { public: virtual void YoSoyYo() { cout << "base" << endl; } }; // base |
1.a) [1 pts]
Derive 2 clases de la clase "base
" e implemente el
método YoSoyYo()
de manera que escriba el
nombre de la clase.
1.b) [5 pts]
Escriba un bloque de código en el que declare 1 objeto de
cada una de las clases. Luego invoque el método
YoSoyYo()
desde ellos. Muestre en resultado de
ejecutar ese bloque de código.
1.c) [5 pts]
Declare un vector de punteros y guarde ahí las direcciones
de los objetos que usó en el bloque de código del
punto anterior. Muestre el resultado de invocar
YoSoyYo()
para cada uno de los punteros en el vector.
1.d) [5 pts]
Elimine la palabra "virtual
" de la declaración
de la clase "base
". Muestre el resultado de invocar
YoSoyYo()
a través del vector de punteros.
Explique el resultado.
1.e) [5 pts]
Restituya la palabra "virtual
" de la
declaración de la clase "base
" pero
elimínela de una de las clases derivadas. Muestre el
resultado de invocar YoSoyYo()
a través del
vector de punteros. Explique el resultado.
1.f) [5 pts]
Elimine la palabra "virtual
" de todas las
declaraciones. Muestre el resultado de invocar
YoSoyYo()
a través del vector de punteros.
Explique el resultado.
1.g) [7 pts]
Haga que la jerarquía derivada de la clase
"base
" tenga por lo menos 3 niveles. Declare en los
nietos como "virtual
" el método
YoSoyYo()
, y también declárelo
"virtual
" para el padre de los nietos. Eso sí,
elimine la palabra "virtual
" para la
declaración del tío de los nietos, y también
elimine la palabra "virtual
" para la clase
"base
". Construya su vector de punteros de manera que
contenga punteros a varios objetos, uno de cada clase. Muestre el
resultado de invocar YoSoyYo()
a través del
vector de punteros. Explique el resultado.
2) [33 pts]
2.a) [0 pts] Escriba la
declaración de
las clases Arbol
y Lista
, que tienen la
característica que usan el mismo tipo de nodo.
2.b) [7 pts] Especifique la función
Arboleador()
que toma una lista, similar a la de la
figura de arriba, y la convierta en un
árbol binario ordenado el que, al ser recorrido en inorden,
tiene en orden creciente los nodos, aún si hay duplicados.
Incluya un ejemplo de qué hace esta función. Si lo
desea, puede basarse en la especificación genérica
para la operación
Move()
.
2.c) [26 pts] Implemente la función
Arboleador()
, pero evite copiar nodos en su
implementación. Además, debe usar recursividad. Use
los campos "_izq
" y "_der
" del nodo de
la lista para crear el árbol, sin usar nuevos nodos. Como
documentación interna, explique cómo funciona su
implementación.
3) [33 pts] Como programador máximo de la firma spamTico.com usted ha conseguido varios miles de archivos de texto que contienen, además de otras cosas, cientos de miles de direcciones de correo electrónico. Usted necesita escribir un programa para extraer todas esas direcciones, y decide implementarlo en C++.
Explique cuáles hileras de un archivo de texto son
direcciones de correo electrónico. Recuerde que es
válido usar el guión "-"
, el
caracter de subrayado "_"
y también
el punto "."
. Lo que distingue a las
direcciones de correo electrónico es la letra de arrobas
"@"
. Recuerde que los archivos de entrada
pueden contener cualesquiera caracteres
ASCII
válidos, para cuya codificación se usa el rango
numérico [0..127]
, aunque su programa debe
permitir manejar archivos con letras en el rango superior
[128..255]
.
Algunas direcciones válidas son las siguientes:
71572.341@compuserve.com koenraad_lecot@ecci.ucr.ac.cr atorres@ic-itcr.ac.cr e913570@32am.wap.ucr mike.patrick@tecapro.com francisco-jose@mata.names
En su implementación, lea cada archivo renglón por renglón. Utilice un diccionario STL, de tipo map<>, para almacenar cada una de las direcciones que encuentre. Además, asocie a cada dirección una lista con todos los renglones en los que esa dirección aparece, de manera que sea posible producir un listado que muestre cada dirección junto con los renglones que muestran el contexto para esa dirección. Una parte de ese listado podría ser la siguiente:
koenraad_lecot@ecci.ucr.ac.cr - Hola, te envío de nuevo mi dirección koenraad_lecot@ecci.ucr.ac.cr porque ya la habías pedido - No hemos sabido si el señor Lecot, koenraad_lecot@ecci.ucr.ac.cr, ha comezado su - "Koenraad Lecot" <koenraad_lecot@ecci.ucr.ac.cr> - )(/&%%&%$·%$&%(/=)/(/%/&...- koenraad_lecot@ecci.ucr.ac.cr ----99(()/(/&/&%/
atorres@ic-itcr.ac.cr - atorres@ic-itcr.ac.cr - No es posiblel encontrar al usuario "atorres@ic-itcr.ac.cr" en la base de datos - atorres@ic-itcr.ac.cr - atorres@ic-itcr.ac.cr
No hace falta que la lista de renglones de contexto aparezca ordenada, o sin duplicados. Haga la documentación de su programa, e incluya un diagrama en que explique cómo usa los objetos que requiere para hacer el programa.
Adolfo Di Mare <adolfo@di-mare.com>.
|