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

4/11/98:

    Problemas de JAVA

  1. Supongamos que vamos a definir una clase llamada Arbol. En esa clase habrá un atributo llamado nombre. ¿Convendrá definir ese atributo como variable de objeto o como variable de clase? ¿Por qué? (1 punto)
  2. Escriba un programa que imprima una etiqueta como la siguiente:
            -------------------------
            |        Nombre         |
            |       Dirección       |
            |        Ciudad         |
            |       Teléfono        |
            -------------------------
    
    con el menor número de instrucciones posible (1 punto).
  3. La clase Math posee un método estático sqrt. Escribir una instrucción que asigne a x el valor de la raíz cuadrada de
             2
            b -4ac
            ------
              2a
    
    (1 punto).
  4. ¿Cuál será el resultado de las siguientes expresiones?
            52 % 10
            Math.sqrt(4)
            22 / 7
            22 / 7f
            4 - 3 / 4 - 3
    
    (1 punto).
  5. Supongamos que una clase contiene las siguientes declaraciones de atributos. ¿Cuáles de ellas serán rechazadas por el compilador de JAVA? ¿Por qué?
            int i, j, k;
            max = 10 ;
            double x = 1;
            double K = 1,000;
            static int Premio = 50;
            static int 2doPremio = 25;
            int horaLocal = 4.30;
            static double x = 6;
    
    (1 punto).
  6. ¿Cuántos asteriscos imprimirá el bucle siguiente? ¿Por qué?
            for (int star = 9; star<0; star++)
              System.out.print('*');
    
    (1 punto).
  7. Se desea imprimir una secuencia de líneas como la siguiente:
            4****+
    
    donde cada línea contiene un número, tantos asteriscos como indica el número, y un signo +. Para ello se ha escrito el siguiente programa:
            int numero;
            for (numero = 1; numero<5; numero++)
              System.out.print(numero);
            for (int aster = 1; aster<numero; aster++)
              System.out.println(aster);
            System.out.println('+');
    
    ¿Qué escribiría en realidad este programa? ¿Cómo habría que corregirlo para que haga lo que se desea? (2 puntos).
  8. ¿Cuándo una clase no necesita constructor? (1 punto).
  9. Escriba un programa que imprima las décadas del siglo XX (1900 1910...) en una sola línea y pase línea al final. (1 punto).

Soluciones:

  1. Como variable de objeto, porque cada objeto tiene un nombre diferente.
  2.         void print() {
              System.out.println("---------------"+
                                 "|"+nombre+"|"+
                                 "|"+direccion+"|"+
                                 "|"+ciudad+"|"+
                                 "|"+telefono+"|"+
                                 "---------------");
            }
    
  3. x=Math.sqrt((b*b-4*a*c)/(2*a));
  4.         2
            2.0
            3
            3.14...
            1
    
  5. Son erróneas:
            max = 10 ;                  // No se da el tipo
            double K = 1,000;           // Es 1.000
            static int 2doPremio = 25;  // Un identific.no puede empezar por 2
            static double x = 6;        // Variable duplicada
    
  6. Ninguno, el interior del bucle no se ejecuta nunca.
  7. Tal como está, escribe:
            12341
            2
            3
            4
            +
    

    Se podría programar así:
            int numero;
            for (numero = 1; numero<5; numero++) {
              System.out.print(numero);
              for (int aster = 1; aster<numero; aster++)
                System.out.print("*");
              System.out.println('+');
            }
    
  8. Cuando no es necesario dar valores iniciales diferentes a sus atributos.
  9.         for (int i=1900; i<2000; i+=10)
              System.out.print(i+" ");
            System.out.println("");
    

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

16/12/98:

    Problemas de Smalltalk

  1. ¿Cuál es el resultado de las siguientes expresiones? Si alguna de ellas es incorrecta, corregirla con el número mínimo de cambios y decir cuál sería entonces el resultado (5 puntos).
  2. Escribir un método que realice una búsqueda binaria en una colección de datos ordenados. ¿En qué clase debería definirse el método? (5 puntos).

Soluciones:

  1.     busquedaBinariaDe: x desde: izq hasta: der
          "Programa de búsqueda binaria en una colección ordenada"
          | centro |
          izq=der ifTrue: [
            x=(self at: izq) ifTrue: [^izq]
            ifFalse: [^0]
          ]
          ifFalse: [
            centro := izq+der//2.
            x=(self at: centro) ifTrue: [^centro]
            ifFalse: [
              x<(self at: centro) ifTrue: [
                ^self busquedaBinariaDe: x desde: izq hasta: centro
              ]
              ifFalse: [
                ^self busquedaBinariaDe: x desde: centro+1 hasta: der
              ]
            ]
          ]
    

    Debería definirse en la clase Array (aunque sólo sería aplicable a arrays ordenados), SortedCollection, o un antepasado común de ambas.

Examen final de la asignatura Programación Orientada a Objetos

5/2/99:

    A) Problemas de análisis y diseño

  1. Los motores eléctricos pueden ser de corriente alterna o continua, aunque algunos funcionan con ambas. Los de corriente alterna pueden ser síncronos o de inducción. Entre los motores eléctricos podemos citar los motores síncronos, los motores de inducción, los motores universales y los motores de imán permanente. En el hogar suelen encontrarse motores de inducción y universales. Estos se usan para obtener altas velocidades en mezcladoras o aspiradoras. Funcionan con corriente alterna o continua. Los motores de imán permanente funcionan sólo con continua y se encuentran en juguetes.

    Se pide:

  2. Un motor eléctrico tiene un control externo que decide cuándo debe ponerse en marcha o pararse. El motor dispone de dos bobinas, una de encendido y la otra de marcha. Al ponerse en marcha, las dos bobinas reciben corriente. Cuando el motor entra en régimen permanente, sólo recibe corriente la bobina de marcha. El paso de puesta en marcha a régimen permanente es controlado automáticamente por un sensor interno. El motor contiene también un sensor de temperatura que provoca la parada automática si el motor se sobrecalienta. En este caso, el motor no puede ponerse en marcha de nuevo hasta que se pulse el botón "reset".

    Se pide:

    B) Problemas de SMALLTALK

  3. ¿Cuál es el resultado de las siguientes expresiones? Si alguna de ellas es incorrecta, corregirla con el número mínimo de cambios y decir cuál sería entonces el resultado (1 punto).
    a)  (#(1 'abc' #Juan) class with: 2 with: "abcd") at: 2
    b)  (#(1 #(2 3) 4) at: 2) at: 2 + 1
    c)  | x | x:=7. 5 < x ifTrue: [ x < 8 ifTrue: [ x = 6 ifTrue: [ x:=2*x ]
        ifFalse: [ x:=2*x+1 ]] ifFalse: [ x:=2*x-1 ] ifFalse: [ x=x//2 ] ]
    d)  | x |
        x:=SortedCollection with: 'abcd' with: 'mncp' with: 'cdcf' with: 'cddd'.
        x select: [ :i | i at: 3 = $c ] asSortedCollection: [ :i :j | i>j]
    e)  | a b | a:=Array new: 2. a at: 1 put: #('abcd' #(2 3)).
        b:=Array new: 2. b at: 1 put: 2. b at: 2 put: a at: 1 at: 2.
        a at: 2 put: b. a
    
  4. Definir una clase Matriz con tres parámetros: filas, columnas, datos. Escribir los métodos necesarios para que pueda crearse un objeto de clase Matriz (aunque no tenga datos). (1 punto).

    C) Problemas de JAVA

  5. Sea el siguiente programa JAVA:
            class TryTry {
              public static void main(String[] args) {
                try {
                    if (args.length==0) throw 5;
                    else throw "abcd";
                    }
                catch (int n) {
                    System.out.println("Error " + n);
                    }
                catch (Object o) {
                    System.out.println("Error " + o);
                    }
                }
              }
    

    Si este programa es correcto, explicar lo que hace. Si es incorrecto, explicar por qué. (1 punto).

  6. Construir un programa que, ejecutado indistintamente como aplicación o como "applet", escriba "¡Hola, mundo!" en la pantalla. (1 punto).

    D) Problemas de C++

  7. Construir un "template" que implemente la clase Bag a la Smalltalk, 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 un objeto Bag de enteros e introduzca varios enteros.
    (2 puntos).

Soluciones:

    A) Problemas de análisis y diseño

  1. Motor eléctrico:

    B) Problemas de SMALLTALK

  2. a) (#(1 'abc' #Juan) class with: 2 with: 'abcd') at: 2
                                             ^    ^
    Resultado: 'abcd'
    b) ((#(1 #(2 3) 4) at: 2) at: 2) + 1
       ^                           ^
    Resultado: 4
    c)  | x | x:=7. 5 < x ifTrue: [ x < 8 ifTrue: [ x = 6 ifTrue: [ x:=2*x ]
        ifFalse: [ x:=2*x+1 ]] ifFalse: [ x:=2*x- 1 ] ] ifFalse: [ x:=x//2 ]
                                                 ^    ^             ^        ^
    Resultado: 15
    d)  | x |
        x:=SortedCollection with: 'abcd' with: 'mncp' with: 'cdcf' with: 'cddd'.
        (x select: [ :i | (i at: 3) = $c ]) asSortedCollection: [ :i :j | i>=j]
        ^                 ^       ^       ^
    Resultado: SortedCollection ('mncp', 'cdcf', 'abcd')
    e)  | a b | a:=Array new: 2. a at: 1 put: #('abcd' #(2 3)).
        b:=Array new: 2. b at: 1 put: 2. b at: 2 put: ((a at: 1) at: 2).
                                                      ^^       ^      ^
        a at: 2 put: b. a
    Resultado: Array (('abcd' (2 3)) (2 (2 3)))
    
  3. Variables de objeto: filas, columnas, datos.
    Método de clase:
    new: aNumber1 new: aNumber2
        "Crea una matriz"
        |x|
        x:=Matriz new. "Crea el objeto con el constructor por defecto"
        x new: aNumber1 new: aNumber2. "Lanza el método de objeto"
        ^x "Devuelve el objeto"
    Método de objeto:
    new: aNumber1 new: aNumber2
        "Asigna valores a las variables de objeto"
        filas := aNumber1.
        columnas := aNumber2.
        datos := Array new: filas.
        "Da estructura a los datos"
        1 to: filas do: [:i|datos at: i put: (Array new: columnas)]
    

    C) Problemas de JAVA

  4. El programa TryTry es incorrecto porque en JAVA no se pueden lanzar números ni cadenas de caracteres, sino sólo objetos descendientes de la clase Throwable.
  5.     /* Aplicación/applet */
        import java.applet.Applet;
        import java.awt.Graphics;
        public class HelloWorld2 extends Applet {
          public static void main(String[] args) {
            System.out.println("¡Hola, Mundo!"); // Display the string
            }
          public void paint(Graphics g) {
            g.drawString("¡Hola, mundo!", 50, 25);
            }
         }