Estructuras selectivas Estructuras repetitivas
Otra cosa fundamental de todo lenguaje de programacion son las estructuras de seleccion repetitivas,llamados bucles loops,en Java contamos con los siguientes bucles:
while
for
do/while
Un bulcle siempre debe tener un final y un inicio,y este se basa en lógica boleana como lo vimos en el tutorial pasado:
Enlace
Un bucle que no tiene fin se conoce como bucle infinito,en teoria si tiene fin ya que se tiene que detener algun dia,pero es llamado asi por que si no se detiene por errores no programados o si existiera una maquina que se pudiera ejecutar infinitamente nunca terminaria.
Un bucle sirve para repetir cierto numero de veces o infinitamente una orden:
Por ejemplo:
Queremos repetir cinco veces hola mundo:
1 2 3 4 5 6 7 8 9 | class Ejemplo { public static void main(String[] args) { System.out.println("hola mundo"); System.out.println("hola mundo"); System.out.println("hola mundo"); System.out.println("hola mundo"); System.out.println("hola mundo"); } } |
Eso se haría si no existieran los loops,veamos como funciona un bucle while:
Un bucle while se ejecuta mientras la condición sea verdadera:
Bucle infinito while:
1 2 3 4 5 6 7 8 9 10 11 12 | /* Archivo : ewhile.java Ejecuta : javac ewhile.java && java ewhile */ public class ewhile { public static void main(String [] args) { while (true) { // Mientras sea true nunca terminara System.out.println("hola mundo"); } } } |
Si quisiéramos ejecutar cinco veces hola mundo necesitaríamos tener una variable de control,esta se definiría a 0,y la condición seria que si es menor a cinco ejecute el bucle,pero en el cuerpo del bucle incrementaremos el valor de la variable bandera hasta que no sea cierta la condición de ejecución:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* Archivo : ewhile.java Ejecuta : javac ewhile.java && java ewhile */ public class ewhile { public static void main(String [] args) { int i = 0; // variable bandera while (i < 5) { // Mientras sea true nunca terminara System.out.println("hola mundo"); i++: // Incrementamos su valor en uno } // Esto se ejecuta cuando termine el bucle } } |
Las condiciones son muy sencillas,por ejemplo podemos ejecutar una instrucción hasta que no sea verdadera,un ejemplo muy útil es escanear la entrada estándar hasta que el numero sea el requerido:
Como vemos se puede controlar un bucle fácilmente con una variable bandera,este no es mejor ejemplo pero podemos usar la palabra reservada break,para usar una terminación inesperada:
Cambia en el código:
Por :
Ademas de break que sirve para terminar un bucle contamos con continue que sirve para saltarnos una sentencia que seguiría después del continue:
Como vemos es muy simple saltarnos las sentencias,esto aunque se vea un poco raro les aseguro que muchas veces lo necesitaran.
Bucle for,un bucle for se usa para controlar una ejecución un cierto numero de veces sin necesidad de variables banderas ajenas al bloque de ejecución,la sintaxis es:
En variable usamos un controlador,por ejemplo si quisiéramos repetir cinco veces hola mundo seria:
En variable bandera:
int i = 0;
En condición:
En modificación_de_variable_bandera:
Así quedaría:
Una variable puede ser de incremento o decremento,ya que una forma inversa de hacer eso seria así:
También un bucle for nos permite múltiples sentencias de condicion y declaracion,este ejemplo ilustra como mientras una variable se incrementa,otra se disminuye:
En la condición podemos usar múltiples operaciones lógicas basadas en or,and,etc pero es un poco mas avanzado y lo veremos después:
Un bucle infinito for:
Los bucles infinitos for son aquellos sin cuerpo solo un bloque:
Un bucle for se puede anidar de forma muy sencilla,un ejemplo es un simple algoritmo de impresión:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import java.io.IOException; import java.util.Scanner; /** * Archivo ewhile.java Ejecuta : javac ewhile.java && java ewhile * * @author Atheyus * */ public class ewhile { public static void main(String[] args) throws IOException { final int oculto = 4; // Definimos un numero oculto boolean valor = true; // Variable bandera System.out.print("Adivina el numero oculto: "); while (valor) { Scanner scan = new Scanner(System.in); // Escaner try { // Lo hacemos en un try(lo veremos en futuros tutoriales) int i = scan.nextInt(); // Definimos el numero escaneado if (i == oculto) { // Si acertamos System.out.println("Acertaste :D"); valor = false; // La variable bandera cambia de valor y rompe el loop } else { System.out .print("(Intenta otra vez) Adivina el numero oculto :"); } } catch (java.util.InputMismatchException e) { // Error de entrada System.out .print("(Intenta otra vez) Adivina el (numero) oculto :"); } } System.out.println("Ahora estas afuera del while"); } } |
Como vemos se puede controlar un bucle fácilmente con una variable bandera,este no es mejor ejemplo pero podemos usar la palabra reservada break,para usar una terminación inesperada:
Cambia en el código:
valor = false:
Por :
break;break nos puede ser útiles para romper bucles sin variables bandera como es el caso del primer ejemplo.
Ademas de break que sirve para terminar un bucle contamos con continue que sirve para saltarnos una sentencia que seguiría después del continue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * Archivo Ejemplo.java Ejecuta : javac Ejemplo.java && java Ejemplo * * @author Atheyus * */ public class Ejemplo { public static void main(String[] args) { int i = 1; // Variable para ver numero de ejecuciones System.out.println("Ejemplo de continue,no se veran 8 y 7 ejecuciones:\n"); while (true) { if (i == 11) // Asi detenemos este bucle,solo 10 repeticiones break; if (i == 7 || i == 8) { // Si i es igual a 7 o 8,nos saltamos lo que sigue i++; // Subimos en 1 la variable aunque sea 7 o no se ejecutara correctamente continue; } System.out.println("Ejecucion numero : " + i); i++; } } } |
Como vemos es muy simple saltarnos las sentencias,esto aunque se vea un poco raro les aseguro que muchas veces lo necesitaran.
Bucle for,un bucle for se usa para controlar una ejecución un cierto numero de veces sin necesidad de variables banderas ajenas al bloque de ejecución,la sintaxis es:
1 2 3 | for (variable_bandera;condicion;modificacion_de_variable_bandera) { /* Bloque */ } |
En variable usamos un controlador,por ejemplo si quisiéramos repetir cinco veces hola mundo seria:
En variable bandera:
int i = 0;
En condición:
i < 5;
En modificación_de_variable_bandera:
i++
Así quedaría:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * Archivo Ejemplo.java Ejecuta : javac Ejemplo.java &&java Ejemplo * * @author Atheyus * */ public class Ejemplo { public static void main(String[] args) { for (int i = 0;i < 5;i++) System.out.println("Hola mundo"); } } |
Una variable puede ser de incremento o decremento,ya que una forma inversa de hacer eso seria así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * Archivo Ejemplo.java Ejecuta : javac Ejemplo.java && java EJemplo * * @author Atheyus * */ public class Ejemplo { public static void main(String[] args) { for (int i = 10;i > 5;i--) // Valor en decremento System.out.println("Hola mundo"); } } |
También un bucle for nos permite múltiples sentencias de condicion y declaracion,este ejemplo ilustra como mientras una variable se incrementa,otra se disminuye:
1 2 3 4 | for (int i = 100,o = 0;i > 5;i--,o++) { System.out.println("Valor de i: "+i); System.out.println("Valor de o: "+o); } |
En la condición podemos usar múltiples operaciones lógicas basadas en or,and,etc pero es un poco mas avanzado y lo veremos después:
1 2 3 4 | for (int i = 100,o = 0;i > 5 && o < 10;i--,o++) { System.out.println("Valor de i: "+i); System.out.println("Valor de o: "+o); } |
Un bucle infinito for:
Los bucles infinitos for son aquellos sin cuerpo solo un bloque:
1 2 3 | for (;;) { System.out.println("Bucle infinito solo se rompe con break o el sistema operativo"); } |
Un bucle for se puede anidar de forma muy sencilla,un ejemplo es un simple algoritmo de impresión:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * Archivo ejemplo.java * Compila : javac ejemplo.java * Ejecuta : java ejemplo 11 * @author Atheyus * */ public class ejemplo { private static int top; private static int i; private static int n; public static void main(String[] args) { int len = args.length; if (len == 0) { System.out.println("Usa un argumento numerico"); System.exit(0); } top = Integer.parseInt(args[0])+1; for (i = 1; i < top; i++) { for (n = 1; n < i; ++n) { System.out.printf("%d\t", n); } System.out.println(""); } for (i = top; i > 0; --i) { for (n = 1; n < i; ++n) { System.out.printf("%d\t", n); } System.out.println(""); } } } |
Un ejemplo mas sencillo es este,por cada repeticion de un bucle externo ejecutar cinco veces uno interno:
1 2 3 4 5 6 | for (int i = 0;i < 10;i++) { System.out.println("Ejecucion de primer bucle : "+i); for (int o = 0;o < 5;o++) { System.out.println("Ejecucion de segundo bucle : "+o); } } |
El bucle do/while,el bucle do a diferencia de while se ejecuta una vez sin importar nada,luego verifica la condicion en el while y si es true sigue en ejecucion,veamos como se ejecuta 5 veces hola mundo en do/while:
1 2 3 4 5 | int i = 0; do { System.out.println("Hola mundo"); ++i; } while (i < 5); |
Como vemos los ++ están al revés esto no corresponde ahora pero puedo decir que en teoría resta una ejecución.
Un buen ejemplo es el que vimos arriba de ewhile,pero con do/while queda mucho mejor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.util.Scanner; /** * Archivo Ejemplo.java Ejecuta : javac Ejemplo.java && java Ejemplo * * @author Atheyus * */ public class Ejemplo { public static void main(String[] args) { final int oculto = 4; int i = 0; do { try { System.out.print("Adivina el numero oculto: "); Scanner scan = new Scanner(System.in); // Escaner i = scan.nextInt(); } catch (Exception e) { ; } } while (i != oculto); // Si i no es el numero oculto repite de nuevo System.out.println("Acertaste :D"); System.out.println("Ahora estas afuera del bucle"); } } |
Eso es todo :D
No hay comentarios.:
Publicar un comentario
Los comentarios serán revisados antes de ser publicados.