miércoles, 11 de mayo de 2022

80 - Operador condicional: (condicion)?valor1:valor2

 


Cuando hay que tomar decisiones dentro de un algoritmo tenĂ­amos hasta ahora dos estructuras condicionales:

  • if/else
  • switch

El Ășnica comando que se puede utilizar en todas las situaciones es el if/else, en algunas situaciones se puede remplazar por el switch y ahora veremos una tercer forma.

No se trata de una estructura condicional sino de un operador condicional, veremos que también se lo puede utilizar en algunos casos particulares y que tiene por objetivo escribir código mås conciso.

La sintaxis del operador condicional:

[valor] = (condicion) ? valor1 : valor2

La condiciĂłn del operador es igual a lo que hacemos en un if clĂĄsico. Si el resultado de la condiciĂłn se verifica verdadero luego el 'valor1' se almacena en [valor] y si la condiciĂłn se verifica falsa el 'valor2' se almacena en [valor].

Por ejemplo si queremos almacenar en una variable si la persona es mayor de edad podemos hacerlo con la siguiente sintaxis:

        int edad = 3;
        String estado = edad >= 18 ? "Mayor" : "Menor";
        System.out.println(estado); // Menor

La variable estado almacena la cadena "Menor" debido a que la condiciĂłn del operador se verifica falsa.

Como vemos es mĂĄs concisa la codificaciĂłn que plantearlo con un if/else:

        String estado;
        if (edad >= 18)
            estado = "Mayor";
        else
            estado = "Menor";
        System.out.println(estado); // Menor

Problema

Generar 10 valores aleatorios comprendidos entre 1 y 50. Mostrar cada uno de los valores y un mensaje indicando si tiene 1 o 2 dĂ­gitos.

Programa:

Ver video
public class ValoresAleatorios {
    public static void main(String[] ar) {
        for (int f = 0; f < 10; f++) {
            int aleatorio = (int) (Math.random() * 50) + 1;
            System.out.println("El valor " + aleatorio + " tiene " + (aleatorio < 10 ? "1 dĂ­gito" : "2 dĂ­gitos"));
        }
    }
}

El resultado de ejecutar la aplicaciĂłn es:

Operador condicional: (condicion)?valor1:valor2

El valor devuelto por el operador condicional se lo pasamos directamente al método 'println' para que lo muestre:

System.out.println("El valor "+aleatorio+" tiene " + (aleatorio < 10 ? "1 dĂ­gito" : "2 dĂ­gitos"));

Es obligatorio que todo el operador condicional se encuentre entre parĂ©ntesis para que se evalĂșe.

Problema

Mostrar los nĂșmeros del 1 al 100 e indicar si se trata de un nĂșmero par o impar.

Programa:

public class ParesImpares {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            System.out.println(f + " es " + (f % 2 == 0 ? "par" : "impar"));
    }
}

Problema

Codificar un programa que muestre en pantalla los nĂșmeros del 1 al 100, sustituyendo los mĂșltiplos de 3 por el palabra "Fizz" y, a su vez, los mĂșltiplos de 5 por "Buzz". Para los nĂșmeros que, al mismo tiempo, son mĂșltiplos de 3 y 5, mostrar el mensaje "FizzBuzz".

Este sencillo programa y otros similares se los ha utilizado para descartar candidatos que se presentan a un puesto de programador, si no lo puede resolver en unos pocos minutos significa que no tiene sentido entrevistarlo por temas profundos de programaciĂłn por el que se esta buscando un candidato.

Programa:

Ver video
public class FizzBuzz {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            System.out.println(f % 3 == 0 && f % 5 == 0 ? "FizzBuzz" : (f % 3 == 0 ? "Fizz" : (f % 5 == 0 ? "Buzz" : f)));
    }
}
Operador condicional: (condicion)?valor1:valor2

El empleo del operador condicional debe hacerse con cuidado ya que hace menos legible el cĂłdigo.

Podemos ver que el programa es mucho mĂĄs conciso que utilizar una serie de if anidados:

public class FizzBuzz {
    public static void main(String[] ar) {
        for (int f = 1; f <= 100; f++)
            if (f % 3 == 0 && f % 5 == 0)
                System.out.println("FizzBuzz");
            else 
                if (f % 3 == 0)
                    System.out.println("Fizz");
                else 
                    if (f % 5 == 0)
                        System.out.println("Buzz");
                    else
                        System.out.println(f);
    }
}

Problema propuesto

  1. Se tienen los siguientes vectores paralelos con las notas y nombres de alumnos:

            String[] alumnos = { "juan", "ana", "luis", "carla", "pedro", "laura", "maria" };
            int[] notas = { 3, 7, 10, 9, 2, 8, 5 };
    

    Generar otro vector paralelo con el String "libre" si la nota es menor a 4 y la cadena "regular" si la nota es mayor o igual a cuatro.

    Emplear el operador condicional para cargar el vector paralelo.

    Ver video
public class GenerarEstados {
    public static void main(String[] args) {
        String[] alumnos = { "juan", "ana", "luis", "carla", "pedro", "laura", "maria" };
        int[] notas = { 3, 7, 10, 9, 2, 8, 5 };
        String[] estados = new String[notas.length];
        for (int f = 0; f < notas.length; f++)
            estados[f] = notas[f] >= 4 ? "regular" : "libre";
        for (int f = 0; f < notas.length; f++)
            System.out.println(alumnos[f] + " tiene una nota " + notas[f] + " esta " + estados[f]);
    }
}

No hay comentarios:

Publicar un comentario