Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/EstructurasControlRepetitivo»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con «===Iteración while=== *Como en todos los bucles debemos siempre tener encuenta #inicializar la variable de control #actualizarla correctamente dentro del bucle #realizar d...»)
 
 
(32 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 +
__NOTOC__
 +
[[#Tabla de Contenidos|Índice de contenidos]]
 +
<div style="float:none; clear:none; margin:0 0.3em 0.5em 0; padding:0.5em 1.4em 0.8em 0;">
 +
          <div id="toc" class="toc">
 +
                <div id="toctitle"><h2>
 +
[[#Tabla de Contenidos|Índice de contenidos]]</h2>"
 +
                </div>
 +
* [[#Introducción|1. Introducción]]
 +
* [[#Iteración_while|2. Iteración while]]
 +
** [[#Sintaxis|2.1 Sintaxis]]
 +
** [[#Ejercicio_Suma_de_los_primeros_25_números|2.2 Ejercicio: Suma de los primeros 25 números]]
 +
** [[#Ejercicio_Número_aleatorio_entre_1_y_15|2.3 Ejercicio: Número aleatorio entre 1 y 15]]
 +
* [[#Iteración_do-while|3. Iteración do-while]]
 +
** [[#Ejercicio_Modificar_el_ejercicio_anterior|3.1 Ejercicio: Modificar el ejercicio anterior]]
 +
** [[#Ejercicio_Programa_para_rellenar_bonoloto|3.2 Ejercicio: Programa para rellenar bonoloto]]
 +
** [[#Ejercicio_Tabla_ASCII|3.3 Ejercicio: Tabla ASCII]]
 +
** [[#Ejercicio_Generar_contraseña|3.4 Ejercicio: Generar contraseña]]
 +
* [[#Iteración_for|4. Iteración for]]
 +
** [[#Estructura_for|4.1 Estructura for]]
 +
** [[#Condición_en_el_for|4.2 Condición en el for]]
 +
** [[#Ejemplo_Forzado_y_Condición_vacía|4.3 Ejemplo: Forzado y Condición vacía]]
 +
** [[#Expresión_actualizar|4.4 Expresión actualizar]]
 +
</div>
 +
</div>
 +
===Introducción===
 +
En este tema aprenderemos tres estructuras de control que permiten repetir bloques de código:
 +
#'''while''': Repite un bloque mientras una condición sea verdadera.
 +
#'''do...while''': Similar al ''while'', pero asegura que el bloque se ejecute al menos una vez.
 +
#'''for''': Útil cuando conocemos de antemano el número de iteraciones necesarias.
 +
 +
*Empecemos por  la estructura '''while''', explicando su funcionamiento básico y resolviendo ejercicios prácticos.
 +
 
===Iteración while===
 
===Iteración while===
*Como en todos los bucles debemos siempre tener encuenta
+
Un bucle '''while''' repite un bloque de código mientras una condición sea verdadera. Para evitar errores, debemos prestar atención a tres aspectos fundamentales:
#inicializar la variable de control
+
# '''Inicializar la variable de control''' antes de entrar en el bucle.
#actualizarla correctamente dentro del bucle
+
# '''Actualizar la variable de control''' dentro del bucle para evitar bucles infinitos.
#realizar de forma correcta la evaluación de condición (< o <=), (> o >=), ...
+
# '''Realizar correctamente la evaluación de la condición''' utilizando operadores de comparación (''<'', ''<= '', ''>'', ''>= '', ...).
 +
;Sintaxis
 +
<source lang=php>
 +
while (expresion_booleana){
 +
  //instrucciones del bloque
 +
}
 +
</source>
 +
{{MRM_Puntos clave|title=estructura repetitiva|
 +
;Estructura repetitiva:
 +
<source lang=php>
 +
//Inicializamos variables de la condición
 +
$contador = 0;
 +
 
 +
//Establecemos la condición cuidando mucho
 +
//los extremos (< o <= ...)
 +
while ($contador < 10){
 +
 
 +
    //Actualizamos la variable dentro del bucle
 +
    $contador ++ //comentar este operador
 +
 
 +
    //Realizamos las acciones
 +
    echo "Estoy en la interación $contador<br />"
 +
 
 +
}
 +
</source>
 +
}}
 +
 
 
{{MRM_Actividad|Title=Uso de while|
 
{{MRM_Actividad|Title=Uso de while|
*Mostrar la suma de los primeros 100 números naturales
+
* Mostrar la suma de los primeros 25 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)
+
* 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ª, ...
+
* Cada iteración debe aparecer en numeración ordinal con el símbolo ª (por ejemplo, 1ª, 2ª, ...).
 +
* Al final mostraremos el total
  
 
{{Plegable|hide|Posible solución|
 
{{Plegable|hide|Posible solución|
 
 
<source lang=php>
 
<source lang=php>
    <?php
+
<?php
    $i = 0;
+
//Inicializamos variables
    while ($i < 100) {
+
//establecemos el bucle con la condición de iteración
        $suma+=$i;
+
while ($i < 25) {
        $i++;
+
<?php
        echo "iteracción  {$iSuma $suma<br />";
+
<?php
     }
+
$contador = 0;
     ?>
+
$suma =0;
 +
 
 +
while ($contador < 25) {
 +
//mantenemos la informaicón para poder
 +
// mostrar lo que estamos haciendo en cada interación
 +
$suma_anterior = $suma;
 +
 
 +
//Actualizamos la suma
 +
$suma = $suma_anterior+$contador;
 +
 
 +
 
 +
echo "En la interación {$contador:  <span style='color:blue'>$suma_anterior + $contador =  $suma</span><br />";
 +
     //Muy importante actualizar la variable de control
 +
     //Lo he de hacer al final para que sume desde el 0 al 24 que son
 +
    //los primeros 25 números
 +
    $contador ++;
 +
}
 +
//Mostramos mensaje al final
 +
echo "<h1> La suma total de los primeros 25 números es $suma</h1>";
 +
 
 +
?>
 +
}
 +
//Mostramos la suma total
 +
?>
 
</source>
 
</source>
}}
 
 
}}
 
}}
  
 +
 +
}}
  
 
{{MRM_Actividad|Title=Uso de while|
 
{{MRM_Actividad|Title=Uso de while|
Línea 30: Línea 112:
 
*Podría ser que el número nos salga el primero en cuyo caso no habrá ningún mensaje
 
*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
 
*Mostramos cuantos números se han generado y la suma de los mismos
 +
{{Plegable|Hide|Posible solución|
 +
<source lang=php>
 +
<?php
 +
//Generamos un número aleatorio entre 1 y 15.
 +
//Establecemso un contador
 +
//para ver cuántas veces intermos
 +
 +
//Establemos el bucle
 +
while ($num !=13){
 +
}
 +
//Mostramos la información final
 +
?>
 +
</source>
 +
}}
 +
<!--
 +
{{Plegable|Hide|Posible solución|
 +
<source lang=php>
 +
<?php
 +
//Generamos un número aleatorio entre 1 y 15.
 +
$num = mt_rand(1,15);
 +
//Establecemso un contador
 +
//para ver cuántas veces intermos
 +
$cont=1;
 +
while ($num !=13){
 +
  //actualizamos el contador
 +
  $cont++;
 +
  //mostramos el número
 +
  echo "<h1>El numero es $num</h1>";
 +
  //actualizamos el número
 +
  $num = mt_rand(1,15);
 +
}
 +
//Mostramos la información final
 +
echo "<h1>Por fin el 13 en $cont veces</h1>";
 +
?>
 +
</source>
 +
}}
 +
-->
 
}}
 
}}
  
 +
<br />
  
}}
 
  
 +
 +
{{BotonIndice
 +
|enlace=#Tabla_de_Contenidos
 +
|texto=Volver al índice
 +
}}
 
<br />
 
<br />
  
Línea 40: Línea 164:
 
*Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
 
*Este tipo de bucle donde seguro que al menos se ejecuta un iteracción
 
*Respecto al anterior nos ahorra una comparación.
 
*Respecto al anterior nos ahorra una comparación.
{{MRM_Actividad|Title=Usando do-while|
+
*La sintaxis de esta estructura es la siguiente:
*Modifica el ejercicio anterior usando un do-wile
+
<source lang=php>
*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,
+
do {
 +
  //Acciones
 +
}while (expresión_booleana);
 +
</source>
 +
{{MRM_Puntos clave|
 +
*La condición va al final de la estructura
 +
*Observa que lleva un punto y coma al final
 +
*El conjunto de las  instrucciones del bloque se ejecuta al menos una vez
 +
*El bloque se ejecuta '''mientras se cumpla la condición'''
 
}}
 
}}
{{MRM_Actividad|Title=Usando do-while|
 
;Programa para rellenar una bonoloto
 
*Generamos 5 valores aleatorios de 1 a 50 diferentes
 
*Los motramos por pantalla
 
{{Plegable|hide|Posiblesolucion|
 
<source lang=php>
 
 
 
$n1 = 72;
 
$n2 = 15;
 
$n3 = $n1&$n2;
 
echo "<h1> $n1 or a nivel de bits $n2 es $n3</h1>";
 
printf ("<h1> %b or %b es %b</h1>", $n1, $n2, $n3);
 
  
 +
{{MRM_Actividad|Title=Ejemplo de uso|
 +
;Generar un número hasta que salga el 13
 +
;mostrar las veces que hemos tenido que generar número
 +
{{Plegable|hide|buscando un número|
 +
<source lang=php>
 +
<?php
 +
$contador =1;
 
do{
 
do{
      
+
     $num=rand(1,100);
}while (                      )
+
    $contador++;
$n1 = rand(1, 50);
+
}while($num!=13);
  
do {
+
echo "<h1>Hemos tirado $contador veces</h1>";
    $n2 = rand(1, 50);
+
?>
} while ($n2 == $n1);
+
 
+
 
+
do {
+
    $n3 = rand(1, 50);
+
} while (($n3 == $n1) OR ($n3 == $n2));
+
 
+
do {
+
    $n4 = rand(1, 50);
+
} while (($n4 == $n1) OR ($n4 == $n2)OR ($n4 == $n3));
+
 
+
do {
+
    $n5 = rand(1, 50);
+
} while ($n5 == $n1 || $n5 == $n2 || $n5 == $n3 || $n5 == $n4);
+
 
+
echo "<h1>Los números generados $n1-$n2-$n3-$n4-$n5</h1>";
+
 
</source>
 
</source>
 
 
}}
 
}}
 +
}}
 +
;Ejercicios
 +
{{MRM_Actividad|Title=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,
 
}}
 
}}
  
{{MRM_Actividad|Title=Generar tabla ascii|
+
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/Bonoloto}}
;Programa para generar una tabla ascii con caracteres desde el 0 hasta el 127
+
;Intentamos generar la tabla html
+
<source lang=php>
+
</source>
+
  
}}
+
 
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/TablaAsciiCompleta}}
  
 
{{MRM_Actividad|Title=Generar una password|
 
{{MRM_Actividad|Title=Generar una password|
Línea 103: Línea 214:
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
//Parte fija
 
 
$password = "";
 
for ($n = 0; $n < 2; $n++) {
 
    $rango = rand(0,2);
 
    $caracter = match ($rango) {
 
        0 => rand(33, ord('0')),
 
        1 => rand(ord('9'), ord('A')),
 
        2 => rand(ord('Z'), 126),
 
    };
 
    $password .= chr($caracter);
 
}
 
 
for ($n = 0; $n < 6; $n++) {
 
    $caracter = rand(34, 126);
 
    $password .= chr($caracter);
 
}
 
echo "<h1>$password</h1>";
 
$password = str_shuffle($password);
 
 
echo "<h1>$password</h1>";
 
//Parte común
 
  
  
Línea 148: Línea 237:
 
</source>
 
</source>
  
 
+
{{MRM_Puntos clave|Title=Partes de la estructura|
 
+
 
;Estructura for
 
;Estructura for
 
*tiene tres partes
 
*tiene tres partes
;expresion_inicial:
+
;1.- expresion_inicial:
:Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables
+
:Se ejecuta una sola vez al comienzo del bucle. se usa para '''inicializar variables''''
;condición
+
;2.-condición:
:Es una expresión booleana que se evalúa en cada interacció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 da un valor false, ya no se ejecuta ninguna vez
:Si no hay expresión se toma como true
+
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
+
  En este caso para que el bucle no sea infinito
;Incremento de la expresión inicial
+
  deberá llevar algún break (instrucción de terminación de bloque)
 +
  en algún momento
 +
;3.-Incremento de la expresión inicial
 
:Marca el paso o cómo se va modificando la variable de control en cada iteración
 
:Marca el paso o cómo se va modificando la variable de control en cada iteración
 +
}}
 +
{{MRM_Actividad|Title=Ejemplo de la estructura|
 +
*Realiza la suma de los 100 primeros números
 +
<source lang=php>
 +
//Inicializamos la variable
 +
//que contendrá el total
 +
$suma =0;
 +
//Desde $numero = 0 y mientras  $numero sea menor que 100
 +
//Incrementando en cada iteración número en una unidad
 +
for ($numero=0;$numero<100;$numero++){
 +
    //realizo la suma con el valor de $numero
 +
    $suma = $suma + $numero;
 +
}
 +
echo "<h2>La suma de los 100 primeros números es $suma</h1>";
 +
</source>
 +
}}
 +
<br />
 +
*Esta estructura se usa con mucha frecuencia
 +
{{MRM_Puntos clave|Title=Cuándo usarla|
 +
;Siempre que sepamos en número de veces que vamos a realizar una acción usaremos esta estructura
 +
}}
 +
 +
;Ejercicios
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/Dados}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/TablaAsciiCompleta}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/SistemaNumerico}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/TablaMultiplicarCompleta}}
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
 +
<!--
  
 
;Estructura for: condición
 
;Estructura for: condición
Línea 196: Línea 323:
 
     ?>
 
     ?>
 
</source>
 
</source>
 +
-->

Última revisión de 20:56 27 nov 2024

Índice de contenidos

Introducción

En este tema aprenderemos tres estructuras de control que permiten repetir bloques de código:

  1. while: Repite un bloque mientras una condición sea verdadera.
  2. do...while: Similar al while, pero asegura que el bloque se ejecute al menos una vez.
  3. for: Útil cuando conocemos de antemano el número de iteraciones necesarias.
  • Empecemos por la estructura while, explicando su funcionamiento básico y resolviendo ejercicios prácticos.

Iteración while

Un bucle while repite un bloque de código mientras una condición sea verdadera. Para evitar errores, debemos prestar atención a tres aspectos fundamentales:

  1. Inicializar la variable de control antes de entrar en el bucle.
  2. Actualizar la variable de control dentro del bucle para evitar bucles infinitos.
  3. Realizar correctamente la evaluación de la condición utilizando operadores de comparación (<, <= , >, >= , ...).
Sintaxis
 while (expresion_booleana){
   //instrucciones del bloque
 }


Icon key points.gif

Puntos clave

Estructura repetitiva
//Inicializamos variables de la condición
$contador = 0;
 
//Establecemos la condición cuidando mucho
//los extremos (< o <= ...)
while ($contador < 10){
 
     //Actualizamos la variable dentro del bucle
     $contador ++ //comentar este operador
 
     //Realizamos las acciones 
     echo "Estoy en la interación $contador<br />"
 
}




Icon activity.jpg
Uso de while
  • Mostrar la suma de los primeros 25 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 debe aparecer en numeración ordinal con el símbolo ª (por ejemplo, 1ª, 2ª, ...).
  • Al final mostraremos el total






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
Posible solución
<?php
//Generamos un número aleatorio entre 1 y 15.
//Establecemso un contador 
//para ver cuántas veces intermos
 
//Establemos el bucle
while ($num !=13){
}
//Mostramos la información final
?>







 Volver al índice


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.
  • La sintaxis de esta estructura es la siguiente:
do {
  //Acciones
}while (expresión_booleana);


Icon key points.gif

Puntos clave

  • La condición va al final de la estructura
  • Observa que lleva un punto y coma al final
  • El conjunto de las instrucciones del bloque se ejecuta al menos una vez
  • El bloque se ejecuta mientras se cumpla la condición




Icon activity.jpg
Ejemplo de uso
Generar un número hasta que salga el 13
mostrar las veces que hemos tenido que generar número



Ejercicios


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,




Ejercicio 19: Genera Números de Bonoloto



Icon activity.jpg
  • Generamos 5 números para la bonoloto
  • Importante es asegurar que los números no se puedan repetir
  • Puedes usar este css para los estilos




Ejercicio 19 :Genera una tabla ASCII completa



Icon activity.jpg
Ejercicio 19 :Genera una tabla ASCII completa
  • Creamos una tabla ascii, desde el 33 hasta el 126 código
  • Puedes (debes) usar estas funciones (una de ellas, o prueba a hacerlo con las dos)
chr($numero) //retorna el carácter en ascii del código que se pasa como argumento
printf ("%d - %c", $numero, $numero); //Esta función
                       // visualiza con formato decimal (%d) y carácter  (%c), 
                       //los valores pasados como últimos argumentos
  • Genera la salida en una tabla html
  • Intenta dar un número de columas (por ejemplo 6 columnas






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



Icon key points.gif

Partes de la estructura

Estructura for
  • tiene tres partes
1.- expresion_inicial
Se ejecuta una sola vez al comienzo del bucle. se usa para inicializar variables'
2.-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
3.-Incremento de la expresión inicial
Marca el paso o cómo se va modificando la variable de control en cada iteración




Icon activity.jpg
Ejemplo de la estructura
  • Realiza la suma de los 100 primeros números
//Inicializamos la variable 
//que contendrá el total
$suma =0;
//Desde $numero = 0 y mientras  $numero sea menor que 100
//Incrementando en cada iteración número en una unidad
for ($numero=0;$numero<100;$numero++){
    //realizo la suma con el valor de $numero
    $suma = $suma + $numero;
}
echo "<h2>La suma de los 100 primeros números es $suma</h1>";




  • Esta estructura se usa con mucha frecuencia


Icon key points.gif

Cuándo usarla

Siempre que sepamos en número de veces que vamos a realizar una acción usaremos esta estructura



Ejercicios


Icon activity.jpg
  • Simula tirar un dado 100,000 veces.
  • Cuenta cuántas veces aparece cada número (1-6).
  • Prueba a hacerlo tanto con rand como con mt_rand.
  • Puedes mostrar el resultado usando las imágenes de dados para darle un aspecto más visual:




Ejercicio 19 :Genera una tabla ASCII completa



Icon activity.jpg
Ejercicio 19 :Genera una tabla ASCII completa
  • Creamos una tabla ascii, desde el 33 hasta el 126 código
  • Puedes (debes) usar estas funciones (una de ellas, o prueba a hacerlo con las dos)
chr($numero) //retorna el carácter en ascii del código que se pasa como argumento
printf ("%d - %c", $numero, $numero); //Esta función
                       // visualiza con formato decimal (%d) y carácter  (%c), 
                       //los valores pasados como últimos argumentos
  • Genera la salida en una tabla html
  • Intenta dar un número de columas (por ejemplo 6 columnas




Ejercicio 19 :Sistemas numéricos



Icon activity.jpg
  • Creamos una tabla con los la representación de sistemas numéricos
  • Mostraremos en binario, octal, hexadecimal y decimal
  • Los números desde el 0 hasta el 50



Ejercicio 19 :Tabla de multiplicar completa



Icon activity.jpg
  • Creamos una tabla con las multiplicaciones
  • La imagen muestra el objetivo que pretendemos:

Tabla multiplicar.png