Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/estrucutras control»
(Página creada con «{{:Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/nav}} <div id=apuntes_distancia> {{PHP/EstructurasControl}} </div>») |
|||
Línea 2: | Línea 2: | ||
<div id=apuntes_distancia> | <div id=apuntes_distancia> | ||
− | + | {{ManuelRomero/PHP/EstructurasControl}} | |
{{PHP/EstructurasControl}} | {{PHP/EstructurasControl}} | ||
</div> | </div> |
Última revisión de 08:36 12 nov 2024
Contenido
Estructuras de Control
- Las estructuras de control determinan el flujo de ejecución de un programa
- Especifican el orden en que se ejecutarán las instrucciones.
- Existen tres tipos principales de estructuras de control:
- Secuenciales: Ejecutan las instrucciones en orden, una tras otra.
- Selectivas: Permiten elegir entre diferentes caminos según una condición.
- Repetitivas: Ejecutan un bloque de instrucciones varias veces según una condición.
- Para implementarlas, necesitamos operadores y condiciones, cuya sintaxis vamos a ir estudiando.
- A modo de resumen, presentamos la siguiente tabla:
Estructura de Control | Sintaxis en PHP | Ejemplo |
---|---|---|
Secuencial |
{ sentencia_1; sentencia_2; // ... } |
$num = rand(-10,20); echo "Se ha generado el número $num"; |
Selectiva |
if (expresion_booleana) { sentencia_1; sentencia_2; } sentencia_3; |
$num = rand(-10,20); if ($num < 0) { echo "El número $numero es negativo"; }else{ echo "El número $numero es positivo"; } |
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"; |
Instrucciones Secuenciales
- En Este tipo de estructura de control, las instrucciones se ejecutan una tras otra de.
- Las instrucciones se ejecutan en el orden en que aparecen, de forma secuencial, sin saltos ni repeticiones en el proceso.
- La imagen muestra un flujo en el que cada paso se realiza de forma consecutiva, de arriba hacia abajo.
Ejemplos de Estructura Secuencial en PHP
Operaciones matemáticas en secuencia
| |
<?php // Asignación de valores a variables $a = 5; $b = 10; $c = $a + $b; // Se suma $a y $b $d = $c * 2; // El resultado se multiplica por 2 echo "El resultado final es $d"; // Imprime el resultado ?>
|
Mostrar mensajes
| |
<?php echo "Primero se ejecuta esta línea.<br />\n"; echo "Luego se ejecuta esta línea.<br />\n"; echo "Finalmente, se ejecuta esta última línea."; ?>
|
- En ambos ejemplos
* Las instrucciones se ejecutan en orden, sin interrupciones. * Cada línea de código sigue a la anterior y se ejecuta solo una vez.
Esta estructura es la más simple de las estructuras de control y establece la base para comprender el flujo de ejecución en un programa.
Selección con `if`
- La estructura de control if permite evaluar una expresión booleana (una condición que puede ser verdadera o falsa).
- En función de si la expresión es true o false, el programa ejecutará un bloque de sentencias o lo omitirá, u otro si se especifica.
Sintaxis Básica
- La estructura básica de if es:
if (expresion_booleana) Sentencia_1;
- Si hay más de una sentencia a ejecutar cuando la condición es verdadera, debemos utilizar llaves `{ }` para agrupar el bloque de instrucciones, también lo podemos poner si solo hay una instruccion:
if (expresion_booleana) { Sentencia_1; Sentencia_2; } if (expresion_booleana){ Sentencia_1; }
- La indentación
- Es muy importante la indentación.
- Consiste en dejar espacios o sangrías al inicio de cada línea de código dentro de un bloque.
- Esto ayuda a visualizar la estructura y jerarquía de las instrucciones, facilitando la lectura y comprensión del código.
- Una buena indentación es fundamental para evitar errores y mantener el código organizado0.
- Ejemplos
{{plegable|hidden|Programa que obtien el valor absoluto de un número|
$num = rand(-10, 20); if ($num < 0) { $num = -$num; } echo "El valor absoluto del número es $num"; }}
Visualización del `if`
La imagen muestra el flujo de ejecución: si la expresión booleana es true', se ejecutan las sentencias dentro del bloque `if`; si es false, el flujo continúa después del bloque.
`if...else`
- Podemos añadir una estructura else para especificar un bloque de sentencias que se ejecutará solo cuando la condición sea false.
if (expresion_booleana) { bloque_de_sentencias_1; } else { bloque_de_sentencias_2; }
- Ejemplo de `if...else`
{{plegable|hidden|Miramos si una edad en mayor o menor de edad| $edad = rand(1,35); if ($edad >= 18) { echo "Eres mayor de edad."; } else { echo "Eres menor de edad."; }
- Si $edad es 18 o más, se imprime "Eres mayor de edad". Si $edad es menor que 18, se imprime "Eres menor de edad".
Visualización del `if...else`
La imagen muestra que si la condición es **true**, se ejecuta el bloque `if`; si es **false**, se ejecuta el bloque `else`.
`if...elseif...else`
- La estructura `if...elseif...else` permite evaluar múltiples condiciones en secuencia. Solo se ejecutará el bloque correspondiente a la primera condición verdadera.
if (expresion_booleana_1) { bloque_sentencias_1; } elseif (expresion_booleana_2) { bloque_sentencias_2; } elseif (expresion_booleana_3) { bloque_sentencias_3; } else { bloque_sentencias_4; }
Ejemplo de `if...elseif...else`
$nota = 85; if ($nota >= 90) { echo "Excelente"; } elseif ($nota >= 75) { echo "Bueno"; } elseif ($nota >= 50) { echo "Aprobado"; } else { echo "Reprobado"; }
- En este ejemplo, dependiendo del valor de `$nota`, el programa imprime un mensaje diferente. Solo se ejecuta el bloque de la primera condición verdadera.
Visualización del `if...elseif...else`
La imagen muestra cómo se evalúan varias condiciones en secuencia hasta que una sea verdadera. Si ninguna lo es, se ejecuta el bloque `else`.
Sintaxis Alternativa
- PHP permite una sintaxis alternativa para `if`, `else`, y `elseif`, especialmente útil cuando se intercala código HTML:
if (condicion): Sentencia_1; elseif (otra_condicion): Sentencia_2; else: Sentencia_3; endif;
- Ejemplo con HTML:
<?php if (true): ?> <h1>Este contenido se mostrará</h1> <?php else: ?> <h1>Este contenido no se mostrará</h1> <?php endif; ?>
Ejercicio Propuesto
- Escribe un programa que evalúe la temperatura y muestre un mensaje según el rango:
- Si la temperatura es menor que 0: "Hace mucho frío". - Si la temperatura está entre 0 y 15: "Hace frío". - Si la temperatura está entre 15 y 30: "Temperatura agradable". - Si la temperatura es mayor que 30: "Hace calor".
$temp = rand(-10, 40); // Genera una temperatura aleatoria echo "La temperatura actual es $temp grados.\n"; // Escribe el código del ejercicio aquí
Estructuras de control
|
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
- Secuenciales
- Selección
- Iteracción
- Para construirlas necesitamos operadores que a continuación vamos a estudiar
- A modo de resumen vamos a ver la siguiente tabla
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
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
- Sentencias de control
if (expresion_booleana) { bloque_de_sentencias_1; } else { bloque_de_sentencias_2; }
- Podemos ver su lógica en la imagen siguiente
- 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
- 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
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 .
Ejercicio propuesto de edad
| |
0-2 => Bebe 3-10 => Niña 11-17 => Adolescencia 18-26 => Joven 27-59 => Adulto 60-80 => Experimentado 80 -< => Disfruta a tope
|
Posible solución |
---|
$edad = rand (0,110); <?php $edad = 0; switch (true){ case ($edad == 0): $msj ="Eres un recién nacido"; break; case (($edad > 0) and ($edad <=3)): $msj = "Eres un bebé"; break; case ($edad > 3 && $edad <=10): $msj = "Eres un adolescente"; break; case ($edad > 10 && $edad <=17): $msj = "Eres un adolescente"; break; case ($edad > 17 && $edad <=26): $msj = "Eres un joven"; break; case ($edad > 26 && $edad <=59): $msj = "Eres un Adulto"; break; case ($edad > 59 && $edad <=80): $msj = "Eres un Experimentado"; break; default: $msj = "Disfruta a tope"; } /* * * * */ ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1> <?= "con $edad, $msj" ?> </h1> </body> </html> |
- Switch
uso de switch
| |||
|
|
- 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
|
- 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
- inicializar la variable de control
- actualizarla correctamente dentro del bucle
- realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
|
}}
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.
|
|
}}
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>"; } ?>