TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
1
TEMARIO DE CURSO
PROGRAMACIÓN JAVA SE
CAPÍTULO 3
BUCLES
© Iñaki Martín
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
2
COMO SE HAN DE LEER ESTOS APUNTES
• Se pueden leer los diferentes apartados en el orden establecido, y acudir al
documento JYOC-Java-Anexo1-Ejercicios para ir realizando los ejercicios
correspondientes a cada capítulo
• Asimismo, en cada capítulo comienza con una guía resumen, que no es necesario
leer inicialmente, sol ose aporta para posteriores consultas rápidas
• Los contenidos de los documentos están escritos con diferentes formatos, que
atienden a estos modelos;
o Los textos en morado son ejemplos de sintaxis de instrucciones
o Los textos en azul son ejemplos de instrucciones de código java
o Los textos en verde son nombres de Clases, Interfaces o métodos Java
o El texto marcado en rojo significa un concepto al que hay que prestarle
especial atención
Los textos con este fondo son ejemplos de código.
Las Clases y métodos van en verde y el resto de
código con otros colores
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
• Los textos enmarcados en un cuadro de fondo violeta son
conceptos avanzados.
• Inicialmente NO es necesario leerlos ni aprenderlos
• Aportan algo más de profundidad sobre la materia que se esté
exponiendo, pero pueden provocar confusión por necesitar
mayor nivel del adquirido para comprenderse (más tarde se
verán).
Temas avanzados Textos no obligatorios
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
3for / while : Resumen
WHILE
int i=0;
while (i<10) {
System.out.print(i);
i++;
}
FOR ANIDADOS
for ( int a=1; a <=3 ; a++) {
System.out.print("Vuelta "+a+ " del bucle externo");
for ( int b=1; b <=3 ; b++) {
System.out.print("Vuelta "+b+ " de bucle interno);
}
}
FOR
for (int j = 0 ; j < 10 ; j++) {
System.out.print(j);
}
WHILE contra FOR
int vc = 1;
while (vc <= 10)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
vc++;
}
for ( int vc = 1; vc <= 10 ; vc++)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
}
DO-WHILE
int a=0;
do{ //asegura pasar a menos una vez
System.out.print(a);
a++;
}while(a<10);
FOR con incremento de 3
CONTINUE-BREAK
for (int j = 0; j < 10; j++) {
if(j>5){
continue; //salta a inicio
}
if(j>8){
break; //abandona el for
}
System.out.println(j);
}
for (int j = 0 ; j < 100 ; j = j + 3) {
System.out.print(j);
}
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
4
๏ Cuando se necesita que un grupo de ordenes se repita varias veces, se puede hacer uso de las instrucciones de
bucle para escribir una sola vez dichas ordenes, e indicar que se han de repetir.
๏ La instrucción while repita las ordenes que están dentro de su bloque de llaves mientras que se dé por cierta una
condición establecida. Este es el formato y un ejemplo:
Veamos paso a paso lo que va haciendo el bucle del ejemplo:
✤ La variable a toma valor 1
✤ Se evalúa la condición del while. Da cierto (a es 1, que es menor que 4), y se entra en el bucle while y se ejecutan
sus ordenes (se imprime "a vale 1" y luego se incrementa el valor de a, que ahora será 2)
✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while).
✤ Se evalúa la condición del while. Da cierto (a es 2, y es menor que 4), y se entra en el bucle while y se ejecutan
sus ordenes (se imprime "a vale 2" y luego se incrementa el valor de a, que ahora será 3
✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while).
✤ Se evalúa la condición del while. Da cierto (a es 3, y es menor que 4), y se entra en el bucle while y se ejecutan
sus ordenes (se imprime "a vale 3" y luego se incrementa el valor de a, que ahora será 4)
✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while).
✤ Se evalúa la condición del while. Da falso (a es 4, y 4 no es menor que 4), por lo que no se ejecuta el bucle y se
continua por la línea siguiente al bloque while
Instrucción while (I)
while
int a=1;
while ( a < 4) {
System.out.println("el valor de a es "+ a) ;
a ++;
}
// while (condición) {
// (instrucciones)
// break; //opcional
// continue; //opcional
// }
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
5
๏ La estructura normal de un bucle while es la siguiente
int valordecontrol = 1;
while ( valordecontrol < 4 ) {
System.out.println(“el valor de a es ” + valordecontrol) ;
valordecontrol ++;
}
Instrucción while (II)
Antes del bucle se define una variable de control, en este
caso valordecontrol, y se inicializa con un valor de entrada
La condición del bucle hace una comprobación
del estado de la variable de control
Dentro del bucle se realiza una
actualización de la variable de
control
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
6
๏ La condición ha de ser una expresión que de un resultado de tipo boolean (true o false)
๏ Para interrumpir la ejecución del bucle de modo incondicional, se usa la instrucción
break, que al ejecutarse abandona el bucle y continua por la línea siguiente al bloque while
๏ La instrucción continue interrumpe la ejecución del resto del bloque del while, y lleva la ejecución
nuevamente a la línea de cabecera, a volver a comenzar el bucle, y evaluando nuevamente la condición
๏ Las llaves no son obligatorias si hay solo una instrucción, aunque son recomendables por claridad
Instrucción while (III)
Consideraciones de uso de while
¡Cuidado!: Uno de los mayores peligros de un bucle es entrar en un llamado bucle infinito, esto es,
un bucle que nunca acaba. Puede darse este caso si:
• Que los elementos de la condición no cambien nunca, con lo que la condición siempre se cumple.
(p.e. si la condición es "a<4", y el valor de a es <4, pero a no se cambia nunca)
• El valor de los elementos de la condición cambia, pero en "sentido" contrario al supuesto limite
que intenta cumplir la condición
(p.e. si la condición es "a<4", y el valor de a es <4, y el cambio de a es siempre decrecer)
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
7
๏ La variable de control es el elemento que más veces habrá que analizar a la hora de decidir cómo
queremos que funcione nuestro bucle.
๏ En realidad, lo que hay que hacer a la hora de construir un bucle es pensar que éste va a ser "un grupo de
comandos que se va a repetir n veces, pero que en cada vez, un elemento va a ser diferente,
generalmente, la variable de control"
๏ Realmente, este bucle
no es más que todas estas líneas seguidas:
Instrucción while (IV)
System.out.println(“el valor de a es ” + valordecontrol) ;
valordecontrol ++;
System.out.println(“el valor de a es ” + valordecontrol) ;
valordecontrol ++;
System.out.println(“el valor de a es ” + valordecontrol) ;
valordecontrol ++;
Primera repetición, donde
valordecontrol valdrá 1
y luego cambia
Primera repetición, donde
valordecontrol valdrá 2
y luego cambia
Primera repetición, donde
valordecontrol valdrá 3
y luego cambia
int valordecontrol = 1;
Esto no es el bucle en si, va antes del bucle
int valordecontrol = 1 ;
while ( valordecontrol < 4 ){
System.out.println(“el valor de a es " + valordecontrol);
valordecontrol ++ ;
}
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
8
Ejemplo con análisis: hacer un programa que muestre la tabla de multiplicar del 2.
๏ Si pintamos en papel lo que queremos que se muestre, habrá de ser algo así:
2 por 1 es 2
2 por 2 es 4
2 por 3 es 6
.. (etc.)
๏ Vemos que realmente se trata una línea muy parecida, que ser repite n veces, y en la que cambian solo dos
cosas, así que vamos a escribir la linea que se repite y a lo que cambia lo llamaremos @@ y ##.
๏ Por lo tanto esa es la línea que hay que repetir (meter en un bucle). Busquemos los elementos de un bucle while.
๏ La variable de control la vamos a llamar vc, y vamos a empezar por darle un valor inicial que aun no sabemos
(ponemos por ahora &&) y la condición del bucle aun no la sabemos tampoco (ponemos por ahora ???) y
tampoco sabemos como va a cambiar la variable de control, así que ponemos en la condición por ahora $$$
Pasos para diseñar un bucle while (I)
Ejemplo de la ejecución del programa
primera versión del bucle
int vc = && ;
while ( ??? ){
System.out.println("2 por " + @@ +"es "+ ## );
$$$;
}
System.out.println( "2 por " + @@ + "es " + ## );
Ejemplo de pasos para diseñar un bucle
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
9
๏ Vemos que @@ en el ejemplo de ejecución del programa ha de tener los valores 1,2,3…
Y recordamos que normalmente los valores que toma una variable de control en un bucle son 1,2,3…
Si imaginamos que en mi bucle la variable de control puede ir tomando esos mismos valores, se descubre que
puedo sustituir @@ por la variable de control, y que esta ha de empezar con valor 1 y acabar con valor 10, así
que:
1. Como el primer valor de la variable de control debe ser 1, puedo sustituir && por 1
2. El último valor de la variable de control debe ser 10, por lo que el limite ??? debe ser “mientras vc<=10”
3. El valor de @@ es la propia variable de control, vc
4. El cambio de valor de vc es incrementado de uno en uno, así que la sentencia de actualización ($$$) será vc++
Pasos para diseñar un bucle while (II)
segunda versión del bucle
int vc = 1;
while ( vc<10 ) {
System.out.println("2 por " + vc + "es "+ ## );
vc++;
}
primera versión del bucle
int vc = && ;
while ( ??? ){
System.out.println("2 por " + @@ +"es "+ ## );
$$$;
}
๏ Escribimos de nuevo la primera versión que anteriormente hemos deducido, para tenerla a la vista:
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
10
๏ Sólo nos queda ver cómo obtener el contenido de # . Necesitamos que salga esto:
2 por 1 es 2
2 por 2 es 4
2 por 3 es 6
.. (etc.)
๏ ¿Cómo se puede obtener el valor deseado (marcado en rojo), sabiendo sólo los valores que (de fijo) va
a ir tomando la variable de control (los que se marcan en azul). Hay que buscar una regla para
conseguir los valores en rojo en función de lo que valen los valores en azul. Podemos hacer una tabla
de este tipo, muy útil en todos los análisis de bucles:
๏ Vemos pues que si uso 2*vc, obtengo realmente lo que quiero, así que he de sustituir ## por dicha
formula, y que me vale para cada una de las vueltas que va a dar el bucle, con lo que tengo ya mi bucle
completo:
Pasos para diseñar un bucle while (III)
tercera y definitiva versión del bucle
valor que deseamos
obtener ( ## )
valores que va a ir tomando la variable de
control (vc)
como convertir la primera
columna en la segunda
2 1 2 * vc
4 2 2 * vc
6 3 2 * vc
int vc = 1;
while (vc < 10) {
System.out.println ("2 por " + vc +"es "+ 2 * vc);
vc++;
}
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
11
๏ Una vez que tenemos la solución, vamos a “leer” la ejecución del programa, línea a línea,
para analizar lo que hace más despacio:
1. Se da valor 1 a vc
2. Como vc es menor o igual que 10, entra en el bucle
3. Con la instrucción System… imprime "2 por 1 es 2" (se ve claro sustituyendo vc por su valor actual, 1)
4. Incrementa el valor de vc, que ahora vale 2
5. Acaba el bucle, con lo que evalúa nuevamente la condición para ver si ha de entrar en el while otra vez
6. Como vc es menor o igual que 10, (vc es 2) entra en el bucle otra vez
7. Con la instrucción System… imprime "2 por 2 es 4" (se ve claro sustituyendo vc por su valor actual, 2)
8. Incrementa el valor de vc, que ahora vale 3
9. Acaba el bucle, con lo que evalúa nuevamente la condición para ver si ha de entrar en el while otra vez
10. Como vc es menor o igual que 10, (vc es 3) entra en el bucle
11. Con la instrucción System… imprime "2 por 3 es 6" (se ve claro sustituyendo vc por su valor actual, 1)
12. Incrementa el valor de vc, que ahora vale 4
13. ……
14. y sigue repitiendo hasta que un incremento de vc le de un valor de 11, con lo que al acabar el bucle,
15. al evaluar la condición como vc ya no es menor o igual que 10, no entra en el bucle y sigue
int vc = 1;
while (vc < 10) {
System.out.println ("2 por " + vc + "es " + 2 * vc);
vc++;
}
Pasos para diseñar un bucle while (IV)
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
12
๏ Hay una variante de while que consiste en la instrucción do-while, con esta sintaxis y ejemplo:
๏ Vemos que la condición de ejecutar el bucle ha pasado de ser la primera a ser la última línea del bucle
๏ La diferencia con el while anterior está en que
➡ en un while se evalúa siempre la condición para entrar, incluso la primera vez que se llega al bucle, por
lo que puede que no se entre en el bucle ni una sola vez
➡ en un do-while la evaluación de la condición se hace al final del bucle, por lo que la primera vez el bucle
se ejecutará siempre, y solo se pueden discriminar subsiguientes ejecuciones del bucle.
๏ Se garantiza pues, con un do-while, que el bucle se ejecuta al menos una vez.
๏ Por lo demás todas las consideraciones del while se aplican al do-while
do-while
do-while
// do {
// (instrucciones)
// } while (condición)
int a=1;
do {
System.out.println("el valor de a es " + a) ;
a ++;
}while ( a < 4);
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
13Instrucción for (I)
for
int vc = 1;
while (vc <= 10)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
vc++;
}
for ( int vc = 1; vc <= 10 ; vc++)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
}
๏ La instrucción for permite ejecutar bucles de un modo muy similar a while, con otra sintaxis. Realmente podemos
ver como lo que hace es recolocar los elementos del bucle while en otra estructura, veamos la comparación
๏ El ejemplo anterior de la tabla del 2 con un while y un for comparados:
// for (inicialización; comprobación; actualización) {
// (instrucciones)
// break; //opcional
// continue; //opcional
// }
estructura de un while estructura de un for
inicialización
while ( comprobación ) { for ( inicialización ; comprobación ; actualización ) {
instrucciones instrucciones
…. ….
actualización }
}
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
14
๏ La condición ha de ser una expresión que de un resultado de tipo boolean (true o false)
๏ La condición se evalúa ANTES de la primera ejecución de un for, por lo que puede que no se cumpla y no se
entre ni una sola vez al bucle
๏ En la inicialización se permite la declaración de la variable de control, si esta antes no existía.
Parece poco, pero realmente sí hay una diferencia importante. La variable vc declarada en la inicialización del for
(columna derecha) sólo existe dentro del bucle, se crea cuando se inicia el bucle y se destruye cuando se
acaba el bucle.
๏ Se puede usar break y continue del mismo modo que se usaban en while. En el caso de continue, en un
while dirige la acción a la condición del bucle, en el caso de un for, lo envía a la instrucción de actualización.
Instrucción for (II)
Consideraciones de uso de for
int vc ;
for ( vc = 1; vc <= 10 ; vc++)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
}
for ( int vc = 1; vc <= 10 ; vc++)
{
System.out.println("2 por " + vc + "es " + (2 * vc));
}
Este es el único caso confuso al tratar la visibilidad de una variable. Aunque parezca lo contrario, la
variables declaradas dentro de los paréntesis del for pertenecen realmente al interior del bloque,
como si se hubieran declarado dentro de las llaves (aunque no se haya hecho)
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
15
๏ El cambio de valor en la actualización de la variable de control puede ser cualquiera, tanto en for
como en while, no necesariamente incrementando de 1 en 1.
๏ En el ejemplo siguiente, el bucle va cambiando la variable de 2 en 2, y decreciendo, desde 20 hasta 0.
Atención al cambio que se ha de hacer en la condición :
๏ Y este bucle cambia de 5 en 5 desde 0 hasta 100 :
Instrucción for (III) Incremento variable
Incremento variable
for (int vc=0 ; vc <=100 ; vc=vc+5) {
System.out.println( vc );
}
for (int vc=20 ; vc >=0 ; vc = vc - 2 ) {
System.out.println( vc );
}
• No son obligatorios ninguno de los elementos de la cabecera de un for. Por ejemplo:
for ( ; ; )
es una instrucción totalmente valida, crea además un bucle infinito salvo que usemos una salida forzada dentro del bucle.
• Opcionalmente, usando una coma como separador, se pueden añadir más de una instrucción en la inicialización y la
actualización de una instrucción for:
for ( a=1, b=12 ; a<12 ; a++, b - - , c=a+b , System.out.println(“valor de c”+c ){
. . . . .
}
Parámetros de un forTemas avanzados
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
16
๏ Se puede incluir un bucle dentro de otro bucle. El bucle interno se repite por lo tanto tantas veces como
indique el bucle externo. Esto es especialmente útil en el tratamiento de matrices (ver más adelante)
๏ Ver este código y la ejecución que resulta:
‣ Resultado de la ejecución:
Comienza la vuelta 1 del bucle externo
--Vuelta 1 del bucle interno donde el externo esta la vuelta 1
--Vuelta 2 del bucle interno donde el externo esta la vuelta 1
--Vuelta 3 del bucle interno donde el externo esta la vuelta 1
Comienza la vuelta 2 del bucle externo
--Vuelta 1 del bucle interno donde el externo esta la vuelta 2
--Vuelta 2 del bucle interno donde el externo esta la vuelta 2
--Vuelta 3 del bucle interno donde el externo esta la vuelta 2
Comienza la vuelta 3 del bucle externo
--Vuelta 1 del bucle interno donde el externo esta la vuelta 3
--Vuelta 2 del bucle interno donde el externo esta la vuelta 3
--Vuelta 3 del bucle interno donde el externo esta la vuelta 3
Bucles anidados
Bucles anidados
for ( int a=1; a <=3 ; a++) {
System.out.println("Comienza la vuelta "+a+ " del bucle externo" );
for ( int b=1; b <=3 ; b++) {
System.out.println("--Vuelta "+b+ " del bucle interno donde el externo esta la vuelta"+a );
}
}
TemariodecursoJavaSE©IñakiMartín
3.- Bucles
©
Iñaki Martín
17Ejercicios prácticos
int[] lista = new int[4];
for (int i = 0; i <lista.length ; i++) {
lista[i]= (int) (Math.random()*20);
System.out.println("el elemento añadido es "+lista[i]);
}
int suma = 0;
for (int i = 0; i <lista.length ; i++) {
suma = suma + lista[i];
}
System.out.println("La suma es "+suma);
๏Ejercicio: Crear un array con números al azar y sumar todos sus elementos posteriormente
Ejercicios prácticos
int[] lista = new int[4];
int[] listaCopia = new int[4];
for (int i = 0; i < lista.length; i++) {
lista[i] = (int) (Math.random() * 20);
}
System.out.println("Elementos de lista;");
for (int i = 0; i < lista.length; i++) {
System.out.println(lista[i]);
}
for (int i = 0; i < lista.length; i++) {
listaCopia[i] = lista[i];
}
System.out.println("Elementos de listaCopia;");
for (int i = 0; i < lista.length; i++) {
System.out.println(listaCopia[i]);
}
๏Ejercicio: Crear un array con números al azar, crear otro array y copiar los elementos del primero en el segundo

Jyoc java-cap03 bucles

  • 1.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 1 TEMARIODE CURSO PROGRAMACIÓN JAVA SE CAPÍTULO 3 BUCLES © Iñaki Martín Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional.
  • 2.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 2 COMOSE HAN DE LEER ESTOS APUNTES • Se pueden leer los diferentes apartados en el orden establecido, y acudir al documento JYOC-Java-Anexo1-Ejercicios para ir realizando los ejercicios correspondientes a cada capítulo • Asimismo, en cada capítulo comienza con una guía resumen, que no es necesario leer inicialmente, sol ose aporta para posteriores consultas rápidas • Los contenidos de los documentos están escritos con diferentes formatos, que atienden a estos modelos; o Los textos en morado son ejemplos de sintaxis de instrucciones o Los textos en azul son ejemplos de instrucciones de código java o Los textos en verde son nombres de Clases, Interfaces o métodos Java o El texto marcado en rojo significa un concepto al que hay que prestarle especial atención Los textos con este fondo son ejemplos de código. Las Clases y métodos van en verde y el resto de código con otros colores Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional. • Los textos enmarcados en un cuadro de fondo violeta son conceptos avanzados. • Inicialmente NO es necesario leerlos ni aprenderlos • Aportan algo más de profundidad sobre la materia que se esté exponiendo, pero pueden provocar confusión por necesitar mayor nivel del adquirido para comprenderse (más tarde se verán). Temas avanzados Textos no obligatorios
  • 3.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 3for/ while : Resumen WHILE int i=0; while (i<10) { System.out.print(i); i++; } FOR ANIDADOS for ( int a=1; a <=3 ; a++) { System.out.print("Vuelta "+a+ " del bucle externo"); for ( int b=1; b <=3 ; b++) { System.out.print("Vuelta "+b+ " de bucle interno); } } FOR for (int j = 0 ; j < 10 ; j++) { System.out.print(j); } WHILE contra FOR int vc = 1; while (vc <= 10) { System.out.println("2 por " + vc + "es " + (2 * vc)); vc++; } for ( int vc = 1; vc <= 10 ; vc++) { System.out.println("2 por " + vc + "es " + (2 * vc)); } DO-WHILE int a=0; do{ //asegura pasar a menos una vez System.out.print(a); a++; }while(a<10); FOR con incremento de 3 CONTINUE-BREAK for (int j = 0; j < 10; j++) { if(j>5){ continue; //salta a inicio } if(j>8){ break; //abandona el for } System.out.println(j); } for (int j = 0 ; j < 100 ; j = j + 3) { System.out.print(j); }
  • 4.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 4 ๏Cuando se necesita que un grupo de ordenes se repita varias veces, se puede hacer uso de las instrucciones de bucle para escribir una sola vez dichas ordenes, e indicar que se han de repetir. ๏ La instrucción while repita las ordenes que están dentro de su bloque de llaves mientras que se dé por cierta una condición establecida. Este es el formato y un ejemplo: Veamos paso a paso lo que va haciendo el bucle del ejemplo: ✤ La variable a toma valor 1 ✤ Se evalúa la condición del while. Da cierto (a es 1, que es menor que 4), y se entra en el bucle while y se ejecutan sus ordenes (se imprime "a vale 1" y luego se incrementa el valor de a, que ahora será 2) ✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while). ✤ Se evalúa la condición del while. Da cierto (a es 2, y es menor que 4), y se entra en el bucle while y se ejecutan sus ordenes (se imprime "a vale 2" y luego se incrementa el valor de a, que ahora será 3 ✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while). ✤ Se evalúa la condición del while. Da cierto (a es 3, y es menor que 4), y se entra en el bucle while y se ejecutan sus ordenes (se imprime "a vale 3" y luego se incrementa el valor de a, que ahora será 4) ✤ Como se ha acabado el bloque, se vuelve a la primera linea del bloque (línea de la instrucción while). ✤ Se evalúa la condición del while. Da falso (a es 4, y 4 no es menor que 4), por lo que no se ejecuta el bucle y se continua por la línea siguiente al bloque while Instrucción while (I) while int a=1; while ( a < 4) { System.out.println("el valor de a es "+ a) ; a ++; } // while (condición) { // (instrucciones) // break; //opcional // continue; //opcional // }
  • 5.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 5 ๏La estructura normal de un bucle while es la siguiente int valordecontrol = 1; while ( valordecontrol < 4 ) { System.out.println(“el valor de a es ” + valordecontrol) ; valordecontrol ++; } Instrucción while (II) Antes del bucle se define una variable de control, en este caso valordecontrol, y se inicializa con un valor de entrada La condición del bucle hace una comprobación del estado de la variable de control Dentro del bucle se realiza una actualización de la variable de control
  • 6.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 6 ๏La condición ha de ser una expresión que de un resultado de tipo boolean (true o false) ๏ Para interrumpir la ejecución del bucle de modo incondicional, se usa la instrucción break, que al ejecutarse abandona el bucle y continua por la línea siguiente al bloque while ๏ La instrucción continue interrumpe la ejecución del resto del bloque del while, y lleva la ejecución nuevamente a la línea de cabecera, a volver a comenzar el bucle, y evaluando nuevamente la condición ๏ Las llaves no son obligatorias si hay solo una instrucción, aunque son recomendables por claridad Instrucción while (III) Consideraciones de uso de while ¡Cuidado!: Uno de los mayores peligros de un bucle es entrar en un llamado bucle infinito, esto es, un bucle que nunca acaba. Puede darse este caso si: • Que los elementos de la condición no cambien nunca, con lo que la condición siempre se cumple. (p.e. si la condición es "a<4", y el valor de a es <4, pero a no se cambia nunca) • El valor de los elementos de la condición cambia, pero en "sentido" contrario al supuesto limite que intenta cumplir la condición (p.e. si la condición es "a<4", y el valor de a es <4, y el cambio de a es siempre decrecer)
  • 7.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 7 ๏La variable de control es el elemento que más veces habrá que analizar a la hora de decidir cómo queremos que funcione nuestro bucle. ๏ En realidad, lo que hay que hacer a la hora de construir un bucle es pensar que éste va a ser "un grupo de comandos que se va a repetir n veces, pero que en cada vez, un elemento va a ser diferente, generalmente, la variable de control" ๏ Realmente, este bucle no es más que todas estas líneas seguidas: Instrucción while (IV) System.out.println(“el valor de a es ” + valordecontrol) ; valordecontrol ++; System.out.println(“el valor de a es ” + valordecontrol) ; valordecontrol ++; System.out.println(“el valor de a es ” + valordecontrol) ; valordecontrol ++; Primera repetición, donde valordecontrol valdrá 1 y luego cambia Primera repetición, donde valordecontrol valdrá 2 y luego cambia Primera repetición, donde valordecontrol valdrá 3 y luego cambia int valordecontrol = 1; Esto no es el bucle en si, va antes del bucle int valordecontrol = 1 ; while ( valordecontrol < 4 ){ System.out.println(“el valor de a es " + valordecontrol); valordecontrol ++ ; }
  • 8.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 8 Ejemplocon análisis: hacer un programa que muestre la tabla de multiplicar del 2. ๏ Si pintamos en papel lo que queremos que se muestre, habrá de ser algo así: 2 por 1 es 2 2 por 2 es 4 2 por 3 es 6 .. (etc.) ๏ Vemos que realmente se trata una línea muy parecida, que ser repite n veces, y en la que cambian solo dos cosas, así que vamos a escribir la linea que se repite y a lo que cambia lo llamaremos @@ y ##. ๏ Por lo tanto esa es la línea que hay que repetir (meter en un bucle). Busquemos los elementos de un bucle while. ๏ La variable de control la vamos a llamar vc, y vamos a empezar por darle un valor inicial que aun no sabemos (ponemos por ahora &&) y la condición del bucle aun no la sabemos tampoco (ponemos por ahora ???) y tampoco sabemos como va a cambiar la variable de control, así que ponemos en la condición por ahora $$$ Pasos para diseñar un bucle while (I) Ejemplo de la ejecución del programa primera versión del bucle int vc = && ; while ( ??? ){ System.out.println("2 por " + @@ +"es "+ ## ); $$$; } System.out.println( "2 por " + @@ + "es " + ## ); Ejemplo de pasos para diseñar un bucle
  • 9.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 9 ๏Vemos que @@ en el ejemplo de ejecución del programa ha de tener los valores 1,2,3… Y recordamos que normalmente los valores que toma una variable de control en un bucle son 1,2,3… Si imaginamos que en mi bucle la variable de control puede ir tomando esos mismos valores, se descubre que puedo sustituir @@ por la variable de control, y que esta ha de empezar con valor 1 y acabar con valor 10, así que: 1. Como el primer valor de la variable de control debe ser 1, puedo sustituir && por 1 2. El último valor de la variable de control debe ser 10, por lo que el limite ??? debe ser “mientras vc<=10” 3. El valor de @@ es la propia variable de control, vc 4. El cambio de valor de vc es incrementado de uno en uno, así que la sentencia de actualización ($$$) será vc++ Pasos para diseñar un bucle while (II) segunda versión del bucle int vc = 1; while ( vc<10 ) { System.out.println("2 por " + vc + "es "+ ## ); vc++; } primera versión del bucle int vc = && ; while ( ??? ){ System.out.println("2 por " + @@ +"es "+ ## ); $$$; } ๏ Escribimos de nuevo la primera versión que anteriormente hemos deducido, para tenerla a la vista:
  • 10.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 10 ๏Sólo nos queda ver cómo obtener el contenido de # . Necesitamos que salga esto: 2 por 1 es 2 2 por 2 es 4 2 por 3 es 6 .. (etc.) ๏ ¿Cómo se puede obtener el valor deseado (marcado en rojo), sabiendo sólo los valores que (de fijo) va a ir tomando la variable de control (los que se marcan en azul). Hay que buscar una regla para conseguir los valores en rojo en función de lo que valen los valores en azul. Podemos hacer una tabla de este tipo, muy útil en todos los análisis de bucles: ๏ Vemos pues que si uso 2*vc, obtengo realmente lo que quiero, así que he de sustituir ## por dicha formula, y que me vale para cada una de las vueltas que va a dar el bucle, con lo que tengo ya mi bucle completo: Pasos para diseñar un bucle while (III) tercera y definitiva versión del bucle valor que deseamos obtener ( ## ) valores que va a ir tomando la variable de control (vc) como convertir la primera columna en la segunda 2 1 2 * vc 4 2 2 * vc 6 3 2 * vc int vc = 1; while (vc < 10) { System.out.println ("2 por " + vc +"es "+ 2 * vc); vc++; }
  • 11.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 11 ๏Una vez que tenemos la solución, vamos a “leer” la ejecución del programa, línea a línea, para analizar lo que hace más despacio: 1. Se da valor 1 a vc 2. Como vc es menor o igual que 10, entra en el bucle 3. Con la instrucción System… imprime "2 por 1 es 2" (se ve claro sustituyendo vc por su valor actual, 1) 4. Incrementa el valor de vc, que ahora vale 2 5. Acaba el bucle, con lo que evalúa nuevamente la condición para ver si ha de entrar en el while otra vez 6. Como vc es menor o igual que 10, (vc es 2) entra en el bucle otra vez 7. Con la instrucción System… imprime "2 por 2 es 4" (se ve claro sustituyendo vc por su valor actual, 2) 8. Incrementa el valor de vc, que ahora vale 3 9. Acaba el bucle, con lo que evalúa nuevamente la condición para ver si ha de entrar en el while otra vez 10. Como vc es menor o igual que 10, (vc es 3) entra en el bucle 11. Con la instrucción System… imprime "2 por 3 es 6" (se ve claro sustituyendo vc por su valor actual, 1) 12. Incrementa el valor de vc, que ahora vale 4 13. …… 14. y sigue repitiendo hasta que un incremento de vc le de un valor de 11, con lo que al acabar el bucle, 15. al evaluar la condición como vc ya no es menor o igual que 10, no entra en el bucle y sigue int vc = 1; while (vc < 10) { System.out.println ("2 por " + vc + "es " + 2 * vc); vc++; } Pasos para diseñar un bucle while (IV)
  • 12.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 12 ๏Hay una variante de while que consiste en la instrucción do-while, con esta sintaxis y ejemplo: ๏ Vemos que la condición de ejecutar el bucle ha pasado de ser la primera a ser la última línea del bucle ๏ La diferencia con el while anterior está en que ➡ en un while se evalúa siempre la condición para entrar, incluso la primera vez que se llega al bucle, por lo que puede que no se entre en el bucle ni una sola vez ➡ en un do-while la evaluación de la condición se hace al final del bucle, por lo que la primera vez el bucle se ejecutará siempre, y solo se pueden discriminar subsiguientes ejecuciones del bucle. ๏ Se garantiza pues, con un do-while, que el bucle se ejecuta al menos una vez. ๏ Por lo demás todas las consideraciones del while se aplican al do-while do-while do-while // do { // (instrucciones) // } while (condición) int a=1; do { System.out.println("el valor de a es " + a) ; a ++; }while ( a < 4);
  • 13.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 13Instrucciónfor (I) for int vc = 1; while (vc <= 10) { System.out.println("2 por " + vc + "es " + (2 * vc)); vc++; } for ( int vc = 1; vc <= 10 ; vc++) { System.out.println("2 por " + vc + "es " + (2 * vc)); } ๏ La instrucción for permite ejecutar bucles de un modo muy similar a while, con otra sintaxis. Realmente podemos ver como lo que hace es recolocar los elementos del bucle while en otra estructura, veamos la comparación ๏ El ejemplo anterior de la tabla del 2 con un while y un for comparados: // for (inicialización; comprobación; actualización) { // (instrucciones) // break; //opcional // continue; //opcional // } estructura de un while estructura de un for inicialización while ( comprobación ) { for ( inicialización ; comprobación ; actualización ) { instrucciones instrucciones …. …. actualización } }
  • 14.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 14 ๏La condición ha de ser una expresión que de un resultado de tipo boolean (true o false) ๏ La condición se evalúa ANTES de la primera ejecución de un for, por lo que puede que no se cumpla y no se entre ni una sola vez al bucle ๏ En la inicialización se permite la declaración de la variable de control, si esta antes no existía. Parece poco, pero realmente sí hay una diferencia importante. La variable vc declarada en la inicialización del for (columna derecha) sólo existe dentro del bucle, se crea cuando se inicia el bucle y se destruye cuando se acaba el bucle. ๏ Se puede usar break y continue del mismo modo que se usaban en while. En el caso de continue, en un while dirige la acción a la condición del bucle, en el caso de un for, lo envía a la instrucción de actualización. Instrucción for (II) Consideraciones de uso de for int vc ; for ( vc = 1; vc <= 10 ; vc++) { System.out.println("2 por " + vc + "es " + (2 * vc)); } for ( int vc = 1; vc <= 10 ; vc++) { System.out.println("2 por " + vc + "es " + (2 * vc)); } Este es el único caso confuso al tratar la visibilidad de una variable. Aunque parezca lo contrario, la variables declaradas dentro de los paréntesis del for pertenecen realmente al interior del bloque, como si se hubieran declarado dentro de las llaves (aunque no se haya hecho)
  • 15.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 15 ๏El cambio de valor en la actualización de la variable de control puede ser cualquiera, tanto en for como en while, no necesariamente incrementando de 1 en 1. ๏ En el ejemplo siguiente, el bucle va cambiando la variable de 2 en 2, y decreciendo, desde 20 hasta 0. Atención al cambio que se ha de hacer en la condición : ๏ Y este bucle cambia de 5 en 5 desde 0 hasta 100 : Instrucción for (III) Incremento variable Incremento variable for (int vc=0 ; vc <=100 ; vc=vc+5) { System.out.println( vc ); } for (int vc=20 ; vc >=0 ; vc = vc - 2 ) { System.out.println( vc ); } • No son obligatorios ninguno de los elementos de la cabecera de un for. Por ejemplo: for ( ; ; ) es una instrucción totalmente valida, crea además un bucle infinito salvo que usemos una salida forzada dentro del bucle. • Opcionalmente, usando una coma como separador, se pueden añadir más de una instrucción en la inicialización y la actualización de una instrucción for: for ( a=1, b=12 ; a<12 ; a++, b - - , c=a+b , System.out.println(“valor de c”+c ){ . . . . . } Parámetros de un forTemas avanzados
  • 16.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 16 ๏Se puede incluir un bucle dentro de otro bucle. El bucle interno se repite por lo tanto tantas veces como indique el bucle externo. Esto es especialmente útil en el tratamiento de matrices (ver más adelante) ๏ Ver este código y la ejecución que resulta: ‣ Resultado de la ejecución: Comienza la vuelta 1 del bucle externo --Vuelta 1 del bucle interno donde el externo esta la vuelta 1 --Vuelta 2 del bucle interno donde el externo esta la vuelta 1 --Vuelta 3 del bucle interno donde el externo esta la vuelta 1 Comienza la vuelta 2 del bucle externo --Vuelta 1 del bucle interno donde el externo esta la vuelta 2 --Vuelta 2 del bucle interno donde el externo esta la vuelta 2 --Vuelta 3 del bucle interno donde el externo esta la vuelta 2 Comienza la vuelta 3 del bucle externo --Vuelta 1 del bucle interno donde el externo esta la vuelta 3 --Vuelta 2 del bucle interno donde el externo esta la vuelta 3 --Vuelta 3 del bucle interno donde el externo esta la vuelta 3 Bucles anidados Bucles anidados for ( int a=1; a <=3 ; a++) { System.out.println("Comienza la vuelta "+a+ " del bucle externo" ); for ( int b=1; b <=3 ; b++) { System.out.println("--Vuelta "+b+ " del bucle interno donde el externo esta la vuelta"+a ); } }
  • 17.
    TemariodecursoJavaSE©IñakiMartín 3.- Bucles © Iñaki Martín 17Ejerciciosprácticos int[] lista = new int[4]; for (int i = 0; i <lista.length ; i++) { lista[i]= (int) (Math.random()*20); System.out.println("el elemento añadido es "+lista[i]); } int suma = 0; for (int i = 0; i <lista.length ; i++) { suma = suma + lista[i]; } System.out.println("La suma es "+suma); ๏Ejercicio: Crear un array con números al azar y sumar todos sus elementos posteriormente Ejercicios prácticos int[] lista = new int[4]; int[] listaCopia = new int[4]; for (int i = 0; i < lista.length; i++) { lista[i] = (int) (Math.random() * 20); } System.out.println("Elementos de lista;"); for (int i = 0; i < lista.length; i++) { System.out.println(lista[i]); } for (int i = 0; i < lista.length; i++) { listaCopia[i] = lista[i]; } System.out.println("Elementos de listaCopia;"); for (int i = 0; i < lista.length; i++) { System.out.println(listaCopia[i]); } ๏Ejercicio: Crear un array con números al azar, crear otro array y copiar los elementos del primero en el segundo