Cursos gratuitos de programacion de ordenadores, en español

AnteriorPosterior

6. Bucles (partes del programa que se repiten)

  Curso: Introducción a Java

6. Partes del programa que se repiten

(Nota: al igual que ocurría con los dos apartados anteriores, los bucles en Java son muy parecidos a los de C y C++: quien conozca alguno de esos dos lenguajes, podrá avanzar rápido en este tema)

Con frecuencia tendremos que hacer que una parte de nuestro programa se repita (algo a lo que con frecuencia llamaremos "bucle"). Este trozo de programa se puede repetir mientras se cumpla una condición o bien un cierto número prefijado de veces.

6.1. while

Java incopora varias formas de conseguirlo. La primera que veremos es la orden "while", que hace que una parte del programa se repita mientras se cumpla una cierta condición. Su formato será:

 
while (condición)
    sentencia;

Es decir, la sintaxis es similar a la de "if", con la diferencia de que aquella orden realizaba la sentencia indicada una vez como máximo (si se cumplía la condición), pero "while" puede repetir la sentencia más de una vez (mientras la condición sea cierta). Al igual que ocurría con "if", podemos realizar varias sentencias seguidas (dar "más de un paso") si las encerramos entre llaves:

 
x = 20;
while ( x > 10) {
  System.out.println("Aun no se ha alcanzado el valor limite");
  x --;
} 

Ejercicio propuesto 6.1.1: Crea un programa que muestre los números del 1 al 10, usando "while"

Ejercicio propuesto 6.1.2: Crea un programa que muestre los números pares del 20 al 2, decreciendo, usando "while"

Ejercicio propuesto 6.1.3: Crea un programa que muestre la "tabla de multiplicar del 5", usando "while"

6.2. do-while

Existe una variante de este tipo de bucle. Es el conjunto do..while, cuyo formato es:

 
do {
    sentencia;
} while (condición)

En este caso, la condición se comprueba al final, lo que quiere decir que las "sentencias" intermedias se realizarán al menos una vez, cosa que no ocurría en la construcción anterior (un único "while" antes de las sentencias), porque con "while", si la condición era falsa desde un principio, los pasos que se indicaban a continuación de "while" no llegaban a darse ni una sola vez.

Un ejemplo típico de esta construcción "do..while" es cuando queremos que el usuario introduzca una contraseña que le permitirá acceder a una cierta información:

 
do {
    System.out.println("Introduzca su clave de acceso");
    claveIntentada = LeerDatosUsuario();
} while (claveIntentada != claveCorrecta) 

En este ejemplo hemos supuesto que existe algo llamado "LeerDatosUsuario", para que resulte legible. Pero realmente la situación no es tan sencilla: no existe ese "LeerDatosUsuario", ni sabemos todavía cómo leer información del teclado cuando trabajamos en modo texto (porque supondría hablar de excepciones y de otros conceptos que todavía son demasiado avanzados para nosotros), ni sabemos crear programas "de ventantas" en los que podamos utilizar una casilla de introducción de textos. Así que de momento nos creeremos que algo parecido a lo que hemos escrito podrá llegar a funcionar... aunque todavía no lo hace.

Ejercicio propuesto 6.2.1: Crea un programa que muestre los números del 1 al 10, usando "do-while"

Ejercicio propuesto 6.2.2: Crea un programa que muestre los números pares del 20 al 2, decreciendo, usando "do-while"

Ejercicio propuesto 6.2.3: Crea un programa que muestre la "tabla de multiplicar del 5", usando "do-while"

6.3. for

Una tercera forma de conseguir que parte de nuestro programa se repita es la orden "for". La emplearemos sobre todo para conseguir un número concreto de repeticiones. Su formato es

for ( valor_inicial ; condicion_continuacion ; incremento ) {
sentencias
}

Es decir, indicamos entre paréntesis, y separadas por puntos y coma, tres órdenes:

  • La primera orden dará el valor inicial a una variable que sirva de control.
  • La segunda órden será la condición que se debe cumplir mientras que se repitan las sentencias.
  • La tercera orden será la que se encargue de aumentar -o disminuir- el valor de la variable, para que cada vez quede un paso menos por dar.

Esto se se verá mejor con un ejemplo. Podríamos repetir 10 veces un bloque de órdenes haciendo:

for ( i=1 ; i<=10 ; i++ ) { 
  ... 
}

(inicialmente i vale 1, hay que repetir mientras sea menor o igual que 10, y en cada paso hay que aumentar su valor una unidad),

O bien podríamos contar descendiendo desde el 10 hasta el 2, con saltos de 2 unidades en 2 unidades, así:

for ( j = 10 ; j > 0 ; j -= 2 )
  System.out.println( j );

Nota: se puede observar una equivalencia casi inmediata entre la orden "for" y la orden "while". Así, el ejemplo anterior se podría reescribir empleando "while", de esta manera:

 
j = 20;
while ( j > 0) {
  System.out.println( j );
  j -= 2;
} 
 

Ejercicio propuesto 6.3.1: Crea un programa que muestre los números del 1 al 10, usando "for"

Ejercicio propuesto 6.3.2: Crea un programa que muestre los números pares del 20 al 2, decreciendo, usando "for"

Ejercicio propuesto 6.3.3: Crea un programa que muestre la "tabla de multiplicar del 5", usando "for"

Ejercicio propuesto 6.3.4: Crea un programa que muestre los números menores de 100 que son múltiplos de 3 (el resto al dividir por 3 es 0) y a la vez múltiplos de 7 (ídem).

Precaución con los bucles: Casi siempre, nos interesará que una parte de nuestro programa se repita varias veces (o muchas veces), pero no indefinidamente. Si planteamos mal la condición de salida, nuestro programa se puede quedar "colgado", repitiendo sin fin los mismos pasos.

6.4. break y continue

Se puede modificar un poco el comportamiento de estos bucles con las órdenes "break" y "continue".

La sentencia "break" hace que se salten las instrucciones del bucle que quedan por realizar, y se salga del bucle inmediatamente. Como ejemplo:

 
System.out.println( "Empezamos..." );
for ( i=1 ; i<=10 ; i++ ) {
     System.out.println( "Comenzada la vuelta" );
     System.out.println( i );
     if (i==8) 
         break;
     System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" ); 

En este caso, no se mostraría el texto "Terminada esta vuelta" para la pasada con i=8, ni se darían las pasadas de i=9 e i=10, porque ya se ha abandonado el bucle.

La sentencia "continue" hace que se salten las instrucciones del bucle que quedan por realizar, pero no se sale del bucle sino que se pasa a la siguiente iteración (la siguiente "vuelta" o "pasada"). Como ejemplo:

 
System.out.println( "Empezamos..." );
for ( i=1 ; i<=10 ; i++ ) {
     System.out.println( "Comenzada la vuelta" );
     System.out.println( i );
     if (i==8) 
         continue;
     System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" ); 

En este caso, no se mostraría el texto "Terminada esta vuelta" para la pasada con i=8, pero sí se darían la pasada de i=9 y la de i=10.

Ejercicio propuesto 6.4.1: Crea un programa que muestre los números del 1 al 20, excepto el 15, usando "for" y "continue"

Ejercicio propuesto 6.4.2: Crea un programa que muestre los números del 1 al 10, usando "for" que vaya del 1 al 20 y "break"

6.5. Etiquetas

También existe la posibilidad de usar una "etiqueta" para indicar dónde se quiere saltar con break o continue. Sólo se debería utilizar cuando tengamos un bucle que a su vez está dentro de otro bucle, y queramos salir de golpe de ambos. Es un caso poco frecuente, así que no profundizaremos más, pero sí veremos un ejemplo:

 
for ( i=1 ; i<=10 ; i++ ) {
  System.out.println( "Comenzada la vuelta" );
  System.out.println( i );
  if (i==8) break salida;
    System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" );  
salida:
  ...

En este caso, a mitad de la pasada 8 se saltaría hasta la posición que hemos etiquetado como "salida" (se define como se ve en el ejemplo, terminada con el símbolo de "dos puntos"), de modo que no se escribiría en pantalla el texto "Terminado" (lo hemos "saltado").

Ejercicio propuesto 6.5.1: Crea un programa que muestre los números del 1 al 10, usando "for" que vaya del 1 al 20 y un "break" con etiqueta.


Actualizado el: 04-07-2013 00:13

AnteriorPosterior