2.1 Condicionales: decidir qué hacer¶
Un programa no ejecuta siempre las mismas líneas: decide según los datos. Para decidir usa una condición, una expresión cuyo resultado es verdadero o falso (un valor booleano), y ejecuta un bloque u otro según el resultado.
if, else if y else¶
La estructura completa tiene tres partes: lo que se hace si se cumple la condición, lo que se hace si no pero se cumple otra, y lo que se hace en cualquier otro caso.
fun calificacion(nota: Int): String {
if (nota < 0 || nota > 10) {
return "Nota no válida"
} else if (nota < 5) {
return "Insuficiente"
} else if (nota < 6) {
return "Suficiente"
} else if (nota < 7) {
return "Bien"
} else if (nota < 9) {
return "Notable"
} else if (nota < 10) {
return "Sobresaliente"
} else {
return "Matrícula"
}
}
fun main() {
for (nota in listOf(3, 5, 6, 8, 9, 10, 11)) {
println("$nota -> ${calificacion(nota)}")
}
}
Salida:
3 -> Insuficiente
5 -> Suficiente
6 -> Bien
8 -> Notable
9 -> Sobresaliente
10 -> Matrícula
11 -> Nota no válida
Las condiciones se evalúan de arriba abajo y se ejecuta solo la primera rama que se cumple; el resto se salta. Por eso el orden importa.
El orden de las ramas
Si en la función anterior pusieras primero nota < 10, la nota 3 entraría ahí y obtendrías «Sobresaliente». Ordena las condiciones de la más restrictiva a la más general, y deja el else para lo que no encaja en ninguna.
Casos raros primero
Comprobar al principio lo que no es válido (aquí, una nota fuera de 0 a 10) y devolver enseguida evita anidar condiciones y deja el resto del código más claro.
Operadores de comparación y lógicos¶
| Comparación | Significa |
|---|---|
== · != |
igual · distinto |
< · <= |
menor · menor o igual |
> · >= |
mayor · mayor o igual |
| Lógico | Símbolo en Kotlin | Ejemplo |
|---|---|---|
| Y | && |
edad >= 18 && carnet |
| O | \|\| |
dia == 6 \|\| dia == 7 |
| NO | ! |
!carnet |
Las condiciones lógicas se evalúan de izquierda a derecha y se detienen en cuanto el resultado está claro (cortocircuito): en a && b, si a es falso ya no se mira b. Se aprovecha para escribir x != 0 && 10 / x > 2 sin riesgo de dividir entre cero.
En Kotlin == compara el contenido (llama a equals), también en cadenas, así que nombre == "Ana" funciona. Para saber si dos variables son el mismo objeto se usa ===.
= no es ==
Un solo = asigna un valor; dos == comparan. En Kotlin la asignación no es una expresión, así que if (x = 3) es un error de compilación.
En Kotlin la condición debe ser un booleano: no vale un número ni una cadena (if (n) no compila). Escribe n != 0, texto.isNotEmpty(), etc.
Una condición en una sola línea¶
Cuando solo hay que elegir entre dos valores, se puede escribir la condición dentro de la expresión.
fun mostrar(edad: Int, carnet: Boolean) {
val tipo = if (edad >= 18) "mayor" else "menor"
val permiso = if (carnet) "con carnet" else "sin carnet"
val conducir = if (edad >= 18 && carnet) "puede conducir" else "no puede conducir"
println("$edad años ($tipo), $permiso -> $conducir")
}
fun main() {
mostrar(17, true)
mostrar(18, false)
mostrar(18, true)
}
Salida:
17 años (menor), con carnet -> no puede conducir
18 años (mayor), sin carnet -> no puede conducir
18 años (mayor), con carnet -> puede conducir
Úsalo para valores sencillos; si la condición o las ramas se complican, es mejor un if normal.
Selección múltiple¶
Cuando una misma variable se compara con muchos valores concretos, el if/else if se hace largo. Para eso existe la selección múltiple.
fun tipoDeDia(dia: Int): String {
return when (dia) {
1, 2, 3, 4, 5 -> "laborable"
6, 7 -> "fin de semana"
else -> "día no válido"
}
}
fun main() {
for (dia in listOf(1, 3, 6, 7, 9)) {
println("$dia -> ${tipoDeDia(dia)}")
}
}
Kotlin no tiene switch: tiene when, que no necesita break ni «cae» al siguiente caso. Varios valores se separan con comas (1, 2, 3 ->). Usado como expresión (return when ...) devuelve un valor y el compilador exige cubrir todos los casos con else.
Y en su forma más moderna:
fun tipoDeDia(dia: Int) = when (dia) {
in 1..5 -> "laborable"
6, 7 -> "fin de semana"
else -> "día no válido"
}
fun main() {
for (dia in listOf(1, 3, 6, 7, 9)) {
println("$dia -> ${tipoDeDia(dia)}")
}
}
when admite rangos (in 1..5), listas de valores y condiciones cualquiera. Cuando solo hay una expresión, se puede escribir fun f(x) = when (x) { ... } sin llaves ni return.
Salida:
1 -> laborable
3 -> laborable
6 -> fin de semana
7 -> fin de semana
9 -> día no válido
Las dos versiones producen la misma salida.
Errores frecuentes¶
| Error | Cómo evitarlo |
|---|---|
| Condiciones en mal orden, y una rama nunca se ejecuta | Prueba con un valor de cada rama y los valores límite (aquí 4, 5, 9 y 10) |
Confundir = con == |
Léelo en voz alta: «es igual a» |
Olvidar el caso por defecto (else, default, _) |
Pregúntate qué pasa con un dato inesperado |
Condiciones repetidas con || que podrían ser un switch |
Si comparas la misma variable con muchos valores, usa selección múltiple |
Para practicar¶
Haz los ejercicios 2.1 de condicionales. Empieza por los primeros y, cuando funcionen, prueba cada uno con un valor de cada rama y con los límites.