Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2001
[<=] [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] Haga un programa C++ que lea un archivo y cuente, para cada letra del alfabeto, la cantidad de letras mayúsculas, minúsculas y números e imprima los totales. Recuerde que, en Costa Rica, la pareja "CH" es una letra, y que también el alfabeto incluye a la letra "Ñ". (Sugerencia: use como base las clases que usted implementó en la tarea programada, en cuyo caso únicamente ponga la declaración de la clase y la declaración de los métodos que use en su implementación).

 

2) [33 pts] Considere la clase lista cuyo modelo (diagrama) aparece en la figura de abajo.

 L ──>─┐
       │
       v
┌────────┬───┐   ┌────────┬───┐   ┌────────┬───┐
│ elem_1 │ *─┼──>│ elem_2 │ *─┼──>│ elem_3 │ *─┼─> NIL
└────────┴───┘   └────────┴───┘   └────────┴───┘

2.a) [7 pts] Haga las declaración para la clase lista. Incluya en el Rep apenas lo suficiente para implementar la operación lista::K_pase(L, k).

2.b) [7 pts] Especifique la operación lista::K_pase(L, k), que traslada de la lista todos los valores que está en una posición múltiplo de k, y los deja en la lista L. Evite copiar los nodos al trasladarlos de lista.

2.c) [19 pts] Implemente lista::K_pase(L, k).

2.d) [0 pts] Explique qué es la cirugía de punteros.

 

3) [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

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

3.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.

3.c) [19 pts] Implemente Rebotador::Paso().

 

4) [33 pts]

4.a) [10 pts] Escriba la declaración de la clase Binario que tiene las operaciones aritméticas básicas para manejar números binarios sin signo. Use un vector de longitud arbitraria (pero fija) para almacenar los bits del número binario.

4.b) [5 pts] Especifique opertor+() para la clase Binario.

4.c) [18 pts] Implemente opertor+() para la clase Binario (si lo necesita, cambie el Rep de su clase para que le sea más cómodo escribir su implementación).

Soluciones

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