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
© Copyright 2024