# Asignatura: Programación Orientada a Objetos

                  1.1 1.2 2.1 2.2 2.3 2.4 3.1 3.2 TOTAL
                  -------------------------------------
    CALIFICACION: |   |   |   |   |   |   |   |   |   |
                  -------------------------------------

(Temas avanzados en Ciencias de la Computación II) Examen final (30/1/2002)

1. Problema de análisis y diseño

   Se desea diseñar un sistema de gestión de matrículas y personal docente para las Universidades de una Comunidad Autónoma. Desde el punto de vista de la matrícula, una Universidad puede considerarse como un conjunto de estudiantes, a cada uno de los cuales se le asignará un número de identificación personal. Los estudiantes podrán asistir a cierto número de cursos, cada uno de los cuales será impartido por un profesor. Desde el punto de vista del personal docente, la Universidad se divide en departamentos, cada uno de los cuales estará formado por varios profesores, uno de los cuales actuará como director del departamento. Cada profesor sólo podrá pertenecer a un departamento. Los departamentos tienen la responsabilidad de impartir uno o más cursos. El sistema permitirá añadir o borrar estudiantes, departamentos y profesores, así como realizar consultas sobre cada uno de estos estamentos.

   Se pide:

   1. Construir un diagrama de clases UML de la aplicación (2 puntos).
   2. Diseñar la estructura de una base de datos relacional que permita guardar la información persistente de la aplicación (2 puntos).
2. Problemas de Smalltalk
   1. Implementar el método sortblock: en sus dos versiones (de clase y de objeto). Decir sobre qué clase(s) hay que definirlos y a qué clase(s) queda asignado (0,8 puntos).
   2. Corregir los posibles errores en las expresiones siguientes y decir qué resultado darían (0,5 puntos).

          a)  |x| x:=Set new add: 'HOLA' add: 'ADIOS'; size; x
          b)  |x| x:=0. #(#(1) #(2 3) #(4)) do: [:i|x:=x+i size]. x

   3. ¿Dónde hay que colocar los paréntesis en las siguientes instrucciones para que el resultado sea el indicado? (1,2 puntos).

          a)  3+4*5- 3\\8
              Resultado: 0
          b)  OrderedCollection with: 'abcd' with: 'mnop' at: 2 at: 2
              Resultado: $n
          c)  1+ Array new size + #(1 2 3 4) size * 5 + String with: $a with: $b size
              Resultado: 35

   4. Escribir una instrucción Smalltalk que cree una variable global llamada Nombre y le asigne como valor el nombre del alumno (0,5 puntos).
3. Problemas de C++
   1. Corregir los posibles errores en el siguiente programa y decir qué resultado daría (1 punto).

          #include <iostream.h>

          class A {
          private:
            int valor;
          public:
            A (int v=0) : v(valor) {}
            void f(A *a, int v=99) { a->valor=v; }
            int getvalor () { return valor; }
          };

          void main()
          {
            A *obj1;
            obj1 = new A;

            A obj2(9);

            obj2.f(obj1);
            cout << obj1->getvalor() << endl;
            cout << obj2->getvalor() << endl;
          }

   2. Implementar un conjunto de pilas de diversos tipos que contengan, como mínimo, los métodos push y pop. Estos métodos deben ser capaces de lanzar las excepciones correspondientes. Escribir un programa principal que cree una pila de enteros y atrape las excepciones que puedan producirse (2 puntos).

## Soluciones:

- 1.1
- 1.2
  Tabla (Universidad): Campos (idUniv:Número, nombre:Nombre, dirección:String, teléfono:Número)
  Tabla (Departamento): Campos (idDepar:Número, nombre:Nombre, idUniv:Número, director(idProf):Número)
  Tabla (Estudiante): Campos (nombre:Nombre, idEst:Número, idUniv:Número)
  Tabla (Curso): Campos (nombre:Nombre, idCur:Número, idDepar:Número)
  Tabla (Profesor): Campos (idProf:Número, nombre:Nombre, idDepar:Número)
  Tabla (asiste): Campos (idEst:Número, idCur:Número)
  Tabla (enseña): Campos (idProf:Número, idCur:Número)
- 2.1. Ambos métodos se definen sobre la clase SortedCollection. El de objeto queda asignado a dicha clase, el de clase a su metaclase.

      sortblock: aBlock
         "Método de clase"
         |x|
         x := self new.
         x sortblock: aBlock.
         ^x

      sortblock: aBlock
         "Método de objeto"
         sortblock := aBlock.

- 2.2.

      a)  |x| (x:=Set new) add: 'HOLA'; add: 'ADIOS'; size. x
              ^          ^            ^                   ^
          Resultado: un Set con los dos String 'HOLA' y 'ADIOS'.
      o bien:
          |x| x:=Set new add: 'HOLA'; add: 'ADIOS'; size. x
                                    ^                   ^
          Resultado: 2.
      (Hay otras soluciones).
      c)  No hay errores. Resultado: 4.

- 2.3.

      a)  3+4*5- 3\\8
      b)  ((OrderedCollection with: 'abcd' with: 'mnop') at: 2) at: 2
      c)  1+ Array new size + #(1 2 3 4) size * (5 + (String with: $a with: $b) size)

- 2.4.
  Smalltalk at: #Nombre put: 'xxx yyy' (donde xxx yyy es el nombre del alumno).
- 3.1.
  Errores:

        Dice                         Debe decir
        -------------------------    -------------------------
        A (int v=0) : v(valor) {}    A (int v=0) : valor(v) {}
        obj2->getvalor()             obj2.getvalor()
        (al final de main)           delete obj1;

  Resultado:

      99
      9

- 3.2.

      #include <iostream.h>
        class PilaLlena {};
        class PilaVacia {};
        template <class C>
          class Pila {
          C *datos;
          int size;
          int llenos;
        public:
          Pila (int n) {
            llenos = 0;
            size = n;
            datos = new C[n];
          }
          ~Pila () { delete[]datos; }
          void push (C dato) throw (PilaLlena) {
            if (llenos==size) throw PilaLlena();
            datos[llenos++] = dato;
          }
          C pop () throw (PilaVacia) {
            if (llenos==0) throw PilaVacia();
            return datos[--llenos];
          }
        };
        void main () {
          Pila<int> p(3);
          try {
            p.push(5);
            p.push(6);
            p.push(7);
            p.push(8); // Lanza la excepción PilaLlena
            cout << p.pop();
            cout << p.pop();
            cout << p.pop();
            cout << p.pop(); // Sin push(8), lanza la excepción PilaVacia
          } catch (PilaLlena p) {
              cout << "La pila ha rebosado" << eol;
          } catch (PilaVacia p) {
              cout << "La pila estaba vacía" << eol;
          }
        }