Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
II Semestre 2012
[<=] [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 todas las preguntas. ¡No haga más de lo que se le pide!

 

1) [33 pts] A diferencia de las listas del lenguaje lisp, las listas C++ no permiten obtener fácilmente una sublista, pues están definidas como secuencias de valores y no como una cabeza que viene seguida de una cola que también es una lista. La ventaja de las listas C++ es que sí tienen iteradores que permiten marcar pedazos de cualquiera de los contenedores construidos de acuerdo a los lineamientos de la biblioteca estándar, pues se pueden usar 2 iteradores para definir el rango que cubre una sublista.

1.a) [11 pts] Defina el Rep para la clase subrange que permite definir un rango de valores para cualquier contenedor C++, especialmente para los de la biblioteca STL. Incluya la implementación de la función que verifica la invariante de la clase.

1.b) [11 pts] Escriba la parte de la especificación de la clase subrange en los que muestre los inconvenientes que hay que enfrentar cuando se usan contenedores mutables. Incluya datos de prueba BUnit en el formato Doxygen.

1.c) [11 pts] Implemente sendas funciones que permitan usar su clase subrange para ordenar una secuencia y para eliminarle algún valor. Use los algoritmos STL en su implementación.

 

2) [33 pts] Especifique e implemente un iterador que recorre el perímetro de cualquier sección rectangular definida dentro de una matriz. Por ejemplo, debe servir para recorrer la parte marcadas con 8's de estas matrices de caracteres (sin pasar por ninguno de los '.'). Incluya datos de prueba BUnit.h. Suponga que la matriz incluye una sobrecarga de operator()(i,j).

. . . . . . .
. . 8 8 8 8 8    8 8 8 8 8 8 .
. . 8 . . . 8    8 8 8 8 8 8 .    . . . 8 8 8 .
. . 8 . . . 8    . . . . . . .
. . 8 8 8 8 8

 

3) [33 pts] El problema con los número de cédula en Costa Rica es que la gente no les pone todos los ceros que deben. Por ejemplo, la gente escribe la cédula "2-0320-0028" de muchas formas diferentes (y algunas son incorrectas):
2-0320-0028    02-0320-0028     02320028
2-320-0028     0203200028       020320028
2-0320-028     02-0320-0028     0203228
2-0320-28      2-32028          0232028
2-320-28       02032028         etc.

      El primer dígito de la cédula indica la provincia, y luego siguen 2 números de hasta 4 dígitos. El problema se da cuando al escribir el número de cédula la gente omite los ceros que deben aparecer al principio de alguno de los 2 números de 4 dígitos que contiene el número de cédula, también cuando quedan pegados los números y no se sabe adónde comienza el primer grupo de números y adónde está el segundo.

3.a) [0 pts] Dibuje el modelo para la clase "CR_CED" que sirve para almacenar de una forma eficiente los números de cédula. Use una variable de 32 bits, de tipo "long", para almacenar en binario cada cédula. Discuta cuáles operaciones son importantes para esta clase. No olvide que esta clase se usará para lidiar con números de cédula "mal escritos", aunque sí es necesario asumir que los números tienen un máximo de 10 dígitos. Recuerde que la forma correcta del número de cédula tiene 2 guiones, en donde los 2 últimos grupos de dígitos se escriben con 4 dígitos: "2-0320-0028".

3.b) [0 pts] Escriba el archivo de encabezado completo con la especificación en formato "Doxygen" y el Rep para la clase "CR_CED". Incluya un método que sirva para generar todas las cédulas en que un número binario de cédula específico puede ser escrito correctamente (con o sin guiones). No olvide tomar en cuenta cuáles caracteres pueden ser usados para separar las partes de un número de cédula, por ejemplo "-", "." " " (espacio en blanco), "" (sin caracter separador).

3.c) [3 pts] Defina el Rep para la clase "CR_CED".

3.d) [10 pts] Especifique e implemente el método estático "CR_CED::Genera()" que recibe un número binario que corresponde a un número de cédula correcto y lo usa para generar todas las cédulas que pueden corresponden a ese número. Por ejemplo, al aplicarle "CR_CED::Genera()" al valor numérico 2,032,028, si se usan como separadores los caracteres "-" y ".", los valores generados son estos:

Separador '-' Separador '.'
 2-0032-0028    2-0032-0028 
 2-0032-028     2-032-0028
 2-0032-28      2-32-0028
 2.0032.0028    2.0032.0028 
 2.0032.028     2.032.0028
 2.0032.28      2.32.0028

3.e) [10 pts] Especifique e implemente un método complementario para "CR_CED::Genera()", que use como entrada valores que similares a los que "CR_CED::Genera()" produce.

3.f) [10 pts] Especifique e implemente su programa "CR_Cedula.cpp"que reciba varios números de cédula y determine cuáles de ellos corresponden a la misma cédula. Use adecuadamente el formato "Doxygen" para documentación. Puede usar cualquier módulo de la biblioteca STL pero debe usar su método "CR_CED::Genera()" y/o el método complementario que usted creó. Permita que los números de cédula estén escritos de varias maneras diferentes.

 

Soluciones

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