Skip to content

1 Condicionales

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 flujo de ejecución para tomar decisiones o repetir sentencias.

La programación estructurada es un paradigma de programación orientado a mejorar la claridad, calidad y tiempo de desarrollo de un programa de computadora recurriendo únicamente a subrutinas y tres estructuras básicas: secuencia, sentencias condicionales y bucles.

Una subrutina o subprograma, como idea general, se presenta como un subalgoritmo que forma parte del algoritmo principal, el cual permite resolver una tarea específica. Por ejemplo, los métodos en Java.

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.

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 (&&,||, !).

Condicional simple

Se ejecutan una serie de instrucciones en el caso de que la expresión lógica sea verdadera:

if(expresiónLógica){
    // instrucciones
}
import java.util.Scanner;

public class If {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int age;
        String name;

        System.out.print("Introduce tu nombre: ");
        name = keyboard.nextLine();

        System.out.print("Introduce tu edad: ");
        age = keyboard.nextInt();

        if(age >= 18){
            System.out.printf("Bienvenido/a %s\n", name);
            System.out.println("Eres mayor de edad");
        }
    }
}
Ejercicio 1

Dada una cantidad, si es mayor que 1000, que muestre el 15% de dicha cantidad. Si no, que no haga nada.

Condicional doble

Es igual que la anterior, sólo que se añade un apartado else que contiene instrucciones que se ejecutarán si la expresión evaluada por el if es falsa.

if(expresiónLógica){
    // instrucciones si la expresión lógica es verdadera
} else {
    // expresiones si la expresión lógica es falsa
}
import java.util.Scanner;

public class IfElse {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int age;
        String name;

        System.out.print("Introduce tu nombre: ");
        name = keyboard.nextLine();

        System.out.print("Introduce tu edad: ");
        age = keyboard.nextInt();

        System.out.printf("Bienvenido/a %s\n", name);

        if(age >= 18){
            System.out.println("Eres mayor de edad");
        } else {
            System.out.println("Eres menor de edad");
        }
    }
}
Ejercicio 2

Dada una edad, que te muestre por pantalla si es mayor de edad o no.

Ejercicio 3

Dado un número, indicar si es par o impar.

Ejercicio 4

Pedir dos números por teclado e indicar si el primer número es múltiplo del segundo.

Condicional Múltiple

Anidación

Dentro de una sentencia if se puede colocar otra sentencia if. A esto se le llama anidación y permite crear programas donde se valoren expresiones complejas. La nueva sentencia puede ir tanto en la parte if como en la parte else.

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:

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:

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:

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.

import java.util.Scanner;

public class IfElseIf {
    public static void main(String[] args) {         
        Scanner keyboard = new Scanner(System.in);
        int age;

        System.out.print("Introduce tu edad: ");
        age = keyboard.nextInt();

        if (age >= 18) {
            System.out.println("Eres mayor de edad");
        } else if (age >= 16 && age < 18) {
            System.out.println("Eres menor de edad pero tienes ciertos privilegios");
        } else if (age >= 14 && age < 16) {
            System.out.println("Eres menor de edad y además no tienes privilegios");
        } else {
            System.out.println("Eres menor de edad");
        }     
    }
}
Ejercicio 5

Dada una nota, que te muestre lo siguiente:

  • 0, 1, 2: Muy deficiente
  • 3, 4: Insuficiente
  • 5: Suficiente
  • 6: Bien
  • 7, 8: Notable
  • 9, 10: Sobresaliente
Ejercicio 6

Hacer un programa que lea por teclado un número entero y nos diga si el número es positivo, negativo o cero.

Ejercicio 7

Realiza un programa que lea tres números positivos y compruebe si son iguales. Por ejemplo: Si la entrada fuese 5 5 5, la salida debería ser “hay tres números iguales a 5”. Si la entrada fuese 4 6 4, la salida debería ser “hay dos números iguales a 4”. Si la entrada fuese 0 1 2, la salida debería ser “no hay números iguales”.

Switch

El cuerpo de una sentencia switch se conoce como bloque switch.

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.

Fall through condition (condición de caída): esta condición se produce en la sentencia switch cuando no se utiliza break en un case y causa la ejecución de los siguientes case hasta que no se produce un break o se sale de 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.

switch(expresión) {
   case valor1 :
      instrucciones
      break; // opcional

   case valor2 :
      instrucciones
      break; // opcional
   //....
   //....
   default : // opcional
      instrucciones
      break; // opcional
}
import java.util.Scanner;

public class Switch1 {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int weekday;

        System.out.print("Introduce un número del 1 al 7 correspondiente al día de la semana: ");
        weekday = keyboard.nextInt();
        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;
        }
    }
}
import java.util.Scanner;

public class Switch2 {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int month, year, numDays = 0;

        System.out.print("Introduce un número del 1 al 12 correspondiente a un mes: ");
        month = keyboard.nextInt();

        System.out.print("Introduce un año: ");
        year = keyboard.nextInt();

        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);
        }
    }
}

La decisión de utilizar sentencias if-then-else o una sentencia switch se basa en la legibilidad y en la expresión que la sentencia está probando. Una sentencia if-then-else puede comprobar expresiones basadas en rangos de valores o condiciones, mientras que una sentencia switch comprueba expresiones basadas sólo en un único valor.

Ejercicio 8

Realiza el ejercicio 4, haciendo uso de la estructura Switch.

Nuevo Switch

Desde la versión de Java 14, hay una nueva estructura de la sentencia switch, que la hace más "elegante" pero sobretodo legible.

switch(expresión){
    case valor1 -> /* instrucción de una línea*/;
    case valor2 -> {
        // instrucciones de más de una línea
    }
    // ...
    default -> /* instrucción de una línea */;
}
import java.util.Scanner;

public class NewSwitch1 {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int weekday;

        System.out.print("Introduce un número del 1 al 7 correspondiente al día de la semana: ");
        weekday = keyboard.nextInt();
        switch (weekday) {
            case 1 -> System.out.println("Lunes");
            case 2 -> System.out.println("Martes");
            case 3 -> System.out.println("Miércoles");
            case 4 -> System.out.println("Jueves");
            case 5 -> System.out.println("Viernes");
            case 6 -> System.out.println("Sábado");
            case 7 -> System.out.println("Domingo");
            default -> System.out.println("Día incorrecto");
        }
    }
}
import java.util.Scanner;

public class NewSwitch2 {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int month, year, numDays = 0;

        System.out.print("Introduce un número del 1 al 12 correspondiente a un mes: ");
        month = keyboard.nextInt();

        System.out.print("Introduce un año: ");
        year = keyboard.nextInt();

        switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 -> numDays = 31;
            case 4, 6, 9, 11 -> numDays = 30;
            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;
                }
            }
            default -> System.out.println("Mes inválido");
        }
        if (month >= 1 && month <= 12) {
            System.out.printf("Número de días del mes %d del año %d: %d", month, year, numDays);
        }
    }
}
Ejercicio 9

Realiza el ejercicio 4, haciendo uso de la nueva estructura Switch

Ejercicios

Ejercicio 10

Realiza un programa que calcule el precio de un billete de ida y vuelta por avión, conociendo la distancia a recorrer, el número de días de estancia y sabiendo que si la distancia es superior a 1.000 Km y el número de días de estancia es superior a 7, la línea aérea le hace un descuento del 30 %. (Precio por kilómetro = 0,35 €).

Ejercicio 11

Los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el jornal diario de acuerdo con los siguientes tarifas: la tarifa de las horas diurnas es de 3 € por hora, mientras que el de las nocturnas es de 4,80 € po hora. Cuando se trata de un día festivo, la tarifa se incrementa en 1,20 € por hora en el turno diurno y 1,80 € por hora en el nocturno.

Ejercicio 12

Realiza un programa que dados tres números, los devuelva en orden ascendente.

Ejercicio 13

Dada una cadena solicitada al usuario, obtener y mostrar uno de sus caracteres elegidos aleatoriamente. Mostrar también en qué posición se encuentra dicho carácter.

Ejercicio 14

Realiza un programa que saque una carta aleatoria de una baraja con 4 palos y 13 cartas por cada palo. Los palos son Picas ♠, Corazones ♥, Diamantes ♦ y Tréboles ♣. Las 13 cartas por cada palo irán del as al diez y además tres figuras: jota, reina y rey. Mostrar la carta incluyendo el símbolo del palo(♠,♥,♦,♣).