Examen de la asignatura TACC II

(Programación Orientada a Objetos)

Examen intermedio: 21/11/2003

    A) Problema de análisis y diseño

  1. Se desea desarrollar un sistema informático para las reservas de las instalaciones deportivas de una entidad. Las instalaciones pueden ser pistas, en cuyo caso el alquiler se hace por horas, y equipamientos, en cuyo caso el alquiler se hace por días. El sistema tiene que permitir realizar y modificar las reservas, efectuar los pagos y ocupar y desocupar las pistas o retirar y devolver los equipamientos. Los pagos se pueden hacer en metálico o con cargo a una cuenta.

    Se pide:

    1. Realizar un análisis estático del problema y plasmarlo en un diagrama de clases UML (3 puntos).
    2. Construir el diagrama de estados de las clases que lo requieran (2 puntos).

    B) Problemas de SMALLTALK

  2. Escribir los mínimos paréntesis necesarios en las expresiones siguientes para que su resultado sea el indicado (2 puntos).
  3. ¿Cuál es el resultado de las siguientes expresiones? Si alguna de ellas da error, corregirla con el número mínimo de cambios y decir cuál sería entonces el resultado (2 puntos).
  4. La operación "a nand b" se define así en seudocódigo: "not(a and b)". Implementarla, decir sobre qué clase(s) hay que definir el método y escribirlo en Smalltalk (1 punto).

Soluciones:

A) Problema de análisis y diseño

    1. También se puede utilizar una clase Pago, aunque no es estrictamente necesario. Igualmente, se puede sustituir la clase TipoInstalacion por dos subclases de Instalacion, denominadas Pista y Equipamiento, dando lugar a otra contestación igualmente correcta. Por último, algunos métodos pueden definirse en otra clase, como el método modifica de la clase Cliente, que se puede definir en la clase Reserva.

    2. Instalación tiene tres estados: Libre (estado inicial), reservada y ocupada.

      Transiciones:

      Libre -> Ocupada mediante Instalación.ocupa(…)

      Libre -> Reservada a la hora de la reserva

      Ocupada -> Libre mediante Instalación.desocupa(…)

      Ocupada -> Reservada mediante Instalación.desocupa(…)

      Reservada -> Libre a la hora en que caduca la reserva

      Reservada -> Ocupada mediante Instalación.ocupa()

      También se puede incluir un diagrama de estados en la clase Reserva que incluye el si está pendiente o si se está ocupando la instalación correspondiente, junto con el si se ha pagado o no. Pero esto no es estrictamente necenecesario, pues el mecanismo de pago podría ser el mismo para las ocupaciones de instalaciones con o sin reserva y entonces quedan solamente dos estados sin ningún ciclo entre ellos, por lo que se implementa directamente mediante la llamada a un método (Instalacion.ocupa).

    B) Problemas de SMALLTALK

  1. El método nand: puede definirse en las clases True y False así:
    Clase True:                 o bien:
            nand: aBool         nand: aBlock
            ^ aBool not         ^ aBlock value not
    Clase False:
            nand: aBool         nand: aBlock
            ^ true              ^ true
    
    o en la clase Boolean así:
    Clase Boolean:              o bien:
            nand: aBool         nand: aBlock
            ^(self&aBool)not    ^(self and: aBlock)not
    

Asignatura: Programación Orientada a Objetos











              1   2   3.1 3.2 4.1 4.2 TOTAL
              -----------------------------
CALIFICACION: |   |   |   |   |   |   |   |
              -----------------------------

Temas avanzados en Ciencias de la Computación II

Examen final (11/2/2004)
Las notas se harán públicas el miércoles 3 de marzo.
La revisión será el viernes 5 de marzo a las 15:00 en la sala de grados.

    Problema de análisis y diseño
    Hacia el final del curso, la Comisión de Ordenación Académica del Departamento de Informática determina las asignaturas disponibles en el curso siguiente. El Director del Departamento asigna tareas a los miembros de la plantilla de profesorado (a cada profesor se le asignan grupos de una o más asignaturas). Cada profesor es responsable de actualizar en la web del Departamento la parte de la ficha de las asignaturas asignadas que corresponde a su grupo.
    El profesor coordinador de una asignatura es responsable de actualizar la parte común de la ficha de la asignatura. Una vez todos los profesores que imparten una asignatura han actualizado su parte de la ficha, esta es publicada por el coordinador.
    Los estudiantes pueden matricularse en seis asignaturas de grado o en seis asignaturas de postgrado (solo los que hayan obtenido un título de grado), pero no pueden mezclar ambos tipos. A cada estudiante le aconseja un miembro de la plantilla que actúa como tutor.
    Una asignatura no se imparte si el número de estudiantes matriculados es menor que 5.

    Se pide:

  1. Construir el diagrama de clases UML del sistema descrito (2 puntos).
  2. Construir un diagrama de actividad de la preparación de la ficha de una asignatura (2 puntos).
  3. Problemas de Smalltalk
    1. Construir un método que, aplicado a una colección cualquiera, devuelva una colección de la misma clase, cuyos elementos sean el resultado de aplicar cierto bloque (pasado como parámetro) a todos los elementos de la primera colección. Decir en qué clase debe definirse (1,5 puntos).
    2. Los dos primeros términos de la serie de Fibonacci son iguales a 1. Los restantes son iguales a la suma de los dos anteriores. Implementar un método que devuelva el elemento n de la serie de Fibonacci. Decir en qué clase debe definirse. Escribir una instrucción que calcule los 10 primeros términos de la serie, utilizando el método desarrollado en el ejercicio anterior (1,5 puntos).
  4. Problemas de C++
    1. Indicar posibles formas de corregir los errores del siguiente programa, sin eliminar ninguna de las clases ni métodos en él definidos, y decir qué haría, al ejecutarse, el programa corregido para cada una de las correcciones propuestas (1.5 puntos).
      #include <iostream.h>
      class A {
        public:
              char *name;
              static void print() { cout << name; }
              void f();
      };
      
      class B : public A {
        public:
              char *type;
              static void print() {
                cout << type << " ";
                A::print();
              }
              void f() { cout << " II"; }
      };
      
      void main() {
              B b;
              b.name = "Queen Mary";
              b.type = "Boat";
              A *ap = &b;
              ap->print();
              ap->f();
      }
      
    2. Implementar una plantilla de función, cuyos parámetros sean las clases C y D, con el siguiente prototipo:
              D *aplica(C *cp, int n)
      
      que, a partir de un array de n o más elementos de la clase C, construye otro array formado por n elementos de la clase D, que son los valores que devuelve la función:
              D f(C c)
      
      al ejecutarse consecutivamente sobre los n primeros elementos del array (1.5 puntos).

Soluciones: