Curso de PHP – Clase 10 – Resolución de ejercicios propuestos

Bienvenidos a la última clase de ejercicios propuestos de este Curso de PHP Básico. A continuación voy a resolver y a explicar los 7 ejercicios de la clase teórica anterior, dedicada exclusivamente al tema de Funciones.

El código fuente y el programa funcionando lo van a encontrar en cada una de las secciones dedicadas a cada ejercicio. No perdamos más tiempo y comencemos.

Ejercicio 1

Código fuente / Programa funcionando

Determinar si un año es bisiesto o no, no es algo que se nos pueda ocurrir fácilmente. Pensando quizás podramos encontrar cuál es el patrón que siguen los años en los cuales febrero tiene solo 28 días. Sin embargo, como programadores tenemos que tener la capacidad de investigar aquello que no sabemos.

De Wikipedia podemos extraer lo siguiente:

Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto.

Esta definición la podemos traducir fácilmente a una expresión y tendremos hecho gran parte del ejercicio.

Para determinar si un número es divisible por otro, debemos usar el operador resto de la división (%) y comparar su resultado con el número 0. Recuerden que este operador, como su nombre lo indica,  nos dice cuál es el resto de una división entera. Por lo tanto, si en una división entera no hubo resto, es porque fue exacta y eso significa que el dividendo es divisible por el divisor.

Completemos y traduzcamos la expresión de a poco hasta convertirla en código PHP.

  1. Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto.
  2. si es divisible entre 4, a menos que sea divisible entre 100. Si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto.
  3. divisible entre 4 y no divisible por 100, salvo que sea divisible por 400
  4. divisible entre 4 y (no divisible por 100 o divisible por 400)
  5. ($variable % 4 == 0) && ($variable % 100 != 0 || $variable % 400 == 0)

Y esa última línea en la secuencia de razonamiento es la expresión necesaria para utilizar en un if. Aclaro que esta no es la única forma de pensar cómo obtener la expresión, pero me pareció útil incluirla porque quizás alguno se pierda entre la definición de Wikipedia y lo que aparecerá a continuación en el código.

La función es realmente muy simple. Recibe un parámetro que deberá ser numérico y entero. No incluí validaciones para no complicar la explicación, pero pueden hacerlo si lo desean. Dentro de la función está el if con la expresión que deducimos. Si la condición se cumple el número representa un año bisiesto y se devuelve true.  Si no, el año no es bisiesto y se devuelve false.

Ejemplos de invocación de esta función son los siguientes:

 

Podemos aprovechar y usar la llamada dentro de un if y luego mostrar un mensaje, o hacer lo que necesitemos.

Salida:

 

Ejercicio 2

Código fuente / Programa funcionando

Este ejercicio es un clásico para los estudiantes de programación de cualquier lenguaje. Lo vamos a encarar acotándolo a números de 5 cifras para no hacerlo más complejo y para que resulte didáctico.

Lo único que debemos tener en cuenta es que el número que llega por parámetro no es un string sino un int. Esa es la única regla que debemos respetar y por supuesto, no tendría sentido convertir el número a un string, al menos para resolver este ejercicio. En la práctica pueden hacer lo que les resulte más eficiente y cómodo.

La manera de resolver este problema es ir descomponiendo el número que llega tomando siempre las unidades y luego reducirlo. La idea es la siguiente:

Tenemos, por ejemplo, el número 76534 que no es capicúa. Queremos quedarnos con las unidades. ¿Recuerdan de la escuela primaria las unidades, decenas y centenas? Bien, porque eso será justamente lo que usaremos. Para obtener la primera cifra (el 4) vamos a usar otra vez, al igual que en el ejercicio anterior, el resto de la división entera. Si a cualquier número que no sea múltiplo de 10 lo dividimos por 10, el resto será siempre la cifra que corresponde a las unidades. En este caso el 4. Piénsenlo. Si dividimos 25 por 10 y nos quedamos con el resto, obtendremos un 5. Si dividimos 39, obtendremos un 9 y así para cualquier otro número.

Luego de obtener ese primer número vamos a querer quedarnos con el siguiente utilizando el mismo método. Sin embargo no podemos dividir por 10 y si dividimos por 100, nos quedaremos con los dos últimos, sabiendo que uno ya lo tenemos. Lo que podemos hacer es reducir la totalidad del número dividiendo por 10 y redondeando hacia abajo.

Pensemos esto con un ejemplo. Tenemos nuevamente el número 76534. Ya obtuvimos el 4 con el resto de la división. Ahora queremos volver a usar el resto de la división pero para obtener el 3. Necesitamos que el 3 quede como primera cifra (contando desde la derecha). Si dividimos por 10 y obtenemos 7653,4. Luego descartamos los decimales y nos quedamos con 7653. Ahora, a este número le podemos hacer el resto de la división entera por 10 y nos quedamos con el 3.

Al tiempo que obtenemos las cifras de forma individual, las podemos ir guardando, en un array por ejemplo. Y luego, simplemente comparar si la última es igual a la primera y así sucesivamente.

Fácil ¿No? Si no lo terminan de entender, relean o sigan leyendo, quizás con el algoritmo que veremos a continuación les quede todo mucho más claro.

Veamos el código de la función pedida:

Recibimos el parámetro y creamos un array donde guardaremos las unidades que vayamos recolectando al ir descomponiendo el número original.

Como sabemos que el número tiene solo 5 cifras realizamos un bucle de 5 iteraciones (de 0 a 4) y en cada una de ellas nos vamos quedando con la última cifra que queda en $resto. Ese resto lo guardamos en el array $unidades. Luego, reducimos el número dividiéndolo por 10 y utilizando la función floor() de PHP que descarta los decimales de un número de coma flotante y lo convierte en entero.

Al salir del bucle, en $unidades quedan las cifras de $numero. En $unidades[0] tendremos la primera (contando de la derecha), en $unidades[1] la segunda y así sucesivamente.

Resta verificar si $numero es capicúa o no. Comparamos el primer número con el último y el anteúltimo con el segundo. El del medio nunca importa. Si son iguales, entonces el número es capicúa, si no, no. Devolvemos el valor que corresponde.

Este ejercicio puede plantearse de forma genérica, para números de n cifras. Es un buen ejercicio para pensar. Les recomiendo que lo piensen y traten de hacerlo.

Algo que me gustaría destacar es el nombre que tiene la función. Noten que incluida dentro de un if se comporta como si fuera una pregunta ¿es capicúa? Esta forma de definir nombre de funciones o de métodos en clases, hace que el código sea más legible por parte de los programadores. Recuerden que siempre que el resultado de la función sea true o false, conviene ponerle un nombre de este tipo.

Ejemplos de llamadas a esta función:

 

Ejercicio 3

Código fuente / Programa funcionando

La serie de Fibonacci es una conocida serie numérica que consiste en que cada número se forma sumando los dos anteriores de la serie. Si comenzamos con 0 y 1, el siguiente número será 1 porque 0+1=1, luego habrá que sumar los dos anteriores nuevamente, es decir, 1 + 1 = 2. A continuación, se procede de la misma forma con 1 + 2 = 3, luego 2 + 3 = 5 y así sucesivamente.

Realizar esta serie con un bucle es bastante fácil, pero en esta oportunidad se pide que se haga en forma recursiva. Es decir que vamos a tener que construir una función que en algún punto se llame a sí misma. Esta llamada puede realizarse de forma anidada varias veces hasta encontrar un punto en el cual la recursividad se corte y se devuelve un valor.

Vamos a realizar una función que vaya imprimiendo la serie de Fibonacci a medida que es llamada. Como esta serie no tiene fin, le pondremos un tope arbitrario de 100. No vamos a visualizar números que se pasen del 100.

Se reciben dos parámetros, que en la llamada que está abajo son 0 y 1. Lo primero que se encuentra en la función es una condición que se encarga de imprimir los dos primeros números por pantalla. Esto ocurrirá una única vez al comenzar.

Luego, se obtiene el nuevo elemento y se almacena en la variable $nuevo. Si el nuevo elemento de la serie es menor que 100, entonces se mostrará por pantalla y se llamará nuevamente a la función pasándole como parámetros el último que había llegado (es decir, el segundo parámetro) y el que se obtuvo como nuevo valor.

Si el nuevo elemento es mayor o igual a 100, entonces se devuelve null y no hay ninguna llamada a la misma función. Por lo tanto, la recursividad se corta.

Es decir, en cada llamada a la función imprimirFibonacci hay dos posibilidades: que se imprima un número y se vuelva a llamar o que no se imprima nada y no se llame más.

Salida

Ejercicio 4

Código fuente / Programa funcionando

El objetivo de este ejercicio es muy claro: aprender a utilizar la función func_get_args() de PHP. Pasemos rápidamente al código:

 

La función no tiene parámetros en su definición, sin embargo, puede recibirlos. La primera línea sirve para que la variable $parametros se convierta en un array con todos los parámetros que le pasemos. Luego lo que vamos a hacer es contar cuántos parámetros tiene y decidir qué hacer en cada caso. Para ello, nos apoyamos en una estructura de control condicional como es el if… elseif.

Como el enunciado pide, si hay dos parámetros hay que multiplicarlos. Eso es lo que se hace si se cumple la primera condición. Noten cómo se puede acceder a cada parámetro mediante índices numéricos en el array $parametros.

Si la cantidad de parámetros son 3, entonces lo que se hace es sumar cada uno de ellos.

Si la cantidad de parámetros es 4 ó más de 4, entonces lo que se hace es calcular el promedio de todos esos números. Para lograrlo, primero se acumula la suma de todos utilizando un foreach y luego se la divide por la cantidad de parámetros.

Cualquiera sea la operación a realizar, el resultado se devuelve en la última línea de la función.

Veamos ejemplos de invocación:

Salida:

 

Salida:

 

Salida

 

Ejercicio 5

Código fuente / Programa funcionando

Vamos a armar una función que reciba dos parámetros: la cadena de texto que debemos analizar y un array donde vamos a contar la cantidad de vocales que hay. El segundo parámetro lo pasaremos por referencia, a fin de poder modificarlo. El valor que devolverá esta función será la cantidad total de caracteres.

Como siempre, hay muchas formas de realizar este ejercicio, así que vamos a utilizar una lo más ingeniosa posible.

Al ingresar a la función, primero se inicializa el array con las vocales. Esto significa que este parámetro deberá pasarse vacío. Se crea una clave por cada vocal y se la inicializa en 0 porque la incrementaremos cada vez que encontremos una vocal.

Luego, con un bucle for se recorre la cadena de caracteres a inspeccionar. Se parte desde la posición 0 y se llega hasta la cantidad máxima de caracteres utilizando la función strlen de PHP, avanzando siempre de a uno. Dentro del bucle, lo primero que hay que hacer es chequear que la letra actual sea una vocal. Esto se puede hacer con otra función que lo verifique o directamente con un switch… case. Si lo resolvieron de esa forma, está bien. Sin embargo, considero más eficiente aprovechar el array que ya se tiene cargado con cada vocal.

Se usa la función array_key_exists para comprobar si la letra $cadena[$i] es una clave del array $vocales. Recuerden que esta función devuelve true si la clave existe y false si no. Si existe, se incrementará en 1 el valor de esa clave. Está claro que la clave solo va a existir si se trata de una vocal. Por ejemplo, si viene la letra “r”, array_key_exists devolverá false, por lo tanto no se incrementará nada. Si viene una “i”, array_key_exists devolverá true y la clave que se incrementará en 1 será $vocales[‘i’].

Al final del bucle se tendrán contabilizadas todas las vocales del string $cadena en el array $vocales.

Luego se devuelve la cantidad total de caracteres, usando de nuevo strlen. También se podría haber guardado en una variable esta cantidad y luego usarla para el tope del for y para devolverla al final.

Falta ver como se llama a la esta función.

Se define un string en la variable $texto. Este string será al que le contaremos las vocales. Inicializamos $misVocales como array. También podríamos haberla definido como null. Luego, se llama a la función contarCaracteres() enviando estas variables como parámetros.

Con el valor que devuelve la función, se puede imprimir por pantalla el mensaje que indica la cantidad de caracteres del string.

No hay que perder de vista que $misVocales pasa por referencia y se modifica dentro de la función. Esto quiere decir que luego de la llamada, ya se tienen las vocales contadas. Por lo tanto, es posible recorrer este array y mostrarlo. Las vocales están en las claves del array y las cantidades de cada una, en los valores. Se recorre con un foreach usando clave y valor y se muestra cada elemento por pantalla con un echo.

Salida

Ejercicio 6

Código fuente / Programa funcionando

En este ejercicio podemos volver a utilizar la función func_get_args().

Como habíamos hecho en el ejercicio 4, no ponemos parámetros en la definición de la función, pero luego utilizamos func_get_args para obtenerlos. En $params quedarán almacenados todos los parámetros que se le pasen a armarLista.

Después, lo que hay que hacer es tan simple como recorrer todos los valores e ir armando un string cuyo valor sea el de una lista en HTML. Por eso primero ponemos el <ul> y luego, al recorrer cada elemento, se añaden los <li> y </li> con el valor en el medio. Al terminar de recorrer, se agrega el cierre de la lista desordenada con </ul> y se devuelve el string armado.

El resultado es claramente una lista desordenada en HTML. La idea de este ejercicio es entender un poco cómo funciona algo que comúnmente se llama asistente o helper. Una función que sirve para que crear código HTML de forma más rápida y simple.

Veamos dos llamadas:

Cargamos los items y luego llamamos a la función. Imprimimos el valor de retorno y obtenemos la siguiente salida:

Salida:

  • Francia
  • Italia
  • Inglaterra
  • Portugal

Ahora veamos otra llamada

Igual que antes, cargamos valores en las variables de ítems y luego llamamos a armarLista. En este caso, directamente se imprime la salida. Esta es la forma clásica de utilizar un asistente de HTML.

Salida:

  • Los Angeles Lakers
  • Detroit Pistons
  • Utah Jazz
  • Chicago Bulls

Ejercicio 7

Código fuente / Programa funcionando

Aquí necesitamos que la función haga dos cosas: que nos diga si el menor de una serie desordenada de números es positivo o negativo y que nos devuelva ese valor. El enunciado nos guía y nos dice que el valor de retorno de la función debe ser boolean (true si es positivo, false si es negativo) y que el valor del menor debe poder ser guardado para que el programa invocante lo pueda acceder.

El primer parámetro de nuestra función obtenerMenor es un array con los valores entre los cuales hay que hallar el menor. La variable $menor, que comienza sin inicializar guardará el menor al finalizar al función. La primera línea de la función y el foreach que le sigue constituyen el algoritmo básico para obtener el mínimo de la serie de valores.

Debajo devolvemos true o false según corresponda.

Hasta aquí hemos cumplido con la mitad de la consigna. ¿Cómo hacemos para que el valor del menor quede almacenado en $menor y pueda ser accedido desde el programa invocante? Bueno, eso lo hacemos al definir los parámetros que recibe la función. Noten que hay un & delante de la variable $menor, lo que implica que este parámetro está siendo pasado por referencia. Cualquier cambio que se le haga dentro de la función repercutirá en el programa invocante.

Veamos una llamada

Definimos un array en $valores con distintos números. Luego se llama a la función obtenerMenor pasando ese array y una variable que será modificada dentro de la función. Sabemos que si el resultado es true, entonces el valor devuelto será positivo. Y si es false, negativo. También sabemos que en $valor, luego de la llamada quedará almacenado el más pequeño de todos los valores.

Final del curso de PHP Básico

Y hasta aquí hemos llegado con el Curso de PHP Básico. Quiero agradecerles a todos los que lo hayan seguido y disculparme por no haber podido mantener un período de publicación regular, como inicialmente había planificado.

Actualmente estoy armando dos proyectos asociados a cursos de PHP, pero aún están en etapa de planificacion.

  • Por un lado, recopilar y revisar este curso de PHP Básico. Quizás pueda publicar un PDF gratuito para que todo el mundo pueda acceder de forma libre a las 10 clases publicadas en El Replicante.
  • Por el otro, la parte que sigue a este curso. Quedaron muchos temas afuera. No me defino aún entre continuar con temas teóricos siguiendo con la programación estructurada o si introducir la programación orientada a objetos y explicarlos dentro de ese marco. En este momento estoy por decantarme más por lo segundo. Ya veremos.

Les agradezco una vez más y aprovecho la oportunidad de invitarlos a participar dejando comentarios, dudas o sugerencias para mejorar este espacio y el curso en particular.

 

Soy programador web y me desempeño como Líder Técnico en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.
 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


*