A practicar

A practicar con arrays y estructuras FOR y FOREACH

A practicar Desarrollo

De nuevo en la sección A practicar… donde buscamos poner en práctica los conocimientos que vamos adquiriendo. En este nuevo reto vamos a practicar con arrays pero, antes, veamos la solución al ejercicio del artículo anterior.

Solución al reto anterior

El reto era sencillo en su definición. Pedíamos la creación de un programa que, dado un número, nos dijera si es o no primo. Comenzamos viendo primero la solución:

<?php

$numero_a_revisar = 17;

$es_primo = true;
$divisor = 2;
while ($divisor < $numero_a_revisar && $es_primo) {
	if ($numero_a_revisar % $divisor === 0) {
		$es_primo = false;
	}
	$divisor++;
}

if ($es_primo) {
	echo 'El número ' . $numero_a_revisar . ' es primo';
} else {
	echo 'El número ' . $numero_a_revisar . ' no es primo';
}

?>

Como veis, no es algo muy largo. Vemos que, en la línea 3, colocamos el número que queremos comprobar si es primo o no. En el ejemplo hemos puesto el 17, que sabemos que es primo. Posteriormente, en la línea 5 inicializamos una variable de nombre $es_primo con valor verdadero, suponiendo de inicio que nuestro número sea primo. Y en la línea 6 tenemos a nuestro primer divisor, una variable de nombre también $divisor que nos servirá para ir dividiendo al número a revisar.

Utilizando el bucle WHILE

¿Y cómo lo hacemos? Pues mediante un bucle WHILE que se repetirá teniendo en cuenta esa doble condición. Por un lado, el divisor tiene que ser siempre menor al número que estamos comprobando. No tiene sentido que comprobemos si 18 puede dividir al 17, ni tampoco que el propio 17 pueda dividirse a él mismo, pues ésa no es la definición de número primero. La segunda condición es que el bucle se siga ejecutando mientras sigamos suponiendo que es primo, es decir, la variable $es_primo siga siendo verdadera. ¿Para qué hacemos ésto? Pues nos servirá para, cuando encuentre que el número no es primo, parar el bucle.

Dentro del bucle tenemos un IF que comprueba si el módulo (que, recordemos, era el resto de la división) sea igual a cero. Si la condición se cumple, es decir, si el módulo (resto) es igual a cero es que el número no es primo, puesto que hemos encontrado un número que es divisor exacto. Por tanto, entramos dentro del IF y cambiamos nuestra variable $es_primo a falso. Ahora, en la próxima iteración del bucle, como esta variable ya no es verdadera la condición del WHILE no se cumple y no continuará comprobando números. Es decir, que si vamos a comprobar el número 100, por ejemplo, en la primera iteración cuando se divida por 2 y veamos que no es primo, ya no seguirá comprando el 3, 4, 5, 6, etc.

Antes de terminar el bucle, incrementamos el valor de $divisor para que compruebe el siguiente número. Y, una vez finalizado el bucle, mediante un IF le mostramos al usuario si es primo o no lo es. Pensemos que, si es primo, nunca llegará la variable $es_primo a ser falsa en toda la ejecución del bucle.

Una pequeña traza

Con el número 17 que hemos puesto, entraríamos en el bucle, comprobaríamos 17 dividido entre 2 y nos daría resto 1. Seguimos pensando que es primo. Pasamos a dividir 17 entre 3 con resto 2, luego 17 entre 4, luego 17 entre 5… hasta llegar a 17 entre 16. El bucle ha terminado cuando $divisor tiene el valor 17 y $es_primo sigue siendo verdadero. Nuestro número es primo.

Con el 25, por ejemplo, entraríamos, comprobaríamos 25 entre 2 y tendríamos de resto un 1. Vale, puede que sea primo. Seguimos dividiendo ahora 25 entre 3 y tenemos también de resto un 1. Continuaríamos con 25 dividido entre 4, también con resto 1. Pero al llegar a 25 entre 5 tendríamos un resto 0, colocaríamos $es_primo a falso y la condición del WHILE no se cumpliría. En conclusión, que nuestro 25 no es primo.

Podemos poner cualquier número pero pensemos un poco antes de poner un número extremadamente grande. Ni el lenguaje está preparado para números enormes, como vimos en su artículo, ni es posible que tuviéramos capacidad de procesamiento para saber el resultado de un número primo extremadamente grande. De hecho, el cálculo de números primos es una apasionante rama de la computación actual.

Siguiente reto

Entramos ya de lleno en la construcción de estructuras de control FOR y FOREACH para practicar con arrays también. Nuestros programas se van complicando cada vez un poco más, pero nos van siendo de cierta utilidad. Vamos con el reto:

A practicar 1.0.4

Queremos construir un programa donde tengamos la agenda de la semana y podamos consultar ciertos elementos de la misma para así practicar con arrays.

Para ello, inicialmente debemos construir un array que contenga elementos para los siete días de la semana mediante índices no numéricos. En cada día guardaremos nuestras actividades numéricamente. Cada una de estas actividades tendrán definidas la descripción y la hora en que ha de realizarse (guardada como un string puesto que todavía no hemos visto cómo trabajar con fechas y horas).

Deberemos rellenar nuestro array con algunas actividades de ejemplo, las que queráis pero, como mínimo, debe haber una actividad cada día para simplificar y no tener que ir comprobando si algún día está vacío (veremos estas cosas en el futuro).

Definido nuestro array, vamos a pedir que se nos muestren por pantalla dos consultas. En la primera, debemos mostrar la primera hora de la actividad de cada día indicando el día de la semana que es textualmente. La segunda consulta debe mostrarnos todas las actividades que se realizan el día que vosotros queráis (ese día que tenga, al menos, dos actividades) recorriendo todos los días hasta encontrar el que buscáis y finalizando el bucle a continuación sin seguir buscando.

Recordad que podéis testear el código en sitios como phptester y que podéis dejar vuestras dudas o resultados en los comentarios. Para ello, antes debéis registraros. ¡Empecemos a practicar con arrays y estructuras iterativas!

Deja una respuesta