viernes, 28 de octubre de 2016

10-Bucles en Java. Bucles for, while y do..While

En muchas ocasiones, en nuestros programas que creemos, tendremos la necesidad de utilizar repeticiones de código o instrucciones un número determinado de veces o hasta que se cumpla una condición. Para poder conseguirlo, en programación se utilizan los bucles.
Los bucles repiten una y otra vez un determinado código o conjunto de sentencias.
En Java podemos utilizar 3 tipos diferentes de bucles, muy parecidos los unos con los otros pero que debemos de elegir el que mejor se adapte a lo que queramos hacer en cada caso:
  1. Bucle for
  2. Bucle do..While
  3. Bucle While
Hay que tener mucho cuidado y no crear un bucle infinito, es decir, que no haya ninguna condición para que el programa salte el bucle y continúe el código. Por lo tanto, podemos deducir que dentro del bucle hay que indicar alguna condición para que si se cumple esta, el bucle termine y se pueda continuar con la ejecución del programa. Veamos cómo funciona estos 3 bucles:

10.1-Bucle for

En Java el bucle más difícil de utilizar es el bucle for. Este bucle permite repetir el código un número determinado de veces. Tiene la siguiente estructura:

public class Bucles {

    public static void main(String[] args) {

        //Bucle for

        for(int contador = 0; contador < 10; contador++) {

            System.out.println("Repetición nº: " + contador);

        }

    }

}


El bucle for se forma en 4 partes,  tres de ellas van entre paréntesis:

  1. Variable de inicialización. En el código anterior es donde creamos la variable entera de nombre contador, que la inicializamos con un valor de 0. Como podéis observar, esta variable la hemos creado dentro del bucle for pero se podría haber creado fuera de dicho bucle:

public class Bucles {

    public static void main(String[] args) {

        

        int contador;

        

        for(contador = 0; contador < 10; contador++) {

            System.out.println("Repetición nº: " + contador);

        }

    }

}

      2. La condición. En esta parte pondremos la condición que se tiene que dar para que se siga repitiendo el código que se encuentre dentro del bucle.

      3. El cambio. Para no crear un bucle infinito debemos de poner el cambio que se producirá cada vez que se repita el bucle for. En este caso hemos puesto que cada vez que se repita  el bucle la variable contador aumentará en 1 el valor, así, cuando la variable contador sea mayor o igual que 10 saldrá del bucle. Vemos que cada parte que hemos mencionado hasta ahora se separa con ';'. Cuando creamos la parte de inicialización se finaliza con ';' , luego cuando creamos la parte de la condición se termina de la misma forma y, cuando terminamos la parte de el cambio se cierra el paréntesis. Entre paréntesis se encuentran estas 3 partes.

      4. La cuarta parte es la que ejecutará el programa hasta que la condición del bucle sea falsa. Esta parte va entre corchetes '{}', aunque, al igual que cuando vimos el condicional if, si el bucle for sólo contiene una instrucción puede omitir de ellos sin que nos salga ningún tipo de error:

for(int contador = 0; contador < 10; contador++) 

            System.out.println("Repetición nº: " + contador);

Dentro del bucle podemos poner tantas instrucciones o sentencias como queramos ejecutar. Este código al ejecutarlo mostrará la siguiente salida por consola:

La variable contador empieza con valor 0 y como la condición es verdadera (contador es menor que 10) entonces se ejecuta la sentencia que muestra el valor de contador.
El último valor que muestra es 9 porque cuando la variable contador pasa a valer 10 la condición pasa a ser falsa y se sale del bucle. Al salir del bucle se ejecutarán las siguientes instrucciones, como en este caso no hay más el programa termina.

10.1.2-Bucles for Complejos

Un bucle for puede tener más de una variable en la parte de inicialización y más de una instrucción en la parte del cambio.

public class Bucles {

    public static void main(String[] args) {

        for(int x = 0, y = 2; x < 10; x++, y += 2){

            System.out.println("X vale: " + x);

            System.out.println("Y vale: " + y);

        }

    }

}

El código anterior crea un bucle for en el que se crean dos variables, x e y. Mientras que x valga menos de 10 ejecuta las sentencias que muestran el valor de x e y. Después se producirá el cambio de que x aumenta en 1 y la variable y suma 2 a su valor. Cuando creamos más de una variable o más de un cambiador van separados por comas ',' .
Copiar y ejecutar el código para que veáis qué es lo que muestra en consola.

10.2-Bucle while

Los bucles while no llevan tantas partes como los bucles for. En estos bucles sólo es necesario que se cumpla una condición. Un bucle while tiene la siguiente estructura:

public class Bucles {

    public static void main(String[] args) {

      

        int saldo = 3584;

      

        while(saldo > 0) {

            System.out.println("Tiene saldo positivo de: " + saldo);

            saldo -= 500;

        }

    }

}


Observa que para crear el bucle después de while ponemos la condición entre paréntesis y dentro de las llaves '{}' ponemos las instrucciones que se ejecutarán mientras que la condición sea verdadera.
La variable saldo que ponemos dentro del paréntesis para crear la condición es creada con anterioridad al bucle, no se puede crear en el bucle como hacíamos en los bucles for, que sí que se podía.
Dentro del bucle while que se ejecuta si este es verdadero debemos colocar algún cambio para que alguna vez sea falso el bucle y termine, en caso contrario el bucle será infinito y no dejará de ejecutarse. En nuestro ejemplo hemos creado el cambio de que cada vez que se ejecute el bucle la variable saldo reste su valor en 500, así llegará el momento en que el saldo sea menor o igual a 0 y entonces el bucle será false y dejará de ejecutarse.

Podemos poner más de una condición en un bucle while. Por ejemplo podemos poner una condición que mientras que el saldo sea mayor que 0 ó que edad sea mayor de 30:

public class Bucles {

    public static void main(String[] args) {

      

        int saldo = 3584;

        int edad = 18;

      

        while(saldo > 0 || edad > 30) {

            //Poner el código a ejecutar mientras el bucle sea verdadero

        }

    }

}


En este caso si el saldo es mayor que cero o la edad es mayor a 30 se ejecutará el código que pongamos, sólo se debe dar una de las condiciones para que se ejecute. También podemos poner más de una condición en el bucle while para que se de más de una condición verdadera para ejecutar el código dentro del bucle:

public class Bucles {

    public static void main(String[] args) {

      

        int saldo = 3584;

        int edad = 18;

      

        while(saldo > 0 && edad > 30) {

            //Poner el código a ejecutar mientras el bucle sea verdadero

        }

    }

}


Hemos utilizado los operadores || y && para crear condición del bucle. Podéis repasar los distintos operadores en el tutorial PONER ENLACE DEL TUTORIAL DE LOS OPERADORES QUE ES EL NÚMERO 5.

10.3-Bucle do..while

Los bucles do..while son muy parecidos a los bucles while vistos anteriormente, pero con la diferencia que primer ejecuta al menos una vez el contenido de las instrucciones que contiene el bloque do (Recordemos que un bloque en programación se refiere al contenido que hay entre las llaves o corchetes '{}'). Luego comprueba la condición del while, si es verdadera vuelve a ejecutar el bloque do hasta que la condición sea falsa. Al igual que en los bucles while, debe de haber algún cambio en el bloque do para que no se cree un bucle infinito.
Es mejor ver toda esta teoría en un mini-programa en el que se pedirá que se introduzca el número 3, y mientras que no se introduzca ese número se seguirá repitiendo el bucle:

import java.util.Scanner;



public class Bucles {

    public static void main(String[] args) {

        Scanner miScanner = new Scanner(System.in);

        int respuesta;

        //Bucle do..while

        do{

            //Lo que hay dentro de este bloque se ejecutará al menos una vez

            System.out.println("Introduzca el número 3: ");

            respuesta = miScanner.nextInt();

        }while(respuesta != 3);

      

        System.out.println("Correcto!!");

    }

}


El bloque do {..} se ejecuta sí o sí una vez, es decir, mostrará por pantalla que se introduzca el número 3. Después de introducir un número comprobará la condición while, si la condición es verdadera, respuesta es  distinto de 3, entonces se ejecutará de nuevo el bloque do{..}, si la condición es falsa ya no se repetirá más el bucle y pasa a la siguiente instrucción que es que muestra por pantalla "Correcto!!".

Usar un bucle u otro dependerá de qué es lo que queremos hacer y el que más nos convenga en cada caso


10.4-Salir de un Bucle

Para salir de un bucle hemos visto que lo más fácil o lo más normal es que la condición del bucle sea falsa. Pero podemos forzar nosotros mismos a que se salga de un bucle con un break. Veámoslo con un ejemplo práctico:

public class Bucles {

    public static void main(String[] args) {

       int pts = 0;

       

       while(pts <= 1000) {

           pts += 10;

           System.out.println(pts);

           if(pts == 500) {//Provocamos que el bucle salga si pts es igual a 500

               break;

           } 

       }

    }

}

El programa anterior crea un bucle que en teoría deberá de repetirse mientras que la variable pts sea igual o menor a 1000. Pero hemos creado un condicional if que si pts llega a valer igual a 500 salga automáticamente del bucle, sin llegar a ser superior a mil, que es la condición que tiene el bucle while.
Otra instrucción especial es continue. Utilizando continue en vez de un break lo que hace es que al utilizarlo el bucle vuelve al comienzo de dicho bucle y salga de su iteración actual. Como siempre digo, es mejor verlo con un ejemplo para entenderlo:
public class Bucles {

    public static void main(String[] args) {

       int pts = 0;

       

       while(pts <= 1000) {

           pts += 10;

           

           if(pts == 500) {//Cuando pts sea igual a 500 vuelve al principio del bucle y se salta el 

//System.out.println(pts) que hay a continuación. Por lo que se irán imprimiendo los números

//de 10 en 10 hasta llegar a mil pero cuando pts sea igual a 500 no será mostrado este número.

               continue;

           } 

           System.out.println(pts);

       }

    }

}

Copiar y ejecutar este código para ver cómo el número 500 no es mostrado. Se pueden utilizar las instrucciones break y continue en los tres tipos de bucles que hemos visto en este tutorial.
Vamos a ver a continuación un programa Java que permite medir la velocidad que tiene nuestro ordenador. Para ello el programa contará el número de veces que puede realizar una raíz cuadrada en un minuto.
public class VelocidadOrdenador {

    public static void main(String[] args) {

        long comienzo = System.currentTimeMillis();//Hora actual en milisegundos

        long finalTiempo = comienzo + 60000;//final un minuto después de comienzo

        long index = 0;//Contador que mide las repeticiones

        

        while(true) {

            double x = Math.sqrt(index);//Raíz cuadrada

            long ahora = System.currentTimeMillis();

            if(ahora > finalTiempo) {

                break;

            }

            index++;

        }

        System.out.println(index + " Repeticiones en un minuto");

    }

}

Algunas de las cosas del programa todavía no las hemos visto como son los métodos. En este programa se hace uso de los métodos sqrt de la clase Math y el método currentTimeMillils de la clase System. Los métodos los veremos dentro de muy poco ya, cuando veamos la explicación de la programación orientada a objetos y de que están formados los objetos.

Ejercicios tutorial 10.

Ejercicio 1:

Escribe un programa que lea un número y lo descomponga en factores primos, de acuerdo con el formato de la

siguiente captura:

Solución:



Con este ejercicio concluimos este tutorial. En el siguiente tutorial veremos cómo crear nuestro primer objeto en Java.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...