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]
Escriba un programa que lea números y cuente la cantidad de
veces que cada número aparece. Al terminar de leer, su
programa deberá listar cuáles números fueron
leídos junto a la cantidad de veces que cada uno aparece (o
sea, que su programa debe contar la cantidad de repeticiones). Use
la clase Bolsa
cuya definición parcial
está en la
Figura 1.
class Bolsa {
public:
int Esta(int i); // # de veces que "i" Está() en la Bolsa
void Agrega(int i); // incrementa "Esta(i)"
// ...
}; // Bolsa
2) [33 pts] La clase
Rebotador
ha sido creado para que, dentro de
una matriz rectangular [N*M]
, uno de sus elementos
recorra en diagonal las entradas, pero rebotando cuando se alcanza
alguna de las paredes, como se muestra a continuación:
+-------------+ class Matriz { | /\ /\| enum { DIM = 25 }; | /3 \ / /| char m_MAT[DIM][DIM]; | /2 \ / / | int m_N,m_M; // dimensiones actuales |/1 \/ /n | friend class Rebotador; +-------------+ }; // Matriz class Rebotador { int m_dir; // '\ /' ./ \. enum { NO= -1, NE= +1, SO= +2, SE= -2 }; int m_x, m_y; public: void Paso(Matriz& M, int& x, int& y, char& ch); }; // Rebotador |
2.a) [7 pts] Explique para qué sirve cada uno de
los campos del
Rep de
Rebotador
(en el ejemplo se ha comenzado desde la
esquina inferior izquierda).
2.b) [7 pts] Haga la
especificación de Rebotador::Paso()
. Tome
en cuenta que, antes de terminar, Rebotador::Paso()
siempre ejecuta esta instrucción:
M.m_MAT[x][y] = ch;
Suponga que, en cada invocación,
Rebotador::Paso()
avanza un paso nada más.
2.c) [19 pts]
Implemente Rebotador::Paso()
.
3) [33 pts]
La clase VectorSube
sirve para mantener ordenado un
vector de números reales positivos, con la ventaja
adicional de que la cantidad de elementos del vector puede
incrementarse. Por ejemplo, si el vector "V[]
" ya
tiene llenos 6
elementos, y se le agrega el valor
"5
", el vector aumenta en uno su tamaño pero
mantiene todos los valores ordenados:
Además, es posible aumentar la cantidad de elementos del
vector usando el método VectorSube::Aumente()
,
que lo que hace es poner ceros en las posiciones iniciales del
vector, pues cero es el valor mínimo que puede estar
almacenado en el vector.
3.a) [11 pts] Especifique la clase
VectorSube
. También incluya la
especificación de al menos un
constructor.
3.b) [7 pts] Especifique VectorSube::Agregue()
.
3.c) [8 pts] Implemente VectorSube::Agregue()
.
3.d) [7 pts] Implemente
VectorSube::Aumente()
.
Evite invocar VectorSube::Agregue()
en su implementación.
4) [33 pts]
Especifique la clase Lista
, de manera que pueda luego
implementar el método (o función)
Intercale()
, para intercalar dos a dos los valores de
dos listas. Por ejemplo, de las listas
"(a, b, c, d, e)
" y
"(x, y, z)
" se obtendría
"(a, x, b, y, c, z, d, e)
".
Su lista debe estar implementada usando
punteros.
4.a) [7 pts] Especifique minimalmente la clase
Lista
.
4.b) [8 pts] Especifique Intercale()
.
4.c) [18 pts] Implemente Intercale()
.
Adolfo Di Mare <adolfo@di-mare.com>.
|