You are on page 1of 9

4 CONTROL DE FLUJO EN JAVA

El modo de ejecucin de un programa en Java en ausencia de elementos de control de flujo es secuencial, es decir una instruccin se ejecuta detrs de otra y slo se ejecuta una vez. Esto nos permite hace programas muy limitados; para evitarlo se introducen estructuras de control de flujo. Las estructuras de control de flujo de Java son la tpicas de cualquier lenguaje de programacin, por lo que supondremos que todos estis familiarizados con ellas y se explicaran con poco detenimiento.

4.1 SENTENCIAS CONDICIONALES


Ejecutan un cdigo u otro en funcin de que se cumplan o no una determinada condicin. Pasemos a ver sus principales tipos.

4.1.1 If then Else


Su modo ms simple de empleo es:

If(condicion) { Grupo de sentencias}

Condicin es una valor tipo boolean. El grupo de sentencias se ejecuta solo si la condicin toma un valor true. En caso contrario se sigue ejecutando ignorando el Grupo de sentencias.

If(condicion) { Grupo de sentencias} else{ Grupo2 de sentencias}

Si condicin toma el valor true se ejecuta Grupo de sentencias, en caso contrario se ejecuta Grupo2 de sentencias. En ambos casos se contina ejecutando el resto del cdigo.

If(condicion) { Grupo de sentencias} else if (condicion2){ Grupo2 de sentencias} else if (condicion3){ Grupo3 de sentencias} . . . else{ Grupo_n de sentencias}

Si condicin toma el valor true se ejecuta Grupo de sentencias, si condicion2 toma el valor true se ejecuta Grupo2 de sentencias... y as sucesivamente hasta acabarse todas las condiciones. Si no se cumple ninguna se ejecuta Grupo_n de sentencias. Este ltimo else es opcional. En ambos casos se contina ejecutando el resto del cdigo.

Ilustraremos esto con el siguiente ejemplo:

public class Ejemplo7 { // Mtodo que podremos invovar como test(int a, int b) y que // devolver -1 si a < b, +1 si a > b y 0 si a == b. static int test(int val, int val2) { int result = 0; if(val > val2) result = +1; else if(val < val2) result = -1; else result = 0; return result; } public static void main(String[] args) { //Imprimimos por consola el resultado de realizar unos //cuantos test.

System.out.println(test(10, 5)); System.out.println(test(5, 10)); System.out.println(test(5, 5)); } } ///:~

4.1.2 Switch
Los creadores de Java trataron de hacer de este lenguaje una versin simplificada y mejorada del lenguaje de C++. Su trabajo fue bastante bueno, pero no perfecto. Prueba de ello es esta sentencia: est tan poco flexible como en C++. Expliquemos su sintaxis antes de dar los motivos de esta crtica:

switch(selector) { case valor1 : Grupo case valor2 : Grupo case valor3 : Grupo case valor4 : Grupo case valor5 : Grupo // ... default: statement; }

de de de de de

sentencias1; sentencias2; sentencias3; sentencias4; sentencias5;

break; break; break; break; break;

Se compara el valor de selector con sentencias_n. Si el valor coincide se ejecuta su respectivo grupo de secuencias. Si no se encuentra ninguna coincidencia se ejecutan las sentencias de default. Si no se pusieran los break una vez que se encontrase un valor que coincida con el selector se ejecutaran todos los grupos de sentencias, incluida la del default. Ha llegado el momento de justificar la crtica hecha a los creadores de Java. Este tipo de estructura tiene sus posibilidades muy limitadas, ya que en las condiciones slo se admite la igualdad, no ningn otro tipo de condicin (sera fcil pensar ejemplos dnde, por poner un caso, se le sacara partido a esta sentencia si aceptase desigualdades). Adems para colmo esta comparacin de igualdad slo admite valores tipo char o cualquier tipo de valores enteros menos long (si ests empleando Java 5 o posterior tambin se puede emplear un tipo enumerado). No podemos comparar contra reales, Strings.... Tambin se le podra criticar el hecho de que una vez cumplidas una condicin se ejecuten todas las sentencias si no hay instrucciones break que lo impidan. Esto es en muchas ocasiones fuente de errores, aunque tambin hay que reconocer que a veces se le puede sacar

partido, de hecho en el ejemplo que empleamos para ilustrar esta sentencia aprovechamos esta caracterstica:

public class Ejemplo8 { public static void main(String[] args) { //Bucle for. Ejecutar 100 veces el cdigo que tiene dentro. for(int i = 0; i < 100; i++) { //Math.random() es un mtod esttico que genra un nmero real //aleatorio entre 0 y 1. //Math.random()*26 ser un nmero real aleatorio entre 0 y //26. Al sumarle un carcter, a el carcter se transforma a //un enteroy se le suma. a = 97. //Se transforma el nmero aleatorio entre 97y 97 + 26 en el

//carcter correspodiente a su parte entera. Ser un carcter //aleatorio, que por la disposicin de los caracteres Unicode //ser un letra del abecedario. char c = (char)(Math.random() * 26 + 'a'); System.out.print(c + ": "); switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': //Si el carcter es a, e, i, o o u imprimimos //vocal. System.out.println("vocal"); break; default: //Si no era ninguna de las anterioes imprimos consonate. System.out.println("consonante"); } } } } ///:~

4.2 BUCLES
Son instrucciones que nos permiten repetir un bloque de cdigo mientras se cumpla una determinada condicin. Pasemos a ver sus tipos.

4.2.1 Bucle while


Cuando en la ejecucin de un cdigo se llega a un bucle while se comprueba si se verifica su condicin, si se verifica se continua ejecutando el cdigo del bucle hasta que esta deje de verificarse. Su sintaxis es:

while(condicin){ Grupo de sentencias}

Ilustramos su funcionamiento con un ejemplo:

public class Ejemplo9 { public static void main(String[] args) { double r = 0; //Mientras que r < 0.99 sigue ejecutando el cuerpo del bucle. //La d significa double. No es necesaria while(r < 0.99d) { //Genera un nuevo r aleatario entr 0 y 1. r = Math.random(); //Lo imprime por consola. System.out.println(r); } } } ///:~

4.2.2 Bucle do while


Su comportamiento es semejante al bucle while, slo que aqu la condicin va al final del cdigo del bucle, por lo que tenemos garantizado que el cdigo se va a ejecutar al menos una vez. Depender del caso concreto si es ms conveniente emplear un bucle while o do while. La sintaxis de do while es:

do { Grupo de sentencias; }while(condicin);

Obsrvese como el ejemplo 9 implementado mediante un bucle do while independientemente del valor de r ejecutar al menos una vez el cdigo de su cuerpo:

public class Ejemplo10 { public static void main(String[] args) { double r; //Idntico al ejemplo anterior, solo que aahora la condicin //est al final del bucle. do { r = Math.random(); System.out.println(r); } while(r < 0.99d); } } ///:~

4.2.3 Bucle for


Su formato es el siguiente:

for(expresion1;expresion2;expresion3){ Grupo de sentecias;}

Expresion1 es una asignacin de un valor a una variable, la variable-condicin del bucle. Expresion2 es la condicin que se le impone a la variable del bucle y expresion3 indica una operacin que se realiza en cada iteracin a partir de la primera (en la primera iteracin el valor de la variable del bucle es el que se le asigna en expresion1) sobre la variable del bucle.

public class Ejemplo11 { public static void main(String[] args) { for( char c = 0; c < 128; c++)

//Imprime los caracteres correspondientes

a los nmeros

//enteros comprendidos entre 0 y 128. (int)c es el entero //correspondiente al carcter c. System.out.println("valor: " + (int)c + " caracter: " + c); } } ///:~

4.2.4 Bucle for-each


Esta caracterstica slo est disponible en Java 5 y versiones posteriores. Se trata de un bucle diseado con el propsito de recorrer un conjunto de objetos. Dado lo bsico de este tutorial la nica estructura que hemos visto que permite almacenar un conjunto de objetos son los arrays; por lo que para nosotros ser el nico caso en la cual tenga sentido emplearlo. Su sintaxis es:

for(Tipo elemento: coleccinElementos){ Grupo de sentecias;}

Tipo es el tipo de dato de los elemento del conjunto; elemento es una variable a auxiliar que la primera vez que se ejecute el bucle tomar el valor del primer elemento del conjunto, la segunda vez tomar el valor del segundo elemento del conjunto y as sucesivamente. La coleccinElementos es el conjunto de elementos sobre los cuales queremos iterar (un array para nosotros). El bucle se repetir una vez para cada elemento de la coleccin. Veamos un ejemplo:

public class Ejemplo11b { public static void main(String[] args) { //Este arrays ser la coleccin de elementos por la que iteraremos int array[] = new int[10]; int suma = 0, contador = 0; //con este bucle damos valores a los elementos del array for (int i = 0; i < array.length; i++) { array[i]= 2*i; }

//este es el nuevo tipo de bucle. Va acumulando de la variable //suma los valores de todo los elementos del array; el bucle //se repetir a una vez por cada elemento del array y la variable e //ir a tomando como valores cada uno de los contenidos de ste for (int e : array){ //para cada elemento del array suma = suma + e; } System.out.println(suma); } }

4.2.5 Break y continue


No se tratan de un bucle, pero s de una sentencia ntimamente relacionada con estos. El encontrarse una sentencia break en el cuerpo de cualquier bucle detiene la ejecucin del cuerpo del bucle y sale de este, continundose ejecutando el cdigo que hay tras el bucle. Esta sentencia tambin se puede usar para forzar la salida del bloque de ejecucin de una instruccin condicional (esto ya se vio con switch). Continue tambin detiene la ejecucin del cuerpo del bucle, pero en esta ocasin no se sale del bucle, sino que se pasa a la siguiente iteracin de este. Observaremos el funcionamiento de ambos en un mismo ejemplo:

public class Ejemplo12 { public static void main(String[] args) { for(int i = 0; i < 100; i++) { if(i == 74) break; // teminamos aqui el bucle //Salto a la siguiente iteracin si i no es divisible entre 9 if(i % 9 != 0) continue; //Si I es divisible entre 9 se imprime System.out.println(i); } int i = 0; // Lazo infinito del cual se sale con break: while(true) { i++; if(j == 120) break; // Salimos del lazo

System.out.println(i); } } } ///:~

4.3 RETURN
Sus funciones son las mismas que en C++. Cuando se llama a un procedimiento ( que en OOP se denomin mtodo) al encontrarse con una sentencia return se pasa el valor especificado al cdigo que llam a dicho mtodo y se devuelve el control al cdigo invocador. Su misin tiene que ver con el control de flujo: se deja de ejecutar cdigo secuencialmente y se pasa al cdigo que invoc al mtodo. Esta sentencia tambin est profundamente relacionada con los mtodos, ya que es la sentencia que le permite devolver al mtodo un valor. Podamos haber esperado ha hablar de mtodos para introducir esta sentencia, pero hemos decidido introducirla aqu por tener una funcin relacionada, entre otras cosas, con control de flujo. En el ejemplo 7 ya se ha ejemplificado su uso.

You might also like