Autor Tema: Ejercicio CU00681B Tipos enumerados java  (Leído 4163 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Ejercicio CU00681B Tipos enumerados java
« en: 30 de Julio 2014, 22:06 »
Hola.
Envío ejercicio CU00681B con tipos enumerados. 5 clases.
Clase con main. MatricularVehiculos
Código: [Seleccionar]
/**
 * Detalles de la clase.
 * @author (Toni)
 * @version (0)
 */
public class MatricularVehiculos {
    public static void main (String [] args) {
        ListaDeVehiculos listaVehiculos = new ListaDeVehiculos();
        presentacion(listaVehiculos);
        Vehiculo miCoche = new Vehiculo();
        EnteroIntervalos numero = new EnteroIntervalos(); // devuelve un número entero
        int numElemento=0;
        Mensaje mensaje = new Mensaje("");
        String respuesta = "", siNo= "";
        if (listaVehiculos.size() > 0) {
            mensaje.muestra("La lista se ha incializado con " + listaVehiculos.size() + " vehículos.");
        } else {
            mensaje.muestra("La lista de vehículos está vacía.");
        }
        boolean continuarBucle = true;
        do {
            respuesta = mensaje.responde("\tPulse la opción deseada.\n\t" +
                "M -> Matricular nuevo vehículo.\n\t" +
                "V -> Visualizar vehículos matriculados.\n\t" +
                "R -> Retirar vehículo de la lista.\n\t" +
                "INTRO -> Salir/Terminar/Exit");
            if (respuesta.length() == 0) {
                continuarBucle = false;
            } else if (respuesta.substring(0,1).toUpperCase().equals("M")) {
                miCoche = new Vehiculo();
                miCoche.escogerMarca();
                miCoche.escribirMatricula();
                siNo = mensaje.responde ("Los datos del vehículo son:\n\t" +
                    "Marca: " + miCoche.getMarca() + "\n\t" +
                    "Matrícula: " + miCoche.getMatricula() + "\n" +
                    "¿Desea añadir este vehículo a la lista de los matriculados? S/N",0);
                if (siNo.length() == 0) {
                    mensaje.muestra ("No se añade el vehículo a la lista. Respuesta en blanco.");
                } else if (siNo.substring(0,1).toUpperCase().equals("S")) {
                    listaVehiculos.add (miCoche);
                    mensaje.muestra ("Vehículo añadido a la lista.");
                } else {
                    mensaje.muestra ("No se añade el vehículo a la lista.");
                }
            } else if (respuesta.substring(0,1).toUpperCase().equals("V")) {
                listaVehiculos.muestraLista();
            } else if (respuesta.substring(0,1).toUpperCase().equals("R")) {
                numElemento = numero.enteroAceptado(mensaje.responde("Introduzca el número del vehículo a retirar/remover entre 1 y " +
                        listaVehiculos.size(),0),1,listaVehiculos.size());
                if (numElemento < 1) {
                    mensaje.muestra ("No se ha retirado ningún vehículo.");
                } else {
                    miCoche = listaVehiculos.remove(numElemento-1);
                    mensaje.muestra("Se ha eliminado el vehículo: \n" +
                        "Marca: " + miCoche.getMarca() + " Matrícula: " + miCoche.getMatricula());
                }
            } else {
                mensaje.muestra ("Opción incorrecta.");
            }
        } while (continuarBucle); 
        mensaje.muestra ("\tTerminada la matriculación de vehículos.");
    } // fin delmain

    private static void presentacion (ListaDeVehiculos lista) {
        Mensaje mensaje = new Mensaje("Esta Vd. en el departamento de matriculación de vehículos.\n" +
                "Siga las intrucciones por favor.\n");
        Vehiculo miCoche;
        String respuesta = "", siNo = "";
        siNo = mensaje.responde ("La lista de vehículos matriculados está vacía.\n" +
            "¿Desea introducir algunas matrículas de forma aleatoria?. (S/N)",0);
        if (siNo.length() == 0) {
            mensaje.muestra ("Respuesta en blanco. La lista queda vacía.");
        } else if (siNo.substring(0,1).toUpperCase().equals("S")) {
            EnteroIntervalos numero = new EnteroIntervalos(); // devuelve un número entero
            int numeroCochesMatriculados = numero.enteroAceptado(mensaje.responde(
                        "¿Cuántos coches quiere poner en la lista?. Escriba un valor entre 1 y 15:",0),1,16);
            if ( numeroCochesMatriculados < 1) {
                mensaje.muestra ("Valor fuera de rango. La lista queda vacía.");
            } else {
                lista.addVehiculosAleatorios(numeroCochesMatriculados);
                mensaje.muestra ("Se ha creado lista de vehículos");
            }
        } else { // se pulsa cualquier tecla distinta de 'S'
            mensaje.muestra ("La lista queda vacía.");
        }
    }
} // Fin de la clase MatricularVehiculos
Clase ListaDeVehiculos (gestiona una colección de vehículos)
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
/**
 * Gerstiona una lista de vehículos dentro de un ArrayList
 * @author (Toni)
 * @version (0)
 */
public class ListaDeVehiculos {             // Atributos de la clase ListaDeVehiculos
    private ArrayList <Vehiculo> listaVehiculos;
    //Constructor para objetos de la clase ListaDeVehiculos
    public ListaDeVehiculos() {            // Inicializa atributos
        listaVehiculos = new ArrayList <Vehiculo> ();
    } // Fin del constructor ListaDeVehiculos
/**
 * Añade el vehículo aportado a la lista
 */
    public void add (Vehiculo miVehiculo) {
        listaVehiculos.add (miVehiculo);
    }
/**
 * Elimina el vehículo de la posición indicada
 */
    public Vehiculo remove (int posicion) {
        if (posicion >= 0 && posicion < listaVehiculos.size()) {
            return listaVehiculos.remove(posicion);
        } else {
            return null;
        }
    }
/**
 * Devuelve el vehículo de la posición indicada
 */
    public Vehiculo getVehiculoDeLaLista (int posicion) {
        if (posicion <= 0 && posicion < listaVehiculos.size()) {
            return listaVehiculos.get(posicion);
        } else {
            return null;
        }
    }
/**
 * Devuelve el tamaño de la lista de vehículos
 */
    public int size () {
        return listaVehiculos.size();
    }
/**
 * Muestra por pantalla la lista de vehículos con su marca y matrícula
 */
    public void muestraLista () {
        Iterator <Vehiculo> itV = listaVehiculos.iterator();
        Vehiculo tmpV = new Vehiculo();
        int contador = 0;
        System.out.println ("Id.\tMarca\tMatrícula");
        while (itV.hasNext()) {
            tmpV = itV.next();
            System.out.println ((++contador) + "\t" + tmpV.getMarca() + "\t" + tmpV.getMatricula());
        }
    }
/**
 * Añade a la lista el número de vehículos indicados de forma aleatoria.
 */
    public void addVehiculosAleatorios (int cantidad) {
        Vehiculo miCoche;
        String matricula;
        Random numAlea = new Random();
        for (int i = 0; i < cantidad; i++) {
            miCoche = new Vehiculo();
            miCoche.escogerMarca(numAlea.nextInt(5)); // 5 marcas diferentes
            matricula = "";
            for (int j = 0; j < 4; j++) {
                matricula = matricula + (char) (numAlea.nextInt(10) + 48); // añade cifras del 0 al 9
            }
            matricula = matricula + "-";
            for (int j = 0; j < 3; j++) {
                matricula = matricula + (char) (numAlea.nextInt(26) + 65); // añade caracteres de la A a la Z
            }
            miCoche.setMatricula (matricula);
            add (miCoche);
        }
    }
} // Fin de la clase ListaDeVehiculos
Clase Vehiculo
Código: [Seleccionar]
/**
 * Clase para identificar un vehículo por su marca (un tipo enumerado) y su matrícula
 * @author (Toni)
 * @version (0)
 */
public class Vehiculo {             // Atributos de la clase Vehiculo
    enum MarcaDeVehiculo {FORD,TOYOTA,SUZUKI,RENAULT,SEAT};
    private String matricula;
    private MarcaDeVehiculo marca;
   
    public Vehiculo () {
        matricula = "";
        marca = null;
    } //fin del constructor

    public void setMatricula (String matricula) { this.matricula = matricula; }

    public void setMarca (MarcaDeVehiculo marca) { this.marca = marca; }

    public String getMatricula () { return matricula; }

    public MarcaDeVehiculo getMarca () { return marca; }

    /**
     * Método 'escogerMarca' para escoger por teclado un tipo enumerado como valor para el atributo 'marca'
     */
    public void escogerMarca () {
        String msg = "Marca de vehículo establecida con éxito.";
        Mensaje mensaje = new Mensaje ("Escoja la marca del vehículo pulsando el número asociado.");
        String valor = mensaje.responde ("\t0 FORD. 1 TOYOTA. 2 SUZUKI. 3 RENAULT. 4 SEAT.",0);
        switch (valor) {
            case "0": setMarca (MarcaDeVehiculo.FORD); break;
            case "1": setMarca (MarcaDeVehiculo.TOYOTA); break;
            case "2": setMarca (MarcaDeVehiculo.SUZUKI); break;
            case "3": setMarca (MarcaDeVehiculo.RENAULT); break;
            case "4": setMarca (MarcaDeVehiculo.SEAT); break;
            default: msg = "Marca de vehículo incorrecta. Inténtelo otra vez."; break;
        } // fin del switch
        mensaje.muestra (msg);
    }
/**
 * Método 'escogerMarca' sobrecargado. Recibe como parámetro el valor que se había de escoger por teclado en el otro método.
 */
    public void escogerMarca (int numero) {
        switch (numero) {
            case 0: setMarca (MarcaDeVehiculo.FORD); break;
            case 1: setMarca (MarcaDeVehiculo.TOYOTA); break;
            case 2: setMarca (MarcaDeVehiculo.SUZUKI); break;
            case 3: setMarca (MarcaDeVehiculo.RENAULT); break;
            case 4: setMarca (MarcaDeVehiculo.SEAT); break;
            default:  break;
        } // fin del switch
    }
/**
 * Pide por teclado la matrícula que se asignará al atributo 'matricula'
 */
    public void escribirMatricula () {
        Mensaje mensaje = new Mensaje ("Introduzca la matrícula del vehiculo:");
        setMatricula (mensaje.responde ("\t",0));
        mensaje.muestra ("Se ha establecido la matrícula \"" + matricula + "\" para el vehículo.");
    }
} // Fin de la clase Vehiculo
Clase Mensaje (presenta mensajes y devuelve entradas de teclado)
Código: [Seleccionar]
import java.util.Scanner;
/**
 * Detalles de la clase. El método presenta mensajes por pantalla... y devuelve entradas de teclado
 * @author (Toni)
 * @version (0)
 */
public class Mensaje { // Atributos de la clase Mensaje
    private String texto;
    private int valor;
    /**
     * Mostrará el texto con salto de línea final.
     */
    public Mensaje (String frase) { //Constructor 1 parámetro para objetos de la clase Mensaje. Inicializa atributos
        texto = frase;
        valor = 1;
        muestra (texto, valor);
    }

    /**
     * Muestra el texto con salto de línea o no según param.
     * Valores param:
     * 0 = Sin salto de línea.
     * 1, u otro valor = Con salto de línea.
     */ 
    public Mensaje (String frase, int param) {
        texto = frase;
        valor = param;
        muestra (texto, valor);
    }
    // Siguen los setters para los atributos de la clase Mensaje
    public void setTexto (String texto) { this.texto = texto; }

    public void setValor (int valor)    { this.valor = valor; }
    // Ahora los getters para los atributos de la clase Mensaje
    public String getTexto ()           { return texto; }

    public int getValor ()              { return valor; }

    // Y seguidamente, procedimientos y funciones varios.
    /**
     * Mostrar el texto con salto de línea (sin segundo parámetro)
     */   
    public void muestra (String frase) {
        muestra (frase, 1);
    }// fin de muestra 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea.
     * 1, u otro valor = Con salto de línea.
     */   
    public void muestra (String frase, int param) {
        texto = frase;
        valor = param;
        if (valor == 0) { System.out.print (texto + " ");
        }          else { System.out.println (texto); }
    }// fin de muestra 2 parámetros

    /**
     * Sin segundo parámetro el mensaje incluirá salto de línea. Devuelve entrada de teclado
     */
    public String responde (String frase) {
        return responde (frase, 1);
    }// fin de responde 1 parámetro

    /**
     * Valores param:
     * 0 = Sin salto de línea + entrada por teclado.
     * 1, u otro valor = Con salto de línea + entrada por teclado.
     */
    public String responde (String frase, int param) {
        texto = frase;
        valor = param;
        muestra (texto, valor);
        Scanner entradaEscaner = new Scanner(System.in);
        return entradaEscaner.nextLine();
    }// fin de responde 2 parámetros
} // Fin de la clase Mensaje
Clase EnteroIntervalos (devuelve un entero dentro de un intervalo)
Código: [Seleccionar]
/**
 * Recibe un String, lo convierte a int entre los intervalos aportados.
 * <br>Si no puede hacerlo, devuelve valor fuera del rango especificado = (valorInicial - 1)
 * @author (Toni)
 * @version (0)
 */
public class EnteroIntervalos {             
    public int enteroAceptado (String entrada, int valorInicial, int valorFinal) {
        int entero = 0;
        char c =' ';
        entrada = entrada.trim();
        if (entrada.length() == 0) { return valorInicial - 1;  }
        for (int i = 0; i < entrada.length(); i++) {
            c = entrada.charAt(i);
            if (c==48 || c==49 || c==50 || c==51 || c==52 || c==53 || c==54 || c==55 || c==56 || c==57) {  // solo dígitos del 0 al 9
            } else    { return valorInicial - 1; } // ha aparecido un caracter no dígito
        }
        entero = (int)Integer.valueOf(entrada);
        if (entero < valorInicial || entero >= valorFinal) { return valorInicial - 1; } // entero fuera del rango desde-hasta
        return entero;       
    } // fin de enteroAceptado
} // Fin de la clase EnteroIntervalos
Saludos.
« Última modificación: 31 de Agosto 2014, 11:12 por Alex Rodríguez »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Ejercicio CU00681B Tipos enumerados
« Respuesta #1 en: 31 de Julio 2014, 10:46 »
Buenas, he probado el código y funciona bien y está bastante completo, no le veo problemas. Hay un comentario que me parece puede ser confuso:

EnteroIntervalos numero = new EnteroIntervalos(); // devuelve un número entero

Lo he mirado una y otra vez y no veo que al crear un objeto de este tipo se devuelva un número, simplemente creas un objeto que sirve para realizar un proceso posterior, pero el objeto ni siquiera tiene propiedades almacenadas. De hecho el nombre de la clase no me aclara mucho, después de mirarlo me parece que sería mejor un nombre como ComprobadorEnteros o ValidadorDatos o algo así, en base a lo que he visto, pero no sé realmente cuál era tu intención o si fuiste cambiando el código y por eso quedó así. Salu22


toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00681B Tipos enumerados
« Respuesta #2 en: 31 de Julio 2014, 21:53 »
Hola Mastermind
Tienes razón, en la línea de código que señalas, creo un objeto de la clase EnteroIntervalos. El comentario que he puesto no es adecuado, si había de poner algo sería:
// Creado objeto nuevo de la clase EnteroIntervalos de nombre numero.
// Posteriormente este objeto invocará un método que devolverá un valor int entre un intervalo de valores.
Aunque tal vez no haría falta poner comentario si el nombre de la clase fuera suficientemente explicativo

Para mí, esta clase tiene un único propósito, devolver un valor entero, entonces le puse ese nombre 'EnteroIntervalos', que para mí era indicativo de lo que hacía. Y no tiene propiedades porque no almacena nada, sólo trabaja con lo que recibe, un String y dos int.
Tal vez habría quedado mejor:
CadenaConvertidaAEnteroEntreIntervalos (casi descriptiva)
ó
ValorInt (escueta, algo de valor entero, si es entre intervalos ya se verá)

Ya me habéis indicado varias veces que los nombres que pongo los encontrais poco adecuados. No os lo discutiré, será verdad. Espero que con el tiempo le coja el tranquillo a bautizar los objetos.
De los nombres que me propones, me gusta más 'ComprobadorEnteros'.

Nota: Esta clase, es una modificación de otra anterior, donde ya me dijisteis que no era obligatorio poner atributos en la clase.
Que hay clases cuyos métodos usan los parámetros que reciben para hacer su trabajo.
Aquí tomo el ejemplo de método pow() de la clase Math que trabaja con los valores que se le envían, y no guarda atributos.

Saludos y gracias por tus comentarios.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".