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