viernes, 3 de enero de 2014

Tutorial Java en Linux Basico 5

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:


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.