Diferencia entre revisiones de «Plantilla:PHP/EstructurasControl»
De WikiEducator
(→Seleccion switch) |
(→Seleccion switch) |
||
Línea 128: | Línea 128: | ||
} | } | ||
</source> | </source> | ||
+ | *La ejecución de esta sentencia de control, busca la primera coincidencia de '''''$valor''''' con los difentes '''''case'''''. | ||
+ | *Posteriormente ejecutaría todas las instruciones hasta que encuentre un '''''break'''''. | ||
+ | *En caso de no haber break en el case correspondiente ejecutaría el código de los difernetes '''''case''''' hasta que llege al final de la estructura o bien ejecute una instrución '''''break''''' . | ||
<div class="slide"> | <div class="slide"> | ||
Línea 198: | Línea 201: | ||
</div> | </div> | ||
− | + | *Vamos a observar una situación curiosa de php en esta estructura de control | |
+ | *Supongamos que queremos evaluar el valor de una nota, un valor entero y compararlo con rangos de valores, según se expone a continuación | ||
+ | 0-3 deficiente | ||
+ | 4 insuficiente | ||
+ | 5 suficiente | ||
+ | 6 bien | ||
+ | 7-8 notable | ||
+ | 9-10 sobresaliente | ||
+ | *Si hacemos el programa como se expone a continuación, aparentemente vemos que funciona | ||
+ | <source lang=php | ||
+ | $nota = rand (0,10); | ||
+ | |||
+ | |||
+ | switch ($nota){ | ||
+ | case ($nota>=0 and $nota<=3): | ||
+ | echo "<h1>Nota $nota es deficiente</h1>"; | ||
+ | break; | ||
+ | case 4: | ||
+ | echo "<h1>Nota $nota es insuficiente</h1>"; | ||
+ | break; | ||
+ | case 5: | ||
+ | echo "<h1>Nota $nota es suficiente</h1>"; | ||
+ | break; | ||
+ | case 6: | ||
+ | echo "<h1>Nota $nota es bien</h1>"; | ||
+ | break; | ||
+ | case ($nota>6 and $nota<9): | ||
+ | echo "<h1>Nota $nota es notable</h1>"; | ||
+ | break; | ||
+ | case ($nota>=9): | ||
+ | echo "<h1>Nota $nota es sobresalinte</h1>"; | ||
+ | break; | ||
+ | } | ||
+ | ?> | ||
+ | |||
+ | </source> | ||
+ | *Pero observa que si $nota vale 0, no está funcionando correctamente | ||
+ | *Esto es por que en php estoy comparando valores de diferente tipo y realiza una conversión, ('''''de nuevo queda patente la expresividad de php''''') | ||
+ | *Si la expresión del case es un valor booleano, el valor $nota, se convierte a booleano | ||
+ | *Si el valor es 0, lo voy comparando con las difernetes expresione. Vemos qué ocurre en este caso ($nota =0): | ||
+ | *1.-Primer case: '''''case ($nota>=0 and $nota<=3)''''' | ||
+ | esta expresión da TRUE, ya que nota es >=0. | ||
+ | entonces estoy comparando 0 con TRUE. Convierto 0 a booleano y estaría comparando FALSE con TRUE | ||
+ | que es falso, por lo que no ejectua este case | ||
+ | *2.-Segundo case '''''case 4''''' | ||
+ | en este caso comparo 0 con 4 que es FALSE, por lo que tampoco ejecuto este case | ||
+ | *3.-Tercer y cuarto case, igual que el segundo | ||
+ | *4.-Quinto case: '''''case ($nota>6 and $nota<9)''''' | ||
+ | En este caso la expresión devuelve FALSE, ya que 0 no es mayor que 6 ni menor que 9, por lo que | ||
+ | comparo 0 con FALSE. Se convierte 0 a booleano y compararía FALSE con FALSE, que como es igual | ||
+ | me retorno TRUE y ejecutaría este case. | ||
<div class="slide"> | <div class="slide"> | ||
+ | Para solucionar esta situación, en php lo que debemos hacer es buscar una expresión que sea TRUE, por lo que en los diferentes '''''case''''' debemos especificar expresiones booleanas de forma que aquella que sea TRUE es la que queremos que se ejecute. Esto implicaría poner el valor TRUE en el switch. Veamos cómo queda en el código | ||
+ | <source lang=php> | ||
+ | $nota = rand (0,10); | ||
+ | |||
+ | |||
+ | switch (TRUE){ | ||
+ | case ($nota>=0 and $nota<=3): | ||
+ | echo "<h1>Nota $nota es deficiente</h1>"; | ||
+ | break; | ||
+ | case $nota==4: | ||
+ | echo "<h1>Nota $nota es insuficiente</h1>"; | ||
+ | break; | ||
+ | case $nota==5: | ||
+ | echo "<h1>Nota $nota es suficiente</h1>"; | ||
+ | break; | ||
+ | case $nota==6: | ||
+ | echo "<h1>Nota $nota es bien</h1>"; | ||
+ | break; | ||
+ | case ($nota>6 and $nota<9): | ||
+ | echo "<h1>Nota $nota es notable</h1>"; | ||
+ | break; | ||
+ | case ($nota>=9): | ||
+ | echo "<h1>Nota $nota es sobresalinte</h1>"; | ||
+ | break; | ||
+ | } | ||
+ | </source> | ||
===Iteración while=== | ===Iteración while=== |
Revisión de 18:01 6 oct 2020
- La sintaxis de esta estructura de control es
switch ($valor){ case: "valor1": acciones break; case: "valor1": acciones break; case: "valor1": acciones break; default: acciones si no hay coincidencia anterior }
- La ejecución de esta sentencia de control, busca la primera coincidencia de $valor con los difentes case.
- Posteriormente ejecutaría todas las instruciones hasta que encuentre un break.
- En caso de no haber break en el case correspondiente ejecutaría el código de los difernetes case hasta que llege al final de la estructura o bien ejecute una instrución break .
- Vamos a observar una situación curiosa de php en esta estructura de control
- Supongamos que queremos evaluar el valor de una nota, un valor entero y compararlo con rangos de valores, según se expone a continuación
0-3 deficiente 4 insuficiente 5 suficiente 6 bien 7-8 notable 9-10 sobresaliente
- Si hacemos el programa como se expone a continuación, aparentemente vemos que funciona
=0 and $nota<=3): echo "<h1>Nota $nota es deficiente</h1>"; break; case 4: echo "<h1>Nota $nota es insuficiente</h1>"; break; case 5: echo "<h1>Nota $nota es suficiente</h1>"; break; case 6: echo "<h1>Nota $nota es bien</h1>"; break; case ($nota>6 and $nota<9): echo "<h1>Nota $nota es notable</h1>"; break; case ($nota>=9): echo "<h1>Nota $nota es sobresalinte</h1>"; break; } ?>
- Pero observa que si $nota vale 0, no está funcionando correctamente
- Esto es por que en php estoy comparando valores de diferente tipo y realiza una conversión, (de nuevo queda patente la expresividad de php)
- Si la expresión del case es un valor booleano, el valor $nota, se convierte a booleano
- Si el valor es 0, lo voy comparando con las difernetes expresione. Vemos qué ocurre en este caso ($nota =0):
- 1.-Primer case: case ($nota>=0 and $nota<=3)
esta expresión da TRUE, ya que nota es >=0. entonces estoy comparando 0 con TRUE. Convierto 0 a booleano y estaría comparando FALSE con TRUE que es falso, por lo que no ejectua este case
- 2.-Segundo case case 4
en este caso comparo 0 con 4 que es FALSE, por lo que tampoco ejecuto este case
- 3.-Tercer y cuarto case, igual que el segundo
- 4.-Quinto case: case ($nota>6 and $nota<9)
En este caso la expresión devuelve FALSE, ya que 0 no es mayor que 6 ni menor que 9, por lo que comparo 0 con FALSE. Se convierte 0 a booleano y compararía FALSE con FALSE, que como es igual me retorno TRUE y ejecutaría este case.