If / Else if / Else
Si tenemos varias condiciones mutuamente excluyentes (es decir, es imposible que las dos sean verdaderas al mismo tiempo) y queremos ejecutar diferentes bloques de código para cada una de ellas, usaremos bloques if / else if.
En este caso, un bloque else adicional sigue siendo opcional: no por usar if / else if estamos obligados a definir también un bloque else, pero podemos hacerlo si queremos cubrir el caso en el cual ninguna de las condiciones se haya cumplido.
if (Expresión booleana 1){
el código contenido aquí se ejecuta sólo si la Expresión booleana 1 devuelve true
} else if (Expresión booleana 2){
el código contenido aquí se ejecuta sólo si la Expresión booleana 2 devuelve true y la anterior devuelve false
} …
else if (Expresión booleana N){
se ejecuta sólo si la Expresión booleana N devuelve true y todas las anteriores devuelven false
} else {
se ejecuta sólo si todas las expresiones anteriores devuelven false
}
|
|
Ampliando el ejemplo anterior, podemos comprobar lo siguiente: aunque el usuario no haya batido el récord de tiempo, tal vez haya batido la puntuación total. Si ninguna de las dos condiciones es cierta mostraremos un mensaje de ánimo:
better_time_score.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { const n_time_record = 10.0; const n_time = 11.0; const n_record = 1200; const n_score = 3000; if (n_time < n_time_record) { print("¡Felicidades! Con tu tiempo: {} Has superado el récord anterior ({}).\n", .{ n_time, n_time_record }); } else if (n_score > n_record) { print("Aunque tu tiempo no sea mejor, has conseguido más puntos ({}) que antes ({})\n", .{ n_score, n_record }); } else { print("Sigue intentando mejorar, ni tu tiempo y ni tus puntos han batido el récord previo\n", .{}); }
} |
|
$ zig run better_time_score.zig |
|
Aunque tu tiempo no sea mejor, has conseguido más puntos (3000) que antes (1200). |
Podemos añadir tantos else if como queramos. Eso sí - es importante recordar que para que lleguen a ejecutarse, las condiciones de cada uno tienen que ser condiciones mutuamente excluyentes y estar escritas en el orden correcto.
El ejemplo de una condición mal planteada sería el siguiente:
better_score_error.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { const n_record = 1200; const n_score = 5000; if (n_record < n_score) { print("Tu puntuación {} es mejor que el récord ( {} )\n", .{ n_score, n_record }); } else if (n_score > 4000) { print("Tu puntuación {} es imposible.\n¡Has hecho trampas!\n", .{ n_score }); } } |
|
$ zig run better_score_error.zig |
|
Tu puntuación 5000 es mejor que el récord ( 1200 ) |
Vemos que el supuesto cheater se va a librar, todo porque hemos puesto que la condición que comprueba si la puntuación es imposible está colocada después de la que comprueba si se ha batido el récord. Recuerda: un bloque else if se ejecuta sólo sí todas las condiciones anteriores han devuelto false. Por lo tanto el bloque de código no se va a ejecutar nunca. ¿Ya ves la posible solución?
Cambiando el orden de las condiciones:
|
if (n_score > 4000) { print("Tu puntuación {} es imposible.\n¡Has hecho trampas!\n", .{ n_score }); } else if (n_record < n_score){ print("Tu puntuación {} es mejor que el récord ( {} )\n", .{ n_score, n_record }); } |
Ahora primero evaluamos si la puntuación es imposible y después comprobamos si el récord fue batido. Solo uno de los mensajes será mostrado.
