Examen de Programación (13294) Convocatoria de Junio 2007 Licenciatura de Lingüística y Nuevas Tecnologías Pregunta 1 Nuestro objetivo es tener un programa que escriba a la pantalla: Caracter Caracter Caracter Caracter numero numero numero numero 4: 3: 2: 1: a l o h Se utilizan los métodos de instancia length y charAt de la clase String: ● int length(): devuelve el tamaño del objeto de tipo String. ● char charAt(int index): coge como argumento de entrada un índice y devuelve el carácter que encuentra en esta posición dentro del objeto de tipo String. a) Tenemos tres versiones P1a, P1b y P1c de este programa, ninguna de ella correcta. Para cada una de estas tres situaciones, decir a qué programa corresponde: Ejecución i) A la compilación, se imprime el siguiente error (donde X es la letra del programa que corresponde): P1X.java [15:1] cannot resolve symbol symbol : method charAt (int) location: class P1X char c = charAt(i); ^ 1 error Errors compiling P1X. ii) A la ejecución, el programa falla después de imprimir algun resultado a la pantalla: Caracter numero 4: a Caracter numero 3: l Caracter numero 2: o Caracter numero 1: h java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.charAt(String.java:444) at P1a.main(P1a.java:15) Exception in thread "main" iii) A la ejecución el programa imprime el siguiente resultado a la pantalla: Caracter Caracter Caracter Caracter numero numero numero numero 3: 2: 1: 0: a l o h Nombre del programa b) Explicar (con algun(os) ejemplo(s)) el significado de cada uno de estos tres tipos de errores: Error sintáctico Error de ejecución Error semántico Pregunta 2 ¿Qué imprime el programa P2? Pregunta 3 a) Relaciona con flechas los conceptos e ejemplos: Variable de objeto Variable de tipo básico Método de instancia Método de clase Constructor TextIO.getln(); Alumno alumno; alumno = new alumno(); int index; alumno.imprimir(); b) Explicar la diferencia entre una variable de objeto e una variable de tipo básico: c) ¿Qué significa si declaramos un método como private? Pregunta 4 El programa P4 utiliza el método de instancia matches de String: (boolean matches(String regex) devuelve true si el objeto de tipo String concuerda completamente con la expresión regular regex dada en entrada.) a) ¿Qué imprime P4 al entrar los siguientes valores? h ah aah ahh b) Modificar P4 para recoger el valor como argumento de la línea de comandos en vez de pedirlo al usuario. Si el usuario no entra ningun argumento a la ejecución entonces el programa debe imprimir un mensaje de error. public class P4 { public static void main(String[] args) { } } Pregunta 5 Tenemos el programa P5 y el fichero C:/fichero.txt que contiene una serie de palabras (cada una en una línea). a) Decir qué puede pasar al ejecutar el programa. b) El programa P5 utiliza cinco flujos de entrada. Decir cuales son y para qué se usa cada uno. Pregunta 6 Tenemos el programa P6 cuyo proposito es imprimir las palabras que contiene el array. a) ¿Qué imprime el programa a la ejecución? b) Hay otra forma de declarar e inicializar un array. Declarar e inicializar el array cadenas de esta forma (con los mismos valores del programa P6). ¿Qué pasaría al ejecutar P6 así modificado y por qué? Pregunta 7 a) Reescribir el programa anterior (P6b) con otro equivalente utilizando un ArrayList. Proporcionamos los siguientes métodos/constructor: ArrayList() add(Object obj) int size( ) Object get(int index) Constructor de arrayList Método de ArrayList. Añade un objeto al final del arrayList. Método de ArrayList. Devuelve el tamaño actual del ArrayList Método de ArrayList. Devuelve el objeto dentro del ArrayList a la posición index. import java.util.*; public class P7 { public static void main(String[] args) { } } b) ¿Cual es la diferencia principal entre un array estático e un array dinámico (ArrayList)? c) Un HashMap es un array asociativo. Explicar cual es su propiedad principal y dar un ejemplo del tipo de información que se podría almacenar en un HashMap: Pregunta 8 Decir si es verdad (V) o falso (F): Un objeto hereda de la clase al que pertenece. Dentro de una clase, no puede haber definido dos métodos con el mismo nombre. La API de Java permite a cualquiera acceder a la especificación de los paquetes (package), clases, métodos, etc, disponibles, pero sin acceder al código en sí. No se puede heredar de una clase abstracta. P1: public class P1a { public static void main(String[] args) { String cadena = "hola"; for (int i=cadena.length()-1;i>=0;i--) { char c = charAt(i); System.out.println("Caracter numero " + i + ": " + c); } } } public class P1b { public static void main(String[] args) { String cadena = "hola"; for (int i=cadena.length()-1;i>=0;i--) { char c = cadena.charAt(i); System.out.println("Caracter numero " + i + ": " + c); } } } public class P1c { public static void main(String[] args) { String cadena = "hola"; for (int i=cadena.length();i>0;i--) { char c = cadena.charAt(i); System.out.println("Caracter numero " + i + ": " + c); } } } P2: import java.util.*; public class P2 { public static void main(String args[]) { StringTokenizer st = new StringTokenizer("Hello, how are you?"," "); while (st.hasMoreTokens()) { String cadena = st.nextToken(); System.out.println(cadena); } } } P4: public class P4 { public static void main(String[] args) { TextIO.putln("Entra cadena: "); String cadena = TextIO.getln(); if (cadena.matches(".h")) TextIO.putln("Uno"); else if (cadena.matches(".h*")) TextIO.putln("Dos"); else if (cadena.matches(".+h")) TextIO.putln("Tres"); } } P5: import java.io.*; public class P5 { public static void main(String[] args) throws IOException { System.out.print("Entra cadena: "); InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br1 = new BufferedReader(isr); String cadena = br1.readLine(); br1.close(); FileReader f = new FileReader("C:/fichero.txt"); BufferedReader br2 = new BufferedReader(f); String line = br2.readLine(); while ((line != null) && (line.equals(cadena) == false)) { line = br2.readLine(); } br2.close(); f.close(); } if (line == null) System.out.println("NO!"); else System.out.println("YES!"); } P6: public class P6 { public static void main(String[] args) { String[] cadenas = new String[4]; cadenas[0] = "aaa"; cadenas[1] = "bbb"; cadenas[2] = "ccc"; for (int i=0;i<cadenas.length;i++) { System.out.println(cadenas[i]); } } }