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