Problemas - Universidad Politécnica de Madrid

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