Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: jupertivo en 20 de Abril 2015, 20:38
-
Hola a tod@s. Os transcribo el código de dicho ejercicio. Acepto todo tipo de mejoras, críticas, etc. :).
Clase MesesDelaño:
public class MesesDelAño {
public static void main (String[]args) {
String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto=MesesDelAño[4];
EntradaDeTeclado entrada;
System.out.println("Empezamos el programa. Para salir, pulse 'return'");
System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
do{
entrada=new EntradaDeTeclado();
if(entrada.getContinuar()) {//Si no se teclea 'Return'
if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
System.out.println("\n¡Enhorabuena!. Ha acertado.");
break;}
else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");} }//Si no se acierta
else {break;} }//Si se teclea 'Return'
while(entrada.getContinuar());//Compruebo que no se teclea 'Return'
System.out.println("\nFin del programa"); } }
Clase EntradaDeTeclado:
import java.util.Scanner;
public class EntradaDeTeclado {
private String entradaTeclado;
boolean continuar=true;
public EntradaDeTeclado() { //Constructor
entradaTeclado="";
pedirEntrada(); } //Al crear un objeto, se ejecuta este método
public void pedirEntrada() {
Scanner entradaEscaner=new Scanner(System.in);
entradaTeclado=entradaEscaner.nextLine();
if (entradaTeclado.length()==0) {continuar=false;} }
//Si pulso 'Return', no se introducirán más datos
public boolean getContinuar() {return continuar;}
public String getEntrada() {return entradaTeclado;} }
Gracias por vuestra atención. Saludos
-
Hola!
funciona a la perfección!
saludos :)
-
Hola para mejorar el diseño te recomendaría seguir lo que se indica en https://www.aprenderaprogramar.com/foros/index.php?topic=2369.msg11309#msg11309
Copio: "Usar un break dentro de un bucle while es una ruptura del flujo natural de un programa. En general entre programadores se considera poco elegante usar esto porque dificulta comprender cómo funcionan los programas.
Para evitar usar el break puedes basarte en un booleano"
La idea es que break sólo se debe usar cuando no hay otras alternativas o cuando las alternativas son muy costosas de programar, pero en este caso se puede prescindir del break con poco esfuerzo.
En este caso:
public class MesesDelAño {
public static void main (String[]args) {
String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto=MesesDelAño[4];
EntradaDeTeclado entrada;
System.out.println("Empezamos el programa. Para salir, pulse 'return'");
System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
boolean acertado = false;
do{
entrada=new EntradaDeTeclado();
if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
System.out.println("\n¡Enhorabuena!. Ha acertado.");
acertado=true;
}
else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");}
}while(entrada.getContinuar() && acertado ==false);//Compruebo que no se teclea 'Return'
System.out.println("\nFin del programa"); }
}
Salu2
-
Buenos días. Gracias por vuestros comentarios. Tomo nota del tema 'break'.
Transcribo el código de la clase MesesDelAño, tal y como me quedaría a mí. He utilizado el mismo booleano para evitar la introducción de 'Return' y para saber si he acertado. Funciona correctamente pero, ¿estaría bien hecho así o no es recomendable hacerlo de esta manera?
public class MesesDelAño {
public static void main (String[]args) {
String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto=MesesDelAño[4];
EntradaDeTeclado entrada;
boolean continuar=false;
System.out.println("Empezamos el programa. Para salir, pulse 'return'");
System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
do{
entrada=new EntradaDeTeclado();
continuar=entrada.getContinuar();
if(continuar) {//Si no se teclea 'Return'
if(entrada.getEntrada().equals(mesSecreto)) {//Si se acierta el mes secreto
System.out.println("\n¡Enhorabuena!. Ha acertado.");
continuar=false;}//Se ha acertado, por lo que se sale del programa
else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");} }//Si no se acierta
else {continuar=false;} }//Si se teclea 'Return'
while(continuar);//Compruebo que se ha acertado o si se teclea 'Return'
System.out.println("\nFin del programa"); } }
Saludos.
-
Hola, tienes un if anidado dentro de otro if, eso muchas veces se dice que es poco adecuado por ser poco claro, sobre todo si puede hacerse de otra manera. Puedes corregirlo o puedes dejarlo así, es algo que quedaría a tu criterio como programador.
Por ejemplo puedes eliminar el if anidado así:
public class MesesDelAño {
public static void main (String[]args) {
String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto=MesesDelAño[4];
EntradaDeTeclado entrada;
boolean continuar=false;
System.out.println("Empezamos el programa. Para salir, pulse 'return'");
System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
do{
entrada=new EntradaDeTeclado();
continuar=entrada.getContinuar();
if(continuar && entrada.getEntrada().equals(mesSecreto)) {//Si no se teclea 'Return'
System.out.println("\n¡Enhorabuena!. Ha acertado.");
continuar=false;}//Se ha acertado, por lo que se sale del programa
else {System.out.println("No ha acertado. ");} }//Si no se acierta
while(continuar);//Compruebo que se ha acertado o si se teclea 'Return'
System.out.println("\nFin del programa"); } }
Salu2
-
Hola otra vez. Entiendo lo de los 'if anidados'. Puede ser complejo de entender.
El problema es que intento que si pulsa 'Return' (orden de finalización del programa) al introducir el mes, directamente se acabe el programa, y no pase por el 'else' y le diga que no ha acertado. Demasiado afinar, creo.
Saludos.
-
Hola. Aquí estoy "dando la vara otra vez". No he podido dejar de pensar en como hacer el código anterior sin utilizar 'if' anidados. Creo que encontré la solución. Os la expongo a continuación.
public class MesesDelAño {
public static void main (String[]args) {
String[]MesesDelAño={"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto=MesesDelAño[4];
EntradaDeTeclado entrada;
boolean continuar=false;
System.out.println("Empezamos el programa. Si pulsa solo 'Return' el programa finalizará ");
System.out.println("\nAdivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
do{
entrada=new EntradaDeTeclado();
continuar=entrada.getContinuar();
if(!continuar) {System.out.println("\nHa pulsado 'Return'");} //Si se pulsa 'Return', el programa finaliza
else if(entrada.getEntrada().equals(mesSecreto)) { //Si se acierta ...
System.out.println("\n¡Enhorabuena!. Ha acertado.");
continuar=false;} //Se ha acertado, por lo que el programa finaliza
else {System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");} }//Si no se acierta ...
while(continuar); //Se comprueba si se ha acertado el mes o si se ha pulsado 'Return'
System.out.println("\nFin del programa"); } }
Saludos
-
Pues sí, ahora haces lo que pretendías y sin el if anidado así que perfecto ;D
-
Gracias Ogramar por la atención. Saludos.