Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2004
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Examen Final [solución]

      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
Polimorfismo de Stroustrup

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]

           L
           |
           v
     +-------------+   +-------------+   +-------------+   +-------------+
     |   |     | *-+-->|   |     | *-+-->|   |     | *-+-->|   |     | *-+-> NIL
     |   | 2.2 |   |   |   | 4.5 |   |   |   | 2.2 |   |   |   | 1.3 |   |
NIL<-+-* |     |   |<--+-* |     |   |<--+-* |     |   |<--+-* |     |   |
     +-------------+   +-------------+   +-------------+   +-------------+

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.

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2004
Derechos de autor reservados © 2004
[home] <> [/\]