• No se han encontrado resultados

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2007.

N/A
N/A
Protected

Academic year: 2021

Share "FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2007."

Copied!
6
0
0

Texto completo

(1)

Universidad Politécnica de Madrid

ETSI Telecomunicación, Ciudad Universitaria, 28040 Madrid

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2007.

Normas de examen:

Con libros y apuntes. Duración: 2 horas.

Responda a cada problema en hojas separadas

No se contestará ninguna pregunta durante el examen.

Problema 1 (5 puntos)

Se desea implementar un sistema de gestión de listas musicales (listas de canciones) en una comunidad de usuarios. El diagrama de clases que representa los elementos de este sistema es el siguiente:

En este sistema:

- un usuario queda definido por su identificador dentro del mismo (id) y puede tener asociado un número cualesquiera de listas de canciones (0 ó más).

- una canción queda identificada por su título y su duración.

- una lista de música queda identificada por su nombre y tiene asociada una lista de canciones. - una comunidad de usuarios queda definida por la lista de usuarios que lo componen.

Se pide:

Pregunta 1.1: Escriba el código de la clase Usuario, de acuerdo con la especificación del diagrama de clases (un usuario nuevo todavía no tiene ninguna lista de canciones asociada).

public class Usuario {

private String id;

private List<ListaMusica> listas;

public Usuario (String id) { this.id = id;

this.listas = new ArrayList<ListaMusica>(); }

public String getId () { return id;

(2)

Fundamentos de programación 6.9.2007 página 2

public List<ListaMusica> getListas () { return listas;

}

public void addLista (ListaMusica l) { this.listas.add(l);

}

public String toString () { return id;

} }

Pregunta 1.2: Escriba el código del método removeCancion de la clase ListaMusica. Este método elimina una canción cuyo título se pasa como parámero de una lista de canciones. Notas: si no existe ninguna canción con el título del parámetro en la lista, el método no hace nada; si existe más de una canción con el título del parámetro, el método sólo debe eliminar la primera canción que encuentre en la lista.

public void removeCancion (String t) { for (Cancion c: listaCanciones) { if (c.getTitulo() == t) { listaCanciones.remove(c); return; } } }

Pregunta 1.3: Escriba el código del método addUsuario de la clase Comunidad. Este método debe añadir un usuario a la comunidad siempre y cuando el identificador (id) del nuevo usuario no esté ya asociado a algún otro usuario.

public boolean addUsuario (Usuario u) { boolean presente = false;

for (Usuario user: listaUsuarios) { if (user.getId() == u.getId()) { presente = true; } } if (!presente) listaUsuarios.add(u); return presente; }

Pregunta 1.4: Escriba el código del método existeCancion de la clase Comunidad. Este método debe buscar entre todas las canciones, de todas las listas, de todos los usuarios, si existe una canción con el título que se pasa como parámetro, devolviendo en ese caso, true.

public boolean existeCancion (String t) { for (Usuario u: listaUsuarios) {

for (ListaMusica l: u.getListas()) {

for (Cancion c: l.getListaCanciones()) { if (c.getTitulo() == t) { return true; } } } } return false; }

(3)
(4)

Problema 2 (5 puntos)

Estamos trabajando con una aplicación de reserva de butacas de un multicine. Para hacer las reservas utilizamos un conjunto de menús, y todos ellos incluyen tres botones: siguiente, anterior y salir. En cada menú se realizan algunas actividades de la reserva y las transiciones son las que aparecen en la figura:

Queremos una solución que se pueda adaptar con facilidad a otros casos parecidos (por ejemplo reservar asientos de tren, reservar libros de bibliotecas, etc.). Y para ello trabajaremos con las seis clases que aparecen en el siguiente diagrama:

La clase EjecucionReserva se encarga de gestionar la evolución de general de la reserva y está diseñada para poder ser reutilizada en otros casos. La clase Estado es una clase abstracta de los posibles estados de la reserva. Las clases SeleccionPelicula, SeleccionAsiento, Inicial, Reserva,

Confirmacion son las clases que gestionan cada una de las fases de la reserva. La clase

EjecucionReserva incluye un array con los estados que ejecuta la reserva; el estado anterior a un estado en la posición "i", es el "i-1", y el siguiente es el "i+1" (el anterior al de la posición 0 es el último, y el siguiente al último es el 0); el estado inicial es el estado de la posición 0.

El código de la clase EjecucionReserva es:

public class EjecucionReserva {

public enum Boton {Siguiente, Anterior, Salir} protected Estado[] estados;

int posicionActual=0;

public void nuevoEstado(Estado estado, int posicion) { estados[posicion]=estado;

}

protected Estado getEstado(int i) {

return estados[i];

}

(5)

public void transicion(Boton botonSeleccionado) { if (botonSeleccionado == Boton.Siguiente)

posicionActual=(posicionActual+1) % estados.length; else if (botonSeleccionado == Boton.Anterior)

posicionActual=(posicionActual-1) % estados.length;

else return;

}

public Boton ejecutaEstado() {

estados[posicionActual].muestraMenu(); estados[posicionActual].procesaMenu(); return estados[posicionActual].leeSalida(); }

public void ejecutaReserva() {

Boton salidaSeleccionada;

do {

salidaSeleccionada=ejecutaEstado(); if (salidaSeleccionada == Boton.Salir) return; transicion(salidaSeleccionada);

} while (true); }

public EjecucionReserva(int numeroEstados) { estados=new Estado[numeroEstados]; }

}

Los métodos (abstractos) muestraMenu y procesaMenu de la clase Estado, muestran el menú del estado correspondiente a esa fase de la reserva, y procesan los diálogos con el usuario. procesaMenu termina dejando en el campo salida el botón pulsado al terminar el estado (Anterior, Siguiente o Salir). El método leeSalida devuelve el contenido del campo salida. La clase Estado incluye dos método protegidos (protected): Estado getAnterior(), Estado getSiguiente(), que devuelven el estado anterior y el siguiente, al estado de reserva sobre el que se hace la llamada.

Los constructores de las clases SeleccionPelicula, SeleccionAsiento, Inicial, Reserva, Confirmacion no tienen argumentos.

Pregunta 2.1: Escribir un método main que cree una instancia de EjecucionReserva con los estados que aparecen en la primera figura, y que ejecute una reserva.

public void main(String[] arg) {

EjecucionReserva er=new EjecucionReserva(5); er.nuevoEstado(new Inicial(),0); er.nuevoEstado(new SeleccionPelicula(), 1); er.nuevoEstado(new SeleccionAsiento(), 2); er.nuevoEstado(new Reserva(), 3); er.nuevoEstado(new Confirmacion(), 4); er.ejecutaReserva(); }

Pregunta 2.2: Queremos escribir el cuerpo de los métodos muestraMenu de la clase Confirmacion. Este menú debe mostrar la película y el asiento seleccionados, y dos botones OK y Cancelar (además de los botones siguiente, anterior y salir) que permitan confirmar la reserva. Cuando se pulsa Cancelar se deberá anular la reserva hecha, y con OK damos por terminada la reserva y en ambos casos volvemos a Inicio. Para ello emplearemos los métodos auxiliares:

getPeliculaSeccionada() de la clase SeleccionPelicula. Devuelve un String con el título de la película que se ha seccionado en la fase de sección de película.

getAsientoSeleccionado de la clase SeleccionAsiento. Devuelve String con el asiento seleccionado en la fase de selección de asiento.

Button putButton(String mensaje). Muestra un botón en la pantalla con el mensaje que indica el parámetro.

(6)

Fundamentos de programación 6.9.2007 página 6

public void muestraMenu() { String asiento="?"; String pelicula="?";

Estado as=getAnterior().getAnterior(); if (as instanceof SeleccionAsiento) {

asiento=((SeleccionAsiento) as).getAsientoSeleccionado(); Estado pel=as.getAnterior();

if (pel instanceof SeleccionPelicula) {

SeleccionPelicula selección= (SeleccionPelicula) pel; pelicula= seleccion.getPeliculaSeleccionada();

} }

putMessage("Confima la reserva del asiento " + asiento + " de la Pelicula "+pelicula); sig=putButton("Siguiente"); ant=putButton("Anterior"); sal=putButton("Salir"); ok=putButton("OK"); can=putButton("Cancel"); }

public void procesaMenu() {

Button sel=getButtonPressed(); if (sel == sig) {

salida=EjecucionReserva.Boton.Siguiente; } else if (sel == ant) {

salida=EjecucionReserva.Boton.Anterior; } else if (sel == sal) {

salida=EjecucionReserva.Boton.Salir; } else if (sel == ok) {

salida=EjecucionReserva.Boton.Siguiente; } else if (sel == can) {

((Reserva) getAnterior()).cancelarReserva(); salida=EjecucionReserva.Boton.Siguiente;

} else {

putMessage("Error interno en la seleccion de opción"); }

Referencias

Documento similar

Sabemos que, normalmente, las ​cookies deben ser almacenadas y enviadas de vuelta al servidor sin modificar; sin embargo existe la posibilidad de que un atacante

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones

&#34;No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería

&lt;la,ar fu gravedad,yriefgoenqu~pnneal enlasGlandula,, vnasr - Animal que la pade&lt;c:Y afsi diré, quepo- 1&lt;n,a pcqucñor, como mediasxuuexa~nó Pedro drn Crrcenrino cn

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,

o Si dispone en su establecimiento de alguna silla de ruedas Jazz S50 o 708D cuyo nº de serie figura en el anexo 1 de esta nota informativa, consulte la nota de aviso de la

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de

b) Si ahora se considerara ´ unicamente una muestra aleatoria de los tiempos de impresi´on para 70 plantillas para la impresora A, de las que se obtiene una media de 20 y