viernes, 11 de abril de 2014

Práctica Llaves POO

Buenas gente. Aquí os traigo otra práctica de Java de primer año. Esta es la (según tengo apuntado) número 6. prLlaves. Aquí os dejo para descargar el enunciado y el test.

Os copio parte del enunciado para que veais más o menos de que va. No lo puedo copiar entero porque el pdf está mal creado y no me deja T_T
Una llave está formada por un número determinado de dientes, cada uno de una altura (una llave se representará como una lista de enteros). 
Inicialmente las llaves tienen sus dientes sin limar a una altura de 10mm, obteniéndose el perfil deseado limando cada uno de estos dientes una altura ni (entre 0 y 10), de forma que la altura final de cada uno de estos dientes sea 10 - ni.
Aquí tenéis la clase test para probarla:

public class TestLlaves {
 public static void main(String[] args) {
  try {
   Llave l = new Llave(3);
   Cerradura c = new Cerradura(3);
   Cerradura cc = new Cerradura(3);
   Cerradura ccc = new Cerradura(2);
   l.limarDiente(2, 4);
   l.limarDiente(1, 3);
   l.limarDiente(0, 8);
   System.out.println("Llave " + l);
   c.agregarMarca(0, 8);
   c.agregarMarca(1, 3);
   c.agregarMarca(2, 4);
   System.out.println("Cerradura 1 " + c);
   cc.agregarMarca(0, 3);
   cc.agregarMarca(2, 9);
   cc.agregarMarca(0, 8);
   cc.agregarMarca(1, 3);
   cc.agregarMarca(2, 4);
   System.out.println("Cerradura 2 " + cc);
   ccc.agregarMarca(0, 2);
   ccc.agregarMarca(0, 5);
   ccc.agregarMarca(1, 9);
   System.out.println("Cerradura 3 " + ccc);
   System.out.println("¿Encaja la llave con la cerradura 1? "
     + c.abrir(l));
   System.out.println("¿Encaja la llave con la cerradura 2? "
     + cc.abrir(l));
   System.out.println("¿Encaja la llave con la cerradura 3? "
     + ccc.abrir(l));
  } catch (LyCException e) {
   System.out.println("Operación incorrecta: " + e.getMessage());
  }
 }
}

Y aquí teneis los resultados: - La class LyCException

public class LyCException extends Exception{
 private static final long serialVersionUID = 1L;
 //Si fuera una excepcion no comprobada se usaria extends RunTimeException.
  public LyCException() {
   super();
  }
  public LyCException(String e) {
   super(e);
  }
 }

La class Llave

import java.util.*;


public class Llave {
 static final int MAX_ALTURA_DIENTE = 10;
 private List<Integer> dientes;
 
 public Llave(int numDientes) {
  dientes = new ArrayList<Integer>(numDientes);
  for(int i = 0; i<numDientes; i++) {
   dientes.add(MAX_ALTURA_DIENTE);
  }
 }
 public void limarDiente(int diente, int altura) throws LyCException{
  if(diente >=dientes.size()) throw new LyCException("No existe ningún diente en esa posición");
  int alturaAntigua = dientes.get(diente);
  if(altura> alturaAntigua) throw new LyCException("No puedes limarlo tanto");
  dientes.set(diente, alturaAntigua - altura);
 }
 public int obtenerAltura(int diente) {
  return dientes.get(diente);
 }
 public int numeroDeDientes() {
  return dientes.size();  
 }
 public String toString() {
  return dientes.toString();
 }
}

Y por último la class Cerradura

import java.util.*;

public class Cerradura {
 static final int MAX_MARCAS_POR_ANCLAJE = 4;
 private List<Set<Integer>> anclajes;
 
 public Cerradura(int numAnclajes) {
  anclajes = new ArrayList<Set<Integer>>(numAnclajes);
  for(int i = 0; i< numAnclajes; i++) {
   anclajes.add(new HashSet<Integer>(MAX_MARCAS_POR_ANCLAJE));
  }
 }
 public void agregarMarca(int anclaje, int marca) throws LyCException{  //.................poner throws
  if (anclajes.get(anclaje).size()>=MAX_MARCAS_POR_ANCLAJE) throw new LyCException("Máximo de marcas excedido en anclaje");
  if(anclajes.get(anclaje).isEmpty()) anclajes.get(anclaje).add(marca);
  else {anclajes.get(anclaje).add(marca) ;}
 }
 public boolean abrir(Llave llave) {
  boolean abierto = false;
  for (int i = 0; i<llave.numeroDeDientes(); i++) {
   if(llave.numeroDeDientes()<=anclajes.size()){
    abierto = encajaDienteAnclaje(llave.obtenerAltura(i), anclajes.get(i));
   }
  }
  return abierto;
 }
 
 static boolean encajaDienteAnclaje(int altura, Set<Integer> anclaje) {
  boolean encaja = false;
  for (int i : anclaje) {
   if(10 - altura == i) encaja = true;
  }
  return encaja;
 }
 
 public String toString(){
  /*String std = "{ ";
  for(Set<Integer> entero : anclajes) {
   std = std + "[";
   for(int n: entero) {
    std = std + " " + n ;
   }
   std = std + " ]";
  }*/
  return anclajes.toString();//std + "}";
  
 }
}
 

Bueno, espero que todas estas entradas os estén sirviendo de algo ;) Si teneis alguna pregunta ya sabeis, comentadla ;)

Saludos ;)

No hay comentarios:

Publicar un comentario