Estructuras de control en Java

Las estructuras de control determinan el orden en el que se ejecutan las instrucciones de un programa. Mediante las estructuras de control podemos dirigir el flujo de ejecución de un programa hacia unas sentencias u otras según determinadas condiciones o repeticiones. En este tema explicaremos en qué consisten las estructuras de control y en concreto estudiaremos a fondo cuáles son las estructuras de control en Java.

Los programas contienen instrucciones que se ejecutan generalmente una a continuación de la otra según la secuencia en la que el programador ha escrito el código. Sin embargo, hay ocasiones en las que es necesario romper esta secuencia de ejecución.

Las estructuras de control permiten modificar el orden natural de ejecución de un programa. Mediante ellas podemos conseguir que el flujo de ejecución de las instrucciones sea el natural o varíe según se cumpla o no una condición o que un bloque de instrucciones se repitan dependiendo de que una condición se cumpla o no.

Las estructuras de control utilizadas en la programación estructurada presentan una serie de características que permiten organizar el código de forma clara y facilitar su comprensión, mantenimiento y verificación.

  • Tienen un único punto de entrada y un único punto de salida. En la programación estructurada, las estructuras de control se diseñan para que el flujo de ejecución de las instrucciones se inicie por un punto determinado y finalice por otro. Esto facilita el seguimiento de la ejecución del programa y ayuda a evitar saltos arbitrarios que dificulten su comprensión. Una excepción a esta norma son instrucciones como break; que pueden añadir varios puntos de salida en una estructura de control.
  • Están compuestas por instrucciones simples o por otras estructuras de control. Una estructura de control puede contener instrucciones sencillas o incluir otras estructuras de control (estructuras de control anidadas). El anidamiento de estructuras de control permite construir algoritmos complejos a partir de elementos más simples.
  • Controlan del flujo de ejecución del programa. Es la función principal de las estructuras de control. Mediante las estructuras de control se determina el orden en que se ejecutan las instrucciones del programa: en secuencia, seleccionar un bloque de instrucciones entre diferentes alternativas o repetir un bloque de instrucciones un número determinado de veces.

Tipos de estructuras de control en Java

Las estructuras de control en Java son las siguientes:

Estructuras de control en Java

Las estructuras de control en Java se dividen en tres grupos:

Las instrucciones break y continue no son estructuras de control sino que son instrucciones que sirven para alterar el flujo de ejecución dentro de una estructura de control.

Para no hacer esta entrada demasiado larga, en este tema veremos una introducción a las estructuras de control que existen en Java, explicando de forma general en qué consisten y ejemplos básicos de cada una de ellas. En temas separados se explica cada una de las estructuras de control con mayor profundidad, desarrollando en detalle las características de cada una de ellas, funcionamiento y ejemplos prácticos de uso.

1 – Estructura secuencial

Las instrucciones de un programa se ejecutan por defecto en orden secuencial. Esto significa que las instrucciones se ejecutan en secuencia, una después de otra, en el orden en que aparecen escritas dentro del programa sin que exista una decisión o que altere esta secuencia.

La estructura secuencial es el orden natural de ejecución. Las instrucciones que componen esta estructura de control se ejecutan en orden una a continuación de la otra.

Ejemplo de instrucciones con estructura secuencial:

double radio = 2;
double longitud = 2 * Math.PI * radio;
System.out.println("Longitud del radio: " + radio);
System.out.println("Longitud de la circunferencia: " + longitud);

Al ejecutar estas instrucciones se muestra por pantalla:

Longitud del radio: 2.0
Longitud de la circunferencia: 12.566370614359172

En el ejemplo las instrucciones se ejecutan en el orden indicado, de forma secuencial de arriba hacia abajo.

Otro ejemplo de instrucciones con estructura secuencial:

   int n = 1;
   int m = 0;
   m = n++ ;
   System.out.println(m);
   System.out.println(n);

Se muestra por pantalla:

1
2

Las estructuras secuenciales aparecen constantemente en Java, tanto de forma aislada como en estos ejemplos, como dentro de estructuras condicionales y repetitivas.

Para una explicación detallada consulta la entrada dedicada a la estructura de control secuencial en Java, donde se muestran ejemplos prácticos completos.

2 – Estructura condicional, alternativa o selectiva

Es una de las estructuras de control que permiten modificar el orden de ejecución de las instrucciones del programa.

La estructura condicional, también llamada estructura alternativa o selectiva, determina si se ejecutan unas instrucciones u otras según se cumpla o no una condición.

La condición que se comprueba para decidir qué instrucciones se ejecutan debe ser una expresión booleana es decir debe dar como resultado un valor booleano true ó false

En java la estructura de control condicional se implementa utilizando:

  • Estructuras if
  • Estructuras switch
  • El operador condicional ? :

A continuación se explica de forma resumida en qué consiste cada una de ellas. La explicación detallada se encuentra en la entrada estructura de control condicional en Java.

Estructura if

Java dispone de varias formas de estructuras if:

  • Estructura condicional simple if Una serie de instrucciones se ejecutan o no dependiendo de una condición.
  • Estructura condicional doble if .. else Se ejecutan unas instrucciones u otras dependiendo de una condición.
  • Estructura condicional múltiple if .. else if .. En esta estructura se encadenan secuencias de instrucciones if .. else pudiendo de esta forma escribir condiciones más complejas.

Ejemplo de estructura condicional simple if

int edad = 20;
if (edad >= 18) {
    System.out.println("Edad: " + edad);
    System.out.println("Eres mayor de edad");
}
System.out.println("Fin programa");

Se muestra por pantalla:

Edad: 20
Eres mayor de edad
Fin programa

En este ejemplo el valor de la variable edad es 20. La condición edad >= 18 se cumple y se ejecutan las instrucciónes dentro del if. Después la ejecución del programa continúa después de la instrucción if mostrando el mensaje Fin programa

Si el valor de la variable edad fuese por ejemplo 16. La condición edad >= 18 no se cumple y por lo tanto NO se ejecutan las instrucciones dentro del if. La ejecución del programa para a la instrucción a continuación del if. En este caso el programa solamente mostraría por pantalla el mensaje:

Fin programa

Ejemplo de estructura condicional doble if .. else

Si la condición es verdadera, se ejecuta el primer bloque de instrucciones que aparece a continuación de la condición. Si la condición es falsa, se ejecuta el bloque asociado al else.

int edad = 16;
if (edad >= 18) {
    System.out.println("Mayor de edad");
} else {
   System.out.println("Menor de edad");
   System.out.println("Te faltan " + (18 - edad) + " años para ser mayor de edad" );
}
System.out.println("Fin programa");

Se muestra por pantalla:

Menor de edad
Te faltan 2 años para ser mayor de edad
Fin programa

En el ejemplo el valor de la variable edad es 16. La condición edad >= 18 no se cumple por lo que se ejecutan las instrucciones que aparecen dentro del bloque else. La ejecución continúa a continuación de la instrucción if mostrando el mensaje Fin programa

Si el valor de edad fuese por ejemplo 25. La condición edad >= 18 ahora sí se cumple por lo que se ejecuta la instrucción System.out.println("Mayor de edad");

En este caso se muestra por pantalla:

Mayor de edad
Fin programa

Ejemplo de estructura condicional múltiple if .. else if ..

int n = 1;
if (n > 0) {
    System.out.println("Positivo");
} else if (n < 0) {
    System.out.println("Negativo");
} else {
    System.out.println("Cero");
}
System.out.println("Fin programa");

Se muestra por pantalla:

Positivo
Fin programa

El valor de la variable n es 1. La condición n > 0 se cumple por lo que se ejecuta la instrucción que aparece que aparece a continuación de esta condición System.out.println("Positivo"); No se ejecuta ninguna otra instrucción dentro de esta estructura de if encadenados. La ejecución continúa a continuación de la instrucción if mostrando el mensaje Fin programa

Si el valor de la variable n fuese por ejemplo -1

Se mostraría por pantalla:

Negativo
Fin programa

En este caso la primera condición n > 0 no se cumple. La ejecución pasa a la instrucción } else if (n < 0) {

La condición if (n < 0) se cumple por lo que se ejecuta la instrucción que aparece a continuación de esta condición System.out.println("Negativo"); y la ejecución continúa a continuación de la instrucción if mostrando el mensaje Fin programa

Si el valor de la variable n fuese por 0

Se mostraría por pantalla:

Cero
Fin programa

En este caso la primera condición n > 0 no se cumple. La ejecución pasa a la instrucción } else if (n < 0) {

La condición if (n < 0) tampoco cumple. La ejecución pasa a la instrucción else correspondiente a este if y se ejecuta la instrucción System.out.println("Cero"); La ejecución continúa a continuación de la instrucción if mostrando el mensaje Fin programa

Explicación detallada en la entrada estructura de control condicional en Java.

Estructura switch

La estructura de control switch en Java se utiliza para seleccionar una opción de entre múltiples opciones posibles.

Es una alternativa a los if .. else if .. anidados.

Se evalúa el valor de una variable o expresión y la ejecución pasa a la etiqueta case que coincida con ese valor.

Ejemplo:

int opción = 2;
switch (opción) {
     case 1: System.out.println("Nuevo artículo");
             break;
     case 2: System.out.println("Modificar artículo");
             break;
     case 3: System.out.println("Eliminar artículo");
             break;
     default: System.out.println("Opción no válida");
}
System.out.println("Fin programa");

Se muestra por pantalla:

Modificar artículo
Fin programa

En el ejemplo el valor de la variable opcion es 2. El switch funciona de la siguiente forma:

En switch (opcion) { se comprueba el valor de la variable opción y se obtiene que su valor es 2.

La ejecución del programa salta a la etiqueta case con el valor 2.

Se ejecuta la instrucción System.out.println("Modificar artículo"); y a continuación se ejecuta la instrucción break;

La instrucción break provoca el final de la instrucción switch y la ejecución del programa continúa por la siguiente instrucción a continuación del switch. En este caso es la instrucción System.out.println("Fin programa");

Si el valor de la variable no coincide con ninguna etiqueta case, se ejecutan las instrucciones contenidas en la etiqueta default.

El bloque default es opcional. Si el valor de la variable no coincide con ningún case y el switch no contiene la etiqueta no se hará nada y el programa continúa por la instrucción siguiente al switch.

En este ejemplo se muestra la forma tradicional de la instrucción switch en Java. A lo largo del tiempo Java ha incorporado versiones mejoradas de la estructura switch distinguiendo ahora dos tipos de switch en Java:

  • La instrucción switch. Es la tradicional de Java que sirve para ejecutar un bloque de instrucciones de entre varios bloques posibles. En la instrucción switch los break marcan el final de ejecución de las etiquetas case y la etiqueta default es opcional.
  • La expresión switch cuya principal diferencia con la instrucción switch es que las expresiones switch permiten devolver un valor. Además no hay que escribir la instrucción break; para finalizar un bloque case. En las expresiones switch en algunos casos si será obligatorio incluir la etiqueta default.

El ejemplo anterior escrito con una expresión switch sería así:

int opción = 2;
switch (opción) {
     case 1 -> System.out.println("Nuevo artículo");
     case 2 -> System.out.println("Modificar artículo");
     case 3 -> System.out.println("Eliminar artículo");
     default -> System.out.println("Opción no válida");
}
System.out.println("Fin programa");

La salida por pantalla sería la misma que con la instrucción switch original.

Lo que cambia en la expresión switch es la sintaxis. Después de las etiquetas case no se escribe el carácter : sino que se escriben los caracteres -> Estos caracteres indican que se trata de una expresión switch en lugar de la instrucción switch tradicional. Por eso ya no es necesario incluir el break después de cada case. De hecho si se incluye se provoca un error de compilación.

En las expresiones switch cuando se entra en una etiqueta case se ejecuta su contenido y el programa salta a la siguiente instrucción a continuación del switch sin necesidad de indicarlo con break.

Otra de las diferencias fundamentales de la expresión switch respecto al switch clásico es que las expresiones switch pueden devolver un valor.

Podemos modificar el ejemplo para que en lugar de mostrar un mensaje en cada case, el switch devuelva un String y después se muestra el mensaje por pantalla:

int opción = 2;
String mensaje = switch (opción) {
     case 1 -> "Nuevo artículo";
     case 2 -> "Modificar artículo";
     case 3 -> "Eliminar artículo";
     default -> "Opción no válida";
};
System.out.println(mensaje);
System.out.println("Fin programa");

En este caso en String mensaje = switch (opcion) { estamos indicando que al String mensaje le vamos a asignar el String que nos devuelva el switch.

Como el valor de la variable opcion es 2, el String devuelto por el switch es el que contiene el case 2 "Modificar artículo"

En definitiva, lo que se está realizando con esta expresión switch es la asignación String mensaje = "Modificar artículo";

A continuación del switch se muestra el mensaje por pantalla.

Salida por pantalla:

Modificar artículo
Fin programa

En la entrada estructura de control condicional en Java pueden encontrar una explicación detallada del funcionamiento de la estructura switch, tanto del switch tradicional como de las expresiones switch. En particular se explican los casos donde en una instrucción switch puede ser conveniente no incluir break así como ejemplos prácticos de uso de las expresiones switch.

El operador condicional ? :

El operador condicional, también llamado operador ternario, se puede utilizar en sustitución de la instrucción condicional if .. else.

Lo forman los caracteres ? y :

Sintaxis del operador condicional en Java:

condición ? expresión1 : expresión2

Si la condición es cierta entonces se evalúa expresión1 y éste será el valor que devuelve el operador.

Si la condición es falsa, se evalúa expresión2 y éste será el valor que devuelve el operador.

Ejemplo de uso:

int numero = 5;
System.out.println(numero % 2 == 0 ? "PAR" : "IMPAR");

Se muestra por pantalla:

IMPAR

En este ejemplo se comprueba la condición numero % 2 == 0

Si es cierta, el operador devolverá el String "PAR", si es falsa devolverá el String "IMPAR"

En este caso la condición no se cumple por lo que se devuelve el String «IMPAR». Este String devuelto lo recibe la instrucción System.out.println que será la encargada de mostrarlo por pantalla.

Puedes encontrar una explicación completa del operador condicional con ejemplos prácticos en la entrada Operador ternario en Java

3 – Estructura repetitiva o iterativa

Las estructuras repetitivas, también llamadas bucles o ciclos, permiten ejecutar varias veces un bloque de instrucciones.

Dentro del bucle, las instrucciones se repiten mientras se cumpla una condición.

Java dispone de tres estructuras repetitivas:

  • Estructura while
  • Estructura do .. while
  • Estructura for
Estructura while

En un bucle while las instrucciones se repiten mientras la condición sea cierta.

La condición se evalúa al principio del bucle por lo que es posible que las instrucciones no lleguen a ejecutarse si al llegar al bucle la condición es falsa.

Por este motivo los bucles while se pueden repetir 0 o más veces.

Ejemplo de bucle while

int n = 0;
while (n <= 5) {  // inicio del bucle while
          System.out.println(n);
          n++;
} //fin del bucle while
System.out.println("Fin programa");

Estas instrucciones muestran por pantalla los números del 0 al 5:

0
1
2
3
4
5
Fin programa

Se crea una variable n de tipo int y se le asigna el valor 0. A continuación se llega al inicio del bucle while donde se comprueba la condición n <= 5.

Como la condición es cierta se ejecutan las instrucciones que se encuentran dentro del bucle:

     System.out.println(n);
     n++;

La ejecución del programa vuelve al inicio del bucle y se comprueba de nuevo la condición. Mientras la condición se cumpla se repite la ejecución de las instrucciones que contiene.

Cuando el valor de n llegue a 6 la condición dejará de cumplirse y el bucle finaliza, continuando la ejecución del programa por la siguiente instrucción a continuación del while.

Estructura do .. while

En un bucle do .. while las instrucciones se repiten mientras la condición sea cierta.

La diferencia con el while es que la condición se comprueba al final del bucle por lo que los bucles do .. while se ejecutan al menos 1 vez.

Ejemplo de bucle do .. while

int n = 0;
do{ // inicio del bucle do .. while
     System.out.println(n);
     n++;
} while (n <= 5); // fin del bucle do .. while
System.out.println("Fin programa");

También muestra por pantalla los números del 0 al 5 pero esta vez utilizando una estructura do .. while

Muestra por pantalla:

0
1
2
3
4
5
Fin programa
Estructura for

En un bucle for las instrucciones se repiten un número determinado de veces mientras se cumpla la condición.

El bucle for es el más indicado cuando se conoce el número exacto de veces que se van a repetir las instrucciones.

Ejemplo de bucle for

for (int n = 0; n <= 5; n++) { // inicio del bucle for
      System.out.println(n);
} // fin del bucle for
System.out.println("Fin programa");

Muestra por pantalla los números del 0 al 5 pero esta vez utilizando un bucle for:

La elección entre while, do-while y for depende del problema que se quiera resolver y de cómo se controle la repetición.

0
1
2
3
4
5
Fin programa

En un bucle for la inicialización, la condición y la actualización de la variable se escriben en la cabecera del bucle..


Como ya se ha indicado, en esta entrada se trata de presentar las estructuras de control en java sin profundizar en ellas.

Para estudiarlas en detalle dispones de las siguientes entradas donde se explica la sintaxis de cada una de ellas, la lógica de ejecución, ejemplos de uso, etc.:

Enlace a la documentación oficial de Oracle sobre las estructuras de control en Java.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio