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

Examen Final [solución]

      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 las tres preguntas. ¡No haga más de lo que se le pide!

 

1) [33 pts] Suponga que al examinar la biblioteca "Numerote.h" (que está implementada en su respectivo "Numerote.cpp") usted se encuentra varias funciones para usar números enteros binarios de longitud arbitraria que están almacenados en listas de valores booleanos (por eso los parámetros de esas funciones son listas booleanas).

1.a) [8 pts] Escriba las especificaciones de las funciones declaradas en la biblioteca "Numerote.h".

1.b) [5 pts] Su clase "BoolNum" es un empaque ("wrapper") alrededor de "Numerote.h" que sirve para que los programadores C++ puedan usar numerotes implementados con base en las funciones de la biblioteca "Numerote.h". Defina el Rep de su clase "BoolNum" usando las listas booleanas de "Numerote.h".

1.c) [12 pts] Declare los métodos públicos de la clase "BoolNum" que se necesitan para usar esa clase en la función emplantillada "Gaussian_Elimination()" de la tarea programada:

      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>.
  • Las declaraciones corresponden a la especificación.
  • Las definiciones corresponden a la implementación. Para facilitarle memorizar este hecho, asocie la palabra "definición" con la directiva #define que sirve para implementar macros en C++:
          #define max(a,b) ( (a)>(b) ? (a) : (b) )

1.d) [8 pts] e) Implemente los operadores aritméticos ("+" , "-" , "*" , "/") de "BoolNum". No hace falta que implemente las funciones de "Numerote.h".

 

2) [33 pts] La función "rotalina(L,i,n)" para la clase "std::list<>" sirve para rotar circularmente una parte de la lista:
(a b [c d e] f) ==> (a b [e c d] f)
      i--->               i--->
       n=3                 n=3

2.a) [11 pts] Especifique "rotalina(L,i,n)". Incluya los datos de prueba BUnit y use el formato Doxygen.

2.b) [11 pts] Implemente "OrdeneLista(L)<>". Use la función "rotalina(L,i,n)", iteradores y el operador de comparación.

2.c) [11 pts] Implemente "rotalina(L,i,n)". Use "splice<>()" para evitar copiar los valores de la lista.

 

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>.
  • Las declaraciones corresponden a la especificación.
  • Las definiciones corresponden a la implementación. Para facilitarle memorizar este hecho, asocie la palabra "definición" con la directiva #define que sirve para implementar macros en C++:
          #define max(a,b) ( (a)>(b) ? (a) : (b) )

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.

 

Soluciones

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