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

Examen #2 [solución]

      Duración: dos horas. Lea bien el examen antes de hacerlo. 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]

Lista& Lista::copy(const Lista& LO) { // *this = LO
    if (&LO == this) { // evita autocopia
        return *this;
    }

    while ( _prm != 0 ) {    // borra todo
        nodo *p = _prm;
        _prm = _prm->next;
        delete p;
    }

    nodo *p = LO._prm;       // copia
    while (p != 0) {
        push_back( p->_val );
        p = p->next;
    }
    return *this;
} // Lista::copy()

1.a) [2 pts] Dibuje el modelo de la clase Lista.

1.b) [14 pts] Implemente el método Lista::copy() sin acceder al Rep de Lista. Use únicamente los métodos públicos de Lista.

1.c) [14 pts] Implemente Lista::push_front() sin acceder al Rep. Puede copiar los valores de la lista, o la lista completa si lo desea.

1.d) [3 pts] Explique qué ventaja se deriva de implementar los métodos de Lista sin acceder al Rep.

 

2) [33 pts]

char* strcpy (char *dst, const char *src);
/*  resultado
    Copia la hilera "src" sobre "dst"
    - Termina cuando copia el caracter de fin de hilera '\0'
*/
/*  requiere
    "dst" debe ser suficientemente grande
*/

2.a) [14 pts] Haga los casos y datos de prueba de caja negra para la función strcpy().

2.b) [5 pts] Implemente strcpy(). Debe usar aritmética de punteros.

2.c) [14 pts] Haga los casos y datos de prueba de caja blanca para la función strcpy().

 

3) [33 pts] El método de ordenamiento de la burbuja intercambia valores en un vector hasta que todo queda ordenado.

A[0].key =  -∞;
for (i=2; i<n; ++i) {
     j = i;
     while (A[j] < A[j-1]) {
         swap(A[j], A[j-1]);
         j = j-1
     }
}
void ADH_list::swap(ADH_list& L) {
/*  resultado
    Intercambia *this <==> L
*/
    nodo *tmp = L._prm;
    L._prm = _prm;
    _prm = tmp;
}

3.a) [7 pts] Especifique el método Lista::Ordena_Burbuja() para la clase Lista.

3.b) [26 pts] Implemente Lista::Ordena_Burbuja(). Use únicamente los métodos de la lista que fueron definidos como públicos en la tercera tarea programada, evitando de esta forma acceder al Rep de la lista [operator=(), push_front(), push_back(), pop_front(), pop_back(), empty(), first()]. No hace falta que su solución sea eficiente, por lo que puede usar varias listas temporales para hacer su trabajo. También puede copiar los valores de la lista.

 

4) [33 pts] Una manera de lograr que un contenedor sea polimórfico es derivar el objeto contenido de una clase base común, Chunche.

4.a) [4 pts] Declare la clase Chunche que tiene algunas de las operaciones básicas de una clase.

4.b) [3 pts] Dibuje la jerarquía de chunches que usted almacenará en la lista porlimórfica: puntos, cuadrados, círculos, autos, casas, animales, perros y gatos.

4.c) [3 pts] Los nodos de una la lista polimórfica ListaPoli contienen dos punteros: el puntero "next" hacia el siguiente nodo, y un puntero al Chunche que corresponde al nodo. Dibuje el modelo de la clase ListaPoli.

4.d) [8 pts] Escriba la declaración del Rep de ListaPoli, de su nodo y de su iterador. Para el iterador ListaPoli::iterador use un Rep que contenga únicamente un puntero hacia el nodo.

4.e) [4 pts] Implemente los dos operadores de incremento del iterador.

4.f) [4 pts] Implemente el operador de derreferencia de ListaPoli::iterador.

4.g) [7 pts] Suponga que en la clase Chunche usted definió el método virtual Grabe(iostream &). Úselo para implementar una operación que graba toda la lista. No puede acceder al Rep de la lista.

Soluciones

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