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

Examen #3 [solución]

      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>.
  • 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) [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.

 

Soluciones

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