Creación de materiales didácticos Aplicaciones para dispositivos móviles Lección 3 Fundamentos de programación Introducción En el tema anterior hemos usado el App Inventor para crear algunas aplicaciones usando los siguientes pasos: 1. Primero, diseñamos la interfaz de usuario, añadiendo todos los elementos que tendrá nuestra ventana para interactuar con el usuario 2. Una vez que tenemos el diseño, añadimos la funcionalidad del programa usando el block editor. La parte de programación “real” se corresponde con la tarea de añadir la funcionalidad, y es ahí donde recae la tarea más compleja. En este tema profundizaremos en ello. Algoritmos Un algoritmo es un conjunto de pasos o instrucciones que es necesario seguir para realizar alguna tarea. En nuestra vida cotidiana, estamos rodeados de algoritmos: • Una receta de cocina es un algoritmo • Las instrucciones para montar un mueble es un algoritmo El nombre de Algoritmo es en honor al matemático persa AlJuarismi, quien escribió un libro en el siglo IX con algoritmos para resolver ecuaciones. El concepto de algoritmo es muy importante para la programación, ya que la programación consiste en escribir uno o más algoritmos (conjunto de pasos) que debe ejecutar un computador para resolver algún problema. Por ejemplo, el siguiente algoritmo describe qué hace el programa Conversor, visto en la lección anterior, cuando el usuario pulsa el botón Convertir: 1. Obtener el factor de conversión. 2. Multiplicar la cantidad introducida por el usuario por el factor de conversión. 3. Mostrar el resultado de la multiplicación anterior. El algoritmo que ejecuta programa Cronómetro: • Cada segundo, hacer lo siguiente: 1. Sumar un segundo: segundos = segundos + 1. 2. Si segundos=60, hacemos (minutos=minutos+1). segundos=0 y sumamos un minuto 3. Si minutos = 60, hacemos minutos = 0 y sumamos una hora (horas=horas+1). 4. Mostramos el valor de horas,minutos y segundos en pantalla. Cuando desarrollamos aplicaciones con App Inventor, antes de empezar a trabajar con el block editor, conviene pensar el algoritmo o algoritmos que tendrá nuestro programa y escribirlos en papel. Bases de los lenguajes programación Todos los lenguajes de programación más comunes, incluido el App Inventor, ofrecen mecanismos para: • Almacenar datos. Variables. En ellas guardamos datos y valores que se necesitan durante la ejecución del programa. Hay que distinguir entre las variables y las bases de datos o ficheros, que veremos más adelante. • Tomar decisiones. Estructuras de control condicionales. • Iterar para realizar una tarea sobre un conjunto de datos: Bucles. • Reutilizar código ( o bloques) mediante funciones y procedimientos. En las guías rápidas se puede ver un resumen de los diferentes bloques que tiene App Inventor para tratar variables, condicionales, bucles y funciones. A continuación veremos algunos ejemplos, un poco más avanzados que los del tema anterior, para seguir practicando. Ejemplos Ejemplo: Calcular la media Vamos a construir un programa que nos permita introducir números y, a continuación, podamos calcular la media. El diseño del programa (Media.zip) es el siguiente: Tiene un cuadro de texto donde introducir el número. Un botón “añadir”. Un ListPicker para eliminar algún número. Un botón para calcular la media y algunas etiquetas para mostrar información de interés. Vamos a comenzar a añadir funcionalidad. En prime lugar, definimos la siguiente variable: Dicha variable tiene la lista de los números que iremos añadiendo. Para añadir un elemento, podemos hacer lo siguiente: Cuando se pulsa el botón, lo primero que hacemos es añadir a la lista el número introducido. A continuación, imprimimos los números en pantalla. Para ello el bloque “list to csv row” que nos devuelve el contenido de la lista en formato CSV (Comma-separated values): “numero1”, “numero2”, “numero3”,.... Además, imprimimos junto a la lista la etiqueta “Números”. El carácter especial “\n” significa un salto de línea. Los números están entre comillas. Si quisiéramos quitar las comillas, podríamos usar el siguiente bloque: Ahora vamos a añadir la funcionalidad de eliminar números usando el ListPicker añadido durante el diseño. Para ello, lo primero que tenemos que decirle al ListPicker es qué lista queremos usar: Cuando seleccionemos un elemento del ListPicker tenemos que borrarlo: Además, tendríamos que actualizar la etiqueta con los números: El bloque de arriba y el utilizado al añadir un nuevo número son iguales. Es un buen momento de aprender a usar los procedimientos para reutilizar código. En este caso, vamos a crear un procedimiento (el bloque está dentro de Built-in - Definition) que se llame “mostrarNumeros”: Podemos llamarlo desde ambos bloques usando el siguiente bloque ( se encuentra en My blocks - My definitions): Ya tenemos la funcionalidad de añadir y quitar números. El último paso, consistirá en añadir la funcionalidad al botón que calcula la media. Para ello, hacemos uso del siguiente bloque: Como vemos, el procedimiento es el clásico para calcular la media: 1. En primer inicializamos la variable media para que valva 0. 2. A continuación, recorremos todos los números de la lista, sumándolos en la variable media. 3. Por último, dividimos el valor de media por el número de elementos (hacemos uso de lengh of list, que devuelve el número de elementos de la lista) El código completo, con comentarios, está disponible en el fichero Media.zip. Ejemplo: Eliminar repetidos en una lista En muchos programas es necesario eliminar elementos repetidos en una lista. En este ejemplo, vamos a ver un método para eliminar números repetidos de una lista generada al azar. En primer lugar, generamos una lista añadiendo números aleatorios. Para ello, podemos utilizar el siguiente procedimiento, que acepta como argumento el tamaño de la lista: El procedimiento genera una lista aleatoria cuyo tamaño se indica en el parámetro numeroElementos. Sigue el siguiente proceso: 1. El primer lugar, asignamos a la lista una lista vacía. 2. A continuación, iteramos desde 1 hasta numeroElementos 3. En cada iteración, añade a la lista un número aleatorio entre 1 y 20. Si queremos generar una lista de 50 elementos, por ejemplo, podemos usar usar el siguiente: Para eliminar los elementos repetidos, también hacemos un procedimiento, borrarRepetidos. En dicho procedimiento, vamos a crear una nueva lista de modo que no tenga repeticiones: En procedimiento inicializa nuevaLista con una lista vacía. A continuación itera sobre los elementos de nuestra lista de números. Para cada elemento, comprueba si está ya incluido en nuevaLista usando el bloque “position in list”. Si dicho bloque devuelve 0, quiere decir que no se ha encontrado, por lo que podemos añadirlo. Con los procedimientos creados, podemos usar los siguientes bloques para decir qué hacer cuando el usuario pulse algún botón: El proyecto completo, junto con los comentarios, se puede ver en Repetidos.zip. Ordenar una lista de números El ordenar “cosas” es una de las tareas más comunes en todos los programas. En este caso, vamos a ver cómo ordenar una lista de números con un sencillo programa, muy similar a los dos anteriores. El diseño del programa es el siguiente: Ahora vamos a añadir un procedimiento para ordenar números. Para ordenar números, existen una infinidad de algoritmos, algunos más eficientes que otros. Dos métodos básicos son: • Ordenación por selección: en este caso, buscamos en menor elemento de la lista y lo intercambiamos por que ocupa la primera posición. A continuación, buscamos el siguiente mínimo en la lista, y lo intercambiamos por el que ocupa la segunda posición. Este procedimiento lo repetimos hasta recorrer toda la lista. • Ordenación por inserción: consiste en construir una nueva lista, pero procurando que permanezca ordenada cada vez que insertamos un nuevo elemento. Vamos a aplicar el método de ordenación por selección. Con este método necesitamos saber cuál es el menor elemento de una lista, por lo que vamos a hacer una función que acepte como parámetro una lista, y nos devuelva el menor elemento: El procedimiento hace lo siguiente: • El primer lugar, asigna como mínimo un valor cualquiera de la lista, usando “pick random item”. • A continuación itera sobre todos los elementos de la lista. • En cada iteración, comprueba si el valor actual es menor que el de la variable mínimo. En tal caso, asigna a mínimo el nuevo valor, y continúa iterando. • Por último, devuelve el valor encontrado. Usando el procedimiento buscarMinimo podemos ordenar la lista siguiente un enfoque parecido al del ejemplo de Repetidos.zip, usando otra lista auxiliar: • Buscamos el menor elemento de la lista números usando la función buscarMinimo. • Cuando tengamos el mínimo, lo añadimos a nuevaLista y lo borramos de la lista números. • Repetimos los dos pasos anteriores mientras queden elementos en la lista números. En la siguiente página se muestra una captura del procedimiento creado. En el fichero Ordenar.zip se puede ver el programa completo con comentarios. Ejemplo: Comprobar si un número es primo Vamos a hacer un programa para calcular si un número es primo. Recordemos que un número se considera primo si sólo es divisible por el mismo y la unidad. Para ver que un número es primo, lo que tenemos que hacer es recorrer todos los números menores que él (y mayores que 1) y ver si alguno de ellos es un divisor. En realidad, nos basta con comprobar hasta su raíz cuadrada. El siguiente algoritmo describe el proceso: 1. Para n = 2 hasta raíz cuadrada del número a comprobar hacer: 1.1. Si el número es divisible por n (su resto es 0) entonces el número es primo. 1.2. En caso contrario, comprobar el siguiente número. El siguiente ejemplo en App Inventor corresponde a la aplicación Primos.zip: El bloque de anterior hace las siguiente: • En primer lugar, obtiene el valor del número introducido por el usuario y calcula el mayor divisor posible ( su raíz cuadrada). El bloque round realiza un redondeo del número, para quitar los decimales. Inicialmente, suponemos que el número es primo. • Si el número es mayor que tres (1,2,3 son primos), itera todos los números desde 2 al mayor divisor posible. • En cada iteración, comprueba si el número actual es un divisor (el módulo vale 0). Si es un divisor, el número ya no puede ser primo, por lo que hacemos primo=false. • Al final, mostramos una imagen dependiendo de si el número es primo o no. Al bloque anterior, se le puede hacer una modificación. En el caso de que el número no sea primo, el bloque “for range” va a seguir iterando, y por tanto tarda más tiempo en mostrar el resultado. Para solucionarlo, podemos cambiar el bloque, y usar un bucle “while” basado en una condición de parada: Se pueden ver el programa completo en PrimosMejorado.zip Funciones recursivas. Ejemplo: Factorial de un número. En este ejemplo vamos a ver el concepto de función recursiva. Una función recursiva es aquella que se compone de una o más llamadas a sí misma. Como ejemplo, pensemos en el factorial de un número: n! = n * (n-1) * (n-2) * …. * 1 0! = 1 Como vemos, el factorial de un número es la multiplicación de todos los números entre 1 y él mismo. Por ejemplo, 5! = 5 * 4 * 3 * 2 * 1 = 120. Podemos hacer una función que implemente el factorial usando un bucle: En el bloque anterior, iteramos desde 1 al número, multiplicando todos los números, obteniendo el factorial. Una solución, más elegante, podría ser usar una función recursiva. Si observamos que: 5! = 5*4*3*2*1 = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1 sacamos como conclusión que el factorial de un número N se puede calcular como la multiplicación de ese número multiplicado por el factorial de N-1. La función se puede implementar entonces en App Inventor de la siguiente forma: En este caso, la función factorial empieza comprobando si numero es 1. Dicha comprobación establece un criterio de parada que la función recursiva pare deje de llamarse a sí misma. En este caso, el criterio de parada es evidente ya que el factorial de 1 es 1. En caso contrario, aplicamos la recursividad: f = número * factorial ( número -1 ) La función se puede simplificar más haciendo uso del bloque choose: En este caso la función sólo tiene un bloque en la parte donde especificamos el valor que tiene que devolver. Este bloque es un choose: dependiendo de la condición a comprobar, devuelve un valor u otro. En la próxima lección.... Hasta ahora hemos usado datos sin posibilidad de almacenarlos en nuestro móvil para disponer de ellos cuando queramos. En el próximo tema veremos como solucionar ese problema mediante las bases de datos.
© Copyright 2024