miércoles, 3 de abril de 2013

Control de flujo en Java


Las sentencias de control de flujo son las encargadas de “guiar” al programa a lo largo de la ejecución permitiendo mostrar información, ocultarla o repetir instrucciones un número concreto de veces. Sin este tipo de instrucciones el programa sería totalmente lineal, complejo y muy limitado.


SENTENCIAS CONDICIONALES
Estas sentencias permiten evaluar condiciones lógicas o valores de variables y ejecutar o ignorar ciertas instrucciones dependiendo del valor que tomen dichas condiciones.
Son dos: if y switch.

IF
Evalúa una condición lógica y ejecuta un bloque de código si esta es cierta.
La sintaxis de esta sentencia es la siguiente:


//el código que está aquí se ejecuta siempre
if (condición) {
//bloque de instrucciones que se ejecutarán solo si la condición es cierta
}
//el código que está aquí se ejecuta siempre


La condición puede ser cualquier condición lógica.
El código encerrado entre llaves ({}) se ejecuta solo si se cumple la condición. Todo el código que se encuentra fuera de las llaves se ejecuta siempre ya que no depende de la condición.


Ej: Supongamos que vamos a una fiesta. En la entrada del bar hay un cartel en el que pone “solo mayores de 18”



El programa nos preguntara nuestra edad, si somos mayores de edad la condición del if es cierta por lo que podremos entrar, disfrutaremos de la fiesta y al final nos iremos para casa:


Si somos menores (y respetamos las normas) no se cumplirá el if por lo que se saltará todo el código entre llaves y no podremos entrar, así que nos tendremos que marchar directamente:



Las instrucciones de preguntar la edad y de irnos a casa no dependen de que seamos mayores de edad puesto que en ambos casos se llevan a cabo, la condición solo nos impedirá disfrutar de la fiesta.



IF … ELSE
Hay casos en los que puede interesarnos ejecutar un código solo si se cumple y otro solo si no se cumple. Esto se puede conseguir utilizando la sentencia else:


if (condición){
//código que se ejecuta solo si se cumple
}else{
//codigo que se ejecuta solo si no se cumple
}


Al igual que antes todo lo que esté fuera de las llaves se ejecuta siempre.

Ej: Imaginemos que vamos a la misma fiesta pero, ahora hay un portero en la entrada que nos pregunta nuestra edad:




Si la edad introducida por el usuario es igual o superior a 18, igual que antes, se cumple la condición y podremos ir a la fiesta:



Si no es cierto, porque la edad es menor, no podremos entrar y se ejecutarán las instrucciones dentro de las llaves del else, el portero nos dirá que nos marchemos a nuestra casa:



SWITCH
La sentencia switch evalúa una variable. Dependiendo del valor que tenga ejecutará un código u otro.
La sintaxis de la sentencia switch es la siguiente:


switch (variable){
case valor1: //código para el valor1 break; case valor2: //código para el valor2 break; case valorN: //codigo para el valorN break; [default: //codigo para el valor por defecto break;]
}


La variable tiene que ser de tipo entero o carácter. A partir de la versión 7 de java también se permite String (cadenas de caracteres).

Cada case dentro de las llaves representa uno de los posibles valores que puede tomar la variable. Si el valor de la variable encaja con alguno de los case se ejecutará el código de ese case hasta el primer break.

La instrucción break es necesaria para que se detenga la ejecución, en caso contrario se ejecutarían todos los casos posteriores al seleccionado.

La instrucción default no es obligatoria pero, de usarse, debe ir al final de todos los case. Es el valor por defecto, si ningún case tiene el valor de la variable se ejecutará el código de default.

Ej: Supongamos que queremos simular el comportamiento de una agenda. El programa pide al usuario un día de la semana y le dice las tareas que tiene programadas para ese día:


La instrucción scan.nextLine() lee una cadena de teclado. Al incluir .toLowerCase() la pasa entera a minúsculas para permitir al usuario introducir “MARTES”, “Martes”, “MaRtEs” o cualquier combinación de mayúsculas o minúsculas que quiera y que el programa siga funcionando.

El default se ejecutará si no se introduce un día valido, por ejemplo: “martesa”.

Si introducimos por teclado “martes” se ejecutará el segundo caso que es el que tiene ese valor:




SENTENCIAS REPETITIVAS
Las sentencias repetitivas permiten que unas determinadas instrucciones se ejecuten un número finito de veces.
Son tres: for, while y do ... while


FOR
El for es un bucle controlado por contador. Se repite el código encerrado entre llaves un número conocido de veces.

La sintaxis es la siguiente:


for (inicio; condición; incremento){
//codigo que se reptite
}


Inicio: La inicialización del contador con el valor desde el que empieza a contar. El contador debe ser una variable entera.

Condición: Es una condición lógica que debe cumplirse para que el bucle se repita. En algún momento debe dejar de cumplirse ya que sino el bucle se repetiría de forma indefinida y eso es un error muy grave, es lo que se llama bucle infinito.

Incremento: El incremento es el encargado de hacer que el contador aumente (o disminuya en algunos casos) su valor para que cuente las repeticiones y alcance el valor necesario para detener la ejecución del bucle.

Ej: El siguiente código imprime por pantalla la tabla de multiplicar del 2:


El bucle se repite 10 veces ya que empieza en 1 (int i=1) y se incrementa de uno en uno (i++). La condición indica que se repetirá mientras sea menor o igual que 10. Como i va aumentando llegará un momento en que superará el valor 10 y el bucle se detendrá.

Dentro del for la i va aumentando en una unidad su valor, por lo tanto, cada vez que se hace esta operación: “resultado = 2 * i” la constante 2 se multiplica por un número una unidad mayor que la vez anterior.

El resultado final es el siguiente:



Como se puede apreciar aparece la operación 10 veces (las repeticiones del bucle) y cada vez tiene el valor correspondiente al termino por el que se multiplica (i).



WHILE
La sentencia while también permite realizar repeticiones pero, en este caso, el número de repeticiones no tiene porqué ser conocido (entre 0 y n) aunque, al igual que ocurría con el for, debe ser un número finito.
La sintaxis es la siguiente:


while (condición) {
//codigo que se repite
}


Si la condición es cierta el bucle se repite. En algún momento debe dejar de ser cierta para impedir el bucle infinito.

Ej: Supongamos que queremos saber cuantas veces hay que multiplicar un número por si mismo para superar 3546:



“n” es el número que se quiere multiplicar.

“contador” es el encargado de contar las veces que se multiplica por si mismo. Inicialmente es 0 ya que no se ha empezado a hacer ninguna operación.

“producto” irá acumulando las operaciones. Empieza con el valor de n ya que es el número que se quiere multiplicar.

La condición del while indica que se repetirá el código del interior de las llaves mientras el producto tenga un valor inferior a 3546.

Dentro de las llaves se multiplica “producto”, que inicialmente vale 3 por “n” que es 3 y se vuelve a guardar en “producto” reemplazando el 3 que contenía por un 9. En la siguiente repetición “producto” vale 9, se vuelve a multiplicar por 3 y se vuelve a guardar en “producto” que pasa a valer 27 y así sucesivamente hasta alcanzar o superar el valor deseado que será cuando el bucle se detenga. Además, por cada repetición, el contador incrementa su valor en una unidad, por lo que al final su valor será el número de veces que se ha repetido el bucle para conseguir el resultado deseado:





DO ... WHILE
El funcionamiento es el mismo que el while, la diferencia es que este bucle se repite entre 1 y n veces. Se suele usar para validar datos.

La sintaxis es la siguiente:


do{
//código que se repite
}while (condición);



La instrucción do no impide el acceso al bucle en ningún caso, por lo que al menos una vez se ejecutará el código entre llaves.

El bucle se repite mientras la condición sea cierta, igual que en el while. Por supuesto, en este caso, también hay que evitar los bucles infinitos.

Este bucle es el único que termina en punto y coma (;).


Ej: Supongamos que queremos que el usuario adivine el número en el que estamos pensando. Al menos una vez se lo preguntaremos y si lo acierta no insistiremos más pero, si no lo acierta se lo volveremos a preguntar hasta que lo acierte:


El número que debe acertar es n, que vale 5. Siempre que introduzca un valor distinto a este, la condición “numero != n” se cumplirá por lo que el bucle se repetirá. Solo cuando lo acierte la condición dejará de ser cierta y el bucle se detendrá permitiendo ejecutar el código que hay después: “System.out.println (“Has acertado!!!”);”:




No hay comentarios:

Publicar un comentario