jueves, 14 de julio de 2011

Ejercicio "Pasajeros al tren"

Implementar las siguientes clases: 

Pasajero que representa un pasajero del tren. Sólo se almacenará su nombre y tendrá las funciones: constructora (que lo inicializa) y getNombre() que devuelve el nombre del pasajero.

VagonPasajeros que representa un vagón de pasajeros,tendrá información sobre los pasajeros que transporta o podría transportar.
Tiene como atributo, una tabla asientos que representa los asientos del tren, de modo que cada elemento de la tabla puede estar libre u ocupada por un objeto pasajero. 
Sus métodos serán:
  • VagonPasajeros(int capacidad)
es el único constructor y recibe el número de asientos para crear la tabla que inicialmente esta vacía.
  • void subir(Pasajero pasajero)
acomoda al pasajero en el vagón, los asientos se llenan en orden según lleguen pasajeros, si no hay asientos libres debe lanzarse una excepción (RuntimeException).
  • Pasajero bajar(String nombre)
recibe el nombre del pasajero que debe apearse, lo elimina del vagón y devuelve el objeto correspondiente.

Tranvia, que tendrá información sobre los pasajeros que transporta o podría transportar en cada uno de sus vagones.
Tiene un atributo privado... una tabla vagones, de modo que cada elemento de la tabla debe contener un objeto VagonPasajeros.
Sus métodos serán:
  • Tranvia()
para construir un tranvía de cuatro vagones.
  • Tranvia(int numVagones)
para construir un tranvía con numVagones vagones
  • Pasajero bajar(String nombre, int vagon)
para eliminar al pasajero indicado, del vagón indicado y retornarlo como resultado.
Si no existe ningún pasajero con el nombre indicado, se retornará null.
nota.- los vagones se numeran desde uno en adelante.
  • int subir(Pasajero p,int vagon)
Para intentar subir al pasajero indicado, en el vagón indicado.
Si este vagón está lleno, se intentará en los siguientes.
Si no quedan más vagones detrás, se continuará intentando desde el primer vagón.
Si finalmente no se consigue subir al pasajero a ningún vagón, se lanzará una excepción RuntimeException indicando en un texto el problema.
Si el vagón solicitado no existe, se lanzará una excepción RuntimeException indicando en un texto el problema.
La función retornará el número del vagón al que haya conseguido subir al pasajero.

CLASE PASAJERO

public class Pasajero {
    private String nombre;
    Pasajero (String s){
        nombre = s;
    }
    public String getNombre(){
        return nombre;
    }
}

CLASE VAGONPASAJEROS

public class VagonPasajeros {
    private Pasajero[] asientos;
    private Nodo primero = null;
    private Nodo ultimo = null;
    private class Nodo {
        public int asiento;
        public Nodo sig;
    }
    VagonPasajeros (int capacidad){
        asientos = new Pasajero[capacidad];
        for (int i=0; i < asientos.length; i++){
            Nodo nuevo = new Nodo();
            nuevo.asiento = i;
            nuevo.sig = null;
            if (primero == null)
                primero = nuevo;
            else
                ultimo.sig = nuevo;
            ultimo = nuevo;
        }
    }
    public void subir (Pasajero pasajero){
        if (lleno()){
            throw new RuntimeException("El vagón está lleno");
        }
        asientos[primero.asiento] = pasajero;
        primero = primero.sig;
    }
    public Pasajero bajar (String nombre){
        int i=0;
        boolean encontrado = false;
        Nodo nuevo;
        Pasajero aux = null;
        while (i<asientos.length & !encontrado){
            if (asientos[i] != null && nombre.equalsIgnoreCase(asientos[i].getNombre())){
                aux = new Pasajero(asientos[i].getNombre());
                asientos[i] = null;
                nuevo = new Nodo();
                nuevo.asiento = i;
                nuevo.sig = null;
                if (primero == null)
                    primero = nuevo;
                else
                    ultimo.sig = nuevo;
                ultimo = nuevo;
                encontrado = true;
            }
            i++;
        }
        return aux;
    }
    private boolean lleno(){
        return primero == null;
    }
}

CLASE TRANVIA

public class Tranvia {
    private VagonPasajeros[] tranvia;
    Tranvia(){
        this(4);
    }
    Tranvia (int numVagones){
        tranvia = new VagonPasajeros[numVagones];
        for (int i=0; i<tranvia.length; i++){
            tranvia[i] = new VagonPasajeros(2);
        }
    }
    public int subir (Pasajero p, int vagon){
        vagon = vagon-1;
        int contador = 0;
        boolean sentado = false;
        if (vagon<0 || vagon>=tranvia.length){
            throw new RuntimeException("El vagón no existe.");
        }
        while (contador<tranvia.length & !sentado){
            try{
                sentado = true;
                tranvia[vagon].subir(p);
            }
            catch(RuntimeException e){
                sentado = false;
            }
            vagon=(vagon+1)%tranvia.length;
            contador++;
        }
        if (!sentado)
            throw new RuntimeException("El tranvía está lleno.");
        if (vagon == 0)
            vagon = tranvia.length;
        return vagon;
    }
    public Pasajero bajar (String nombre, int vagon){
        vagon = vagon-1;
        return tranvia[vagon].bajar(nombre);
    }
}

No hay comentarios:

Publicar un comentario