Examen final de la asignatura Programación Orientada a Objetos

15/2/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
    PAIS->CAPITAL
    COMENSAL->TENEDOR
    ARCHIVO->DIRECTORIO
    ARCHIVO->REGISTRO
    POLIGONO->VERTICE
    PROGRAMADOR->LENGUAJE
    I/O DEVICE->MODEM
    OBJETO->ATRIBUTO
    CARRETERA->CIUDAD
    POLIGONO->PENTAGONO
    
  2. Un hombre tiene que trasladar un lobo, una oveja y una col al otro lado de un río. En la barca sólo caben el hombre y uno de los tres objetos. No se puede dejar a la oveja sola con la col ni al lobo con la oveja. Preparar dos escenarios: uno en el que todos los objetos son transportados a salvo al otro lado del río, y otro en el que uno de los objetos es devorado por otro (1 punto).
  3. Un reloj digital tiene una pantalla y dos botones A y B. El reloj funciona en tres modos de operación: ver la hora, ajustar la hora y ajustar los minutos. El botón A pasa circularmente de un modo al siguiente. En el primer modo, la pantalla muestra la hora y los minutos separados por dos puntos parpadeantes. En el segundo, cada vez que se pulse el botón B, la hora avanza. En el tercero, cada vez que se pulsa el botón B, el minuto avanza. Si se pulsa un botón, es preciso soltarlo para que pueda producirse otro evento. Dibujar un diagrama de estados del reloj (1 punto).

    B) Problemas de SMALLTALK

  4. ¿Cuál es el resultado de las siguientes instrucciones de SMALLTALK? (1 punto).
    a)  'a'+6
    b)  Set new add: 'HOLA'; add: 'ADIOS'; size; yourself
    c)  |x| x:=0. #(1 2 3 4) do: [:i|x:=x+i]. ^x
    
  5. ¿Dónde hay que colocar los paréntesis en las siguientes instrucciones SMALLTALK para que el resultado sea el indicado? (1 punto).
    a)  3+4*5- 3\\8
        Resultado: 0
    b)  Transcript show: OrderedCollection with: 'abcd' with: 'mnop' at: 2
        Resultado: en la ventana Transcript aparece 'mnop'
    c)  1+ Array new size + #(1 2 3 4) size * 5 + String with: $a with: $b size
        Resultado: 35
    

    C) Problemas de JAVA

  6. Explicar la sintaxis y el funcionamiento de la siguiente clase JAVA, señalando los errores, si los hay (1 punto).
            class Stack {
              static final int STACK_EMPTY = -1;
              Object[] elements;
              int top = STACK_EMPTY;
              boolean isEmpty() {
                if (top==STACK_EMPTY) return true;
                else return false;
                }
              Object pop() {
                if (top==STACK_EMPTY) return null;
                else return elements[top--];
                }
              void push(Object o) {
                elements[++top] = o;
                }
              }
    
  7. ¿Cuál es el resultado de la ejecución del siguiente programa JAVA? (1 punto).
            class Tonta {
              boolean v;
              void set() {
                v = true;
                }
              public static void main(String[] args) {
                MasTonta o = new MasTonta();
                o.set();
                }
              }
            class MasTonta extends Tonta {
              boolean v;
              void set() {
                v = false;
                super.set();
                System.out.println(v);
                System.out.println(super.v);
                }
              }
    

    D) Problemas de C++

  8. Explicar el funcionamiento y resultado del siguiente programa C++ (1 punto):
        class Integer {
            int value;
          public:
            Integer (int v) {value=v;}
            int function (int n) {
              Integer c((value<n) ? n : value);
              Integer d((value<n) ? value : n);
              return (c.value%d.value==0) ? d.value : d.function(c.value%d.value);
              }
            };
        void main (int argc, char **argv) {
            if (argc==3) {
              Integer a(atoi(argv[1]));
              printf ("El resultado es %d\n", a.function(atoi(argv[2])));
              }
            else printf ("Número de argumentos inválido\n");
            }
    
  9. Construir un "template" de clases de pilas y utilizarlo para construir una pila de números enteros cortos y otra de reales en doble precisión. Cada pila aceptará los métodos de costumbre: push, pop, isEmpty (2 puntos).

Soluciones:

  1.                         Herencia  Agregación  Asociación
    PAIS->CAPITAL                         X
    COMENSAL->TENEDOR                                 X
    ARCHIVO->DIRECTORIO        X
    ARCHIVO->REGISTRO                     X
    POLIGONO->VERTICE                     X
    PROGRAMADOR->LENGUAJE                             X
    I/O DEVICE->MODEM          X
    OBJETO->ATRIBUTO                      X
    CARRETERA->CIUDAD                                 X
    POLIGONO->PENTAGONO        X
    
  2. Escenario 1 (sólo hay dos mínimos posibles):

    Escenario 2 (ejemplo):

  3. En su forma más simple:
        Estados: V: Ver hora, H: Ajustar hora, M: Ajustar minuto.
        Eventos de entrada: pulsar botón A, pulsar botón B.
        Diagrama de transición:
                    A       B
            V       H       V
            H       M       H
            M       V       M
        Acciones asociadas a transiciones:
          Casilla H-B: avanzar la hora.
          Casilla M-B: avanzar el minuto.
    
  4. a)  Error.
    b)  Un conjunto de Strings con los elementos 'HOLA' y 'ADIOS'.
    c)  10.
    
  5. a)  3+4*5- 3\\8
    b)  Transcript show: ((OrderedCollection with: 'abcd' with: 'mnop') at: 2)
    c)  1+ Array new size + #(1 2 3 4) size * (5 + (String with: $a with: $b) size)
    
  6. Primer problema de JAVA: el único error es que el atributo "elements" no se ha inicializado. Habría que añadir un atributo y un constructor como éstos:
        int size;
        Stack(int size) {
            this.size = size;
            elements = new Object[size];
            }
    

    y en push habría que comprobar que no rebosa la pila, devolviendo quizá un código de retorno.

  7. Resultado de la ejecución del segundo programa JAVA:
    false
    true
    
  8. El primer programa C++ calcula el máximo común divisor de sus dos argumentos.
  9. Template C++ (una solución válida):
        enum boolean {false=0, true};
        const int STACK_EMPTY = -1;
        template <class T> class Stack {
            T *elements;
            int size, top;
          public:
            Stack (int size) {
              this->size = size;
              elements = new T[size];
              top = STACK_EMPTY;
              }
            ~Stack () {
              delete elements;
              }
            boolean isEmpty() {
              return (top==STACK_EMPTY) ? true : false;
              }
            boolean pop(T &el) {
              if (top==STACK_EMPTY) return false;
              el = elements[top--];
              return true;
              }
            boolean push(T el) {
              if (top==size-1) return false;
              elements[++top] = el;
              return true;
              }
            }
        void main () {
            Stack<short> ss(10);
            Stack<double> ds(10);
            ss.push(5);
            ds.push(5.5);
            // ...
            }