Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: jotase1507 en 10 de Febrero 2015, 18:10
-
Buenas tardes, envio mi codigo, no supe como salir del for, por lo cual aumente excesivamente al contador obligando a la salida, no se si eso es correcto por lo cual si me equivoco agradecere la correccion :)
Clase EntradaDeTeclado
import java.util.Scanner;
public class EntradaDeTeclado {
private String entradaTeclado;
public EntradaDeTeclado () {
entradaTeclado="";
pedirEntrada();
}
public void pedirEntrada () {
Scanner entradaEscaner = new Scanner (System.in);
entradaTeclado = entradaEscaner.nextLine ();
}
public String getEntrada () {
return entradaTeclado;
}
}
Clase Main
import java.util.*;
public class Prueba {
//Ejercicio 69
public static void main(String [] args){
System.out.println("Inicia el programa.");
String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto = arrayMesesDelAnho[9];
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
for (int i = 0; i < arrayMesesDelAnho.length; i++){
EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
if (mesIngresado.getEntrada().equals(mesSecreto)) {
System.out.println("¡Ha acertado!");
i = i + 11;
} else {
System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");
}
}
}
}
-
Hola jotase
En este caso, el uso del for no es lo más adecuado, pues no sabemos cuantas veces hay que repetir el código.
Aquí lo que irá bien es un while con una condición boolean
El fondo del programa está bien con el manejo del array
A continuación tienes tu clase Prueba con unos pequeños cambios para trabajar con el while
import java.util.*;
public class Prueba {
//Ejercicio 69
public static void main(String [] args){
System.out.println("Inicia el programa.");
String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto = arrayMesesDelAnho[9];
System.out.println(arrayMesesDelAnho.length);
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
boolean acierto = false;
int intentos = 0;
do {
// for (int i = 0; i < arrayMesesDelAnho.length; i++){
EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
if (mesIngresado.getEntrada().equals(mesSecreto)) {
System.out.println("Intento: " + (++intentos) + " ¡Ha acertado!");
// i = i + 11;
acierto = true;
} else {
System.out.println("Intento: " + (++intentos) + " No ha acertado. Intente adivinarlo introduciendo otro mes: ");
}
} while (!acierto);
}
}
Saludos
-
De hecho sabia que habia algo mal, no se me habia ocurrido usar un boolean como condicional. Cambie mi codigo y tratando de no copiar el suyo, hice lo siguiente. Si hay algo que no convence, agradecere el feedback :)
Clase Prueba
public class Prueba {
//Ejercicio 69 (corregido)
public static void main(String [] args){
System.out.println("Inicia el programa.");
String [] arrayMesesDelAnho = {"enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};
String mesSecreto = arrayMesesDelAnho[9];
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas: ");
boolean acierto = false;
while (acierto == false) {
EntradaDeTeclado mesIngresado = new EntradaDeTeclado();
if (mesIngresado.getEntrada().equals(mesSecreto)) {
System.out.println("¡Ha acertado!");
acierto = true;
} else {
System.out.println("No ha acertado. Intente adivinarlo introduciendo otro mes: ");
}
}
}
}
-
Hola jotase
Tu versión está perfecta.
La condición del while controla la salida del bucle.
Saludos
-
Estimados amigos quiero presentar una solucion un tantito mas compacta pero igual de funcional: (corriganme si me equivoco gracias...)
import java.util.Scanner;
public class MesSecreto{
public static void main(String [] args){
String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
boolean vSwitch = false;
String mesSecreto = mes[9];
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
while(vSwitch == false){
Scanner sc = new Scanner(System.in);
String temp = sc.nextLine();
if(temp.equals(mesSecreto)){
System.out.println("Ha acertado!");
vSwitch = true;
return;
}
System.out.println("No ha acertado. Intente nuevamente: ");
}
}
}
-
Aqui dejo el mismo ejercicio donde el mes secreto lo elije el ordenador por medio de la clase Random y el metodo int(int n) donde nos devuelve un pseudarandom del 0 al 12
import java.util.Scanner;
import java.util.Random;
public class MesSecreto{
public static void main(String [] args){
String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
boolean vSwitch = false;
Random aleatorio;
aleatorio= new Random();
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
while(vSwitch == false){
String mesSecreto = mes[aleatorio.nextInt(13)];
Scanner sc = new Scanner(System.in);
String temp = sc.nextLine();
if(temp.equals(mesSecreto)){
System.out.println("Ha acertado!");
vSwitch = true;
return;
}
System.out.println("No ha acertado. Intente nuevamente: ");
}
}
}
-
Hola adrianpza
Si, tu código es compacto.
De las dos soluciones al ejercicio, está mejor la primera, de la que no hay nada que objetar.
En la segunda tienes esta línea:
String mesSecreto = mes[aleatorio.nextInt(13)];
que te dará error cuando el nextInt coja el valor 12 (de 0 a 12) pues en tu array el valor máximo es 11 (de 0 a 11).
Además la línea anterior la colocas dentro del while, lo que provoca que cambia el mes secreto en cada bucle. Así puede darse el caso de que ni con 12 intentos ni con 120 aciertes el mes secreto.
Seguro que sabes como arreglarlo.
Saludos
-
Estimado moderador,, corrijo el error pero dejo el Random dentro del ciclo while pues, como dije en el titulo, mi idea es que el mes lo escoja el ordenador y no el programador.
ademas en esta correccion he eliminado la sentencia 'vSwitch = true' que estaba dentro de la cindicion 'if' ya que al invocar 'return' el programa no volvera a evaluar vSwitch,, corrigame si me equivoco por favor y muchas gracias por su atencion.
import java.util.Scanner;
import java.util.Random;
public class MesSecreto{
public static void main(String [] args){
String[] mes = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
boolean vSwitch = false;
Random aleatorio;
aleatorio= new Random();
System.out.println("Adivine el mes secreto. Introduzca el nombre del mes en minúsculas:");
while(vSwitch == false){
String mesSecreto = mes[aleatorio.nextInt(12)];
Scanner sc = new Scanner(System.in);
String temp = sc.nextLine();
if(temp.equals(mesSecreto)){
System.out.println("Ha acertado!");
return;
}
System.out.println("No ha acertado. Intente nuevamente: ");
}
}
}
-
Hola adrianpza
Muy bien, has rectificado el cálculo del mes secreto.
Cambiar el mes secreto en cada bucle del while es tu elección para este programa, que yo no había contemplado. De acuerdo.
En cuanto a colocar un return para salir del while, no es una opción válida. Pues si tu método tiene más instrucciones después del while no se ejecutarán, ya que el return obliga a abandonar el método en el acto.
La ideal era la anterior
vSwitch = true;
dentro del if pero sin el return.
Saludos