Examen de Programación Convocatoria de Septiembre 2005 Licenciatura de Lingüística y Nuevas Tecnologías Pregunta 1 Tenemos el siguiente programa: public class Numero { int value; public Numero(int i) { value = i; } public static void main(String[ ] args) { Numero f1 = new Numero(3); Numero f2 = new Numero(4); Numero f3 = f1; f1.value = f2.value; Numero f4 = null; System.out.println(f1.value); // linea 1 System.out.println(f2.value); // linea 2 System.out.println(f3.value); // linea 3 System.out.println(f4.value); // linea 4 } } a) ¿Qué es public Numero(int i)? Si devuelve algún valor, decir qué tipo de valor devuelve? b) ¿Qué pasa a la ejecución a cada una de las líneas 1 a 4?: Línea 1 Línea 2 Línea 3 Línea 4 c) Añadir en el programa anterior en el lugar adecuado las variables siguientes y mostrar un ejemplo de como inicializarlas en el main: • Una variable de clase que sea de tipo básico • Una variable de instancia que sea de tipo objeto Pregunta 2 Tenemos el siguiente programa: import java.util.*; public class Example { public static void main(String[] args) { String cadena = "hello, my dear!"; String value = "33"; // convert String to float float i = Float.parseFloat(value); StringTokenizer st = new StringTokenizer(cadena); // number of tokens obtained by string tokenizer int j = st.countTokens(); System.out.println(j); } } a) parseFloat y countTokens son dos métodos llamados dentro del main de forma diferente. Explicar la diferencia y justificarla. b) ¿Qué valor imprime la última línea del main (System.out.println(j)) y por qué? Pregunta 3 a) ¿Qué imprime el siguiente programa? public class Example { public static void main(String[ ] args) { String[ ] cadenas = new String[4]; cadenas[0] = "good morning"; cadenas[2] = "bon dia"; for (int i=0;i<cadenas.length;i++) System.out.println(cadenas[i]); } } b) Sabiendo que al final de ejecutar este programa, tenemos en la pantalla: Entrar valor: 9 Resultado es: 4 2 Inicializar el array values de la forma correcta. public class Example { public static void main(String[] args) { int[ ] values = ___________________ ; TextIO.put("Entrar valor: "); int x = TextIO.getlnInt(); int c1 = 0; int c2 = 0; for (int i=0;i<values.length;i++) { System.out.println(values[i]); if (x > values[i]) c1++; else c2++; } TextIO.putln("Resultado es: " + c1 + “ “ + c2); } } Pregunta 4 a) Para cada una de las siguientes afirmaciones sobre ArrayList y, decir si es Verdadera (V) o Falsa (F): Los elementos de un ArrayList pueden ser de tipo básico o de tipo objeto No tenemos que declarar el tamaño de un ArrayList de antemano. Un ArrayList solo puede contener elementos del mismo tipo. Para recorrer un ArrayList, la única manera es usar un objeto de tipo Iterator. Los elementos de un ArrayList se acceden por valor, no por índice. b) Aquí tenemos un extracto de la API de la clase HashMap: Object put(Object key, Object value) Associates the specified value with the specified key in this map. Object get(Object key) Returns the value to which the specified key is mapped in this identity hash map, or null if the map contains no mapping for this key. boolean containsKey(Object key) Returns true if this map contains a mapping for the specified key. boolean containsValue(Object value) Returns true if this map maps one or more keys to the specified value. int size() Returns the number of key-value mappings in this map. Tenemos el siguiente programa: import java.util.*; public class UseHashMap { public static void main(String[] args) { HashMap hashmap = new HashMap(); hashmap.put("1","x"); hashmap.put("1","y"); System.out.println(hashmap.get("1")); // 1 System.out.println(hashmap.size()); // 2 hashmap.put("2","y"); System.out.println(hashmap.size()); // 3 System.out.println(hashmap.containsKey("x")); // 4 System.out.println(hashmap.containsValue("y")); // 5 } } Decir que imprimen cada una de las líneas numeradas de 1 a 5: 1) 2) 3) 4) 5) Pregunta 5 a) Explicar qué hace este programa y como se ejecuta: import java.io.*; public class P6 { public static void main(String[ ] args) throws IOException { FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); InputStreamReader s = new InputStreamReader(System.in); BufferedReader stdin = new BufferedReader(s); String s1 = b.readLine(); String s2 = stdin.readLine(); if (s1.equals(s2)) System.out.println("YES"); else System.out.println("NO"); b.close(); f.close(); stdin.close(); s.close(); } } b) Para cada una de las siguientes afirmaciones, decir si es Verdadera (V) o Falsa (F): Para procesar una imagen, necesitamos un flujo de caracteres Un flujo de entrada establece una conexión entre el programa e el destino de los datos Si hemos llegado al final del fichero e intentamos leer los datos con readLine( ), el sistema lanza una excepción Podemos redirigir el flujo de salida estándar en la línea de comandos con el operador de redirección “>” Pregunta 6 a) En la API de Java las clases Number y Integer están definida como: public abstract class Number public class Integer extends Number Explicar por qué está definida la clase Number como abstract y la clase Integer como extends Number. b) Para cada una de estas afirmaciones, decir si es Verdadera (V) o Falsa (F): El overriding (redefinición) de métodos ocurre en la misma clase La clase Object de Java tiene una super-clase Cuando diferentes objetos se comportan de forma distinta con lo que es en apariencia el mismo mensaje (i.e, método), eso se llama polimorfismo En Java, una clase puede heredar de más de una clase madre directa Dentro de una clase, podemos tener varios métodos con el mismo nombre pero tienen que tener un número de argumentos distinto