Diferencia entre revisiones de «Plantilla:PHP/EstructurasControl»

De WikiEducator
Saltar a: navegación, buscar
(Selección if)
(Estructuras de control)
Línea 6: Línea 6:
 
*Veremos cómo se implementan en PHP
 
*Veremos cómo se implementan en PHP
 
}}
 
}}
</div>
 
  
<div class="slide">
+
 
 
=== Estructuras de control ===
 
=== Estructuras de control ===
 
<br />
 
<br />
 
*Con este nombre, identificamos la estructura o forma con la que vamos a seguir el flujo de ejecución de un programa, es decir, especificar cuál es la siguiente intrucción que voy a ejecutar.
 
*Con este nombre, identificamos la estructura o forma con la que vamos a seguir el flujo de ejecución de un programa, es decir, especificar cuál es la siguiente intrucción que voy a ejecutar.
  
*Tenemos tres estrucuturas de control  
+
*Tenemos tres estrucuturas de control
 
Son de tres tipos
 
Son de tres tipos
 
#Secuenciales
 
#Secuenciales
Línea 32: Línea 31:
 
|Secuencial
 
|Secuencial
 
||
 
||
<source lang=php>  
+
<source lang=php>
 
{
 
{
  
Línea 41: Línea 40:
 
</source>
 
</source>
 
||
 
||
<source lang=php>  
+
<source lang=php>
 
$num = rand(-10,20)
 
$num = rand(-10,20)
 
echo "Se ha generado el numero $num";
 
echo "Se ha generado el numero $num";
Línea 48: Línea 47:
 
|Selectiva
 
|Selectiva
 
||
 
||
<source lang=php>  
+
<source lang=php>
  
 
if(expresion_booleana)
 
if(expresion_booleana)
 
{
 
{
  sentencia_1;
+
sentencia_1;
  sentencia_2;
+
sentencia_2;
 
}
 
}
 
sentencia_3
 
sentencia_3
Línea 59: Línea 58:
 
</source>
 
</source>
 
||
 
||
<source lang=php>  
+
<source lang=php>
 
$num = rand(-10,20);
 
$num = rand(-10,20);
 
if($num<0){
 
if($num<0){
  echo "El número tiene que ser mayor que 0, reasignamos el valor 1";
+
echo "El número tiene que ser mayor que 0, reasignamos el valor 1";
  $num=1;
+
$num=1;
 
}
 
}
 
echo "El valor del número es $num";
 
echo "El valor del número es $num";
Línea 70: Línea 69:
 
|Repetitiva
 
|Repetitiva
 
||
 
||
<source lang=php>  
+
<source lang=php>
  
 
while (expresion_booleana){
 
while (expresion_booleana){
  sentencia_1;
+
sentencia_1;
  sentencia_2;
+
sentencia_2;
 
}
 
}
 
sentencia_3
 
sentencia_3
 
</source>
 
</source>
 
||
 
||
<source lang=php>  
+
<source lang=php>
 
$num = 0;
 
$num = 0;
 
$total=0;
 
$total=0;
 
while($num<100){
 
while($num<100){
  $total= $total+$num;
+
$total= $total+$num;
  $num = $num+1;
+
$num = $num+1;
 
}
 
}
 
echo "Los primeros 100 números suman $total";
 
echo "Los primeros 100 números suman $total";
Línea 91: Línea 90:
 
|}
 
|}
  
</div>
 
  
<div class="slide">
 
  
===Secuencial===
 
*Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
 
[[Archivo:secuencial.png|center]]
 
  
===Selección if===
 
*Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
 
<source lang=php>
 
if (expresion_booleana)
 
    Sentencia 1;
 
</source>
 
<hr>
 
*En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
 
<source lang=php>
 
if  (expresion_booleana ){
 
    Sentencia_1;
 
    Sentencia_2;
 
}
 
</source>
 
  
</div>
+
    ===Secuencial===
<div class="slide">
+
    *Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
*Podemos ver su lógica en la imagen siguiente
+
    [[Archivo:secuencial.png|center]]
[[Archivo:estructura_if.png|center]]
+
</div>
+
  
<div class="slide">
+
    ===Selección if===
 +
    *Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
 +
    <source lang=php>
 +
    if (expresion_booleana)
 +
    Sentencia 1;
 +
    </source>
 +
    <hr>
 +
    *En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
 +
    <source lang=php>
 +
    if  (expresion_booleana ){
 +
    Sentencia_1;
 +
    Sentencia_2;
 +
    }
 +
    </source>
  
;Sentencias de control
 
<source lang=php>
 
if  (expresion_booleana)
 
{
 
    bloque_de_sentencias_1;
 
}
 
else
 
{
 
    bloque_de_sentencias_2;
 
}
 
</source>
 
<div class="slide">
 
*Podemos ver su lógica en la imagen siguiente
 
[[Archivo:estructura_if_else.png|center]]
 
</div>
 
  
*También existe la opción '''''elseif''''' donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
+
   
*Se garantiza que solo se va a ejecutar '''''un bloque de instrucciones'''''.
+
        *Podemos ver su lógica en la imagen siguiente
</div>
+
        [[Archivo:estructura_if.png|center]]
  
<div class="slide">
 
;Estructura de control
 
<source lang=php>
 
if (expresion_booleana_1)
 
{
 
bloque_sentencias_1;
 
}
 
elseif (expresion_booleana_2){
 
bloque_sentencias_2
 
}
 
elseif (expresion_booleana_3){
 
bloque_sentencias_3
 
}
 
elseif (expresion_booleana_4){
 
bloque_sentencias_4
 
}
 
else{
 
bloque_sentencia_5  ;
 
}
 
sentencia_6
 
  
</source>
+
       
</div>
+
*Podemos ver su lógica en la imagen siguiente
+
[[Archivo:estructura_if_elseif.png|center]]
+
</div>
+
  
 +
            ;Sentencias de control
 +
            <source lang=php>
 +
            if  (expresion_booleana)
 +
            {
 +
            bloque_de_sentencias_1;
 +
            }
 +
            else
 +
            {
 +
            bloque_de_sentencias_2;
 +
            }
 +
            </source>
 +
           
 +
                *Podemos ver su lógica en la imagen siguiente
 +
                [[Archivo:estructura_if_else.png|center]]
  
<div class="slide">
 
*Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
 
*También se puede usar la sintaxis  vista anteriormente, pero parece que esta quede más compacta.
 
  
<source lang=php>
+
                *También existe la opción '''''elseif''''' donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
if (condicion):
+
                *Se garantiza que solo se va a ejecutar '''''un bloque de instrucciones'''''.
  Sentencia 1;
+
endif;
+
</source>
+
</div>
+
  
<div class="slide">
+
               
;Ahora lo vemos con código html
+
                    ;Estructura de control
<source lang=php>
+
                    <source lang=php>
<?php if (true): ?>
+
                    if (expresion_booleana_1)
 +
                    {
 +
                    bloque_sentencias_1;
 +
                    }
 +
                    elseif (expresion_booleana_2){
 +
                    bloque_sentencias_2
 +
                    }
 +
                    elseif (expresion_booleana_3){
 +
                    bloque_sentencias_3
 +
                    }
 +
                    elseif (expresion_booleana_4){
 +
                    bloque_sentencias_4
 +
                    }
 +
                    else{
 +
                    bloque_sentencia_5  ;
 +
                    }
 +
                    sentencia_6
  
    <h1>Esta frase seguro que aparece ahor</h1>
+
                    </source>
    <!--escribirmos código html -->
+
<?php else: ?>
+
    <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
+
    <!--escribimos código html -->
+
<?php endif ?>
+
</source>
+
</div>
+
  
<div class="slide">
+
                    *Podemos ver su lógica en la imagen siguiente
 +
                    [[Archivo:estructura_if_elseif.png|center]]
  
===Operadores ternario===
 
*Es una forma más compacta de expresar un '''''if-else''''' en una única instrucción.
 
*Esta instrucción se conoce como '''''operador ternario''''', y retorna un valor
 
<source lang=php>
 
expresión_booleana ? SentenciaOKExpresion : SentenciaNoOkExpresion
 
</source>
 
*El valor que retorna es el que se obtenga de ejecutar la '''Sentencia''' correspondiente.
 
*Esta '''''expresión''''' retorna un valor, y es este sentido es sinónimo de
 
<source lang=php>
 
if (expresión_booleana)
 
  SentenciaOKExpresion
 
else
 
  SentenciaNoOkExpresion
 
</source>
 
  
{{MRM_Actividad|Programa que me diga si un número aleatorio es par o impar!
+
                   
 +
                        *Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
 +
                        *También se puede usar la sintaxis  vista anteriormente, pero parece que esta quede más compacta.
 +
 
 +
                        <source lang=php>
 +
                        if (condicion):
 +
                        Sentencia 1;
 +
                        endif;
 +
                        </source>
  
{{Plegable|hide|Programa par o impar con operador ternario|
 
<source lang=php>
 
<?php
 
  $num= rand(1,100);
 
  echo ($num%2==0)?  "$num es par" :  "$num es impar";
 
?>
 
</source>
 
  
}}
+
                       
{{Plegable|hide|Programa par o impar con estructura de control if-else|
+
                            ;Ahora lo vemos con código html
<source lang=php>
+
                            <source lang=php>
<?php
+
                            <?php if (true): ?>
  $num= rand(1,100);
+
 
if ($num%2==0)
+
                                <h1>Esta frase seguro que aparece ahor</h1>
  echo  "$num es par"
+
                                <!--escribirmos código html -->
 +
                            <?php else: ?>
 +
                                <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
 +
                                <!--escribimos código html -->
 +
                            <?php endif ?>
 +
                            </source>
 +
 
 +
 
 +
                           
 +
 
 +
                                ===Operadores ternario===
 +
                                *Es una forma más compacta de expresar un '''''if-else''''' en una única instrucción.
 +
                                *Esta instrucción se conoce como '''''operador ternario''''', y retorna un valor
 +
                                <source lang=php>
 +
                                expresión_booleana ? SentenciaOKExpresion : SentenciaNoOkExpresion
 +
                                </source>
 +
                                *El valor que retorna es el que se obtenga de ejecutar la '''Sentencia''' correspondiente.
 +
                                *Esta '''''expresión''''' retorna un valor, y es este sentido es sinónimo de
 +
                                <source lang=php>
 +
                                if (expresión_booleana)
 +
                                SentenciaOKExpresion
 +
                                else
 +
                                SentenciaNoOkExpresion
 +
                                </source>
 +
 
 +
                                {{MRM_Actividad|Programa que me diga si un número aleatorio es par o impar!
 +
 
 +
                                {{Plegable|hide|Programa par o impar con operador ternario|
 +
                                <source lang=php>
 +
                                    <?php
 +
                                    $num= rand(1,100);
 +
                                    echo ($num%2==0)?  "$num es par" :  "$num es impar";
 +
                                    ?>
 +
                                </source>
 +
 
 +
                                }}
 +
                                {{Plegable|hide|Programa par o impar con estructura de control if-else|
 +
                                <source lang=php>
 +
                                    <?php
 +
                                    $num= rand(1,100);
 +
                                    if ($num%2==0)
 +
                                        echo  "$num es par"
 
else
 
else
  echo  "$num es impar";
+
    echo  "$num es impar";
?>
+
                                    ?>
</source>
+
                                </source>
}}
+
                                }}
}}
+
                                }}
</div>
+
  
<div class="slide">
 
<br />
 
*Este '''''operador''''' se usa mucho en programación, por lo que conviene entenderlo y habituarse a su uso.
 
</div>
 
  
<br />
+
                               
 +
                                    <br />
 +
                                    *Este '''''operador''''' se usa mucho en programación, por lo que conviene entenderlo y habituarse a su uso.
  
===Seleccion switch===
+
                                    <br />
*Este es un selector múltiple.
+
*La sentencia case en '''''php''''' puede albergar cualquier valor de un tipo simple, no está limitado a enteros como en otros lenguajes
+
*Esta estructura estáindicada cuanto tengamos más de dos casos ante una variable o situación que evaluemos excluyentes entre sí.
+
</div>
+
*La sintaxis de esta  estructura  de control es
+
<source lang=php>
+
switch ($valor){
+
  case: "valor1":
+
        acciones
+
        break;
+
  case: "valor1":
+
        acciones
+
        break;
+
  case: "valor1":
+
        acciones
+
        break;
+
  default:
+
        acciones si no hay coincidencia anterior
+
}
+
</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">
+
                                    ===Seleccion switch===
;Switch
+
                                    *Este es un selector múltiple.
{{MRM_Ejemplo|Title=uso de switch|
+
                                    *La sentencia case en '''''php''''' puede albergar cualquier valor de un tipo simple, no está limitado a enteros como en otros lenguajes
*Hacer un programa que nos muestre si un nombre es María, Pedro, o no es ninguno de ellos
+
                                    *Esta estructura estáindicada cuanto tengamos más de dos casos ante una variable o situación que evaluemos excluyentes entre sí.
  
{{Plegable|hide|Posible solución|
+
                                    *La sintaxis de esta  estructura  de control es
<source lang=php>
+
                                    <source lang=php>
<?php
+
                                    switch ($valor){
switch ($nombre){
+
                                    case: "valor1":
    case "Maria":
+
                                    acciones
        echo "eres una chica";
+
                                    break;
        break;
+
                                    case: "valor1":
    case "Pedro";
+
                                    acciones
        echo "eres una chico";
+
                                    break;
        break;
+
                                    case: "valor1":
    default:
+
                                    acciones
        echo "no se qué nombre tienes";
+
                                    break;
}
+
                                    default:
?>
+
                                    acciones si no hay coincidencia anterior
</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''''' .
  
{{MRM_Actividad|Title=Generar mes y mostrar número de días|
+
                                   
*Hacer un programa que muestre el número de días que tiene un més
+
                                        ;Switch
*El número de mes se obtendrá en un  valor aleatorio entre 1 y 15
+
                                        {{MRM_Ejemplo|Title=uso de switch|
*El programa me mostrará el número de días y si el mes no es correcto me informará de ello
+
                                        *Hacer un programa que nos muestre si un nombre es María, Pedro, o no es ninguno de ellos
  
 +
                                        {{Plegable|hide|Posible solución|
 +
                                        <source lang=php>
 +
                                            <?php
 +
                                            switch ($nombre){
 +
                                                case "Maria":
 +
                                                    echo "eres una chica";
 +
                                                    break;
 +
                                                case "Pedro";
 +
                                                    echo "eres una chico";
 +
                                                    break;
 +
                                                default:
 +
                                                    echo "no se qué nombre tienes";
 +
                                            }
 +
                                            ?>
 +
                                        </source>
 +
                                        }}
 +
                                        }}
  
{{Plegable|hide|Posible solución|
+
                                        {{MRM_Actividad|Title=Generar mes y mostrar número de días|
 +
                                        *Hacer un programa que muestre el número de días que tiene un més
 +
                                        *El número de mes se obtendrá en un  valor aleatorio entre 1 y 15
 +
                                        *El programa me mostrará el número de días y si el mes no es correcto me informará de ello
  
<source lang=php>
 
<?php
 
  
//Generamos un número de mes
+
                                        {{Plegable|hide|Posible solución|
$mes = rand(1, 20);
+
  
//Evaluamos en número de días del mes generado
+
                                        <source lang=php>
 +
                                            <?php
  
switch ($mes) {
+
                                            //Generamos un número de mes
    case 1:
+
                                            $mes = rand(1, 20);
    case 3:
+
    case 5:
+
    case 7:
+
    case 8:
+
    case 10:
+
    case 12:
+
        echo "$mes, mes de 31 días";
+
        break;
+
  
    case 4:
+
                                            //Evaluamos en número de días del mes generado
    case 6:
+
    case 10:
+
    case 11:
+
        echo "$mes, mes de 30 días";
+
        break;
+
    case 2:
+
        echo "$mes, mes de 29 o 28 días";
+
        break;
+
    default:
+
        echo "$mes, mes incorrecto ";
+
}
+
?>
+
</source>
+
}}
+
  
}}
+
                                            switch ($mes) {
 +
                                                case 1:
 +
                                                case 3:
 +
                                                case 5:
 +
                                                case 7:
 +
                                                case 8:
 +
                                                case 10:
 +
                                                case 12:
 +
                                                    echo "$mes, mes de 31 días";
 +
                                                    break;
  
</div>
+
                                                case 4:
*Vamos a observar una situación curiosa de php en esta estructura de control
+
                                                case 6:
*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
+
                                                case 10:
0-3 deficiente
+
                                                case 11:
4  insuficiente
+
                                                    echo "$mes, mes de 30 días";
5  suficiente
+
                                                    break;
6  bien
+
                                                case 2:
7-8 notable
+
                                                    echo "$mes, mes de 29 o 28 días";
9-10 sobresaliente
+
                                                    break;
*Si hacemos el programa como se expone a continuación, aparentemente vemos que funciona
+
                                                default:
<source lang=php>
+
                                                    echo "$mes, mes incorrecto ";
$nota = rand (0,10);
+
                                            }
 +
                                            ?>
 +
                                        </source>
 +
                                        }}
  
 +
                                        }}
  
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>
+
                                        *Vamos a observar una situación curiosa de php en esta estructura de control
*Pero observa que si $nota vale 0, no está funcionando correctamente
+
                                        *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
*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''''')
+
                                        0-3 deficiente
*Si la expresión del case es un valor booleano, el valor $nota, se convierte a booleano
+
                                        4  insuficiente
*Si el valor es 0, lo voy comparando con las difernetes expresione. Vemos qué ocurre en este caso ($nota =0):
+
                                        5  suficiente
*1.-Primer case:  '''''case ($nota>=0 and $nota<=3)'''''
+
                                        6  bien
Esta expresión da TRUE, ya que nota es >=0.
+
                                        7-8 notable
entonces estoy comparando 0 con TRUE. Convierto 0 a booleano y estaría comparando FALSE con TRUE
+
                                        9-10 sobresaliente
que es falso, por lo que no ejectua este case
+
                                        *Si hacemos el programa como se expone a continuación, aparentemente vemos que funciona
*2.-Segundo case  '''''case 4'''''
+
                                        <source lang=php>
En este caso  comparo 0 con 4 que es FALSE, por lo que tampoco ejecuto este case
+
                                        $nota = rand (0,10);
*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">
+
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){
+
                                        switch ($nota){
    case ($nota>=0 and $nota<=3):
+
                                        case ($nota>=0 and $nota<=3):
        echo "<h1>Nota $nota es  deficiente</h1>";
+
                                        echo "<h1>Nota $nota es  deficiente</h1>";
        break;
+
                                        break;
    case $nota==4:
+
                                        case 4:
        echo "<h1>Nota $nota es  insuficiente</h1>";
+
                                        echo "<h1>Nota $nota es  insuficiente</h1>";
        break;
+
                                        break;
    case $nota==5:
+
                                        case 5:
        echo "<h1>Nota $nota es  suficiente</h1>";
+
                                        echo "<h1>Nota $nota es  suficiente</h1>";
        break;
+
                                        break;
    case $nota==6:
+
                                        case 6:
        echo "<h1>Nota $nota es  bien</h1>";
+
                                        echo "<h1>Nota $nota es  bien</h1>";
        break;
+
                                        break;
    case ($nota>6 and $nota<9):
+
                                        case ($nota>6 and $nota<9):
        echo "<h1>Nota $nota es  notable</h1>";
+
                                        echo "<h1>Nota $nota es  notable</h1>";
        break;
+
                                        break;
    case ($nota>=9):
+
                                        case ($nota>=9):
        echo "<h1>Nota $nota es  sobresalinte</h1>";
+
                                        echo "<h1>Nota $nota es  sobresalinte</h1>";
        break;
+
                                        break;
}
+
                                        }
</source>
+
                                        ?>
  
===Iteración while===
+
                                        </source>
*Como en todos los bucles debemos siempre tener encuenta
+
                                        *Pero observa que si $nota vale 0, no está funcionando correctamente
#inicializar la variable de control
+
                                        *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''''')
#actualizarla correctamente dentro del bucle
+
                                        *Si la expresión del case es un valor booleano, el valor $nota, se convierte a booleano
#realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
+
                                        *Si el valor es 0, lo voy comparando con las difernetes expresione. Vemos qué ocurre en este caso ($nota =0):
{{MRM_Actividad|Title=Uso de while|
+
                                        *1.-Primer case:  '''''case ($nota>=0 and $nota<=3)'''''
*Mostrar la suma de los primeros 100 números naturales
+
                                        Esta expresión da TRUE, ya que nota es >=0.
*Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
+
                                        entonces estoy comparando 0 con TRUE. Convierto 0 a booleano y estaría comparando FALSE con TRUE
*Cada iteración que aparezca en numeración ordinal en símbolo 1ª , , ...
+
                                        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.
 +
                                       
 +
                                            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);
  
{{Plegable|hide|Posible solución|
 
  
<source lang=php>
+
                                            switch (TRUE){
<?php
+
                                            case ($nota>=0 and $nota<=3):
$i = 0;
+
                                            echo "<h1>Nota $nota es  deficiente</h1>";
while ($i < 100) {
+
                                            break;
    $suma+=$i;
+
                                            case $nota==4:
    $i++;
+
                                            echo "<h1>Nota $nota es  insuficiente</h1>";
    echo "iteracción {$i}ª Suma $suma<br />";
+
                                            break;
}
+
                                            case $nota==5:
?>
+
                                            echo "<h1>Nota $nota es  suficiente</h1>";
</source>
+
                                            break;
}}
+
                                            case $nota==6:
}}
+
                                            echo "<h1>Nota $nota es bien</h1>";
<div class="slide">
+
                                            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>
  
<br />
+
                                            ===Iteración while===
 +
                                            *Como en todos los bucles debemos siempre tener encuenta
 +
                                            #inicializar la variable de control
 +
                                            #actualizarla correctamente dentro del bucle
 +
                                            #realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
 +
                                            {{MRM_Actividad|Title=Uso de while|
 +
                                            *Mostrar la suma de los primeros 100 números naturales
 +
                                            *Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
 +
                                            *Cada iteración que aparezca en numeración ordinal en símbolo 1ª , 2ª, ...
  
===Iteracción do-while===
+
                                            {{Plegable|hide|Posible solución|
*Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
+
*Respecto al anterior nos ahorra una comparación.
+
{{MRM_Actividad|Title=Usando do-while|
+
*Modifica el ejercicio anterior usando un do-wile
+
  
<source lang=php>
+
                                            <source lang=php>
</source>
+
                                                <?php
 +
                                                $i = 0;
 +
                                                while ($i < 100) {
 +
                                                    $suma+=$i;
 +
                                                    $i++;
 +
                                                    echo "iteracción  {$i}ª Suma $suma<br />";
 +
                                                }
 +
                                                ?>
 +
                                            </source>
 +
                                            }}
 +
                                            }}
 +
                                           
  
}}
+
                                                <br />
</div>
+
<div class="slide">
+
<br />
+
  
===Iteración for===
+
                                                ===Iteracción do-while===
*Es un bucle de tipo contador
+
                                                *Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
<source lang=php>
+
                                                *Respecto al anterior nos ahorra una comparación.
for (expresion_inicial; condicion;expresion_actualizar){
+
                                                {{MRM_Actividad|Title=Usando do-while|
      sentencias;
+
                                                *Modifica el ejercicio anterior usando un do-wile
}
+
</source>
+
</div>
+
  
<div class="slide">
+
                                                <source lang=php>
;Estructura for
+
                                                </source>
*tiene tres partes
+
;expresion_inicial:
+
:Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
+
;condición
+
:Es una expresión booleana que se evalúa en cada interacción
+
:Si da un valor false, ya no se ejecuta ninguna vez
+
:Si no hay expresión se toma como true
+
:En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
+
</div>
+
  
<div class="slide">
+
                                                }}
;Estructura for: condición
+
 
<source lang=php>
+
                                               
<?php
+
                                                    <br />
for ($a=0; ;$a++){
+
    echo "$a*$a=".$a*$a."<br>";
+
    if ($a==10)
+
        break;
+
}
+
?>
+
</source>
+
</div>
+
  
<div class="slide">
+
                                                    ===Iteración for===
;Estructura for: expresion_actualizar
+
                                                    *Es un bucle de tipo contador
:Esta expresión actualiza el valor de alguna/as variables
+
                                                    <source lang=php>
:Se ejecuta en cada interactivo
+
                                                    for (expresion_inicial; condicion;expresion_actualizar){
*El ejemplo anterior  
+
                                                    sentencias;
<source lang=php>
+
                                                    }
<?php
+
                                                    </source>
for ($a=0;$a<10 ;$a++){
+
 
    echo "$a*$a=".$a*$a."<br>";
+
 
}
+
                                                   
?>
+
                                                        ;Estructura for
</source>
+
                                                        *tiene tres partes
</div>
+
                                                        ;expresion_inicial:
 +
                                                        :Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
 +
                                                        ;condición
 +
                                                        :Es una expresión booleana que se evalúa en cada interacción
 +
                                                        :Si da un valor false, ya no se ejecuta ninguna vez
 +
                                                        :Si no hay expresión se toma como true
 +
                                                        :En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
 +
                                                   
 +
 
 +
                                                   
 +
                                                        ;Estructura for: condición
 +
                                                        <source lang=php>
 +
                                                            <?php
 +
                                                            for ($a=0; ;$a++){
 +
                                                                echo "$a*$a=".$a*$a."<br>";
 +
                                                                if ($a==10)
 +
                                                                    break;
 +
                                                            }
 +
                                                            ?>
 +
                                                        </source>
 +
                                                   
 +
 
 +
                                                   
 +
                                                        ;Estructura for: expresion_actualizar
 +
                                                        :Esta expresión actualiza el valor de alguna/as variables
 +
                                                        :Se ejecuta en cada interactivo
 +
                                                        *El ejemplo anterior
 +
                                                        <source lang=php>
 +
                                                            <?php
 +
                                                            for ($a=0;$a<10 ;$a++){
 +
                                                                echo "$a*$a=".$a*$a."<br>";
 +
                                                            }
 +
                                                            ?>
 +
                                                        </source>

Revisión de 17:19 21 dic 2021

Estructuras de control

Icon objectives.jpg
Objetivo
Determinan el flujo de ejecución de un programa
  • Tenemos tres estructuras de control
  • Veremos cómo se implementan en PHP


Estructuras de control


  • Con este nombre, identificamos la estructura o forma con la que vamos a seguir el flujo de ejecución de un programa, es decir, especificar cuál es la siguiente intrucción que voy a ejecutar.
  • Tenemos tres estrucuturas de control

Son de tres tipos

  1. Secuenciales
  2. Selección
  3. Iteracción
  • Para construirlas necesitamos operadores que a continuación vamos a estudiar
  • A modo de resumen vamos a ver la siguiente tabla


Resumen de las estructurasd e control
Tipo de Estructura de control Sintáxis en php Ejemplo
Secuencial
{
 
sentencia_1;
sentencia_2;
....
}
$num = rand(-10,20)
echo "Se ha generado el numero $num";
Selectiva
if(expresion_booleana)
{
sentencia_1;
sentencia_2;
}
sentencia_3
$num = rand(-10,20);
if($num<0){
echo "El número tiene que ser mayor que 0, reasignamos el valor 1";
$num=1;
}
echo "El valor del número es $num";
Repetitiva
while (expresion_booleana){
sentencia_1;
sentencia_2;
}
sentencia_3
$num = 0;
$total=0;
while($num<100){
$total= $total+$num;
$num = $num+1;
}
echo "Los primeros 100 números suman $total";



   ===Secuencial===
   *Con esta estrucutra de control, lo que estamos especificando es que se ejecuta una instrucción detras de otra de forma seguida, por lo que el flujo de control es secuancial
Secuencial.png
   ===Selección if===
   *Sentencia que evalúa una expresión booleana y ejecuta o no en función de que dicha expresión sea true o false
    if (expresion_booleana)
    Sentencia 1;

   *En caso de haber más de una setencia, obligatoriamente debemos de poner las llaves especificando el bloque de sentencias
    if  (expresion_booleana ){
    Sentencia_1;
    Sentencia_2;
    }


       *Podemos ver su lógica en la imagen siguiente
Estructura if.png



           ;Sentencias de control
            if  (expresion_booleana)
            {
            bloque_de_sentencias_1;
            }
            else
            {
            bloque_de_sentencias_2;
            }
               *Podemos ver su lógica en la imagen siguiente
Estructura if else.png


               *También existe la opción elseif donde aportaremos una condición que se ha de cumplir para que se ejecuten las sentencias que a continuación acompañan.
               *Se garantiza que solo se va a ejecutar un bloque de instrucciones.


                   ;Estructura de control
                    if (expresion_booleana_1)
                    {
                    bloque_sentencias_1;
                    }
                    elseif (expresion_booleana_2){
                    bloque_sentencias_2
                    }
                    elseif (expresion_booleana_3){
                    bloque_sentencias_3
                    }
                    elseif (expresion_booleana_4){
                    bloque_sentencias_4
                    }
                    else{
                    bloque_sentencia_5   ;
                    }
                    sentencia_6
                   *Podemos ver su lógica en la imagen siguiente
Estructura if elseif.png


                       *Alternativamente puede usarse esta sintaxis que es usada cuando se quiere intercalar condigo html fuera del php como veremos más adelante.
                       *También se puede usar la sintaxis  vista anteriormente, pero parece que esta quede más compacta.
                        if (condicion):
                        Sentencia 1;
                        endif;


                           ;Ahora lo vemos con código html
                            <?php if (true): ?>
 
                                <h1>Esta frase seguro que aparece ahor</h1>
                                <!--escribirmos código html -->
                            <?php else: ?>
                                <h1>Aquí escribiré poco ya que no va a aparecer nada</h1>
                                <!--escribimos código html -->
                            <?php endif ?>



                               ===Operadores ternario===
                               *Es una forma más compacta de expresar un if-else en una única instrucción.
                               *Esta instrucción se conoce como operador ternario, y retorna un valor
                                expresión_booleana ? SentenciaOKExpresion : SentenciaNoOkExpresion
                               *El valor que retorna es el que se obtenga de ejecutar la Sentencia correspondiente.
                               *Esta expresión retorna un valor, y es este sentido es sinónimo de
                                if (expresión_booleana)
                                SentenciaOKExpresion
                                else
                                SentenciaNoOkExpresion



Icon activity.jpg
Actividad
Programa que me diga si un número aleatorio es par o impar!





                                   
*Este operador se usa mucho en programación, por lo que conviene entenderlo y habituarse a su uso.
                                   
                                   ===Seleccion switch===
                                   *Este es un selector múltiple.
                                   *La sentencia case en php puede albergar cualquier valor de un tipo simple, no está limitado a enteros como en otros lenguajes
                                   *Esta estructura estáindicada cuanto tengamos más de dos casos ante una variable o situación que evaluemos excluyentes entre sí.
                                   *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 .


                                       ;Switch
                                       


Icon casestudy.gif
uso de switch
                                       *Hacer un programa que nos muestre si un nombre es María, Pedro, o no es ninguno de ellos




Icon activity.jpg
Generar mes y mostrar número de días
                                       *Hacer un programa que muestre el número de días que tiene un més
                                       *El número de mes se obtendrá en un  valor aleatorio entre 1 y 15
                                       *El programa me mostrará el número de días y si el mes no es correcto me informará de ello





                                       *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
                                        $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;
                                        }
                                        ?>
                                       *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.
                                       
                                           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
                                            $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;
                                            }
                                           ===Iteración while===
                                           *Como en todos los bucles debemos siempre tener encuenta
                                           #inicializar la variable de control
                                           #actualizarla correctamente dentro del bucle
                                           #realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
                                           


Icon activity.jpg
Uso de while
                                           *Mostrar la suma de los primeros 100 números naturales
                                           *Se quiere ver el número de iteración y la suma hasta ese momento (Es decir queremos ver cien líneas)
                                           *Cada iteración que aparezca en numeración ordinal en símbolo 1ª , 2ª, ...




                                               
                                               ===Iteracción do-while===
                                               *Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
                                               *Respecto al anterior nos ahorra una comparación.
                                               


Icon activity.jpg
Usando do-while
                                               *Modifica el ejercicio anterior usando un do-wile
 




                                                   
                                                   ===Iteración for===
                                                   *Es un bucle de tipo contador
                                                    for (expresion_inicial; condicion;expresion_actualizar){
                                                    sentencias;
                                                    }


                                                       ;Estructura for
                                                       *tiene tres partes
                                                       ;expresion_inicial:
                                                       :Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
                                                       ;condición
                                                       :Es una expresión booleana que se evalúa en cada interacción
                                                       :Si da un valor false, ya no se ejecuta ninguna vez
                                                       :Si no hay expresión se toma como true
                                                       :En este caso para que el bucle no sea infinito deberá llevar algún break (instrucción de terminación de bloque) en algún momento
                                                   


                                                       ;Estructura for: condición
                                                            <?php
                                                            for ($a=0; ;$a++){
                                                                echo "$a*$a=".$a*$a."<br>";
                                                                if ($a==10)
                                                                    break;
                                                            }
                                                            ?>


                                                       ;Estructura for: expresion_actualizar
                                                       :Esta expresión actualiza el valor de alguna/as variables
                                                       :Se ejecuta en cada interactivo
                                                       *El ejemplo anterior
                                                            <?php
                                                            for ($a=0;$a<10 ;$a++){
                                                                echo "$a*$a=".$a*$a."<br>";
                                                            }
                                                            ?>