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

Examen #1 [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] 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
Figura 1

 

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:

//         [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
// V[]  = ( 1,  2,  4,  5,  6,  8 )                  V._n == 6
   V.Agregue(5);
// V[]  = ( 1,  2,  4,  5,  5,  6,  8 )              V._n == 7
   V.Aumente(2);
// V[]  = ( 0,  0,  1,  2,  4,  5,  6,  6,  8 )      V._n == 9
Figura 3a

      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.

class VectorSube {
    enum { Mx = 500 };   // Capacidad máxima del VectorSube
    float    _v[Mx];
    unsigned _n;          // qué tan lleno está _v[]
public:
    float operator[](unsigned i) { return _v[i]; }
    void  Agregue(float v);     // Intercala "v" en el vector
    void  Aumente(unsigned i);  // Le agrega "i" entradas al vector
}; // VectorSube
Figura 3b

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().

Soluciones

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