Condiciones simples y compuestas: Java

Las condiciones son muy importantes en programación, puesto que permiten a un programa tomar decisiones en situaciones en las que tiene que elegir si ejecutar una instrucción u otra.

Puedes copiar este código y pegarlo en un archivo que se llame A1_CondicionesConIfElse.java dentro del paquete B_ControlDeFLujo para comprobar su funcionamiento.

/* Aprendiendo a programar en DAM con elProfesorEmilio */
package B_ControlDeFlujo;

/**
 * @author elProfesorEmilio
 * Las condiciones son esenciales cuando el programa tiene que tomar 
 * decisiones que implican elegir entre una cosa u otra: es par o impar,
 * puede hacerse o no, es mayor o no, hay memoria o no...
 * Las condiciones pueden ser más complejas al componerlas con los operadores
 * lógicos que hemos visto anterioremente && and, || or, ! not
 */
public class A1_CondicionesConIfElse {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        boolean perfil_publico = true;
        String post = "Hoy no me puedo levantar.";
        
        /*
            Si el perfil es publico
                mostrar post
            sino 
                ocultar post
        */
        
        /* 
        Dentro de los paréntesis del if debe ir una condición que a la fuerza
        responda si o no --> en este caso tenemos una pregunta redundante
        porque la propia variable por la que preguntamos es booleana y 
        ya responde sí o no
        */
        if (perfil_publico==true) {
            System.out.println(post);
        } else {
            System.out.println("");
        }
        // Lo siguiente no puede funcionar, porque no hay expresión que devuelva booleano
        // if ("amigo") {
        //    System.out.println("Es amigo");
        // }
        
        
        // Las variables booleanas simplifican la condición
        if (perfil_publico) {
            System.out.println(post);
        } else {
            System.out.println("");
        }

        // El siguiente código hace lo mismo pero invirtiendo la condición
        if (!perfil_publico) {
            System.out.println("");
        } else {
            System.out.println(post);
        }

        /*
            Si os fijado, el bloque if lleva { ... instrucciones ... }
            luego else { ... instrucciones ... }
            Pero --> si if no lleva llave sólo ejecuta una instrucción
                --> con else igual
        
            Bloque equivalente al anterior
            ------------------------------
            if (perfil_publico) 
                System.out.println(post);
            else 
                System.out.println("");

        */
        
            // OJO --> Lo siguiente estaría mal, descomenta y comprueba
//            if (perfil_publico)  
//                System.out.println(post);
//                System.out.println("Perfil aceptado");
//            else 
//                System.out.println("");
        
        // Condición con expresión relacional
        int edad = 17;
        if (edad>=18) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }
        
        // Condiciones compuestas con y - and - &&
        boolean lleva_dni = true;
        // Para que la siguiente condición sea cierta, ambas condiciones
        // por separado deben ser ciertas, en caso contrario será falsa
        if (edad>=18 && lleva_dni) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }
        
        // Condiciones compuestas con o - or - ||        
        boolean tieneAmigoSegurata = true;
        // Para que la siguiente condición sea cierta, basta que una de las 
        // dos condiciones por separado sea cierta, sólo cuando ambas son falsas
        // el resultado será falso
        if (edad>=18 || tieneAmigoSegurata) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }
        
        // Composición con varias condiciones
        // Este es el orden natural de precedencia
        // Se evalúa igual que si no llevara paréntesis, pero prefiero que 
        // siempre se pongan, para facilitar la legibilidad
        if ((edad>=18 && lleva_dni) || tieneAmigoSegurata) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }    
        // Cambia los valores de las variables para que se den las siguientes
        // circunstancias: tener 20 años, sin dni y sin amigo segurata
        // tener 20 años con dni y sin amigo segurata
        // tener 17 años sin dni y con amigo segurata
        // tener 17 años sin dni y sin amigo segurata
        
        // Descomponer un if con condiciones compuestas en varios if encadenados
        /*
        if ((edad>=18 && lleva_dni) || amigo_segurata) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }        
        */
        
        if (edad>=18) {
            if (lleva_dni) {
                System.out.println("Puedes pasar");
            } else {
                if (tieneAmigoSegurata) {
                    System.out.println("Puedes pasar");
                } else {
                    System.out.println("No puedes pasar");
                }
            } 
        } else {
            if (tieneAmigoSegurata) {
                System.out.println("Puedes pasar");
            } else {
                System.out.println("No puedes pasar");
            } 
        }
        // NOTA: Tratad de poner siempre primero las condiciones que 
        // estadísticamente se cumplan con mayor probabilidad
        
        
        // Ejercicio: haz lo mismo que acabamos de hacer, pero el primer
        // if debe comenzar preguntando si tiene amigo segurata
        // if (tieneAmigoSegurata) {
        // ...
        // }
        
        
        // Cuidado con los paréntesis --> esto está mal
        // No hace lo mismo la condición que buscábamos arriba
        if (edad>=18 && (lleva_dni || tieneAmigoSegurata)) {
            System.out.println("Puedes pasar");
        } else {
            System.out.println("No puedes pasar");
        }   
        // ¿Qué casos dejaría pasar de forma equivocada?
    }
}