12 - Estructura condicional when

Además de la estructura condicional if Kotlin nos proporciona una estructura condicional para situaciones que tenemos que verificar múltiples condiciones que se resuelven con if anidados.

Mediante una serie de ejemplos veremos la sintaxis de la estructura when.

Problema 1

Escribir un programa que pida ingresar la coordenada de un punto en el plano, es decir dos valores enteros x e y.
Posteriormente imprimir en pantalla en que cuadrante se ubica dicho punto. (1º Cuadrante si x > 0 Y y > 0 , 2º Cuadrante: x < 0 Y y > 0, 3º Cuadrante: x < 0 Y y < 0, 4º Cuadrante: x > 0 Y y < 0)
Si alguno o los dos valores son cero luego el punto se encuentra en un eje.

Proyecto59 - Principal.kt

fun main(parametro: Array<String>) {
    print("Ingrese coordenada x del punto:")
    val x = readln().toInt()
    print("Ingrese coordenada y del punto:")
    val y = readln().toInt()
    when {
        x > 0 && y > 0 -> println("Primer cuadrate")
        x < 0 && y > 0 -> println("Segundo cuadrante")
        x < 0 && y < 0 -> println("Tercer cuadrante")
        x > 0 && y < 0 -> println("Cuarto cuadrante")
        else -> println("El punto se encuentra en un eje")
    }
}

Disponemos la palabra clave when y entre llaves las distintas condiciones y luego del operador -> la o las instrucciones a ejecutar si se cumple la condición.:

    when {
        x > 0 && y > 0 -> println("Primer cuadrate")
        x < 0 && y > 0 -> println("Segundo cuadrante")
        x < 0 && y < 0 -> println("Tercer cuadrante")
        x > 0 && y < 0 -> println("Cuarto cuadrante")
        else -> println("El punto se encuentra en un eje")
    }

Si alguna de las condiciones se verifica verdadera no se analizan las siguientes.

Si ninguna de las cuatro condiciones dispuestas en el when se verifica verdadera se ejecutan las instrucciones que disponemos luego del else.

Podemos comparar el mismo problema resuelto con if anidados y ver que queda más conciso y claro con when:

    if (x > 0 && y > 0)
        print("Se encuentra en el primer cuadrante")
    else
        if (x < 0 && y > 0)
            print("Se encuentra en el segundo cuadrante")
        else
            if (x < 0 && y < 0)
                print("Se encuentra en el tercer cuadrante")
            else
                if (x > 0 && y < 0)
                    print("Se encuentra en el cuarto cuadrante")
                else
                    print("Se encuentra en un eje")

Problema 2

Confeccionar un programa que pida por teclado tres notas de un alumno, calcule el promedio e imprima alguno de estos mensajes:
Si el promedio es >=7 mostrar "Promocionado".
Si el promedio es >=4 y <7 mostrar "Regular".
Si el promedio es <4 mostrar "Reprobado".

Proyecto60 - Principal.kt

fun main(parametros: Array<String>) {
    print("Ingrese primer nota:")
    val nota1 = readln().toInt()
    print("Ingrese segunda nota:")
    val nota2 = readln().toInt()
    print("Ingrese tercer nota:")
    val nota3 = readln().toInt()
    val promedio = (nota1 + nota2 + nota3) / 3
    when {
        promedio >= 7 -> print("Promocionado")
        promedio >= 4 -> print("Regular")
        else -> print("Libre")
    }
}

Problema 3

Realizar un programa que permita ingresar el peso (en kilogramos) de piezas. El proceso termina cuando ingresamos el valor 0.
Se debe informar:

a) Cuántas piezas tienen un peso entre 9.8 Kg. y 10.2 Kg.?, cuántas con más de 10.2 Kg.? y cuántas con menos de 9.8 Kg.?

b) La cantidad total de piezas procesadas.

Proyecto61 - Principal.kt

fun main(parametro: Array<String>) {
    var cant1 = 0
    var cant2 = 0
    var cant3 = 0
    do {
        print("Ingrese el peso de la pieza (0 pera finalizar):")
        val peso = readln().toDouble()
        when {
            peso > 10.2 -> cant1++
            peso >= 9.8 -> cant2++
            peso > 0 -> cant3++
        }
    } while(peso != 0.0)
    println("Piezas aptas: $cant2")
    println("Piezas con un peso superior a 10.2: $cant1")
    println("Piezas con un peso inferior a 9.8: $cant3");
    val suma = cant1 + cant2 + cant3
    println("Cantidad total de piezas procesadas: $suma")
}

La sección del else es opcional como lo podemos comprobar en este problema.

Estructura when como expresión

Vimos que en Kotlin existe la posibilidad de que la estructura condicional if retorne un valor, la misma posibilidad se presenta con la estructura when.

Problema 4

Ingresar los sueldos de 10 empleados por teclado. Mostrar un mensaje según el valor del sueldo:

"sueldo alto" si es > 5000
"sueldo medio" si es <=5000 y > 2000
"sueldo bajo" si es <= 2000

Además mostrar el total acumulado de gastos en sueldos altos.

Proyecto62 - Principal.kt

fun main(parametro: Array<String>) {
    var total = 0
    for(i in 1..10) {
        print("ingrese sueldo del operario:")
        val sueldo = readln().toInt()
        total += when {
            sueldo > 5000 -> {
                println("Sueldo alto")
                sueldo
            }
            sueldo > 2000 -> {
                println("Sueldo medio")
                0
            }
            else -> {
                println("Sueldo bajo")
                0
            }
        }
    }
    println("Gastos totales en sueldos altos: $total")
}

La estructura when retorna un valor entero que acumulamos en la variable total. Si entra por la primera condición del when mostramos por pantalla el mensaje "Sueldo alto" y retornamos el valor del sueldo.

Como solo debemos acumular los sueldos altos cuando es un sueldo medio o bajo retornamos el valor cero que no afecta en la acumulación.

Tengamos en cuenta que cuando tenemos dos o más instrucciones luego del operador -> debemos disponer las llaves de apertura y cerrado.

Problemas propuestos

  • Se ingresa por teclado un valor entero, mostrar una leyenda por pantalla que indique si el número es positivo, nulo o negativo.
  • Plantear una estructura que se repita 5 veces y dentro de la misma cargar 3 valores enteros. Acumular solo el mayor del cada lista de tres valores.
  • Realizar un programa que lea los lados de n triángulos, e informar:
    a) De cada uno de ellos, qué tipo de triángulo es: equilátero (tres lados iguales), isósceles (dos lados iguales), o escaleno (ningún lado igual)
    b) Cantidad de triángulos de cada tipo.
Solución
Proyecto63

fun main(parametro: Array<String>){
    print("Ingrese un valor entero:")
    val valor = readln().toInt()
    when {
        valor == 0 -> println("Se ingresó el cero")
        valor > 0 -> println("Se ingresó un valor positivo")
        else -> println("Se ingresó un valor negativo")
    }
}




Proyecto64

fun main(parametro: Array<String>) {
    var suma = 0
    for(i in 1..5) {
        print("Ingrese primer valor:")
        val valor1 = readln().toInt()
        print("Ingrese segundo valor:")
        val valor2 = readln().toInt()
        print("Ingrese tercer valor:")
        val valor3 = readln().toInt()
        suma += when {
            valor1 > valor2 && valor1 > valor3 -> valor1
            valor2 > valor3 -> valor2
            else -> valor3
        }
    }
    println("El valor acumulado de los mayores de cada lista de 3 valores es : $suma")
}




Proyecto65

fun main(argumento: Array<String>) {
    var cant1 = 0
    var cant2 = 0
    var cant3 = 0
    print("Ingrese la cantidad de triángulos:")
    val n = readln().toInt()
    for(i in 1..n) {
        print("Ingrese lado 1:")
        val lado1 = readln().toInt()
        print("Ingrese lado 2:")
        val lado2 = readln().toInt()
        print("Ingrese lado 3:")
        val lado3 = readln().toInt()
        when {
            lado1 == lado2 && lado1 == lado3 -> {
                println("Es un triángulo equilatero.")
                cant1++
            }
            lado1 == lado2 || lado1 == lado3 || lado2 == lado3 -> {
                println("Es un triángulo isósceles.")
                cant2++
            }
            else -> {
                println("Es un triángulo escaleno.")
                cant3++
            }
        }
    }
    println("Cantidad de triángulos equilateros: $cant1")
    println("Cantidad de triángulos isósceles: $cant2")
    println("Cantidad de triángulos escalenos: $cant3")
}