Examen final de la asignatura Programación Orientada a Objetos

17/2/97:

    A) Problemas de análisis y diseño

  1. Se va a construir un editor de diagramas. Cada diagrama se almacenará como un archivo ASCII y constará de una o más hojas, cada una de las cuales contiene cajas y enlaces. Cada caja puede contener hasta una línea de texto, que sólo puede aparecer dentro de una caja. El editor ajustará el tamaño de cada caja al del texto que contiene. No se puede ajustar el tamaño de las letras del texto. Dos cajas cualesquiera pueden enlazarse mediante líneas horizontales y verticales.

    El editor se manejará mediante menús emergentes, por medio del ratón, y proporcionará las siguientes operaciones: crear hoja, borrar hoja, hoja siguiente, hoja anterior, crear caja, enlazar cajas, introducir texto, editar texto, seleccionar, mover, cortar, copiar y pegar, abrir diagrama y guardar diagrama. Las operaciones de cortar, copiar y pegar funcionarán a través de un "buffer". Copiar pasa la parte seleccionada de la hoja al "buffer" sin borrarla, cortar la borra. Pegar pasa el contenido del "buffer" a la hoja activa. El contenido del "buffer" se pierde con cada nueva operación de cortar o copiar. Los diagramas tendrán tamaño fijo (no habrá "zoom"). Cuando se mueve una caja, el texto que contiene se moverá con ella, y los enlaces se alargarán adecuadamente.

    Se pide:

  2. Construir un diagrama de flujo de datos para calcular la media de una secuencia de valores de entrada. Una entrada independiente permite inicializar el cálculo. Cada vez que se introduce una entrada nueva, la salida debe ser igual a la media de todos los valores introducidos desde la última inicialización. Como se ignora el número de valores que se introducirán entre dos inicializaciones, la memoria utilizada no debe depender del número de datos introducidos. Detallar el diagrama hasta el nivel de las sumas, multiplicaciones y divisiones (1 punto).

    B) Problemas de SMALLTALK

  3. ¿Cuál es el resultado de las siguientes expresiones de SMALLTALK? (1 punto).
    a)  #(1 'abc' #Juan) class
    b)  'parts' at: 5 put: $y
    c)  |x| x:=2.(String with: $a with: $b with: $c) at: x put: $d; at: x+1
    d)  'abcdebcd' indexOf: $d
    e)  |a| a:=Array new: 3. a at: 1 put: #(2 'abcd'). a at: 2 put: 3/4. a at: 3
        put: (a at: 1). a
    
  4. Escribir un método que calcule el factorial de un objeto de clase Integer (1 punto).

    C) Problemas de JAVA

  5. Sean las siguientes interfaces JAVA:
        interface X { void m1(); }
        interface Y extends X { void m2(); }
        interface Z extends X { void m3(); }
    
    y las siguientes clases JAVA:
        class A { void m2() {/*...*/} }
        class B extends A implements Z { void m3() {/*...*/} }
        class C extends A implements Y,Z { void m1() {/*...*/} }
    

    ¿Es correcta la implementación? Si no lo es, ¿qué se podría hacer para corregirla sin modificar la interfaz y con el número mínimo de cambios? (1 punto).

  6. Sea el siguiente programa JAVA:
            class A {
              public String str = "AString";
              public void show() {
                System.out.println("A.show: "+str);
                }
              }
            class B extends A {
              public String str = "BString";
              public void show() {
                super.show();
                System.out.println("B.show: "+str);
                }
              public static void main(String[] args) {
                A a = new A();
                B b = new B();
                A c = new B();
                B d = new A();
                a.show();
                b.show();
                c.show();
                }
              }
    

    Si el programa tiene algún error, corregirlo. En cualquier caso, escribir el resultado de su ejecución (1 punto).

    D) Problemas de C++

  7. Construir un "template" de clases de árboles binarios con los siguientes métodos:

    Se supondrá que hay memoria suficiente para todo (no preocuparse de los fallos de memoria).

    Añadir un programa principal que genere el árbol binario de enteros:

          10
         /  \
        5   15
            /
          12
    

    Se programará de tal manera, que la impresión de ese árbol genere el siguiente resultado:

    <5^10><12^15^
    

    (2 puntos).

Soluciones:

  1. 
      Entrada -----> T+=Entrada ---
                |        ^         |
                |        |         |---> T/N --> Media
                 --> N++ ----------               ^
                     ^   |                        |
                     |   |                        |
                     v   v                        |
            Memoria: N   T                        |
                     ^   ^                        |
                     |   |                        |
                     v   |                        |
                 --> N=0 ----------               |
                |        |         |--->  0  ------
                |        v         |
      Reset -------> T=0 ----------
    
    
  2. a)  Array
    b)  Error
    c)  $c
    d)  4
    e)  ((2 'abcd') (3/4) (2 'abcd'))
    
  3.     factorial
            "Calcula el factorial de self"
            self>1 ifTrue: [^(self-1) factorial*self].
            self<0 ifTrue: [^self error: 'factorial negativo'].
            ^1
    
  4. Primer problema de JAVA: La implementación no es correcta. Para corregirla, bastaría añadir el método m1 en la clase A o B, y el método m3 en la clase A o C.
  5. Segundo programa JAVA: la declaración de d es incorrecta. Si la eliminamos (puesto que d no se usa), el resultado de la ejecución es:
    A.show: AString
    A.show: AString
    B.show: BString
    A.show: AString
    B.show: BString
    
  6. Template C++ (una solución válida):
    #include <stdlib.h>
    #include <iostream.h>
    
        template <class T> class BTree {
            T elem;
            BTree *left, *right;
          public:
            BTree (T first) {
              elem = first;
              left = right = NULL;
              }
            ~BTree () {
              if (left) delete left;
              if (right) delete right;
              }
            void add(T next);
            void print();
            }
        template <class T> void BTree<T>::add(T next) {
          if (next<elem) {
             if (left) left->add(next);
             else left = new BTree (next);
             }
          if (next>elem) {
             if (right) right->add(next);
             else right = new BTree (next);
             }
          }
        template <class T> void BTree<T>::print() {
          if (left) {
            cout << "<";
            left->print();
            cout << "^";
            }
          cout << elem;
          if (right) {
            cout << ">";
            right->print();
            cout << "^";
            }
          }
        void main () {
            BTree<short> ss(10);
            ss.add(5);
            ss.add(15);
            ss.add(12);
            ss.print();
            }