Examen final de la asignatura Programación Orientada a Objetos

4/9/97:

    A) Problemas de análisis y diseño

  1. Señalar el tipo de relación que existe entre las siguientes clases de objetos (1 punto):
                            Herencia  Agregación  Asociación
    PADRE->HIJO
    COCHE->RUEDA
    ARCHIVO->DIRECTORIO
    ARCHIVO->REGISTRO
    POLIGONO->PARALELOGRAMO
    PROGRAMADOR->PROGRAMA
    LINEA TELEFONICA->MODEM
    OBJETO->METODO
    RIO->MAR
    POLIGONO->COLOR
    
  2. Una bañera tiene una palanca que controla si el agua sale por el grifo o por la ducha. Al abrir el paso del agua, ésta sale siempre por el grifo. Al subir la palanca, el agua sale por la ducha. Al bajar la palanca, el agua vuelve a salir por el grifo. Siempre que el paso del agua esté cerrado, la palanca baja automáticamente. Escribir el escenario de una ducha interrumpida por una llamada telefónica y el diagrama de estados de la bañera. (2 puntos).

    B) Problemas de SMALLTALK

  3. ¿Cuál es el resultado del siguiente programa SMALLTALK? (1 puntos).
    |lo hi|
    lo:=1.
    hi:=1.
    lo printOn: Transcript.
    Transcript cr.
    2 to: 9 do: [:i|hi printOn: Transcript.Transcript cr. hi:=hi+lo. lo:=hi-lo]
    
  4. Escribir una instrucción Smalltalk que cree una variable global llamada Var y le asigne el valor 3 (1 punto).

    C) Problemas de JAVA

  5. Explicar cómo se define una constante con nombre en JAVA (1 punto).
  6. ¿Cuál es el resultado de la ejecución del siguiente programa JAVA? (2 puntos).
            class Funcion {
              public static void main(String[] args) {
                int menor = 1;
                int mayor = 1;
                String marca;
                System.out.println("1: " + menor);
                for (int i=2; i<10; i++) {
                  if (mayor%2==0) marca = "*";
                  else marca = "";
                  System.out.println(i + ": " + mayor + marca);
                  mayor = mayor + menor;
                  menor = mayor - menor;
                  }
                }
              }
    

    D) Problema de C++

  7. Construir un "template" de clases de colas y utilizarlo para construir una cola de números enteros cortos y otra de reales en doble precisión. Cada cola aceptará los métodos de costumbre: push, pop, isEmpty (2 puntos).

Soluciones:

  1.                         Herencia  Agregación  Asociación
    PADRE->HIJO                                       X
    COCHE->RUEDA                          X
    ARCHIVO->DIRECTORIO        X
    ARCHIVO->REGISTRO                     X
    POLIGONO->PARALELOGRAMO    X
    PROGRAMADOR->PROGRAMA                             X
    LINEA TELEFONICA->MODEM                           X
    OBJETO->METODO                        X
    RIO->MAR                                          X
    POLIGONO->COLOR                       X          (X)
    
  2. Escenario (entre otros posibles):

        Estados: ACPB: Agua cerrada, palanca baja
                 AAPB: Agua abierta, palanca baja
                 AAPA: Agua abierta, palanca alta
        Eventos de entrada: A: usuario cambia la posición del paso del agua
                            P: usuario cambia la posición de la palanca
        Diagrama de transición:
                    A       P
         ACPB       AAPB    ACPB
         AAPB       ACPB    AAPA
         AAPA       ACPB    AAPB
    
  3. 1
    1
    2
    3
    5
    8
    13
    21
    34
    

    (Los nueve primeros términos de la serie de Fibonacci).

  4. Smalltalk at: #Var put: 3.
  5. Primera pregunta de JAVA: declarándola "final".
  6. Resultado de la ejecución del segundo programa JAVA:
    1: 1
    2: 1
    3: 2*
    4: 3
    5: 5
    6: 8*
    7: 13
    8: 21
    9: 34*
    

    (Los nueve primeros términos de la serie de Fibonacci, con los pares marcados con un asterisco).

  7. Template C++ (una solución válida):
        enum boolean {false=0, true};
        const int QUEUE_EMPTY = -1;
        template <class T> class Queue {
            T *elements;
            int size, top;
          public:
            Queue (int size) {
              this->size = size;
              elements = new T[size];
              top = QUEUE_EMPTY;
              }
            ~Queue () {
              delete elements;
              }
            boolean isEmpty() {
              return (top==QUEUE_EMPTY) ? true : false;
              }
            boolean pop(T &el) {
              if (top==QUEUE_EMPTY) return false;
              el = elements[0];
              memcpy (elements, elements+1, top*sizeof(T));
              top--;
              return true;
              }
            boolean push(T el) {
              if (top==size-1) return false;
              elements[++top] = el;
              return true;
              }
            }
        void main () {
            Queue<short> ss(10);
            Queue<double> ds(10);
            ss.push(5);
            ds.push(5.5);
            // ...
            }