soluciones - Universidad Politécnica de Madrid

Anuncio
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
Descargar