Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación, Ciudad Universitaria, 28040 Madrid FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 1999. Con libros y apuntes. Duración 2 horas. Responda a las preguntas en el espacio al efecto. APELLIDOS:..................................................................................................................NOMBRE...................................... Problema 1 (4 Puntos) Se desea crear una clase Almacén para guardar un conjunto de parejas formadas cada una de ellas por un objeto cadena de caracteres (la clave, de clase String) y una referencia a un objeto cualquiera (el valor asociado a esa clave). Una vez guardada una pareja, se puede preguntar cuál es el valor asociado a una clave, y si se ha guardado alguna pareja con determinada clave. Para todo ello, se tiene el siguiente esqueleto de la clase. public class Almacen { // constructor, n es el número máximo de elementos public Almacen (int n) { ... } // si la clave ya está asignada, se sustituye el objeto asociado por el nuevo // si cabe, introduce una nueva pareja y devuelve true // si no cabe, no hace nada y devuelve false public boolean mete (String clave, Object valor) { ... } // devuelve el objeto asociado a la clave // devuelve null si la clave no está almacenada public Object devuelveValor (String clave) { ... } // indica si c es una clave utilizada public boolean esClave (String clave) { ... } } Nota: para la comparación de String debe usarse el método equals. Pregunta 1 ( 1 punto): Escriba los datos o atributos de la clase Almacen y el constructor de la clase. class Nodo { protected String clave; protected Object item; public Nodo (String c, Object i) { clave = c; item = i; } } class Almacen { public Almacen (int n) { nodos = new Nodo [n]; } ... private Nodo[] nodos; } Pregunta 2 (1 punto) : Escriba el cuerpo del método mete. public boolean mete (String clave, Object valor) { for (int i = 0; i < nodos.length; i++) { if (nodos [i] == null) { nodos [i] = new Nodo (clave, valor); return true; } else if (nodos [i].clave.equals (clave)) { nodos [i] = new Nodo (clave, valor); return true; } } return false; } Pregunta 3 ( 1 punto): Escriba el cuerpo del método devuelveValor. public Object devuelveValor (String clave) { for (int i = 0; i < nodos.length; i++) { if ((nodos [i] != null) && (nodos[i].clave.equals (clave))) { return nodos[i].item; } } return null; } Pregunta 4 ( 1 punto): Escriba el cuerpo del método esClave. public boolean esClave (String clave) { for (int i = 0; i < nodos.length; i++) { if ((nodos [i] != null) && (nodos[i].clave.equals (clave))) { return true; } } return false; } z Página 2 APELLIDOS:..................................................................................................................NOMBRE...................................... Problema 2 (4 puntos) Se dispone de la siguiente definición de una lista encadenada de enteros class lista { .... public lista (){...} // Inserta un nuevo elemento como el primero de la lista public void InsertarAlPrincipio (int elemento){...} // Inserta un nuevo elemento como el último de la lista public void InsertarAlFinal (int elemento) {...} // devuelve una nueva lista con todos los elementos pares almacenados en la lista public lista Pares (){...} // devuelve una nueva lista con los elementos de la lista en orden inverso public lista Invertir (){...} } class Nodo { int elemento; Nodo sig; public Nodo (int elemento, Nodo sig){ this.elemento = elemento; this.sig = sig; } public Nodo (int elemento){ this.elemento= elemento; this.sig = null; } } Pregunta 1 (1 punto): Codifique en Java el constructor y añada los atributos necesarios dentro de la clase. class lista { Nodo primero; Nodo ultimo; } public lista (){ primero = null; ultimo = null; } ... z Página 3 Pregunta 2 (1 punto): Codifique en Java los métodos InsertarAlPrincipio e InsertarAlFinal. public void InsertarAlPrincipio (int elemento){ if (primero == null){ primero = ultimo = new Nodo (elemento); } else { primero = new Nodo (elemento, primero); } } public void InsertarAlFinal (int elemento) { if (primero == null){ primero = ultimo = new Nodo (elemento); } else { ultimo.sig = new Nodo (elemento); } } Pregunta 3 (1 punto): Codifique en Java el método Pares. public lista Pares (){ lista plista = new lista( ); for (Nodo aux = primero; aux != null; aux=aux.sig) if (aux.elemento % 2 == 0) plista.InsertarAlPrincipio (aux.elemento); return plista; } Pregunta 4 (1 punto): Codifique en Java el método Invertir. public lista Invertir (){ lista plista = new lista ( ); for (Nodo aux = primero; aux != null; aux=aux.sig) plista.InsertarAlPrincipio (aux.elemento); return plista; } z Página 4 APELLIDOS:..................................................................................................................NOMBRE...................................... Problema 3 (2 puntos) Para calcular el número π se utilizan muchos métodos fácilmente programables. Uno de ellos, calcula π/4 de la siguiente forma: π 4 ∞ =∑ i=0 (−1) n 2i + 1 No se pueden computar infinitos términos, pero los n primeros calcularán π/4 con una precisión determinada "e", que se alcanza cuando |an| < e. Codificar en lenguaje Java un método que calcule π con una determinada precisión "e" (pasada como parámetro). La cabecera de dicho método debe ser public static double calculaPi (float e) {...} public static double calculaPi1 (double e) { double picuartos= 0.0; double signo= 1.0; int i= 0; double term; do { term = signo / (double)(2*i+1); picuartos += term; signo *= -1.0; i++; } while (Math.abs(term) >= e); } z Página 5 return 4.0*picuartos;