Download Soluciones - Web del laboratorio del DIT
Document related concepts
no text concepts found
Transcript
Dpto. de Ingeniería de Sistemas Telemáticos E.T.S.I. Telecomunicación Universidad Politécnica de Madrid LABORATORIO DE PROGRAMACIÓN - Septiembre 2010 Examen Normas del examen: • • • Fechas: Con libros y apuntes. Duración: 2 horas No se contestará ninguna pregunta durante el examen. • • • notas provisionales: 24.9.2010 revisión: 1.10.2010 notas finales: 13.10.2010 Pregunta 1 (2 puntos) /** * Devuelve la casilla adyacente. * * @param orientacion indica en que direccion buscamos la casilla. * @return casilla adyacente en la direccion indicada. * @throws ExcepcionPosicionIncorrecta si no hay mas casillas en esa direccion. */ public Posicion adyacente(Orientacion orientacion) throws ExcepcionPosicionIncorrecta { switch (orientacion) { case N: return norte(); case S: return sur(); case E: return este(); case W: return oeste(); } return null; } Laboratorio de Programación 14.9.2010 página 1 Pregunta 2 (2 puntos) Hay que considerar: una posición en el borde superior y las cuatro orientaciones una posición en el borde inferior y las cuatro orientaciones una posición en el borde izquierdo y las cuatro orientaciones una posición en el borde derecho y las cuatro orientaciones una posición en medio del tablero y las cuatro orientaciones Dos casos de prueba: package test; import import import import barquitos.ExcepcionPosicionIncorrecta; barquitos.Orientacion; barquitos.Posicion; junit.framework.TestCase; /** * @author Jose A. Manas * @version Sep 25, 2010 */ public class TestPosicion extends TestCase { /** * Posicion al norte de una casilla central. * * @throws ExcepcionPosicionIncorrecta */ public void testOk() throws ExcepcionPosicionIncorrecta { Posicion p = new Posicion('C', 4); Posicion n = new Posicion('B', 4); assertEquals(n, p.adyacente(Orientacion.N)); } /** * Posicion al norte de una casilla en el borde superior. * * @throws ExcepcionPosicionIncorrecta */ public void testFallo() throws ExcepcionPosicionIncorrecta { Posicion p = new Posicion('A', 4); try { Posicion norte = p.adyacente(Orientacion.N); fail("no salta excepcion"); } catch (ExcepcionPosicionIncorrecta excepcion) { // pasa la prueba } } } Laboratorio de Programación 14.9.2010 página 2 Pregunta 3 (3 puntos) /** * Constructor. * * @param posiciones posiciones que ocupa el barco. * @throws IllegalArgumentException si el parametro es nulo o de cero posiciones. * @throws ExcepcionPosicionIncorrecta si las posiciones no estan alineadas o no son adyacentes. */ public DatosBarco(List<Posicion> posiciones) throws IllegalArgumentException, ExcepcionPosicionIncorrecta { if (posiciones == null || posiciones.size() < 1) throw new IllegalArgumentException(); posicion = posiciones.get(0); largo = posiciones.size(); if (largo == 1) { orientacion = Orientacion.N; return; } Posicion p2 = posiciones.get(1); if (p2.equals(posicion.norte())) orientacion = Orientacion.N; else if (p2.equals(posicion.sur())) orientacion = Orientacion.S; else if (p2.equals(posicion.este())) orientacion = Orientacion.E; else if (p2.equals(posicion.oeste())) orientacion = Orientacion.W; else throw new ExcepcionPosicionIncorrecta(p2.toString()); for (int i = 2; i < largo; i++) { Posicion pm = posiciones.get(i - 1); Posicion pn = posiciones.get(i); if (!pn.equals(pm.adyacente(orientacion))) throw new ExcepcionPosicionIncorrecta(pn.toString()); } } Laboratorio de Programación 14.9.2010 página 3 Pregunta 4 (3 puntos) package barquitos; import log.Logger; import import import import import import java.io.BufferedReader; java.io.File; java.io.FileReader; java.io.IOException; java.util.ArrayList; java.util.List; /** * Clase auxiliar. * Carga datos de un fichero para meterlos en la partida. * * @author Laboratorio de Programacion * @version examen: 14.9.2010 */ public class Carga4 { private static final Logger LOGGER = Logger.getLogger("barquitos.Carga"); private List<DatosBarco> flota1, flota2; private List<Posicion> jugadas; /** * Lee datos de un fichero. * * @param file fichero a leer. * @throws java.io.IOException si hay errores de E/S. */ public Carga4(File file) throws IOException { flota1 = new ArrayList<DatosBarco>(); flota2 = new ArrayList<DatosBarco>(); jugadas = new ArrayList<Posicion>(); FileReader fileReader = new FileReader(file); BufferedReader reader = new BufferedReader(fileReader); try { // primera linea carga(flota1, reader.readLine()); // segunda linea carga(flota2, reader.readLine()); // demas lineas ... String line = reader.readLine(); while (line != null) { disparos(jugadas, line.trim()); line = reader.readLine(); } } catch (ExcepcionPosicionIncorrecta excepcion) { LOGGER.log(Logger.CONFIG, "carga: ", excepcion); throw new IOException(excepcion.getMessage()); } reader.close(); } Laboratorio de Programación 14.9.2010 página 4 /** * Metodo auxiliar para construir posiciones. * * @param casilla fila-columna en forma de texto. * @return la posicion correspondiente. * @throws ExcepcionPosicionIncorrecta si la posicion no es posible. */ private static Posicion creaPosicion(String casilla) throws ExcepcionPosicionIncorrecta { char fila = casilla.charAt(0); int columna = Integer.parseInt(casilla.substring(1)); return new Posicion(fila, columna); } /** * Carga los datos de una flota. * * @param flota la flota que queremos cargar. * @param linea datos del fichero con los datos. * @throws ExcepcionPosicionIncorrecta si hay alguna posicion imposible. */ private void carga(List<DatosBarco> flota, String linea) throws ExcepcionPosicionIncorrecta { String[] partes = linea.split(" "); for (String posiciones : partes) { List<Posicion> lista = new ArrayList<Posicion>(); String[] casillas = posiciones.split(","); for (String casilla : casillas) { Posicion posicion = creaPosicion(casilla); lista.add(posicion); } DatosBarco datos = new DatosBarco(lista); flota.add(datos); } } /** * Carga los sucesivos disparos. * * @param jugadas lista de disparos que queremos cargar. * @param linea datos del fichero con los datos. * @throws ExcepcionPosicionIncorrecta si hay alguna posicion imposible. */ private void disparos(List<Posicion> jugadas, String linea) throws ExcepcionPosicionIncorrecta { String[] casillas = linea.split(" "); for (String casilla : casillas) { Posicion posicion = creaPosicion(casilla); jugadas.add(posicion); } } Laboratorio de Programación 14.9.2010 página 5 /** * @return barcos iniciales del primer jugador. */ public List<DatosBarco> getFlota1() { return flota1; } /** * @return barcos iniciales del segundo jugador. */ public List<DatosBarco> getFlota2() { return flota2; } /** * Serie de jugadas de la partida, alternando jugador1 y jugador2. * * @return lista ordenada de disparos realizados. */ public List<Posicion> getJugadas() { return jugadas; } } Laboratorio de Programación 14.9.2010 página 6