Dpto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación, Ciudad Universitaria, 28040 Madrid FUNDAMENTOS DE PROGRAMACIÓN - Febrero 2011 Normas del examen: • • • • Fechas: Con libros y apuntes. Duración: 3 horas. Responda a cada problema en hojas separadas. No se contestará ninguna pregunta durante el examen. • • • notas provisionales: 14.2.2011 revisión: 18.2.2011 notas finales: 5.3.2011 Se proponen 11 ejercicios. Debe responder a 10 de los 11 ejercicios. Si responde a más de 10, se ignorará el problema 11. Problema 1 (1 punto) Escriba un método que recibe como argumentos 2 arrays de enteros, a1 y a2. Los datos de estos arrays están ordenados. El método debe devolver otro array, que contenga todos los elementos de a1 y todos los elementos de a2, ordenados. Ejemplo a1 = [ -30, 10, 13, 77 ] a2 = [ 0, 10, 20 ] resultado = [ -30, 0, 10, 10, 13, 20, 77 ] Problema 2 (1 punto) Escriba un método que recibe como argumentos 2 listas de enteros, a1 y a2. Los datos de estas listas están ordenados y no contienen elementos duplicados. El método debe devolver otra lista, que contenga todos los elementos de a1 y todos los elementos de a2, ordenados y sin duplicados. Ejemplo a1 = [ -30, 10, 13, 77 ] a2 = [ 0, 10, 20 ] resultado = [ -30, 0, 10, 13, 20, 77 ] Problema 3 (1 punto) Tenemos un array de String, de forma que todas las posiciones que contienen una String están al principio, y las vacías (null) al final. Se pide hacer un método para meter nuevas String en el array, de forma que la nueva String se coloca en la primera celda con NULL, y si no cabe, se pierde. Se pide hacer otro método para sacar la String en una cierta posición, de forma que tras sacar la String de la posición indicada, las demás se desplazan para ocupar el hueco, y al final se coloca otro null. Ejemplo operación inicial mete(“D”) mete(“E”) mete(“F”) saca(2) array [ “A”, [ “A”, [ “A”, [ “A”, [ “A”, Fundamentos de Programación “B”, “B”, “B”, “B”, “B”, “C”, “C”, “C”, “C”, “D”, null, null ] “D”, null ] “D”, “E” ] “D”, “E” ] “E”, null ] 4.2.2011 Página 1 de 4 Problema 4 (1 punto) Escriba una clase MiExcepcion, que deriva de java.lang.Exception, y tiene un constructor public MiExcepcion(String mensaje, Object[] datos); y un getter public Object[] getDatos(); Problema 5 (1 punto) Los números de Catalan deben su nombre al matemático belga Eugène C. Catalan (1814-1894) y se utilizan frecuentemente en problemas de combinatoria. 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, … Su definición básica se puede traducir en una fórmula recursiva Escriba un método recursivo que calcula el enésimo número de Catalan public int catalan(int n) Problema 6 (1 punto) Relativo al problema 5, los números de Catalan también se pueden calcular con la fórmula escriba un método iterativo que calcula el enésimo número de Catalan public int catalan(int n) Problema 7 (1 punto) Dada una clase que contiene un array de tamaño limitado public class Armario { private String[] datos; public Armario(int capacidad) { datos = new int[capacidad]; } public boolean mete(int posicion, String dato) { … } } se pide desarrollar el método mete(), de forma que el dato se intenta meter en la posición indicada. Si la posición está ocupada (no es NULL), se intenta meter en la posición siguiente, y así sucesivamente. Si se llega al final del array, se pasa a intentarlo desde el principio. Si se logra colocar el dato en alguna posición, se devuelve TRUE. Si el array está lleno de datos y no cabe nada más, se devuelve FALSE. Fundamentos de Programación 4.2.2011 Página 2 de 4 Ejemplo operación array devuelve inicial [ null, “A”, null, null, “B”, null ] mete(5, “C”) [ null, “A”, null, null, “B”, “C” ] TRUE mete(1, “D”) [ null, “A”, “D”, null, “B”, “C” ] TRUE mete(4, “E”) [ “E”, “A”, “D”, null, “B”, “C” ] TRUE mete(4, “F”) [ “E”, “A”, “D”, “F”, “B”, “C” ] TRUE mete(4, “G”) queda igual FALSE Problema 8 (1 punto) Dada una lista de números reales, List<Double>, 1. escriba un método que devuelva el valor medio (la suma de los valores, dividida por el número de valores) 2. escriba un método que devuelva la mediana (un valor que tiene tantos mayores o iguales a él como menores que él) Ejemplo. Dada la lista [ 30, 17, 514, 216, 701, 0 ] media() = 246.33 mediana() = 216 (3 menores y 3 iguales o mayores) Para calcular la mediana puede ser interesante escribir un método auxiliar que cuente cuántos valores hay inferiores a uno dado. Problema 9 (1 punto) Dada la interface public interface Asignatura { double nota(List<Double> parciales) throws Exception; } Escriba 2 implementaciones: 1. NotaMedia: calcula la nota media, dando igual peso en todos los parciales, y admitiendo cualquier nota parcial 2. NotaMediaPonderadaProtegida: calcula la nota media, pero da el doble de peso a los parciales pares frente a los impares, y además lanza una excepción si alguna nota parcial fuera menor que 0.0 o superior a 10.0 Fundamentos de Programación 4.2.2011 Página 3 de 4 Problema 10 (1 punto) Se pide escribir una clase ListaSinDuplicados que sea un refinamiento de la clase java.util.ArrayList con la característica de que no se pueden insertar datos que ya estén en la lista. O sea, si se intenta meter un dato que ya está, el método no hace nada. Trabaje con datos que son Object, y recurra el método estándar contains(Object) para saber si la lista ya contiene un cierto dato. De los métodos de la clase ArrayList, se pide reescribir los siguientes void add(Object dato) void add(int posicion, Object dato) void set(int posicion, Object dato) Notas no se piden los constructores nuevos; harían falta, pero no se piden aquí la signatura de los métodos que se piden se ha modificado para hacer el ejercicio más simple Problema 11 (1 punto) Se pide modelar un conjunto de excepciones que derivan de java.lang.Exception siguiendo este esquema de herencia: Suponga de disponemos de un método ir(String origen, String destino) que normalmente nos devuelve el destino, aunque puede lanzar alguna de las excepciones anteriores. Envuelva dicho método dentro de otro método viaje(String origen, String destino), que internamente atrapa las posibles excepciones, devolviendo una String que puede ser lo que devuelve ir() si no saltan excepciones devuelve “al hospital” si hay un accidente, salvo que el accidente sea leve, en cuyo caso devuelve “llego tarde” si el accidente es grave, devuelve “no llego nunca” Fundamentos de Programación 4.2.2011 Página 4 de 4