Encadenamiento de condicionales y bucles
Ya hemos visto en un ejemplo (test online) de los apartados anteriores, cómo podíamos incluir un condicional if dentro de un bucle for o un bucle while . De forma parecida, también podemos hacer encadenamientos, es decir, incluir condicionales dentro de otros condicionales, o bucles dentro de otros bucles, creando distintos niveles dentro de esos bloques.
Encadenamiento de if
Cuando queramos que se cumplan condiciones complejas en un condicional, en vez de expresarlo en una sola expresión, puede sernos más sencillo o claro emplear un encadenamiento de condiciones if. Lo vemos con un ejemplo:
Condicional sin encadenamiento:
1 2 3 4 5 6 7 8 9 10 |
<script> var a = 1; var b = 2; var c = 3; var d = 4; var e; if ((b-a === 1 || d-c === 1) && c !== b ) { e = c+d; } else { e = d-c; } document.write("e = " + e); </script> |
Podríamos escribir el script solo con instrucciones que contuvieran condiciones simples (solo se ha de cumplir una condición cada vez), encadenando o incluyendo uno dentro de otros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<script> var a = 1; var b = 2; var c = 3; var d = 4; var e; if (c !== b) { if (b-a === 1) { e = c+d; } else if (d-c === 1){ e = c+d; } else { e = d-c; } } else { e = (d-c); } document.write("e = " + e); </script> |
Aunque a nivel de condiciones, quizás sea más fácil de entender la 2ª versión, nosotros preferiríamos utilizar la 1ª versión por ser más compacta, lo que al final y viendo el script en conjunto, creemos que lo hace más claro. No obstante, puede haber casos realmente complejos donde nos sea más fácil descomponer una condición en varios if. Lo importante, en cualquier caso, es que sepamos que podemos hacerlo de esta forma.
Encadenamiento de bucles
El incluir un bucle dentro de otro puede ser algo más común porque hay procesos que requieren que por cada valor del contador del bucle externo se recorra un rango de valores de un bucle interno. Suena quizás algo enrevesado pero con un ejemplo se puede visualizar mucho mejor:
1 2 3 4 5 6 7 8 9 10 11 |
<script> var diaSemana = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]; for (var dia = 0; dia < diaSemana.length; dia++) { //bucle externo document.write(diaSemana[dia] + "<br>") for (var hora = 0; hora < 24; hora++) { //bucle interno if (hora !== 23) {document.write(hora + "h. ")} else {document.write(hora + "h." + "<br>")} } } </script> |
Si ejecutas el ejemplo en el editor online verás como para cada día de las semana que hemos definido en un array (diaSemana[ ]), mostramos en pantalla las 24 horas de ese día. El bucle externo recorre los días de las semana desde lunes hasta domingo, y por cada uno de estos días, el bucle interno recorre las horas desde 0 a 23. Vamos a describirlo paso a paso:
- El bucle exterior toma en primer lugar el diaSemana[0], es decir, el primer valor del array: «Lunes».
- Se ejecuta la primera instrucción de ese bucle externo, que es un document.write, que muestra en pantalla dicho día y realiza un salto de linea con la etiqueta «<br>»
- A continuación se ejecuta el bucle interno que comienza a pintar en pantalla las horas del día.
- Hemos incluido un condicional para formatear mejor el resultado. Comprueba si la hora que va a mostrar en pantalla no es la última del día, es decir, 23: (hora !== 23). Si no lo es, muestra el nº de hora seguido por el texto «h.», y si lo es, hace lo mismo pero forzando un salto de línea con «<br>» para que empiece a mostrarse el siguiente día en otra línea.
- El bucle interno termina cada vez que se alcanza el limite de 23. En ese momento el exterior retoma el flujo del programa, seleccionando el dia siguiente dentro del array, y volviendo a realizarse todo el ciclo.
Ejercicio
Prueba a hacer algo similar, pero en esta ocasión muestra en pantalla los meses del año y en cada uno los días que tiene: 1, 2….. En una versión más simplificada puedes poner 30 días a todos los meses, y en otra, trata de poner los días que tienen exactamente cada uno: 28 (Febrero), 30 ó 31.
Soluciones:
[restrict paid=true]
Solución para versión simple (30 días)
Solución para versión con días variables por mes
[/restrict]