Skip to content
Snippets Groups Projects
Commit f2e293c1 authored by Javier Calvo's avatar Javier Calvo
Browse files

Puerto, Muelle y Contenedor menos el transito creados

Falta ver lo de alternarTecho() si lo metemos como metodo del muelle
parent 0cbf2c30
Branches
No related tags found
No related merge requests found
...@@ -10,7 +10,7 @@ package es.markse; ...@@ -10,7 +10,7 @@ package es.markse;
*/ */
public class Contenedor { public class Contenedor {
private String codigo; private String codigo;
private float pesoContenedor; private float pesoTara;
private float maximaCargaUtil; private float maximaCargaUtil;
private float volumen; private float volumen;
private boolean transito; private boolean transito;
...@@ -28,33 +28,141 @@ public class Contenedor { ...@@ -28,33 +28,141 @@ public class Contenedor {
* @param techo indica si tiene techo (true) o no (false) * @param techo indica si tiene techo (true) o no (false)
*/ */
public Contenedor(String codigoDueno, char equipamiento, String numeroSerie, float pesoContenedor, float maximaCargaUtil, float volumen, boolean transito, boolean techo) { public Contenedor(String codigoDueno, char equipamiento, String numeroSerie, float pesoContenedor, float maximaCargaUtil, float volumen, boolean transito, boolean techo) {
//Comparamos que el codigo del dueño sea correcto validarCodigoDueno(codigoDueno.toUpperCase());
if (codigoDueno.length() != 3 || !codigoDueno.matches("[A-Za-z]{3}")) { validarEquipamiento(equipamiento);
throw new IllegalArgumentException("El Codigo del dueño debe tener 3 letras solo"); validarNumeroSerie(numeroSerie);
this.pesoTara = pesoContenedor;
this.maximaCargaUtil = maximaCargaUtil;
this.volumen = volumen;
this.transito = transito;
this.techo = techo;
String digitoControl = String.valueOf(calcularDigitoControl(codigoDueno, equipamiento, numeroSerie));
this.codigo = codigoDueno + equipamiento + numeroSerie + digitoControl;
} }
//Comparamos que el equipamiento sea correcto /**
if (equipamiento != 'U' && equipamiento != 'J' && equipamiento != 'Z') { * Metodo que compara e codigo del dueño para ver si es correcto
throw new IllegalArgumentException("El equipamiento debe ser 'U', 'J' o 'Z'."); * @param codigoDueno Cadena de 3 letras mayusculas
* @throws Devuelve una excepcion si no coincide con el patron
*/
private void validarCodigoDueno(String codigoDueno) {
if (codigoDueno.length() != 3 || !codigoDueno.matches("[A-Z]{3}")) {
throw new IllegalArgumentException("El código del dueño debe tener 3 letras mayúsculas.");
}
} }
//Comparamos que el numero de serie no contenga letras y sea de 6 digitos /**
if (numeroSerie.length() !=6 ) { * Metodo que sirve para comparar si el equipamiento es uno de los correctos
throw new IllegalArgumentException("El equipamiento debe ser 'U', 'J' o 'Z'."); * @param equipamiento Es un caracter que indica el equipamiento
* @throws devuelve una excepcion si no es una de esas letras
*/
private void validarEquipamiento(char equipamiento) {
if (equipamiento != 'U' && equipamiento != 'J' && equipamiento != 'Z') {
throw new IllegalArgumentException("Equipamiento debe ser 'U', 'J' o 'Z'.");
}
} }
for (char c : numeroSerie.toCharArray()) {
if (!Character.isDigit(c)) { /**
throw new IllegalArgumentException("El número no debe contener letras."); * metodo para comparar si el numero de serie es correcto
* @param numeroSerie el numero de serie del contenedor
* @throws devuelve un error si el patron no coincide (6 numeros)
*/
private void validarNumeroSerie(String numeroSerie) {
if (numeroSerie.length() != 6 || !numeroSerie.matches("\\d{6}")) {
throw new IllegalArgumentException("El número de serie debe tener 6 dígitos.");
} }
} }
//CONSTRUIR EL CODIGO MEDIANTE EL ALGORITMO /**
* Metodo que sirve para calcular el diito de control mediante el codigo del dueño, el equipamiento y el
* numero de serie
* @return devuelve el digito de control
*/
private int calcularDigitoControl(String codigoDueno, char equipamiento, String numeroSerie) {
String codigoCompleto = codigoDueno + equipamiento + numeroSerie;
int[] valores = {10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38};
int suma = 0;
for (int i = 0; i < codigoCompleto.length(); i++) {
char c = codigoCompleto.charAt(i);
int valor;
if (Character.isLetter(c))valor = valores[c - 'A'];
else valor = Character.getNumericValue(c);
suma += valor*(int) Math.pow(2, i);
}
int resto = suma % 11;
return (resto == 10) ? 0 : resto;
} }
/**
* Metodo que sirve para devolver el codigo del contenedor
* @return el codigo del contenedor (compelto)
*/
public String getCodigo() { public String getCodigo() {
// TODO Auto-generated method stub
return this.codigo; return this.codigo;
} }
/**
* Metodo que devuelve si un contenedor tiene techo
* @return si tiene techo (true) o si no lo tiene (false)
*/
public boolean tieneTecho() {
return this.techo;
}
/**
* 1.1.13 Metodo que sirve para cambiar el estado a recogida de un contenedor
*/
public void cambiarEstadoARecogida() {
this.transito = false;
}
/**
* 1.1.14 metodo que sirve para cambiar un contenedor a estado de transito
*/
public void cambiarEstadoATransito() {
this.transito = true;
}
/**
* 1.1.15 Metodo que cambia un contenedor que no tenga techo a que lo tenga, y al contrario
*/
//HAY QUE MIRAR SI EL CONTENEDOR SE PUEDE CAMBIAR DE TECHO A NO DESDE FUERA (MUELLE?? USAMUELLE..)
public void alternarTecho() {
this.techo = !this.techo;
}
/**
* 1.1.16 Metodo que devuelve el volumen del contenedor en metros cubicos
* @return volumen en metros cubicos
*/
public float volumenEnMetrosCubicos() {
return this.volumen;
}
/**
* 1.1.17 metodo que devuelve el volumen del contenedor en pies cubicos
* @return volumen en pies cubicos
*/
public float volumenEnPiesCubicos() {
return this.volumen*35.3147f;
}
/**
* 1.1.18 Metodo que devuelve el peso del contenedor en Kilogramos
* @return peso del contenedor en kilogramos
*/
public float obtenerPesoKilos() {
return this.pesoTara;
}
/**
* 1.1.19 Metodo que devuelve el peso del contenedor en Libras
* @return peso del contenedor en Libras
*/
public float obtenerPesoLibras() {
return this.pesoTara*2.20462f;
}
} }
\ No newline at end of file
/** /**
* Copyright UVa 2024/2025 * Copyright UVa 2024/2025
*/ */
package es.markse; package es.markse;
import java.time.LocalDate;
import es.uva.inf.poo.maps.GPSCoordinate; import es.uva.inf.poo.maps.GPSCoordinate;
/** /**
...@@ -13,7 +13,6 @@ import es.uva.inf.poo.maps.GPSCoordinate; ...@@ -13,7 +13,6 @@ import es.uva.inf.poo.maps.GPSCoordinate;
public class Muelle { public class Muelle {
private Plaza[] plazas; private Plaza[] plazas;
private int altura;
private int identificador; private int identificador;
private boolean operativo; private boolean operativo;
private GPSCoordinate cord; private GPSCoordinate cord;
...@@ -39,7 +38,10 @@ public class Muelle { ...@@ -39,7 +38,10 @@ public class Muelle {
this.operativo=operativo; this.operativo=operativo;
this.plazas = new Plaza[plazas]; this.plazas = new Plaza[plazas];
this.plazasVacias = plazas; this.plazasVacias = plazas;
this.altura = altura;
for (int i = 0; i < plazas; i++) {
this.plazas[i] = new Plaza(altura);
}
} }
/** /**
...@@ -81,6 +83,7 @@ public class Muelle { ...@@ -81,6 +83,7 @@ public class Muelle {
* @return numero de plazas vacias. * @return numero de plazas vacias.
*/ */
public int plazasVacias() { public int plazasVacias() {
this.actualizarPlazas();
return this.plazasVacias; return this.plazasVacias;
} }
...@@ -91,6 +94,7 @@ public class Muelle { ...@@ -91,6 +94,7 @@ public class Muelle {
* @return plazasLlenas * @return plazasLlenas
*/ */
public int plazasLlenas() { public int plazasLlenas() {
this.actualizarPlazas();
return this.plazasLlenas; return this.plazasLlenas;
} }
...@@ -100,6 +104,7 @@ public class Muelle { ...@@ -100,6 +104,7 @@ public class Muelle {
* @return plazasSemillenas * @return plazasSemillenas
*/ */
public int plazasSemillenas() { public int plazasSemillenas() {
this.actualizarPlazas();
return this.plazasSemillenas; return this.plazasSemillenas;
} }
...@@ -139,17 +144,20 @@ public class Muelle { ...@@ -139,17 +144,20 @@ public class Muelle {
* 1.1.11 Metodo para colocar un contenedor en una plaza y apilarlo si es posible * 1.1.11 Metodo para colocar un contenedor en una plaza y apilarlo si es posible
* @param codigo Codigo del contenedor que queremos colocar * @param codigo Codigo del contenedor que queremos colocar
* @param plaza La plaza del contenedor * @param plaza La plaza del contenedor
* @return true si lo ha colocado. False si no, ya que puede ser que la plaza este llena, el contenedor ya este colocado * @return Error si el contenedor ya esta apilado en ese muelle, si la plaza esta llena o si la plaza
* en otra plaza, o que el no tenga techo el ultimo * no pertenece al muelle (una plaza mayor a las que hay o menor a 0)
*/ */
public boolean colocarContenedorEnPlaza(Contenedor contenedor, int plaza) { public void colocarContenedorEnPlaza(Contenedor contenedor, int plaza) {
//Si el contenedor ya esta dentro, o la plaza esta fuera del rango de plazas devuelve false if (this.plazaActual(contenedor.getCodigo()) != -1) {
if (this.plazaActual(contenedor.getCodigo()) != -1 || plaza<0 || plaza>this.plazas.length) { throw new IllegalArgumentException("El contenedor ya esta apilado en este muelle");
return false; }
else if(plaza<0 || plaza>this.plazas.length) {
throw new IllegalArgumentException("La plaza esta fuera del rango de las plazas del muelle. 0 -" + (this.numeroDePlazasTotales()-1));
} }
//Aqui devolvera true si se coloca o false si no (Esta lleno o el ultimo no tiene techo
else { else {
return this.plazas[plaza].colocarContenedor(contenedor); if (!this.plazas[plaza].colocarContenedor(contenedor))
throw new IllegalArgumentException("La plaza esta llena");
} }
} }
...@@ -162,11 +170,30 @@ public class Muelle { ...@@ -162,11 +170,30 @@ public class Muelle {
public boolean sacarContenedorDePlaza(Contenedor contenedor) { public boolean sacarContenedorDePlaza(Contenedor contenedor) {
for (Plaza plaza : this.plazas) { for (Plaza plaza : this.plazas) {
if (plaza != null && plaza.estaEnUltimoNivel(contenedor.getCodigo())) { if (plaza != null && plaza.estaEnUltimoNivel(contenedor.getCodigo())) {
plaza.desapilarContenedor() plaza.desapilarContenedor();
return true; return true;
} }
} }
return false; return false;
} }
/**
* Metodo para actualizar las plazas
* Este metodo es empleado si el alternarTecho() del contenedor se ejecuta desde fuera del muelle.
*/
private void actualizarPlazas() {
this.plazasLlenas = 0;
this.plazasVacias = 0;
this.plazasSemillenas = 0;
for (Plaza plaza: this.plazas) {
int cont = plaza.numeroContenedores();
if(cont == 5)this.plazasLlenas++;
else if(cont == 0) this.plazasVacias++;
else {
if(plaza.ultimoContenedor().tieneTecho())this.plazasLlenas++;
else this.plazasSemillenas++;
}
}
}
} }
\ No newline at end of file
...@@ -31,7 +31,7 @@ public class Plaza { ...@@ -31,7 +31,7 @@ public class Plaza {
* @return true si contiene ese contenedor en la Plaza o false si no lo tiene * @return true si contiene ese contenedor en la Plaza o false si no lo tiene
*/ */
public boolean contieneContenedor(String codigo) { public boolean contieneContenedor(String codigo) {
return contenedores.stream().anyMatch(c -> c.getCodigo().equals(codigo)); return this.contenedores.stream().anyMatch(c -> c.getCodigo().equals(codigo));
} }
/** /**
...@@ -40,8 +40,8 @@ public class Plaza { ...@@ -40,8 +40,8 @@ public class Plaza {
* @return la altura en la que se encuentra (del 1 que es la baja ahasta n, que es el máximo de contenedores apilabres) * @return la altura en la que se encuentra (del 1 que es la baja ahasta n, que es el máximo de contenedores apilabres)
*/ */
public int nivelContenedor(String codigo) { public int nivelContenedor(String codigo) {
for (int i = 0; i < contenedores.size(); i++) { for (int i = 0; i < this.contenedores.size(); i++) {
if (contenedores.get(i).getCodigo().equals(codigo)) { if (this.contenedores.get(i).getCodigo().equals(codigo)) {
return i + 1; return i + 1;
} }
} }
...@@ -59,8 +59,7 @@ public class Plaza { ...@@ -59,8 +59,7 @@ public class Plaza {
if (this.contenedores.size() >= this.altura) { if (this.contenedores.size() >= this.altura) {
return false; return false;
} }
// Si está vacío o el último contenedor tiene techo, coloca el contenedor if (this.contenedores.isEmpty() || this.ultimoContenedor().tieneTecho()) {
if (this.contenedores.isEmpty() || this.contenedores.get(this.contenedores.size() - 1).tieneTecho()) {
this.contenedores.add(contenedor); this.contenedores.add(contenedor);
return true; return true;
} }
...@@ -74,14 +73,37 @@ public class Plaza { ...@@ -74,14 +73,37 @@ public class Plaza {
* @return true si es el ultimo o false si no lo es. * @return true si es el ultimo o false si no lo es.
*/ */
public boolean estaEnUltimoNivel(String codigoContenedor) { public boolean estaEnUltimoNivel(String codigoContenedor) {
return !this.contenedores.isEmpty() && this.contenedores.get(this.contenedores.size() - 1).getCodigo().equals(codigoContenedor); return !this.contenedores.isEmpty() && this.ultimoContenedor().getCodigo().equals(codigoContenedor);
} }
/** /**
* Metodo que desapila el contendor * Metodo que desapila el contendor
*/ */
public void desapilarContenedor() { public void desapilarContenedor() {
contenedores.remove(contenedores.size() - 1); this.contenedores.remove(contenedores.size() - 1);
} }
/**
* Metod que devuelve el ultimo contenedor de la Plaza
* @return ultimo contenedor de la plaza
*/
public Contenedor ultimoContenedor() {
return contenedores.get(contenedores.size() -1);
}
/**
* Metodo que devuelve el numero decontenedores
* @return numero de contenedores
*/
public int numeroContenedores() {
return contenedores.size();
}
/**
* Metodo que devuelve la altura maxima de la plaza
* @return altura
*/
public int altura() {
return this.altura;
}
} }
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
package es.markse; package es.markse;
/** /**
* @author Javier * @author javcavl
* *
*/ */
public class UsaContenedor { public class UsaContenedor {
...@@ -24,8 +24,19 @@ public class UsaContenedor { ...@@ -24,8 +24,19 @@ public class UsaContenedor {
c.cambiarEstadoATransito(); c.cambiarEstadoATransito();
//cambiar a contenedor tiene techo o no //cambiar a contenedor tiene techo o no
c.cambiarSiTieneTecho(); c.alternarTecho();
//obtener el volumen del contenedor en metros cúbicos
c.volumenEnMetrosCubicos();
//obtener el volumen del contenedor en pies cúbicos
c.volumenEnPiesCubicos();
//obtener el peso del contenedor en Kilogramos
c.obtenerPesoKilos();
//obtener el peso del contenedor en Libras
c.obtenerPesoLibras();
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment