TUTORIAL PHP & MYSQL - 4. Kata FizzBuzz
Hola, propongo en mi primer tutorial sobre PHP un juego obtenido de una página web en inglés. Si aún no has visitado los tutoriales anteriores a éste, recomiendo que les eches un vistazo, que nunca está de más:
- PHP & MySql – 1. Introducción.
- PHP & MySql – 2. Tabla de Multiplicar Dinámica.
- PHP & MySql – 3. Métodos GET y POST.
Con este juego aprenderemos a:
- Usar estructuras if...elseif...else.
- Usar operadores lógicos, como "or".
- Usar el operador aritmético del módulo "%".
- Además, haremos uso de bucles for, ya explicados en el tutorial 2 de PHP
Procedo en primera instancia a explicar de qué va el juego: hay que hacer un programa que escriba todos los números del 1 al 100 pero con una condición, si el número es divisible por 3, el programa ha de devolver Fizz en lugar del número, si lo es entre 5, debe devolver Buzz, y si lo es entre 3 y 5, FizzBuzz.
Pues vamos a empezar con el reto: lo primero que haremos será fijarnos bien en lo que nos piden, hay que imprimir los 100 primeros números naturales, algo que hay que hacer (por ejemplo) a través de un bucle si no quieres que se convierta en una ardua tarea. De esta manera empezaremos escribiendo:
for($i = 1; $i <= 100; $i++){ }
Que es un bucle for normal y corriente, del de toda la vida. Este for (con una sentencia echo en su interior) lo que hará será imprimir todos los números del 1 al 100. Bien, ahora lo que queremos es que conforme se vayan recorriendo estos números haya algo que “saque” si son divisibles entre 3, entre 5 o entre ambos, lo que haremos mediante la estructura if…elseif…else. Pero primero veamos cómo funciona esta estructura, fuera de este ejemplo:
Estructura If
En PHP, como en muchos lenguajes de programación, la estructura if o condicional tiene la siguiente forma:
If($condicion){ //Instruccion; }
Lo que significa que si se cumple la condición que hay dentro de los paréntesis de if, se lleva a cabo la instrucción entre llaves, pero ¿y si queremos que controle también el caso de que no se cumpla esa condición?
Estructura If…else
If($condicion){ //Instrucción; }else{ //Instrucción2; }
Pues bien sencillo, con un else, si no se cumple la condición de propuesta, se irá a la instrucción que hay dentro del else, y ésta se ejecutará necesariamente.
Con estos conocimientos del If…else ya estaríamos capacitados para llevar a cabo la kata FizzBuzz, pero voy a explicar algo que te vendrá muy bien y que te ahorrará muchos dolores de cabeza.
Estructura If…elseif
If($condicion){ //Instruccion }elseif($condicion2){ //Instruccion2 }elseif($condicion3){ //Instruccion3 }else{ //Instrucción4 }
Elseif funciona como si de una cadena de Ifs anidados se tratase, si no se cumple la condición 1, se comprueba la 2, si ésta tampoco se cumple, se comprueba la 3, y así sucesivamente. En caso de que no se cumpla ninguna de las anteriores el programa ejecuta lo que hay dentro del else (si es que hay, que no es completamente necesario). Hay otras formas de crear estructuras de control como esta, ya sea por medio de switch…case, etc, pero considero que esta es la más usada y por tanto la primera que se ha de explicar.
Otra cosa que debemos saber hacer antes de ponernos con el reto FizzBuzz es cómo saber si un número es divisible por 3 o por 5, es algo muy sencillo y que no nos va a llevar demasiado tiempo: para esto se usa el operador módulo (%), que te da, explicado rápidamente, el resto de la división entre dos números:
$a = 6; $b = 3; $resto = $a % $b;
Para este ejemplo se han cogido dos números que se han almacenado en dos variables, más tarde se le ha asignado a la variable $resto la operación módulo entre $a y $b, que dará 0 (el resto en la división entre 6 y 3 es cero). Nótese que esta operación no es conmutativa, algo que sí pasa en la suma, por lo tanto has de tener mucho cuidado para obtener los resultados que esperas. A través de este operador podremos saber si un número es divisible por otro, basta con ver el resto: si éste es cero, es divisible, si es distinto de cero, no. Para más información acerca de este operador aritmético, visita la documentación oficial de PHP.
Ahora sí estamos preparados para empezar el reto: volvemos al bucle for que había al principio, y queremos que el servidor compruebe cada número para saber entre qué es divisible. Haremos uso del if, si es divisible entre 3 y entre 5, imprimiremos FizzBuzz, si lo es solo entre 3 (elseif), imprimiremos Fizz; si lo es solo entre 5 (elseif), Buzz, y si no es divisible ente ninguno de ellos (else), imprimiremos el número.
Así quedaría el código completo:
for($i = 1; $i <= 100; $i++){ if($i % 3 == 0 && $i % 5 == 0){ echo "FizzBuzz "; }elseif($i % 3 == 0){ echo "Fizz "; }elseif($i % 5 == 0){ echo "Buzz "; }else{ echo $i . ""; } }
Creo que el código se explica por sí solo, en el primer if se hace uso de el operador lógico “and”, aquí escrito como && para saber si es divisible entre ambos números, en los siguientes elseif se hace lo mismo con los dos números solo y el else se usa como vía de salida, si las demás no se han cumplido.
Propongo otro reto como “deberes” para aquellos que queráis afianzar conocimientos, considerad además, que se pone Fizz cuando el número incluye un 3 en sí, y se pone Buzz si incluye un 5 o si es divisible entre 5. Dejo aquí la solución que yo di hace un tiempo para que podáis ver si habéis hecho esto (en cuyo caso estaría bien), o si habéis hecho algo distinto y que también funciona.
En el próximo tutorial aprenderemos a usar bucles do…while. Si tenéis dudas podéis contactar conmigo a través de twitter @tuzine_es o a través de los comentarios.
Saludos.