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

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

 

1) [33 pts] Considere la rutina bUNga():

template <class T>
void starList( std::string& str, const std::list<T>& L );

void bUNga(long BUNGA,std::list<long>&bunga
){long BunGa=1;bool noEs = false;while (
(!noEs)&&(BunGa<BUNGA/2)){++
BunGa;noEs=(BUNGA%BunGa==0);}if(
noEs){bunga.push_back(BunGa);bUNga
(BUNGA/BunGa,bunga);}}

1.a) [0 pts] Justifique cada una de las reglas de indentación usadas en el curso. Discuta si esas reglas son convenciones de programación apropiadas para C++.

1.b) [0 pts] Especifique e implemente la rutina emplantillada starList() que toma la lista L=(1,2,17) y la almacena en "str" separando los valores de la lista con una estrella '*'.

1.c) [9 pts] Reescriba la rutina bUNga() de acuerdo a las convenciones de programación que ha practicado en sus programas.

1.d) [9 pts] Escriba la especificación completa para esta rutina. Incluya los datos de prueba BUnit.

1.e) [15 pts] Muestre el resultado de ejecutar la rutina con el valor 20 y una lista vacía. Muestre cómo se ve la pila de ejecución junto con los registros de activación, paso por paso, en la recursividad.

1.f) [0 pts] Modifique su rutina para que funcione correctamente.

 

2) [33 pts] Una ventaja de los iteradores Java es que basta una sola variable para recorrer un contenedor.

2.a) [22 pts] Escriba el archivo de encabezado para el iterador itrAcum.h que sirve para recorrer una lista visitando el primer elemento una vez, el segundo dos, hasta retornar el n-ésimo n veces. Por ejemplo, si L==(a,b,c) el iterador retornará a los elementos en el orden (a b b c c c). Incluya la especificación de su iterador junto con los datos de prueba BUnit.h. En su respuesta usted debe usar el siguiente Rep para el iterador:

TYPE
  Rep_Acum = RECORD
    c : Lpos_T;   { list<>::iterator actual    }
    i : UNSIGNED; { Número del elemento actual }
                  { 0 <= i <= L.size()         }
    countL,       { L.size()                   }
    k : UNSIGNED; { Veces que se ha retornado  }
                  { el i-ésimo elemento        }
    L : ^List_P;  { Puntero a la lista que se recorre }
  END;

2.b) [11 pts] Implemente el iterador.

 

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 © 2014
Derechos de autor reservados © 2014
[home] <> [/\]