Dpto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación, Ciudad Universitaria, 28040 Madrid FUNDAMENTOS DE PROGRAMACIÓN - FEBRERO 2009 Normas del examen: Con libros y apuntes. Duración: 2 horas (2h). Responda a cada problema en hojas separadas. No se contestará ninguna pregunta durante el examen. Fechas: notas provisionales: 24.6.2009 revisión: 25.6.2009 notas finales: 27.6.2009 SOLUCIONES Problema 1 (4 puntos) Dada la nueva ley de seguridad vial Ejercicio 1.1 (1 punto) Diseñe una clase java para representar una posición en la tabla anterior. Cada objeto tendrá como campos o el límite de velocidad o el rango de velocidad (2 enteros) o la multa en euros o la pérdida de puntos Codifique un constructor con esos 5 datos. Fundamentos de programación 19.6.2009 página 1 Por ejemplo, para indicar que si el límite son 120, y se circula entre 121 y 150, la multa son 100 euros y no se pierden puntos, escribiremos: new Infraccion(120, 121, 150, 100, 0); Codifique métodos de acceso, getters, para cada uno de los campos. public class Infraccion { private final int limite; private final int minimo; private final int maximo; private final int euros; private final int puntos; public Infraccion(int limite, int minimo, int maximo, int euros, int puntos) { this.limite = limite; this.minimo = minimo; this.maximo = maximo; this.euros = euros; this.puntos = puntos; } public int getLimite() { return limite; } public int getMinimo() { return minimo; } public int getMaximo() { return maximo; } public int getEuros() { return euros; } public int getPuntos() { return puntos; } } Fundamentos de programación 19.6.2009 página 2 Ejercicio 1.2 (1 punto) Dada una lista de infracciones, con objetos de la clase creada en el problema anterior, programe un método al que se le pasa la lista, la limitación de velocidad en un tramo de carretera y la velocidad a la que circula el vehículo. Como resultado, el método imprimirá la cuantía de la multa y el número de puntos que se pierden. public void ejercicio_12(List<Infraccion> infracciones, int limite, int velocidad) { for (Infraccion infraccion : infracciones) { if (infraccion.getLimite() == limite && infraccion.getMinimo() <= velocidad && infraccion.getMinimo() >= velocidad) { System.out.println("multa: " + infraccion.getEuros()); System.out.println("puntos: " + infraccion.getPuntos()); return; } } System.out.println("multa: " + 0); System.out.println("puntos: " + 0); } Fundamentos de programación 19.6.2009 página 3 Ejercicio 1.3 (2 puntos) Dada una lista de infracciones y un array con la velocidad del vehículo en diferentes tramos del recorrido y un array paralelo (igual longitud) con la limitación de velocidad en cada tramo, programe 2 métodos que devuelvan 1. la multa acumulada por el conductor 2. los puntos totales perdidos por el conductor private int getMulta(List<Infraccion> infracciones, int limite, int velocidad) { for (Infraccion infraccion : infracciones) { if (infraccion.getLimite() == limite && infraccion.getMinimo() <= velocidad && infraccion.getMinimo() >= velocidad) { return infraccion.getEuros(); } } return 0; } private int getPuntos(List<Infraccion> infracciones, int limite, int velocidad) { for (Infraccion infraccion : infracciones) { if (infraccion.getLimite() == limite && infraccion.getMinimo() <= velocidad && infraccion.getMinimo() >= velocidad) { return infraccion.getPuntos(); } } return 0; } public int getMultaAcumulada(List<Infraccion> infracciones, int[] limites, int[] velocidades) { int multa = 0; for (int i = 0; i < limites.length; i++) { multa += getMulta(infracciones, limites[i], velocidades[i]); } return multa; } public int getPuntosAcumulados(List<Infraccion> infracciones, int[] limites, int[] velocidades) { int puntos = 0; for (int i = 0; i < limites.length; i++) { puntos += getPuntos(infracciones, limites[i], velocidades[i]); } return puntos; } Fundamentos de programación 19.6.2009 página 4 Problema 2 (2 puntos) Ejercicio 2.1 (1 punto) Diseñe una clase java que representa una ventana en un PC. La clase debe recoger o la posición superior izquierda en la pantalla (2 enteros) o el ancho y alto (2 enteros) o el color del fondo (use la clase java.awt.Color de java) Para dicha clase disponga de métodos de acceso, getters, y de modificación, setters, así como de un constructor que fija los 5 campos indicados. public class E21 { private int nwx; private int nwy; private int ancho; private int alto; private Color color; public E21(int nwx, int nwy, int ancho, int alto, Color color) { this.nwx = nwx; this.nwy = nwy; this.ancho = ancho; this.alto = alto; this.color = color; } public int getNwx() { return nwx; } public void setNwx(int nwx) { this.nwx = nwx; } public int getNwy() { return nwy; } public void setNwy(int nwy) { this.nwy = nwy; } public int getAncho() { return ancho; } public void setAncho(int ancho) { this.ancho = ancho; } public int getAlto() { return alto; } public void setAlto(int alto) { this.alto = alto; } public Color getColor() { Fundamentos de programación 19.6.2009 página 5 return color; } public void setColor(Color color) { this.color = color; } } Ejercicio 2.2 (1 punto) Diseñe una clase derivada de la anterior que presenta un mensaje al usuario. Esta clase tiene una String con el texto a presentar. En el constructor sólo se le pasa dicho texto y el color de la ventana, debiendo calcular los demás parámetros: o la posición del extremo superior izquierdo será (0, 0) o el ancho será la longitud del texto multiplicada por 15 o el alto será el 10% del ancho, con un valor mínimo de 20 public class E22 extends E21 { public E22(String texto, Color color) { super(0, 0, 15 * texto.length(), Math.max(20, 15 * texto.length() / 10), color); } } Fundamentos de programación 19.6.2009 página 6 Problema 3 (4 puntos) Dado el algoritmo de Gauss-Legendre para calcular el número :: Datos iniciales: Términos sucesivos de la serie: El valor de la constante viene dado por: Ejercicio 3.1 (2 puntos) Diseñe un método para calcular el valor de con un error menor que un valor dado. El método, internamente, debe utilizar un bucle, es decir se pide una solución iterativa. public static double metodo1(double error) { double a = 1; double b = 1 / Math.sqrt(2); double t = 1.0 / 4; double p = 1; double pi = (a + b) * (a + b) / (4 * t); double mejora; do { double a1 = (a + b) / 2; double b1 = Math.sqrt(a * b); double t1 = t - p * (a - a1) * (a - a1); double p1 = 2 * p; double pi1 = (a1 + b1) * (a1 + b1) / (4 * t1); mejora = Math.abs(pi1 - pi); a = a1; b = b1; t = t1; p = p1; pi = pi1; } while (mejora > error); return pi; } Fundamentos de programación 19.6.2009 página 7 Ejercicio 3.2 (2 puntos) Diseñe un método para calcular el valor de con un error menor que un valor dado. El método, internamente, debe utilizar recursión, es decir se pide una solución recursiva. Probablemente necesite un método auxiliar. public double metodo2(double error) { double a = 1; double b = 1 / Math.sqrt(2); double t = 1.0 / 4; double p = 1; return metodo2(error, a, b, t, p); } private double metodo2(double error, double a, double b, double t, double p) { double pi = (a + b) * (a + b) / (4 * t); double a1 = (a + b) / 2; double b1 = Math.sqrt(a * b); double t1 = t - p * (a - a1) * (a - a1); double p1 = 2 * p; double pi1 = (a1 + b1) * (a1 + b1) / (4 * t1); if (Math.abs(pi1 - pi) < error) return pi1; return metodo2(error, a1, b1, t1, p1); } Fundamentos de programación 19.6.2009 página 8