TEMA IV.- SUBRUTINAS. BUGS (ERRORES). BASIC I. Introducción En muchos de los programas que creamos podemos simplificar su funcionamiento mediante las subrutinas. Por otra parte hablaremos de los errores “no visibles” hasta que corremos el programa. Por último comentaremos las diferencias entre el programa en diagrama de flujo y en BASIC. II. Subrutinas Una subrutina es una parte separada de un programa que puede correr tantas veces como sea necesario. Las subrutinas son a menudo usadas para reemplazar partes de un programa que son repetidas una gran cantidad de veces o para hacer que el programa sea mas organizado. Si observamos en el diagrama de flujo de la izquierda observaremos que existen pasos que se repiten varias veces durante la ejecución del programa. Por ejemplo, se repiten los pasos en los que se da las órdenes de visualizar el valor de la variable “x” [Display “x=”], [Display x], y [Display new line], si estas líneas las ponemos en otro programa y cada vez que nos haga falta ejecutamos este la apariencia del programa principal se simplificaría. Además podríamos este nuevo utilizar en programa cualquier lo otro programa que necesite visualizar una variable. Veamos como quedaría nuestro diagrama de flujo con la introducción de una subrutina que denominaremos “Visualizar” Teleformación proyecto Medusa. 1 Observamos que en el programa Principal han desaparecido las líneas de visualización antes mencionadas y en cambio aparece un nuevo comando subrutina”. En de “Llamada a cambio las líneas de visualización aparecen en otro programa al lado cuyo nombre es “Visualizar” que en vez de finalizar con la orden STOP finaliza con el comando . El funcionamiento de una subrutina es el siguiente: Cuando el programa principal llega al comando ejecutarse y cuando alcanza el comando “llama” a la subrutina, esta comienza a el programa Principal continua ejecutándose en la línea siguiente al comando de llamada. Podemos concluir diciendo que el uso de una subrutina hace uso de 3 comandos inseparables: Llamada a subrutina. Este comando debe formar parte del programa que desea ejecutar la subrutina. El nombre que introducimos en el recuadro de texto debe coincidir con el nombre que demos a la subrutina pues en caso contrario el programa no se ejecutará correctamente. Teleformación proyecto Medusa. 2 Subrutina. Este comando es el encabezado de la subrutina de ahí su similitud con el comando Start. Return. Este comando finaliza la ejecución de la subrutina y devuelve el control al programa desde el que se hizo la llamada de la subrutina. En un programa se pueden hacer tantas llamadas a subrutina como se deseen (El número máximo de subrutinas es de 100) Las subrutinas se pueden anidar, es decir, una subrutina puede hacer una llamada a otra subrutina y así sucesivamente, de forma que siempre se ejecuta primero la que tiene el orden mas interno. En el diagrama de flujo anterior podemos observar como hemos simplificado el programa Principal haciendo dos llamadas a subrutinas. La primera subrutina (Incremento) es la que realiza el incremento de la variable x en una unidad, cuando finaliza esta subrutina el programa Principal hace una llamada a la siguiente subrutina (Visualizar) y así hasta que finaliza el programa. Teleformación proyecto Medusa. 3 En este ejemplo hemos puesto en el programa Principal la llamada a la subrutina “Incremento” y esta a su vez una vez ha incrementado el valor de “x” realiza una llamada a la subrutina “Visualizar” , cuando esta finaliza, la subrutina Incremento finaliza y devuelve el control al programa Principal. Podemos decir que las subrutinas: ♦ Son mas eficientes porque reutilizan el mismo segmento de programa. ♦ Rompen el programa principal en pequeñas piezas haciéndolo mas fácil de entender. ♦ Pueden ser re-usados por diferentes programas requiriendo la misma función. Teleformación proyecto Medusa. 4 Analicemos el programa anterior. Observamos que el Programa1 crea una variable “x” con el valor 0 y a continuación hace una llamada a la subrutina2 que realiza un incremento de la variable. Asimismo el Programa2 también crea una variable “x” con un valor de 5 y hace una llamada a la misma subrutina2. En las ventanas de monitorización podemos ver que ambos programas han hecho uso de la subrutina y sin embargo la variable “x” no fue confundida por la subrutina devolviendo a cada programa el valor que le correspondía. La subrutina devuelve a cada programa el valor correspondiente de las variables que este le pasó Cuando dos programas usan la misma subrutina el programa que hizo la llamada en segundo lugar espera hasta que el otro programa deje de utilizar la subrutina. III. Bugs (Errores) Un bug es una forma de definir un error que sólo se encuentra cuando ejecutamos el programa. Veamos algunos casos de bugs En el diagrama de la izquierda a primera vista no hemos cometido error alguno, sin embargo cuando lo ejecutamos el programa se nos detiene en el bloque ¿Porqué? Pues porque en el programa y tal como hemos comentado anteriormente siempre se debe declarar las variables antes de hacer uso de ellas. La solución de este error la podemos ver en el diagrama de la derecha. Teleformación proyecto Medusa. 5 En este nuevo diagrama deseamos realizar un contador que se detenga al llegar ejecutamos programa a 5, pero cuando observamos se detiene que una lo el vez realizado el primer paso por todos los bloques. ¿Dónde está el bug (error)? Pues el error lo hemos cometido al colocar el bloque de decisión con las salidas intercambiadas el Yes por el No y viceversa. Generalmente los bugs son errores de escritura que al principio son difícilmente detectables pero que a través de pequeños depuradores (debugs) pueden ser detectados. IV. BASIC Comentamos anteriormente que el BASIC es un lenguaje de alto nivel cuya escritura se realiza en inglés y que es fácilmente entendible si conocemos algo de este idioma. El Crocodile Technology permite pasar del lenguaje de diagrama de flujo al lenguaje BASIC aunque no permite modificar este. Para ello dispone de la herramienta iconos El icono y cuando picamos sobre este icono nos aparecen dos . es una ventana que monitoriza las variables que se utilizan en el programa. Si picamos sobre el y arrastramos a la zona de trabajo nos aparecerá una ventana que debemos relacionar con el programa a monitorizar. Las dimensiones de la ventana puede ser modificable sin mas que picar sobre los recuadros negros y estirar hasta conseguir las medidas deseadas. Teleformación proyecto Medusa. 6 El icono es también una ventana pero que nos encierra la traducción en BASIC del diagrama de flujo. Analicemos las relaciones existentes entre el lenguaje de diagrama de flujo y el BASIC para lo que estudiaremos el siguiente diagrama de flujo que realiza la suma de dos variables. En primer lugar vemos que el BASIC utiliza la instrucción “symbol” para definir los nombres de las variables que vamos a utilizar. En nuestro caso el Crocodile utiliza una serie de registros (cajas donde guardan los datos) que los denomina b0. Esta instrucción no tiene relación con el diagrama de flujo. En el diagrama de flujo la primera acción es Start que en BASIC se transforma en la etiqueta main:, La asignación de un valor a una variable el lenguaje BASIC lo hace con la instrucción let se convierte en let x = 3 Teleformación proyecto Medusa. 7 se convierte en let z = x + y, El comando se convierte en la instrucción end. Las etiquetas son aquellos puntos donde el programa realiza un salto Las etiquetas siempre se escriben a la izquierda y finaliza con dos puntos “:”. Veamos otro ejemplo mas complicado. El diagrama utiliza una sola variable “x” por ello en el BASIC sólo aparece una instrucción “symbol”. se convierte en main: se convierte en let x = 0 se convierte en let x = x + 1 este bloque siempre genera dos etiquetas en BASIC una etiqueta que indica el punto donde le programa debe continuar si la pregunta tiene respuesta positiva ( en nuestro ejemplo label2 ) y otra que indica el punto donde debe continuar si la respuesta es negativa (en nuestro caso label1). Teleformación proyecto Medusa. 8 La pregunta se convierte en la sentencia if … then a continuación del then se escribe la etiqueta donde el programa continua si la respuesta es afirmativa y en la siguiente línea escribimos con la instrucción goto (saltar a ) la etiqueta donde el programa continua si la respuesta es negativa. En nuestro ejemplo se convierte en if x=5 then label2 Goto label1 se convierte en la instrucción end. Veamos un ejemplo con subrutinas: Observemos que el BASIC crea la subrutina como una etiqueta a continuación del programa principal. se convierte en gosub Subrutina2, la instrucción gosub significa ir a la subrutina y volver cuando encuentres el comando return. se convierte en return se convierte en pause 5000, la instrucción pause trabaja con milisegundos en vez de segundos como hace el comando wait. El resto de las acciones ya no merecen comentarios al ser similares a las anteriores. Teleformación proyecto Medusa. 9 Intente entender el siguiente diagrama Teleformación proyecto Medusa. 10