Segundo examen intermedio de la asignatura Programación Orientada a Objetos

17/12/97:

  1. Considérese el siguiente escenario, aplicable a un tren eléctrico de juguete:
    1. Motor desconectado, tren parado, faro apagado.
    2. Motor conectado, tren se mueve hacia adelante, faro encendido.
    3. Motor desconectado, tren parado, faro apagado.
    4. Motor conectado, tren parado, faro encendido.
    5. Motor desconectado, tren parado, faro apagado.
    6. Motor conectado, tren se mueve hacia atrás, faro encendido.
    7. Motor desconectado, tren parado, faro apagado.
    8. Motor conectado, tren parado, faro encendido.
    9. Motor desconectado, tren parado, faro apagado.
    10. Motor conectado, tren se mueve hacia adelante, faro encendido.

    Se pide:

    1. Dibujar el diagrama de estados del faro (2 puntos).
    2. Dibujar el diagrama de estados de las ruedas (2 puntos).
    3. Escribir una secuencia de entradas para que el tren marche hacia adelante durante algún tiempo, se pare en una estación durante algún tiempo y salga de ella marchando hacia adelante (1 punto).
  2. Escribir el número mínimo de paréntesis para que las siguientes instrucciones Smalltalk tengan resultado true (5 puntos):
    1. 2 + 3 * 4 / 5 - 4 = 0
    2. #(1 2 3 4) size + Array new: 10 size / 2 = 9
    3. 30 = 3 * 4 + 12 gcd: 24 - 2 * 3
    4. 3 = 3 < #(1 2 3 4) at: 3 ifTrue: [2 + 'abcd' size] ifFalse: [#(1 2) "+ mnop" size] + 1
    5. CwTextPrompter new messageString: 'escribe un número'; prompt size >= 0

    Donde gcd: es un método definido para la clase Integer que devuelve el máximo común divisor del objeto que recibe el mensaje y su argumento.

Soluciones:

    1.                    C
              Apagado ------> Encendido
                      <------
                         D
      

      Donde C significa "conectar el motor" y D "desconectarlo" (eventos). Si se utilizan como entradas los estados del motor (encendido/apagado) hay que añadir bucles.

    2.            D               C               D              C
                ->-             ->-             ->-            ->-
               |   |    C      |   |     D     |   |    C     |   |
              Paradas ------> Adelante -----> Paradas ------> Paradas
                 ^                                              | D
               D |                                              v
              Paradas <------ Paradas <------ Atrás <-------- Paradas
               |   |    C      |   |     D     |   |    C     |   |
                ->-             ->-             ->-            ->-
                 C               D               C              D
      

      Donde C significa "motor conectado" y D "motor desconectado". Si se utilizan como entradas los eventos en lugar de los estados del motor ("conectar" y "desconectar", como en el ejemplo anterior) se puede prescindir de los bucles.

    3. CCCCCCDDDDDCDCDCDCCCCCC
    1. 2 + 3 * 4 / 5 - 4 = 0
    2. #(1 2 3 4) size + ((Array new: 10) size / 2) = 9
    3. 30 = (3 * (4 + (12 gcd: 24 - 2 * 3)))
    4. 3= ((3 < (#(1 2 3 4) at: 3) ifTrue: [2 + 'abcd' size] ifFalse: [#(1 2) "+ mnop" size]) + 1)
    5. (CwTextPrompter new messageString: 'escribe un número'; prompt) size >= 0