Formación informática

Java | Joomla | MySQL

Curso de Java – Tema 25.3: Estructuras de control: condicionales y bucles

¿Qué eliges para hacer tus comidas de esta foto?

Son parte fundamental de cualquier lenguaje. Sin ellas, las instrucciones de un programa sólo podrían ejecutarse en el orden en que están escritas (orden secuencial). Las estructuras de control permiten modificar este orden. Hay dos categorías de estructuras de control:

  • Los condicionales o bifurcaciones permiten que se ejecuten conjuntos distintos de instrucciones, en función de que se verifique o no determinada condición. Pueden anidarse unos dentro de otros.
  • Los bucles o repeticiones permiten que se ejecute repetidamente un conjunto de instrucciones, bien un número pre-determinado de veces, o bien hasta que se verifique una determinada condición. Pueden anidarse.

En términos de un lenguaje de programación que se verifique o no una condición se traduce en que una expresión lógica tome el valor verdadero (true) o tome el valor falso (false). Es lo que se conoce como expresión booleana.

En los casos más sencillos y habituales la condición suele ser una comparación entre dos datos almacenados en variables, como por ejemplo si a es mayor que b hacer una cosa y en caso contrario hacer otra distinta.

En el caso concreto de realizar aplicaciones con Java, las comparaciones pueden realizarse entre variables que almacenan datos, objetos creados con los métodos constructores e incluso con métodos aplicados a los objetos mediante los cuales se obtiene cómo resultado bien un valor numérico, una expresión booleana… usando el tipo de expresión adecuada para obtener el resultado que necesitamos.

Veamos las diferentes estructuras existentes con el código correspondiente a cómo se escribirían en Java.

Estructura condicional simple: IF

Estructura condicional simple if en JavaEste es el tipo más sencillo de estructura condicional. Sirve para implementar acciones condicionales del tipo siguiente:

  • Si se verifica una determinada condición, ejecutar una serie de instrucciones y luego seguir adelante.
  • Si la condición NO se cumple, NO se ejecutan dichas instrucciones pero se sigue adelante.

La sintaxis genérica en Java es:

 
  if (condición/es) 
  	{ instrucciones } 

Obsérvese que, en ambos casos (que se verifique o no la condición), los caminos bifurcados se unen posteriormente en un punto de conexión, es decir, el flujo del programa recupera su carácter secuencial, y se continúa ejecutando por la instrucción siguiente a la estructura IF.

Un ejemplo de aplicación que usa esta estructura sería el siguiente código mediante el cual conseguimos mostrar por línea de comandos un mensaje que nos dice si los dos números introducidos son iguales y nada más:

 
  package principal; 
  
  import java.util.Scanner; 
  
  public class Main { 
  	static Scanner teclado = new Scanner(System.in); 
  	
  	public static void main(String[] args) { 
  		
  		System.out.println("Introduzca el primer número"); 
  		int n1 = teclado.nextInt(); 
  		System.out.println("Introduzca el segundo número"); 
  		int n2 = teclado.nextInt(); 
  		
  		if (n1 == n2) { 
  		System.out.println("Los números son iguales"); 
  		} 
  	} 
  } 

Estructura condicional doble: IF - ELSE

Estructura condicional doble: if-elseEste tipo de estructura permite implementar condicionales en los que hay dos acciones alternativas:

  • Si se verifica una determinada condición, se ejecutan una serie de instrucciones, las del bloque 1. Se ejecutan las instrucciones del bloque IF.
  • Si la condición NO se verifica, ejecutar otra serie de instrucciones, las del bloque 2. Se ejecutan las instrucciones del bloque ELSE.

En otras palabras, en este tipo de estructuras hay una alternativa: se hace una cosa o se hace la otra. En ambos casos, se sigue por la instrucción siguiente a la estructura IF - ELSE.

La sintaxis genérica en Java es:

 
  if (condición/es)
     { bloque-1 } 
  else 
     { bloque-2 } 

Un ejemplo de aplicación en Java sería el siguiente código mediante el cual se consigue mostrar un mensaje por línea de comandos que nos dice si dos números introducidos son iguales o distintos:

 
  package principal; 
  
  import java.util.Scanner; 
  
  public class Main	{
  	static Scanner teclado = new Scanner(System.in); 
  
  	public static void main(String[] args) { 
  	
  	System.out.println("Introduzca el primer número"); 
  	int n1 = teclado.nextInt(); 
  	System.out.println("Introduzca el segundo número"); 
  	int n2 = teclado.nextInt(); 
  
  	if (n1 == n2) { 
  		System.out.println("Los números son iguales"); 
  	} else { 
  		System.out.println("Los número son distintos"); 
  	} 
  } 
} 

Estructura condicional múltiple: IF - ELSEIF - ELSE

Estructura condicional múltiple o cascada if-elseTambién se conocen cómo escalas o cascadas IF-Else. En su forma más general, la estructura IF - ELSEIF - ELSE permite implementar condicionales más complicados, en los que se encadenan condiciones en la forma siguiente:

  • Si se verifica la condición 1, se ejecutan las instrucciones del bloque 1.
  • Si no se verifica la condición 1, pero sí se verifica la condición 2, se ejecutan las instrucciones del bloque 2.
  • Si no se ha verificado ninguna de las condiciones anteriores, entonces se ejecutan las instrucciones del bloque 3.

En cualquiera de los casos, el flujo del programa continúa por la instrucción siguiente a la estructura IF - ELSEIF - ELSE.

La sintaxis genérica en Java es:

 
  if (condición_1){
  	 bloque-1 
  	} else if (condición-2){
  	 bloque-2 
  	} else{ 
  	bloque-3} 

En este tipo de estructura condicional, la cláusula ELSE junto con su bloque de instrucciones puede no estar presente. Las distintas estructuras condicionales descritas pueden ser anidadas, es decir, puede incluirse una estructura IF (de cualquier tipo), como parte de las instrucciones que forman el bloque de uno de los casos de otro IF. Como es lógico, no puede haber solapamiento.

El siguiente código permite determinar cuál de los números introducidos es el mayor, el menor o si son iguales:

 
  package principal; 
  import java.util.Scanner; 
  
  class Main { 
  
  static Scanner teclado = new Scanner(System.in); 
  
  	public static void main(String[] args) { 
  		//Pedimos la introducció
  		n de los números System.out.println("Introduce el primero:"); 
  		int n1 = teclado.nextInt(); 
  		System.out.println("Introduce el segundo"); 
  		int n2 = teclado.nextInt(); 
  
  		// Condicional anidado para determinar los casos 
  		if (n1 > n2) { 
  			System.out.println("El mayor es: " + n1); 
  		} else if (n2 > n1) { 
  		System.out.println("El mayor es: " + n2); 
  		} else { 
  		System.out.println("Son iguales. ¡No es tan sencillo engañarme!"); 
  		} 
  	} 
  } 

Estructura de repetición indexada o bucle FOR

Es una estructura básica y fundamental en cualquier lenguaje de programación que permite implementar la repetición de un cierto conjunto de instrucciones un número de veces determinado o indeterminado pero con una finalización a través de una condición. Por ejemplo, puede que quieras gestionar los elementos de un grupo de datos trabajando con cada uno de ellos en serie.

Para ello se utiliza una variable de control del bucle, llamada índice, que va recorriendo un conjunto prefijado de valores en un orden determinado. Para cada valor del índice en dicho conjunto, se ejecuta una vez el mismo conjunto de instrucciones incluidas en el bloque. Así el índice va tomando sucesivamente el valor de cada componente del vector V, de longitud N.

Cada vez que se pasa por el bucle, el índice tendrá un valor diferente, pudiéndose usar para hacer referencia a cada elemento del conjunto de datos. Esto se usa para recorrer los diferentes objetos de tipo colección que existen en Java para realizar operaciones con los valores almacenados en ellos.

Otros uso muy común es un contador de eventos. Usando los operadores de asignación autoincremento (++) o autodecremento (--), podemos conseguir aumentar o disminuir el valor del índice.

Estructura repetitiva forEn Java se la sintaxis genérica es:

 
for (expresión_de_inicialización; 
  	expresión_de_finalización, 
  	expresión de iteración) {
  instrucciones
  } 

La expresión de inicialización puede tomar cualquier valor e incluso tomar el valor de variables calculadas durante el programa o expresiones más o menos complejas. Lo más habitual es que tome el valor 0 en una variable local de tipo entero que llamamos contador, de esta forma controlamos el número de veces que se pasa por el bucle puesto que sabemos cuánto vale desde el inicio.

En la expresión de finalización se usan operadores de comparación para declarar expresiones que terminen el bucle, forzando la salida de él. Estas expresiones pueden:

  • Incluir una declaración explícita del número de veces que se ejecutan. Se usa cuando sabemos cuántas veces se va a ejecutar el bucle. Por ejemplo si tenemos que imprimir números desde el 10 hasta el cero.
  • Puede usarse una variable porque estamos tomando el valor de ella para realizar la comparación. Por ejemplo, si queremos mostrar los números que hay entre otros dos que se calculan aleatoriamente.
  • Pueden usarse métodos de las clases cuando usamos objetos de Java. El uso más habitual es para recorrer todos los valores almacenados en un array mediante el método length().

Algunos ejemplos de uso en forma genérica son:

 contador valor_finalizar_bucle contador variable contador clase.método 

La expresión de iteración se refiere a cuánto varía el valor del índice en cada paso del bucle. Lo más habitual es usar los operadores unarios de autoincremento para realizar un cambio secuencial del índice controlado por nosotros. De esta forma, sabemos que cada vez aumenta un número determinado de veces. Si usamos los operadores unarios la variable aumenta de uno en uno pero puede determinarse cualquier otro incremento.

El valor de la variable de control índice puede ser utilizado o no dentro del conjunto de instrucciones qué forman parte del cuerpo del FOR, pero no puede ser modificado.

Mediante el siguiente código conseguimos incrementar de uno en uno desde cero hasta diez la variable contador:

 
  for (int contador = 0; contador 10; contador++} 

El conjunto de valores que debe recorrer el índice puede ser vacío (N=0). En ese caso, el bloque de instrucciones no se ejecuta ninguna vez.

Las estructuras FOR e IF se pueden anidar, es decir, incluir una dentro de la otra, con la restricción (de sentido común) de que la interior tiene que estar completamente contenida en uno de los bloques de instrucciones de la otra. Esto se usa mucho para realizar operaciones con valores almacenados en arrays y otras colecciones de objetos. La sintaxis genérica para este caso es:

 
  for (expresión_inicialización; expresión_finalización, expresión de iteración) {
  	if (condicion){ 
  		instrucciones 
  	} 
  } 

Un ejemplo de aplicación en Java sería el siguiente código mediante el cual se logra comprender cómo funcionan los operadores unarios:

 
  package principal; 
  
  // Declaración de la clase principal que inicializa el programa. 
  public class Main { 
  //Aquí se escriben las variables de clase, comunes a todos los métodos 
  
  	// Declaración del método principal que inicia el resto de métodos 
  	public static void main(String[] args) { 
  		
  		// Aquí se escirbe el código del método principal 
  		int i, j; // Variables enteras. Podrian ser reales o char 
  		i = 13; 
  		System.out.println("El valor almacenado inicialmente en i es: " + i + "."); 
  		j = i++; 
  		System.out.println("Hemos aplicado el autoincremento sufijo de tal forma que j = i++.");
  		System.out.println("En este momento i vale " + i + " y j vale " + j + ".");
  		System.out.println("Introducimos en la variable el valor 13."); 
  		i = 13; System.out.println("En este momento el valor de i es: " + i +"."); 
  		System.out.println("Aplicamos el autoincremento prefijo de tal forma que j = ++i.");
   		j = ++i; 
  		System.out.println("En este momento i vale " + i + " y j vale " + j + "."); 
  		System.out.println("Volvemos a asignar a la variable i el 13."); 
  		i = 13; 
  		System.out.println("En este momento i vale: " + i + "."); 
  		System.out.println("Aplicamos el autodecremento sufijo de tal forma que j = i--."); 
  		j = i--; 
  		System.out.println("En este momento i vale: " + i + " y j vale " + j + "."); 
  		System.out.println("Volvemos a asignar a la variable i el 13."); i = 13; 
  		System.out.println("En este momento i vale: " + i); 
  		System.out.println("Ahora aplicamos el autodecremento prefijo de tal forma que j = --i."); 
  		j = --i; 
  		System.out.println("En este momento i vale " + i + " y j vale " + j +"."); 
  	} //Cierre del método main 
  } // Cierre de la clase Main 

Estructura de repetición indexada extendida o bucle: for each

En la versión 5 de Java se introdujo una nueva forma de uso del for, a la que se denomina “for extendido” o “for each”. Esta forma de uso del for, que ya existía en otros lenguajes, facilita el recorrido de objetos existentes en una colección sin necesidad de definir el número de elementos a recorrer. La sintaxis genérica es:

 
  for ( TipoARecorrer nombreVariableTemporal : nombreDeLaColección ) { 
  	Instrucciones 
  	} 

La interpretación que podemos hacer de la sintaxis del for extendido es que para cada elemento del tipo TipoARecorrer que se encuentre dentro de la colección nombreDeLaColección ejecuta las instrucciones que se indican. La variable temporal del ciclo almacena en cada paso el objeto que se visita y sólo existe durante la ejecución del ciclo y desaparece después y tiene que ser del mismo tipo que los elementos a recorrer. Un buen consejo para este tipo de ciclos es darle un nombre lo más descriptivo a la variable temporal.

En ningún momento se usa la palabra clave each que se usa en otros lenguajes. ¿Cómo los distinguimos? Para saber si un for es un for extendido o un for normal hemos de fijarnos en la sintaxis que se emplea.

El ciclo for-each es una herramienta muy útil cuando tenemos que realizar recorridos completos de colecciones, por lo que lo usaremos en numerosas ocasiones en sustitución de los ciclos for o del uso while que nos obligan a estar pendientes de más cuestiones: de llevar un contador, llamar en cada iteración a un método, etc.

Un for extendido en principio recorre todos y cada uno de los elementos de una colección. Sin embargo, podemos introducir un condicional asociado a una sentencia break; que aborte el recorrido una vez se cumpla una determinada condición. Por ejemplo para realizar cálculos con objetos que cumplan una sola condición.

Un ejemplo sería el siguiente código mediante el cual se recorre una lista de nombres usando como variable un String para mostrar los valores que contiene:

 
  public void listarTodosLosNombres () { 
  	for (String i: listaDeNombres) { 
  		System.out.println (i); 
  		//Muestra cada uno de los nombres dentro de listaDeNombres 
  		} 
  } 

Estructura repetitiva condicional: WHILE

Estructura repetitiva condicional whilePermite implementar la repetición de un mismo conjunto de instrucciones mientras que se verifique una determinada condición al comienzo de cada ciclo. Esto implica que el número de veces que se repetirá el ciclo no está definido a priori, ejecutándose las instrucciones hasta que se cumpla la condición establecida. Este comportamiento hay que tenerlo en cuenta para saber cuál es la condición para finalizar el bucle: en pocas palabras, nos obliga a declarar la contraria.

Su funcionamiento a la vista del diagrama es:

  1. Al comienzo de cada iteración se evalúa la expresión lógica:
    1. Si el resultado es VERDADERO, se ejecuta el conjunto de instrucciones y se vuelve a iterar, es decir, se repite el paso 1. Así hasta que no se cumpla la condición.
    2. Si el resultado es FALSO, se detiene la ejecución del ciclo WHILE y el programa se sigue ejecutando por la instrucción siguiente al END.

Es decir, si la condición planteada inicialmente no se cumple, las instrucciones que contiene el while no se ejecutan y pasa a ejecutarse el siguiente grupo de instrucciones. Por lo tanto, puede llegar a no ejecutarse el bloque de instrucciones. Así que hay que tener cuidado al usarlo.

En Java la sintaxis genérica es:

 
  while (condicion){ 
  instrucciones 
  } 

Un ejemplo claro de un bucle que no sabemos cuántas veces se va a ejecutar es cuando le pedimos al usuario que introduzca algo por teclado, porque se puede equivocar o introducirlo mal porque le apetezca:

 
  public int leerNumero() { 7
  	Scanner sc = new Scanner(System.in); 
  	int numero = -1; 
  
  	while (numero = 0) { 
  		System.out.println("Introduce un numero positivo: "); 
  		numero = sc.nextInt(); 
  	} 
  	sc.close(); 
  	return numero; 
  } 

Estructura repetitiva condicional: DO…WHILE

Estructura repetitiva condicional: DO…WHILEPermite implementar la repetición de un mismo conjunto de instrucciones mientras que se verifique una determinada condición después de realizarse el ciclo. Esto implica que el número de veces que se repetirá el ciclo no está definido a priori. Aquí se entra al menos una vez a las instrucciones antes de comprobar la condición que fuerza la salida. Este comportamiento hay que tenerlo en cuenta para saber cuál es la condición para finalizar el bucle y nos obliga a declarar la contraria.

Su funcionamiento a la vista del diagrama es:

  1. Se ejecutan las instrucciones.
  2. Al final de cada iteración se evalúa la expresión lógica:
    1. Si el resultado es VERDADERO, se ejecuta el conjunto de instrucciones y se vuelve a iterar, es decir, se repite el paso 1.
    2. Si el resultado es FALSO, se detiene la ejecución del ciclo WHILE y el programa se sigue ejecutando por la instrucción siguiente al END.

Es decir, primero se ejecutan las instrucciones y después de realiza la comprobación de la condición. Dicho de otro modo, se pasa al menos una vez por las instrucciones que contiene antes de salir del bucle.

En Java la sintaxis genérica es:

 
  do{ 
  instrucciones 
  } while (condicion) 
  

Un ejemplo claro de bucle do while puede ser el siguiente, en el que necesitamos obtener un número par aleatorio menor que el que nosotros le digamos:

 
  public void numeroPar(int numero) { 
  System.out.println("Numero par menor que: " + numero); 
  int n; 
  
  do { 
  	n = (int) (Math.random() * numero); 
  System.out.println(n); 
  } while (n % 2 != 0); 
  
  System.out.println("Y el numero par elegido es: " + n); } 

Otro uso común durante los cursos de aprendizaje de java es para crear aplicaciones interactivas a través de la línea de comandos mediante la creación de menús. Para ello tenemos que hacer uso de esta estructura junto con un switch que veremos a continuación. Ya veremos más adelante el código completo para obtener esto.

Curso de Java – Tema 25.2. Estructura secuencial | Curso de Java – Tema 25.4: estructura de elección entre varios casos: SWITCH
Curso de Java - Índice Ejercicios Nivel Medio

Escribir un comentario

Aunque los comentarios no expresan la opinión del administrador del sitio web, éste si que tiene una responsabilidad legal sobre lo que aparece. Por lo tanto, habrá una labor de moderación de los mensajes. No se permitirán mensajes ofensivos ni publicidad


Código de seguridad
Refescar

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-Ley 13/2012, de 30 de marzo. Si continúa navegando consideramos que acepta el uso de cookies. . Más información