Guía de ejercicios Algoritmos y programación III FIUBA 75.07 Cursos 1 y 2 segundo cuatrimestre 2005 (versión preliminar) Autores: Nicolás Páez Nicolás Ferretti Eugenio Yolis Pablo Roca Ignacio Waitoller Marcio Degiovaninni Compilación: Pablo Suárez Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Capitulo 1: Objetos, clases y encapsulamiento 1. Programe una clase CalculadoraDeMatrices que permita realizar las siguientes operaciones con matrices: sumar, restar, traza y determinante. Debe permitir operar con matrices de dos dimensiones, de cualquier tamaño. Recuerde que para poder realizar algunas operaciones es necesario que primero verificar que las matrices sobre las que se va a operar sean compatibles. 2. Escriba las clases que considere necesarias para representar un juego de Truco que permita jugar a dos personas. ¿Como modificaría su diseño si deberia permitir que una persona juegue contra la máquina? 3. Escriba el código correspondiente al siguiente diagrama de clases (no escriba el cuerpo de los metodos, sino solo su declaración): ReproductorDiscos reproducir(int) detener() siguiente() anterior() cargarCD(Disco) Disco usa titulo fechaEdicion contiene Cancion titulo duracion obtenerDuracionTotal() obtenerCancion(int) 4. Dibujar un posible diagrama de clases para el siguiente fragmento de código: Compas unCompas = new Compas(); Circulo unCirculo = unCompas.dibujarCirculo(5); Pincel unPincel = Cartuchera.getPinceles().getItem(2); unPincel.setColor(new Color("#336677")); unPincel.pintar(unCirculo); int superficie = unCirculo.getSuperficie(); 5. Escriba una clase Lista que implemente el tipo abstracto de dato Lista y que contenga elementos de la clase Figura. No puede utilizar ninguna de las clases provistas por el lenguaje a excepción de object. 6. Utilizando la técnica de composición y la clase Lista desarrollada en el ejercicio anterior, escriba una clase que implemente el tipo abstracto de dato Pila. 7. Un diagrama de estados muestra los distintos cambios de estado que sufre un objeto a travéz del tiempo. Tomando como punto el siguiente texto, dibuje el diagrama de estado de un “defecto”. Durante el proceso de desarrollo de todo software aparecen defectos. Dependiendo de los criterios de cada equipo de desarrollo el ciclo de vida de los defectos varía, pero a pesar de eso es posible definirlo a grandes rasgos: un defecto es encontrado y a partir de ese momento y hasta que alguien se hace cargo de intentar arreglarlo el defecto permance “reportado”. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Mientras que alguien intenta arreglarlo se dice que el defecto está “abierto”. Puede que por ser muy complejo se decida no arreglar el defecto hasta la proxíma versión del producto, en cuyo caso el mismo queda “suspendido”. Si alguien puede arreglar el defecto, entonces el mismo pasará a estar arreglado, hasta que finalmente quien encontró el defecto lo de por “cerrado”. En ocasiones puede que el arreglo no sea correcto, entonces el defecto será “reabierto”. Dibuje el diagrama de estados de un defecto. 8. Dibuje un posible diagrama de clases consistente con el siguiente diagrama de secuencia y escriba un fragmento de código correspondiente al mismo. : Buscador : usuario : ServidorArchivos : Archivo 1: buscar() 2: listarArchivos() 3: 4: 5: descargar() 6: obtenerArchivo() 7: 8: 9: cambiarNombre( ) 9. Dibuje un posible diagrama de secuencia para el fragmento de código del ejercicio 4. 10.Dibuje los diagramas de secuencia y clases correspondientes al siguiente fragmento de código. Connection connection = new Connection(“localhost/mydb”); Command command = new Command(); command.setConnection(connection); command.setText("SELECT * FROM USERS"); connection.open(); DataReader reader = command.execute(); Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 connection.close(); while(int i < reader.getResultSize()) { Printer.write(reader.getRow(i)); i++; } connection.close(); Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Unidad 2: Herencia, Polimorfismo e Interfaces 1. Codifique una clase abstracta "Numero" con los siguientes métodos: a. sumar(Numero n): suma a éste número el número "n" b. restar(Numero n): resta a éste número el número "n" c. multiplicarPor(Numero n): multiplica a éste número por el número "n" d. dividirPor(Numero n): divide a éste número por el número "n" e. toString(): (redefinición del método definido en "Object") devuelve un String que representa al número 2. Modifique la calculadora de matrices programada en el ejercicio 1 de la unidad 1 para que trabaje con matrices cuyas posiciones contengan objetos del tipo "Numero". 3. Codifique las clases "NumeroEntero", "NumeroReal" y "NumeroComplejo", descendientes de "Numero", que implementen los métodos abstractos de "Numero" mediante aritmética entera, real y compleja respectivamente. Agregue en cada clase el constructor apropiado para poder crear instancias de cada uno de los números. 4. Codifique una función de prueba que utilice la calculadora programada en el punto 2) con matrices de cada una de las clases numéricas programadas en el punto 3) e imprima los resultados. 5. Busque la definición de la interface "Comparable" en la API de Java, y escriba una función que reciba un array con objetos de tipo "Comparable" y lo devuelva ordenado, haciendo uso del método "compareTo" definido en dicha interfaz. 6. Modifique las clases "NumeroEntero", "NumeroReal" y "NumeroComplejo" para que implementen la interface "Comparable" y escriba una función de prueba que utilice la función programada en el punto 5) para ordenar arrays de cada una de esas clases e imprima los resultados. 7. Las clases de la API de Java "java.lang.String" y "java.util.Date" también implementan la interface "Comparable". Escriba una función de prueba que utilice la función programada en el punto 5) para ordenar arrays de cada una de estas 2 clases e imprima los resultados. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Unidad 3: Excepciones y colecciones 1. Indicar dónde se encuentran los errores en el siguiente código en Java y reescribalo correctamente public class eTemperaturaErronea{ } public class Ejercicio1(){ public int ObtenerTemperatura(int provincia) throw new eTemperaturaErronea{ if ((provincia < 0) || (provincia > 23)) throw eTemperaturaErronea; else return 20; } public static void main (String[] args){ Thread.sleep(1000); //(Investigar si este metodo arroja excepcion ObtenerTemperatura(15); } } 2. Indicar que imprimen por pantalla los siguientes fragmentos de código suponiendo primero que no existe el archivo y luego que existe (se supone “arch” instancia de una clase X; arch.siguienteLinea() arroja IOException si el archivo físico al que se refiere no existe, caso contrario devuelve “Hola”) a) try{ System.out.print(“Comienza linea: “); System.out.print(arch.siguienteLinea()); System.out.println(“Fin linea”); } catch (IOException IOex){ System.out.println(“No existe el archivo”); } catch (Exception ex){ System.out.println(“Oops, hubo una excepcion”); } finally{ System.out.println(“Chau”); } b) try{ System.out.print(“Comienza linea: “); System.out.print(arch.siguienteLinea()); System.out.println(“Fin linea”); } catch (Exception ex){ System.out.println(“Oops, hubo una excepcion”); } catch (IOException IOex){ System.out.println(“No existe el archivo”); } finally{ System.out.println(“Chau”); } Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 3. Codifique una clase “NumeroNatural”, descendiente de la clase “NumeroEntero” codificada en el ejercicio 3 de la guía 2, en la que en su constructor reciba un int, y que arroje “eNumeroInvalido” (también la debe codificar) si éste es menor a 0, y escriba un fragmento de código en el que se instancie un nuevo NumeroNatural, y en el caso que haya excepcion se imprima la traza de la pila de llamados a métodos. 4. En una clase accesoria que contenga un método “main” llene un ArrayList con 20 Numeros (Enteros, Naturales, etc.) usando las clases ya codificadas en la guía 2 y en ésta. a. Imprima los elementos cargados en la colección usando un ciclo for. b. Imprima los elementos cargados en la colección usando un iterador. c. Cargue el NumeroComplejo “ 3 + 4i ”en la posición 14 de la colección. d. Imprima el elemento 14 de la lista. e. Itere la lista imprimiendo sólo los números complejos. 5. Implemente una clase ListaDeNumeros, en la que se encuentre restringida la posibilidad de cargar elementos que no sean Numero (entiendase que también acepta sus descendientes). 6. Confeccione un diagrama de clases con la lista del punto 5, y las clases que representan los numeros. 7. Implemente una clase ArrayListExtendida, que permita mediante el método add(tipo_primitivo i) agregar a la lista elementos de tipos primitivos int, float y double, y que automaticamente los cargue con sus respectivas “clases envolventes”. 8. Se necesita implementar un sistema en el que se puedan cargar alumnos, a los cuales los caracterizan el nombre y apellido, el padrón, el sexo, condición (regular o condicional) y la nota final. Estos alumnos se deben cargar en una asignatura, llamada Algoritmos y Programacion III. Implemente las clases y métodos necesarios para esta situación, teniendo en cuenta lo que se pide a continuación: a. Mostrar en pantalla todos los alumnos que se encuentren en la asignatura. b. Mostrar en pantalla los alumnos que se encuentren como condicional y su cantidad. c. Ordenar los alumnos de acuerdo a su nota (de mayor a menor) y mostrarlo en pantalla. d. Ordenar los alumnos de acuerdo a su nota (de menor a mayor) y mostrarlo en pantalla. e. Ordenar los alumnos por nombre y apellido y mostrarlo en pantalla Nota: para los ordenamientos utilizar las facilidades provistas por la plataforma. 9. Se necesita una clase Matriz de dos dimensiones en la que sus elementos queden restringidos a los del tipo Numero utilizado en ejercicios anteriores. La Matriz debe poder ser recorrida usando un iterador, que recorra fila por fila. Implementar las clases y métodos necesarios para ésto. 10. Implementar una lista circular, y su iterador. 11. Para el juego de la Batalla de Botes (similar a Batalla Naval, pero con barcos que ocupan un solo casillero), se requiere una cuadrícula con filas numeradas de 1 a 8 y letras de A hasta la H. Implementar las clases Botes y Tablero con los siguientes métodos, que provea las siguientes funcionalidades: a. Agregar un bote en un casillero b. Saber si un casillero está ocupado o no c. Sacar un bote de un casillero (hundido) d. Reiniciar el tablero con todos los casilleros vacios e. Ubicar 8 botes en lugares aleatorios del tablero Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Los métodos que requieran que se les pase como parámetros lugares del tablero, para hacerlo más intuitivo para el usuario de la clase deberían recibir un carácter y un entero (columna – fila). 12. Para el punto anterior (11) implementar un iterador propio para el Tabler, que recorra de columna en columna. Utilizar este iterador para recorrer el tablero imprimiendo las posiciones de los botes, y la cantidad de botes que se encuentran en el tablero. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Unidad 4 1. Escriba una clase que contenga un elemento agregado y uno compuesto de dos tipos que defina. Agregue un atributo de tipo entero y extienda la clase hacia otra. Defina constructores por defecto donde se establezcan valores significativos para cada uno de los posibles atributos. Se desea tener la posibilidad de copiar un objeto de esta clase y que el siguiente código no genere excepciones: public class TestClonacion { private void checkAttributes(Clase1 original, Clase1 clonado) throws Exception { if (clonado == original) throw new Exception("Original y clonado son el mismo objeto."); if ( ! clonado.equals(original)) throw new Exception("Original y clonado no son iguales."); if (original.getAtribEntero() != clonado.getAtribEntero()) throw new Exception("Original y clonado no comparten el atributo de tipo primitivo."); if (original.getAtribAgregado() != clonado.getAtribAgregado()) throw new Exception("Original y clonado no comparten el atributo agregado."); if (original.getAtribCompuesto() == clonado.getAtribCompuesto()) throw new Exception("Original y clonado comparten el atributo compuesto."); if (original.getAtribCompuesto().equals( clonado.getAtribCompuesto())) throw new Exception("El atributo compuesto no es igual en ambos objetos."); } } private void run() throws CloneNotSupportedException, Exception { Clase2 base = new Clase2(); { Clase2 original = (Clase2) base; Clase2 clonado = (Clase2) original.clone(); checkAttributes(original, clonado); } { Clase1 original = (Clase1) base; Clase1 clonado = (Clase1) original.clone(); checkAttributes(original, clonado); } } public static void main(String[] args) { TestClonacion test = new TestClonacion(); try { test.run(); System.out.println("TEST EXITOSO."); }catch (Exception e) { System.out.println("HA FALLADO EL TEST."); e.printStackTrace(); } } Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 2. El siguiente diagrama de clases muestra la estructura que debe mantener una habitación de una casa en cuanto a composición y agregación de otros objetos. Se puede observar el carácter no propietario de la habitación para con sus muebles, esto es así por la facilidad que estos tienen de ser parte de una u otra habitación momentáneamente. Por lo tanto, el mobiliario de una habitación sólo indica el conjunto de elementos que puede estar en la misma pero no que necesariamente se encuentre para un momento dado. Se está trabajando en un modelador de casas en el cual se permite diseñar una vivienda y plantear su estilo de decoración. Uno de los módulos de la aplicación brinda casas prediseñadas para que el cliente modifique a placer. Se adjunta un trozo de código que se utiliza para testear el módulo. a. Implemente el modelo de forma tal que se puede practicar clonación para cualquier elemento y, en particular para una habitación. Chequee el funcionamiento utilizando el siguiente código; preste principal atención a la identidad de cada objeto contenido por las habitaciones. public class CasaBuilder { public static void main(String[] args) { Moviliario moviliario = new Moviliario(); moviliario.addMueble(new Silla()); moviliario.addMueble(new Mesa()); Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Habitacion prototipo = new Habitacion(moviliario); for(int i = 0; i < 3; ++i) { prototipo.addInstalacion(new Pared(prototipo)); } Habitacion quincho, comedor; quincho = (Habitacion) prototipo.clone(); comedor = (Habitacion) prototipo.clone(); comedor.addInstalacion(new Techo(comedor)); System.out.println("Habitación plantilla: " + prototipo.toString()); System.out.println("Quincho: " + quincho.toString()); System.out.println("Comedor: " + comedor.toString()); } } Para asegurarse de que la identidad de cada objeto sea la que se espera, puede utilizar su número identificatorio al momento de devolver su información. Redefina el método “toString()” de manera análoga a la siguiente: public class Silla extends Mueble { public String toString() { return "Silla Nº: " + String.valueOf(this.hashCode()); } } /* ... */ a. De acuerdo a la siguiente extensión al diagrama anterior, implemente los métodos necesarios para la clonación de una casa. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 3. a. En un tablero de ajedrez de 8 x 8 casilleros se desplaza un caballo de la forma usual, dos casillas vertical u horizontalmente y luego, una en dirección perpendicular en cualquier sentido. Determine una combinación con las posiciones sucesivas del caballo si se pretende que recorra todas y cada una de las casillas sin pasar más de una vez por el mismo punto. Utilice las funciones recursivas y los métodos propios de un modelo con manejo dinámico de memoria. b. Se encuentran 3 hobbits y 3 orcos en una costa del río. Todos pretenden pasar hacia el otro lado por lo que cooperaran en lo sucesivo. Los orcos, si se observan en mayor número que los hobbits se los devoran. Al borde del río encuentran un bote con capacidad de hasta dos navegantes. Indique la secuencia de viajes que deben hacerse en el bote para que todos pasen al otro lado del río. NOTAS: Tenga en cuenta que el bote no puede atravesar el río si no tiene al menos un conductor y que la cantidad de orcos debe ser mayor que la de hobbits en todo momento, inclusive cuando están desembarcando nuevos navegantes. El enunciado surte el mismo efecto si se utilizan exploradores-caníbales, alumnosprofesores o cualquier otro par antagónico. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 4. Una importante fábrica de embutidos se encuentra auspiciando una competencia entre clientes. El torneo consiste en comer cierta cantidad de panchos en el menor tiempo posible. Se establece una unidad de bocado estándar y, en base a esta se determinan las cantidades de bocados necesarias para consumir el pancho con los siguientes valores: 4 bocados para la salchicha y 6 bocados para el pan. Hay 3 competidores por mesa de los cuales sólo uno pasa a la próxima ronda, inicialmente hay 6 mesas y la eliminación es directa. Cada competidor cuenta con 3 bandejas o fuentes de 7 panchos cada una. La cantidad de bocados que un participante puede comer es un número decimal que se establece antes de cada ronda, de acuerdo al estado físico del sujeto. Esta capacidad disminuye a medida que el participante avanza sobre una bandeja pero se restaura en el momento en que éste consigue terminar la fuente. Simularemos la simultaneidad de acciones mediante turnos en los cuales cada participante tendrá la posibilidad de comer los bocados que pueda. La cantidad de bocados que un participante puede consumir por turno se calcula aleatoriamente al principio de la ronda con números decimales de entre 0,70 y 1,20; disminuye en 0,002 luego de cada turno pero es restablecida al valor determinado al cambiar de bandeja. a. Simule el torneo de acuerdo a lo descrito. b. Realice el diagrama de secuencia para el proceso que realizaría un participante si tuviera los turnos continuos. Puede basarse en el siguiente algoritmo simular la simultaneidad si así lo desea: bool hayGanador = false; while (! hayGanador) { // turno para un participante que determinamos aleatoriamente int indexActual = random.Next(0,participantes.Length); Participante partActual = participantes[indexActual]; /* ... Acciones para un participante ... */ } 5. En un paquete adquirido por su empresa se recibió un juego de clases de las cuales no se posee documentación. La utilización de estos tipos se torna por demás compleja debido al pobre desempeño del intellisense que posee el IDE que Uds. emplean. Se requiere una utilidad que genere documentación mínima sobre clases. Debe listar por pantalla todos los métodos y atributos para una determinada clase incluyendo clases ancestro e información acerca de cuales fueron las características heredadas. Las clases a listar puede ser pedidas al usuario en forma secuencial o pueden ser introducidas como argumento de ejecución del programa.. 6. a. Implemente una clase de utilidades que posea una función que, al recibir cualquier lista y un nombre de atributo, ordene la colección utilizando la interfaz de comparación correspondiente. Eleve las excepciones que crea convenientes en caso de no existir el atributo o cuando se encuentren objetos que no puedan ser ordenados. b. Agregue una sobrecarga a la función anterior para que admita un nombre de método y la lista de argumentos para su invocación. El objeto que este método retorne será el indicador del orden para la lista. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 c. Cree una función que filtre los objetos de una lista por un atributo o resultado de un método y devuelva una nueva lista con todos los objetos que cumplan el criterio. Agregue la posibilidad de filtrado por atributos anidados es decir, por atributos que posean los atributos. Impleméntela para cualquier nivel de anidamiento. 7. El gerente del departamento de sistemas en el cual trabajas descuidó una extensión a su sistema de inventario de stock en una consultora de software. Debido a la impericia de los analistas de la misma, una gran parte de los métodos de consulta a la base de datos fueron invocados con los argumentos invertidos o en orden no definido. No conforme con el producto, tu gerente pidió a la consultora que modifique el código y controle el orden de los argumentos de llamada. El resultado fue pésimo: no sólo se mantuvo la inversión de parámetros para algunos métodos sino que se aumentó el número de métodos involucrados. La clase original de acceso a datos se llama “StockDataAccess” y la estructura de sus métodos es la siguiente: public static String getNombreProducto(Integer idProducto,Region regionDeVenta); public static List getAllProductosInRegion(Region regionDeVenta, Boolean faltante); public static Integer getCantidadDisponible(Integer idProducto, Region regionDeVenta); public static Integer getCantidadDisponible(Producto producto, Region regionDeVenta); public static void setCantidadDisponible(Integer cantidad, Producto producto, Region region); La estructura de los Productos y Regiones -clases contenedoras, sin mayor importanciaestá dada por el siguiente esquema: public class Producto { private int id; private String nombre; private int familia; private String descripcion; private float precio; /* ... getters y setters ... */ } public class Region { private int id; private String nombre; /* ... getters y setters ... */ } Milagrosamente, te diste cuenta de que en la lista de parámetros para cada método, en forma individual, no se repite ningún tipo; por lo que se podría modificar el nombre de la clase StockDataAccess original y colocar en su lugar una clase adaptadora que acepte cualquier orden de parámetros y llame a la función adecuada. Luego de evaluar el costo de aplicar otra de sus brillantes ideas y ante presiones de la superioridad, tu gerente decidió que Ud. lo sacaría del apuro. a. Por favor, evite el despido de su gerente implementando una clase adaptadora que reemplace la original e invoque correctamente los métodos indicados. Llegaron ordenes de modificar cada una de las llamadas con parámetros incorrectos, sin embargo, ha cambiado el concepto de orden incorrecto: se debe determinar cuales funciones fueron llamadas más frecuentemente durante una semana de utilización constante del aplicativo, Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 usar esa combinación de tipos de argumentos como correcta. La semana de prueba comienza mañana por lo que su gerente está algo inquieto. b. Formule un registro estadístico de lo pedido, ubique archivo y línea de las funciones que no cumplan con el nuevo patrón para el orden de tipos para una modificación selectiva y gánese un bonus de fin de mes. 8. a. Implemente una herramienta de construcción que devuelva una lista de instancias de acuerdo a la información que obtenga de un archivo de texto. El archivo de texto contendrá en cada línea, las características de un objeto a instanciar. Para cada objeto se incluirá el nombre de la clase a construir más, en forma sucesiva y separados por tabulados, la información acerca de cada atributo del objeto. Para esto último se establece la siguiente sintaxis: “<nombre-atributo> = <valor-atributo>”. Para simplificar, suponga que los atributos son solamente de tipos primitivos y que las clases que pueden ser instanciadas siempre tienen constructor sin parámetros. Puede elevar las excepciones que considere necesario. b. Añada una función llamada “cloneIt” que reciba cualquier objeto y devuelva una copia clonada aunque su clase no implemente la interfaz “Cloneable”. En este caso considere que el objeto puede tener atributos de tipos no primitivos. 9. Un concepto interesante para el manejo de funcionalidades agregadas a un modelo de objeto está dado por los interceptores: funciones que se disparan cuando ocurre un cambio en determinada propiedad o se invoca determinado método. Brindan, generalmente, la posibilidad de agregar funcionalidad extra sin modificar las ya programadas. Ciertos lenguajes soportan tablas donde se puede vincular funciones a ejecutar con métodos que las disparan al momento de ser invocados. Un ejemplo sencillo se observa al poder realizar búsquedas de un producto en distintos medios: en una base de datos, en archivos de texto o en servicios web y pretender loguear cada consulta realizada. Se puede agrupar todos los métodos de búsqueda y asociarles el interceptor “Logueo”. Cuando se ejecute cualquier elemento de este conjunto se debe loguear una línea con la información pertinente. Se pretende una implementación de estos conceptos para nuestros lenguajes de trabajo mediante un pequeño framework. Se requiere una estructura que permita manejar interceptores en forma centralizada en detrimento de performance de procesamiento y para unos casos particulares de invocación, como ser: métodos cuyo nombre es igual o comienza con una cadena dada u otros. Para testear el framework realizado, implemente un modelo MINIMO de clases y agrupe algunos métodos en conjuntos indicando la acción a realizar cuando los mismos se ejecuten. Puede tomar el ejemplo brindado si lo desea y simular todas las acciones mediante impresiones en pantalla. Para llevar a cabo la implementación pedida se permite imponer restricciones sobre las clases que pertenecerán al framework y su codificación. Puede, por ejemplo, exigir que todos las clases hereden de una común o que todo método que admita agrupamiento bajo aspectos invoque una función como primera acción. Si desea conocer la lista de métodos que se han invocado puede utilizar la sentencia “Thread.currentThread().getStackTrace();” El siguiente ejemplo ilustra el modelo citado: Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 import InterceptorFrame.*; public class BuscadorWS extends InterceptorFrame.AbstractClass { public String getNombre(int idProducto) { //aseguro la posibilidad de ejecutar funciones antes de este //método en caso de ser necesario. this.preInvoke();. /*... funcionalidad ...*/ } } /* ... */ //idem después. this.postInvoke(); return nombre; /* ... */ public class Principal { public static void main(String[] args) { //obtenemos el manejador para loguear los accesos a base de //datos. Logger logger = new Logger(); //argumentos para el logueo: Object[] logArgs = new Object[] {“Log - se efectuó un acceso.”}; /*creamos un interceptor que puede asociarse a varios métodos de varias clases. Indicamos su nombre y el método que lo resolverá junto con su objeto y argumentos.*/ Interceptor loguearInterc = new Interceptor("Interceptor de Logueo”, logger, "logMethod" ,logArgs); //agregamos aspectos con (“nombre_método”, interceptor) Relations.setInterceptor( “getNombre”, loguearInterc); Relations.setInterceptor ( “getPrecio”, loguearInterc); Relations.setInterceptor ( “conectar”, loguearInterc); //una vez establecidos las relaciones se pueden usar las clases normalmente. BuscadorWS busc = new BuscadorWS(); System.out.println(busc.getNombre(10)); } } /* ... */ Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Capitulo 5: Pruebas unitarias (en desarrollo) Nota: Los ejercicios de este capítulo son para realizar utilizando las herramientas JUnit o NUnit, según el lenguaje con el cual se esté desarrollando. 1. Escriba las pruebas necesarias para probar el la clase Numero del ejercicio 1 del capítulo 2 de esta guía. 2. Escriba las pruebas necesarias para probar la lista circular programada en el ejercicio 10 del capítulo 3 de esta guía. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Capitulo 6: diseño, patrones y arquitectura 1. Se desea desarrollar un software para edición de texto. Si bien aún no sea decidido la plataforma de implementación se sabe que la plataforma proveerá componentes que implementen las siguientes interfaces. IParrafo agregarCaracter(char) quitarCaracter(int) setFuente(IFuente) getFuente() : IFuente getTexto() : string setTexto(string) • • ICajaDeTexto agregarParrafo(IParrafo) quitarParrafo(int) limpiar() El software debe cumplir con los siguientes requisitos: Soporte de distintas tipografias Herramienta de correción ortográfica Adicionalmente debe permitir crear, editar y leer documentos en distintos formatos (rtf, doc y sxi). Se sabe que se utilizará una arquitectura MVC. Diseñe las clases del modelo y el contralador utilizando diagramas UML de clases, secuencia y estado. 2. Diseñe un compresor/descompresor de archivos que soporte varios formatos de compresión. Abstraigase de los detalles algortimicos de implementación. Debe funcionar en modo consola. En el caso de la compresión debe recibir como parametro el nombre del archivo a comprimir el nombre del archivo de salida y el formato de compresión. Para la descompresión solo recibirá como parametro el archivo a descomprimir. 3. Dadas las arquitecturas en Capas y MVC: • Mencione sus componentes de cada junto con una breve descripción. • Muestre esquemáticamente mediante un diagrama la interacción entre los distintos componentes de cada arquitectura. 4. Diseñe un sistema que permita administrar el alquiler de peliculas en un video club. Concentrese en el la disponibilidad de peliculas y no en la parte de facturación. ¿Que arquitectura resultará más conveniente en Capas o MVC? Justifique su elección. 5. El departamento de computación desea desarrollar un aplicación para permitir a los profesores de las distintas materias del departamento llevar el control de notas de sus alumnos. Para ello ha elegido utilizar un arquitectura en capas y le ha encargado a cada una de las cátedras de algoritmos 3 la implementación de una capa. La cátedra Perez Berro se encargará de la presentación, mientras que Mandrafina se encargará de la capa de datos y finalmente Fontela implementará la capa de negocio. Los desarrolladores de la capa de datos han decidido implementar la persistencia utilizando el patrón ActiveRecord, es por eso que todas las clases persistentes deberán heredar la clase ActiveRecordBase. En base a estas consideraciones diseñe la capa de negocio, haga todas las hipotesis que considere necesarias. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Capítulo 8: Persistencia Serialización 1) Crear una colección que sea capaz de persistirse junto con los objetos que contiene 2) Crear una coleccion de objetos que pueda persistirse en formato xml. Los objetos también deben poder serializarse en xml 3) Dado una clase que tiene los métodos de servicios Enviar recibe un objeto serializable y lo convierte a string e invoca al método protegido enviarString EnviarString toma la clase serializada y la envía a al transportador destino. RecibirString transforma el string de entrada en el objeto original y notifica a los observadores enviandoles el objeto recibido Implementar los métodos de dicha clase y escribir un ejemplo de programa que la utilize. 4) La clase Círculo tiene los atributos radio, superficie y perímetro. Aunque superficie y perímetro se pueden calcular cada vez que se los pide, es necesario hacer uso de operaciones de punto flotante que son significativamente más costosas que una simple asignación. Por este motivo, el cálculo se realiza una sola vez y el resultado se guarda en atributos. ¿Como modificaría la clase Circulo para evitar serializar estos atributos calculables y lograr que solo guarde la mínima información necesaria? Clonación 1) Crear un método llamado ModificarLista(List L) que tome una colección de objetos, ejecute y el método modificar() de cada uno. Modificar es un método que cambia el estado de objetos y no existe un método que le devuleva el estado anterior. El método lanzará una excepción CouldNotExcecuteException si no se pudo completar su ejecución. El método modificarLista debe ser transaccional, es decir, o se modifican todos los objetos o no se modifica ninguno. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 2) El patrón creacional prototype permite crear objetos iguales a partir de un objeto inicializado con ciertos valores en sus atributos. Implementar el patrón prototype usando clonación utilizando como base el siguiente esquema 3) Dado un objeto que posee un método Siguiente() que cambia su posición interna dentro de una lista y un método EsFin() que indica si se llegó al final de la lista, crear un método que indique si al mover al siguiente elemento se llega al final sin alterar la posición actual. Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2 Capítulo 10: Aplicaciones distribuidas 1) Xmethods es una web en la que se listan servicios webs simples que se pueden consumir gratuitamente. Crear una aplicación de consola que consuma el ws que convierte temperaturas a diferentes escalas. La información necesaria se encuentra en www.xmethods.net buscando el ws que se llama “Temperature Convert”. Al seleccionarlo se mostrarán los detalles del ws como por ejemplo su WSDL que en este caso es http://java.hpcc.nectec.or.th:1978/axis/TemperatureConvert.jws?wsdl 2) Google posee una api para acceder a su sistema de búsqueda y del sistema de sugerencias por errores de ortografía. Generar dos aplicaciones de consola. a. La primera debe devolver, dado una cadena de búsqueda, los 20 primeros resultados indicando Título, URL y Tamaño de la página. b. La segunda aplicación debe, dado una cadena, sugerir su corrección en caso que google crea que xiste una palabra mal escrita. Google posee un API que se descarga gratuitamente desde http://www.google.com/apis/. Es necesario registrarse para obtener una clave que debe pasarse como parámetro obligatorio en cada invocación de sus servicios. El paquete que se descarga código de ejemplo, información de la WSDL documentación para poder desarrollar. 2) Construir una aplicación que exponga un WebService de tal manera que los clientes que se conectan puedan consultar los datos de un libro a partir de su isbn 3) Construir el cliente correspondiente a dicha aplicación 4) Construir un WS que permita almacenar objetos persistentes de manera remota y un cliente que le envíe la colección serialable realizada en el ejercicio de serialización y que también permita recuperarla 6) Generar una aplicación que utilize RMI en el objeto BolsaValores que tiene el método BigDecimal getCotización(int codAccion); 5) Construir una aplicación de CHAT con RMI Guía de ejercicios Algoritmos y Programación III (75.07) – cursos 1 y 2