Universidad de Costa Rica
|
|
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.
Adolfo Di Mare <adolfo@di-mare.com>.
|