Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: ZID en 08 de Diciembre 2014, 17:44
-
Hola, soy nuevo aqui y estoy estudiando Java, aunque por ahora la verdad es que me esta costando. Estoy tratando de lograr crear un programa que controla que solo introduces valores ya fijados en un enumerado, pero no lo consigo. Os cuento lo que quiero decir mostrando el codigo.
Casa.java
public class Casa {
String color;
public String getColor() {
return this.color;
}
public void setColor(String color) {
this.color = color;
}
public Casa() {
color = "Rojo";
}
public Casa(String color) {
this.color = color;
}
public String toString(){
return "La casa está pintada de color "+ this.color;
}
}
CambiarColorCasa.java
/**
* En esta clase principal, quiero declarar un enumerado con los valores BLANCO,
* AZUL y VERDE, que son los valores que puede admitir el atributo del color de la casa.
* De forma que tras recoger el color por el usuario, el programa debe valerse de ese
* enumerado para comprobar si es un color válido.
*
*/
public class CambiarColorCasa {
public enum Colores {BLANCO, AZUL, VERDE};
public static void main(String[] args) {
Casa casaPintada = null;
Casa casaSinPintar = null;
String color2;
int eleccion;
String respuesta;
do {
Mensajes.msgln("\t\t1.- Crear una casa sin pintar.");
Mensajes.msgln("\t\t2.- Crear una casa pintada.");
Mensajes.msgln("\t\t3.- Pinta la casa");
Mensajes.msgln("\t\t4.- Muestra el color de la casa\n");
Mensajes.msgln("\t\t0.- Salir de la aplicación.");
Mensajes.msgln("\t=========================================================\n");
eleccion = Mensajes.leeEntero("\tIntroduzca la opción elegida:", 0, 4);
switch (eleccion) {
case 0:
Mensajes.msgln("\tCerrando...");
break;
case 1:
casaSinPintar = new Casa();
Mensajes.msgln("\tSe creó una casa sin pintar. \n"
+ "\tDeberás pintarla. \n");
break;
case 2:
color2 = Mensajes.leeCadena("\tIntroduce el color: ");
casaPintada = new Casa(color2);
Mensajes.msgln("\t Se creó una casa pintada.\n");
break;
case 3:
if (casaSinPintar != null) {
color2 = Mensajes.leeCadena("\tIntroduzca un nuevo color: ");
if (casaSinPintar.getColor().equals("Rojo")) {
casaSinPintar.setColor(color2);
Mensajes.msgln("\n\tLa casa esta pintada de nuevo ");
} else {
respuesta = Mensajes.leeCadena("\n\tEl color actual es: " + casaSinPintar.getColor()
+ ". ¿Desea cambiarlo? (S/N): ");
if (respuesta.equalsIgnoreCase("s")) {
casaSinPintar.setColor(color2);
Mensajes.msgln("\n\tEl color ahora es " + casaSinPintar.getColor() + ".\n ");
} else {
Mensajes.msgln("\n\tCambio de color cancelado.");
}
}
} else {
Mensajes.msgln("No existe la casa.");
}
break;
case 4:
Mensajes.msgln("Casa sin pintar");
if (casaSinPintar == null)
Mensajes.msgln("No hay datos aún");
else
System.out.println(casaSinPintar.toString());
Mensajes.msgln("Casa pintada");
if (casaPintada == null)
Mensajes.msgln("No hay datos aún");
else
System.out.println(casaPintada.toString());
break;
default:
break;
} // Switch
} while (eleccion
!= 0);
}//Fin del main
}//Fin de la clase
Mensajes.java
import java.util.Scanner;
public class Mensajes {
public static int leeEntero(String mensaje, int minimo, int maximo) throws IllegalArgumentException {
int numero = 0;
boolean leido = false;
Scanner teclado = null;
if (minimo <= maximo) {
do {
Mensajes.msgln(mensaje);
try {
teclado = new Scanner(System.in);
numero = teclado.nextInt();
if (numero >= minimo && numero <= maximo) {
leido = true;
} else {
Mensajes.msgln("Error: Debe ser un número entero mayor o igual que " + minimo + " y menor o igual que " + maximo + ". ");
}
} catch (Exception e) {
Mensajes.msgln("Error: No es un número entero válido. ");
}
} while (!leido);
} else {
throw new IllegalArgumentException("Error");
}
return numero;
}
public static String leeCadena() {
Scanner teclado = new Scanner(System.in);
String cadena = "";
try {
cadena = teclado.nextLine();
} catch (Exception e) {
Mensajes.msgln("Error.");
}
return cadena;
}
public static String leeCadena(String mensaje) {
Scanner teclado = new Scanner(System.in);
String cadena = "";
try {
Mensajes.msgln(mensaje);
cadena = teclado.nextLine();
} catch (Exception e) {
Mensajes.msgln("Error.");
}
return cadena;
}
public static void msg(String cadenaAImprimir) {
System.out.print(cadenaAImprimir);
}
public static void msgln() {
System.out.println();
}
public static void msgln(String cadenaAImprimir) {
System.out.println(cadenaAImprimir);
}
}
El problema lo tengo en CASE 3. El programa funciona pero no controlo que los valores introducidos sean los declarados en el enumerado, que es justo lo que trato de hacer pero no se como. Me he leído la parte del curso dedicada a los enumerados y no he encontrado que se usen para controlar que escribes uno de los valores declarados.
Cualquier ayuda es bienvenida, gracias!
-
Hola ZID, creo que el código de la última clase que intentabas pegar ha salido cortado. Intenta ponerlo completo para poder analizarlo. Para el estudio de java recomendamos seguir este curso, donde se tratan también los tipos enumerados: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188
Saludos!
-
Gracias por el aviso!!
Ya he actualizado el codigo!
-
Hola, en el código se ve algo que no parece propio de un buen diseño, al menos en cuanto a nombres. Me refiero a que la clase con el método main se llame CambiarColorCasa. Esto más bien parece el nombre de un método de la clase Casa que un nombre de una clase con el main.
Ya sobre el uso de enum, la impresión que me da con el código que has puesto es que no estás diferenciando bien lo que es un enum de lo que es un String, y un enum no es un String (aunque cada uno de los valores de un enum pueda llevar asociado un String si queremos).
Te dejo este código que viene siendo un ejemplo simple a ver si te sirve para lo que intentas hacer:
Clase donde definimos el tipo enumerado:
// Ejemplo aprenderaprogramar.com
// Clase que contiene los tipos de color que se permiten para una casa
public enum Color {
INDEFINIDO ("indefinido"), //Separamos con comas
ROJO ("rojo"),
VERDE ("verde"),
AZUL("azul"); //Cuando terminamos cerramos con ;
//Campos tipo constante
private final String color; //Color permitido para una casa
/**
* Constructor. Al asignarle uno de los valores posibles a una variable del tipo enumerado el constructor asigna
automáticamente valores de los campos
*/
Color (String color) {
this.color = color;
} //Cierre del constructor
//Métodos de la clase tipo Enum
public String getColor() { return color; }
} //Cierre del enum
Clase con el método main
import java.util.Scanner;
public class testColoresCasa {
public static void main (String[] Args) {
String colorComoStringElegidoUsuario = "";
Color colorUsuario = Color.INDEFINIDO;
Color coloresPermitidos[] = {Color.ROJO, Color.VERDE, Color.AZUL};
System.out.println("Comenzamos");
Scanner scan = new Scanner(System.in);
System.out.print("Introduzca el color de la casa: ");
colorComoStringElegidoUsuario = scan.nextLine();
System.out.println("¿Qué nos devuelve toString para un tipo enumerado? "+Color.ROJO.toString());
System.out.println("¿Podemos comparar un String con un enum? No ");
// +(Color.ROJO==colorComoStringElegidoUsuario) no podemos usarlo
if (colorComoStringElegidoUsuario.equalsIgnoreCase("rojo")) {colorUsuario = Color.ROJO;}
if (colorUsuario == Color.ROJO) {
System.out.println("El color elegido es válido");
}
else {
System.out.println("Usted no ha elegido el rojo, ese es el único color permitido");
}
}
}
Revísalo a ver si te sirve y nos cuentas!!!
-
Muchísimas gracias, ahora lo analizo y estudio con detenimiento y cuando lo comprenda bien me pasaré de nuevo por aquí para confirmarlo.
Es cierto que los nombres aún no los domino bien, acabo de empezar y creo que ando algo confuso en cosas básicas, lo cual es un problema que tengo que solucionar antes de entrar en temas más complejos.
-
Nuestra recomendación es seguir el curso que te he indicado desde el principio, e ir posteando los ejercicios para que te los revisemos moderadores u otros compañeros que ayudan en los foros, de esa forma te aseguras de llevar todos los contenidos necesarios en el orden adecuado. Saludos!
-
Pues si, veo que el curso tiene muy buena pinta y creo que los ejercicios me van a venir muy bien para afianzar contenido. ¡Gracias!