De programación Java y bucle iteraciones

Para hacer bucles de su programa de Java más fácil de escribir y más fácil de entender, lo que necesita saber cómo Java descanso

y continuar declaraciones afectan iteraciones de bucle.

Sentencia break de Java

Echa un vistazo a el siguiente programa. El programa genera aleatoriamente un número de 1 a 10, y en repetidas ocasiones le pide al usuario que adivinar ese número.

Ficha 1

importación estática java.util.Scanner-importación clase java.util.Random pública java.lang.System.out-importación GuessAgain {static void main (String args []) {públicas Escáner Teclado = new Scanner (System.in) - int numGuesses = 0-int randomNumber = new Random (). nextInt (10) + 1-out.println ("************") -out.println ("Bienvenido al Juego de adivinanzas ") -out.println (" ************ ") -out.println () - out.print (" Introduzca un entero de 1 a 10: ") -INT númeroEntrada = teclado. nextInt () - numGuesses ++ -while (númeroEntrada! = randomNumber) {out.println () - out.println ("Inténtalo de nuevo ...") - out.print ("Introduzca un entero de 1 a 10:") -inputNumber = keyboard.nextInt () - numGuesses ++ -}out.print ("Usted gana después") -out.println (numGuesses + "conjeturas".) - keyboard.close () -}}

La siguiente figura muestra una ejecución del código. El usuario hace cinco conjeturas. Cada vez, el ordenador comprueba si la conjetura es correcta. Una suposición errónea genera una solicitud para volver a intentarlo. Para una suposición correcta, el usuario obtiene una entusiasta Tú ganas, junto con un recuento del número de conjeturas que él o ella hizo. El equipo está repitiendo varias declaraciones una y otra vez, comprobando cada vez a través para ver si la conjetura de que el usuario es el mismo que el número generado aleatoriamente. Cada vez que el usuario hace una conjetura, el equipo añade 1 a su recuento de conjeturas. Cuando el usuario hace la suposición correcta, el equipo muestra que cuenta.

imagen0.jpg

¿Cuál es incómoda sobre este programa? Bueno, algunas declaraciones aparecen más de una vez en el programa. Normalmente, una declaración que ha copiado de una parte de un programa a otro no es motivo de preocupación. Pero, la estrategia global parece sospechoso. El programa consigue un número desde el usuario antes de que el bucle y (de nuevo) en el interior del bucle.

out.print ("Introduzca un entero de 1 a 10:") -int númeroEntrada = keyboard.nextInt () -numGuesses ++ -while (númeroEntrada = randomNumber!) {out.println () - out.println ("Inténtalo de nuevo ...") -out.print ("Introduzca un entero de 1 a 10:") -númeroEntrada = keyboard.nextInt () -numGuesses ++ -}

Este código utiliza un truco estándar para hacer bucles trabajo. Se llama cebado un bucle. El patrón es

Obtener la entradamientras que la entrada que tiene no es la última entrada{ Más entrada}

Al comienzo de la mientras bucle, el ordenador comprueba una condición que tiene que ver con la entrada del usuario. Así que el ordenador no entra en el bucle hasta que el usuario da alguna entrada. Luego, cuando el equipo se encuentra dentro del bucle, el ordenador pide más de entrada para alimentar siguiente iteración del bucle. El truco parece extraño, pero funciona.

Los desarrolladores utilizan esta técnica, el cebado de un bucle, todo el tiempo, por lo que no puede ser tan malo. Pero hay otra manera.

Ficha 2

importación estática java.util.Scanner-importación clase java.util.Random pública java.lang.System.out-importación GuessAgain {static void main (String args []) {públicas Escáner Teclado = new Scanner (System.in) - int númeroEntrada, numGuesses = 0-int randomNumber = new Random (). nextInt (10) + 1-out.println ("************") -out.println ("Bienvenido a la Adivinar Juego ") - out.println (" ************ ") -out.println () -while (true) {out.print ("Introduzca un entero de 1 a 10:") -inputNumber = keyboard.nextInt () - numGuesses ++ -si (númeroEntrada == randomNumber) {descanso-}out.println () - out.println ("Inténtalo de nuevo ...") -}out.print ("Usted gana después") -out.println (numGuesses + "conjeturas".) - keyboard.close () -}}

Desde el punto de vista del usuario, el código en el Listado 2 hace exactamente lo mismo que el código en el Listado 1. (Para ver la salida de cualquiera de los programas, consulte la figura anterior). La diferencia se Listado 2 tiene una sola llamada a keyboard.nextInt. Esa llamada es dentro del bucle, por lo que el equipo debe entrar en el bucle sin probar ninguna entrada.

Si nos fijamos en la condición del bucle, se puede ver cómo funciona esto. La condición del bucle es siempre cierto. No importa lo que está pasando, la condición del bucle siempre pasa su prueba. Así que la condición del bucle es un gran fraude. Nunca saltar fuera del circuito al no la prueba en la condición del bucle. En su lugar, saltar cuando se pulsa el descanso declaración que es dentro del bucle (y golpeas que descanso declaración cuando usted consigue más allá de la si (númeroEntrada == randomNumber) control de carretera). Todo funciona muy bien.

Cuando el equipo se ejecuta una descanso declaración de que está en un bucle, el equipo salta fuera del circuito (a la primera sentencia que viene después del bucle).

Con un descanso declaración, el equipo salta de un solo bucle. Si ese bucle pasa a ser dentro de otro bucle (un bucle exterior) el equipo no salta fuera del bucle exterior.

public class BreakOutOfLoop {main (String [] args) {static void públicosfor (int i = 0- i lt; 3- i ++) {for (int j = 0- j lt; 100- j ++) {System.out.print (j + ""), si (j> 9) {desglose}}System.out.println ("estalló!") -}}}

Para ilustrar, la figura siguiente contiene la salida del código anterior:

image1.jpg

Cuando el equipo llega a la descanso declaración, el control salta a la Estalló comunicado. Ese Estalló declaración es afuera de El para j bucle pero es dentro el para i lazo.

Desde el punto de vista de un programador, el código en el Listado 2 es más natural que el código en el Listado 1. Después de todo, ¿cómo el juego de proceder? Las conjeturas de usuario, entonces el equipo comprueba la conjetura, y luego (si la suposición no es correcta) la computadora dice "Inténtalo de nuevo." Esa es la secuencia de los hechos tal como se describe en el Listado 2. Pero en el Listado 1, el código dentro del bucle parece describir los acontecimientos en orden inverso: El lazo dice "Inténtalo de nuevo", y luego el usuario introduce un número.

Listado 2 ofrece una buena alternativa a la técnica de bucle de cebado en el Listado 1. Entonces, ¿por qué se molestan los programadores para cebar sus bucles? Do descanso declaraciones tienen ningún inconvenientes ocultos? Bueno, la respuesta depende de su punto de vista. Algunos programadores piensan que descanso declaraciones en bucles son confusas. Todos los saltos de la declaración a la declaración hace mareado y les recuerda algo de la década de 1960 llamado código espagueti. (Usos de código espagueti ir declaraciones que saltan de un comunicado a otra. En Pascal por Ejemplo, autor B. Burd dice " Programación con Goto es como viajar por París a nado a través de su sistema de alcantarillado. Hay un montón de atajos, pero ninguno de ellos vale la pena tomar ".) De una forma u otra, descanso declaraciones en bucles son la excepción, no la regla. Úsalos si quieres, pero no esperes encontrar muchos de ellos en el código Java de otras personas.

Continuará la declaración de Java

Listado 3 ofrece más salsa secreta para los bucles de su programa. Imagina un juego que genera aleatoriamente tres números del 1 al 20. El usuario toma cinco turnos adivinando los números. Cuando el usuario entra en una suposición correcta, el programa felicita al usuario. ("Buen intento", dice el programa.) Cuando el usuario entra en una suposición incorrecta, el programa no proporciona retroalimentación.

Ficha 3 contiene algo de código para hacer que todo suceda.

Ficha 3

importación estática java.util.Scanner-importación clase java.util.Random pública java.lang.System.out-importación GuessAgainAndAgain {static void main (String args []) {públicas Escáner Teclado = new Scanner (System.in) - int númeroEntrada-int randNum1 = new Random (). nextInt (20) + 1-int randNum2 = new Random (). nextInt (20) + 1-int randNum3 = new Random (). nextInt (20) + 1-out. println ("************") -out.println ("Bienvenido al juego de adivinanzas") - out.println ("************") -out.println () - for (int i = 0- i lt; 5- i ++) {out.print ("Introduzca un entero:") -inputNumber = keyboard.nextInt () -si (númeroEntrada! = randNum1  númeroEntrada! = randNum2 númeroEntrada! = randNum3) {continue-}out.println ("Buen intento!") - out.println () -} out.print ("Las cifras son") -out.print "-out.print (randNum2 + (randNum1 +") "") salida privado .print -keyboard.close (randNum3 + "") () -}}

Esta figura muestra una ejecución de un programa de este tipo.

image2.jpg

Java continuar declaración indica a la computadora para saltar más allá de las declaraciones que quedan dentro del bucle. Es decir, en lugar de ejecutar las sentencias restantes dentro del bucle, el ordenador pasa al comienzo de la siguiente iteración del bucle. Por lo tanto, en el Listado 3, cuando el númeroEntrada No es cualquiera de los números generados al azar del programa, el equipo salta más allá del código "Buen intento", incrementa el contador del bucle (la variable yo), Y pide al usuario para otro valor de entrada. (Por supuesto, si el contador del bucle llega a su límite, el equipo no ejecuta otra iteración. En cambio, el equipo salta fuera del circuito, y ejecuta lo declaraciones vienen después del bucle.)

Puede reescribir fácilmente Listado 3 para que el código no tiene continuar comunicado. Habría que poner el código "Buen intento" dentro de un si declaración, pero eso estaría bien. los continuar declaración no hace mucho para mejorar el aspecto del programa Ficha 3. Pero cuando se quiere evitar el código de anidación en el interior si declaraciones, el continuar declaración viene muy bien.

Tal vez, en su aplicación, el resto del circuito es una secuencia compleja de declaraciones. Usted no quiere hacer esta secuencia parece más complicado encerrándolo dentro de un si comunicado. O tal vez, en su aplicación, sólo en raras ocasiones se salta el resto del bucle, y desea hacer hincapié en esta rareza al no encierra el resto del bucle en un si comunicado. En cualquier caso, una continuar declaración podría ser exactamente la decisión correcta.




» » » » De programación Java y bucle iteraciones