Lección 3

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.