Problema 1. (3 puntos) La empresa ACME S.A. desea analizar

Laboratorio de Programación
12 de septiembre de
1º de Ingeniería de Telecomunicación
Apellidos: ________________________________________________________________
Nombre: _________________________________________________________________
EXAMEN PROBLEMAS
Duración: 3 horas
Nota: No se permiten libros ni apuntes
Resuelva cada problema en una en una hoja aparte.
Problema 1. (3 puntos)
La empresa ACME S.A. desea analizar cómo se mueven sus clientes a través de los enlaces de su página
web. Para ello, programan dos pequeñas clase en Java: Portal y Documento.
La clase Documento representa un documento (página) del portal. Consta de un identificador (número
entero) y su URL (String). Además, mantiene un array de números enteros, en el cual la posición
i-ésima se corresponde con el número de veces que se ha pinchado un enlace desde el documento con
identificador i hacia el propio documento representado en el objeto. El código de esta clase es el
siguiente:
public class Documento {
private int id;
private int[] origenes;
private String url;
public Documento(int id, String url, int numDocumentos) {
this.url= url;
origenes= new int[numDocumentos];
for (int i=0; i<numDocumentos; i++)
origenes[i]= 0;
}
public String getUrl() {
return url;
}
public int getCuenta(int idOrigen) {
return origenes[idOrigen];
}
public int getId() {
return id;
}
}
La clase Portal mantiene como atributo un array de referencias a los documentos del portal, en el cual
cada posición i se corresponde con el documento de identificador i.
No se permite definir ningún atributo adicional a los mencionados anteriormente.
1
Laboratorio de Programación
12 de septiembre de
1º de Ingeniería de Telecomunicación
Se pide:
a) Programa el esqueleto básico de la clase Portal, incluyendo únicamente la declaración de sus
atributos y un constructor (que debes programar) que recibe como parámetro un array de
cadenas de texto con la URL de cada documento del portal. El identificador de cada documento
se corresponde con su posición en el array. Este constructor debe construir los objetos de la
clase Documento necesarios.
b) Cada vez que un usuario pincha en un enlace interno (con origen y destino dentro del propio
portal), el servidor web ejecuta el método void procesarSalto(int idOrigen, int idDestino) de la
clase Portal, indicando el identificador de las páginas origen y destino del enlace. El método
debe incrementar el contador correspondiente en el documento destino. Programa este
método. Si lo crees conveniente, puedes añadir (y programar) algún método extra para la clase
Documento.
c) Programa el método String masVisitado() de la clase Portal, que devuelve la URL del
documento que más visitas ha recibido. Si lo crees conveniente, puedes añadir (y programar)
algún método extra para la clase Documento.
d) En este apartado debes programar un método recursivo en la clase Portal. Este método
recibe como parámetros un identificador de documento origen, un identificador de documento
destino y un valor entero llamado minimo. Debe devolver true si existe algún camino desde el
documento origen hacia el documento destino a través únicamente de enlaces que hayan sido
recorridos al menos el número mínimo de veces que indique el parámetro. En caso contrario,
debe devolver false. Por ejemplo, en la figura existe un camino entre los documentos E y G
cuando se considera un mínimo de 10 (E-D-F-G), pero no existe ninguno entre B y D con un
mínimo de 18. La declaración de este método es la siguiente:
boolean hayCamino(int idOrigen, int idDestino, int minimo, boolean[] visitados)
El array visitados, utilizado adecuadamente, permite evitar bucles en el recorrido del grafo.
Programa este método, utilizando dicho array adecuadamente para que no se produzcan
bucles.
2
Laboratorio de Programación
12 de septiembre de
1º de Ingeniería de Telecomunicación
3
Laboratorio de Programación
12 de septiembre de
1º de Ingeniería de Telecomunicación
Problema 2. (3 puntos)
Se quiere implementar un diccionario español/inglés en Java. Para ello se va a utilizar una
estructura de árbol binario (BTree), en el que las búsquedas son muy rápidas porque los
elementos se almacenan ordenados. Cada nodo almacena la palabra en español así como su
traducción al inglés.
Apartado 1 (2,5 puntos) Implemente la clase Diccionario utilizando el esqueleto que se incluye
a continuación. En esta implementación no hay clases auxiliares y el propio árbol contiene
referencias a él mismo. Utilice los atributos que considere oportunos. En principio, no es necesario
incluir más métodos, pero es libre de hacerlo si lo cree necesario.
class Diccionario {
String palesp;
String paling;
...
public Diccionario(String palesp, String paling) {
...
}
public Diccionario() {
...
}
// inserta una palabra y su traducción al inglés
public void insertar(String palesp, String paling) {
...
}
// busca una palabra en español y devuelve su traducción al inglés
public String buscar(String palesp) {
...
}
// imprime el diccionario en orden
public void imprimir() {
...
}
}
Nota: si quiere, puede emplear el método int String.compareTo(String), que compara una cadena con otra
cadena que se pasa como parámetro y devuelve 0 si son iguales, y -1 y +1 si es mayor o menor
alfabéticamente.
Apartado 2 (0,5 puntos) Implemente una clase de prueba con un método main que construya
un objeto Diccionario, busque la traducción de “perro” y finalmente imprima el árbol completo tras
haber insertado las definiciones siguientes:
ƒ niño / boy
ƒ niña / girl
ƒ perro / dog
ƒ gato / cat
4