2.1 Programación Estructurada
2.1 Programación Estructurada
2.1 Programación
estructurada
1. Introducción
2. Secuencia
3. Sentencias condicionales
3.1 Condicional simple
3.2 Condicional doble
3.3 Condicional múltiple
3.3.1 Anidación
3.3.2 Switch
1. Introducción
Los programas se construyen para procesar datos, manipulándolos de formas
diferentes dependiendo de los valores que tengan. Los lenguajes de programación
deben proveer estructuras que les permitan a los programadores controlar el flujo de
ejecución de un programa dependiendo de los datos que procesan. Para ello, se
incluyen las sentencias de control de flujo, que alteran el fujo de ejecución para tomar
decisiones o repetir sentencias.
2. Secuencia
La ejecución secuencial es el más básico de los mecanismos de control de flujo y
consiste en la ejecución de instrucciones en el orden en que se encuentran en el código
fuente del programa.
Hasta ahora las instrucciones que hemos visto, son instrucciones que se ejecutan
secuencialmente; es decir, podemos saber lo que hace el programa leyendo las líneas
de izquierda a derecha y de arriba abajo.
3. Sentencias condicionales
La sentencia condicional consiste en ejecutar instrucciones diferentes dependiendo del
resultado de evaluar una expresión lógica. Una expresión lógica es cualquier tipo de
expresión que devuelva un resultado booleano (true o false). Las expresiones lógicas se
construyen por medio de variables booleanas o bien a través de los operadores
relacionales (==, >, <,...) y/o lógicos (&&,||, !).
java
if(expresiónLógica){
instrucción1
instrucción2
....
}
Ejemplo:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Scanner;
public class If {
@SuppressWarnings("resource")
public static void main(String[] args) {
java
if(expresiónLógica){
instrucciones //se ejecutan si la expresión lógica es verdadera
....
}
else{
instrucciones //se ejecutan si la expresión lógica es falsa
...
}
Ejemplo:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Scanner;
@SuppressWarnings("resource")
public static void main(String[] args) {
}
}
Las anidaciones se utilizan muchísimo al programar. Solo hay que tener en cuenta que
siempre se debe cerrar primero el último if que se abrió. Es muy importante también
tabular el código correctamente para que las anidaciones sean legibles.
Ejemplo:
java
if (x==1) {
instrucciones
...
}
else {
if(x==2) {
instrucciones
...
}
else {
if(x==3) {
instrucciones
...
}
}
}
Una forma más legible de escribir ese mismo código dando lugar a la llamada
estructura if-else-if sería:
java
if (x==1) {
instrucciones
...
}
else if (x==2) {
instrucciones
...
}
else if (x==3) {
instrucciones
...
}
Cuando se cumpla alguna de las condiciones, se ejecutan sus instrucciones
correspondientes y después ya se sale de la estructura if-else-if ya que las condiciones
son autoexcluyentes, es decir, solamente se va a cumplir una. Por eso, no estaría bien
hacer lo siguiente:
java
if (x==1){ //Forma incorrecta de programar
instrucciones
...
}
if (x==2){
instrucciones
...
}
if (x==3){
instrucciones
...
}
El motivo de que no sea adecuado es porque se pierde tiempo en comprobar todas las
condiciones. Por ejemplo, si x vale 1, se ejecutan sus instrucciones correspondientes y
luego se comprobaría si x vale 2, si x vale 3, etc. cuando no se va a cumplir ninguna más
ya que si x vale 1 no puede valer ni 2 ni 3.
Ejemplo:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Scanner;
@SuppressWarnings("resource")
public static void main(String[] args) {
3.3.2 Switch
java
switch(expresión) {
case valor1 :
instrucciones
break; // opcional
case valor2 :
instrucciones
break; // opcional
....
....
default : // opcional
instrucciones
break; // opcional
}
Esta sentencia evalúa una expresión y cada case contiene un posible valor del
resultado de dicha expresión; si efectivamente el resultado equivale a ese valor, se
ejecutan las instrucciones de ese case y de los siguientes.
La instrucción break se utiliza para salir del switch. De tal modo que si queremos que
para un determinado valor se ejecuten las instrucciones de un apartado case y solo las
de ese apartado, entonces habrá que finalizar ese case con un break. Cuando se
alcanza una sentencia break, el switch termina y el flujo de control salta a la siguiente
línea que sigue a la sentencia switch.
El bloque default sirve para ejecutar instrucciones para los casos en los que la
expresión no se ajuste a ningún case. Técnicamente, el break del default no es necesario
porque el flujo se sale de la sentencia switch, pero se recomienda utilizarlo para que la
modificación del código sea más fácil y menos propensa a errores.
Funciona con los tipos de datos primitivos, con los tipos enumerados, con las cadenas
(a partir de Java 7) y con los wrappers.
Ejemplo:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Scanner;
@SuppressWarnings("resource")
public static void main(String[] args) {
switch (weekday) {
case 1:
System.out.println("Lunes");
break;
case 2:
System.out.println("Martes");
break;
case 3:
System.out.println("Miércoles");
break;
case 4:
System.out.println("Jueves");
break;
case 5:
System.out.println("Viernes");
break;
case 6:
System.out.println("Sábado");
break;
case 7:
System.out.println("Domingo");
break;
default:
System.out.println("Día incorrecto");
break;
}
}
}
Ejemplo:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Scanner;
@SuppressWarnings("resource")
public static void main(String[] args) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2://Se calcula si es un año bisiesto
if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400
== 0)) {
numDays = 29;
} else {
numDays = 28;
}
break;
default:
System.out.println("Mes inválido");
break;
}
if (month >= 1 && month <= 12) {
System.out.printf("Número de días del mes %d del año %d:
%d", month, year, numDays);
}
java
package tema2_1_ProgramacionEstructurada;
import java.util.Random;
seasonCode = random.nextInt(4);
System.out.println(seasonCode);
/* Al ser el switch una expresión, se puede
* asignar el valor devuelto a una variable:
*/
seasonName = switch (seasonCode) {
case 0 -> "Spring";
case 1 -> "Summer";
case 2 -> "Fall";
case 3 -> "Winter";
default -> "???";
};
System.out.println(seasonName);
}
Se pueden proporcionar varias etiquetas para cada caso separadas por comas:
java
package tema2_1_ProgramacionEstructurada;
import java.util.Random;
seasonCode = random.nextInt(4);
seasonName = switch (seasonCode) {
case 0 -> "Spring";
case 1 -> "Summer";
case 2 -> "Fall";
case 3 -> "Winter";
default -> "???";
};
System.out.println(seasonName);
System.out.println(numLetters);
java
package tema2_1_ProgramacionEstructurada;
import java.util.Random;
seasonCode = random.nextInt(4);
seasonName = switch (seasonCode) {
/* El bloque debe salir a través de una
* sentencia yield que devuelva el valor
* del bloque:
*/
case 0 -> {
System.out.println("spring time!");
yield "Spring";
}
case 1 -> "Summer";
case 2 -> "Fall";
case 3 -> "Winter";
default -> "???";
};
System.out.println(seasonName);
El operador -> denota la ausencia de fall through. Por simetría, se proporciona una
versión de las expresiones switch con fall through usando : en lugar de -> :
java
package tema2_1_ProgramacionEstructurada;
import java.util.Random;
seasonCode = random.nextInt(4);
System.out.println(seasonCode);
seasonName = switch (seasonCode) {
case 0:
System.out.println("spring time!");
case 1:
yield "Summer";
case 2:
yield "Fall";
case 3:
yield "Winter";
default:
yield "???";
};
System.out.println(seasonName);
0
spring time!
Summer