Usuario:ManuelRomero/php/NewPHP/inaem 2018/control

De WikiEducator
Saltar a: navegación, buscar



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, cuando pretendo obtener un valor en función de una condición que voy a evaluar.
  • 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: "valor2":
      acciones
      break;
  case: "valorn":
      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 .



Icon casestudy.gif
Ejercicio propuesto de edad
  • Generamos una edad entre 0 y 110 años
  • Luego informamos de la edad y de el nivel de madurez con el siguiente criterio
0-2 => Bebe
3-10 => Niña
11-17 => Adolescencia
18-26 => Joven
27-59 => Adulto
60-80 => Experimentado
80 -<  => Disfruta a tope


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;
}

Selección con el operador match

  • El operador match aparece en php en la versión 8
  • Es una opción depurada y para casos concretos que puede sustituir de forma más eficiente y legigle a la estructura switch-case


Icon key points.gif

Operador match

  • 1.- Siempre retornará un valor
  • 2.- Evaluamos una expresión, al igual que con switch-case
  • 3.- En cada una de las ramas puedo establecer varias condiciones separadas por comas, intuyendo en ello una or lógica.
  • 4.- Igual que en switch-case existe la rama default
  • 5.- Como va a ser parte de una asignación, debe de terminar en ;
  • 6.- Las comparaciones que hace son estrictas a diferenica del switch-case que hace comparaciones no estrictas


  • A continuación podemos ver ejemplos
$numero_mes = rand(1,15);
$nombre_mes = match ($numero_mes){
	1=>"Enero",
	2=>"Febrero",
	.....
	default => "Mes incorrecto"
};
echo "El mes $numero_mes es $nombre_mes"
  • Aquí vemos el uso de varios valores posibles en la comparación
```php
$numero_mes = rand(1,15);
$numero_dias=match($mes){  
    1,3,5,7,8,10,12 => 31,  
    4,6,8,11 =>30,  
    2 => 28  
};  
echo "El mes $mes tiene $numero_dias días";

Iteración while

  • Como en todos los bucles debemos siempre tener encuenta
  1. inicializar la variable de control
  2. actualizarla correctamente dentro del bucle
  3. 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ª, ...






Icon activity.jpg
Uso de while
  • Generamos un número aleatorio entre 1 y 15.
  • Mostramos un mensaje con el número hasta que el número que salga sea el 13.
  • Podría ser que el número nos salga el primero en cuyo caso no habrá ningún mensaje
  • Mostramos cuantos números se han generado y la suma de los mismos




}}


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
  • En este caso el número 13 también queremos que forme parte de la lista y se incluya tanto en la suma como en la contabilización,





Icon activity.jpg
Usando do-while
Programa para rellenar una bonoloto
  • Generamos 5 valores aleatorios de 1 a 50 diferentes
  • Los motramos por pantalla





Icon activity.jpg
Generar tabla ascii
Programa para generar una tabla ascii con caracteres desde el 0 hasta el 127
Intentamos generar la tabla html
 





Icon activity.jpg
Generar una password
Programa para generar una passoword
  • Generamos una password con caracteres ascii (ver tabla anterior
  • La password debe de tener 7 caracteres
  • Los caracteres se puede repetir
  • Al menos 2 de ellos han de ser no alfanuméricos




 

}}

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
Incremento de la expresión inicial
Marca el paso o cómo se va modificando la variable de control en cada iteración


Estructura for
condición
    <?php
    for ($a=0; ;$a++){
        echo "$a*$a=".$a*$a."<br>";
    }
    ?>
  • Es como si dentro del bucle establecemos la condición de terminación usando la instrucción de terminación de bloque break
  • Observa el siguiente código forzado y compáralo con el anterior (mira que la sección de condición está vacía)
    <?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>";
    }
    ?>

Operadores y expresiones



Icon define.gif
¿Qué es una expresión?
  • Son partes de las frases de un lenguaje de programación


Icon define.gif
Definición
Es un conjunto de operador/es y operando/s
que se evalúan
y dan como resultado un valor




Icon key points.gif

Notas importantes

Una expresión tiene un tipo asociado
En php el tipo lo marca el operador
Los operandos se intentan adaptar al tipo
No es una instrucción, es parte de ella


Operadores

  • Son símbolos que realizan acciones sobre operandos y dan como resultado un valor
  • Tenemos diferentes tipos de operadores en función del tipo de operandos y del resultado


OPERADORES HABITUALES EN PHP
TIPO DE OPERADOR OPERADOR Tipo de Expresión
Operadores aritméticos + - * / % ** Numérica
Operadores lógicos AND OR && || ! Lógica
Operadores de comparación == != << < > <= >= <=> ?? Lógica
Operadores de auto incremento/decremento ++$a $a++ --$a $a-- Numérica
Operadores de string: concatenación . .= String
OTROS OPERADORES MENOS HABITUALES
TIPO DE OPERADOR OPERADOR Tipo de Expresión
Operadores asignación simple = valor asignado
Operadores asignación compuesta += *= -= %= **= .= numérico
Operadores asignación por referenica & Valor referenciado
Operadores bit a bit & | ^ ~ << >> numérico
Operador de control de errors @ no retorna, anula comunicaicón de errores si se produjeran
Operador de ejecución `` resultado del comando ejecutado


Operadores de expresiones numéricas



Icon key points.gif

Puntos clave

Intervienen con valores numéricos y retorna un número como resultado de su evaluación


  1. Aritméticos (+,-,*,/,%,**)
  2. Autoincremente/decremento(++ --)
  3. Asignación compuesta (los aritmétcios segidos de una asignación += -= *= ....)



Icon key points.gif

Puntos clave

1.- Operadores aritméticos


Cuando haya varios en una operación, hay que tener cuidado con la preferencia. Mejor esplicitarla con paréntesis



Icon qmark.gif
Qué ejecutaría el siguiente código
$num = 5+6*8-4/2;
Mejor ponerlo así
$num = 5+(6*8)-(4/2);



  • El operador quizá menos utilizado es el módulo(%) y el exponente(**).

(Comment.gif: El módulo se usa mucho para ver si un número es o no divisible por otro.)




Icon activity.jpg
Actividad
Buscar todos los números divisibles por 3 del 1 al 100


(Comment.gif: En el ejemplo anterior, al final sale una coma de más, que ya veremos cómo quitarla.)





El exponente consiste en elevar un número a otro


Icon activity.jpg
Actividad
Obtenerlo las diferentes potencias de 2 hasta elevarlo a 15
21 22 23...215




Autoincremente / Decremento
  • el ++, -- son valores de autoincremeto y autodecremento, pueder ser pre o post
  • El el caso pre, primero incrementa y luego toma el valor
  • El el caso post, primero toma el valor y luego incrementa


Icon key points.gif

Puntos clave

Title: forma de usar los operadores

Pre es anteponiendo el operador
++$a;
--$a
Post es posponiéndolo
$a++;
$a--;



Para muchos casos es lo mismo hacerlo pre que post. Esto ocurre cuando en la instrucción solo haga eso
$a=5;
$a++;
echo "Valor de a es $a";

Es igual que

$a=5;
++$a;
echo "Valor de a es $a";
En ambos casos la salida dará el valor 6

Pero

$a=5;
echo "Valor de a es ".++$a."<br />";
echo "Valor de a es $a<br />";

No es igual que

$a=5;
echo "Valor de a es ".$a++."<br />";
echo "Valor de a es $a<br />";



Icon qmark.gif
Pregunta
Lo ves claro


}}



Icon activity.jpg
Realiza el siguiente programa Entendiendo qué hace
//Declara una variable entera y asigna el valor 4
 
//Usando el operador unario, incrementa una unidad y compáralo con el valor 5
//Muestra un mensaje mostrando su valor
 
//Compáralo con el valor  4 y decrementa en una unidad , muestra información de que no es igual y muestra el valor
//Analiza la salida y prueba deferentes situaciones




Operadores
$a=5;
if ($a++==5)
    echo '$a que vale '.$a.' dice que vale 5 ???? <br>'
        . 'Esto es por que primero compara y luego incrementa<br>';
 
echo 'ahora $a vale '.$a.'<br>';
 
if (++$a==6)
    echo 'esto nunca saldrá ya que $a se incrementa antes de comparar';
else
    echo 'efectivamente ahora $a ya no vale 6 sino '.$a.'<br>';
?>
Operadores
  • El código anterior genera la siguiente salida
 $a que vale 6 dice que vale 5 ???? 
 Esto es por que primero compara y luego incrementa
 ahora $a vale 6
 efectivamente ahora $a ya no vale 6 sino 7

Operadores con asignación en una misma variable

  • Cuando la variable donde asignamos el resultado de la expresión forma parte de la expresión, la podemos simplificar
  • Veamos el siguiente ejemplo
$a=$a*5;
  • Es igual que hacer
$a*=5;
  • Esto lo podemos hacer con cualquiera de los operadores aritméticos



Operadores comparación (==,<,>,>=,<=,<>,!=,===,!==)

Este tipo de operadores genera un booleano como resultado de evaluar la expresión


Icon key points.gif

Puntos clave

  • == operador de comparación igual que (mismo valor)
  • === operador de comparación exactamente igual que (mismo valor y tipo)


Operador == Vs ===
$num=1;
if ($num==true)
    echo '$num es igual a true<br>';
if ($num===true){
    echo "esto nunca se ejecutará";
}else
    echo '$num no es exactamente igual a true';
Operador == vs ===
  • El código anterior generaría la siguiente salida
$num es igual a true
$num no es exactamente igual a true
  • Ver la sección comparación de tipos de la página oficial
http://php.net/manual/es/language.operators.comparison.php

operadores de concatenacón( .) concatena cadena de caracteres.

El operador + no está sobre cargado, observa el siguiente código
$nombre="Maria";
$apellido = " de la Oh";
 
$nombreCompleto = $nombre.$apellido;
echo "el valor de nombre completo es $nombreCompleto ---<br>";
 
$nombreCompleto = $nombre+$apellido;
echo "el valor de nombre completo es $nombreCompleto --<br>";
La salida del código anterior sería
el valor de nombre completo es Maria de la Oh ---
el valor de nombre completo es 0 --

Operadores de asignación (= , =>)

Se pueden combinar con los aritméticos (+=, *=, ...) y con los de concatenación (.=)
En este caso el valor de la variable de la izquierda se toma como primero operando
Operador de asignación
<?php
$b=1;
for ($a=0;$a<10;$a++){
    $b*=10;
    echo 'valor de $b ='.$b.'<br>';
}
?>
  • El código anterior genera la siguiente salida
valor de $b =10
valor de $b =100
valor de $b =1000
valor de $b =10000
valor de $b =100000
valor de $b =1000000
valor de $b =10000000
valor de $b =100000000
valor de $b =1000000000
valor de $b =10000000000

Operadores de ejecución (``)

PHP proporciona un operador especial que permite ejecutar sentencias
  • Observa el siguiente código
<?php
$Discos = `df`;
echo "<pre>$Discos</pre>";
?>
  • El código anterior generará la siguiente salida
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       86378608  6072360  75895384   8% /
none                   4        0         4   0% /sys/fs/cgroup
udev             4023720        4   4023716   1% /dev
tmpfs             806904     1384    805520   1% /run
none                5120        0      5120   0% /run/lock
none             4034504     6588   4027916   1% /run/shm
none              102400       28    102372   1% /run/user
/dev/sda7      101797224 40480360  56122728  42% /home
Invocando funciones del sistema
  • El operador anterior (comillas invertidas) es igual que la función shell_exec()
http://php.net/manual/es/function.shell-exec.php

Operadores lógicos (and,&&, or, ||, xor !)

http://php.net/manual/es/language.operators.logical.php
Funcionan por cortocircuito
El operador xor da verdad si los operando son de diferente valor uno true y el otro false
La notación and y && representan el mismo operador, igual ocurre con or y ||
  • La diferencia entre los operadores es la prioridad
http://php.net/manual/es/language.operators.precedence.php