Subido por tumachy tumachyto

GuiaEjercicios7507F

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