Universidad de Costa Rica
|
|
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]
list& list::copy(const list& LO) { // *this = LO if (&LO == this) { // evita autocopia return *this; } while ( m_prm != 0 ) { // borra todo node *p = m_prm; m_prm = m_prm->next; delete p; } nodo *p = LO._prm; // copia while (p != 0) { push_back( p->_val ); p = p->next; } return *this; } // list::copy() |
1.a) [2 pts]
Dibuje el
modelo de la clase
list
.
1.b) [13 pts]
Implemente el
método
list::copy()
sin acceder al
Rep de list
. Use únicamente los
métodos públicos de list
. No use ni
operaciones, ni iteradores o
métodos
mutadores, ni
tampoco list::operator=(...)
.
1.c) [18 pts]
Implemente list::push_back()
sin acceder al
Rep. Puede copiar los valores de la lista. No use ni
operaciones, ni iteradores o
métodos
mutadores, ni tampoco
list::operator=(...)
.
1.d) [0 pts]
Explique qué ventaja se deriva de implementar los
métodos de list
sin acceder al Rep.
2) [33 pts] Las listas permiten trasladar grupos de los valores que contienen sin copiarlos, usando cirugía de punteros.
2.a) [6 pts]
Especifique en formato
"Doxygen" la
función
Splice()
para la lista, que sirve para trasladar
valores de una lista a otra usando cirugía de punteros.
2.b) [5 pts]
Especifique en formato
"Doxygen" la
operación L.Merge(LL)
que funciona
intercalando en orden los valores de "L" y "LL" cuando ambas
listas están ordenadas.
2.c) [22 pts]
Implemente L.Merge(LL)
. Utilice su
Splice()
para evitar accesar el
Rep de la
lista. Puede usar los métodos de la lista pero evite copiar
cualquiera de los valores que la lista contiene. Debe implementar
el algoritmo de intercalación.
2.d) [0 pts]
Especifique el método list::size()
que
retorna la cantidad de valores almacenados en la lista.
3) [33 pts] En un conjunto se pueden almacenar valores con la ventaja de que luego es posible constatar si el conjunto contiene o no contiene un valor específico. Además, el conjunto también tiene varias operaciones muy usadas en matemática.
3.a) [2 pts]
Dibuje el
modelo (diagrama)
para la clase Set
si en el
Rep se usa una
implementación
de listas.
3.b) [3 pts]
En el caso de una pila, las
operaciones que le caracterizan son Push()
y
Pop()
. Explique cuáles son las operaciones que
caracterizan a la clase Set
.
3.c) [5 pts]
Escriba las
declaraciones C++ para
la clase Set
. Incluya el
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> .
|
3.d) [10 pts]
Sobrecargue el operador "*
" e implemente la
intersección de conjuntos.
3.e) [7 pts]
Implemente en C++ la operación que sirve para cargar los
valores de Set
.
3.f) [6 pts]
Implemente los
constructores y
destructores
para la clase Set
.
4) [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.
4.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
".
4.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).
4.c) [3 pts]
Defina el
Rep para la
clase "CR_CED
".
4.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
4.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.
4.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>.
|