El lenguaje Logo se presenta en distintos formatos, que depende del fabricante del entorno; los más utilizados son MSWLOGO, ACTILOGO y WIN-LOGO fundamentalmente; el WIN-LOGO puede usarse en entorno del DOS y también en el de WINDOWS. Este ensayo trata de WIN-LOGO para Windows.
Para poder ejecutar el WIN-LOGO son necesarios, además de los materiales genéricos que requiere el entorno Windows sobre el que este lenguaje trabaja, los siguientes elementos: un ordenador compatible PENTIUM o superior, 8 Mb de memoria y 2 Mb de disco duro libres; opcionalmente serán necesarias una impresora y una tarjeta de sonido.
1. WINLOGO USA VENTANAS
WinLogo posee varias ventanas o áreas de trabajo que pueden ser utilizadas para determinadas tareas. Estas ventanas son:
Gráficos Textos
Trabajo Formas
Edición Trazado
Cuando se inicia el programa se presentan las ventanas o áreas de trabajo más importantes, que son: la ventana de Gráficos (mundo de las tortugas), la ventana de Textos (zona en la que Logo escribe sus mensajes) y la ventana correspondiente al área de Trabajo (zona en la que el usuario escribe sus mensajes).
Las ventanas no están siempre en la misma posición: se pueden mover, cambiar de tamaño, superponer o cerrar.
Solamente se puede actuar sobre las ventanas activas. Para determinar cuándo una ventana se encuentra activa es suficiente comprobar que su barra superior se encuentra resaltada.
Para activar una ventana basta colocar el puntero del ratón sobre ella y pulsar su botón izquierdo; el camino indicado sirve solamente si la ventana está presente en pantalla; en caso contrario, es decir cuando la ventana no esté en pantalla, basta elegir la opción Ventanas de la barra de menús y seleccionar el nombre de la ventana que se quiere activar; la ventana así activada se superpondrá a las ventanas que aparecían antes en la pantalla. Para desactivar una ventana basta con activar una nueva.
Para cerrar una determinada ventana, en primer lugar ésta debe aparecer como activa; después, la ventana puede cerrarse utilizando alguno de los procedimientos siguientes:
Pulsando [Ctrl]+[F4].
Haciendo doble "clic" en el recuadro superior izquierdo (botón de control) de la ventana activa.
Haciendo un "clic" en el botón de control de la ventana y eligiendo la opción Cerrar.
Para mover una ventana hay que situar el puntero del ratón sobre el título de la ventana y mantener pulsado el botón izquierdo del ratón mientras la ventana se desplaza hasta la posición deseada. Una vez que la ventana ha llegado hasta el lugar deseado basta soltar el botón.
Para modificar el tamaño de una ventana lo primero que hay que hacer es activarla y después situar el puntero del ratón sobre uno de sus lados hasta que aparece una doble flecha; pulsado el botón del ratón el borde de la ventana puede ser arrastrado hasta que éste alcance el tamaño deseado.
Si se desea restaurar automáticamente una ventana al número y disposición iniciales, basta elegir en la barra de Menú la opción Ventanas y seleccionar, dentro de ella, el comando "Restaurar Entorno".
2. EL MODO DIRECTO
Las palabras clave que se usan para comunicarse con el entorno se llaman PRIMITIVAS. Las primitivas pueden escribirse en la ventana de TRABAJO. Cuando el objetivo de la primitiva sea dibujar, sus resultados se muestran en el área de GRÁFICOS y, por el contrario, aparecen en el área de TEXTOS cuando la primitiva tiene por objeto dibujar.
Con el ejemplo siguiente quedará más claro el funcionamiento del modo directo: Lo primero que debe hacerse es activar el área de TRABAJO; para ello se sitúa el puntero del ratón sobre algún punto de la ventana de TRABAJO y después se hace"clic" en ella con el ratón. Instantáneamente el título de esa ventana aparecerá resaltado, lo cual indica que esa zona es activa.
Si se escribe: AVANZA 40 y se pulsa [INTRO]
La tortuga dibujará una recta de cuarenta unidades de longitud en la ventana GRÁFICOS, ya que el resultado de la primitiva AVANZA es un dibujo.
Prueba con otra primitiva, escribe ESCRIBE "HOLA y después pulsa [INTRO]. En la ventana de TEXTOS aparecerá escrita la palabra HOLA. Las órdenes de escritura se ejecutan en la zona de TEXTOS.
Recuerda:
Las órdenes se escriben en la ventana de Trabajo. Logo muestra sus mensajes y textos en la ventana de Textos, sus gráficos los representa en la ventana de Gráficos.
Si se comete un error al
escribir una primitiva como por ejemplo ordenar a la primitiva una acción
incompleta, Logo envía su mensaje de error a través de la ventana de
TEXTOS. Para comprobarlo se teclea: ESSCRIBE "HOLA; la palabra escribe se
ha escrito con dos eses; el ordenador en este caso emitirá un mensaje de
error en la ventana de TEXTOS. El mensaje de error que va a parecer es: no
se cómo hacer ESSCRIBE.
Realiza las pruebas siguientes: escribe los textos tal y como aparecen a continuación y pulsa [INTRO] después de cada línea.
AVANZA 80
AV 80
BORRAPANTALLA
AV 40
GIRADERECHA 90
AV 40 GD 90
BP AV 60
GIRAIZQUIERDA 45
RETROCEDE 60
GI 90 RE 56
ESCRIBE "CASA
ESCRIBE [LA CASA ES GRANDE]
BP
Actividad recomendada:
Dibuja un cuadrado y un
triángulo haciendo uso de las primitivas que has visto hasta ahora. Prueba
también a hacer una circunferencia.
Con el ejercicio anterior se
pretendía que practicases con un conjunto de primitivas y sus
abreviaturas. Escribe ahora las líneas de la lista siguiente y observa los
mensajes que aparecen en la ventana de Textos:
AVANZA
RETROCEDE
GIRAIZQUIERDA
Analiza los mensajes escritos
en el zona de textos; el error se produce porque las primitivas requerían
un parámetro para su correcta definición; recuerda que existen otras
primitivas para la que no es necesario definir ningún parámetro. Escribe
las órdenes anteriores completándolas con un parámetro correcto.
Primitivas que has estudiadas hasta el momento:
AVANZA x (AV x) |
la tortuga se desplaza x unidades hacia adelante |
RETROCEDE x (RE x) |
la tortuga se desplaza x unidades hacia atrás |
GIRADERECHA x (GD x) |
la tortuga gira a la derecha x grados |
GIRAIZQUIERDA x (GI x) |
la tortuga gira a la izquierda x grados |
ESCRIBE "X (ES "X) |
escribe en la ventana de textos la palabra situada detrás de las comillas |
ESCRIBE [XX XX] (ES [XX XX]) |
escribe en la ventana de textos la frase situada entre los corchetes |
BORRAPANTALLA (BP) |
se borra la pantalla de gráficos |
También se pueden escribir
dos o más órdenes en una misma línea. Por ejemplo:
BORRAPANTALLA AVANZA 40
GIRADERECHA 90 AVANZA 60
Después de escribir la línea
anterior en la ventana de trabajo y pulsar [INTRO], se ejecutarán las
cuatro instrucciones.
Edición en modo directo
También se puede repetir una orden directa pulsando [INTRO] después de haber colocado el cursor en la línea en la que la orden se había ejecutado.
ACTIVIDAD GUIADA
Escribe la siguiente orden y pulsa [INTRO]: GD 45
El cursor baja una línea y el programa espera a que escribas otra orden. Sube el cursor a la línea anterior y vuelve a pulsar [INTRO]. Repite la acción varias veces, verás cómo se ejecuta como si la hubieras escrito de nuevo.
Como se ha explicado anteriormente, en una línea se pueden escribir varias órdenes seguidas. Logo las ejecuta una tras otra.
Borra la pantalla de Gráficos con la orden BP y, en una línea en blanco escribe las dos órdenes siguientes y pulsa [INTRO]: AV 60 GD 90
Sube el cursor a la línea
anterior y pulsa [INTRO]. Repite la operación dos veces más. Cuando
concluyas el ejercicio observa que Logo ha dibujado un cuadrado.
Esta posibilidad permite
corregir un error sin necesidad de reescribir toda la línea de órdenes en
la que aparecía dicho error.
Escribe y ejecuta:
Logo envía un mensaje a la
ventana de textos el siguiente mensaje:
no sé como hacer para
HESCRIBE
Sube el cursor a la línea
errónea, suprime la H y pulsa [INTRO]. Observa que en la ventana de textos
Logo escribe la palabra que le habías ordenado.
Una
primitiva interesante: REPITE
Merece la pena dedicarle un
apartado específico a la primitiva REPITE debido a su gran utilidad en la
creación de gráficos y en el micromundo de control. Esta primitiva no
tiene abreviatura; su sintaxis es:
REPITE n[acciones]
ACTIVIDAD
GUIADA
Realiza los siguientes
ejercicios y pulsa [INTRO] al final de cada línea:
REPITE
4[AV 50 GD 90]
BP
REPITE
6 [AV 40 GD 60]
BP
REPITE
7 [AV 30 GD 360 / 7 ]
Cambia el siete por nueve y
pulsa [INTRO].
Escribe el siguiente conjunto
de órdenes:
BP
SL GI 90 AV 200 GD 90 BL
REPITE
10[AV 5 GD 90 AV 20 GD 90 AV 5 GI 90 AV 20 GI 90]
Observa que la última orden
del corchete GI 90 deja a la tortuga en la orientación inicial de modo
que, al ejecutarse el módulo siguiente, la tortuga esté situada en la
misma dirección.
3. MODO PROCEDIMENTAL
El lenguaje Logo permite trabajar en modo procedimental, característica que comparte con otros lenguajes de programación. Programar en modo procedimental consiste en enseñar procedimientos al ordenador que, una vez asimilados, interpreta como si fueran nuevas primitivas.
Los procedimientos (programas) pueden escribirse en las ventanas de trabajo y edición, aunque es preferible hacerlo en la de edición. Para ello, se pulsa el icono de Edición que aparece en la barra de menú que se superpone a la ventana de edición. Los procedimientos (programas) se escriben en la ventana de edición.
Existen dos PRIMITIVAS asociadas a cualquier procedimiento, PARA y FIN. Todos los procedimientos comienzan por la primitiva PARA y terminan con la primitiva FIN.
Escribe el siguiente programa:
PARA CUADRADO
REPITE 4 [ AV 60 GD 90]
FIN
Hay que tener en cuenta que
en la primera línea, sólo puede escribirse la palabra que se está
definiendo separada de PARA por un espacio y en la última línea sólo puede
escribirse la palabra FIN. Siempre debe pulsarse [INTRO] para validar un
procedimiento.
El procedimiento anterior se
llama CUADRADO. Para ejecutar posteriormente este procedimiento, es
necesario que el ordenador lo memorice; para ello, basta pulsar el icono
de INTERPRETE. En la ventana de Texto aparecerá, si el procedimiento es
correcto, el siguiente mensaje: ACABAS DE DEFINIR CUADRADO. Con esta
acción, el ordenador ha memorizado el procedimiento, por lo que puede ser
utilizado en el futuro. Cierra la ventana de Edición situando el cursor en
el cuadrado superior izquierdo y pulsa dos veces el ratón. Activa la
ventana de trabajo. Si escribes CUADRADO y pulsas [INTRO], en la ventana
de gráficos se ejecutarán las órdenes asociadas a ese procedimiento (en
este caso aparece cuadrado de 60 unidades de lado).
Los procedimientos recién
definidos pueden ejecutarse mientras no se salga de Logo. Una vez apagado
el sistema, Logo sólo recuerda sus primitivas.
Cómo archivar los procedimientos que se encuentran en el Editor
Para no perder los
procedimientos diseñados de un día para otro, Logo permite archivar en el
disco los procedimientos que se encuentran visibles en la pantalla de
edición. Para archivar los procedimientos pueden seguirse los siguientes
caminos:
Desde la ventana de
Trabajo: Mediante la primitiva GUARDAED se almacenan todos los
procedimientos en un determinado archivo. Por ejemplo, con GUARDAED
"arch.log, se almacenan los procedimientos en el archivo arch. log.
Cuando aparece la ventana
de diálogo adjunta, se escribirá el nombre con el que se quiera guardar
el conjunto de procedimientos. En este caso se elige el nombre
ARCH.
Conviene señalar que los archivos de procedimientos, tienen por defecto la extensión LOG.
Si has comprendido los contenidos presentados hasta ahora y has realizado las prácticas sin dificultad, continúa con el estudio de LOGO.
4. ALGUNAS PRIMITIVAS MÁS DEL LENGUAJE LOGO
SUBELAPIZ (SL)
Eleva el lápiz de la tortuga activa para que no deje trazo al moverse.
BAJALAPIZ (BL)
Activa el lápiz de la tortuga y dibuja un trazo a lo largo de su trayectoria.
GUARDAED "archi
Guarda el contenido del área
de edición en un archivo llamado archi.
REPITE
Repite el número de veces
indicado la acción situada entre corchetes.
CENTRO
Sitúa las tortugas activas en el centro del gráfico. En su desplazamiento al centro, las tortugas dejan rastro o no, dependiendo de si su posición es bajalapiz o subelapiz.
5. PROGRAMACIÓN MODULAR
La estructura de Logo, basada como ya se ha visto, en los procedimientos definidos, permite realizar programas de forma modular, es decir, descomponiéndolos en partes que pueden resolverse por separado y que son más simples que el programa inicial. Esta modularización puede hacerse a varios niveles, ya que cada módulo puede descomponerse, también, en partes más sencillas. Este proceso permite dar respuesta a los planteamientos de la programación estructurada. Logo es un lenguaje que estimula la realización de programas claros, en los que cada procedimiento realiza una misión concreta.
Modularidad
La posibilidad que ofrece Logo de dividir un programa complejo en otros más pequeños y fáciles de diseñar que pueden dividirse en otros, que se integran en el programa inicial para dar respuesta al problema planteado, se llama modularidad.
Otra definición de modularidad es la siguiente: modularidad es una característica de Logo que permite que un programa llame a otros más sencillos y que estos, también, puedan llamar a otros.
Uno de los problemas que plantea la modularidad en programas geométricos es la necesidad de tener controlada la posición y orientación de la tortuga entre módulo y módulo. A continuación, se ofrecen dos formas de resolver este problema.
Modularidad con referencia al centro
Se propone, como un ejemplo, un programa cuya misión es dibujar un robot. Para aplicar el concepto de modularidad, se va a dibujar un robot por partes correspondientes a cada uno de sus miembros (cabeza, cuello, cuerpo, brazos, patas y pies).
PARA ROBOT
BP BL PONG 2 PONF 3
CABEZA CEN
CUELLO CEN
BRI CEN
CUERPO CEN
BRD CEN
PATAIZ CEN
PIEIZ CEN
PATAD CEN
PIED CEN
FIN
La referencia al centro (CEN)
es la característica que más destaca en el ejemplo anterior por el hecho
de que, después de dibujar cada miembro del robot, la tortuga vuelve al
centro de la pantalla para dibujar la siguiente pieza. Este movimiento que
se repite al final de cada módulo se realiza por medio del programa
CEN.
PARA CEN
SL PONRUMBO 0 CENTRO
FIN
Por otro lado, los módulos encargados de dibujar los miembros trazan rectángulos, por lo que se ha creado un módulo variable, REC que se adapta al tamaño de rectángulo que interese en cada momento, de forma que cada dibujo comienza y termina en el ángulo inferior izquierdo.
PARA REC :L :A
BL
REPITE 2 [ AV :L GD 90 AV :A GD 90]
FIN
Los módulos que dibujan los miembros, CABEZA, CUELLO y el resto, comienzan su ejecución subiendo el lápiz y colocando la tortuga en la posición correspondiente al vértice inferior izquierdo del rectángulo que se dibuje en cada caso. El uso de papel cuadriculado supone una gran ayuda en esta labor.
Modularidad con referencia al módulo anterior
El problema que se plantea es
el de conocer en todo momento la posición de la tortuga cuando termina un
módulo, ya que es necesario situar la tortuga en un punto determinado para
comenzar el módulo siguiente. Como ejemplo de diseño, se toma un tren
dividido en cada una de las unidades que integran el convoy. Consulta el
manual de LOGO para conocer las primitivas PONG, PONF y PONCL.
PARA TREN
BP PONG 1 PONF 1 PONCL 4
OT
SL
AV 10 GI 90 AV 150 GD 90
MAQUINA
VACARBON
VAGON1
VAGON2
VAGONCOLA
VIA
MT
FIN
Al final de cada módulo, la tortuga dibuja el parachoques y después realiza un giro de noventa grados hacia la izquierda para disponerse a dibujar el siguiente rectángulo.
6. USO DE VARIABLES
Las variables pueden ser comparadas con cajas a las que se les pone una etiqueta (nombre) y en cuyo interior existe un contenido.
Una variable, por ejemplo, puede llamarse HOLA y contener el número 34; otra puede llamarse BARCO y contener la palabra chocolate. De este modo, al ejecutar la orden de escribir el contenido de HOLA, el ordenador escribe 34, de la misma manera que si se le mandase escribir el contenido de BARCO escribiría chocolate.
Las variables en el modo directo
Sitúate en la ventana de trabajo.
Escribe: HAZ "BARCO "chocolate Pulsa [INTRO].
Mediante la instrucción anterior se ha creado la variable BARCO y se le ha asignado como contenido la palabra chocolate.
Escribe: ESCRIBE : "BARCO Pulsa [INTRO].
En la ventana de textos,
aparece escrito el contenido de la variable BARCO, en este caso chocolate.
Conviene destacar que para conocer el contenido de una variable, es
necesario escribir la instrucción ESCRIBE : "nombrevar, donde nombrevar es
el nombre de la variable:
Prueba el siguiente
ejemplo:
HAZ "h 66
ESCRIBE :h + 9
En este caso en la ventana de
textos aparecerá el número 75, que es el resultado de sumar 66, contenido
de la variable h, al número 9.
Las variables locales en los procedimientos
Retrocedamos al procedimiento
CUADRADO
PARA CUADRADO
BP BL PONCL 5 PONG 4 PONF
16
REPITE 4 [AV 50 GD 90 ]
FIN
Como se ha visto, este procedimiento permite realizar un cuadrado concreto y único de 50 unidades de lado, de modo que si se quisiera realizar otro cuadrado más grande o de otro color, debería diseñarse un procedimiento distinto. Las variables locales permiten solucionar este problema.
Observa el procedimiento que a continuación se analiza:
PARA CUAVARILADO :L
BP
BL PONCL 5 PONG 4 PONF 16
REPITE
4 [AV :L GD 90 ]
FIN
RECUERDA
El nombre del procedimiento
que se coloca en la primera línea después de PARA conlleva la creación de
la variable :L.
Dentro del corchete, el
argumento de la primitiva AVANZA no es una cantidad fija, sino que varía
en función del contenido de la variable :L por lo que, dependiendo de
dicho contenido, el programa dibuja el cuadrado correspondiente.
Copia el procedimiento
CUAVARILADO :L y no olvides pulsar [INTRO] después de FIN; escribe y
ejecuta:
CUAVARILADO 50
CUAVARILADO 30+5
CUAVARILADO 1
CUAVARILADO
Observa que Logo envía un
mensaje para que completes los datos.
Las variables locales se
llaman así porque su existencia está limitada al tiempo de ejecución del
programa. Para comprobar este hecho, escribe la frase:
ESCRIBE :N
Observa el mensaje que envía
Logo: "Esa variable ya no existe."
Crea diversos procedimientos
que permitan dibujar cuadrados de lado fijo y color, grosor, o fondo
variables. Llámalos:
CUAVARICOL :C CUAVARIGRO
:G
CUAVARIFON :F
Ejecuta dichos procedimientos
utilizando distintos parámetros.
Logo puede gestionar en cada
procedimiento tantas variables como se definan en la primera línea. Fíjate
en el siguiente ejemplo:
PARA CUAVARIA :C :G :F
BP
BL
PONCL
:C
PONG
:G
PONF
:F
REPITE
4 [ AV 50 GD 90 ]
FIN
Una vez definido el
procedimiento en el Editor y después de haberlo validado, vuelve al área
de trabajo y ejecuta:
CUAVARIA 5 4 16
CUAVARIA 1 1 1
CUAVARIA 2 4
Observa que en el último caso
Logo envía un mensaje para que se completen los datos.
Modifica el procedimiento anterior en el Editor para que incluya como cuarta variable la longitud del lado. (no olvides salir del Editor validando los cambios con el icono intérprete).
7. VIAJE TOTAL
Es importante notar que el ángulo de giro que recorre la tortuga es el ángulo exterior y no el interior de los polígonos como, en un principio, podría suponerse; de modo que el giro total que realiza la tortuga después de dibujar un polígono es de 360º. Es importante resaltar que la diferencia entre un polígono y otro no estriba sólo en su número de lados, sino en la amplitud de sus ángulos.
Se va a definir un procedimiento que permite realizar un polígono con un número variable de lados:
PARA POLIN :N
BP
BL
PONCL
1 PONG 2 PONF 3
REPITE
:N [AV 50 GD 360 / :N ]
FIN
Ejecuta el programa desde el
área de trabajo con los siguientes parámetros:
POLIN
6
POLIN
3
POLIN
2
POLIN 50
Crea procedimientos en los
que varíen otros parámetros como la longitud de los lados.
Realiza las modificaciones
necesarias en el Editor para que este programa dibuje los polígonos
apoyados siempre con el lado inferior en posición horizontal.
Diseña un programa que
realice circunferencias de tamaño variable.
Las variables globales en los procedimientos
Las variables globales, a
diferencia de las locales, pueden existir durante todo el tiempo en que
Logo está activo; puede decirse que "permanecen suspendidas en el área de
trabajo", lo cual permite usarlas en cualquier procedimiento que se cree.
Esta característica implica una ocupación de la memoria y la vigilancia
del programador para que no haya dos variables definidas con el mismo
nombre.
Las variables globales se
crean con la primitiva HAZ usada con la siguiente sintaxis:
HAZ "NOMBRE contenido
El nombre que se da a la
variable debe ser un conjunto de caracteres sin espacios en blanco y debe
ir precedido por comillas. El contenido de la variable puede ser:
Un número | |
El resultado de una
operación | |
Una palabra que irá
precedida de comillas | |
Una lista entre
corchetes | |
Una serie de datos
introducidos desde teclado durante la ejecución del programa por
medio de ciertas primitivas. |
El contenido de una variable
aparece cuando se escribe precedida por el símbolo :nombre.
No es posible crear una
variable global ni en la primera línea de un procedimiento, ni en la
última. Sirva como ejemplo el siguiente procedimiento:
PARA CUAGLO
BP BT
ES [ Escribe la longitud del
lado de un cuadrado]
HAZ "LADO LEEPALABRA
REPITE 4 [ AV :LADO GD
90]
FIN
PARA SALUDO
ES [¿Cómo te llamas?]
HAZ "NOMBRE LEEPALABRA
ES FRASE [Encantado de
conocerte] :NOMBRE
FIN
PARA CUBO
BP BT
ES [Este programa calcula el
cubo de las cifras arábigas]
ES [¿De qué cifra deseas el
cubo?]
HAZ "CIFRA LEECAR
HAZ "CUBO :CIFRA * :CIFRA *
:CIFRA
ES (FRASE [El cubo de ]
:CIFRA [ es ] :CUBO)
FIN
HAZ "nombr obj |
Asigna el valor
indicado en obj a la variable llamada nombr |
LEECAR (LC) |
Lee
el primer carácter de un archivo o la primera pulsación desde el
teclado sin necesidad de pulsar [INTRO]. |
LEECARS num (LCS num) |
Lee los num primeros caracteres pulsados desde el teclado o leídos de un archivo |
LEELISTA (LL) |
Lee una lista de caracteres introducidos desde el teclado o leídos desde un archivo |
LEEPALABRA (LP) |
Lee la primera palabra introducida desde el teclado o leída desde un fichero |
Diferencias entre carácter,
palabra y lista:
Carácter es una sola
letra, número o pulsación de teclado. (Ej. : a) | |
Palabra es un conjunto
de caracteres que no tienen espacios entre sí. (Ej. : 123a) | |
Lista es un conjunto de
palabras separadas por espacios (Ej. : La casa número 18) |
Comprueba el comportamiento
de estos procedimientos (las frases situadas después de ";" son
comentarios, no líneas de programación):
PARA lectura_caracteres1
ES [¿Quién descubrió
América?:]
HAZ "H LC ; se asigna a la
variable H el 1er carácter escrito por teclado
ES :H
FIN
Obsérvese que, cuando el
nombre de un procedimiento contiene más de una palabra, se usan guiones
para unirlos. En el procedimiento anterior no es necesario pulsar [INTRO]
para la aceptación del dato.
PARA lectura_caracteres2
ES [¿Quién descubrió
América?:]
HAZ "H LCS 3 ; se asigna a la
variable H los tres primeros caracteres escritos por teclado
ES :H
FIN
Tampoco es necesario pulsar
[INTRO] para indicar al procedimiento que se ha acabado de introducir los
datos, puesto que está esperando tres caracteres y, una vez recibidos,
continúa el flujo del programa. Si quieres introducir un número menor de
caracteres que los indicados, pulsa [INTRO] cuando decidas no introducir
más.
PARA lectura_caracteres3
ES [¿Quién descubrió
América?:]
HAZ "H LP ; asignamos a la
variable H la primer palabra escrita por teclado
ES :H
FIN
PARA lectura_caracteres4
ES [¿Quién descubrió
América?:]
HAZ "H LL ; asignamos a la
variable H todo el texto escrito por teclado
ES :H
FIN
8. RECURSIVIDAD
Se llama recursividad a la posibilidad que ofrece un programa diseñado en Logo de llamarse a sí mismo en un bucle sin fin. Un sencillo ejemplo lo constituye el siguiente programa, que dibuja una circunferencia de modo recursivo:
PARA CIREC
AV 1
GD 1
CIREC
FIN
Un primer problema por
resolver en un procedimiento recursivo, es encontrar la forma de abandonar
su ejecución infinita de procedimiento sin pulsar la tecla [ESC]. Se puede
abandonar dicha ejecución mediante la primitiva TECLA? en una
condición.
Sentencias condicionales
Logo puede "valorar" el
contenido de una condición y "decidir" entre dos opciones. Para dejar
claros estos conceptos se utilizará la primitiva TECLA?, que devuelve
CIERTO o FALSO según se haya pulsado o no una tecla.
El programa CIREC queda
controlado al anteponer el condicional SI a la primitiva TECLA?
PARA ARCO
SI TECLA? [ALTO]
AV 1
GD 1
ARCO
FIN
Este programa va dibujando un
arco con avances y giros hasta que se pulse una tecla.
Es importante insistir sobre
la estructura de las sentencias condicionales, ya que son la base del
"pensamiento" de los programas en Logo.
La sentencia condicional se
expresa con la primitiva SI y tiene varias sintaxis; las dos más usadas
son:
SI condición [acción 1]
[acción 2]
Esta sentencia significa que,
si se cumple la condición, se ejecutan las acciones contenidas en el
primer corchete y, en caso contrario, las incluidas en el segundo. En
ambos casos, una vez realizadas todas las acciones incluidas en uno de los
corchetes, el programa ejecuta la línea siguiente del programa:
SI condición [acción]
En este caso, si se cumple la
condición, se ejecutan las acciones contenidas en el corchete; después el
programa pasa a la línea siguiente; si no se cumple la condición, el
programa pasa a la línea siguiente.
Importancia de la recursividad en LOGO
Las estructuras recursivas se
utilizan muy a menudo en los programas de robótica. En gran cantidad de
ocasiones las máquinas, además de ejecutar acciones habituales, están
alertas ante cualquier cambio que pueda producirse gracias a su
programación. Dentro de su programa de funcionamiento, se incluyen
programas recursivos que se activan debido a los cambios en las
condiciones de la máquina.
Conviene tener en cuenta que la recursividad es, más que un bucle, una llamada al propio programa para que vuelva a realizar las mismas acciones en un ciclo sin fin. Tal vez, la etiqueta de un conocido anís español pueda ejemplificar mejor el fenómeno recursivo. En ella, un mono con un cierto toque "darwiniano", sostiene una botella del mismo anís, la cual contiene a su vez otra etiqueta más pequeña que contiene la representación de un mono que sostiene una botella. Conviene aclarar, por tanto, que cada vez que Logo se llama a sí mismo, genera un nuevo programa que debe ejecutarse en su totalidad. Esta última afirmación, que puede parecer una evidencia incuestionable, sirve como eficaz sistema de control de los programas recursivos y debe tenerse siempre presente para no recargar los programas con la "basura de las colas" que se van generando.
Control
de la recursividad por medio de un contador
Ejemplo:
PARA CONTADOR :N
SI :N<0 [ESCRIBE "GOL
ALTO]
ES :N
CONTADOR :N-1
FIN
El programa contiene una
variable local :N que sólo sirve para escribir su contenido cada vez que
el programa se ejecuta. El programa se llama a sí mismo y hace disminuir
el valor de la variable en cada paso. La sentencia condicional de la
primera línea controla la ruptura del bucle en el momento en que se llega
a un valor negativo, se escribe la palabra GOL y se detiene el programa.
Obsérvese que la comparación numérica entre el contenido de la variable y
la constante no se ha hecho con el signo = sino con el signo < ya que,
si el incremento se hiciera con decimales (CONTADOR :N-0, 3), nunca se
cumpliría la condición y el bucle sería indefinido.
Construye otro contador
que aumente el valor de la variable :N | |
Construye otro contador con dos variables, el número de inicio y el descenso. | |
Construye un programa
recursivo que dibuje espirales utilizando un avance y un giro, e
incrementando uno otro o ambos. | |
Modifica
el programa anterior con otras variables para cada incremento |
Las colas en la recursividad
En un párrafo anterior, se
afirma que cada vez que un programa se llama a sí mismo genera un nuevo
programa que debe terminarse. Es importante no cerrar el tema de la
recursividad sin presentar los "extraños efectos" que la recursividad
produce en un programa. La capacidad de Logo para evitar dichos efectos
pone de manifiesto cuando se evitan, a través de una correcta
programación.
Observa este programa:
PARA CAPICUA :N
SI :N<1 [ALTO]
ES FRASE [CABEZA] :N
CAPICUA :N-1
ES FRASE [COLA] :N
FIN
Antes de ejecutar CAPICUA 9, te proponemos la apuesta de intentar averiguar lo que escribirá Logo cuando se ejecute CAPICUA 9. Una vez hayas formulado tu apuesta, observa que CAPICUA 9, después de pasar por la primera línea de control escribe CABEZA 9 e inmediatamente después se convierte en CAPICUA 8 sin haber terminado el programa, dejando pendiente para otro momento la ejecución de la frase COLA 9. El programa CAPICUA 8 hará lo mismo dejando su última orden COLA 8 para otro momento, y así sucesivamente hasta que :n llegue a valer 0, momento en que, en lugar de terminar, ejecutará todas las colas empezando por la del último programa ejecutado, CAPICUA 1, hasta llegar al primero.
© GRUPO LOGO y Javier de Lucas