Desde los tiempos de Euclides (300 a. de C.) se sabe que existen infinitos números primos. Los primeros algoritmos para encontrar números primos también proceden de la época de los antiguos griegos, como la «criba de Eratóstenes». Desde entonces ha pasado mucho tiempo, pero aún se sigue investigando en este campo. Por ejemplo, en el año 2004 se creó otro algoritmo que mejora el anterior llamado «criba de Atkin».
La generación de números primos es una herramienta muy interesante en campos como la criptografía, donde algunos algoritmos como el RSA usan números primos de valores altos como base para realizar el cifrado.
2.10.2.2. Código
En este ejemplo se optará por un algoritmo que sea lo más sencillo posible, consistirá en hacer un barrido de números empezando por el dos hasta el límite indicado por el usuario, es decir, se recorrerán los números 2, 3, 4, 5, 6, 7, 8… Para cada número se volverá a hacer un barrido hasta encontrar un número que sea divisor del primero. Si estos dos números son iguales significa que el único divisor de este número es él mismo, por lo tanto es un número primo. En la figura 2-33 puede verse un diagrama de flujo de este algoritmo. Nótese que en este algoritmo, al igual que en muchos otros, se obvia el número uno.
El código para implementar este algoritmo con el nodo FORMULA es exactamente igual que en lenguaje C. En primer lugar, se declararán las variables y, a continuación, se usan dos bucles FOR, uno para cada barrido.
Para determinar si un número es divisor del otro, se comprobará si el resto de la división entre ambos es igual a cero. Finalmente, los números primos encontrados se almacenan en un array.
Figura 2-33. Algoritmo para la obtención de números primos.
Figura 2-34. Implementación del algoritmo en un VI.
2.10.2.3. Resultado
La figura 2-35 muestra un array con los números primos que hay entre dos y quince como resultado de la ejecución del programa anterior.
Figura 2-35. Números primos obtenidos.
En este ejemplo se han aprendido dos cosas: en primer lugar a usar el FORMULA NODE, y en segundo lugar a darse cuenta de que, a pesar de su nombre, esta estructura no sólo sirve para introducir fórmulas matemáticas sino que también se pueden emplear en ella elementos de un lenguaje de programación como bucles, funciones, etc.
2.10.3. Ejemplo III: Bingo
2.10.3.1. Explicación teórica
En esta ocasión se desea realizar un programa que genere un cartón para jugar al bingo. Para esto se necesita crear una matriz o array de dos dimensiones que contenga valores aleatorios entre 1 y 100. Habrá diez columnas (una para cada decena) y cuatro filas.
2.10.3.2. Código
El programa principal tiene la típica estructura de un WHILE y un EVENT.
El evento que se muestra en la figura 2-36 corresponde al cambio de valor de un botón llamado cartón. Este botón tiene por acción mecánica Latch When
Released (se verá en el próximo capítulo). Cuando se presiona el botón se ejecutará el subdiagrama.
Para generar un cartón se necesitan dos bucles; el primero recorrerá cada una de las decenas. Como la cantidad de ejecuciones es conocida, se usará un FOR. Dentro de este bucle habrá otro; este segundo bucle será un WHILE, y en él se generarán números de forma aleatoria entre dos límites, límites que sirven para acotar los números dentro de la decena correspondiente.
La función Random Number (en Programming > Number) devuelve números entre el 0 y el 1. Para generar números enteros se multiplicará por 10 y se sumará el límite inferior; el valor resultante se aproxima al entero superior. En caso de que el número ya haya sido generado antes se descartará; si no había sido generado, se almacenará en un array. Para detectar si el número ya se había generado, se busca dentro del array si algún valor coincide con el nuevo mediante Search 1D Array (en Programming > Array). Si no había ninguno, la salida de esta función contendrá el valor «-1» y se ejecutará el diagrama mostrado en el CASE. Para cualquier otro número se ejecutará el caso por defecto que simplemente deja pasar el array de la entrada a la salida.
Cuando se han generado cuatro números, se detiene el WHILE, se ordenan los números del array con Sort 1D Array y se pasa a la siguiente decena.
Después de recorrer todas las decenas, en la salida indexada del FOR se habrá generado un array de dos dimensiones con los números de un nuevo cartón.
La estructura EVENT contiene otro subdiagrama para cuando se presione el botón Stop. Este subdiagrama únicamente contiene una constante booleana con el valor TRUE cableada a la condición del WHILE principal. Puede pensarse que sería más sencillo dejar vacío este caso y cablear directamente el botón de Stop a la condición, pero no es recomendable porque, como se ha explicado en la sección 2.5, esto provocaría que la condición del bucle se evaluara antes de presionar el botón, con lo que el valor que tiene en ese instante obligaría a ejecutar otra iteración más.
Figura 2-36. VI para la generación de cartones para jugar al bingo.
2.10.3.3. Resultado
En la figura 2-37 puede verse un cartón de bingo generado con el programa de este ejemplo. Cada vez que se presione el botón Cartón, se generará un nuevo cartón.
Figura 2-37. Cartón obtenido de la ejecución del VI.
Este ejemplo muestra el uso de las estructuras EVENT, WHILE, FOR y CASE. Por una parte, se ha visto cuándo se debe usar FOR (con un número de ejecuciones conocido) y cuándo WHILE (cuando no hay un número determinado de ejecuciones); también se ha visto el uso de la estructura EVENT y el típico problema del botón de Stop y, por último, se ha utilizado un CASE dejando un caso por defecto. En el próximo capítulo se explicarán más detalladamente los arrays.
2.11. Ejercicios
1. ¿A qué es equivalente el siguiente programa?
Figura 2-38. Ejercicio 1.
2. Realizar un programa que calcule el factorial de un número. Hacerlo primero con estructuras de repetición y luego con FORMULA NODE.
3. Realizar un programa que genere un array con el primer millón de números enteros mediante un bucle WHILE y un FOR. ¿Cuál es más eficiente? ¿Por qué?
4. Modificar el programa del ejemplo I para que también acepte imágenes a color.
5. Realizar mediante programación visual el mismo algoritmo que en el ejemplo II. Comparar ambos programas en términos de velocidad y espacio.
6. Añadir al evento del ejemplo III otro caso cuando se presione un botón llamado bola. El subdiagrama debe simular