Vous êtes sur la page 1sur 266

.

Curso de Iniciaci
on

Alvaro
Vald
es Menen
endez
Loc Le Coq
Marcelo Duschkin

http://xlogo.tuxfamily.org

Introducci
on
Logo es un lenguaje desarrollado a finales de los a
nos 60 por Seymour Papert. Papert
trabajo con Piaget en la Universidad de Ginebra desde 1959 hasta 1963 y, basandose en su
Teora del Constructivismo, desarrollo el aprendizaje Construccionista:
El aprendizaje mejora si se aplica activamente a la vida cotidiana
resumido en la expresion learningbydoing
Logo es una potente herramienta para desarrollar los procesos de pensamiento logicomatematicos y un lenguaje excelente para comenzar a estudiar programacion, que ense
na
lo basico acerca de temas como bucles, condicionales, procedimientos, etc. El usuario puede
mover un objeto llamado tortuga dentro de la pantalla, usando instrucciones (comandos)
simples como avanza, retrocede, giraderecha y similares.
Poder usar
ordenes en el idioma natural favorece su aprendizaje y asimilaci
on
Con cada movimiento, la tortuga deja un rastro (dibuja una lnea) tras de s, y de esta
manera se crean graficos. Logo en general, y xLogo en particular, no sirven solo para hacer dibujos; tambien es posible realizar operaciones complejas, manipular palabras y
listas, evaluar condicionales, programar robots, interactuar con el usuario, tocar m
usica,. . .
Logo es un lenguaje interpretado. Esto quiere decir que las ordenes introducidas por
el usuario son interpretadas por el ordenador y ejecutadas inmediatamente en el orden en
que son escritas.
xLogo es un interprete Logo escrito en Java. Actualmente (version 0.9.96) soporta

trece idiomas (Frances, Ingles, Espa


nol, Portugues, Aleman, Arabe,
Esperanto, Gallego,
Asturiano, Griego, Italiano, Catalan y H
ungaro) y se distribuye bajo licencia GPL. Por lo
tanto, este programa es libre en cuanto a libertad y gratuidad y puede descargarse desde:
http://xlogo.tuxfamily.org
En nuestra web tambien puedes descargar la documentacion del programa y copiar o ejecutar en lnea varios ejemplos con los que comprobar la capacidad de xLogo.
Java es un lenguaje que tiene la ventaja de ser multi-plataforma; esto es, xLogo podra ejecutarse en cualquier sistema operativo que soporte Java; tanto usando Linux como
III

IV
Windows o MacOS, xLogo funcionara sin problemas. Recientemente Java ha sido liberada bajo licencia GPL, lo que tambien garantiza su disponibilidad y gratuidad.
A lo largo del manual se iran planteando ejercicios y resolviendo ejemplos. Hemos elegido no utilizar tildes ni e
nes en los mismos debido a que en la mayora de los lenguajes de
programacion no las aceptan, pero xLogo las admite y trabaja perfectamente con ellas,
permitiendo el uso acentuado tanto de primitivas, como de variables y procedimientos.
Las soluciones se mostraran en el Tutorial, tambien disponible para descarga en la
seccion de Documentaci
on de nuestra web:
http://xlogo.tuxfamily.org/sp/documentacion.html

Indice general
1. Caractersticas de la Interfaz
1.1. Instalacion de Java . . . . . . . . . .
1.2. Ejecutar y configurar xLogo . . . .
1.2.1. En Windows . . . . . . . . . .
1.2.2. En Mac y Solaris . . . . . . .
1.2.3. En Linux . . . . . . . . . . .
1.3. Actualizaciones . . . . . . . . . . . .
1.4. Desinstalar . . . . . . . . . . . . . .
1.5. Primera Ejecucion . . . . . . . . . .
1.6. La ventana principal . . . . . . . . .
1.7. El editor de procedimientos . . . . .
1.8. Salir . . . . . . . . . . . . . . . . . .
1.9. Reiniciar xLogo . . . . . . . . . . .
1.10. Convenciones adoptadas para xLogo
1.10.1. El caracter especial \ . . . . .
1.10.2. May
usculas y min
usculas . . .
1.10.3. Las tildes . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

2
2
2
2
4
4
5
5
5
6
7
9
10
10
10
11
11

2. Opciones del Men


u
2.1. Men
u Archivo . . . .
2.2. Men
u Edicion . . . .
2.3. Men
u Herramientas .
2.4. Men
u Ayuda . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

12
12
14
14
18

3. Presentaci
on de la tortuga
3.1. Un programa de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. Una ayuda al dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20
20
24
25

4. Iniciaci
on a la Geometra de la tortuga
4.1. Descripcion de las primitivas o comandos . . . . . . . . . . . . . . . . . . .
4.2. Movimientos de la tortuga . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28
28
29
30

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

INDICE GENERAL

VI
4.4. Avanzando un poco . . . . . . . .
4.5. Ejercicios . . . . . . . . . . . . .
4.6. Aplicacion didactica de xLogo .
4.6.1. El triangulo equilatero . .
4.6.2. El hexagono . . . . . . . .
4.6.3. Trazar un polgono regular
4.7. Funcion avanzada de relleno . . .

. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
en general
. . . . . .

5. Procedimientos y subprocedimientos
5.1. Procedimientos . . . . . . . . . . . .
5.2. Ejercicios . . . . . . . . . . . . . . .
5.3. Sub-procedimientos . . . . . . . . . .
5.4. Ejercicios . . . . . . . . . . . . . . .
5.5. Actividad avanzada . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

6. Variables. Procedimientos con argumentos


6.1. Primitivas asociadas . . . . . . . . . . . . .
6.2. Procedimientos con variables . . . . . . . . .
6.3. Ejercicios . . . . . . . . . . . . . . . . . . .
6.4. Trazar una forma con distintos tama
nos . .
6.5. Actividad avanzada . . . . . . . . . . . . . .
6.6. Conceptos acerca de variables . . . . . . . .
6.7. Desde la Lnea de Comandos . . . . . . . . .
6.7.1. La primitiva define . . . . . . . . .
6.7.2. Las primitivas borra y borratodo .
6.7.3. La primitiva texto . . . . . . . . . .
6.7.4. La primitiva listaprocs . . . . . . .
6.7.5. La primitiva ejecuta . . . . . . . . .
7. Operaciones
7.1. Operaciones binarias . . . .
7.1.1. Con n
umeros . . . .
7.1.2. Con listas . . . . . .
7.2. Ejercicios . . . . . . . . . .
7.3. Operaciones unitarias . . . .
7.4. Ejercicios . . . . . . . . . .
7.5. Calculo superior . . . . . . .
7.6. Precision en los calculos . .
7.7. Ejercicios . . . . . . . . . .
7.8. Prioridad de las operaciones

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

31
33
34
34
35
36
36

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

38
38
39
41
42
43

.
.
.
.
.
.
.
.
.
.
.
.

44
44
46
48
49
51
51
53
54
54
54
55
55

.
.
.
.
.
.
.
.
.
.

56
56
56
58
60
62
63
63
64
64
65

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

INDICE GENERAL
8. Coordenadas y Rumbo
8.1. Cuadrcula y ejes . .
8.2. Coordenadas . . . . .
8.3. Ejercicios . . . . . .
8.4. Rumbo . . . . . . . .
8.5. Ejercicios . . . . . .
8.6. Actividad avanzada .

VII

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

9. Condicionales y Operaciones l
ogicas
9.1. Condicional . . . . . . . . . . . . .
9.2. Operaciones Logicas . . . . . . . .
9.3. Ejercicios . . . . . . . . . . . . . .
9.4. Booleanos . . . . . . . . . . . . . .
9.5. Ejercicios . . . . . . . . . . . . . .
10.Listas
10.1. Primitivas . . . . . . .
10.2. Ejemplo: Conjugacion
10.2.1. Primera version
10.2.2. Segunda version
10.2.3. Tercera version
10.3. Ejercicios . . . . . . .
10.4. Listas de Propiedades .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

11.Bucles y recursividad
11.1. Bucles . . . . . . . . . . . . . . . .
11.1.1. Bucle con repite . . . . . .
11.1.2. Bucle con repitepara . . .
11.1.3. Bucle con mientras . . . .
11.1.4. Bucle con paracada . . . .
11.1.5. Bucle con repitesiempre .
11.1.6. Bucle con repitemientras
11.1.7. Bucle con repitehasta . .
11.2. Ejemplo . . . . . . . . . . . . . . .
11.3. Comandos de ruptura de secuencia
11.4. Ejercicios . . . . . . . . . . . . . .
11.5. Recursividad . . . . . . . . . . . .
11.5.1. Retomando el ejemplo . . .
11.5.2. Ejercicios . . . . . . . . . .
11.6. Recursividad avanzada . . . . . . .
11.6.1. Copo de nieve . . . . . . . .
11.6.2. Aproximando (1) . . . . .
11.6.3. Con palabras y listas . . . .

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

67
67
68
69
70
70
71

.
.
.
.
.

72
72
73
75
76
77

.
.
.
.
.
.
.

79
79
83
83
83
84
84
86

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

87
87
87
88
89
90
91
91
92
92
93
94
97
99
99
100
100
102
103

INDICE GENERAL

VIII
11.7. Uso avanzado de procedimientos
11.7.1. La primitiva devuelve .
11.7.2. Variables opcionales . .
11.7.3. La primitiva trazado . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

104
104
104
105

12.Recibir entrada del usuario


12.1. Comunicacion con el usuario . . . . . . . . . . .
12.1.1. Ejercicios . . . . . . . . . . . . . . . . .
12.1.2. Propiedades del Historico de Comandos .
12.1.3. Ejercicios . . . . . . . . . . . . . . . . .
12.1.4. Escritura en Pantalla . . . . . . . . . . .
12.1.5. Ejercicios . . . . . . . . . . . . . . . . .
12.2. Interactuar con el teclado . . . . . . . . . . . .
12.3. Ejercicios . . . . . . . . . . . . . . . . . . . . .
12.4. Interactuar con el raton . . . . . . . . . . . . .
12.5. Ejercicios . . . . . . . . . . . . . . . . . . . . .
12.6. Componentes Graficos . . . . . . . . . . . . . .
12.6.1. Crear un componente grafico . . . . . . .
12.7. Ejercicios . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

106
106
107
108
109
111
112
112
113
115
117
119
119
121

13.T
ecnicas avanzadas de dibujo
13.1. Mas opciones para la tortuga . . . . . . .
13.2. Control del color . . . . . . . . . . . . . .
13.2.1. Primitivas que controlan los colores
13.2.2. Descripcion de los colores . . . . .
13.2.3. Funcion avanzada de relleno . . . .
13.3. Ejercicios . . . . . . . . . . . . . . . . . .

13.4. Control del Area


de dibujo . . . . . . . . .
13.4.1. Control del dibujo . . . . . . . . .
13.4.2. Control de las dimensiones . . . . .
13.5. Ejercicios . . . . . . . . . . . . . . . . . .
13.6. Manejando imagenes . . . . . . . . . . . .
13.6.1. Introduccion . . . . . . . . . . . . .
13.6.2. Practica: Escala de grises . . . . . .
13.6.3. Negativo . . . . . . . . . . . . . . .
13.7. Ejercicios . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

123
123
125
125
126
127
129
130
130
132
133
134
134
135
136
137

.
.
.
.
.

139
139
139
140
141
143

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

14.Modo multitortuga y Animaci


on
14.1. Multitortuga . . . . . . . . . . . . . . . . . . . .
14.1.1. Las primitivas . . . . . . . . . . . . . . .
14.1.2. Ejemplo. Curva de persecucion . . . . .
14.2. Ejercicios . . . . . . . . . . . . . . . . . . . . .
14.3. Aplicacion didactica: lanzamiento de dos dados

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

INDICE GENERAL
14.3.1. Simular el lanzamiento de un dado
14.3.2. El programa . . . . . . . . . . . . .
14.4. Animacion . . . . . . . . . . . . . . . . . .
14.4.1. Ejemplo . . . . . . . . . . . . . . .
14.5. Ejercicios . . . . . . . . . . . . . . . . . .
14.6. El increible monigote creciente . . . . . . .

IX
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

144
144
147
148
149
150

15.Manejo de Archivos
15.1. Las primitivas . . . . . . . . . . . . . . . . . . . .
15.1.1. Navegacion por el sistema de archivos . . .
15.1.2. Carga y guardado de procedimientos . . .
15.1.3. Modificando archivos . . . . . . . . . . . .
15.2. Ejecutando programas externos . . . . . . . . . .
15.3. Obtencion aproximada de (2) . . . . . . . . . .
15.3.1. Nocion de m.c.d. (maximo com
un divisor)
15.3.2. Algoritmo de Euclides . . . . . . . . . . .
15.3.3. Calcular un m.c.d. en xLogo . . . . . . .
15.3.4. Avanzando con el programa . . . . . . . .
15.4. Compliquemos un poco mas: que genera . . . .

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

152
152
152
154
155
156
157
157
158
158
159
161

.
.
.
.
.
.
.
.
.
.
.
.
.

163
163
163
164
164
166
167
168
169
169
170
176
177
179

16.Geometra de la tortuga en 3-D


16.1. La tortuga en Tres Dimensiones . . . . . . . . . . . . . . .
16.1.1. La proyeccion en perspectiva . . . . . . . . . . . . .
16.1.2. Entender la orientacion en el mundo tridimensional
16.1.3. Primitivas . . . . . . . . . . . . . . . . . . . . . . .
16.2. Primitivas disponibles tanto en 2D como 3D . . . . . . . .
16.3. Primitivas solo disponibles en 3D . . . . . . . . . . . . . .
16.4. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . .
16.5. El Visor 3D . . . . . . . . . . . . . . . . . . . . . . . . . .
16.5.1. Reglas . . . . . . . . . . . . . . . . . . . . . . . . .
16.5.2. Poliedros. Los solidos platonicos . . . . . . . . . . .
16.5.3. La esfera . . . . . . . . . . . . . . . . . . . . . . . .
16.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . .
16.7. Efectos de luz y niebla . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

17.Tocar m
usica (MIDI)
182
17.1. Las primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
17.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
17.3. Cargando archivos de m
usica . . . . . . . . . . . . . . . . . . . . . . . . . 185
18.Gesti
on de tiempos
186
18.1. Las primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
18.2. Actividad sobre las cifras de una calculadora . . . . . . . . . . . . . . . . . 188

INDICE GENERAL

18.2.1. El programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188


18.2.2. Creacion de una peque
na animacion . . . . . . . . . . . . . . . . . . 190
18.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
19.Utilizaci
on de la red con xLogo
19.1. La red: como funciona eso? . . . . . .
19.2. Primitivas orientadas a la red . . . . .
19.3. Robotica . . . . . . . . . . . . . . . . .
19.3.1. Presentacion . . . . . . . . . . .
19.3.2. La electronica . . . . . . . . . .
19.3.3. El lenguaje de la TortuRob .
19.3.4. Los comandos de la TortuRob

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

192
192
193
194
195
195
197
199

20.Acerca de xLogo
205
20.1. El sitio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
20.2. Acerca de este documento . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
21.Carnaval de Preguntas Artima
nas Trucos que conocer
207
21.1. Preguntas frecuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
21.2. Como puedo ayudar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
22.Configuraci
on avanzada de xLogo
22.1. Asociar los archivos .jar con Java
22.1.1. Configuracion del compresor
22.1.2. Configuracion de Windows .
22.2. Asociar archivos .lgo con xLogo .
22.2.1. En Windows . . . . . . . . .
22.2.2. En Linux . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

A. Iniciando xLogo desde la lnea de comandos

209
209
209
210
211
211
212
215

B. Ejecutando xLogo desde la web


217
B.1. El problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
B.2. Como crear un fichero .jnlp . . . . . . . . . . . . . . . . . . . . . . . . . . 217
C. Programaci
on Estructurada y Dise
no Modular
219
C.1. Programacion Estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . 219
C.2. Dise
no Modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
D. La esponja de Menger
D.1. Utilizando recursividad . . . . . . . . . . . . . . . . . . .
D.2. Segunda aproximacion. Solido de orden 4 . . . . . . . . .
D.2.1. La alfombra de Sierpinski . . . . . . . . . . . . .
D.2.2. Dibujando una alfombra de Sierpinski de orden p

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

221
222
224
224
225

INDICE GENERAL

XI

D.2.3. Otros esquemas posibles usando columnas . . . . . . . . . . . . . . 226


D.2.4. El programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
D.2.5. La esponja de Menger de orden 4 . . . . . . . . . . . . . . . . . . . 230
E. El sistema de Lindenmayer
E.1. Definicion formal . . . . . . . . .
E.2. Interpretacion por la tortuga . . .
E.2.1. Simbologa . . . . . . . . .
E.2.2. Copo de Koch . . . . . . .
E.2.3. Curva de Koch de orden 2
E.2.4. Curva del dragon . . . . .
E.2.5. Curva de Hilbert en 3D .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

239
239
241
241
241
243
244
245

INDICE GENERAL

Captulo 1
Caractersticas de la Interfaz
1.1.

Instalaci
on de Java

Antes que nada, debes tener instalado el JRE (Java Runtime Environment) en tu
ordenador. Si no lo tienes instalado, lo puedes descargar de la pagina web de Sun (es libre
y gratuito):
http://java.com/es/download/manual.jsp
Debes descargar la version que corresponda a tu sistema operativo (Linux, Windows, . . . ).
Si usas Linux es posible que JRE ya este instalado. Para confirmarlo, escribe en una consola:
java -version
Si no responde con un error, Java esta listo.
Lo siguiente entonces es descargar xLogo desde
http://xlogo.tuxfamily.org/
seleccionando el idioma espa
nol y haciendo clic en Descargas, en el men
u de la izquierda.
Mas directamente, el enlace es:
http://downloads.tuxfamily.org/xlogo/common/xlogo.jar

1.2.

Ejecutar y configurar xLogo

1.2.1.

En Windows

En teora, al hacer doble clic en el archivo xlogo.jar, el programa debera iniciarse.


Si es as, pasa a la siguiente seccion.

1.2. EJECUTAR Y CONFIGURAR XLOGO

Si no es as, y se ejecuta otra aplicacion (WinZIP, WinRAR, . . . ), eso se debe a que


en realidad los archivos .jar (como se presenta xLogo) son archivos comprimidos equivalentes a .zip. A veces, puedes darte cuenta de ello antes de hacer clic seg
un el icono que
tenga el archivo:

Se abre con Java

Se abre con WinRAR

Se abre con WinZIP

La forma mas facil de solucionarlo


consiste en hacer clic con el boton derecho sobre el archivo, seleccionar
Abrir con . . .
en el men
u elegir Java y activar
Utilizar siempre ...
siendo esta la forma recomendada.
Si no funciona, las alternativas son:
eliminar las extensiones .jar en
la configuracion del compresor
reinstalar Java
Finalmente, conviene incorporar las libreras asociadas a la m
usica. La version Windows de jre no incorpora los bancos de sonido que contienen los instrumentos, y hay que
descargarlos desde:
http://java.sun.com/products/java-media/sound/soundbank-min.gm.zip
la version mnima (unos 350 kb),
http://java.sun.com/products/java-media/sound/soundbank-mid.gm.zip
la version intermedia (algo mas de 1 Mb) y
http://java.sun.com/products/java-media/sound/soundbank-deluxe.gm.zip
la version de luxe (casi 5 Mb).
Una vez descargados, debemos descomprimirlos en el directorio audio de la instalacion
Java que, dependiendo de la version, puede ser:
C:\Archivos de programa\Java\jre1.6.0\lib\audio
creando el directorio audio si este no existe.
Hecho esto, la lista de instrumentos estara disponible.

CAPITULO 1. CARACTERISTICAS DE LA INTERFAZ

1.2.2.

En Mac y Solaris

Las cosas en un Mac son a


un mas faciles. Desde hace tiempo Apple incorpora Java
en sus sistemas operativos, as que simplemente haciendo clic sobre el archivo xlogo.jar
debera ejecutarse xLogo.

Solaris, por su parte, utiliza el escritorio Java Desktop System, en el que Java esta
perfectamente configurado.

1.2.3.

En Linux

Las cosas en Linux pueden ser muy faciles si la distribucion que utilizas incorpora Java
(algo bastante probable desde que Sun la libero bajo licencia GPL). Si es as, simplemente
haciendo doble clic sobre el archivo xlogo.jar debera iniciarse xLogo.
Si no, tras instalar Java, debes conocer en que directorio se encuentra el ejecutable,
habitualmente /usr/bin/ o /usr/java/ seguido de la version instalada, por ejemplo:
/usr/java/jre1.6.0/bin/java
A continuacion, descargamos xLogo (por ejemplo en el escritorio), hacemos clic con el
boton derecho sobre el archivo xlogo.jar Abrir con Otros . . . y en el cuadro de
dialogo Abrir con: escribir
/usr/java/jre1.6.0/bin/java -jar
y en KDE activar Recordar asociaci
on de programa para este tipo de archivo.

En KDE

En GNOME

1.3. ACTUALIZACIONES

A diferencia de lo que ocurre en Windows, Linux permite cambiar el icono u


nicamente
al archivo xlogo.jar sin afectar a otros archivos jar, as que puedes elegir tu tortuga
favorita, por ejemplo entre las cinco que puedes usar en xLogo o incluso el dragon gales.

Este procedimiento puede variar ligeramente seg


un uses KDE, GNOME, . . . pero
como ves, configurar Linux no es tan difcil como algunos creen.

1.3.

Actualizaciones

Para actualizar xLogo basta reemplazar el archivo xlogo.jar por la


nueva version. Es posible tener una alerta en tu correo suscribiendose a
la fuente RSS en
http://xlogo.tuxfamily.org/rss.xml

1.4.

Desinstalar

Para desinstalar xLogo, todo lo que hace falta es borrar el archivo xlogo.jar y
el archivo de configuracion .xlogo que se encuentra en /home/tu_nombre en Linux, o
c:\windows\.xlogo en Windows.

1.5.

Primera Ejecuci
on

La primera vez que ejecutes xLogo (o si has borrado el fichero .xlogo ver seccion 1.4)
deberas elegir el idioma con que quieres trabajar, seleccionando la bandera correspondiente
y haciendo clic en el boton OK.

CAPITULO 1. CARACTERISTICAS DE LA INTERFAZ

Esta eleccion no es definitiva; puedes elegir otro idioma en cualquier momento desde las
opciones de men
u (seccion 2.3)

1.6.

La ventana principal

En la fila superior, estan las entradas tpicas de men


u: Archivo, Edici
on, Herramientas, Ayuda
Justo debajo esta la Lnea de Comando, donde se escriben las instrucciones Logo.

En el medio de la pantalla, esta el Area


de Dibujo (donde se mueve la tortuga).
A la derecha del area de dibujo se encuentra una barra de herramientas vertical con
las funciones:

zoom (acercar y alejar), copiar, cortar , pegar y Comando de Inicio.

1.7. EL EDITOR DE PROCEDIMIENTOS

Al pie, esta la ventana del Hist


orico de Comandos, que muestra todo lo ingresado
y sus respuestas asociadas. Para reutilizar un comando previamente ingresado, hay
dos opciones: Hacer un clic en un comando del historico, o usar las teclas de flecha
arriba y flecha abajo del teclado (lo que es mas practico).
A la derecha de la ventana del historico hay dos botones: Editar y Alto.
Editar permite abrir la ventana del editor de procedimientos.
Alto interrumpe la ejecucion del programa ingresado.

1.7.

El editor de procedimientos

Hay cuatro maneras de abrir el editor:


Escribir editatodo o edtodo en la Lnea de Comando. La ventana del editor se
abrira mostrando todos los procedimientos definidos hasta ese momento.
Si deseas editar un procedimiento en especial (o algunos), debes usar ed o edita en
la lnea de comandos seguido del nombre de procedimiento, o la lista con los nombres
de procedimientos que deseas editar:
edita "nombre_procedimiento
o:
edita [proc_1 proc_2]
Hacer clic en el boton Editar.
Usar el atajo de teclado Alt+E
Estos son los diferentes botones que encontraras en la ventana del Editor:
Guarda en memoria los cambios hechos en el editor y cierra la
ventana. Es este boton el que se debe usar cada vez que quieras
aplicar los procedimientos recientemente incorporados.
Atajo de teclado: ALT+Q.

CAPITULO 1. CARACTERISTICAS DE LA INTERFAZ

Cierra la ventana del editor sin guardar los u


ltimos cambios.
Ten presente que NO aparece ning
un mensaje de confirmacion.
Aseg
urate bien de que realmente no hay nada que guardar.
Atajo de teclado: ALT+C.
Imprime el contenido del editor.
Copia el texto seleccionado al portapapeles.
Atajo de teclado: Control+C.
Corta el texto seleccionado y lo copia al portapapeles.
Atajo de teclado: Control+X.
Pega el contenido del portapapeles.
Atajo de teclado: Control+V.
Permite realizar b
usquedas y reemplazos en los procedimientos.
Permite deshacer los u
ltimos cambios realizados en los procedimientos.
Rehace lo deshecho con el boton anterior.

Nota: Aunque aqu se representa la imagen de Tux (mascota de Linux) en el boton


Guardar , en realidad se muestra la tortuga activa para dar la idea de enviar la informacion a la tortuga; por ejemplo, si la tortuga activa es la n
umero 3 (seccion 2.3):

En la parte inferior se encuentra lnea donde definir el Comando de Inicio, que se

activa con el boton situado a la derecha del Area


de Dibujo.
Al pulsar el boton, se ejecuta inmediatamente el Comando de Inicio sin necesidad de
escribirlo en la Lnea de Comandos, lo que es u
til para:
Ahorrar tiempo mientras se desarrolla un programa

1.8. SALIR

Al enviar un programa a alguien que se inicia en Logo, simplemente tiene que hacer
clic en ese boton para ejecutarlo
...
IMPORTANTE:
Nota que hacer clic en el icono de cierre ( ) de la barra de ttulo de la ventana del
Editor, no hace nada. Solamente funcionan los dos botones principales.
Para borrar los procedimientos que no se necesitan, usa los comandos borra y
borratodo o en la barra de men
us: Herramientas Borra procedimientos.
Al hacer clic para imprimir, aparecera una ventana de dialogo donde podremos configurar
distintas opciones de impresion:

General: Impresora a utilizar, Imprimir a un archivo, Rango de Impresion y N


umero
de copias.
Configurar P
agina: Tipo de papel, Origen del papel, Orientacion de la Hoja y
Margenes
Aspecto: Color (cuando disponible), Calidad, Caras y otros Atributos

1.8.

Salir

Para salir simplemente seleccionamos: Archivo Salir, o hacemos clic en en el icono


de cierre ( ). xLogo presentara una ventana de confirmacion:

Pulsamos S
y termina la ejecucion.

CAPITULO 1. CARACTERISTICAS DE LA INTERFAZ

10

1.9.

Reiniciar xLogo

Si en alg
un momento deseamos devolver al interprete xLogo a sus valores por defecto:
Color del lapiz:
Modo animacion:
Forma del lapiz:
N
umero tortugas:

negro
falso
cuadrado
16

Color del papel:


Tama
no de fuente:
Calidad del dibujo:
Tipo tortuga:

blanco
12 puntos
normal
0

disponemos de las primitivas inicializa y reponetodo que, tecleadas en la Lnea de


comandos hacen que la tortuga olvide los ajustes realizados hasta ese momento.

1.10.

Convenciones adoptadas para xLogo

Esta seccion define aspectos especiales acerca del lenguaje xLogo.

1.10.1.

El caracter especial \

El caracter \ (barra invertida o backslash) permite que las palabras (seccion 6.1)
contengan espacios o saltos de lnea.
\n produce un salto de lnea
\ produce un espacio entre palabras ( representa un espacio en blanco)
Ejemplos:
escribe "xlogo\ xlogo
escribe "xlogo\nxlogo

produce
produce

xlogo xlogo
xlogo
xlogo

Esto tiene implicaciones a la hora de obtener el caracter \ en la Lnea de Comandos:


se debe teclear \\. Todo caracter \ es ignorado. Este aviso es importante en particular para la gestion de archivos (captulo 15). Para establecer como directorio de trabajo
c:\Mis Documentos se debe escribir:
pondirectorio "c:\\Mis\ Documentos
Nota el uso de \ para indicar el espacio entre Mis y Documentos. Si se omite el doble
backslash, la ruta definida sera interpretada como:
c:Mis Documentos
y el interprete mostrara un mensaje de error.
Del mismo modo, permite obtener smbolos con un significado especial en xLogo:
\( (
\) )
\[ [
\] ]
\# #
\" "

1.10. CONVENCIONES ADOPTADAS PARA XLOGO

1.10.2.

11

May
usculas y min
usculas

xLogo no distingue entre may


usculas y min
usculas en el caso de nombres de procedimientos y primitivas. As, la primitiva pondirectorio utilizada antes, si escribes
PONDIRECTORIO o PoNDiReCToRio, el interprete de comandos interpretara y ejecutara
correctamente pondirectorio. Por otro lado, xLogo s respeta may
usculas y min
usculas
en listas y palabras:
escribe "Hola
proporciona
Hola
(la H inicial se mantuvo)

1.10.3.

Las tildes

Desde la version 0.9.92 las primitivas de xLogo en espa


nol admiten tildes. Tratandose
de un software para uso educativo, es importante que la ortografa sea la adecuada.
Para la acentuacion de las primitivas se siguen las normas ortograficas habituales, especialmente en aquellas primitivas compuestas por varias palabras. Por ejemplo:
poncolorl
apiz. La palabra l
apiz lleva tilde y la mantiene al formar parte de la
primitiva, ya que la acentuacion de esta recae sobre la a
leelineaflujo. Aunque l
nea lleva tilde al ser esdr
ujula, al pronunciar la primitiva
completa, observamos que es una palabra llana (el acento se encuentra en la u de
flujo), as que no se le asigna tilde.
S que lleva tilde en definel
nea y finl
nea, por el mismo motivo explicado antes
para l
apiz
Se procede del mismo modo en las formas cortas de las primitivas. Las formas cortas de definepol
gono y finpol
gono son, respectivamente, defpoli y finpoli.
Escuchando a los alumnos pronunciarlas, se opto por considerarlas llanas y sin tilde.
Dicho lo anterior, debemos avisar de que por compatibilidad con otras versiones se
mantiene la posibilidad de usar primitivas sin tilde, si bien recomendamos el uso acentuado
de las mismas.

Captulo 2
Opciones del Men
u
2.1.

Men
u Archivo

Archivo Nuevo: Elimina todos los procedimientos y variables definidos hasta el


momento para comenzar un nuevo espacio de trabajo. Se abrira una ventana para
confirmar la eliminacion de todos los procedimientos y variables:

Archivo Abrir: Carga un archivo Logo previamente guardado en disco.


Archivo Guardar como. . . : Graba un archivo (.lgo) de procedimientos definidos hasta ese momento en el disco, permitiendo asignarle un nombre.

Archivo Guardar: Graba un archivo (.lgo) con los procedimientos definidos


hasta ese momento en el disco. Esta opcion estara deshabilitada mientras no se le
haya asignado un nombre como se acaba de explicar en el punto anterior.
12

ARCHIVO
2.1. MENU

13

Archivo Capturar imagen Guardar imagen como. . . : Permite guardar


la imagen del area de dibujo en formato jpg o png. Para ello, puedes seleccionar previamente una parte de la imagen pulsando el boton izquierdo del raton y arrastrando.
Archivo Capturar imagen Imprimir imagen: Permite imprimir la imagen
del area de dibujo. Se puede seleccionar una zona a imprimir tal como se explico para
Guardar.
Archivo Capturar imagen Copiar al portapapeles: Permite enviar la
imagen al portapapeles del sistema. Del mismo modo que para Imprimir y Guardar, se puede seleccionar una zona. Esta opcion funciona perfectamente en entornos
Windows y Mac:

pero no as en entornos Linux (el portapapeles no tiene el mismo funcionamiento).


Archivo Zona de texto Guardar en formato RTF: Guarda el contenido
del Hist
orico de Comandos en un fichero con formato RTF (Rich Text Format),
manteniendo los colores de los mensajes. Si no se escribe la extension .rtf, se a
nade
automaticamente.

Archivo Salir: Finaliza la ejecucion de xLogo. Tambien puede terminarse la


ejecucion desde la Lnea de comandos con la primitiva adios.


CAPITULO 2. OPCIONES DEL MENU

14

2.2.

Men
u Edici
on

Edici
on Copiar: copia el texto seleccionado en el portapapeles. Atajo de teclado:
Control+C
Edici
on Cortar: corta el texto seleccionado y lo copia en el portapapeles. Atajo
de teclado: Control+X
Edici
on Pegar: pega el texto desde el portapapeles a la lnea de comandos. Atajo
de teclado: Control+V
Edici
on Seleccionar todo: Selecciona todo lo que se encuentra escrito en la
Lnea de Comandos.

2.3.

Men
u Herramientas

Herramientas Elegir el color del l


apiz: Permite elegir el color con que la
tortuga dibujara, desde la paleta de colores, mediante una definicion HSB (Hue, Saturation, Brightness - Tonalidad, Saturacion, Brillo) o desde una codificacion RVA
(Rojo, Verde y Azul).

Tambien accesible con el comando poncolorlapiz. (Seccion 13.2.1)


Herramientas Elegir el color de fondo (papel): Pone un color como fondo
de pantalla, con las mismas caractersticas que Elegir Color del L
apiz. Tambien
accesible con el comando poncolorpapel. (Seccion 13.2.1)
Herramientas Definir archivos de inicio: Permite establecer la ruta a los
archivos de inicio.

Cualquier procedimiento contenido en estos archivos .lgo se convertiran en seudoprimitivas del lenguaje xLogo. Pero no pueden ser modificadas por el usuario. As
se pueden definir primitivas personalizadas.

HERRAMIENTAS
2.3. MENU

15

Herramientas Traducir procedimientos: Abre una caja de dialogo que permite traducir los comandos xLogo entre dos idiomas. Es muy u
til, en particular,
cuando se obtienen codigos Logo en ingles (de internet, por ejemplo) para expresarlos en el idioma deseado (Espa
nol, Frances, . . . )

Herramientas Borra procedimientos: Abre una caja de dialogo que permite


selccionar el procedimiento que se desea borrar, de una forma mas sencilla que con
la primitiva borra.
Herramientas Preferencias: Abre una caja de dialogo donde se pueden configurar varios aspectos:
General:
Idioma: Permite elegir entre Frances, Ingles, Espa
nol, Portugues, Aleman,

Esperanto, Arabe, Gallego, Asturiano, Griego, Italiano, Catalan y H


ungaro.
Nota que las primitivas se adec
uan a cada lenguaje.
Aspecto: Permite definir el aspecto de la ventana xLogo. Estan disponibles los estilos Windows, Metal y Motif.
Velocidad de la tortuga: Si prefieres ver todos los movimientos de la
tortuga, puedes reducir la velocidad con la barra deslizante.

Elecci
on de la tortuga: Elige entre siete tortugas distintas. Tambien accesible
con el comando ponforma (Seccion 14.1)


CAPITULO 2. OPCIONES DEL MENU

16
Opciones:

Cuadrcula en el fondo: Establece (o elimina) una cuadrcula en el fondo

del Area
de dibujo, as como las medidas de la misma. Tambien accesible
con las primitivas cuadricula y borracuadricula. (Seccion 8)

Ejes cartesianos: Muestra (o retira) los ejes cartesianos (X e Y) del Area


de dibujo, establece su escala (separacion entre marcas) y su color. Tambien
accesible con las primitivas ejes, borraejes, ejex, ejey y poncolorejes
(Seccion 8).
Color de papel preasignado: Permite elegir el color por defecto del papel,
es decir, el mostrado al iniciar xLogo.
Color de l
apiz preasignado: Permite elegir el color por defecto del lapiz,
es decir, el utilizado al iniciar xLogo.
Marco de adorno: Permite elegir que marco de adorno se muestra alre
dedor del Area
de Dibujo, una imagen o un color solido. Para no superar
la memoria asignada, la imagen no puede ocupar mas de 100 kb.

HERRAMIENTAS
2.3. MENU

17

N
umero m
aximo de tortugas: Para el modo multitortuga (seccion 14.1).
Por defecto 16.
Tama
no m
aximo del l
apiz: Puedes fijar un tama
no lmite para el lapiz.
Si no se va a utilizar esta limitacion, introduce el n
umero -1 en el recuadro
asociado.
Forma del l
apiz: Cuadrado o Redondo
Tama
no de la ventana para dibujar: Puedes establecer un tama
no

personalizado para el Area


de Dibujo. Por defecto xLogo establece un
area de 1000 por 1000 pixels.
Atenci
on: seg
un aumenta el tama
no de la imagen, puede ser necesario
aumentar la memoria destinada a xLogo. Un mensaje de error advertira
si ocurre esto.
Calidad que se aplica al dibujo: Normal, Alto o Bajo. En calidad Alta, no se aprecia ning
un efecto en particular, pero puede producirse una
ralentizacion de la ejecucion.
Borrar pantalla al salir del editor: S o No
Tama
no de la ventana para dibujar: Determina las dimensiones del

Area de dibujo.
Memoria destinada a xLogo: (en Mb) Por defecto, el valor asignado

es 64 Mb. Puede ser necesario aumentarlo cuando el tama


no del Area
de
Dibujo sea demasiado grande. La modificacion de este parametro solo se
hara efectiva tras cerrar y reiniciar xLogo.
Atenci
on: no aumentar en exceso y/o sin razon este valor, ya que puede
ralentizar considerablemente el sistema.
N
umero del puerto TCP: Puedes cambiar el puerto por defecto para el
uso de xLogo en red y robotica (captulo 19)
Sonido: La lista de instrumentos que puede imitar la tarjeta de sonido a traves
de la interfaz MIDI. Puedes seleccionar un instrumento concreto en cualquier
momento, mediante la primitiva poninstrumento n.

Si usas Windows, recuerda instalar las libreras soundbank.gm como se explico


en la seccion 1.2.1.


CAPITULO 2. OPCIONES DEL MENU

18

Fuente: Elige el tipo de letra y su tama


no

Resaltado: Elige los colores que se utilizaran en el resaltado de primitivas,


palabras, variables n
umeros, parentesis y corchetes.

2.4.

Men
u Ayuda

Ayuda Manual en lnea: Muestra el manual de referencia de xLogo, para lo


que es necesario estar conectado a internet.
Ayuda Licencia: Muestra la licencia original GPL (en Ingles) bajo la cual se
distribuye este programa.

Ayuda Traducci
on de la Licencia: Refiere a una traduccion al espa
nol de la
licencia GPL, sin efectos legales, solo como referencia para entender la version en
Ingles.
Ayuda Traducir xLogo: Abre una ventana para a
nadir y/o corregir traducciones.

AYUDA
2.4. MENU

19

Desde ella pueden crearse y/o modificarse tanto las primitivas como los mensajes.
Una vez creados/modificados, haz clic fuera de la celda que acabas de escribir y
pulsa el boton Si. Se abrira una ventana donde debes elegir el fichero de texto donde
guardar los cambios y que debes enviar a loic@xlogo.tuxfamily.org

Ayuda Acerca de. . . : Lo de siempre . . . y xlogo.tuxfamily.org para guardar


en favoritos!! o:)

Captulo 3
Presentaci
on de la tortuga
Como presentamos a nuestra tortuga?

3.1.

Un programa de ejemplo

Empecemos por el siguiente procedimiento:


http://downloads.tuxfamily.org/xlogo/downloads-sp/curso/presentacion.lgo
Descarguemos el fichero a nuestro disco duro, abramoslo (Archivo Abrir Elegir la
ubicacion donde lo hayamos descargado clic en Abrir) y en la ventana que nos aparece
(la del Editor de Procedimientos):

comprueba que la lnea de Comando de inicio aparece la palabra:


presentacion
(si no, escrbela t
u). No te preocupes de momento por todo lo que hay escrito, en breve
seras capaz de dise
narlo t
u mismo/a). Finalmente, hacemos clic en el ping
uino (o tortuga)
20

3.1. UN PROGRAMA DE EJEMPLO

21

y . . . no pasa nada?
Observa el Historico de Comandos. xLogo te informa de que:
Acaba de definir presentacion.
pero ademas, has definido la orden que se ejecutara al pulsar el boton de Comando de
inicio

No esperes mas. Pulsa el boton y . . . deberas obtener una pantalla como esta:

Haz todas las pruebas que necesites para entender c


omo se
mueve la tortuga, c
omo mide los
angulos, las distancias, . . . Fjate, especialmente, en c
omo realiza los giros y procura entender
el punto de vista de la tortuga.
Que podemos hacer con una pantalla como la de arriba? Podemos, por ejemplo, ense
nar la lateralidad en los u
ltimos cursos de Infantil y reforzarla en los primeros cursos de
Primaria:
Descarguemos el fichero
http://downloads.tuxfamily.org/xlogo/downloads-sp/curso/juego.lgo
abramoslo y comprueba que el Comando de Inicio ahora es empezar:

22

DE LA TORTUGA
CAPITULO 3. PRESENTACION

Guardamos (hacemos clic en el ping


uino o tortuga) y despues en el de Comando de inicio.
Despues de contestar a la pregunta (un valor de 20 o 25 esta bien) el resultado debe ser
una pantalla similar a esta:

(Usa las barras de desplazamiento si no ves alguna de las figuras de esta captura).
Acabas de cargar un sencillo juego que consiste en llevar a la tortuga hasta el lago situado
en la parte superior derecha usando solamente los botones de desplazamiento. Los crculos
negros representan piedras y estan colocadas aleatoriamente:

3.1. UN PROGRAMA DE EJEMPLO

23

Si choca con una piedra, nos aparece un aviso y vuelve al punto de partida
Cuando llegue al lago, nos felicitara y sonara una cancioncilla (concretamente, supercalifragilisticoexpialidoso de la pelcula Mary Poppins).
Sin embargo, la creacion de este tipo de juegos no es la principal caracterstica que
xLogo aporta al aula. El verdadero metodo de trabajo con Logo se basa en proponer
actividades (especialmente graficas) para que el alumno se comporte como el maestro
de la tortuga y le indique, razonadamente, que pasos debe seguir para conseguirlas. Por
ejemplo, para dibujar esta casa:

El alumno debe:
1. Entender el mismo aquello que va a ense
nar.
2. Planear una forma de impartirlo.
3. Trocear el problema en miniproblemas mas facilmente abordables.
4. Saber como comunicarlo claramente.
5. Establecer este nuevo conocimiento como las bases de uno futuro.
6. Ser consciente del conocimiento que su alumno (la tortuga) ya tiene, y construir
basandose en el.
7. Ser receptivo para explorar nuevas ideas seg
un aparezcan.
8. Responder a los malentendidos de su alumno.
Ademas, lo mas importante en el proceso de aprendizaje con Logo no es el resultado final,
sino c
omo haces lo que haces; es decir, ver como se crea el dise
no es mas interesante y

DE LA TORTUGA
CAPITULO 3. PRESENTACION

24
educativo que el dise
no en s.

Logo no esta limitado a ning


un area o tema en particular (a lo largo de este curso se
iran planteando ejercicios de Lengua, Fsica, . . . ). Sin embargo es muy u
til para matematicas, ya que las graficas generadas por la tortuga, medir sus movimientos en distancias y
grados, . . . permiten estudiar geometra mediante la construccion de polgonos y figuras.

Echa un vistazo a las


ordenes contenidas en los ficheros con
los que hemos trabajado, e intenta adivinar qu
e hacen, qu
e
par
ametros les acompa
nan, por qu
e algunas est
an coloreadas y
otras no, . . .

3.2.

Ejercicios

Con la pantalla del programa presentacion, intenta dibujar:


a) Una rana:

b) Un robot:

c) Un barco:

d ) Tres piramides:

e) Un horreo:

f ) Este faro:

3.3. UNA AYUDA AL DIBUJO

3.3.

25

Una ayuda al dibujo

Antes de empezar a dar ordenes a nuestra tortuga, deberamos acostumbrarnos a dibujar nosotros mismos las figuras en un papel (lo mismo vale cuando los procedimientos no
dibujen, sino que hagan operaciones numericas o con listas). Ver los dibujos en pantalla
no es facil y, en muchos casos, no obtendremos buenos resultados sin haber dibujado antes
sobre el papel.
Una peque
na ayuda: en la pagina siguiente, recorta la imagen de la tortuga que prefieras, o dibuja t
u otra que te guste mas, y ponsela al lapiz. As haras dibujar a la tortuga
tanto en tu papel como en el ordenador.
Te aconsejamos que uses un lapiz con una goma al otro lado y que tengas cerca lapices
de colores, ya que encontraremos ordenes que nos ayudaran a borrar lo que hicimos mal y
ya has visto que podemos cambiar el color del lapiz.

DE LA TORTUGA
CAPITULO 3. PRESENTACION

26
.

3.3. UNA AYUDA AL DIBUJO


.

27

Captulo 4
Iniciaci
on a la Geometra de la
tortuga
Comenzamos la descripcion de las primitivas de xLogo.

4.1.

Descripci
on de las primitivas o comandos

Las primitivas son ordenes basicas que el programa ya tiene incorporadas; al escribirlas
en la lnea de comandos ordenan a la tortuga realizar una accion determinada. La ventaja
de Logo frente a otros lenguajes radica en que las ordenes pueden escribirse en el idioma
natural del usuario/programador, de modo que resultan muy faciles de entender.
Cada primitiva puede tener un cierto n
umero de parametros que son llamados argumentos. Por ejemplo, la primitiva pi, que devuelve el valor del n
umero (3.141592653589793),
no lleva argumentos: la primitiva escribe espera uno (escribe muestra en el Historico
de Comandos ese argumento), mientras que la primitiva suma (seccion 7.1) tiene dos argumentos.
escribe suma 2 3 devuelve 5.
Los argumentos en Logo son de tres tipos: N
umero, Palabra o Lista
N
umeros: Algunas primitivas esperan n
umeros como su argumento: avanza 100
(seccion 4.2) es un ejemplo.
Palabras: Las palabras se escriben precedidas por ". Un ejemplo de una primitiva
que admite una palabra como argumento es escribe.
escribe "hola

devuelve

hola

Nota que si olvidas las comillas ("), el interprete devuelve un mensaje de error. En
efecto, escribe esperaba ese argumento, pero para el interprete, hola no representa
nada, ya que no fue definido como n
umero, ni palabra, ni lista, ni procedimiento.
28

4.2. MOVIMIENTOS DE LA TORTUGA

29

Listas: Se definen encerrandolas entre corchetes.


escribe [El gato es gris]

devuelve

El gato es gris

Los n
umeros son tratados a veces como un valor (por ej: avanza 100), o bien como una
palabra (por ejemplo: escribe vacio? 12 devuelve falso seccion 9.4).
Algunas primitivas tienen una forma general, esto es, pueden ser utilizadas con n
umeros
o argumentos opcionales. Estas primitivas son:
escribe
suma, producto (seccion 7.1)
o, y (seccion 9.2)
lista, frase, palabra (seccion 10.1)
Para que el interprete las considere en su forma general, tenemos que escribir las ordenes
entre parentesis. Observa los ejemplos:
escribe (suma 1 2 3 4 5)
devuelve:
15
Tambien:
escribe (lista [a b] 1 [c d])
devuelve:
[a b] 1 [c d]
y
si (y 1=1 2=2 8=5+3) [avanza 100 giraderecha 90]

4.2.

Movimientos de la tortuga

Empecemos por las primitivas que controlan el movimiento de la tortuga:


Primitiva
AVanzar n pasos
REtroceder n pasos
Gira Derecha n grados
Gira Izquierda n grados
Llevar la tortuga al centro de la pantalla

Forma larga
Forma
avanza n
av
retrocede n
re
giraderecha n
gd
giraizquierda n
gi
centro

corta
n
n
n
n

A LA GEOMETRIA DE LA TORTUGA
CAPITULO 4. INICIACION

30

Observa que no todas las primitivas son necesarias. Por ejemplo:


giraizquierda 90 equivale a giraderecha -90
retrocede 100 equivale a avanza -100
Por ejemplo, para dibujar un cuadrado,

podemos teclear:
avanza 200 giraderecha 90 avanza 200 giraderecha 90 av 200 gd 90 av 200
donde puedes ver que podemos utilizar indistintamente las primitivas en su forma larga o
en la forma abreviada sin problemas.
Haz todas las pruebas que necesites para entender perfectamente estas primitivas. Comprueba que la predicci
on del tema
anterior de c
omo realiza los giros es correcta, y si has entendido
bien el punto de vista de la tortuga

4.3.

Ejercicios

En los dibujos, el lado de cada cuadrado de la cuadrcula mide 25 pasos de tortuga.


1. Dibuja el borde de un cuadrado en sentido antihorario
2. Dibuja el borde de un cuadrado en sentido horario

3. Dibuja el borde de un triangulo equilatero en sentido antihorario

4.4. AVANZANDO UN POCO

31

4. Dibuja el borde de un rectangulo

5. Dibuja el borde de un hexagono regular


6. Dibuja:

a)

b)

c)

d)

e)

f)

La tortuga tiene muy mala memoria, as que todas las ordenes que has dado para dibujar los ejemplos se perder
an.
Puedes hacer dos cosas: copiarlas en un papel, o usar la Opcion del Men
u: Archivo Zona de Texto Guardar en
formato RTF.

4.4.

Avanzando un poco

Continuemos con primitivas que controlan otros aspectos:


Primitiva
Borrar Pantalla y tortuga al centro
Subir Lapiz (no deja trazo al moverse)
Bajar Lapiz (s deja trazo al moverse)
Ocultar Tortuga
Mostrar Tortuga

Forma larga
borrapantalla
subelapiz
bajalapiz
ocultatortuga
muestratortuga

Forma corta
bp
sl
bl
ot
mt

A LA GEOMETRIA DE LA TORTUGA
CAPITULO 4. INICIACION

32

Primitiva
Cambiar el color del trazo con que dibuja
Cambiar el grosor del trazo con que dibuja
Borrar por donde pasa, en vez de escribir
Dejar de borrar y volver a escribir
Rellenar con el color activo una region cerrada
Rellenar una region limitada por el color activo
Limpiar la pantalla dejando la tortuga en el sitio
Repetir n veces lo indicado entre corchetes

Forma larga
Forma corta
poncolorlapiz n
poncl n
pongrosor n
goma
go
bajalapiz
bl
rellena
rellenazona
limpia
repite n

La primitiva poncolorlapiz debe ir acompa


nada de un n
umero (ver secion 13.2.2), y
las opciones con las que trabajaremos de momento seran:
0: negro
4: azul

1: rojo
5 magenta

2: verde
6: cyan

3: amarillo
7 blanco

Respecto a repite, las ordenes a repetir deben ir entre corchetes, por ejemplo:
repite 4 [escribe "Hola ]
escribe 4 veces la palabra Hola
Por ejemplo, para dibujar el mismo cuadrado del ejemplo anterior:

habamos escrito:
av 200 gd 90 av 200 gd 90 av 200 gd 90 av 200
Es facil observar que hay ordenes que se repiten cuatro veces. Si pensamos un momento,
podemos ver que a
nadir un giraderecha mas no va a modificar el dibujo, as que podremos
escribir:
repite 4 [ avanza 200 giraderecha 90 ]
con el mismo resultado.
Analiza los programas con los que dibujaste antes los
cuadrados, el tri
angulo y el hex
agono. Ves como se repiten varias veces las mismas ordenes? Aplica lo que acabamos
de ver con la primitiva repite para hacer mas sencillos tus
programas.

4.5. EJERCICIOS

4.5.

33

Ejercicios

1. Dibuja el borde de un cuadrado, pero ahora usa la primitiva repite


2. Dibuja el borde de un triangulo equilatero usando la primitiva repite
3. Dibuja el borde de un hexagono regular usando la primitiva repite
4. Dibuja el borde de un cuadrado, cuyo centro este en el centro de la pantalla
5. Dibuja un rectangulo, rellenando el interior

Problema 4
Problema 5
Problema 6
Problema 7
De nuevo, el lado de cada cuadrado de la cuadrcula mide 25 pasos de tortuga
6. Dibuja el borde de un hexagono regular y las diagonales cuyos extremos son dos
vertices opuestos del mismo
Acabas de dibujar polgonos de 3, 4 y 6 lados. Seras
capaz de determinar una regla para hallar el
angulo
de giro en cualquier polgono?
Observa que la tortuga da una vuelta completa alrededor del
polgono, que al final del proceso vuelve a estar mirando hacia
arriba y fjate cuantas veces tiene que girar.
7. Dibuja los radios de una rueda. En total tienen que salirte 24
8. Dibuja:

a)

b)

c)

A LA GEOMETRIA DE LA TORTUGA
CAPITULO 4. INICIACION

34

d)

e)

f)

Recuerda copiar las respuestas a los problemas en un papel,


o guardarlas en el disco duro:
Archivo Zona de Texto Guardar en formato RTF.

Qu
e te parece este m
etodo para dibujar? Crees que
puede mejorarse? C
omo?
Que pasa si quiero que los polgonos tengan lados mas largos
o mas cortos? Y si quiero cambiar el tama
no de las figuras
que acabas de conseguir?

4.6.

Aplicaci
on did
actica de xLogo

Ya hemos visto como dibujar el cuadrado, pero podemos analizar un poco mejor el
proceso que hemos seguido para hacerlo.

4.6.1.

El tri
angulo equil
atero

Vamos a ver como trazar este triangulo equilatero de 180 pasos de tortuga:

Aqu, un cuadrado representa 30 pasos de tortuga


Las ordenes seran algo del estilo:
repite 3
[ avanza 180 giraderecha ... ]

DIDACTICA

4.6. APLICACION
DE XLOGO

35

Queda por determinar el angulo correcto. En un triangulo equilatero, los angulos valen
todos 60 grados, y como la tortuga debe volver por el exterior del triangulo, el angulo
valdra:
180 - 60 = 120 grados
Las ordenes son, pues:
repite 3
[ avanza 180 giraderecha 120 ]

4.6.2.

El hex
agono

Un cuadrado = 20 pasos de tortuga.


Para un cuadrado repetamos 4 veces, para el triangulo 3 veces, parece claro que para
el hexagono sera:
repite 6
[ avanza 80 giraderecha ... ]
Date cuenta que en su desplazamiento, la tortuga realmente da una vuelta completa sobre
ella misma. (Inicialmente esta orientada hacia arriba y termina en esta misma posicion).
Esta rotacion de 360 grados se efect
ua en 6 etapas. Por tanto, cada vez, gira
360/6 = 60 grados
Las ordenes son, entonces:
repite 6
[ avanza 80 giraderecha 60 ]

A LA GEOMETRIA DE LA TORTUGA
CAPITULO 4. INICIACION

36

4.6.3.

Trazar un polgono regular en general

En realidad, reiterando el razonamiento anterior, puedes darte cuenta de que para trazar
un polgono de n lados, el angulo se obtendra dividiendo 360 por n. Por ejemplo:
Para trazar un pentagono regular de lado 100: (360:5=72)
repite 5 [ avanza 100 giraderecha 72 ]
Para trazar un eneagono regular de lado 20: (360:9=40)
repite 9 [ avanza 20 giraderecha 40 ]
Para trazar un eh . . . 360-gono1 regular de lado 2 (que se parece mucho a un crculo):
repite 360 [ avanza 2 giraderecha 1 ]
Para trazar un heptagono regular de lado 120:
repite 7 [ avanza 120 giraderecha 360/7 ]
En el siguiente captulo vamos a aprender como evitar que se pierdan las ordenes que
hemos dado a la tortuga, de un modo mas simple que guardando en RTF y copiando.

4.7.

Funci
on avanzada de relleno

xLogo posee una tercera primitiva de relleno, rellenapoligono. Su u


nico argumento
es una lista que debe contener las instrucciones para dibujar una figura poligonal cerrada:
rellenapoligono [ lista_de_instrucciones]
Esta primitiva rellena la forma creada por triangulacion (utilizando una serie de triangulos), de modo que cada vez que la tortuga dibuja una lnea, el triangulo que se genera es
rellenado con el color activo.
Por ejemplo:
rellenapoligono [ repite 4 [avanza 100 giraderecha 90]]

Paso 1
1

Paso 2

Paso 3

Paso 4

Trihectahexacont
agono: tri = 3, hecta = 100, hexaconta = 60, gono = angulo

AVANZADA DE RELLENO
4.7. FUNCION

37

Utilizado adecuadamente, puede proporcionar resultados llamativos:


repite 5
[ avanza 100 rellenapoligono [ retrocede 100 giraderecha 144 avanza 100 ]
avanza 100 giraizquierda 72]

Paso 1

Paso 2

Paso 3

Paso 4

Paso 5

Captulo 5
Procedimientos y subprocedimientos
5.1.

Procedimientos

El captulo anterior nos mostro varias cosas que deberan preocuparnos: En primer
lugar, la tortuga olvida como dibujamos las figuras, es decir, las ordenes que le damos
desaparecen de una vez para la siguiente.
En segundo, cada figura obligaba a teclear las ordenes cambiando las medidas una a
una. Por ejemplo, para dibujar un cuadrado de lado 100, debamos escribir:
repite 4 [ avanza 100 giraderecha 90 ]
cada vez que queramos que apareciera en pantalla.
Y si es un rectangulo? La secuencia es mas larga, y si quiero otro tama
no debera
modificar dos medidas.
Podemos hacer que xLogo aprenda nuevas primitivas, definiendo lo que se denomina procedimientos.
Haz clic en el boton Editar, en la ventana emergente que acaba de aparecer escribe:

y haz clic en el boton del ping


uino/tortuga. Acabas de definir el procedimiento cuadrado,
y la tortuga dibujara un cuadrado de lado 100 cada vez que le digas cuadrado.

38

5.2. EJERCICIOS

39

Prueba ahora con el siguiente procedimiento:


.

Que aparece al escribir rectangulo en la lnea de comandos?


Intenta crear procedimientos llamados avanza, cosa,
cuadricula y circulo. Qu
e observas al escribir el
nombre? Por qu
e crees que es? Qu
e ocurre al guardar el procedimiento?
Un procedimiento debe contener obligatoriamente, las primitivas para, seguida de
una palabra que indicara el nombre que deseamos darle al procedimiento, y fin, que
indica el final de un procedimiento.
Mas adelante veremos otras opciones para los procedimientos.

5.2.

Ejercicios

1. Plantea un procedimiento triangulo, que dibuje el borde de un triangulo equilatero


2. Plantea un procedimiento hexagono, que dibuje el borde de un hexagono regular
3. Plantea un procedimiento que dibuje un cuadrado en el centro de la pantalla
4. Plantea un procedimiento que dibuje los 24 radios de la rueda de una bicicleta
5. Usando los procedimientos rectangulo y cuadrado definidos antes, dibuja:

a)

b)

c)

6. Plantea un procedimiento que dibuje un rombo, y con el dibuja la helice:

40

CAPITULO 5. PROCEDIMIENTOS Y SUBPROCEDIMIENTOS

Observa que los nombres de los procedimientos est


an
relacionados con el dibujo (u objetivo) que deseamos.
Esta es una norma de buena educaci
on a la hora de
programar, y hace m
as inteligibles los programas.

5.3. SUB-PROCEDIMIENTOS

5.3.

41

Sub-procedimientos

Podemos conseguir efectos interesantes combinando procedimientos, es decir, haciendo


que un procedimiento llame a otro.
Los programas siguientes dibujan una coleccion de cuadrados con un vertice o un lado
com
un, aprovechando el procedimiento cuadrado definido antes:

Antes citabamos una norma de buena educacion, a partir de ahora la llamaremos estilo.
Tambien se aconseja indentar las lneas para reconocer mas facilmente donde empiezan y
donde acaban determinadas secuencias de ordenes.
Finalmente, hablaremos de los comentarios. En xLogo pueden a
nadirse lneas que NO
seran interpretadas por la tortuga. Estas lneas se llaman comentarios; sirven para explicar
que hace un programa. Teclea el siguiente procedimiento:

Puedes ver que la segunda lnea empieza por #, y aparece en color gris. La almohadilla indica a la tortuga que es un comentario, as que ignora la lnea y sigue leyendo las
siguientes.

CAPITULO 5. PROCEDIMIENTOS Y SUBPROCEDIMIENTOS

42

Usar la forma larga de las primitivas, buscar nombres


para las variables relacionados con aquello con lo que
estamos trabajando, indentar y comentar los programas ayuda a hacerlos m
as f
acilmente legibles.
Para parar la ejecucion de un procedimiento antes de llegar al final (es decir, hacerle
saltar directamente hasta fin) se puede usar la primitiva alto, pero es mejor intentar no
usarla. Igualmente, si vemos que un procedimiento no se termina por el mismo, podemos
hacer clic en el boton Alto, situado al lado del boton de Editar.

5.4.

Ejercicios

1. Plantea un procedimiento que dibuje una coleccion de hexagonos regulares con un


vertice en com
un, cada uno girado 60 grados respecto del anterior
2. Observa que en las siguientes figuras puedes ver un cuadrado al que le falta un lado.
Modifica el procedimiento cuadrado para que solo dibuje tres lados y dibuja:

a)

b)

c)

3. Observa las siguientes figuras y busca un patron que se repite. Usalo


para dibujar:

a)

b)

c)

d)

4. Plantea un procedimiento que dibuje una fila horizontal de cinco triangulos equilateros, cuyas bases esten contenidas en la misma recta
IMPORTANTE: Los procedimientos pueden guardarse en
el disco duro de tu ordenador de forma que luego puedes recuperarlos sin re-escribirlos como se explico en 2.1

5.5. ACTIVIDAD AVANZADA

5.5.

43

Actividad avanzada

Debes conseguir el dibujo que se muestra a continuacion.

Cada cuadrado vale 10 pasos de tortuga.


Para ello, deberas definir ocho procedimientos:
Un procedimiento cuadrado que trazara el cuadrado basico de la casa
Un procedimiento tri que trazara el triangulo equilatero que representa el tejado
Un procedimiento puerta que trazara el rectangulo que representa la puerta
Un procedimiento chi que trazara la chimenea
Un procedimiento desp1 que desplazara la tortuga de la posicion A a la B
Un procedimiento desp2 que llevara a la tortuga desde la posicion B a la C
Un procedimiento desp3 que hara a la tortuga ir de la posicion C a la D
Un procedimiento casa que trazara la casa en su totalidad ayudandose de todos
los demas procedimientos

Captulo 6
Variables. Procedimientos con
argumentos
Muchas veces se necesita dibujar una misma figura varias veces, pero con distintas
dimensiones. Por ejemplo, si queremos dibujar un cuadrado de lado 100, otro de lado 200 y
un tercero de lado 50, con lo que sabemos hasta ahora necesitaramos tres procedimientos
distintos:

para cuadrado 1
repite 4 [avanza 100 giraderecha 90]
fin
para cuadrado 2
repite 4 [avanza 200 giraderecha 90]
fin
para cuadrado 3
repite 4 [avanza 50 giraderecha 90]
fin
Es evidente que necesitamos una forma mas simple de hacerlo, y que debera ser posible
definir un u
nico procedimiento que, de alg
un modo, permitiera cambiar el argumento de
la primitiva avanza, es decir, el lado del cuadrado.
Ese es el papel de las variables.

6.1.

Primitivas asociadas

Definimos ahora seis nuevas primitivas:


44

6.1. PRIMITIVAS ASOCIADAS

Descripci
on
Guardar un valor en una variable
Utilizar el valor de a
Enumerar todas las variables definidas.
Eliminar la variable var.

45

Primitiva
haz
:
cosa
objeto
listavars
borravariable, bov

Ejemplo
haz "lado 115
escribe :a
escribe cosa "a
escribe objeto "a
listavars
borravariable "lado

Por compatibilidad con otros interpretes Logo, se admite imvars (imprime todas las variables) con la misma funcion que listavars.
Fjate en la diferencia:
Para definir la variable, se antepone "
Para leer la variable, se precede de :, la forma mas comoda de las tres posibles:
cosa "a, objeto "a y :a son notaciones equivalentes.
Aunque lo detallaremos mas adelante, debemos comentar que xLogo trata de distinta
forma los n
umeros, las palabras y las frases. Para distinguir cuando una variable almacena
un tipo distinto, debemos usar un vocabulario especfico:
N
umero: Para guardar en la variable lado el valor 100:
haz "lado 100
Palabra: Para guardar en la variable animal la palabra GATO:
haz "animal "GATO
Frase: Para guardar en la variable descripcion la frase El gato es gris:
haz "descripcion [El gato es gris]
En xLogo (y en otros lenguajes de programacion) se utiliza el termino Lista para
referirse a aquellas variables que constan de varios elementos, por ejemplo:
haz "primitiva [ 5 9 23 26 45 48 ]
que contiene una posible combinacion del sorteo de la Lotera primitiva NO es una frase,
ya que no consta de palabras. Es una Lista.
Una lista puede constar de varias sublistas, por ejemplo:

CAPITULO 6. VARIABLES. PROCEDIMIENTOS CON ARGUMENTOS

46

haz "primitiva [ [5 9 23 26 45 48] [5 8 18 26 40 46] [20 24 28 31 36 39] ]


consta de tres sublistas, y se pueden combinar variables de cualquier tipo:
haz "listado [ [[Pepe Perez] 15 CuartoA] [[Lola Lopez] 16 CuartoB] ]
contiene dos sublistas, cada una con una lista (nombre), un n
umero (edad) y una palabra
(el grupo de clase)
Si el valor que guarda la variable es un n
umero, puede operarse con ella igual que con
un n
umero:
haz "lado 100
avanza :lado
e incluso pueden usarse para definir otras:

que dibuja un rectangulo de base doble que la altura.

Qu
e otras utilidades le ves al uso de variables? Como las usaras
para responder a las preguntas con las que cerrabamos el tema 4? Puedes
imaginar alg
un uso de las listas?

6.2.

Procedimientos con variables

Recuperando nuestro procedimiento cuadrado:


para cuadrado
repite 4 [
avanza 100 giraderecha 90 ]
fin
introducir variables es muy simple:
Indicamos cual va a ser la variable, de nuevo, con un nombre adecuado: lado
Sustituimos el valor numerico que nos interesa por la variable

6.2. PROCEDIMIENTOS CON VARIABLES

47

El resultado es:

que dibuja, como ya habras adivinado, un cuadrado. La diferencia esta en que ahora el
lado es desconocido, y debemos indicarle a la tortuga cuanto debe medir:
cuadrado 30
cuadrado 50
cuadrado 250
dibujaran cuadrados de lados 30, 50 y 250, respectivamente:

Podemos prever varios argumentos:

CAPITULO 6. VARIABLES. PROCEDIMIENTOS CON ARGUMENTOS

48

donde vemos que depende de dos variables. Por ejemplo, rectangulo 200 100 trazara un
rectangulo de altura 200 y anchura 100.
borrapantalla ocultatortuga
rectangulo 200 100 rectangulo 100 300
rectangulo 50 150 rectangulo 10 20
rectangulo 140 30
genera:

Ahora bien, si no se proporciona alguno de los argumentos al procedimiento rectangulo,


el interprete nos indicara con un mensaje de error que el procedimiento necesita otro argumento:
No hay suficientes datos para rectangulo

6.3.

Ejercicios

1. Plantea un procedimiento triangulo que necesite una variable lado y que dibuje un
triangulo equilatero cuyo lado sea ese valor
2. Plantea un procedimiento rueda que dibuje los 36 radios de longitud largo de una
rueda
3. Plantea un procedimiento bandera que dibuje una bandera consistente en un mastil
de longitud mastil y cuya tela sea un rectangulo de lados ancho y alto


6.4. TRAZAR UNA FORMA CON DISTINTOS TAMANOS

49

4. Plantea un procedimiento poligono, que reciba dos entradas: n y largo, y dibuje un


polgono regular de n lados de longitud largo
Pista: Para hacer divisiones, xLogo utiliza la primitiva /.
Por ejemplo: escribe 256/5 devuelve 51.2
5. Plantea un programa que dibuje una fila de n ruedas, cada una con 36 radios de
longitud largo, de modo que la distancia entre los centros de dos ruedas contiguas
sea distancia

Prueba con distintos valores de largo y distancia y observa


qu
e ocurre. Cual es la relacion entre distancia y largo cuando se
superponen las ruedas? Y cuando estan separadas? Que podramos
hacer para que nunca se superpusieran?

6.4.

Trazar una forma con distintos tama


nos

Vimos como trazar un cuadrado y un rectangulo con dos tama


nos distintos. Ahora
volvamos al ejemplo de la casa de la pagina 43 y como modificar el codigo para dibujar la
casa sin que importen las dimensiones. Estamos introduciendo, de este modo, el concepto
de proporcionalidad y semejanza.
El objetivo es pasar un argumento al procedimiento casa para que, seg
un el parametro,
la casa sea mas o menos grande. Es decir:
casa 10 dibujara la casa de la seccion 5.5.
casa 5 dibujara la casa a escala 0,5.
casa 20 dibujara una casa con las dimensiones dos veces mas grandes
Seg
un el dibujo de la seccion 5.5, un cuadrado representa 10 pasos. El procedimiento
cuadrado era el siguiente:
para cuadrado
repite 4
[ avanza 150 giraderecha 90 ]
fin

CAPITULO 6. VARIABLES. PROCEDIMIENTOS CON ARGUMENTOS

50

que ahora se va a convertir en:


para cuadrado :c
repite 4
[ avanza :c giraderecha 90 ]
fin
As, cuando se escriba cuadrado 10, el cuadrado tenda un lado igual a 15 * 10 = 150.
Las proporciones se mantienen correctamente! De hecho, hay que darse cuenta de que va a
ser necesario reescribir todos los procedimientos y cambiar las longitudes de desplazamiento
de la siguiente manera.
70 se convertira en 7 * :c
av 45 se convertira en av 4.5 * :c
etc.
Eso hace que, en realidad, solamente haya que contar el n
umero de cuadrados para cada
longitud! Se obtiene:
para cuadrado :c
repite 4
[ avanza 15*:c giraderecha 90 ]
fin
para tri :c
repite 3
[ avanza 15*:c giraderecha 120 ]
fin
para puerta :c
repite 2
[ avanza 7*:c giraderecha 90
avanza 5*:c giraderecha 90 ]
fin
para chi
avanza
avanza
avanza
fin

:c
5.5*:c giraderecha 90
2*:c giraderecha 90
2*:c

para desp1 :c
subelapiz

6.5. ACTIVIDAD AVANZADA

51

giraderecha 90 avanza 5*:c


giraizquierda 90
bajalapiz
fin
para desp2 :c
subelapiz
giraizquierda 90 avanza 5*:c
giraderecha 90 avanza 15*:c
giraderecha 30
bajalapiz
fin
para desp3 :c
subelapiz
giraderecha 60 avanza 2*:c
giraizquierda 90 avanza 3.5*:c
bajalapiz
fin
para casa :c
cuadrado :c desp1 :c puerta :c desp2 :c tri :c desp3 :c chi :c
fin

6.5.

Actividad avanzada

Realiza los siguientes dibujos con dos variables de modo que sea posible obtenerlos a
distintos tama
nos:

6.6.

Conceptos acerca de variables

Hay dos tipos de variables:

CAPITULO 6. VARIABLES. PROCEDIMIENTOS CON ARGUMENTOS

52

Variables globales: estan siempre accesibles desde cualquier parte del programa.
Variables locales: solo son accesibles dentro del procedimiento donde fueron definidas.
En esta implementacion del lenguaje Logo, las variables locales no son accesibles desde
otro subprocedimiento. Al finalizar el procedimiento, las variables locales son eliminadas.
Las primitivas asociadas son:
Primitivas

Argumentos

haz

palabra, b

local

palabra

hazlocal

palabra b

Uso
Si la variable local palabra existe, se le asigna el
valor b (de cualquier tipo). Si no, sera la variable
global palabra la asignada con el valor b.
Crea una variable llamada a. Atencion: la variable
no es inicializada. Para asignarle un valor, hay que
usar haz.
Crea una nueva variable llamada palabra y le asigna el valor b.

Supongamos que en el u
ltimo ejercicio de la seccion anterior quisieramos controlar la
separacion entre ruedas para evitar que se superpongan unas con otras. Podramos hacer
que distancia fuera siempre algo mas del doble que largo, para lo que planteamos dos
subprocedimientos distintos:

Observa que se usan tres variables relacionadas con la longitud: largo, radio y distancia.
Al ejecutar el programa tecleando:

6.7. DESDE LA LINEA DE COMANDOS

53

borrapantalla ruedas 3 100


la tortuga lee largo, y le asigna el valor 100. Sin embargo, radio solo existe mientras se
esta ejecutando el procedimiento rueda y desaparece al finalizar este. Puedes comprobarlo
modificando el procedimiento:

que devolvera 100 (el valor de largo) y un mensaje de error:


En ruedas, l
nea 4:
radio no tiene valor.

Estudia qu
e ocurre con distancia en las dos definiciones que
hemos hecho de separa. Cambia escribe :radio por escribe
:distancia y observa que responde xLogo seg
un hayas usado haz o
hazlocal.

Las variables locales son muy u


tiles en programas largos, con varios procedimientos. Si cada uno usa sus propias variables, no es probable que haya errores debidos a que
alguna de ellas sea modificada en el procedimiento equivocado.

6.7.

Desde la Lnea de Comandos

Los procedimientos pueden ser creados y borrados desde la Lnea de Comandos. Igualmente, podemos determinar cuales han sido ya definidos y cuales no o ejecutar una serie
de ordenes sin necesidad de crear un procedimiento asociado.

CAPITULO 6. VARIABLES. PROCEDIMIENTOS CON ARGUMENTOS

54

6.7.1.

La primitiva define

La primitiva define crea un nuevo procedimiento sin usar el Editor. Para ello debemos
proporcionar el nombre, las variables y las instrucciones a ejecutar:
define nombre [variables] [instrucciones]
Por ejemplo:
define "cuadrado [lado] [repite 4 [ avanza :lado giraderecha 90]]
crea el procedimiento cuadrado con el que ya hemos trabajado antes.

6.7.2.

Las primitivas borra y borratodo

La primitiva borra elimina el procedimiento indicado. La sintaxis es:


borra nombre
Por ejemplo:
borra "cuadrado
elimina el procedimiento cuadrado definido antes.
Por su parte, borratodo, sin argumentos, elimina todas las variables y procedimientos
actuales.
Mucho cuidado al usar esta primitiva. Teniendo en cuenta que es muy improbable que sea escrita por error, NO presenta ninguna ventana de confirmacion, y realmente elimina
TODO lo que hayas definido hasta ese momento.

6.7.3.

La primitiva texto

Si deseamos conocer la informacion asocidada a un procedimiento, tecleamos:


escribe texto nombre_proc
La primitiva texto devuelve una lista que contiene toda la informacion asociada al procedimiento indicado. Concretamente, devuelve una lista que contiene sublistas:
La primera lista contiene todas las variables fijas y opcionales del procedimiento.
Las demas sub-listas son las lneas del procedimiento.

6.7. DESDE LA LINEA DE COMANDOS

6.7.4.

55

La primitiva listaprocs

Esta primitiva no necesita argumentos, y enumera todos los procedimientos definidos


hasta ese momento en el Historico de Comandos. Por compatibilidad con otros interpretes
Logo, se admite imts (imprime todos) con la misma funcion.

6.7.5.

La primitiva ejecuta

Tecleando ejecuta [lista], las ordenes contenidas en lista son ejecutadas consecucutivamente.
Por ejemplo:
giraizquierda 27
ejecuta [ repite 5
[ repite 4
[ avanza 100 giraizquierda 90 ]
giraderecha 72 ] ]
proporciona:

Un ejemplo mas curioso de esta primitiva se muestra en la pagina de nuestro compa


nero
Guy Walker:
http://www.logoarts.ko.uk
donde para dibujar un arco iris utiliza una lista que contiene las primitivas asociadas a
seis colores (Seccion 13.2.1) y con un bucle (Captulo 11) cambia el color del lapiz (Seccion
4.4) ejecutando su nombre:
...
haz "color [ rojo naranja amarillo verde azul violeta ]
repitepara [colores 1 6]
[ poncolorlapiz ejecuta elemento :colores :color rellena
subelapiz giraderecha 90 avanza 20 giraizquierda 90 bajalapiz ]
...

Captulo 7
Operaciones
Que ocurre si necesitamos realizar operaciones en xLogo? Disponemos de las siguientes primitivas:

7.1.

Operaciones binarias

Son aquellas que implican a dos elementos.

7.1.1.

Con n
umeros

Descripci
on
Sumar dos n
umeros

Primitiva/s
suma o +

Multiplicar dos n
umeros

producto o *

Restar dos n
umeros
Dividir dos n
umeros reales
Cociente entero
Resto de una division entera
Calcular una potencia

diferencia o division o /
cociente
resto
potencia

Ejemplo
suma 15 20 o 15 + 20
devuelven 35
producto (-5) 6 o (-5) * 6
devuelven -30
diferencia 35 (-10) o 35 - (-10)
devuelven 45
division 35 3 o 35 / 3
devuelven 11.666666666666666
cociente 35 3
devuelve 11
resto 35 3
devuelve 2
potencia 3 1.5
devuelve 5.196152422706632

Si se trata de sumas o productos de varios n


umeros, podemos usar la forma general de
suma y producto:
13 + 7 + 2.5
13 * 7 * 2.5

(suma 13 7 2.5)
(producto 13 7 2.5)
56

7.1. OPERACIONES BINARIAS

57

Fjate en los parentesis de la segunda forma; son obligatorios. El resultado puede ser simplemente mostrado por pantalla:
escribe 13 + 7 + 2.5
escribe 13 * 7 * 2.5

escribe (suma 13 7 2.5)


escribe (producto 13 7 2.5)

o puede ser usado para dibujar:


avanza 13 + 7 + 2.5
retrocede 13 * 7 * 2.5

giraderecha (suma 13 7 2.5)


giraizquierda (producto 13 7 2.5)

Si, por ejemplo, queremos calcular cuantas formas distintas tenemos de rellenar una
quiniela, le pediremos a la tortuga:
escribe potencia 3 15
devuelve
1.4348907E7
(315 = 14 348 907), el resultado se muestra en notacion cientfica.

Analiza el siguiente procedimiento. Recuerda el uso de la barra invertida (seccion 1.10.1) para generar espacios y saltos de lnea. Te presentamos ademas la primitiva tipea, que escribe en el Historico de comandos
pero, a diferencia de escribe, no produce un salto de lnea

Que crees que hacen las variables contador1 y contador2? Por que
crees que las hemos usado? Se te ocurre una forma mejor de conseguir lo
mismo? Como mejoraras el aspecto con el que salen los los resultados?

CAPITULO 7. OPERACIONES

58

7.1.2.

Con listas

No solo pueden efectuarse operaciones con n


umeros. Las palabras y las frases (listas de
palabras) pueden concatenarse (ponerse una a continuacion de la otra). Disponemos de las
primitivas frase y lista (haremos un estudio mas profundo de las listas en el captulo
10). Por ejemplo:
escribe frase [El gato es ] [gris]
muestra en pantalla:
El gato es gris
pero:
escribe lista [El gato es ] [gris]
muestra en pantalla:
[El gato es] [gris]
es decir, crea una lista cuyos elementos son los argumentos, lo que en este caso lleva a
obtener una lista de listas.
Tambien es posible concatenar listas con n
umeros o variables. Por ejemplo, si la variable
area contiene el valor 250 podemos pedirle a xLogo:
escribe frase [La superficie es ] :area
que proporciona:
La superficie es 250
ya que frase ha concatenado la lista La superficie es y el valor de :area
Concatenar listas con variables es una forma de que
los mensajes de xLogo a la hora de presentar los resultados se entiendan mejor.
Ejemplo: Vamos a crear un procedimiento que calcule el area de un triangulo
dandole la base y la altura
Recuerda que el
area de un tri
angulo es: A = b * h / 2

o bien:

7.1. OPERACIONES BINARIAS


Para ejecutarlo, escribimos:
area_triangulo 3 5
Es posible ser un poco mas elegante. T
u sabras lo que hace este programa
solo viendo los resultados o, incluso, leyendolo? Cambiemos la pen
ultima lnea:

o bien:

que al ejecutarlo:
area_triangulo 3 5
proporciona:
El area del triangulo de base 3 y altura 5 es 7.5
No se entiende mejor?
Observa otra capacidad del lenguaje xLogo. Hemos reutilizado la variable
texto varias veces, incluyendo en su definicion a ella misma. Esto es u
til
cuando no quieres definir varias variables para un proceso que se refiere a una
misma cosa (en este caso ir aumentando palabra a palabra el texto a mostrar
en pantalla).
Podramos haber aprovechado la forma general de la primitiva frase:

59

CAPITULO 7. OPERACIONES

60

7.2.

Ejercicios

1. Modifica el procedimiento tabla presentado como ejemplo para que muestre la tabla
de restar y la tabla de multiplicar. Que observas?
2. Crea un procedimiento acumula que reciba dos n
umeros (n1 y n2) como argumentos,
dibuje dos segmentos cuyas longitudes sean precisamente n1 y n2 separados por un
signo mas y a continuacion dibuje el segmento cuya longitud sea la suma de n1 y
n2 precedido del signo igual.

3. Modifica el procedimiento anterior para que los segmentos aparezcan colocados como
en las sumas tradicionales: los sumandos unos encima de otros, el signo mas a la
izquierda, una lnea de operacion y el resultado en la parte inferior. Usa colores
para diferenciar los sumandos del signo y la lnea y estos del resultado

(Nota que en este caso los segmentos empiezan a dibujarse desde la derecha)
4. A partir de los procedimientos anteriores, construye los procedimientos sustrae que
en lugar de sumas hagan restas de segmentos.
Prueba distintas posibilidades, observando que ocurre cuando
n1 es mayor que n2 y viceversa.
5. Crea un procedimiento superficie con dos argumentos, n1 y n2, dibuje un rectangulo cuyos lados midan n1 y n2 y calcule su area.
6. Echa un vistazo a tu clase, y cuenta el n
umero de chicos y de chicas que hay. Con
esa informacion, crea el procedimiento quesitos que:
a) Calcule cuantos/as estudiantes hay en tu clase
b) Dibuje una circunferencia. Para ello usa la primitiva circulo, que necesita un
argumento (n
umero), y dibuja una circunferencia de radio n
umero centrada en
la posicion actual de la tortuga

7.2. EJERCICIOS

61

c) Divida el crculo en dos partes proporcionales al n


umero de chicas y chicos y los
coloree con distintos colores
Por ejemplo, si en una clase hay un 40 % de chicos y un 60 % de chicas, el dibujo
debera ser algo as:

7. Con el procedimiento cuadrado definido en el captulo anterior, dibuja:

a)

b)

8. Programa un procedimiento que dibuje una fila horizontal de n baldosas cuadradas


cuyo lado sea la variable lado y que aparezcan centradas en pantalla
9. Dibuja:

a)

b)

10. Escribe un procedimiento rayos, que dibuje los n radios de longitud largo de una
rueda (solo los radios)

CAPITULO 7. OPERACIONES

62

7.3.

Operaciones unitarias

Son aquellas que solo necesitan un elemento:


Descripci
on
Hallar la raz cuadrada de un n
umero
Cambiar el signo
Valor absoluto de un n
umero
Truncamiento de un n
umero decimal
Redondear un n
umero al entero mas
cercano
Generar un n
umero aleatorio comprendido entre 0 y n-1
Generar un n
umero aleatorio comprendido entre 0 y 1

Primitiva/s
raizcuadrada
o rc
cambiasigno
o absoluto o
abs
trunca

Ejemplo
raizcuadrada 64 o rc 64
devuelven 8

redondea

redondea 3.565 devuelve 4

azar n
aleatorio

cs 5 devuelve -5
abs (-5) devuelve 5
trunca 3.565 devuelve 3

azar 6 devuelve un entero


entre 0 y 5
aleatorio devuelve un n
umero entre 0 y 1

La primitiva truncar puede usarse para conseguir un n


umero entero cuando nos aparece
en notacion cientfica. En el apartado 7.1.1 calculabamos cuantas formas distintas tenemos
de rellenar una quiniela, y escribimos:
escribe potencia 3 15
Si usamos
escribe truncar potencia 3 15
nos devuelve:
14348907
Ejemplo: Queremos un procedimiento que calcule el cociente y el resto de la division
entera entre A y B, es decir, conseguir lo que proporcionan las primitivas cociente y resto,
pero sin usarlas.
para division_entera :A :B
haz "C truncar (:A / :B)
escribe :C
escribe :A - :B * :C
fin
La primitiva azar devuelve n
umeros aleatorios comprendidos entre 0 y n - 1. Como haras para simular el lanzamiento
de un dado? Lee con cuidado la seccion 7.8 para evitar conclusiones
erroneas.

7.4. EJERCICIOS

7.4.

63

Ejercicios

1. Modifica el procedimiento division_entera de modo que devuelva los resultados


indicando con mensajes que es cada n
umero.
2. Plantea un procedimiento Pitagoras que refiriendose a un triangulo rectangulo, acepte los valores de los catetos y calcule el valor de la hipotenusa.
3. Intenta escribir un procedimiento suerte, que genere un n
umero al azar del conjunto
{20 , 25 , 30 , 35 , 40 , 45 , 50}.1
4. Plantea un procedimento dados, que simule el lanzamiento de dos dados y cuya
salida sea la suma de ambos
5. El procedimiento juego con el que presentamos a la tortuga en el captulo 3 ubica las
piedras de forma aleatoria. Piensa como haras para ubicar n piedras circulares y
coloreadas en posiciones aleatorias
6. Plantea un procedimiento que simule un sorteo de Lotera Nacional, esto es, generar
un n
umero de 5 cifras por extraccion consecutiva de 5 bolas con valores comprendidos entre 0 y 9 y colocarlas una a continuacion de otras (recuerda la prmitiva
tipea)
En un sorteo de la Lotera Primitiva hay 49 bolas numeradas
en un u
nico bombo, y de el se extraen consecutivamente 6 bolas.
Podramos usar la primitiva azar para simular un sorteo de la
Primitiva?

7.5.

C
alculo superior

xLogo puede evaluar funciones trigonometricas y logartmicas.


Descripci
on
Calcular el seno de un angulo
Calcular el coseno de un angulo
Calcular la tangente de un angulo
Obtener el angulo cuyo seno es n
Obtener el angulo cuyo coseno es n
Obtener el angulo cuya tangente es n
Evaluar el logaritmo decimal de un n
umero
Evaluar el logaritmo neperiano de un n
umero
x
Exponencial de un n
umero (e )
1

Primitiva/s
seno o sen
coseno o cos
tangente, tg o tan
arcoseno, arcsen o asen
arcocoseno, arccos o acos
arcotangente, arctg o atan
log o log10
logneperiano o ln
exp

Ejemplo
seno 45
coseno 60
tangente 135
arcsen 0.5
arccos 1
arctg 1
log 100
ln 100
exp 2

Recuerda que azar 5 + 10 es lo mismo que azar (5 + 10), es decir, azar 15. Igualmente
10 + azar 5 es equivalente a (azar 5) + 10

CAPITULO 7. OPERACIONES

64

7.6.

Precisi
on en los c
alculos

En ocasiones, necesitaremos trabajar con mas precision de la que el programa permite


en sus ajustes iniciales. Si queremos que xLogo realice los calculos utilizando un mayor
n
umero de dgitos, debemos utilizar la primitiva pondigitos o pondecimales.
Las dos formas de esta primitiva se deben a las diferencias de nivel academico a las que
podemos enfrentarnos, siendo mas facil entender para un ni
no peque
no que la precision
aumenta con los decimales. Por lo demas, su sintaxis es muy simple:
pondecimales n o pondigitos n
fija la precision del calculo:
1. Por defecto, xLogo usa 16 dgitos.
2. Si n es negativa, se vuelve al valor inicial (el valor inicial es 1).
3. Si n es cero, todos los n
umeros se redondean a la unidad.
De modo equivalente, las primitivas decimales y digitos devuelven el n
umero de dgitos
utilizados en el calculo.
En el apartado 7.1 calculabamos el n
umero de combinaciones distintas en una quiniela
(3 ) usando la primitiva potencia: escribe potencia 3 15 >1.4348907E7.
Si tecleamos antes: pondecimales 0, la misma orden nos devuelve ahora 14348907
Un ejemplo mas avanzado se encuentra en la pagina 102.
15

7.7.

Ejercicios

Pista para los tres problemas siguientes: Puedes usar las primitivas repite y
contador2 y una variable en la que ir guardando los resultados parciales.
1. Sabras crear un procedimiento poten :x :n que calcule xn (supuesto que n es un
n
umero natural) sin usar la primitiva potencia?
2. Crea un procedimiento factorial :n, que calcule el factorial del n
umero n.
Recuerda: n! = n * (n - 1) * ...* 2 * 1
3. Intenta ahora conseguir un procedimiento suma_potencias :n que calcule la suma
2 + 4 + 8 + ...+ 2n
Para los problemas siguientes necesitar
as hacer algunos c
alculos trigonom
etricos antes de ponerte a programar.
2

Echale un vistazo a la secci


on 11.1.1 para entenderlas bien

7.8. PRIORIDAD DE LAS OPERACIONES

65

4. Plantea un procedimiento poligono_regular, que dibuje un polgono regular de n


lados de longitud lado inscrito en una circunferencia
5. La flor hexapetala (conocida como flor de agua o flor galana en Asturias) es muy
sencilla de dibujar u
nicamente con un compas:

Plantea un procedimiento flor que haga uso de la primitiva arco (arco necesita tres
argumentos: el radio, el angulo donde empieza y el angulo donde termina, medido
siempre en forma absoluta, es decir, 0 es siempre hacia arriba, independientemente
de hacia donde mire la tortuga) y que reciba un argumento radio para dibujar la
flor galana.
6. Plantea un procedimiento con dos argumentos: radio y n, que dibuje un crculo con
ese radio, y que inscriba en el un polgono de n lados.
7. (Este problema requiere importantes conocimientos de geometra y/o dibujo t
ecnico) Plantea un procedimiento que dibuje una flor, pidiendo el radio y el
n
umero n de petalos que tiene.

7.8.

Prioridad de las operaciones

Utilizando la forma corta, +, -, * y /, xLogo realiza las operaciones (como no poda


ser de otra manera) obedeciendo a la prioridad de las mismas. As si escribimos:
escribe 3 + 2 * 4
xLogo efect
ua primero el producto y luego la suma, siendo el resultado 11.
Como sabemos, la presencia de parentesis modifica el orden en que se deben realizar
las operaciones. Por ello, si escribimos:
escribe (3 + 2) * 4
xLogo efectuara la suma antes que el producto, y el resultado sera 20.

CAPITULO 7. OPERACIONES

66

Hay que tener cuidado, y esto es muy importante, si se usan las primitivas suma,
diferencia, producto, division, potencia, . . . , ya que internamente tienen una prioridad inferior a las anteriores. Este es un comportamiento que estamos intentando solucionar, ya que incumple las reglas por todos conocidas. Hasta entonces, aconsejamos utilizar
los parentesis para evitar sorpresas desagradables:
escribe (seno 20) + 10
escribe (raizcuadrada 3) + 1
escribe (azar 6) + 1

--> 10.3420201433256687
--> 2.7320508075688772
--> 1, 2, 3, 4, 5 o 6

Captulo 8
Coordenadas y Rumbo
Como podemos saber donde se encuentra la tortuga? Puedo enviarla a un punto
concreto de la pantalla con una sola orden? Hacia donde esta mirando? Estas preguntas
se responden en este captulo.

8.1.

Cuadrcula y ejes

Comencemos por las primitivas que pueden ayudarnos enormemente en nuestro trabajo
con las coordenadas:
Primitivas

Argumentos

cuadricula

a b (n
umeros)

detienecuadricula

no

poncolorcuadricula, primitiva,
pcc
lista o numero
ejes

n
umero

ejex

n
umero

ejey

n
umero

detieneejes

ninguno

poncolorejes, pce

primitiva,
lista o numero

Uso

Dibuja una cuadrcula en el Area


de dibujo
de dimensiones a x b y borra la pantalla

Quita la cuadrcula del Area


de dibujo y
borra la pantalla

Establece el color de la cuadrcula del Area


de dibujo
Dibuja los ejes cartesianos (X e Y) de escala
(separacion entre marcas) n, con las etiquetas
correspondientes.
Dibuja el eje de abscisas (eje X) de escala
(separacion entre marcas) n, con las etiquetas
correspondientes.
Dibuja el eje de ordenadas (eje Y) de escala
(separacion entre marcas) n, con las etiquetas
correspondientes.

Quita los ejes del Area


de dibujo y borra
la pantalla

Establece el color de los ejes en el Area


de
dibujo

67

CAPITULO 8. COORDENADAS Y RUMBO

68

El sistema cartesiano con coordenadas ortogonales no es el u


nico
que existe. Investiga otros sistemas de representacion e intenta crear
procedimientos que los muestren en pantalla.
Nota: detienecuadricula y detieneejes retiran la cuadrcula y los ejes de pantalla,
y tambien la borra del mismo modo que borrapantalla

8.2.

Coordenadas

El Area
de Dibujo es un sistema cartesiano cuyo origen esta situado en el centro de la
pantalla. De este modo, podemos alcanzar cualquiera de los puntos de dicho area ayudados
por sus coordenadas. Las primitivas asociadas son:
Primitiva
Mostrar la posicion (devuelve una lista)
Mostrar solo la abscisa (coordenada X)

Forma larga
posicion
primero posicion
coordenadax
Mostrar solo la ordenada (coordenada Y)
ultimo posicion
coordenaday
Mover al punto [X,Y] (X,Y n
umeros)
ponposicion [X Y]
Pintar el punto de coordenadas [X,Y]
punto [X Y]
Mover hacia [X,Y] (X,Y n
umeros o variables)
Llevar hacia el punto de abscisa X (n
umero o variable)
Llevar hacia el punto de ordenada Y (n
umero o variable)

Forma corta
pos
pr pos
coordx
ultimo pos
coordy
ponpos [X Y]
ponxy :X :Y
ponx :X
pony :Y

De nuevo debemos tener cuidado con la prioridad de las primitivas. Si alguna coordenada es negativa, debemos usar parentesis:
ponxy 100 (-60)
Para usar ponposicion con variables, debemos usar la primitiva frase:
ponposicion frase :abscisa :ordenada
Un ejemplo sencillo de su utilizacion:
borrapantalla
ponpos [200 100]
ponpos [50 -150]
ponpos [-100 -150]

8.3. EJERCICIOS

8.3.

69

Ejercicios

1. Dibuja un rectangulo usando solamente las primitivas ponx y pony


2. Dibuja un triangulo rectangulo isosceles usando u
nicamente ponposicion
3. Construye el procedimiento segmento, cuyas 4 entradas sean las coordenadas de dos
puntos y que dibuje el segmento cuyos extremos son esos dos puntos.
4. Define el procedimiento cuadrilatero, cuyas OCHO entradas sean las coordenadas
de cuatro puntos y que dibuje el cuadrilatero cuyos vertices son esos ocho puntos.
5. Plantea un procedimiento dist_ptos, que a partir del procedimiento segmento calcule la distancia entre los dos puntos (o lo que es lo mismo, la longitud del segmento)
Dato: La distancia entre dos puntos (x0,y0) y (x1,y1) se calcula mediante la
formula:
q
d = (x0 x1 )2 + (y0 y1 )2
6. Define el procedimiento triangulo, cuyas SEIS entradas sean los vertices de un
triangulo, lo dibuje y lo rellene.
7. Dibuja:

a)

b)

c)

CAPITULO 8. COORDENADAS Y RUMBO

70

8.4.

Rumbo

Las primitivas asociadas al rumbo son:


Primitiva
Forma larga
Orientar la tortuga hacia un rumbo n
ponrumbo :n
Pedir el rumbo (en grados respecto de la vertical y sentido horario)
Para volver al origen con rumbo 0 (mirando hacia arriba)
Pedir el rumbo que la tortuga debe seguir hacia el punto [X Y]
Pedir la distancia (en pasos) hasta el punto [X Y]

Forma corta
ponr :n
rumbo
centro
hacia [X Y]
distancia [X Y]

Una imagen vale mas que mil palabras:


rumbo = 0
rumbo = 270

rumbo = 90
rumbo = 180

8.5.

Ejercicios

1. Define procedimientos que pongan a la tortuga rumbo a los puntos cardinales: norte,
sur, este, oeste, noroeste, nordeste, sudeste y suroeste.
2. En la seccion anterior te pedamos que buscaras otros sistemas de coordenadas. Te
pedimos aqu que crees un procedimiento que represente en pantalla un sistema de
coordenadas polares
3. Para manejar bien los rumbos es conveniente tener a la vista un transportador. Crea
un procedimiento transportador que dibuje uno en pantalla:

Para indicar la escala, puedes usar la primitiva rotula (seccion 12.1)

8.6. ACTIVIDAD AVANZADA

8.6.

Actividad avanzada

En esta actividad debes realizar la siguiente figura.

Solo puedes utilizar las primitivas


ponposicion (ponpos)
borrapantalla (bp)
subelapiz (sl)
bajalapiz (bl)

71

Captulo 9
Condicionales y Operaciones l
ogicas
En ocasiones sera necesario decidir que accion realizar en funcion de una determinada
condicion, lo que en programacion recibe el nombre de flujo de control de un algoritmo o
programa.
Por ejemplo, si quiero calcular una raz cuadrada, antes debo mirar si el n
umero es
positivo o no. Si es positivo, no tendre ning
un problema, pero si es negativo xLogo dara
un mensaje de error, ya que la raz cuadrada de un negativo no es un n
umero real.
Las estructuras condicionales son uno de los pilares de la Programaci
on Estructurada, es decir, una de las piezas clave
en el desarrollo de programas complejos pero faciles de leer.

9.1.

Condicional

xLogo define para ello la primitiva si, cuya sintaxis es:


si condicion
[ Acciones a realizar si la condicion es cierta ]
Por ejemplo, el siguiente programa dice si un n
umero es negativo:
para signo :numero
si :numero < 0
[ escribe [El numero es negativo] ]
fin
Ahora bien, no dice nada si el n
umero es positivo o nulo. Disponemos de otra opcion:
si condicion
[ Acciones a realizar si la condicion es cierta ]
[ Acciones a realizar si la condicion es falsa ]
72


9.2. OPERACIONES LOGICAS

73

de modo que podemos mejorar nuestro programa signo:


para signo :numero
si :numero < 0
[ escribe [El numero es negativo] ]
[ escribe [El numero es positivo] ]
fin
Si queremos que los argumentos para cierto y falso esten guardados en sendas variables, no podemos usar si. En este caso, la primitiva correcta es:
sisino
En este ejemplo, xLogo mostrara un error:
haz "Opcion_1 [escribe "cierto]
haz "Opcion_2 [escribe "falso]
si 1 = 2 :Opcion_1 :Opcion_2
ya que la segunda lista nunca sera evaluada:
Qu
e hacer con [escribe "falso]?
La sintaxis correcta es:
haz "Opcion_1 [escribe "cierto]
haz "Opcion_2 [escribe "falso]
sisino 1 = 2 :Opcion_1 :Opcion_2
que devolvera:
"falso

9.2.

Operaciones L
ogicas

Con los condicionales es muy interesante conocer las operaciones logicas:


Primitiva y Argumentos
y condicion_1 condicion_2 o
condicion_1 & condicion_2
o condicion_1 condicion_2 o
condicion_1 | condicion_2
no condicion

Uso
Devuelve cierto si ambas condiciones son
ciertas. Si una (o las dos) son falsas, devuelve
falso
Devuelve cierto si al menos una de las condiciones es cierta. Si las dos son falsas, devuelve falso
Devuelve la negacion de condicion, es decir, cierto si condicion es falsa y falso si
condicion es cierta.

74

CAPITULO 9. CONDICIONALES Y OPERACIONES LOGICAS

Para comparaciones numericas, disponemos de cuatro operadores que pueden expresarse


de dos formas:
Operador menor Operador mayor Operador menor o igual Operador mayor o igual
<
>
<=
>=
menor?
mayor?
menoroigual?
mayoroigual?
si bien es evidente que no seran estrictamente necesarios:
a <= b es equivalente a no (a > b)
a >= b puede sustituirse por no (a < b)
Por ejemplo (los parentesis estan para entender mejor el ejemplo):

que comprueba si el n
umero es positivo
o cero antes de intentar calcular la raz. Este
procedimiento podra hacerse con no:

y ahora comprueba que no sea negativo.


Imaginemos ahora un procedimiento que diga si la temperatura exterior es agradable o no:

que estudia primero si la temperatura esta en el intervalo (15 , 25) o sea 15 < T < 25
y si lo esta dice La temperatura es agradable. Si no pertenece a ese intervalo, analiza
si esta por debajo de el (y dice Hace frio) o no (y devuelve Hace demasiado calor).
Hemos encadenado condicionales.
Recuerda que tanto y como o admiten una forma general y, por tanto, pueden efectar
mas de una comparacion:

9.3. EJERCICIOS

75

si (y condicion1 condicion2 condicion3 ...) [ ... ]


si (o condicion1 condicion2 condicion3 ...) [ ... ]
son equivalentes a:
si (condicion1 & condicion2 & condicion3 & ...) [ ... ]
si (condicion1 | condicion2 | condicion3 | ...) [ ... ]

9.3.

Ejercicios

1. Modifica el procedimiento raiz_con_prueba para no usar ninguna operacion logica


2. Plantea un procedimiento no_menor que decida si, dados dos n
umeros, el primero es
mayor o igual que el segundo y responda s
en caso afirmativo
no_menor 8 5 s

no_menor 3 5 (nada)
3. Plantea el procedimiento edad_laboral, que compruebe si la edad de una persona
verifica la condicion 17 < edad < 65, respondiendo Est
a en edad laboral en caso
afirmativo
4. Escribe el procedimiento m
ultiplo?, que verifique si un n
umero dato es m
ultiplo de
otro divisor, respondiendo Es m
ultiplo o No es m
ultiplo, en cada caso.
Pista: puedes usar resto, cociente y/o division (/)
En caso de que sea m
ultiplo, la tortuga debe dibujar un rectangulo cuya base sea el
divisor y su area el m
ultiplo
m
ultiplo? 18 5 No es m
ultiplo
m
ultiplo? 320 40 Es m
ultiplo
5. Dise
na un procedimiento que diga si un a
no es bisiesto no. Recuerda que un a
no es
bisiesto si es m
ultiplo de 4, pero no es m
ultiplo de 100 aunque s de 400.
bisiesto? 1941 1941 no es bisiesto
bisiesto? 1900 1900 no es bisiesto
bisiesto? 2000 2000 s
es bisiesto
6. Dise
na el procedimiento calificaciones que, dada una nota la califique de acuerdo
con el baremo usual:
Nota
n<5
5 n < 6 6 n < 7 7 n < 9 9 n < 10
Calificacion Suspenso Aprobado
Bien
Notable Sobresaliente
7. Dise
na un programa que calcule la hipotenusa de un triangulo rectangulo dados sus
catetos, pero que llame a un subprocedimiento que devuelva el cuadrado de un n
umero
dado, y que ademas dibuje el triangulo en pantalla
Pista: Coloca los catetos paralelos a los ejes cartesianos, y y utiliza las primitivas
asociadas a las coordenadas


CAPITULO 9. CONDICIONALES Y OPERACIONES LOGICAS

76

8. Dise
na un programa que dibuje un triangulo dados sus tres lados.
Cuidado: Dados tres lados, no siempre es posible construir un
triangulo. Piensa que condicion debe cumplirse para que sea posible
dibujarlo y despues realiza los calculos trigonometricos necesarios.
9. Plantea el procedimiento mismo_signo, que decida si dos n
umeros no nulos tienen el
mismo signo.
Pista: Comprueba el signo de su producto

9.4.

Booleanos

Una variable o primitiva es booleana si sus u


nicos valores posibles son cierto o falso.
En xLogo un booleano es la respuesta a las primitivas terminadas con ?
Primitivas
cierto
falso
palabra?
numero?

Argumentos
ninguno
ninguno
variable
variable

entero?

un n
umero

lista?

variable

vacio?

variable

iguales?, =
antes?,
anterior?

a b
a b (dos palabras)

miembro?

a b

cuadricula?

no

ejex?,

no

ejey?,

no

bajalapiz?,
bl?

ninguno

visible?

ninguno

primitiva?,
prim?

una palabra

Uso
Devuelve "cierto
Devuelve "falso
Devuelve cierto si a es una palabra, falso si no.
Devuelve cierto si a es un n
umero, falso si no.
Devuelve cierto si a es un n
umero entero, falso
si no.
Devuelve cierto si a es una lista, falso si no.
Devuelve cierto si a es una lista vaca o una palabra vaca, falso si no.
Devuelve cierto si a y b son iguales, falso si no.
Devuelve cierto si a esta antes que b siguiendo el
orden alfabetico, falso si no.
Si b es una lista, determina si a es un elemento de
b. Si b es una palabra, determina si a es un caracter
de b.
Devuelve cierto si la cuadrcula esta activa,
falso si no.
Devuelve cierto si esta activo el eje de abscisas
(eje X), falso si no.
Devuelve cierto si esta activo el eje de ordenadas
(eje Y), falso si no.
Devuelve la palabra cierto si el lapiz esta abajo,
falso si no.
Devuelve la palabra cierto si la tortuga esta visible, falso si no.
Devuelve cierto si la palabra es una primitiva de
xLogo, falso si no.

9.5. EJERCICIOS

77

Primitivas
Argumentos
procedimiento?,
una palabra
proc?
variable?,
una palabra
var?

Uso
Devuelve cierto si la palabra es un procedimiento
definido por el usuario, falso si no.
Devuelve cierto si la palabra es una variable definida por el usuario, falso si no.

En la seccion 5.1 te pedimos que hicieras pruebas con determinados nombres de procedimientos. Si queremos estar seguros de que un nombre esta libre antes de usarlo, podemos
preguntar:
variable? "nombre
y en caso que que la variable nombre no haya sido definida, asignarle un valor:
si no (variable? "nombre) & no (procedimiento? "nombre)
[ haz "nombre pi ]
Las primitivas cuadricula?, ejes?, . . . permiten controlar aspectos que seran importantes, por ejemplo, al colorear regiones (seccion 13.2.3).
Analiza ahora el siguiente procedimiento:

Eres capaz de reproducir su resultado?

9.5.

Ejercicios

1. Utilizando las primitivas listavars y listaprocs, intenta crear un procedimiento


que investigue si una determinada palabra es una variable o un procedimiento sin
usar las primitivas variable? o procedimiento? (ni sus formas cortas)
2. Dise
na un procedimiento que compruebe si la cuadrcula esta activa o no.
Si esta activa, que la borre y dibuje otra de dimensiones [100 * 100]
Si no lo esta, que dibuje una de dimensiones [50 * 50]
A continuacion, que sit
ue a la tortuga en una posicion generada por dos n
umeros
aleatorios de la serie:
{ -505 , -455 , -405 , ... , 405 , 455 , 505 }

78

CAPITULO 9. CONDICIONALES Y OPERACIONES LOGICAS


y rellene o no el cuadrado en el que se encuentra siguiendo la secuencia de un tablero
de ajedrez.
Finalmente, repetir la secuencia varias veces hasta ver si se consigue dibujar un
tablero de ajedrez

Captulo 10
Listas
Ya hablamos antes de listas. [ 53 gato [7 28] 4.9 ] es una lista en xLogo; su
primer elemento es 53, el segundo es gato, el tercero es [7 28] y el u
ltimo es 4.9. Para
almacenarlo en la variable ejemplo hacemos:
haz "ejemplo [ 53 gato [7 28] 4.9 ]
Debemos entender que las listas permiten guardar la informacion ordenada, y que son un elemento muy importante para
simplificar muchos programas.

10.1.

Primitivas

Disponemos de las siguiente primitivas para trabajar con listas y con palabras:
Para manejarlas
Primitiva
Devolver el primer elemento
Devolver el u
ltimo elemento
Devolver el elemento nsimo
Investigar algo en variable
Contar el n
umero de elementos
Devolver un elemento al azar

Forma larga
primero :ejemplo
ultimo :ejemplo
elemento n :ejemplo
miembro "algo "lista
cuenta :ejemplo
elige :lista

Ejemplo con una lista:


haz "lista1 [Esto es una lista en xLogo]
#
escribe primero :lista1

---> Esto
79

Forma corta
pr :ejemplo

CAPITULO 10. LISTAS

80
escribe
escribe
escribe
escribe
escribe

ultimo :lista1
elemento 3 :lista1
miembro "es :lista1
cuenta :lista1
elige :lista1

--->
--->
--->
--->
--->

xLogo
una
es una lista en xLogo
6
en

--->
--->
--->
--->
--->
--->

C
s
l
12
falso
i

Ejemplo con una palabra:


escribe
escribe
escribe
escribe
escribe
escribe

primero "Calidociclos
ultimo "Calidociclos
elemento 3 "Calidociclos
cuenta "Calidociclos
miembro "es "Calidociclos
elige "Calidociclos

obviamente, el resultado de elige variara de una ejecucion a otra.


Para la primitiva miembro:
Si variable es una lista, investiga dentro de esta lista; hay dos casos posibles:
Si algo esta incluido en variable, devuelve la sublista generada a partir de
la primera aparicion de algo en variable.
Si algo no esta incluido en variable, devuelve la palabra falso.
Si variable es una palabra, investiga los caracteres algo dentro de variable. Dos
casos son posibles:
Si algo esta incluido en variable, devuelve el resto de la palabra a partir de
algo.
Si no, devuelve la palabra falso.
Para modificarlas
En este caso, solo las dos primeras pueden usarse con palabras:
Primitiva
Quitar el primer elemento/letra
Quitar el u
ltimo elemento/letra
Quitar el elemento gato
A
nadir algo el primero
A
nadir algo el u
ltimo
Intercalar algo en el lugar n
Reemplazar el elemento n
Invertir la lista

Forma larga
menosprimero :ejemplo
menosultimo :ejemplo
quita "gato :ejemplo
ponprimero "algo :ejemplo
ponultimo "algo :ejemplo
agrega Lista n "algo
reemplaza Lista n "algo
invierte :lista

Forma corta
mp
mu
pp
pu

10.1. PRIMITIVAS

81

Ejemplo con una lista (lista1 es la misma de antes):


escribe
escribe
escribe
escribe
escribe
escribe
escribe
escribe

menosprimero :lista1
menosultimo :lista1
quita "es :lista1
ponprimero "Super :lista1
ponultimo "2007 :lista1
agrega :lista1 4 "super
reemplaza :lista1 3 "ye
invierte :lista1

--->
--->
--->
--->
--->
--->
--->
--->

es una lista en xLogo


Esto es una lista en
Esto una lista en xLogo
Super Esto es una lista en xLogo
Esto es una lista en xLogo 2007
Esto es una super lista en xLogo
Esto ye una lista en xLogo
xLogo en lista una es Esto

Ejemplo con una palabra:


escribe menosprimero "Calidociclos
escribe menosultimo "Calidociclos

---> alidociclos
---> Calidociclo

Para combinar
Primitiva
Combinar en una sola lista
Concatenar en una sola palabra
Combinar en una lista de sublistas

Forma larga
frase :ejemplo :algo
palabra :ejemplo :algo
lista :ejemplo :algo

Forma corta
fr

Ejemplos con una lista:


escribe frase :lista1 [y es genial] ---> Esto es una lista en xLogo y es genial
escribe lista :lista1 [y es genial]
---> [Esto es una lista en xLogo] [y es genial]
Ejemplo con una palabra:
escribe frase "Calidociclos "de\ Escher
escribe lista "Calidociclos "de\ Escher
escribe palabra "Super "Calidociclos

---> Calidociclos de Escher


---> Calidociclos de Escher
---> SuperCalidociclos

Existe una primitiva que permite que el usuario introduzca valores en xLogo, leelista:

CAPITULO 10. LISTAS

82
que se ejecuta tecleando:
segmento

xLogo abrira una ventana pidiendo las coordenadas de A. Contestamos, por ejemplo,
40 50 y pulsamos Intro; nos pide luego las coordenadas de B, por ejemplo 100 0 e Intro.

La tortuga dibujara el segmento cuyos extremos son los puntos cuyas coordenadas hemos
introducido.
Observaci
on: A y B son listas, no n
umeros. En ejemplo anterior A contiene [40 50], y
podemos convertir sus elementos en n
umeros usando primero, ultimo o ultimo, y usarlos
con el resto de primitivas haciendo:
avanza primero :A
A la inversa, para convertir dos n
umeros en una lista tenemos la primitiva lista:
lista :lado :altura
Si se tratara de mas de tres n
umeros disponemos de frase y lista:
haz "a 50 haz "b 60 haz "c 70
escribe lista :a frase :b :c
escribe lista :a lista :b :c
proporcionan: 50 [60 70] pero sus formas generales:
escribe (lista :a :b :c)

escribe (frase :a :b :c)

proporcionan: 50 60 70 esto es, una u


nica frase. La diferencia con palabra es que esta
concatena las variables. En el ejemplo anterior:
escribe palabra :a :b
escribe (palabra :a :b :c)
proporcionan:
5060
506070
esto es, una u
nica palabra (en este caso, un n
umero).


10.2. EJEMPLO: CONJUGACION

10.2.

83

Ejemplo: Conjugaci
on

Vamos a construir un programa que conjugue el futuro simple de un verbo (solo para
verbos regulares) de distintas formas, y veremos como el uso de listas simplifica el manejo
de la informacion.

10.2.1.

Primera versi
on

La primera posibilidad que se nos puede ocurrir es usar una lnea para cada persona:
para
es
es
es
es
es
es
fin

futuro :verbo
frase "yo palabra :verbo "
e
frase "t
u palabra :verbo "
as
frase "
el palabra :verbo "
a
frase "nosotros palabra :verbo "emos
frase "vosotros palabra :verbo "
eis
frase "ellos palabra :verbo "
an

lo que consigue facilmente nuestro objetivo:


Ejemplo: futuro "amar
yo amar
e
t
u amar
as
e
l amar
a
nosotros amaremos
vosotros amar
eis
ellos amar
an

10.2.2.

Segunda versi
on

Podemos ser un poco mas elegantes, con la primitiva repite o repitepara (seccion 11.1.2)
combinada con listas:
para futuro :verbo
haz "pronombres [yo t
u e
l nosotros vosotros ellos]
haz "terminaciones [
e a
s a
emos
eis a
n]
repitepara [i 1 6]
[ escribe frase elemento :i :pronombres
palabra :verbo elemento :i :terminaciones ]
fin
ya que, realmente, estamos repitiendo seis veces la misma estrategia: combinar el pronombre
con el verbo y la terminacion. El resultado, el mismo de antes.

CAPITULO 10. LISTAS

84

10.2.3.

Tercera versi
on

En esta version usaremos la recursividad, una caracterstica muy u


til en el uso de listas
(ver seccion 11.5)
Analiza que hace este programa y como lo hace. Usa un papel para
seguir la secuencia de pasos que da, y razona que puede ser eso que
llamamos recursividad (o recurrencia)
para futuro :verbo
haz "pronombres [yo t
u e
l nosotros vosotros ellos]
haz "terminaciones [
e a
s a
emos
eis a
n]
conjugar :verbo :pronombres :terminaciones
fin
para conjugar :verbo :pronombres :terminaciones
si vacio? :pronombres [alto]
escribe frase primero :pronombres palabra :verbo primero :terminaciones
conjugar :verbo menosprimero :pronombres menosprimero :terminaciones
fin

10.3.

Ejercicios

1. Plantea un programa sobre conjugacion de verbos que:


a) Pida un verbo con una ventana emergente
b) Determine a que conjugacion pertenece
c) Contenga dos listas:
"pronombres con los pronombres personales
"morfemas con los morfemas para conjugar el presente, siendo distinta en
funcion de la conjugacion del verbo
d) Combine la raiz del verbo con las terminaciones del presente en una u
nica palabra
e) Combine en una frase los pronombres con la palabra generada, y las muestre en
el Historico de Comandos con escribe
2. Como puede extraerse el 22 de la lista de listas [[22 3] [4 5] [8 35]]?
3. Plantea el procedimiento prime, con una entrada, listado, que devuelva su primer
elemento, sin usar primero
4. Plantea el procedimiento ulti, con una entrada, listado, que devuelva su u
ltimo
elemento, sin usar ultimo

10.3. EJERCICIOS

85

5. Dise
na el procedimiento triangulo, que pida las coordenadas de los vertices de un
triangulo uno a uno y lo dibuje
6. Escribe un procedimiento que pida la medida del lado de un cuadrado y devuelva la
medida de su diagonal
7. Plantea el procedimiento mengua que pida escribir una serie de n
umeros y escriba
las listas que se obtienen al ir eliminando un elemento de cada vez (por ejemplo el
u
ltimo) hasta quedar vaca.
8. Dise
na un procedimiento inversa que reciba una lista y la devuelva con los elementos
dispuestos en orden inverso al inicial
9. Plantea el procedimiento maximo, que pida una serie de n
umeros y devuelva el mayor
de todos ellos
10. Dise
na un procedimiento suprime, con dos entradas: n y listado, que devuelva la
lista que se obtiene al suprimir el elemento nsimo, sin usar quita
11. Plantea el procedimiento adjunta, con tres entradas; n, listado_1 y listado_2, que
a
nada listado_1 en la posicion n de listado_2 (sin usar agrega)
12. Escribe un procedimiento que determine si una palabra es un palndromo, es decir,
que se lee igual en la forma habitual que de derecha a izquierda
pal
ndromo? reconocer ---> cierto
pal
ndromo? anilina ---> cierto
pal
ndromo? animal ---> falso
13. Como ampliaras el procedimiento anterior para que trabajara tambien con frases?
pal
ndromo? S
e verlas al rev
es ---> cierto
pal
ndromo?
Atale o me delata ---> falso
Puedes encontrar palndromos en:
http://es.wikipedia.org/wiki/Pal
ndromo
http://es.wikiquote.org/wiki/Pal
ndromos
http://www.juegosdepalabras.com/palindromo.htm
http://www.carbajo.net/varios/pal.html

CAPITULO 10. LISTAS

86

10.4.

Listas de Propiedades

Desde la version 0.9.92, pueden definirse Listas de Propiedades con xLogo. Cada lista
tiene un nombre especfico y contiene una pareja de valoresclave.
Para manejar estas listas, podemos utilizar las siguientes primitivas, para las que, por
ejemplo, podemos considerar una lista llamada coche, que debe contener la clave color
asociado al valor rojo, otra clave tipo con el valor 4x4 y una tercera clave vendedor
asociada al valor Citr
oen,
Descripci
on
A
nadir una propiedad a la lista
Devolver el valor asociado a una
clave de la lista
Borrar el par clave-valor de una
lista
Mostrar todos los elementos de
una lista
Mostrar todas las listas creadas

Primitiva
ponpropiedad
leepropiedad
borrapropiedad

Ejemplo (con forma corta)


ponprop "Coche "Color "Rojo
leeprop "Coche "Color
boprop "Coche "Color

listapropiedades

listaprop "Coche

listaspropiedades

listasprop "Coche

Juguemos con los elementos de la lista de propiedades llamada coche.


# Llenado de
ponpropiedad
ponpropiedad
ponpropiedad

la Lista de Propiedades
"Coche "Color "Rojo
"Coche "Tipo "4x4
"Coche "Vendedor "Citroen

# Mostrar un valor
escribe leepropiedad "Coche "Color

---> Rojo

# Mostrar todos los elementos


escribe listapropiedades "Coche

---> Color Roja Tipo 4x4 Vendedor Citroen

Captulo 11
Bucles y recursividad
xLogo dispone de siete primitivas que permiten la construccion de bucles: repite,
repitepara, mientras, paracada.y repitesiempre, repitemientras y repitehasta.
Los bucles son otro de los pilares de la Programaci
on Estructurada, es decir, una de las piezas clave en el desarrollo
de programas complejos pero faciles de leer.

11.1.

Bucles

11.1.1.

Bucle con repite

La sintaxis para repite es:


repite n [ lista_de_comandos ]
n es un n
umero entero y lista_de_commandos es una lista que contiene los comandos a
ejecutarse. El interprete xLogo ejecutara la secuencia de comandos de la lista n veces.
Esto evita copiar los mismos comandos repetidas veces.
Ya vimos varios ejemplos:
repite 4 [avanza 100 giraderecha 90]
repite 6 [avanza 100 giraderecha 60]
repite 360 [avanza 2 giraderecha 1]

# un cuadrado de lado 100


# un hexagono de lado 100
# abreviando, casi un circulo

aunque podemos a
nadir otro con un poco de humor:

87

CAPITULO 11. BUCLES Y RECURSIVIDAD

88

Con el bucle repite, se define una variable interna contador o cuentarepite, que determina el n
umero de la iteracion en curso (la primera iteracion se numera con el 1)
repite 3 [escribe contador]
proporciona
1
2
3

11.1.2.

Bucle con repitepara

repitepara hace el papel de los bucles for en otros lenguajes de programacion. Consiste
en asignar a una variable un n
umero determinado de valores comprendidos en un intervalo
y con un incremento (paso) dados. Su sintaxis es:
repitepara [ lista1 ] [ lista2 ]
La lista1 contiene tres parametros: el nombre de la variable y los lmites inferior y superior
del intervalo asignado a la variable. Puede a
nadirse un cuarto argumento, que determinara
el incremento (el paso que tendra la variable); si se omite, se usara 1 por defecto.
Ejemplo 1:
repitepara [i 1 4] [escribe :i*2]
proporciona
2
4
6
8
Ejemplo 2:
# Este procedimiento hace variar i entre 7 y 2, bajando de 1.5 en 1.5
# nota el incremento negativo
repitepara [i 7 2 -1.5]
[escribe lista :i potencia :i 2]
proporciona
7 49
5.5 30.25
4 16
2.5 6.25

11.1. BUCLES

89

El mismo chiste de antes quedara ahora:

11.1.3.

Bucle con mientras

Esta es la sintaxis para mientras:


mientras [lista_a_evaluar] [ lista_de_comandos ]
lista_a_evaluar es la lista que contiene un conjunto de instrucciones que se eval
uan
como cierto o falso. lista_de_comandos es una lista que contiene los comandos a ser
ejecutados. El interprete xLogo continuara repitiendo la ejecucion de lista_de_comandos
todo el tiempo que lista_a_evaluar devuelva cierto.
Ejemplos:
mientras [cierto] [giraderecha 1] # La tortuga gira sobre si misma eternamente.

Para usar mientras, ahora nuestro alumno castigado debe a


nadir una variable:

mientras es muy u
til para trabajar con listas:
mientras no vacio? :nombre.lista
[ escribe primero :nombre.lista
haz "nombre.lista menosprimero :nombre.lista]
ira mostrando todos los elementos de una lista, eliminando en cada iteracion el primero de
ellos.

CAPITULO 11. BUCLES Y RECURSIVIDAD

90

11.1.4.

Bucle con paracada

La sintaxis de paracada es:


paracada nombre_variable lista_o_palabra [ lista_de_comandos ]
La variable va tomando como valores los elementos de la lista o los caracteres de la palabra,
y las ordenes se repiten para cada calor adquirido.
Ejemplos:
paracada "i "xLogo
[escribe :i]
muestra:
x
L
o
g
o
paracada "i [a b c]
[escribe :i]
muestra:
a
b
c
haz "suma 0
paracada "i 12345
[haz "suma :suma+:i]
muestra:
15
(la suma de los dgitos de 12345)

11.1. BUCLES

11.1.5.

91

Bucle con repitesiempre

Aunque un bucle como este es muy peligroso en programacion, es muy facil crear un
bucle infinito, por ejemplo con mientras:
mientras ["cierto]
[giraderecha 1] # La tortuga gira sobre si misma eternamente.
La sintaxis de repitesiempre es:
repitesiempre [ lista_de_comandos ]
El ejemplo anterior sera:
repitesiempre [giraderecha 1]
Cuando se hace necesario un bucle infinito? De nuevo en la web de Guy Walker podemos encontrar respuestas: Simulaciones en Fsica, Qumica, Biologa, . . . como los movimientos planetario y browniano, la division celular, . . . pueden hacer interesante que la
animacion (Seccion 14.4) se mantenga activa durante el tiempo que dure una explicacion.
Este bucle puede ser una alternativa a la recursividad cuando el uso de memoria se
preve muy importante. De todos modos, repetimos: Mucho cuidado al usar bucles
infinitos

11.1.6.

Bucle con repitemientras

Este bucle se ejecuta con dos listas:


repitemientras [lista_de_comandos] [lista_a_evaluar]
La primera lista contiene las ordenes a ejecutar mientras la condicion de la segunda,
lista_a_evaluar, sea cierta.
La principal diferencia con el bucle mientras es que el bloque de instrucciones se ejecuta
al menos una vez, incluso si lista_a_evaluar es falsa.
Ejemplo:
haz "i 0
repitemientras [escribe :i haz "i :i+1] [:i<4]
devuelve:
0
1
2
3
4

CAPITULO 11. BUCLES Y RECURSIVIDAD

92

11.1.7.

Bucle con repitehasta

La estructura es similar al anterior:


repitehasta [ lista_de_comandos ] [lista_a_evaluar]
Repite el conjunto de ordenes contenidas en lista_de_comandos hasta que la condicion
establecida en lista_a_evaluar sea cierta.
Ejemplo:
haz "i 0
repitehasta [escribe :i haz "i :i+1] [:i>4]
devuelve:
0
1
2
3
4
Evidentemente, la traduccion literal de do while y do until
sera hazhasta y hazmientras. Hemos elegido una sintaxis
distinta para xLogo por dos motivos: (1) Un bucle repite
operaciones y (2) haz es la primitiva utilizada para asignar
valores a una variable. Nos parece una contradiccion mezclar
ambos verbos.

Intenta reproducir el castigo de nuestro alumno con


los bucles que faltan por usar. Qu
e dificultades encuentras?

11.2.

Ejemplo

Observa el siguiente problema:


Halla el n
umero n tal que, la suma de sus dgitos mas el mismo, de 2002:
n + S(n) = 2002
Podemos abordarlo de muchas maneras. Empecemos con una bastante intuitiva:
Es obvio que el n
umero tiene que ser menor que 2002, ya que se suma a todos sus
dgitos, as que:

11.3. COMANDOS DE RUPTURA DE SECUENCIA

93

para resuelve
repitepara [i 1 2002]
[ haz "digitos cuenta :i
# Contamos el numero de digitos
haz "contador :i
# Vamos a controlar la iteracion en curso
haz "suma 0
# Guardaremos aqui la suma de los digitos
#
# Debemos ponerla a cero en cada iteracion
repite :digitos
[ haz "suma :suma + primero :contador
# Voy sumando los digitos
haz "contador menosprimero :contador ] # y quitando el primero
si (:suma + :i) = 2002
# Comprobamos si cumple la condicion
[ escribe :i ] ]
# En caso afirmativo, lo muestra
fin
Por supuesto, podramos haber pensado un poco mas el problema, y reducido el n
umero de
iteraciones, pero intentemos que sea general, y no dependa de que sea 2002 u otro n
umero.
Hemos dicho varias veces que el problema se simplifica si lo dividimos en partes. Creemos
un procedimiento para sumar los dgitos de un n
umero dado:
para suma.digitos :numero
hazlocal "suma 0
# Inicializo a cero la variable por si acaso
mientras [numero? :numero]
# Cuando quite todos los digitos, no sera numero
[ haz "suma :suma + primero :numero
# Voy sumando los digitos y quitando
haz "numero menosprimero :numero ] # siempre el primero. La variable es
devuelve :suma
# local, y no cambia el valor de "numero
fin
# en el procedimiento principal
de modo que el procedimiento principal quedara:
para resuelve
repite 2002
[ si 2002 = contador + suma.digitos contador
[ escribe contador ] ]
fin
En este caso, no hemos necesitado usar variables auxiliares, ya que en ning
un momento
hemos modificado el valor de contador en el bucle, y la suma se haca fuera del procedimiento principal.

11.3.

Comandos de ruptura de secuencia

xLogo tiene tres comandos de ruptura de secuencia: alto, detienetodo y devuelve.


alto puede tener dos resultados:

CAPITULO 11. BUCLES Y RECURSIVIDAD

94

Si esta includo en un bucle repite o mientras, el programa sale del bucle


inmediatamente.
Si esta en un procedimiento, este es terminado.
detienetodo interrumpe total y definitivamente todos los procedimientos en ejecucion
devuelve (dev) permite salir de un procedimiento llevandose un resultado. (ver
seccion 11.7.1)

11.4.

Ejercicios
Intenta hacer los ejercicios con todos los tipos de bucle. Si no puedes con alguno de ellos no desesperes, en programacion se trata de
encontrar la forma mas facil de programar, no de obtener la mas
rara.

1. Como dibujaras esta serie de crculos NO concentricos?

Puedes incluso dejar el n


umero de crculos como variable
2. Escribe procedimientos que muestren las siguientes salidas en el Historico de Comandos:
a)
b)
c)
d)
e)
f)
g)
h)
i)

1
2
20
10
45
1
2
8
1.0

2
4
22
14
40
4
5
27
0.5

3
4
5
6
7
8
9
10
6
8
10
12
14
16
18
20
24
26
28
30
32
34
36
38
18
22
26
30
34
38
42
46
35
30
25
20
15
10
5
0
9
16
25
36
49
64
81 100
10
17
26
37
50
65
82 101
64 125 216 343 512 729 1000 1331
0.33.. 0.25 0.2 0.166.. 0.1428 0.125

11.4. EJERCICIOS
j)
k)
l)
m)

2
1
1.0
1

6
10
0.1
-1

95
12
100
0.01
1

20
30
42
1000
10000
0.001 0.0001
-1
1
-1

56
72
100000
0.00001
1
-1

90 110
1000000
0.000001
1
-1

Los espacios son para ver mejor la serie para obtener. T


u usa escribe
3. Escribe un procedimiento que admita dos n
umeros y escriba la suma de enteros desde
el primer n
umero hasta el segundo.
suma.entre 30 32
La suma desde 30 hasta 32 es: 93
porque 30 + 31 + 32 = 93
4. Escribe un procedimiento que pida un n
umero y calcule su factorial:
n! = n (n 1) . . . 2 1
factorial 5
El factorial de 5 es 120
porque 5! = 5 4 3 2 1 = 120
5. Escribe un procedimento con un n
umero como argumento y escriba sus divisores.
divisores 200
Los divisores de 200 son 1 2 4 5 8 10 20 25 40 50 100 200
6. Escribe un procedimento con un n
umero como argumento y determine si es primo o
no.
primo? 123
no es primo
primo? 127
127 es primo
7. Dibuja esta serie de polgonos, en la que los que tienen un n
umero impar de vertices
estan hacia la izquierda, pero los que tienen un n
umero impar de vertices estan hacia
la derecha:

CAPITULO 11. BUCLES Y RECURSIVIDAD

96

Puedes, como en el primer ejercicio, dejar el n


umero de polgonos como variable
8. Intenta dibujar la figura de la derecha, basandote en el motivo mostrado a la izquierda:

9. Escribe un programa para jugar a adivinar un n


umero. El procedimento:
a) admite dos argumentos, los valores entre los que esta el n
umero a adivinar
b) se inventa un n
umero al azar entre esos dos
c) el usuario va probando valores y el programa va diciendo si son demasiado
grandes o peque
nos.
juego
->
->
->
->
->
->

0 100
A ver si adivinas un numero entero entre 0 y 100.
Escribe un numero: 20
Es mas grande: Intentalo de nuevo: 30
Es demasiado grande: Intentalo de nuevo: 30
Es demasiado grande: Intentalo de nuevo: 27
Acertaste. Te ha costado 3 intentos

10. Escribe un programa que permita crear una lista de palabras. Para ello, el procedimiento:
a) Tiene un n
umero como argumento
b) Solicita ese n
umero de palabras con un mensaje del tipo:
Dame el elemento numero ...
c) Seg
un se van introduciendo, se va aumentando la lista
d) Por u
ltimo, el programa tiene que escribir la lista.
crea.lista 3
-> Dame el elemento numero 1: Alberto
-> Dame el elemento numero 2: Benito
-> Dame el elemento numero 3: Carmen
La lista creada es: [Alberto Benito Carmen]

11.5. RECURSIVIDAD

97

Modifica el procedimiento para que los elementos se vayan agregando a la lista en


orden inverso al que se introducen
11. Escribe un procedimiento cuyo argumento sea una lista y que la ordene alfabeticamente (considera solo la primera letra).
orden.alf [ Carmen Alberto Daniel Benito]
La lista ordenada es: [Alberto Benito Carmen Daniel]

11.5.

Recursividad

Un procedimiento se llama recursivo cuando se llama a s mismo (es un subprocedimiento


de s mismo). Un ejemplo muy simple es el siguiente:
para ejemplo1
giraderecha 1
ejemplo1
fin
Este procedimiento es recursivo porque se llama a s mismo. Al ejecutarlo, vemos que la
tortuga gira sobre s misma sin parar. Si queremos detenerla, debemos hacer clic en el
boton Alto.
Piensa que hace este segundo ejemplo (la primitiva espera pertence al captulo 18: Hace
una pausa igual a la 60.a parte del n
umero indicado):
para ejemplo2
avanza 200 goma espera 60
retrocede 200 ponlapiz giraderecha 6
ejemplo2
fin
Incialo con la orden: bp ejemplo2. Obtenemos . . . La aguja segundera de un reloj!
Para no depender de que un usuario externo detenga el programa, debemos incluir
siempre un condicional de parada.
El caso mas tpico es el calculo del factorial. En lugar de definir
n! = n * (n - 1) * ...* 2 * 1,
podemos hacer:
(

n! =
En xLogo:

1 si n = 0
n (n 1)! si n 6= 0

CAPITULO 11. BUCLES Y RECURSIVIDAD

98

que va llamandose a s mismo en cada ejecucion, pero cada vez con el n


umero reducido
en una unidad. Cuando dicho n
umero es cero, devuelve "1", y se termina la recursion. Es
decir:
factorial 5
-> 5 * factorial 4
-> 4 * factorial 3
-> 3 * factorial 2
-> 2 * factorial 1
-> 1 * factorial 0
-> 1
siendo el resultado 120.
Un segundo ejemplo recursivo es la espiral:

que en cada llamada aumenta en una unidad el avance de la tortuga, siendo el lmite 1250.
La recursividad o recurrencia es muy importante en robotica, (seccion 19.3) cuando un sistema permanece en espera
(ver ejemplo verbos.lgo). Sin embargo, debe ser utilizada
con cuidado, ya que cada llamada recursiva va ocupando un
espacio de memoria en el ordenador, y no la libera hasta que
se cumple la condicion final.
Muchas de las cosas que pueden conseguirse con la recursividad pueden hacerse con
bucles, pero eso conlleva en algunos casos complicar el dise
no y dificultar la lectura del
codigo y/o ralentizar su ejecucion.

11.5. RECURSIVIDAD

11.5.1.

99

Retomando el ejemplo

Recuperemos el problema anterior:


Halla el n
umero n tal que, la suma de sus dgitos mas el mismo, de 2002:
n + S(n) = 2002
Como haramos para resolverlo recursivamente? Sencillamente modificando el procedimiento suma.digitos:
para resuelve
borratexto
repite 2002
[ si 2002 = suma suma.digitos contador contador
[ escribe contador ] ]
fin
para suma.digitos :numero
si numero? :numero
[ devuelve suma (primero :numero) (suma.digitos menosprimero :numero) ]
[ devuelve 0 ]
fin
que devuelve las mismas (obviamente) soluciones que los programas anteriores:
n = 1982

n = 2000

Observa que el procedimiento suma.digitos se llama a s mismo, pero quitando el primer


dgito de "numero.
Intenta ponerte en el lugar de la tortuga, coge un papel y realiza los mismo
calculos que ella. Por supuesto, elige solamente dos o tres n
umeros como
muestra, siendo uno de ellos una de las soluciones. De esa manera podras
entender mejor la recursividad.

11.5.2.

Ejercicios

1. Plantea un programa recursivo que calcule potencias de exponente natural


2. Plantea un programa recursivo que calcule el termino nsimo de la sucesion de Fibonacci. Esta sucesion se obtiene partiendo de 1 , 1 , y cada termino es la suma de
los dos anteriores:
1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , ...

CAPITULO 11. BUCLES Y RECURSIVIDAD

100

3. Dise
na un procedimiento recursivo que devuelva la suma de los n primeros n
umeros
pares (excluido el cero):
2 + 4 + 6 + 8 + ... + 2 n
4. Dise
na el procedimiento cuadrados que tenga de entrada lado y dibuje, recursivamente, cuadrados de lados 15, 25, 35, 45, 55, 65 y 75. Es decir, debe ir incrementando
el lado de 10 en 10, y debe tener un condicional para parar.
5. Dise
na un programa cuadrados_1000 que tenga una entrada numero y escriba los
n
umeros naturales que sean menores que 1000 y cuadrados de otro natural.
Pista: No se trata de ir comprobando que n
umeros son cuadrados perfectos, sino
generar con un programa recursivo los cuadrados de los sucesivos naturales y que no
pare mientras estos cuadrados sean menores que 1000
6. En la seccion 7.5 obtuviste un procedimiento que dibujaba un polgono inscrito en
una circunferencia. Modifica ese procedimiento para que:
a) Dibuje tambien un polgono circunscrito
b) Calcule el permetro de ambos (inscrito y circunscrito)
c) Divida ambos resultados entre el doble del radio y lo muestre
Haz que el dibujo vaya aumentando progresivamente el n
umero de lados, y piensa si
el valor que obtienes te recuerda a alg
un n
umero.

11.6.

Recursividad avanzada

Un tipo de curvas muy especiales de las Matematicas son las denominadas fractales.
xLogo puede generar fractales mediante procedimientos recursivos de forma muy sencilla.

11.6.1.

Copo de nieve

La curva de Koch se construye a partir de un segmento inicial con tres sencillos pasos:
1. dividimos el segmento en tres partes iguales.
2. dibujamos un triangulo equilatero sobre el segmento central.
3. borramos el segmento central.
Los primeros pasos en la construccion de la curva, son:

11.6. RECURSIVIDAD AVANZADA

101

Qu
e es importante: Si observamos el paso n
umero 2, vemos que las lneas quebradas
contienen cuatro motivos identicos que corresponden a las etapas previas, pero tres veces
mas peque
nos. Esa es la estructura recursiva del fractal.
Llamemos Ln,` al elemento de longitud `, correspondiente al paso n. Para dibujar este
elemento:
1. Dibujamos Ln1,`/3
2. Giramos izquierda 60 grados
3. Dibujamos Ln1,`/3
4. Giramos derecha 60 grados
5. Dibujamos Ln1,`/3
6. Giramos izquierda 60 grados
7. Dibujamos Ln1,`/3
Con xLogo, es muy facil de escribir:
# :l longitud del elemento
# :p paso
para linea :l :p
si :p = 0
[ avanza :l ]
[ linea :l/3 :p-1 giraizquierda 60
linea :l/3 :p-1 giraderecha 120
linea :l/3 :p-1 giraizquierda 60
linea :l/3 :p-1 ]
fin
Ejecutando linea 500 8 obtenemos:

CAPITULO 11. BUCLES Y RECURSIVIDAD

102

Si dibujamos un triangulo equilatero cuyos lados sean segmentos de Koch, obtendremos


un hermoso copo de nieve de Koch.
para coponieve :l :p
repite 3 [
linea :l :p
giraderecha 120 ]
fin
Ej: coponieve 200 6

11.6.2.

Aproximando (1)

Podemos aproximar el valor del n


umero usando la formula:

v
u
u
t

2+

2 + ...

2+

siendo k el n
umero de races cuadradas. Cuanto mayor sea k, mejor es la aproximacion de .
r

La formula contiene la expresion recursiva 2 +

2 + ...

2+

2, por tanto:

# k es el numero de raices cuadradas


para aproxpi :k
mecanografia "aproximacion:\ escribe (potencia 2 :k) * raizcuadrada
(2- raizcuadrada (calc :k-2))
escribe "------------------------mecanografia "pi:\ escribe pi
fin

11.6. RECURSIVIDAD AVANZADA

103

para calc :pi


si :pi = 0
[devuelve 2]
[devuelve 2 + raizcuadrada calc :pi - 1]
end
De modo que, ejecutando:
approxpi 10
Aproximacion: 3.141591421568446
------------------------Pi: 3.141592653589793
Hemos conseguido 5 dgitos correctos. Si queremos mas dgitos de , deberamos permitir
una mayor precision usando mas dgitos en el calculo. Para ello, vamos a usar la primitiva
pondecimales, que estudiamos en la seccion 7.6. Haciendo:

pondecimales 100
aproxpi 100
Aproximacion: 3.1415926535897932384626433832795028841973393069670160975807684313880468
------------------------Pi: 3.141592653589793238462643383279502884197169399375105820974944592307816406....
Logramos 39 dgitos exactos.

11.6.3.

Con palabras y listas

En los ejercicios de la seccion 10.3 se pide construir un procedimiento que compruebe si


una frase o palabra es un palndromo. La recursividad nos lo pone muy facil. Empecemos
por crear el procedimiento:
para inviertepalabra :m
si vacio? :m [devuelve "]
devuelve palabra ultimo :m inviertepalabra menosultimo :m
fin
que proporciona:
inviertepalabra abcdefghijkl
lkjihgfedcba
Dado que un palndromo es una palabra que se lee igual de derecha a izquierda que de
izquierda a derecha:
para palindromo? :m
si :m = inviertepalabra :m [devuelve cierto] [devuelve falso]
fin

CAPITULO 11. BUCLES Y RECURSIVIDAD

104
Olivier SC nos dejo este programa:

para palin :n
si palindromo? :n [escribe :n alto]
escribe (lista :n "mas inviertepalabra :n "igual suma :n inviertepalabra :n)
palin :n + inviertepalabra :n
fin
que proporciona:
palin 78
78 mas 87 igual 165
165 mas 561 igual 726
726 mas 627 igual 1353
1353 mas 3531 igual 4884
4884

11.7.

Uso avanzado de procedimientos

11.7.1.

La primitiva devuelve

Es posible conseguir que un procedimiento se comporte como una funcion similar a las
antes definidas en xLogo. Por ejemplo:

permite escribir:
escribe (con_IVA 134 7 + con_IVA 230 16)
algo que no sera posible si usaramos escribe en vez de devuelve.

11.7.2.

Variables opcionales

En un procedimiento pueden usarse variables opcionales, es decir, variables cuyo valor


puede ser dado por el usuario y, si no lo hace, disponer de un valor por defecto.

11.7. USO AVANZADO DE PROCEDIMIENTOS

105

El procedimiento se llama poligono, lee una variable forzosa vertices que debe ser introducida por el usuario, y otra variable opcional lado, cuyo valor es 100 si el usuario no
introduce ning
un valor. De este modo que ejecutando
poligono 8
Durante la ejecucion, la variable :lado se sutituye por su valor por defecto, esto es, 100,
y xLogo dibuja un octogono de lado 100. Sin embargo, ejecuando
(poligono 8 300)
xLogo dibuja un octogono de lado 300. Es importante fijarse en que ahora la ejecucion se
realiza encerrando las ordenes entre parentesis. Esto indica al interprete que se van a usar
variables opcionales.

11.7.3.

La primitiva trazado

Para seguir el desarrollo de un programa, es posible conocer los procedimientos que se


estan ejecutando en cada momento. Igualmente, tambien se puede determinar si los procedimientos estan recibiendo correctamente los argumentos usando la primitiva devuelve.
La primitiva trazado activa el modo trazado:
trazado
mientras que para desactivarla:
detienetrazado
Un ejemplo puede verse en el calculo del factorial definido antes.
trazado
escribe factorial 4
factorial 4
factorial 4
factorial 3
factorial 2
factorial 1
factorial devuelve 1
factorial devuelve 2
factorial devuelve 6
factorial devuelve 24
24
Veremos ejemplos avanzados de recursividad en los Apendices D y E,
donde generaremos distintos fractales tanto en 2-D como en 3-D (veremos
en el captulo 16 como dibujar en tres dimensiones)

Captulo 12
Recibir entrada del usuario
Si consideramos Interaccion como comunicacion, es evidente que debe ir en las dos
direcciones: mensajes de xLogo hacia el ususario y respuesta de este, bien por teclado o
con el raton.

12.1.

Comunicaci
on con el usuario

Ya conocemos varias primitivas que permiten escribir mensajes, bien en el Historico de


comandos, bien en pantalla o incluso con una ventana emergente:
Primitivas
escribe

Argumentos
cualquiera

tipea

cualquiera

rotula

palabra o
lista

largoetiqueta

lista

mensaje, msj

lista

Uso
Escribe en el Historico de comandos el argumento.
Identico a escribe, pero el cursor queda en la linea
donde se mostro el contenido del argumento.
Dibuja la palabra o lista especificada, en la posicion actual, y en la direccion que esta mirando.
Devuelve, en pxels, la longitud en pantalla de la
lista.
Muestra una caja de dialogo con el mensaje que
esta en la lista. El programa se detiene hasta que
el usuario hace un clic en el boton Aceptar

Llevamos ya tiempo trabajando con escribe, y utilizamos tipea al hablar de las operaciones (seccion 7.1). Por su parte, mensaje aparecio en el captulo 3, en el programa
juego.lgo para indicarnos si habamos chocado con una piedra o llegado al lago.
La primitiva largoetiqueta permite saber, entre otras muchas posibilidades, si al escribir
en pantalla con rotula tienes suficiente espacio.
Ejemplo:
106

CON EL USUARIO
12.1. COMUNICACION

107

largoetiqueta [Hola, c
omo est
as?] devuelve, en pxels la longitud en pantalla de la frase Hola, como estas?
Ejemplo:

12.1.1.

Ejercicios

1. Escribe tu nombre centrado en la pantalla


2. Plantea un procedimiento que recibe una lista como argumento, siendo esa lista el
nombre y primer apellido de una persona. Con ello:
a) Determina el n
umero de letras del nombre, n
b) Dibuja un polgono de n lados, siendo el lado el nombre y apellido antes dado.
c) Puedes intentar que cada lado sea de un color
En mi caso, sera: nombre.poligono [
Alvaro Vald
es], y el resultado:

o
3. Escribe un procedimiento que escriba en el Historico de Comandos los n
umeros del
1 al 100, con diez en cada lnea, es decir:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
...
91 92 93 94 95 96 97 98 99 100

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

108

4. Recupera el procedimiento raiz_con_prueba de la seccion 9.2, y haz que cuando el


radicando sea negativo, muestre un mensaje avisando de ello en una ventana, en vez
de en el Historico de Comandos.

12.1.2.

Propiedades del Hist


orico de Comandos

Esta tabla define las primitivas que permiten ajustar y preguntar las propiedades de
texto del area del Historico de Comandos, es decir, las primitivas que controlan el color y
tama
no del texto en este area.
Solo afectan a las primitivas escribe y tipea. Para rotula se describen en la seccion
siguiente.
Primitivas

Argumentos

borratexto, bt

no

ponfuentetexto, pft

n
umero

poncolortexto,
pctexto

n
umero o
lista

ponnombrefuentetexto,
pnft

n
umero

ponestilo, pest

lista o
palabra

fuentetexto, ftexto

no

colortexto

no

nombrefuentetexto,
nft

no

Uso

Borra el Area de comandos, y el area del


Hist
orico de comandos.
Define el tama
no de la tipografa del area
del Hist
orico de comandos. Solo disponible para ser usada por la primitiva escribe.
Define el color de la tipografa del area del
Hist
orico de comandos. Solo disponible
para ser usada por la primitiva escribe.
Selecciona la tipografa n
umero n para escribir en el area del Hist
orico de comandos
con la primitiva escribe. Puedes encontrar
la relacion entre fuente y n
umero en el men
u
Herramientas Preferencias Fuente.
Define los efectos de fuente para los comandos en el Hist
orico de comandos.
Devuelve el tama
no de la tipografa usada
por la primitiva escribe.
Devuelve el color de la tipografa usada por la
primitiva escribe en el area del Hist
orico
de comandos.
Devuelve una lista con dos elementos. El
primero es un n
umero correspondiente a la
fuente utilizada para escribir en el area del
Hist
orico de comandos con la primitiva
escribe. El segundo elemento es una lista
que contiene el nombre de la fuente.

CON EL USUARIO
12.1. COMUNICACION
Primitivas

Argumentos

estilo,

no

109

Uso
Devuelve una lista que contiene todos los
efectos de fuente utilizados por las primitivas escribe y tipea.

Puedes elegir entre siete estilos:


ninguno, utiliza la fuente sin ning
un cambio
negrita
cursiva
tachado
subrayado
superindice
subindice
Si se quiere aplicar varios estilos a la vez, deben escribirse en una lista.
Ejemplos de estilos de fuente:
ponestilo [negrita subrayado] escribe "Hola
Devuelve:
Hola
pest "tachado tipea [Tachado] pest "cursiva tipea "\ x
pest "superindice escribe 2
Devuelve:
Tachado x2
Las primitivas caracter, (su forma corta es car y cuyo argumento es n: un n
umero) y
unicode "a, devuelven, respectivamente, el caracter unicode que corresponde al n
umero n
y el n
umero unicode que corresponde al caracter a.
Ejemplo:
unicode "A
caracter 125

12.1.3.

devuelve 65
devuelve }

Ejercicios

1. Escribe programas que, dado un valor r, calculen:


a) el permertro de una circunferencia
b) el area de un crculo
c) el area de una esfera
d) el volumen de una esfera

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

110

en todos los casos de radio r, indicando claramente sus unidades y evitando que lea
valores negativos:
perim.circ 5
El per
metro de una circunferencia de radio 5 es 3.141592 m2
2. Escribe un procedimiento con dos argumentos: peso y altura. y que calcule su
ndice de masa corporal (i.m.c.) mostrando como se calculo. El i.m.c. se calcula con
la formula
peso
i.m.c. =
altura2
i.m.c. 78 173
Tu i.m.c. es 78 / 1732 = 26.061679307694877
Un i.m.c. muy alto indica obesidad. Los valores normales de i.m.c. estan entre 20 y
25, pero esos lmites

dependen de la edad, del sexo, de la constitucion fsica, etc.


3. Escribe dos procedimentos que lean:
a) una temperatura en grados Celsius y la devuelvan en Fahrenheit
b) una temperatura en grados Fahrenheit y la devuelvan en Celsius
La relacion entre grados Celsius ( C) y grados Fahrenheit ( F) es:

F 32 =

9
( C)
5

C.a.F 35
35.0 o C son 95.0 o F
OJO: se trata de obtener elcirculitodegrados: , no vale usar el smbolo primero:
4. Escribe un procedimiento que lea una formula qumica escrita directamente y la
ponga en la forma habitual. Es decir, que convierta a los n
umeros en subndices y
deje las letras normales:
f
ormula.qu
mica H2SO4 H2 SO4
Pista: Utiliza el valor unicode asociado a los n
umeros
5. Como ampliaras el procedimiento anterior para que, ademas, calculara la masa
molecular del compuesto escrito?
6. Escribe un procedimiento que lea una lista de varias palabras y que la reescriba en
el Historico de Comandos en May
usculas, distinguiendo las que ya empezaban por
may
usculas:
a.may
usculas [Esto es un ejemplo]
ESTO ES UN EJEMPLO

CON EL USUARIO
12.1. COMUNICACION

12.1.4.

111

Escritura en Pantalla

En la seccion anterior controlamos la escritura en el Historico de Comandos. Modifi


quemos parametros al escribir en el Area
de Dibujo.
Primitiva

Forma larga

ponnombrefuente, pnf

n
umero

nombrefuente, nf

n
umero

ponfuente, pf

n
umero

fuente

no

ponjustificadofuente

lista

justificadofuente

no

Forma corta
Modifica la tipografa con la que se escribe. Para ver la lista completa de fuentes
disponibles, Men
u Herramientas Opciones Pesta
na Fuente
Devuelve el tipo de la letra con que se rotula.
Modifica el tama
no de la tipografa con
que se rotula. Por defecto, el tama
no es
12.
Devuelve el tama
no de la letra con que se
rotula.
Indica como alinea el texto alrededor de
la tortuga. La lista debe contener dos n
umeros: el alineamiento horizontal y el vertical.
Devuelve la alineacion del texto en pantalla.

Si queremos cambiar el color de las letras, debemos cambiar el color del lapiz.
Respecto a la alineacion del texto, las opciones de la primitiva ponjustificadofuente [a
b] proporcionan:
Siendo a la alineacion horizontal:
0: A la izquierda.
1: Centrado horizontalmente.
2: A la derecha.
Mientras, que b, la alineacion vertical:
0: En la zona inferior.
1: Centrado verticalmente.
2: En la zona superior.

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

112

Graficamente, al teclear: ponfuente 50 rotula "XLOGO

ponjustificadofuente [2 0]

ponjustificadofuente [1 0]

ponjustificadofuente [0 0]

ponjustificadofuente [2 1]

ponjustificadofuente [1 1]

ponjustificadofuente [0 1]

ponjustificadofuente [2 2]

ponjustificadofuente [1 2]

ponjustificadofuente [0 2]

12.1.5.

Ejercicios

1. Observa la portada de este libro. Como haras para conseguir la sombra azulada
de las letras que forman la palabra xLogo? (no hace falta que busques la misma
fuente).
2. En la seccion 10.2, creamos tres programas distintos para conjugar el futuro simple

de un verbo regular. Modifica uno de ellos para que el resultado se muestre en el Area
de Dibujo dispuesto. verticalmente
3. Haz lo mismo que en el ejercicio anterior, pero con el dise
nado en 10.3 que conjuga
presente y pasado, y a
nade una etiqueta encima de cada serie que indique el tiempo
verbal.

12.2.

Interactuar con el teclado

Durante la ejecucion del programa, se puede recibir texto ingresado por el usuario a
traves de 3 primitivas: tecla?, leecar y leelista.
tecla?: Da cierto o falso seg
un se haya pulsado o no alguna tecla desde que se
inicio la ejecucion del programa.
leecar o leetecla:
Si tecla? es falso, el programa hace una pausa hasta que el usuario pulse
alguna tecla.
Si tecla? es cierto, devuelve el valor unicode de la u
ltima tecla que haya sido
pulsada.

12.3. EJERCICIOS

113

Estos son los valores que dan ciertas teclas:


A 65
/ -37 o -226
Esc 27
SHIFT -16

B 66
4 -38 o -224
F1 -112
ESPACIO 32

C 67
. -39 o -227
F2 -113
CTRL -17

...
5 -40 o -225
...
ENTER 10

Z 90
F12 -123

En Mac, las teclas F1 a F12 no devuelven valor alguno, ya que el sistema las reserva
para tareas propias.
Si tienes dudas acerca del valor que da alguna tecla, puedes probar con: es leecar.
El interprete esperara hasta que pulses una tecla, y escribira su valor.
leelista [titulo] "palabra o leeteclado [titulo] "palabra: Presenta una caja de dialogo titulada titulo. El usuario puede escribir un texto en el area de entrada,
y esta respuesta se guardara seleccionando automaticamente si en forma de n
umero
o de lista en la variable :palabra cuando se haga clic en el boton OK.
Ejemplos:
para edades
leelista [Qu
e edad tienes?] "edad
si :edad < 18 [escribe [Eres menor]]
si :edad > 17 [escribe [Eres adulto]]
si :edad > 69 [escribe [Con todo respeto!!]]
fin
para dibujar
# La tortuga es controlada con las flechas del teclado.
# Se termina con Esc.
si tecla?
[ haz "valor leecar
si :valor=-37 [giraizquierda 90]
si :valor=-39 [giraderecha 90]
si :valor=-38 [avanza 10]
si :valor=-40 [retrocede 10]
si :valor=27 [alto] ]
dibujar
fin

12.3.

Ejercicios

1. Escribe un procedimiento que haga que la tortuga:

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

114

dibuje en pantalla el n
umero que se pulsa en el teclado
rotule en pantalla las letras que se pulsen en el teclado
quedando en espera para dibujar o rotular mas n
umeros o letras a la derecha de los
ya introducidos. Necesitaras:
a) Hacerlo recursivo, de modo que termine al pulsar Esc
b) Ir desplazando a la tortuga hacia la derecha a medida que son dibujados los
n
umeros o rotuladas las letras.
c) OJO: Dibujados, no rotulados. Esto implica crear 10 procedimientos, uno por
cada cifra.
No obstante, para ver si la parte que lee y desplaza a la tortuga esta bien

dise
nada, puedes usar rotula para mostrar el resultado en el Area
de Dibujo
como con las letras.
d) Para cambiar el tama
no de las letras, usa ponfuente (seccion 12.1.4)
2. Escribe un procedimiento que lea una lista de varias palabras y que la reescriba en
el Historico de Comandos del siguiente modo:
a) Si la palabra empieza por vocal, en cursiva (italica)
b) Si es un n
umero:
1) Como subndice si es par
2) Como superndice si es impar
c) Si la palabra empieza por consonante:
1) Si esta entre b y l, tachada
2) Si esta entre m y z, subrayada
d) Si, ademas, empieza por may
uscula, en negrita
Pista: Observa que usando unicode, las letras may
usculas A - Z devuelven valores
consecutivos entre 65 y 90, mientras que las min
usculas a - z lo hacen entre 97 y
122. Debes tener cuidado, eso s, con los caracteres especiales del castellano: vocales
acentuadas y e
nes.
3. Modifica el procedimiento dibujar para que suba o baje el lapiz al pulsar la barra
espaciadora, borre al pulsar borrar, . . . y/o cualquier otra opcion que se te ocurra
(cambiar el color al pulsar la inicial del mismo, . . . )
4. Un peque
no juego: Dise
na un juego tal que el programa elija un n
umero entre 0 y
32 aleatoriamente (recuerda la primitiva azar (pagina 62). A continuacion, abra un
cuadro de dialogo que pida al usuario que introduzca un n
umero.


12.4. INTERACTUAR CON EL RATON

115

Si este n
umero entero es igual al guardado, muestra GANASTEen la zona de texto.
En caso contrario, el programa indica si el n
umer guardado en mayor o menor que el
introducido por el usuario y vuelve a abrir el cuadro de dialogo.
El programa terminara cuando el usuario haya dado el n
umero correcto.
Una ayuda:
El n
umero elegido por xLogo se almacena en una variable llamada numero.
El cuadro de dialogo se llamara Dame un n
umero, por favor
El n
umero elegido por el usuario se almacena en una variable llamada intento.
El procedimiento principal se llamara juego.
Algunas posibles mejoras:
Mostrar el n
umero de intentos.
Que xLogo elija un n
umero entre 0 y 2000.
Comprobar que el usuario introduce un n
umero valido. (Recuerda la primitiva
n
umero?, pagina 76).

12.4.

Interactuar con el rat


on

Durante la ejecucion del programa, se pueden recibir eventos del raton a traves de tres
primitivas: leeraton, raton? y posraton.
leeraton: el programa hace una pausa hasta que el usuario hace un clic o un movimiento. Entonces, da un n
umero que representa ese evento. Los diferentes valores
son:
0 El raton se movio.
1 Se hizo un clic izquierdo.
2 Se hizo un clic central (Linux).
3 Se hizo un clic derecho.
En Mac, solo se reciben 0 y 1, ya que el raton no tiene boton derecho, y la opcion de
mantener pulsado Ctrl no es interpretada por xLogo como boton derecho.
posraton: Da una lista que contiene la posicion actual del raton.
raton?: Devuelve cierto o falso seg
un toquemos o no el raton desde que comienza
la ejecucion del programa

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

116
Ejemplos:

En este primer procedimiento, la tortuga sigue los movimientos del raton por
la pantalla.
para seguir
# cuando el raton se mueve, la tortuga cambia de posicion.
si leeraton=0 [ponpos posraton]
seguir
fin
Este segundo procedimiento es similar, pero hay que hacer clic izquierdo para
que la tortuga se mueva.
para seguir2
si leeraton = 1 [ponpos posraton]
seguir2
fin
En este tercer ejemplo, hemos creado dos botones rosa. Si hacemos clic izquierdo, la tortuga dibuja un cuadrado de lado 40. Si hacemos clic derecho, la
tortuga dibuja un peque
no crculo. Por u
ltimo si hacemos clic derecho en el
boton derecho, se detiene el programa.

para boton
# crea un boton rectangular color rosa, de 50 x 100.
repite 2 [
avanza 50 giraderecha 90 avanza 100 giraderecha 90 ]
giraderecha 45 subelapiz avanza 10

12.5. EJERCICIOS

117

bajalapiz poncolorlapiz [255 153 153]


rellena retrocede 10 giraizquierda 45 bajalapiz poncolorlapiz 0
fin
para empieza
borrapantalla boton subelapiz ponpos [150 0] bajalapiz boton
subelapiz ponpos [30 20] bajalapiz rotula "Cuadrado
subelapiz ponpos [180 20] bajalapiz rotula "Circulo
subelapiz ponpos [0 -100] bajalapiz
raton
fin
para raton
# ponemos el valor de leeraton en la variable ev
# ponemos la primer coordenada en la variable x
# ponemos la segunda coordenada en la variable y
haz "ev leeraton
haz "x elemento 1 posraton
haz "y elemento 2 posraton
# si hay clic izquierdo
si :ev=1 & :x>0 & :x<100 & :y>0 & :y<50 [cuadrado]
# si hay clic derecho
si :x>150 & :x<250 & :y>0 & :y<50 [
si :ev=1 [circulo]
si :ev=3 [alto] ]
raton
fin
para circulo
repite 90 [av 1 gi 4]
giraizquierda 90 subelapiz avanza 40 giraderecha 90 bajalapiz
fin
para cuadrado
repite 4 [avanza 40 giraderecha 90]
giraderecha 90 avanza 40 giraizquierda 90
fin

12.5.

Ejercicios

1. Dise
na un procedimiento que dibuje un tablero de ajedrez, y determine el color de
una casilla al hacer clic sobre ella.

118

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

2. Observa el funcionamiento del ejemplo anterior, y piensa como podras utilizarlo para
dise
nar un procedimiento que cargue en el area de dibujo un mapa mudo (Deberas
utilizar la primitiva cargaimagen, seccion 13.6.2) y el alumno tenga que ir haciendo
clic en un area seg
un se le vaya mostrando el nombre de la misma (por ejemplo,
Pases, Comunidades Autonomas, Concejos, . . . ).
Simplifica lo mas posible el planteamiento, ya veremos mas adelante como pulirlo
para tener en cuenta la forma de las fronteras.
3. Plantea un procedimiento que haga que la tortuga persiga al raton. Para ello, la
tortuga debe quedarse en un punto hasta que se hace clic en otro, hacia donde se dirigira despacio despues de haberse orientado hacia all. Puedes ralentizar el movimiento
con un procedimiento del tipo:
para avance.lento :distancia
repite :distancia
[ avanza 1 espera 10 ]
fin
Explicaremos espera en el captulo 18.
4. Plantea un procedimiento que:
a) Dibuje varios cuadrados apilados y los rellene con distintos colores
b) Dibuje otros dos, dejando uno en blanco y en el otro rotula Acabar
c) Al hacer clic en uno de los cuadrados coloreados, el que esta en blanco adquirira
el color de aquel.
Necesitaras la primitiva encuentracolor, que se explica en el captulo siguiente.
d) Al hacer clic en el que dice Acabar, el programa terminara

5. Este problema implica conocimientos de Fsica: Plantea un procedimiento que


calcule el potencial electrostatico y/o gravitatorio en el origen de coordenadas de un
sistema de cargas o masas ubicadas haciendo clic con el raton.
Con cada clic del raton, se debe dibujar un crculo centrado en ese punto.


12.6. COMPONENTES GRAFICOS

12.6.

119

Componentes Gr
aficos

Desde la version 0.9.90, xLogo permite a


nadir componentes graficos en el Area
de dibujo (botones, men
us, . . . )
Las primitivas que permiten crear y modificar estos componentes terminan con el sufijo
igu (Interfaz Grafica de Usuario Graphical User Interface, gui son sus siglas inglesas).

12.6.1.

Crear un componente gr
afico

La secuencia de pasos que debes seguir es: Crear Modificar sus propiedades o

caractersticas Mostrarlo en el Area


de dibujo.
Crear un Bot
on
Usaremos al primitiva botonigu, cuya sintaxis es:
# Esta primitiva crea un boton llamado b
# y cuya leyenda es: Clic
botonigu "b "Clic
Crear un Men
u
Disponemos de la primitiva menuigu, cuya sintaxis es:
# Esta primitiva crea un menu llamado m
# y que contiene 3 opciones: opcion1, opcion2 y opcion3
menuigu "m [opcion1 opcion2 opcion3]
Modificar las propiedades del componente gr
afico
posicionigu determina las coordenadas donde se colocara el elemento grafico. Por
ejemplo, para colocar el boton definido antes en el punto de coordenadas (20 , 100),
escribiremos:
posicionigu "b [20 100]
Si no se especifica la posicion, el objeto sera colocado por defecto en la esquina superior

izquierda del Area


de dibujo.
Eliminar un componente gr
afico
La primitiva eliminaigu elimina un componente grafico. Para eliminar el boton anterior
eliminaigu "b

120

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

Definir acciones asociadas a un componente gr


afico
La primitiva accionigu, define una accion asociada al componente, y que se realizara
cuando el usuario interact
ua con el.
# Que la tortuga avance 100 al pulsar el boton "b
accionigu "b [avanza 100 ]
# En el menu, cada opcion indica su accion
accionigu "m [[escribe "Opcion1] [escribe "Opcion2] [escribe "Opcion3]]
Dibujar el componente gr
afico

La primitiva dibujaigu, muestra el componente grafico en el Area


de dibujo. Para
mostrar el boton que estamos usando como ejemplo:
dibujaigu "b

Cambiemos el ejemplo anterior utilizando las nuevas primitivas:


para empieza
botonigu "Boton_Circ "Circulo
botonigu "Boton_Cuad "Cuadrado
posicionigu "Boton_Circ
[50 100]
posicionigu "Boton_Cuad [-150 100]
accionigu "Boton_Circ [ circunferencia ]
accionigu "Boton_Cuad [ cuadrados ]
dibujaigu "Boton_Circ
dibujaigu "Boton_Cuad
fin
para circunferencia
repite 90 [av 1 gi 4]
giraizquierda 90 subelapiz avanza 40 giraderecha 90 bajalapiz
fin

12.7. EJERCICIOS

121

para cuadrado
repite 4 [avanza 40 giraderecha 90]
giraderecha 90 avanza 40 giraizquierda 90
fin

12.7.
1.

Ejercicios

a) Crea cuatro botones: Av, Re, Gd y Gi, cuyas etiquetas sean, respectivamente:
Avanzar, Retroceder, Girar Derecha y Girar Izquierda
b) Ubica los botones anteriores en las posiciones [-350 25], [-360 -25], [-300
0] y [-440 0]
c) Asgnales las acciones: avanza 10, retrocede 10, giraderecha 90 y giraizquierda
90
d) Dibuja los cuatro botones en pantalla y comprueba que funcionan correctamente.
e) Crea dos men
us Cl y Gl, cuyas opciones sean, respectivamente: [Color L
apiz
Azul Rojo Amarillo Verde Negro Blanco] y [Grosor L
apiz 1 2 3 4 5]
f) Asgnales las acciones:
1) [ ] [poncolorlapiz azul] [poncolorlapiz rojo]
[poncolorlapiz amarillo] [poncolorlapiz verde] [poncolorlapiz negro]
[poncolorlapiz blanco]
2) [ ] [pongrosor 1] [pongrosor 2] [pongrosor 3] [pongrosor 4]
[pongrosor 5]
Observa que, en ambos casos, la primera opcion NO hace nada
g) Ubcalos en las posiciones [-350 100] y [-350 70]
h) Dibuja los dos men
us en pantalla y comprueba que funcionan correctamente.
Compara el resultado de los ejercicios con el xLogo con que iniciamos el curso.
Seras capaz de dise
nar, asignar y dibujar los elementos que faltan?

122

CAPITULO 12. RECIBIR ENTRADA DEL USUARIO

2. Crea un programa sobre conjugacion de verbos que:


a) Lea un verbo con leelista, analizando previamente si ya ha sido definido uno
o no
b) Conjugue correctamente en presente, pasado y futuro simple (solo verbos regulares)
c) El tiempo verbal se elija con un men
u contextual
d) Rotule en pantalla el tiempo verbal elegido
e) Rotule Acertaste? tras mostrar el timepo verbal
f) Se pueda cambiar el verbo con un boton

Captulo 13
T
ecnicas avanzadas de dibujo

13.1.

M
as opciones para la tortuga

En la seccion 4.4 presentamos algunas primitivas que controlan las opciones de la tortuga. Ampliemos las opciones:
Primitiva
muestratortuga,
mt
ocultatortuga, ot

Forma larga

Forma corta

no

Hace que la tortuga se vea en pantalla.

no

pongrosor

n
umero

Hace invisible a la tortuga.


Define el grosor del trazo del lapiz (en pixels).
Por defecto es 1.
Fija la forma del lapiz: pfl 0: cuadrada; pfl 1:
ovalada. Por defecto la forma es cuadrada.
Devuelve el grosor del lapiz.
Devuelve la forma del lapiz.

ponformalapiz,
pfl
grosorlapiz, gl
formalapiz, fl

0
o 1
no
no

Entre otros, ocultatortuga es interesante en dos casos:


No tapar parte del dibujo
Dibujar mas rapido
Analiza el procedimiento siguiente:
para poli.poligonos :cuantos
repite :cuantos
123

124

CAPITULO 13. TECNICAS


AVANZADAS DE DIBUJO

[ hazlocal "angulo 360/(suma cuentarepite 2)


si (0 = resto cuentarepite 2)
[ haz "angulo (-:angulo)]
repite (suma cuentarepite 2)
[ avanza 50 giraderecha :angulo ] ]
fin
respuesta a un problema planteado en el captulo 11.4:

Prueba a ejecutarlo de dos formas distintas:


borrapantalla poli.poligonos 100
borrapantalla ocultatortuga poli.poligonos 100
y observa como la segunda vez el dibujo se consigue mucho antes. (En el captulo 18 veremos como medir exactamente el tiempo de ejecucion de un programa).
Respecto a las demas primitivas, vamos a estudiar la siguiente hipotesis:
Si pongo un grosor n y avanza n pasos, dibujare un cuadrado
Teclea las ordenes adecuadas y razona si la hipotesis es cierta o no.
Compara el resultado con el obtenido con la siguiente secuencia de comandos:
borrapantalla ponformalapiz 1 pongrosor 200 punto posicion
borrapantalla ponformalapiz 0 pongrosor 200 punto posicion
Que observas? Influye en el resultado del analisis anterior?
Prueba distintos dibujos modificando simultaneamente el grosor y la
forma, observando claramente las diferencias entre un lapiz cuadrado y
ovalado, c
uando se aprecia mejor esa diferencia, . . .

13.2. CONTROL DEL COLOR

125

13.2.

Control del color

13.2.1.

Primitivas que controlan los colores

Conozcamos ahora las primitivas que controlan el color del trazo, del papel (fondo) y
del texto:
Primitiva
Forma larga
Forma corta
Cambiar el color del l
apiz
poncolorlapiz n
poncl n
Cambiar el color del papel
poncolorpapel n
poncp n
Invertir el l
apiz
inviertelapiz
ila
Averiguar el color del l
apiz
colorlapiz
cl
Averiguar el color del papel
colorpapel
cp
Mirar el color de la posicion [X Y] encuentracolor [X Y]
ec [X Y]
Borrar por donde pasa
goma
go
Para volver a dibujar, debe usarse poncolorlapiz
Que es invertir el lapiz ? Como veremos en la seccion siguiente y detallaremos en
13.6, cada color en xLogo esta codificado usando tres valores: rojo, verde y azul, o R V A
(RGB en ingles). Deberamos conocer mnimamente la teora del color asociada a la luz,
que difiere de la que conocemos al tratar con pinturas:
http://w3.cnice.mec.es/eos/MaterialesEducativos/mem2000/color/Intro/indice.htm
.
Si trabajo sobre una paleta de pintor, sabemos que los colores basicos son tres, rojo,
amarillo y azul; pero si son colores de luz los colores basicos cambian, y pasan a ser rojo,
azul y verde y que si mezclo los colores obtengo:
Mezcla
rojo +
azul
rojo + amarillo
azul + amarillo
azul + rojo + amarillo

=
=
=
=

Paleta
violeta
naranja
verde
negro

Luz
magenta
amarillo
cyan
blanco

Utiliza las opciones del men


u para VER (literalmente) lo que
ocurre al sumar colores en xLogo. Men
u Herramientes
Elegir color de lapiz (o de fondo) pesta
na RVA y juega con
las barras de desplazamiento para comprobar lo que acabamos
de contar.
Pues bien, al invertir el lapiz:
si la zona del papel por la que pasa esta en blanco, pinta del color activo
si la zona del papel tiene un color traza, no la suma, sino la resta de colores:
rojo azul = verde

rojo verde = azul

azul verde = rojo

Respecto a la primitiva encuentracolor, devuelve la lista [R V A] asociada al color,


y que detallamos a continuacion.


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

126

13.2.2.

Descripci
on de los colores

El color en xLogo esta especificado por una lista de tres n


umeros [r v a] comprendidos entre 0 y 255. El n
umero r es el componente rojo, v el verde y a el azul ([r g
b] en ingles). xLogo tiene 17 colores predefinidos, que pueden ser indicados con su lista
[r v a], con un n
umero o con una primitiva. Las primitivas correspondientes son:
N
umero

Primitiva

[R V A]

negro

[0 0 0]

rojo

[255 0 0]

verde

[0 255 0]

amarillo

[255 255 0]

azul

[0 0 255]

magenta

[255 0 255]

cyan

[0 255 255]

blanco

[255 255 255]

gris

[128 128 128]

grisclaro

[192 192 192]

10

rojooscuro

[128 0 0]

11

verdeoscuro

[0 128 0]

12

azuloscuro

[0 0 128]

13

naranja

[255 200 0]

14

rosa

[255 175 175]

15

violeta

[128 0 255]

16

marron

[153 102 0]

Ejemplo: Estas tres ordenes son la misma:


poncolorlapiz naranja
poncolorlapiz 13
poncolorlapiz [255 200 0]

Color

13.2. CONTROL DEL COLOR

13.2.3.

127

Funci
on avanzada de relleno

Las primitivas rellena y rellenazona permiten pintar una figura. Se pueden comparar a la funcion rellena disponible en la mayora de los programas de dibujo. Esta
funcionalidad se extiende hasta los margenes del area de dibujo. Hay tres reglas a tener en
cuenta para usar correctamente estas primitivas:
1. El lapiz debe estar bajo (bl).
2. La tortuga no debe estar sobre un punto del mismo color que se usara para rellenar.
(Si quieres pintar rojo, la tortuga no puede estar sobre un punto rojo).
3. Observar si cuadricula esta o no activada.
Veamos un ejemplo para explicar la diferencia entre estas dos primitivas:
Los pxeles por donde pasa la tortuga son, en este momento, blancos. La primitiva
rellena va a colorear todos los pxeles blancos vecinos con el color elegido para el lapiz
hasta llegar a una frontera de cualquier color (incluida la cuadrcula):

poncolorlapiz 1
rellena
produce:

es decir, ha coloreado de rojo la region cerrada en la que se encuentra la tortuga.


Sin embargo, si hacemos:


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

128
poncolorlapiz 0
rellenazona
se obtiene:

es decir, rellena todos los pxeles vecinos hasta encontrar una frontera del color activo.
Este es un buen ejemplo para usar la primitiva rellena:
para mediocirc :c
# dibuja un semicirculo de diametro :c
repite 180 [
avanza :c * tan 0.5
giraderecha 1 ]
avanza :c * tan 0.5
giraderecha 90 avanza :c
fin
para arcohueco :c
# Utiliza el procedimiento mediocirc para dibujar un arcoiris sin colores
si :c < 100 [alto]
mediocirc :c
giraderecha 180 avanza 20 giraizquierda 90
arcohueco :c - 40
fin
para arcoiris
borrapantalla ocultatortuga arcohueco 400
subelapiz giraderecha 90 retrocede 150
giraizquierda 90 avanza 20 bajalapiz
haz "color [ [255 0 0] [255 160 0] [255 255 0] [0 255 0] [0 0 255]
[75 0 130] [128 0 255] ]
repitepara [colores 1 7]
[ poncolorlapiz elemento :colores :color rellena
subelapiz giraderecha 90 avanza 20 giraizquierda 90 bajalapiz ]
fin

13.3. EJERCICIOS

13.3.

129

Ejercicios

1. Modifica el procedimiento poli.poligono para obtener:

2. Combina adecuadamente los procedimientos cuadrado, rectangulo y triangulo que


hemos ido dise
nando a lo largo del libro para obtener la casa coloreada con la que
presentamos a la tortuga hace tiempo:


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

130

3. Te atreves con este horreo asturiano con corredor?

4. En el captulo anterior hablamos de usar un mapa mudo en el que el alumno tuviera


que ir haciendo clic en un area concreta seg
un se le fueran mostrando nombres de
la misma.
a) Como haras para tener en cuenta las fronteras reales?
b) Que requisitos debera tener entonces el mapa para poder hacerlo?

13.4.

Control del Area


de dibujo

En esta seccion podemos distinguir dos tipos de primitivas, las que controlan el tama
no
del area de dibujo y las que determinan aspectos del dibujo:

13.4.1.

Control del dibujo

Primitiva

Forma larga

ponzoom o ponlupa

n
umero

zoom o lupa

no

modoventana

no

modovuelta

no

modojaula

no

poncalidaddibujo,
0, 1
o 2
pcd

Forma corta

Acerca o aleja el Area


de dibujo. En concreto,
el valor de n es el factor de escala respecto a

la imagen original: (n >1) acerca el Area


de

dibujo; (0 <n <1) aleja el Area de dibujo.


Devuelve el valor del escalado anterior.
La tortuga puede salir del area de dibujo (pero
no dibujara nada).
Si la tortuga sale del area de dibujo, vuelve a
aparecer en el lado opuesto
La tortuga queda confinada al area de dibujo.
Si intenta salir, aparecera un mensaje de error
avisando cuantos pasos faltan para el punto de
salida.
Fija la calidad del dibujo: pcd 0: normal; pcd
1: alta; pcd 2: baja;


13.4. CONTROL DEL AREA
DE DIBUJO

calidaddibujo,
cdib

no

131

Devuelve la calidad del dibujo

Ajusta el tama
no de la ventana (Herramientas Preferencias Opciones Tama
no de la ventana) a 500 por 300, copia el siguiente procedimiento:

para modos
borrapantalla subelapiz ponx -170 bajalapiz
repite 360 [avanza 3 giraderecha 1]
fin
y determina que pasara en cada uno de los tres modos: ventana, vuelta y jaula.
Has podido? Este es el resultado:
Obviamente, en modovuelta no se ha completado el dibujo y aparece el mensaje de error:
En modos, l
nea 2:
La tortuga sale de la pantalla.
N
umero de pasos antes de salir:0
mientras que para modovuelta y modoventana nos encontramos con:

Modo ventana

Modo vuelta

pero, cuidado, NO es que la tortuga haya rebotado en la pared superior, sino que vuelve
a aparecer por la parte de abajo.


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

132

Prueba a cambiar el n
umero de pasos que avanza la tortuga o ralentzala,
para ver claramente como se comporta en el modo vuelta. Se te ocurre
para que podramos usar este modo? Una pista:

(Recuerda la primitiva cargaimagen)

13.4.2.

Control de las dimensiones

Primitiva
pontama~
nopantalla
ptp
tama~
nopantalla,
tpant
tama~
noventana,
tv,
esquinasventana

Forma larga

Forma corta

lista

Fija el tama
no de la pantalla.

no
no

ponseparacion,
ponsep

n
umero
comprendido
entre 0 y 1

separacion

no

Devuelve una lista que contiene el tama


no de la
pantalla
Devuelve una lista con cuatro elementos, las
coordenadas de la esquina superior izquierda y
de la esquina inferior derecha.
Determina la proporcion de pantalla ocupada

por el Area
de Dibujo y el Hist
orico de
Comandos.
Devuelve el valor de la proporcion de pantalla

ocupada por el Area


de Dibujo y el Hist
orico
de Comandos.

El control de la separacion tambien puede hacerse con el raton, simplemente arrastrando

la separacion entre el Area


de dibujo y el Historico de comandos hacia arriba o hacia abajo.

En ponseparacion, si n vale 1, el Area


de Dibujo ocupara toda la pantalla. Si n vale 0,
sera el Hist
orico quien la ocupe.

13.5. EJERCICIOS

13.5.

133

Ejercicios

1. Vamos a calcular el valor de . Para ello, usa el procedimiento que dibuja una circunferencia (o mejor dicho un Trihectahexacontagono)1 y:
a) Permite que el avance sea una variable (p.e. :lado)
b) Haz que la tortuga se desplace a traves del diametro hasta alcanzar el punto
diametralmente opuesto al de partida, que localizara con encuentracolor
c) Determine la distancia hasta el punto de partida
d) Muestre nuestra estimacion de , el resultado de dividir:
'

360 : lado
distancia

Prueba para distintos valores de :lado y observa los resultados


2. En el ejemplo sobre modojaula, modovuelta y modoventana, que ocurre si usamos
circulo para dibujar la circunferencia en vez del procedimiento anterior?
3. Observa el dibujo que obtuvimos con modovuelta. A que te recuerda? Podras
usarlo para dibujar, por ejemplo, un murcielago?
4. Como haras para que la circunferencia se divida y sea tangente a s misma?

Y si hacemos que la pantalla sea cuadrada?:

5. Aprovecha ese dibujo para que nuestra tortuga hable a traves de dos altavoces:
1

Trihectahexacont
agono: tri = 3, hecta = 100, hexaconta = 60, gono = angulo


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

134

6. Intenta dibujar estos dos rombos:

(El tama
no de la pantalla es 200 * 200)
7. Podras dibujar un rectangulo (o un cuadrado) sin que haya giros de 90 ?
(No vale sumar angulos hasta que den 90 )
8. Dibuja los ejes cartesianos en pantalla
CUIDADO: Si pretendes usar estos dibujos como parte de
otros redimensionando la pantalla a mitad de un dibujo, NO
LO HAGAS. Al igual que cuadricula, ejes, . . . xLogo borra la pantalla al modificar sus dimensiones. Debes guardarlo
como imagen y cargarla depues.

13.6.

Manejando im
agenes

13.6.1.

Introducci
on

Primero, algunas aclaraciones: Habras visto en la seccion 13.2.2 que el comando poncolorlapiz
puede tomar como argumento tanto un n
umero como una lista. Aqu nos centraremos en
codificar valores RVA. Cada color en xLogo esta codificado usando tres valores: rojo, verde
y azul, de ah RVA (RGB en ingles).
Estos tres n
umeros conforman una lista que es argumento de la primitiva poncl, por
lo que representan respectivamente los componentes rojo, verde y azul de un color. Esta
manera de codificar no es muy intuitiva, as que para tener una idea del color que obtendras
puedes usar la caja de dialogo Herramientas Elegir color del l
apiz.
Sin embargo, usando esta forma de codificar colores, se hace muy facil transformar una
imagen. Por ejemplo, si quieres convertir una foto color en escala de grises, puedes cambiar


13.6. MANEJANDO IMAGENES

135

cada punto (pxel) de la imagen a un valor promedio de los 3 componentes RVA. Imagina
que el color de un punto de la imagen esta dado por [0 100 80]. Calculamos el promedio:
(0 + 100 + 80)/3 = 60, y asignamos el color [60 60 60] a este punto. Esta operacion
debe ser realizada para cada punto de la imagen.

13.6.2.

Pr
actica: Escala de grises

Vamos a transformar una imagen color de 100 por 100 a escala de grises. Esto significa
que tenemos 100 * 100 = 10000 puntos a modificar.
La imagen de ejemplo utilizada aqu esta disponible en la siguiente direccion:
http://xlogo.tuxfamily.org/images/transfo.png
Utilizaremos la primitiva cargaimagen o ci que carga el archivo de imagen indicado
con una palabra.
La esquina superior izquierda de dicha imagen se ubica en la posicion actual de la tortuga. Los u
nicos formatos soportados son jpg y png. La ruta debe especificarse previamente
con pondirectorio (captulo 15) y debe ser absoluta, empezando en el nivel superior del
arbol de directorios.
Ejemplo:
pondirectorio [/home/alumnos/mis\ imagenes]
cargaimagen "turtle.jpg
As es como vamos a proceder: primero, nos referiremos al punto superior izquierdo
como [0 0]. Luego, la tortuga examinara los primeros 100 puntos (pixeles) de la primera
lnea, seguidos por los primeros 100 de la segunda, y as sucesivamente. Cada vez tomaremos el color del punto usando encuentracolor, y el color sera cambiado por el promedio
de los tres [r v a] valores. Aqu esta el codigo principal: (No olvides cambiar la ruta del
archivo en el procedimiento!)

para transform
# Debes cambiar la ruta de la imagen transfo.png
# Ej: cargaimagen [/home/usuario/imagenes/transfo.png]
borrapantalla ocultatortuga
pondirectorio "/home/usuario/imagenes
cargaimagen "transfo.png
escalagris
fin
para escalagris
repitepara [y 0 -100 -1]


CAPITULO 13. TECNICAS
AVANZADAS DE DIBUJO

136

[ repitepara [x 0 100]
# asignamos el promedio de color del punto al color del lapiz
[ poncolorlapiz pixel encuentracolor lista :x :y
# convertimos el punto escala de grises
punto lista :x :y ] ]
fin
para pixel :lista1
# devuelve el promedio de los 3 numeros [r v a]
haz "r primero :lista1
haz "lista1 menosprimero :lista1
haz "v primero :lista1
haz "lista1 menosprimero :lista1
haz "a primero :lista1
haz "color redondea (:r+:v+:a)/3
devuelve frase :color frase :color :color
fin

13.6.3.

Negativo

Para cambiar una imagen a su negativo, se puede usar el mismo proceso de la escala de
grises, excepto que en lugar de hacer el promedio de los n
umeros [r v a], los reemplazamos
por su complemento, o sea la diferencia a 255.
Ejemplo: Si un punto (pxel) tiene un color [2 100 200], lo reemplazamos con [253 155 55].
Podramos usar el mismo codigo que en el ejemplo anterior, cambiando u
nicamente el procedimiento pixel, pero veamos un procedimiento recursivo:
para transform2
# Debes cambiar la ruta de la imagen transfo.png
# Ej: c:\Mis Documentos\Mis imagenes\transfo.png
borrapantalla
ocultatortuga
pondirectorio "c:\\Mis\ Documentos\\Mis\ imagenes
cargaimagen "transfo.png
negativo 0 0

13.7. EJERCICIOS

137

fin
para
si
[
[

negativo :x :y
:y = -100
alto ]
si :x = 100
[ haz "x 0 haz "y :y-1]
[ poncolorlapiz pixel2 encuentracolor lista :x :y
punto lista :x :y ] ]
negativo :x+1 :y
fin
para pixel2 :lista1
# devuelve el promedio de los 3 numeros [r v a]
haz "r primero :lista1
haz "lista1 menosprimero :lista1
haz "v primero :lista1
haz "lista1 menosprimero :lista1
haz "a primero :lista1
devuelve frase (255 - :r) frase (255 - :v) (255 - :a)
fin

13.7.

Ejercicios

1. Carga la imagen de un laberinto (o mejor a


un, que la tortua dibuje uno) y puedas
guiar a la tortuga por el camino de salida. Utiliza la primitiva encuentracolor para
evitar que atraviese las paredes del mismo.
Intenta que la tortuga dibuje un rastro (recuerda, que debes dibujar el rastro despues
de encontrar el color del papel) de un color si el camino es el correcto y de otro
cuando debes retroceder.
2. Busca o dibuja una casa para nuestra tortuga (no muy grande). Busca tambien imagenes de casas, parques, bancos, edificios gubernamentales y comerciales, . . . , y:

138

CAPITULO 13. TECNICAS


AVANZADAS DE DIBUJO
a) Redimensionalos hasta un tama
no de unos 50 pxeles.
b) Carga esas imagenes formando una ciudad
c) Dise
na recorridos, con tareas que debe realizar la tortuga, y controla que
esas tareas se realizan sin desplazarse por fuera de las calles.
d) Puedes dibujar puntos de distintos colores en las entradas de cada lugar que se
debe visitar para controlar que los sitios a los que se desplaza son los correctos.

3. Vamos a dibujar un Diagrama de Venn de colores. Plantea un procedimiento que:


a) Dibuje dos crculos de radios variables y los rellene con distintos colores
b) Analice si se cortan (dos circunferencias se cortan si la distancia entre sus centros
es menor que la suma de los radios) y, en caso afirmativo:
1) encuentre el color de cada crculo
2) sit
ue a la tortuga en la interseccion de ambas circunferencias (por ejemplo,
el punto medio entre sus centros)
3) rellene esa interseccion con el color resultante de sumar o promediar (t
u
eliges) ambos
Sabras ampliarlo a tres circunferencias?

Captulo 14
Modo multitortuga y Animaci
on
14.1.

Multitortuga

Se pueden tener varias tortugas activas en pantalla. Nada mas iniciarse xLogo, solo
hay una tortuga disponible y su n
umero es 0.

14.1.1.

Las primitivas

Estas son las primitivas que se aplican al modo multitortuga:


Primitiva

ponforma, pforma

forma
pontortuga,
ptortuga

Argumentos

n
umero

Uso
Puedes elegir tu tortuga preferida en la segunda etiqueta del men
u Herramientas
Preferencias, pero tambien es posible con
ponforma. El n
umero n puede ir de 0 a 6. (0
es la forma triangular del Logo tradicional).
Devuelve un n
umero que representa la forma
actual de la tortuga.
La tortuga n
umero n es ahora la tortuga activa. Por defecto, cuando xLogo comienza,
esta activa la tortuga n
umero 0.
Da el n
umero de la tortuga activa.
Da una lista que contiene todos los n
umeros
de tortuga actualmente en pantalla.
Elimina la tortuga n
umero n

n
umero

Fija el maximo n
umero de tortugas

n
umero

no
n
umero

tortuga

no

tortugas

no

eliminatortuga
ponmaximastortugas,
pmt
maximastortugas,
maxt

no

Devuelve el maximo n
umero de tortugas

139

140

CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

Si quieres crear una nueva tortuga, puedes usar la primitiva pontortuga seguida del
n
umero de la nueva tortuga. Para evitar confusiones, la nueva tortuga se crea en el centro
y es invisible (tienes que usar muestratortuga para verla). As, la nueva tortuga es la
activa, y sera la que obedezca las clasicas primitivas mientras no cambies a otra tortuga
con pontortuga.
El maximo n
umero de tortugas disponibles tambien puede fijarse en el men
u Herramientas Preferencias.

14.1.2.

Ejemplo. Curva de persecuci


on

En este ejemplo vamos reproducir la curva de persecuci


on. Vamos a distribuir n
tortugas en los vertices de un polgono regular, y haremos que cada una se dirija hacia la
posicion de la tortuga situada a su derecha.
Como queremos ver a todas las tortugas en movimiento, vamos a hacer un poco de trampa
y utilizar la primitiva animacion antes de explicarla. El motivo: al moverse las tortugas, la
velocidad de refresco de la imagen no alcanza la velocidad de movimiento de las tortugas,
y se genera un parpadeo bastante molesto:
para empieza :n
borrapantalla ocultatortuga subelapiz
animacion
# Cierto, todavia no la explicamos
inicio :n
mientras [(distancia [0 0]) > 2 ]
# Funciona hasta que "chocan"
[ repite :n
[ pontortuga cuentarepite
haz "mipos pos
# Miramos donde esta la tortuga n
pontortuga cuentarepite+1
si cuentarepite+1>:n [pontortuga 1]
ponrumbo hacia :mipos
# Orientamos la tortuga n +1
avanza 2]
refresca ]
# Hacemos visibles los trazos
detieneanimacion
repite :n [
pontortuga cuentarepite
ocultatortuga ]
# Ocultamos todas las tortugas en la imagen final
fin
para inicio :n
si :n <2 [escribe [Necesitas mas de una tortuga!] alto] # Control de error
repite :n

14.2. EJERCICIOS

141

[ pontortuga cuentarepite
# Activamos tortuga
ponforma cuentarepite
# Cambiamos el tipo de tortuga
muestratortuga
# Mostramos tortuga
pongrosor 6
haz "angulo cuentarepite*360/:n
poncolorlapiz angcol :angulo subelapiz
# El color depende de la ubicacion
ponxy (190*sen :angulo) (190*cos :angulo) bajalapiz]
fin
para angcol :x
haz "r 127.5 *(1 + sen (:x))
haz "g 127.5 *(1 + sen (:x + 120))
haz "b 127.5 *(1 + sen (:x + 220))
devuelve frase lista :r :g :b
fin
Si ejecutamos empieza 6, iremos viendo como las seis tortugas (cada una con una
forma) van acercandose entre ellas, hasta juntarse en el centro. En ese momento, desparecen
todas (la imagen de todas ellas superpuestas no es muy. . . elegante).

14.2.

Ejercicios

1. Plantea un procedimiento que dibuje la rosca que aparece en la portada:

142

CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

2. Este problema implica conocimientos de Fsica: Plantea un procedimiento que


represente la muchas veces explicada analoga entre movimiento circular uniforme y
movimiento armonico simple:

Para ello, necesitaremos tres tortugas:


a) Una que describa el movimiento circular
b) Otra que represente el paso del tiempo
c) Una tercera que describa el movimiento armonico
La primera tortuga ira trazando una circunferencia a la par que la segunda avanza
un peque
no n
umero de pasos (debe ajustarse para que se vea bien el movimiento) y
la tercera se desplaza de modo que:
Su ordenada coincida con la de la tortuga 1
Su abscisa coincida con la de la tortuga 2
3. Este problema implica conocimientos de Fsica: Plantea un procedimiento que
simule la reflexion y refraccion de la luz. Para ello, necesitaremos dos tortugas, una
para cada medio.
Debemos trazar una lnea que represente la separacion de medios, pudiendo colorear
al menos uno para distinguirlos bien. Una tortuga se desplazara desde un punto
(que puede dejarse como argumento) hasta el origen (orientada correctamente con
ponrumbo) y all
Ella se reflejara, invirtiendo su desplazamiento vertical
Aparecea la segunda tortuga que modificara su desplazamiento horizontal
en ambos casos, siguiendo las leyes de Snell:
Reflexion:
Refraccion:

inc = refl
ninc sen inc = nrefr sen refr

DIDACTICA:

14.3. APLICACION
LANZAMIENTO DE DOS DADOS

143

Puede mejorarse cambiando la forma de la tortuga para distinguir los dos haces
4. Este problema implica conocimientos de Fsica: Plantea un procedimiento que
simule las fuerzas electrostaticas y gravitatorias de un sistema de masas o de cargas.
Para ello:
a) Ubicara n tortugas en posiciones que se indicaran como argumento
b) Ubique otra tortuga con el raton, con una forma distinta
c) Determine vectorialmente la fuerza total en ese punto, y se desplace 3 o 4 pasos
en esa direccion
Qq
F~ = K 2 ~ur
r
d) Se detenga cuando la distancia a una de las tortugas sea, por ejemplo, 10
Estas comprobando como no es demasiado complicado realizar simulaciones de Fsica con xLogo. Por supuesto, con
esto entramos en temas que requieren conocimientos avanzados de Ciencias, pero podemos plantearnos usarlos en lugar
de buscar software especfico para cada tema. Como ves, las
posibilidades son infinitas.

14.3.

Aplicaci
on did
actica: lanzamiento de dos dados

Cuando se lanzan dos dados y se calcula la suma de los puntos de cada uno de ellos, se
obtiene un resultado comprendido entre 2 y 12. En esta actividad vamos ver la distribucion
de frecuencias de las distintas tiradas y a representarla en un sencillo grafico.


CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

144

14.3.1.

Simular el lanzamiento de un dado

Para simular el lanzamiento de un dado, vamos a utilizar la primitiva azar (seccion


7.3). azar 6, devuelve un n
umero aleatorio comprendido entre 0 y 5. Por tanto, (azar
6) + 1 devuelve una cantidad elegida aleatoriamente del conjunto {1,2,3,4,5,6}.
Como ya explicamos (pagina 65), debemos utilizar parentesis; si no, xLogo leera azar
7. Para evitar los parentesis, se puede escribir 1 + azar 6. Se define as el procedimiento
lanzar, que simula el lanzamiento de un dado.
para lanzar
devuelve 1 + azar 6
fin

14.3.2.

El programa

Vamos a utilizar el modo multitortuga que acabamos de explicar, para as disponer de


varias tortugas sobre la pantalla. La imagen siguiente nos indica que queremos conseguir:

El objetivo es que cada tortuga, numerada de 2 a 12, avance un paso de tortuga cuando el
resultado de la suma de la tirada de los dos dados coincida con su n
umero. Por ejemplo, si
la tirada de dados suma 8, la tortuga n
umero 8 avanzara un paso.
La separacion horizontal entre las tortugas es de 30 pasos de tortuga, y se colocaran a
las tortugas con ayuda de los datos.
Se colocara a la tortuga n
umero 2 en (-150 ; 0)
Se colocara a la tortuga n
umero 3 en (-120 ; 0)
Se colocara a la tortuga n
umero 4 en (-90 ; 0)
Se colocara a la tortuga n
umero 5 en (-60 ; 0)
...

DIDACTICA:

14.3. APLICACION
LANZAMIENTO DE DOS DADOS

145

es decir:
pontortuga
pontortuga
pontortuga
pontortuga
pontortuga

2
3
4
5
6

ponpos
ponpos
ponpos
ponpos
ponpos

[-150 0]
[-120 0]
[-90 0]
[-60 0]
[-30 0]

En lugar de copiar 11 veces practicamente la misma lnea de ordenes, usaremos repitepara,


con la variable :i tomando los valores 2, 3, 4, ..., 12.
Para colocar a las tortugas, creamos el procedimiento inicia
para inicia
borrapantalla
ocultatortuga
repitepara [i 2 12]
[ # coloca la tortuga
pontortuga :i ponpos lista -150 + (:i - 2) * 30 0
# escribe el numero de la tortuga justo debajo
subelapiz retrocede 15
rotula :i
avanza 15 bajalapiz ]
fin
Observa la expresion -150 + (:i - 2) * 30. Con ello hacemos que el primer valor
para la abscisa sea -150, y a cada nueva tortuga se a
naden 30 (probar con distintos valores
de :i si no se ve bien).
Finalmente, se obtiene el siguiente programa:
para lanzar
devuelve 1 + azar 6
fin
para inicia
borrapantalla
ocultatortuga
repitepara [i 2 12]
[ # coloca la tortuga
pontortuga :i ponpos lista -150 + (:i - 2)*30 0
# escribe el numero de la tortuga justo debajo
subelapiz retrocede 15
rotula :i
avanza 15 bajalapiz ]
fin

146

CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

para empezar
inicia
# Hacemos 1000 intentos
repite 1000
[ haz "suma lanzar+lanzar
pontortuga :suma avanza 1 ]
# indicamos las frecuencias de tirada
repitepara [i 2 12]
[ pontortuga :i
# la ordenada de la tortuga representa el numero de tiradas
hazlocal "frecuencia ultimo pos
subelapiz avanza 10 giraizquierda 90
avanza 10 giraderecha 90 bajalapiz
rotula :frecuencia/1000*100 ]
fin
Veamos ahora una generalizacion de este programa. Aqu, se pediran al usuario el
n
umero de dados deseados as como el n
umero de lanzamientos a efectuar.
para lanzar :dados
hazlocal "suma 0
repite :dados
[ hazlocal "suma :suma + 1 + azar 6 ]
devuelve :suma
fin
para inicia
borrapantalla ocultatortuga
ponmaximastortugas :max + 1
repitepara frase lista "i :min :max
[ # coloca la tortuga
pontortuga :i
ponpos lista (:min - :max)/2*30 + (:i - :min)*30 0
# escribe el numero de la tortuga justo debajo
subelapiz retrocede 15
rotula :i
avanza 15 bajalapiz ]
fin
para empezar
leeteclado [Numero de dados:] "dados
si no numero? :dados
[ es [largoetiqueta No es un numero!]


14.4. ANIMACION

147

alto ]
haz "min :dados
haz "max 6*:dados
leeteclado [Numero de lanzamientos a realizar] "tiradas
si no numero? :tiradas
[ es [largoetiqueta El numero introducido no es valido!]
alto ]
inicia
# Debemos ajustar el paso para que no se salga de pantalla
haz "paso :dados * 500/:tiradas
# Hacemos un numero de intentos igual a :tiradas
repite :tiradas
[ pontortuga lanzar :dados avanza :paso ]
# indicamos las frecuencias de tirada
repitepara frase lista "i :min :max
[ pontortuga :i
# la ordenada de la tortuga representa el numero de tiradas
hazlocal "frecuencia ultimo pos
# normalizamos entre 0,1
subelapiz avanza 10 giraizquierda 90
avanza 10 giraderecha 90 bajalapiz
# en caso de numeros grandes, los decimales son ... terribles
rotula (redondea 10000*:frecuencia/:tiradas)/100 ]
fin
Piensa c
omo podemos utilizar el sistema mostrado en
el ejemplo para leer una lista de datos discretos y que
las tortugas vayan representando un diagrama de barras con ellos. Pista: Deber
as hacer m
as de una pasada
a la lista, para determinar cu
antos elementos distintos
hay y ordenarlos de menor a mayor antes de releerla
para hacer avanzar a las tortugas

14.4.

Animaci
on

Existen dos primitivas llamadas animacion y refrescar que permiten escribir ordenes
sin que la tortuga las realice. animacion hace que la tortuga dibuje pero no lo muestre, es
decir, a nuestros ojos no hace nada; al recibir la orden refrescar muestra todo el trabajo
almacenado en memoria.
Primitivas
animacion

Uso
Se accede al modo de animacion.


CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

148
Primitivas
detieneanimacion
refrescar

Uso
Detiene el modo animacion, retornando al modo normal.
En modo de animacion, ejecuta las ordenes y actualiza la imagen

Mientras se escriben las ordenes en el modo de animacion (una camara de cine aparece

a la izquierda del Hist


orico de Comandos), estas no son ejecutadas en el Area
de
Dibujo sino que son almacenadas en memoria hasta que se introduce la orden refrescar.

Haciendo clic en este icono, se detiene el modo de animacion, sin necesidad de usar la
primitiva detieneanimacion.
Esto es muy u
til para crear animaciones o conseguir que los dibujos se realicen rapidamente.

14.4.1.

Ejemplo

Vamos a conseguir que un camion se desplace de izquierda a derecha de la pantalla.


Empezamos por dibujar un camion (puedes cambiar el modelo, si este no te gusta) muy
sencillo, un cuadrado como remolque, dos ruedas y una cabina simple:

para camion
pongrosor 2 ocultatortuga
repite 4
[avanza 30 giraizquierda 90]
giraderecha 90 avanza 15 giraizquierda 90 avanza 10
giraizquierda 45 avanza (rc 2)*15 giraizquierda 135 avanza 25
giraizquierda 90 goma avanza 5 ponlapiz circulo 5 rellena
retrocede 20 goma retrocede 5 ponlapiz circulo 5 rellena
fin
y concluimos con la parte asociada a la animacion:
para moviendose
animacion
repitepara [ lugar -300 +300 2]

14.5. EJERCICIOS

149

[ borrapantalla subelapiz ponx :lugar bajalapiz


coche refrescar ]
detieneanimacion
fin
El efecto final es el del camion desplazandose desde el punto [-300 0] hasta el [300 0]

Si a
un tienes dudas, en la seccion 18 mostraremos otra animacion, esta vez sobre las
cifras de la calculadora (cuenta atras).
Este tipo de problemas pueden asociarse al estudio de los n
umeros complejos. Recordemos
que la interpretacion geometrica de un complejo permite sistematizar el analisis de:
traslaciones
rotaciones
dilataciones
es decir, las Homotecias. En:
http://neoparaiso.com/logo/numeros-complejos-aplicaciones.html
muestran tres ejemplos de ello con las figuras de un coche, un martillo y una hormiga:

14.5.

Ejercicios

Intenta reproducir con xLogo las tres animaciones propuestas:


1. Desplazamiento de un coche
2. Giro de un martillo


CAPITULO 14. MODO MULTITORTUGA Y ANIMACION

150

3. Escalado de una hormiga


PERO usando correctamente las operaciones entre complejos.
Para representar los complejos con xLogo deberas crear una lista con dos elementos, las
coordenadas X e Y, y usar correctamente primero y ultimo para efectuar las operaciones.

14.6.

El increible monigote creciente

En primer lugar, vamos a definir un procedimiento monigote que dibujara el monigote


representado arriba, con un tama
no de nuestra eleccion.
para monigote :c
giraizquierda 154 avanza 2.2*:c retrocede
giraizquierda 52 avanza 2.2*:c retrocede
giraizquierda 154 avanza 2*:c
giraizquierda 154 avanza 2.2*:c retrocede
giraizquierda 52 avanza 2.2*:c retrocede
giraizquierda 154 avanza :c/2
giraizquierda 90 repite 180
[avanza :c/40 giraderecha 2]
giraderecha 90
fin

:c*2.2
:c*2.2
:c*2.2
:c*2.2

Vamos ahora con la animacion que creara la ilusion de que el monigote crece poco a poco.
Para ello, escribimos monigote 1, despues monigote 2 monigote 3 . . . hasta monigote
75. Entre cada trazado, se borrara la pantalla. Se obtienen los procedimientos siguientes:
para monigote :c
si :c=75 [alto]
giraizquierda 154 avanza 2.2*:c retrocede :c*2.2

14.6. EL INCREIBLE MONIGOTE CRECIENTE

151

giraizquierda 52 avanza 2.2*:c retrocede :c*2.2


giraizquierda 154 avanza 2*:c
giraizquierda 154 avanza 2.2*:c retrocede :c*2.2
giraizquierda 52 avanza 2.2*:c retrocede :c*2.2
giraizquierda 154 avanza :c/2
giraizquierda 90 repite 180
[avanza :c/40 giraderecha 2]
giraderecha 90
borrapantalla ocultatortuga monigote :c+1
fin
para empezar
borrapantalla ocultatortuga monigote 0
fin
Por u
ltimo, para suavizar todo el proceso, vamos a servirnos del modo animacion y de
la primitiva refrescar.
para monigote :c
giraizquierda 154 avanza 2.2*:c retrocede
giraizquierda 52 avanza 2.2*:c retrocede
giraizquierda 154 avanza 2*:c
giraizquierda 154 avanza 2.2*:c retrocede
giraizquierda 52 avanza 2.2*:c retrocede
giraizquierda 154 avanza :c/2
giraizquierda 90 repite 180
[avanza :c/40 giraderecha 2]
giraderecha 90
refresca
borrapantalla ocultatortuga monigote :c+1
fin
para empezar
borrapantalla ocultatortuga animacion
monigote 0
detieneanimacion
fin

:c*2.2
:c*2.2
:c*2.2
:c*2.2

Captulo 15
Manejo de Archivos
15.1.

Las primitivas

Como siempre, vamos a clasificar las primitivas en funcion de su objetivo:

15.1.1.

Navegaci
on por el sistema de archivos

Al iniciar xLogo, la ruta de trabajo sera el directorio personal (/home/nombre/ en


Linux y Mac) o el directorio raz C:\\ en Windows. Para desplazarnos por el disco duro y
ejecutar programas externos, disponemos de:
Primitivas

Argumentos

catalogo, cat

no

pondirectorio,
pondir

lista

cambiadirectorio, palabra o
cd
lista
directorio, dir

no

Uso
Lista el contenido del directorio actual. (Equivalente al comando ls de Linux, dir de DOS)
Especifica el directorio actual. La ruta debe ser
absoluta. El directorio debe especificarse dentro
de una lista, y la ruta no debe contener espacios.
Cambia el directorio de trabajo desde el directorio actual (ruta relativa). Puede utilizarse ..
para referirse a la ruta del directorio superior.
Da el directorio actual.

Supongamos la siguiente estructura de directorios en el disco duro de un alumno:


/home/alumno
--> /Documentos
--> /Clase
--> /xLogo
--> /Programas
152

15.1. LAS PRIMITIVAS

153

--> /Capturas
--> /Escritorio
--> /Imagenes
Al iniciar xLogo, la ruta de trabajo sera /home/alumno/. Para llegar al directorio Programas
podemos escribir alternativamente:
pondirectorio "/home/alumno/Documentos/xLogo/Programas
cambiadirectorio "Documentos/xLogo/Programas
Una vez en el, podemos ir hacia atras de forma absoluta o relativa:
pondirectorio "/home/alumno/Documentos/xLogo
cambiadirectorio "..
y listar su contenido, que se mostrara en el Historico de Comandos separando los directorios
de los archivos:
catalogo
--> Directorio(s):
Programas Capturas
Archivo(s):
manual.pdf prueba.lgo tortuga.png transfo.png xlogo.jar
Hay dos posibilidades de que esto no sea exactamente as:
cuando se abre un archivo .lgo desde el Men
u Archivo, el directorio donde se encontraba este queda establecido como directorio de trabajo. Por ejemplo, si abrimos el
fichero:
/home/alumno/Documentos/xLogo/rosa.lgo
el directorio de trabajo sera
/home/alumno/Documentos/xLogo
Si no es la primera vez que se trabaja con xLogo. Al terminar una sesion, se guarda
la u
ltima ruta de trabajo y se mantiene para ejecuciones posteriores.
Todo lo anterior afecta al guardado en disco de procedimientos o la carga desde disco
duro de procedimientos e imagenes, NO a las capturas de pantalla que pueden hacerse
desde el Men
u Archivo Capturar la imagen.

CAPITULO 15. MANEJO DE ARCHIVOS

154

15.1.2.

Carga y guardado de procedimientos

Finalizando el captulo 5 te ense


namos a guardar en el disco duro usando las opciones
de Men
u:
Men
u Archivo Guardar como . . . .
Men
u Archivo Guardar
que difieren en que uno te permite asignar un nombre, y el otro sobreescribe el archivo
abierto (si lo hay). Podemos tambien abrir procedimientos con:
Men
u Archivo Abrir
y disponemos de primitivas con las que conseguir lo mismo:
Primitivas
carga

Argumentos
palabra

guarda

palabra,
lista

guardatodo

palabra

Uso
Abre y lee el archivo indicado por palabra.
Guarda en el archivo indicado por palabra los
procedimientos especificados en lista, en el directorio actual. (Ver ejemplo)
Guarda en el archivo indicado por la palabra
todos los procedimientos definidos, en el directorio actual. (Ver ejemplo)

Ejemplos:
carga "prueba.lgo carga un archivo llamado prueba.lgo del directorio
actual, SIN ABRIR el Editor de Comandos.
Difiere de la opcion Abrir del Men
u Archivo en que este s abre el Editor
de Comandos.
guarda "trabajo.lgo [proc1 proc2 proc3] guarda en el directorio actual un archivo llamado trabajo.lgo que contiene los procedimientos
proc1, proc2 y proc3.
guardatodo "trabajo.lgo guarda en el directorio actual un archivo llamado trabajo.lgo que contiene la totalidad de los procedimientos actualmente definidos.
Es equivalente a usar la opcion Guardar del Men
u Archivo.
En ambos casos, si no se indica la extension .lgo, sera a
nadida. La palabra especifica una ruta relativa a partir del directorio corriente. No funciona colocar
una ruta absoluta.
Para borrar todos los procedimientos definidos y cargar el archivo trabajo.lgo,
debes usar:

15.1. LAS PRIMITIVAS

155

borratodo carga "trabajo.lgo


La palabra especifica una ruta relativa a partir del directorio corriente. No
funciona colocar una ruta absoluta, es decir:
borratodo carga "/home/alumno/xLogo/trabajo.lgo
no producira ning
un efecto.

15.1.3.

Modificando archivos

Primitivas

Argumentos

abreflujo

n
umero nombre

cierraflujo

n
umero

listaflujos

lista

leelineaflujo

n
umero

leecarflujo

n
umero

escribelineaflujo n
umero lista

agregalineaflujo

n
umero lista

finflujo?

n
umero

Uso
Para poder leer o escribir en un fichero, es necesario crear un flujo hacia el. El argumento
nombre debe ser su nombre, que se refiere al
directorio de trabajo. El argumento n es el n
umero que identifica a ese flujo.
Cierra el flujo n.
Carga una lista con los flujos abiertos indicando
su identificador
Abre el flujo cuyo identificador es n, y lee una
lnea del fichero
Abre el flujo cuyo identificador es n, despues lee
un caracter del fichero. Esta primitiva devuelve
el n
umero correspondiente al caracter unicode
(como leecar - sec. 12.2)
Escribe la lnea de texto indicada en lista
al principio del fichero indicado por el flujo n.
Atencion: la escritura no se hace efectiva hasta
que se ciera el fichero con cierraflujo.
Escribe la lnea de texto indicada en lista al
final del fichero indicado por el flujo n. Atencion:
la escritura no se hace efectiva hasta que se ciera
el fichero con cierraflujo.
Devuelve cierto si se ha llegado al final del
fichero, y falso en caso contrario.

Ejemplo:
El objetivo es crear el fichero ejemplo en el directorio personal: /home/tu_nombre, en
Linux, C:\, en Windows que contiene:
~NOPQRSTUVWXYZ
ABCDEFGHIJKLMN
abcdefghijklm~
nnopqrstuvwxyz
0123456789

CAPITULO 15. MANEJO DE ARCHIVOS

156
Para ello:

# abre un flujo hacia el fichero indicado


# identificara el flujo con el numero 2
pondirectorio "/home/tu_nombre
abreflujo 2 "ejemplo
# escribe las lineas que quiero
escribelineaflujo 2 [ABCDEFGHIJKLMN~
NOPQRSTUVWXYZ]
escribelineaflujo 2 [abcdefghijklmn~
nopqrstuvwxyz]
escribelineaflujo 2 [0123456789]
# cerramos el flujo para acabar la escritura
cierraflujo 2
Ahora, comprobamos que esta bien escrito:
# abre un flujo hacia el fichero indicado
# identificara el flujo con el numero 0
pondirectorio "/home/tu_nombre
abreflujo 0 "ejemplo
# lee las lineas del fichero consecutivamente
escribe leelineaflujo 0
escribe leelineaflujo 0
escribe leelineaflujo 0
# cerramos el flujo
cierraflujo 0
Si queremos que nuestro fichero termine con la lnea Formidable!:
pondirectorio "c:\\
abreflujo 1 "ejemplo
agregalineaflujo 1 [Formidable!]
cierraflujo 1

15.2.

Ejecutando programas externos

Si quisieramos ejecutar un program externo a xLogo, disponemos de la primitiva


comandoexterno. Su argumento debe ser una lista de sublistas, que contienen en este
orden:
El comando que lanza el programa
Opcionalmente, las opciones del mismo
Por ejemplo:
comandoexterno [ [gedit] ]

APROXIMADA DE (2)
15.3. OBTENCION

157

Ejecuta el program gedit (en Linux) sin opciones.


comandoexterno [ [notepad] ]
Ejecuta el program block de botas (en Windows) sin opciones.
comandoexterno [ [gedit] [/home/xlogo/ejemplo.txt] ]
Abre el archivo ejemplo.txt con gedit (en Linux).
comandoexterno [ [notepad] [c:\ejemplo.txt]]
Abre el archivo ejemplo.txt con el block de notas (en Windows).
Esta sintaxis tan especial permite llamar al sistema con los espacios en blanco adecuados
para que no haya errores.

15.3.

Obtenci
on aproximada de (2)

Un resultado conocido de teora de los n


umeros pone de manifiesto que la probabilidad
que dos n
umeros tomados aleatoriamente sean primos entre ellos es de 62 ' 0,6079. Para
intentar encontrar este resultado, vamos a:
Tomar dos n
umeros al azar entre 0 y 1 000 000.
Calcular su m.c.d.
Si su m.c.d. vale 1, a
nadir 1 a una variable contador.
Repetir 1000 veces
La frecuencia de los pares de n
umeros primos entre ellos se obtendra dividiendo la
variable contador por 1000 (el n
umero de pruebas)

15.3.1.

Noci
on de m.c.d. (m
aximo com
un divisor)

Dados dos n
umeros enteros, el maximo com
un divisor define al mayor divisor com
un
de ambos. Por ejemplo:
42 y 28 tienen como m.c.d. 14, ya que es el n
umero mas grande por el que es posible
dividir a la vez 28 y 42
el m.c.d. de 25 y 55 es 5
42 y 23 tienen m.c.d. igual a 1
Cuando dos n
umeros tienen m.c.d. 1, se dice que son primos entre s. As en el ejemplo
anterior, 42 y 23 son primos entre s. Eso significa que no tienen ning
un divisor com
un
excepto 1 (por supuesto, hablamos de division entera!).

CAPITULO 15. MANEJO DE ARCHIVOS

158

15.3.2.

Algoritmo de Euclides

Para determinar del m.c.d. de dos n


umeros, se puede utilizar un metodo llamado algoritmo de Euclides: (Aqu no se demostrara la validez de este algoritmo, se admite que
funciona).
El mecanismo de este metodo es: dados dos n
umeros naturales a y b, analizamos si b
es nulo.:
En caso afirmativo, entonces el m.c.d. es igual a a.
Si no, se calcula r, el resto de la division de a entre b.
Se sustituyen a por b y b por r, y se reinicia el metodo.
Calculemos por ejemplo, el m.c.d. de 2160 y 888 por este algoritmo con las siguientes
etapas:
a
b
r
2160 888 384
888 384 120
384 120 24
120
24
0
24
0
El m.c.d. de 2160 y 888 es, por tanto, 24. 24 es el mayor entero que divide simultaneamente
a los dos n
umeros. De hecho, 2160 = 24 * 90 y 888 = 24 * 37. El m.c.d. es, por tanto,
el u
ltimo resto no nulo.

15.3.3.

Calcular un m.c.d. en xLogo

Un peque
no algoritmo recursivo permite calcular el m.c.d. de dos n
umeros, :a y :b.
para mcd :a :b
si (resto :a :b) = 0
[devuelve :b]
[devuelve mcd :b resto :a :b]
fin
escribe mcd 2160 888
proporciona como resultado 24
Nota: Nos vemos obligados a poner parentesis en resto :a :b, si no el interprete
intentara evaluar b = 0. Para evitar este problema de parentesis, podemos escribir: si 0
= resto :a :b

APROXIMADA DE (2)
15.3. OBTENCION

15.3.4.

159

Avanzando con el programa

Tras la introduccion matematica, recordemos nuestro objetivo:


Tomar dos n
umeros al azar entre 0 y 1 000 000.
Calcular su m.c.d.
Si su m.c.d. vale 1, a
nadir 1 a una variable contador.
Repetir 1000 veces
La frecuencia de los pares de n
umeros primos entre ellos se obtendra dividiendo la
variable contador por 1000 (el n
umero de pruebas)
para prueba
# Inicializamos la variable contador a 0
haz "contador 0
repite 1000
[ si (mcd azar 1000000 azar 1000000) = 1
[haz "contador :contador+1] ]
escribe [Frecuencia:]
escribe :contador/1000
fin
Comprobamos la validez del metodo:
prueba
0.609
prueba
0.626
prueba
0.597
y vemos que se obtienen valores proximos al valor teorico de 0,6097. Lo que es notable es
6
que esta frecuencia es un valor aproximado de 2 ' 0, 6079.

Si tenemos en cuenta f, la frecuencia encontrada, se tiene, entonces:


f'

6
2

Despejando:
6
'
f
2

y as: '

6
f

A
nadimos esta aproximacion al programa, y transformamos el final del procedimiento
prueba:

160

CAPITULO 15. MANEJO DE ARCHIVOS

para prueba
# Inicializamos la variable contador a 0
haz "contador 0
repite 1000
[ si (mcd azar 1000000 azar 1000000) = 1
[ haz "contador :contador+1 ] ]
# Tras calcular la frecuencia
haz "f :contador/1000
# Mostramos el valor aproximado de pi
escribe frase [Aproximacion de pi:] raizcuadrada (6/:f) fin
fin
que proporciona:
prueba
Aproximacion de pi: 3.164916190172819
prueba
Aproximacion de pi: 3.1675613357997525
prueba
Aproximacion de pi: 3.1008683647302115
Por u
ltimo, modifiquemos el programa de modo que cuando lo lancemos, podamos
indicar cuantas pruebas con n
umeros aleatorios deseamos.
para prueba :repeticiones
# Inicializamos la variable contador a 0
haz "contador 0
repite :repeticiones
[ si (mcd azar 1000000 azar 1000000) = 1
[ haz "contador :contador+1 ] ]
# Tras calcular la frecuencia
haz "f :contador/:repeticiones
# Mostramos el valor aproximado de pi
escribe frase [Aproximacion de pi:] raizcuadrada (6/:f)
fin
Probamos con 10000 repeticiones, y obtenemos en las tres primeras tentativas:
prueba 10000
Aproximacion de pi: 3.1300987144363774
prueba 10000
Aproximacion de pi: 3.1517891481565017
prueba 10000
Aproximacion de pi: 3.1416626832299914
No esta mal, verdad?

QUE GENERA . . .
15.4. COMPLIQUEMOS UN POCO MAS:

15.4.

161

Compliquemos un poco m
as: que genera . . .

Que es un n
umero aleatorio? Es que un n
umero tomado aleatoriamente entre 1 y
1.000.000 es un n
umero realmente aleatorio?
Deberas darte cuenta rapidamente que nuestro modelo no hace mas que aproximarse
al modelo ideal. Bien, es precisamente sobre el modo de generar el n
umero aleatorio sobre
el que vamos a efectuar algunos cambios . . . . No vamos utilizar mas la primitiva azar, sino
que utilizaremos la secuencia de los decimales de .
Me explico: los decimales de siempre han intrigado a los matematicos por su falta de
regularidad, las cifras de 0 a 9 parecen aparecer en cantidades aproximadamente iguales
y de manera aleatoria. No se pueden predecir los decimales siguientes basandonos en los
anteriores.
Vamos a ver a continuacion como generar un n
umero aleatorio con ayuda de los decimales de . En primer lugar, debes obtener los primeros decimales de (por ejemplo un
millon). Existen dos programas que los calculan bastante bien. Aconsejamos PiFast para
Windows y Schnell-Pi para Linux.
Puedes acceder a Internet para conseguir un fichero de texto:
http://3.141592653589793238462643383279502884197169399375105820974944592.com
Tambien en Internet, en la web de xLogo:
http://downloads.tuxfamily.org/xlogo/common/millionpi.txt
Para crear los n
umeros aleatorios, agrupamos de 8 en 8 cifras la serie de decimales de
. Es decir, el fichero empieza as:
3,1415926 53589793
| {z } 23846264
| {z } 33832795
| {z } 0288419716939 . . .
|

{z

1er numero

2o numero 3er numero

...

Retiro la coma , del 3.14... que podra equivocarnos al extraer los decimales. Bien,
todo esta preparado, creamos un nuevo procedimiento llamado azarpi y modificamos ligeramente el procedimiento prueba para llamar al procedimiento azarpi:
para azarpi :n
hazlocal "numero "
repite :n [
# Si no hay ningun caracter en la linea
si 0=cuenta :linea
[haz "linea primero leelineaflujo 1]
# Asignamos a la variable :caracter el valor de primer caracter de la linea
haz "caracter primero :linea
# despues eliminamos el primer caracter de la linea
haz "linea menosprimero :linea
haz "numero palabra :numero :caracter ]
devuelve :numero
fin

CAPITULO 15. MANEJO DE ARCHIVOS

162
El resultado es:
prueba 10
Aproximacion
prueba 100
Aproximacion
prueba 1000
Aproximacion
prueba 10000
Aproximacion

de pi: 3.4641016151377544
de pi: 3.1108550841912757
de pi: 3.081180112566604
de pi: 3.1403714651066386

Encontramos pues una aproximacion del n


umero con ayuda de sus propios decimales!

Captulo 16
Geometra de la tortuga en 3-D
16.1.

La tortuga en Tres Dimensiones

Desde la version 0.9.92, nuestra tortuga puede dejar el plano para trasladarse a un
espacio en tres dimensiones (3D). Para cambiar a esta modalidad, Usaremos la primitiva
perspectiva. Bienvenido a un mundo en 3D!
La tortuga cambia de forma y orientacion, indicandonos en que modo nos encontramos:

Para recuperar el modo bidimensional (2D), debemos indicarle que vuelva a uno de los
modos planos: modojaula, modoventana o modovuelta.

16.1.1.

La proyecci
on en perspectiva

Para representar un espacio 3D en un plano 2D, xLogo utiliza una proyeccion en


perspectiva. Es equivalente a tener una camara grabando la escena en 3D, y mostrando en
la pantalla la imagen de la proyeccion. Veamos un esquema grafico para explicarlo mejor:

163

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

164

Disponemos de primitivas para fijar la posicion de la camara, mientras que la pantalla


de proyeccion se encuentra en el punto medio entre la camara y el objeto.

16.1.2.

Entender la orientaci
on en el mundo tridimensional

En el plano, la orientacion de la tortuga se define u


nicamente por su rumbo. Sin embargo, en el mundo tridimensional la orientacion de la tortuga necesita de tres angulos. Si
usamos la orientacion por defecto de la tortuga en 3D (en el plano XY mirando hacia el
semieje Y positivo):
Balanceo: la inclinacion alrededor del eje OY
Cabeceo: la inclinacion seg
un el eje OX
Rumbo: la inclinacion seg
un el eje OZ
De hecho, para moverse en el mundo tridimiensional, la tortuga se comportara de modo
muy similar a un avion. De nuevo, ilustremos con una imagen los 3 angulos:

Balanceo

Cabeceo

Rumbo

Parece bastante complicado la primera vez que se estudia, pero veremos que muchas
cosas son similares a los movimientos en el plano bidimensional.

16.1.3.

Primitivas

Estas son las primitivas basicas para moverse en el mundo 3D:


Primitiva
Pasar al modo 3D
Salir del modo 3D
Baja el morro n grados
Sube el morro n grados

Forma larga
perspectiva
modojaula, modovuelta
o modoventana
cabeceaabajo n
o
bajanariz n, bn n
cabeceaarriba n
o
subenariz n, sn n

16.1. LA TORTUGA EN TRES DIMENSIONES

Sube ala izquierda y baja ala derecha n grados


Sube ala derecha y baja ala izquierda n grados:
Borrar Pantalla (y tortuga al centro, orientada hacia
nosotros con el timon de cola hacia arriba)
Devuelve la inclinacion de las alas
Devuelve la inclinacion del morro

165

balanceaderecha n, bd
n
balanceaizquierda n,
bi n
borrapantalla, bp
balanceo
cabeceo

Ademas de las anteriores, podemos usar algunas de nuestras viejas conocidas:


avanza, av
retrocede, re
giraderecha, gd
giraizquierda, gi
que realizan los mismos movimientos que en el mundo 2D.
Por ejemplo, en el plano bidimensional, para dibujar un cuadrado de 200 pasos de tortuga,
escribimos:
repite 4 [ avanza 200 giraderecha 90 ]
Estas ordenes siguen existiendo el mundo 3D, y el cuadrado puede dibujarse perfectamente
en modo perspectiva:

Si la tortuga baja el morro 90 grados, podemos


dibujar otro cuadrado, y obtenemos:
borrapantalla
repite 4 [ avanza 200 giraderecha 90 ]
bajanariz 90
repite 4 [ avanza 200 giraderecha 90 ]

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

166

Puedes (debes) probar otros ejemplos para entender perfectamente la orientacion de la


tortuga y el uso de los angulos y convertirte en un experto!
Tambien debes entender que las tres primitivas que controlan la rotacion en 3D estan
relacionadas entre s; por ejemplo, al ejecutar:
borrapantalla
balanceaizquierda 90 subenariz 90 balanceaderecha 90
El movimiento de la tortuga es equivalente a:
giraizquierda 90
es decir, que como ocurre en 2D, no todas las primitivas son necesarias, por ejemplo:
bajanariz 90
es equivalente a:
balancea 90 giraderecha 90 balanceaizquierda 90
(Puedes probar con tu mano si no lo entiendes bien)

16.2.

Primitivas disponibles tanto en 2D como 3D

Las siguientes primitivas estan disponibles en el plano o en el mundo 3D. La u


nica
diferencia son los argumentos admitidos por las primitivas. Estas precisan de los mismos
argumentos que en el plano:
circulo
ponx
coordenaday
rotula

arco
pony
rumbo
largoetiqueta

centro
coordenadax
ponrumbo

Las siguientes primitivas siguen esperando una lista como argumento, pero ahora debe contener tres argumentos, correspondientes a las tres coordenadas de un punto en el espacio:
[x y z].
hacia
ponpos, ponposicion

distancia
punto

pos, posicion


16.3. PRIMITIVAS SOLO
DISPONIBLES EN 3D

16.3.

167

Primitivas s
olo disponibles en 3D

ponxyz Esta primitiva mueve a la tortuga al punto elegido. Esta primitiva espera tres
argumentos que representan las coordenadas del punto.
ponxyz es muy similar a ponposicion, pero las coordenadas no estan escritos en una
lista.
Ejemplo, ponxyz -100 200 50 traslada a la tortuga hasta el punto x = -100; y =
200; z = 50
ponz Esta primitiva mueve a la tortuga al punto de altura (desconozco si el termino applikate usado en Alemania tiene traduccion al castellano mas alla de tercera
coordenada) dada. ponz recibe un n
umero como argumento, de modo identico a
ponx y pony
coordenadaz o coordz Devuelve la altura de la tortuga. Es equivalente a ultimo
posicion, pero simplifica la escritura.
ponorientacion Fija la orientacion de la tortuga. Esta primitiva espera una lista
que contiene tres n
umeros: [balanceo cabeceo rumbo]
Ejemplo: ponorientacion [100 0 58]: la tortuga tendra balanceo: 100 grados, cabeceo: 0 grados y rumbo: 58 grados.
Por supuesto, el orden de los n
umeros es importante. Si, por ejemplo, el valor de
la orientacion es [100 20 90], esto significa que si quieres esa misma orientacion
partiendo del origen (despues de un borrapantalla, por ejemplo) deberas escribir la
siguiente secuencia:
cabeceaderecha 100
subenariz 20
giraderecha 90
Si en esta instruccion cambiamos el orden, no obtendremos la orientacion deseada.
orientacion Devuelve la orientacion de la tortuga en una lista que contiene: [balanceo
cabeceo rumbo]
ponbalanceo La tortuga gira en torno a su eje longitudinal y adquiere el angulo de
balanceo elegido.
balanceo Devuelve el valor actual del balanceo
ponbalanceo La tortuga gira en torno a su eje transversal, y se orienta con el angulo
de cabeceo indicado.
balanceo Devuelve el valor actual del cabeceo

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

168

Podemos dibujar los semiejes en la posicion habitual tecleando, por ejemplo:


semieje y+: borrapantalla avanza 200 retrocede 200
semieje x+: giraderecha 90 avanza 200 retrocede 200
semieje z+: subenariz 90 avanza 200 retrocede 200

Podemos dibujar 8 planos verticales, cada uno girado respecto del anterior 45 grados,
as:
borrapantalla
repite 8
[ balanceaderecha 45
repite 4
[ avanza 100 giraderecha 90 ] ]

16.4.

Ejercicios

1. Dibuja un taburete cuadrado con una pata en cada esquina.


Idea: repetir 4 veces lado pata.
2. A partir del taburete anterior, dibuja una silla con el respaldo inclinado.
3. Reforma la silla anterior para dibujar una tumbona.
4. Dibuja una piramide cuadrangular regular.
Idea: proceder como si fuera un taburete invertido, con las patas inclinadas 45 grados
respecto del plano horizontal.
5. Dibuja un octaedro a partir de la piramide anterior

16.5. EL VISOR 3D

16.5.

169

El Visor 3D

xLogo incluye un visor 3D que permite visualizar los dibujos realizados en tres dimensiones. Este modulo usa las libreras de Java3D, por lo tanto es necesario tener instalado
todo el Java3D.

16.5.1.

Reglas

Las reglas a tener en cuenta para utilizar el Visor 3D son:

Al crear una figura geometrica sobre el Area


de Dibujo, hay que indicar al Visor 3D que
formas desea grabar para una futura visualizacion. Es posible grabar polgonos (superficies),
lneas, puntos o texto. Para utilizar esta funcion, las primitivas son:
empiezapoligono, definepoligono: Los movimientos de la tortuga posteriores a
esta llamada se guardan para crear un polgono.
finpoligono: Desde la ejecucion de definepoligono, la tortuga habra pasado por
varios vertices. Este polgono se habra registrado y su color se definira en funcion
del color de todos sus vertices.
Esta primitiva finaliza el polgono.
empiezalinea, definelinea: Los movimientos de la tortuga posteriores a esta llamada se guardan para crear una banda (una lnea).
finlinea: Desde la ejecucion de definelinea, la tortuga habra pasado por varios
vertices. Se guardara esta lnea y su color se definira en funcion del color de todos
sus vertices.
Esta primitiva finaliza la banda
empiezapunto, definepunto: Los movimientos sigueintes de la tortuga se guardan
para crear un conjunto de puntos.
finpunto: Esta primitiva finaliza el conjunto de puntos.

empiezatexto, definetexto: Cada vez que el usuario muestre un texto sobre el Area
de Dibujo con la primitiva rotula, se almacenara y luego sera representado por el
visor 3D.
fintexto: Esta primitiva finaliza la grabacion de texto.
vista3d, vistapoligono Inicia el visor 3D, todos los objetos guardados se dibujan
en una nueva ventana.
Disponemos de controles para mover la camara que muestra la escena:
Para hacer rotar la imagen haciendo clic con el boton izquierdo del raton y
arrastrando.

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

170

Para desplazar la imagen haciendo clic con el boton derecho del raton y arrastrando.
Para hacer zoom sobre la escena, usaremos la rueda del raton

16.5.2.

Poliedros. Los s
olidos plat
onicos

Los solidos platonicos son el tetraedro, el cubo (o hexaedro regular), el octaedro, el


dodecaedro y el icosaedro. Tambien se conocen como cuerpos platonicos, cuerpos cosmicos,
solidos pitagoricos, solidos perfectos, o poliedros regulares convexos. Son poliedros
convexos cuyas caras son polgonos regulares iguales en cuyos vertices se unen el mismo
n
umero de caras, y reciben este nombre en honor al filosofo griego Platon (ca. 427 adC/428
adC 347 adC).

Tetraedro

Hexaedro o cubo

Octaedro

Dodecaedro

Icosaedro

Esta lista es exhaustiva, ya que es imposible construir otro solido diferente que cumpla
todas las propiedades exigidas, es decir, convexidad y regularidad.
Para su construccion seguiremos un mecanismo general:
Crearemos un procedimiento que trace el polgono que define sus caras entre las
primitivas empiezapoligono y finpoligono.
Comenzando desde una cara, iremos recorriendo los vertices dibujando las caras
anexas.
En caras dibujadas en el punto anterior, repetimos el proceso hasta concluir el poliedro.
En todo momento, la mayor dificultad sera determinar la orientacion adecuada, es decir,
el angulo diedro:.
Tetraedro
Hexaedro o cubo
Octaedro
1
1
= arc cos ' 70,52878
90
= arc cos ' 109,47122
3
3
Dodecaedro
Icosaedro

1
5
= arc cos ' 116,56505 = arc cos
' 138,189685
3
5

16.5. EL VISOR 3D

171

Dibujando un tetraedro
El poliedro mas simple, una vez dibujada la base, basta recorrerla con el balanceo
adecuado:
para triangulo :lado
empiezapoligono
repite 3 [ avanza :lado giraderecha 120 ]
finpoligono
fin
para tetraedro :lado
borrapantalla perspectiva
poncolorlapiz rojo
haz "angulo arcocoseno 1/3
# Base triangular
triangulo :lado
# caras laterales
repite 3
[ balanceaizquierda :angulo
triangulo :lado
balanceaderecha :angulo avanza :lado giraderecha 120 ]
vista3d
fin
Ejecutando: tetraedro 500:

Dibujando un cubo
El caso mas simple en lo referente al angulo diedro es el cubo: son todos de 90 grados.
A cambio, debemos recorrer mas vertices.
para cuadrado :lado
# Grabamos los vertices del cuadrado

172

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

empiezapoligono
repite 4 [ avanza :lado giraderecha 90 ]
finpoligono
fin
para cubosimple :lado
# Cubo Amarillo
borrapantalla perspectiva
poncolorlapiz amarillo
# Caras laterales
repite 4
[ cuadrado :lado subelapiz
giraderecha 90 avanza :lado giraizquierda 90
balanceaderecha 90 bajalapiz ]
# Parte inferior
bajanariz 90 cuadrado :lado subenariz 90
# Cara Superior
avanza :lado bajanariz 90 cuadrado :lado
# Visualizacion
vista3d
fin
Estamos listos para ejecutar el comando: cubosimple 400:

Al sustituir en el procedimiento cuadrado, empiezapoligono por empiezalinea, y


finpoligono por finlinea:

16.5. EL VISOR 3D

173

Si hubieramos usado empiezapunto y finpunto en lugar de empiezalinea y finlinea,


deberamos ver en la pantalla solo los ocho vertices del cubo.
Estas primitivas son muy u
tiles para mostrar el conjunto de puntos en el espacio 3D.

En todos los casos, en el Area


de Dibujo se muestran las aristas del cubo que luego se vera
macizo con el Visor:

Dibujando un octaedro
Este poliedro tampoco presenta una dificultad excesiva. Recorremos el cuadrado central
dos veces, una vez balanceados hacia la derecha y otra a la izquierda:
para triangulo :lado
empiezapoligono
repite 3 [ avanza :lado giraderecha 120 ]
finpoligono
fin
para octaedro :lado
borrapantalla perspectiva
poncolorlapiz verde
haz "angulo 0.5*arcocoseno (-1)/3
repite 4
[ balanceaizquierda :angulo
triangulo :lado
balanceaderecha 2*:angulo
triangulo :lado
balanceaizquierda :angulo
avanza :lado giraderecha 90 ]
vista3d
fin
El resultado:

174

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

Dibujando un dodecaedro
Gracias a Juan Casal por prestarnos este programa. En el vemos como se introduce
un procedimiento cambiacara para simplificar el codigo, ya que en este caso tambien se
hace necesario modificar el cabeceo de la tortuga:
para pentagono :lado
empiezapoligono
repite 5
[ avanza :lado giraderecha 72 ]
avanza :lado
finpoligono
fin
para cambiacara
giraizquierda 18
bajanariz 63.44
giraizquierda 18
fin
para dodecaedro :lado
limpia
perspectiva
poncolorlapiz azul
pentagono :lado
#cara sup
giraizquierda 180
balanceaderecha 63.44
#pos ini p corona sup
repite 5
#corona sup
[ pentagono :lado cambiacara ]
subelapiz

16.5. EL VISOR 3D

175

balanceaizquierda 63.44 giraderecha 180


cambiacara
avanza :lado giraderecha 72 avanza :lado
cambiacara
avanza :lado giraderecha 72
bajalapiz
repite 5
[ pentagono :lado cambiacara ]
balanceaizquierda 63.44
giraizquierda 180
retrocede :lado
pentagono :lado
#
vista3d
fin

Dibujando un icosaedro
Finalmente, y adaptando un programa de Tom Lynn, conseguimos el mas complejo de
los solidos platonicos. Dibujaremos cinco bloques de cuatro triangulos, y nos ayudamos de
dos procedimientos para movimientos basicos:
proxarista, que desplaza a la tortuga hacia la siguiente arista en sentido horario
sobre la cara actual
carasig, que la desplaza hacia la cara adyacente por la derecha
repite 5 [carasig] devuelve la tortuga a la posicion original
para icosaedro :lado
borrapantalla
perspectiva
poncolorlapiz naranja
# Inicializamos los angulos

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

176

haz "phi (1 + raizcuadrada 5) / 2


haz "beta arcoseno (:phi / raizcuadrada 3)
haz "alpha 180-2*:beta
repite 5 [cuatrotrian :lado]
vistapoligono
fin
para triangulo :lado
bajalapiz # los procedimientos auxiliares lo dejan arriba
empiezapoligono
repite 3 [avanza :lado giraderecha 120]
finpoligono
carasig :lado
fin
para cuatrotrian :lado
repite 2 [triangulo :lado] proxarista :lado
repite 2 [triangulo :lado]
repite 2 [ repite 2 [carasig :lado] proxarista :lado]
carasig :lado
fin
para proxarista :lado
subelapiz avanza :lado giraderecha 120
fin
para carasig :lado
subelapiz giraderecha 60 avanza :lado giraizquierda 120 balanceaderecha :alpha
fin
El resultado:

16.5.3.

La esfera

El paso final es extender las n caras al caso infinito, es decir, como obtener una esfera.
Evidentemente no podemos dibujar infinitos polgonos, as que vamos a aproximar la esfera

16.6. EJERCICIOS

177

mediante cuadrados:
para esfera
borrapantalla
perspectiva
poncolorlapiz amarillo
repite 20
[ retrocede 25 giraizquierda 90 avanza 25 giraderecha 90
repite 36
[ cuadrado 50 avanza 50 cabeceaarriba 10 ]
giraizquierda 90 retrocede 25
giraderecha 90 avanza 25
giraderecha 9 ]
vistapoligono
fin
para cuadrado :lado
empiezapoligono
repite 4 [ avanza :lado giraderecha 90 ]
finpoligono
fin

Intenta crear una esfera usando la primitiva circulo.


Qu
e observas? Por qu
e crees que es? Plant
eate las
mismas preguntas al ver el resultado cuando utilizas
un procedimiento como el del 360-gono que vimos en
la secci
on 4.6.3 (p
ag. 36)

16.6.

Ejercicios

1. Crea un procedimiento prisma_rect que dibuje un prisma de base rectangular cuyas


aristas midan los valores introducidos con tres variables :a, :b y :c.

178

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

2. Dise
na un procedimiento prisma_reg que dibuje un prisma cuya base sea un polgono
regular y lea tres variables: :n (n
umero de lados del polgono), :l (lado del polgono)
y :h (altura).
Generaliza el procedimiento anterior para obtener un cilindro cuya base tenga radio
r y altura h.
Observa como cambia el aspecto que tiene el cilindro (la calidad del mismo) a medida
que aumenta el n
umero de lados de la base.
3. Transforma el cubo creado en 16.5.2 en un dado.

Recuerda que las caras opuestas de un dado suman siete.


4. Crea un procedimiento piramide que dibuje una piramide de base rectangular, cuyos
parametros sean las variables :a, :b (las dimensiones del rectangulo de la base) y :h
(la altura de la piramide).
5. Modifica el procedimiento anterior para obtener una piramide regular que acepte tres
valores: n, n
umero de lados de la base; l, lado de la base y h, altura.
Generaliza el procedimiento anterior para obtener un cono de radio de base r y altura
h.
Observa como cambia el aspecto que tiene el cono (la calidad del mismo) a medida
que aumenta el n
umero de lados de la base.
6. Combina los procedimientos creados antes para obtener:
a) Una casa en 3D combinando un prisma y una piramide.
b) Un silo en 3D combinando un cilindro y un cono.
7. Modifica los procedimientos cono y piramide para obtener un cono truncado y una
piramide truncada, respectivamente. Ten en cuenta que debes introducir nuevas variables.
8. Combina los procedimientos creados en el ejercicio anterior para crear una casa de
base rectangular cuyo tejado termine con uan piramide truncada.

16.7. EFECTOS DE LUZ Y NIEBLA

179

9. Combina los procedimientos cono, cilindro y esfera para dibujar un arbol por
superposicion de:
a) Un cono pegado al suelo.
b) Un cilindro de radio algo menor como tronco.
c) Una esfera como copa del arbol.
10. Ya sabes crear casas y arboles. Te atreves a crear un peque
no pueblo en 3-D?
Puedes hacer que las calles sean perpendiculares entre s, y que las dimensiones de
los edificios sean aleatorias, usando azar, para darle mas realismo.
Puedes incluir la version en 3-D del horreo asturiano (pagina 130):

cuyo codigo, as como otros ejemplos, puede encontrarse en:


http://xlogo.tuxfamily.org/sp/html/ejemplos/3D.html

16.7.

Efectos de luz y niebla

Desde la version 0.9.93 se pueden a


nadir efectos artsticos a las imagenes generadas en
el Visor. Estos pueden ser efectos de luz y de niebla, y se accede a ellos con los botones
presentes en el visor 3D.

180

CAPITULO 16. GEOMETRIA DE LA TORTUGA EN 3-D

Efectos de luz
Se pueden utilizar cuatro tipos de luz en las imagenes en tres dimensiones, a las que se
accede haciendo clic en uno de los cuatro botones mostrados bajo la leyenda Iluminaci
on.
Al trazar por primera vez una imagen en 3D solo se utilizan dos tipos de luz, ambos
Luz Puntual, pero pulsando en cualquiera de los cuatro botones de Iluminaci
on, aparece
el siguiente cuadro de dialogo:

donde podemos elegir entre los siguientes tipos de luz:


Luz Ambiente: Luz uniforme de la que solo puede modificarse el color
Luz Direccional: Se genera respecto a una direccion fija. Se parece a la luz ambiente
cuando la fuente esta muy lejos del objeto (por ejemplo, el sol)
Punto de Luz: La fuente esta en una posicion determinada, como en el caso de un faro.
Foco: Es como el punto de luz, pero el haz de luz se abre formando un cono cuya abertura
debe fijarse.
La mejor forma de entenderlo, es practicar con ello.

Efectos de niebla
Se pueden a
nadir efectos de niebla en la imagen tridimensional. Pulsa el boton con
nubes y obtendras este cuadro de dialogo:

16.7. EFECTOS DE LUZ Y NIEBLA

181

Disponemos de dos tipos de niebla:


Niebla Lineal o progresiva: La imagen se va difuminando de modo lineal, pudiendo
variar dos parametros:
La distancia a la que empieza la niebla
La distancia a la que la niebla no deja ver nada (opacidad total)
Niebla Densa: La niebla es uniforme en toda la escena, y solo necesitamos especificar la
densidad de la misma.
Este es un ejemplo con niebla lineal:

Captulo 17
Tocar m
usica (MIDI)
Ya comentamos anteriormente (seccion 1.2.1) que la version Windows de jre no incorpora las API (Application Programming Interface Interfaz de Programacion de Aplicaciones) que contienen los instrumentos y que deben ser instaladas manualmente. Es
importante recordarlo porque, si no lo haces, con la instalacion por defecto de Java no
tendras instrumentos disponibles:

Instalacion por defecto de Java

En Windows

En Linux y Mac

Puedes hacer pruebas con los distintos bancos de sonidos y ver las diferencias entre
ellos para elegir el que mas te guste, si bien el mnimo es mas que suficiente para nuestros
objetivos.
Ten en cuenta que el interprete Java selecciona automaticamente el banco de mayor calidad, as que vete probando de menor a mayor, sin borrar el anterior hasta que te hayas
decidido.
182

17.1. LAS PRIMITIVAS

17.1.

183

Las primitivas

Primitivas
secuencia, sec

Argumentos
lista

tocamusica

no

instrumento, instr

no

poninstrumento,
pinstr
indicesecuencia,
indsec
ponindicesecuencia,
pindsec
borrasecuencia, bos

n
umero

no
n
umero
no

Uso
Carga en memoria la secuencia includa en la
lista. Siguiendo a esta tabla, se indica como
escribir una secuencia de notas musicales.
Toca la secuencia de notas en memoria.
Da el n
umero que corresponde al instrumento
actualmente seleccionado.
Queda seleccionado el instrumento n
umero n.
Puedes ver la lista de instrumentos disponibles en el men
u Herramientas Preferencias Sonido.
Da la posicion del puntero en la secuencia
corriente.
Pone el puntero en la posicion n de la secuencia corriente.
Elimina de memoria la secuencia corriente.

Para tocar m
usica, primero hay que poner en memoria una lista de notas llamada
secuencia. Para crear una secuencia, puedes usar la primitiva sec o secuencia. Para crear
una secuencia valida, hay que seguir las siguientes reglas:
do re mi fa sol la si: Las notas usuales de la primera octava.
Para hacer un re sostenido, anotamos re +
Para hacer un re bemol, anotamos re Para subir o bajar una octava, usamos : seguido de + o -.
Ejemplo:
Despues de :++ en la secuencia, todas las notas sonaran dos octavas mas altas.
Por defecto, todas las notas tienen una duracion uno. Si quieres aumentar o disminuir la
duracion, debes escribir un n
umero correspondiente.

Ejemplos:
secuencia [sol 0.5 la si]


CAPITULO 17. TOCAR MUSICA
(MIDI)

184

tocara sol con la duracion 1 y la y si con la duracion 0.5 (el doble de rapido).
Otro ejemplo:

para partitura
# crea la secuencia de notas
secuencia [0.5 sol la si sol
si sol 1 la 0.5 la si 1 :+
secuencia [:+ 1 re 0.5 re do
secuencia [:+ 1 re 0.5 re do
secuencia [0.5 sol la si sol
si sol 1 la 0.5 la si 1 :+
fin

1 la 0.5 la si
do re 2 :- sol
1 :- si 0.5 la
1 :- si 0.5 la
1 la 0.5 la si
do re 2 :- sol

1 :+
]
si 1
si 1
1 :+
]

do do :- si si 0.5 sol la
:+ do re 2 :- la ]
:+ do re 2 :- la ]
do do :- si si 0.5 sol la

Para escuchar la m
usica, ejecuta los comandos: partitura tocamusica.
Ahora veamos una aplicacion interesante de la primitiva pindsec:
borrasecuencia
partitura
pindsec 2
partitura
tocamusica

#
#
#
#
#

elimina toda secuencia de memoria


pone en memoria las notas
pone el cursor en el segundo "la"
pone en memoria las mismas notas, pero movidas 2 lugares.
Grandioso!

En el caso en que tengas mas de una secuencia en el programa, debes borrar la anterior
antes de reproducir la siguiente.
Tambien puedes elegir un instrumento con la primitiva poninstrumento o en el men
u Herramientas Preferencias Sonido. Encontraras la lista de instrumentos
disponibles con su n
umero asociado.

17.2.

Ejercicios

Recuerdas el juego del captulo 3? Modifcalo en los siguientes puntos:


1. En vez de crculos, que cargue imagenes de piedras reales y de un lago cercano a la
zona donde vives (recuerda la primitiva cargaimagen.


17.3. CARGANDO ARCHIVOS DE MUSICA

185

Quiza sea necesario que las redimensiones con alg


un programa externo, aunque
existen formas de hacerlo con xLogo
Por comodidad, la imagen del lago debera tener un color uniforme
2. Distribuye aleatoriamente las imagenes de las piedras por la pantalla
3. Ubica el lago en una esquina y a la tortuga en la contraria.
4. Elige una meloda (te aconsejamos una sencilla, pero si te gusta mucho una, eres libre
de usarla) y haz que suene cuando la tortuga llegue al lago.
5. Crea los botones derecha e izquierda (ya lo hiciste en 12.7), pero modifica el de
avanza y retrocede para que llamen a un procedimiento que vaya mirando el color
seg
un se mueve la tortuga
Si ese color es el del lago, que aparezca un mensaje de felicitacion y que suene
la meloda.
Si, por el contrario, no es el del fondo o el del lago, que aparezca un mensaje de
Intentalo de nuevo y devuelva la tortuga al inicio.

17.3.

Cargando archivos de m
usica

Otra forma de escuchar m


usica es cargando un archivo mp3:
escuchamp3, cuyo argumento debe ser una palabra, inicia la reproduccion del archivo
mp3 indicado.
detienemp3, sin argumentos, detiene la reproduccion del archivo mp3 que esta sonando.

Captulo 18
Gesti
on de tiempos
xLogo dispone de varias primitivas que permiten conocer la hora y la fecha o utilizar
un cronometro descendente (
util para repetir una tarea a intervalos fijos).

18.1.

Las primitivas

Primitivas

Argumentos

espera

n
umero entero

cronometro,
crono

n
umero entero

fincronometro?,
no
fincrono?
fecha

no

hora

no

tiempo

no

Uso
Hace una pausa en el programa, la tortuga espera
(n/60) segundos.
Inicia un conteo descendiente de n segundos. Para
saber que la cuenta ha finalizado, disponemos de
la primitiva fincrono?
Devuelve "cierto si no hay ning
un conteo activo.
Devuelve "falso si el conteo no ha terminado.
Devuelve una lista compuesta de 3 n
umeros enteros que representan la fecha del sistema. El primero
indica el da, el segundo el mes y el u
ltimo el a
no.
[d
a mes a~
no]
Devuelve una lista compuesta de 3 n
umeros enteros que representan la hora del sistema. El primero
representa las horas, el segundo los minutos y el u
ltimo los segundos. [horas minutos segundos]
Devuelve el tiempo, en segundos, transcurrido desde el inicio de xLogo.

En las seccion 13.1 comentabamos que los dibujos eran mas rapidos con la tortuga
oculta que con ella en pantalla. Si a
nadimos las siguientes lneas al principio y al final del
procedimiento:
para nombre.proc :a :b ...
186

18.1. LAS PRIMITIVAS


haz "tardanza tiempo
...
...
escribe :tardanza - tiempo
fin
obtendremos los segundos que tardo en ejecutarse el procedimiento.
Veamos otro ejemplo:
para reloj
# muestra la hora en forma numerica (actualizada cada 5 segundos)
si fincrono? [
bp ponfuente 75 ot
haz "ho hora
haz "h primero :ho
haz "m elemento 2 :ho
# muestra dos cifras para los minutos (completando el 0)
si :m - 10 < 0 [
haz "m palabra 0 :m ]
haz "s ultimo :ho
# muestra dos cifras para los segundos
si :s - 10 < 0 [
haz "s palabra 0 :s ]
rotula palabra palabra palabra palabra :h ": :m ": :s crono 5 ]
reloj
fin
Podramos plantearnos la forma de representar un reloj analogico:

Se te ocurre como hacerlo?

187

DE TIEMPOS
CAPITULO 18. GESTION

188

18.2.

Actividad sobre las cifras de una calculadora

Al hablar de cifras de calculadora, nos referimos a las formas tradicionales:

...
aunque nada impedira hacerlo con las formas pixeladas mas modernas. De todas formas,
simplificaremos a
un mas las cifras para centrarnos en los aspectos relacionados con el tiempo.
Esta actividad se basa en el hecho de que
todos los n
umeros de calculadora pueden obtenerse con ayuda de un patron sno:
para dibujar un 4, encenderemos los
rectangulos 3, 4, 5 y 7, pero no los 1, 2
y6
para dibujar un 8, encenderemos los
rectangulos 1, 2, 3, 4, 5, 6 y 7.
para dibujar un 3, encenderemos los
rectangulos 2, 3, 4, 5 y 6, pero no los 1
y7
...

18.2.1.

El programa

Crearemos un rectangulo solido de modo recursivo:

18.2. ACTIVIDAD SOBRE LAS CIFRAS DE UNA CALCULADORA

189

para rectangulo :alto :ancho


si :ancho = 0 | :alto =0 [alto]
repite 2
[ avanza :alto giraderecha 90
avanza :ancho giraderecha 90]
rectangulo :alto-1 :ancho-1
fin
Supondremos aqu que la tortuga parte de la esquina inferior izquierda. Vamos a definir
un procedimiento llamado cifra que lee 7 argumentos :a, :b, :c, :d, :e, :f y :g.
Cuando :a vale 1, dibuja el rectangulo 1. Si :a vale 0, no se dibuja.
Cuando :b vale 1, dibuja el rectangulo 2. Si :b vale 0, no se dibuja.
Cuando :c vale 1, dibuja el rectangulo 1. Si :c vale 0, no se dibuja.
...
Se obtiene el siguiente procedimiento:
para cifra :a :b :c :d :e :f :g
# Dibujamos el rectangulo 1
si :a=1 [rectangulo 160 40]
# Dibujamos el rectangulo 2
si :b=1 [rectangulo 40 160]
sl gd 90 av 120 gi 90 bl
# Dibujamos el rectangulo 3
si :c=1 [rectangulo 160 40]
sl av 120 bl
# Dibujamos el rectangulo 5
si :e=1 [rectangulo 160 40]
# Dibujamos el rectangulo 4
gi 90 sl re 40 bl
si :d=1 [rectangulo 160 40]
# Dibujamos el rectangulo 6
gd 90 sl av 120 gi 90 bl
si :f=1 [rectangulo 160 40]
# Dibujamos el rectangulo 7
sl av 120 gi 90 re 40 bl
si :g=1 [rectangulo 160 40]
fin

DE TIEMPOS
CAPITULO 18. GESTION

190

18.2.2.

Creaci
on de una peque
na animaci
on

Vamos a simular una cuenta atras, que consiste en hacer aparecer sucesivamente las
cifras de 9 a 0 en orden decreciente.
para cuentatras
bp ot cifra 0
bp ot cifra 1
bp ot cifra 0
bp ot cifra 1
bp ot cifra 0
bp ot cifra 0
bp ot cifra 0
bp ot cifra 1
bp ot cifra 0
bp ot cifra 1
fin

1
1
0
1
1
0
1
1
0
1

1
1
1
1
1
1
1
0
1
1

1
1
0
1
1
1
1
1
0
0

1
1
1
0
0
1
1
1
1
1

1
1
1
1
1
0
1
1
0
1

1
1
0
1
1
1
0
0
0
1

espera
espera
espera
espera
espera
espera
espera
espera
espera
espera

60
60
60
60
60
60
60
60
60
60

Peque
no problema: hay un efecto de parpadeo desagradable durante la creacion de cada
cifra. Para suavizarlo se van a utilizar las primitivas animacion y refrescar.
Se obtiene el siguiente programa modificado:
para cuentatras
# Entramos en modo animacion
animacion
bp ot cifra 0 1 1 1 1 1 1 refrescar
bp ot cifra 1 1 1 1 1 1 1 refrescar
bp ot cifra 0 0 1 0 1 1 0 refrescar
bp ot cifra 1 1 1 1 0 1 1 refrescar
bp ot cifra 0 1 1 1 0 1 1 refrescar
bp ot cifra 0 0 1 1 1 0 1 refrescar
bp ot cifra 0 1 1 1 1 1 0 refrescar
bp ot cifra 1 1 0 1 1 1 0 refrescar
bp ot cifra 0 0 1 0 1 0 0 refrescar
bp ot cifra 1 1 1 0 1 1 1 refrescar
# Volvemos al modo de dibujo habitual
detieneanimacion
fin

18.3.

espera
espera
espera
espera
espera
espera
espera
espera
espera
espera

60
60
60
60
60
60
60
60
60
60

Ejercicios

1. Dise
nemos un juego. A ver quien cuenta mejor un minuto mentalmente.
a) Debe haber un boton de Inicio (solo nos preocupa el clic del raton)

18.3. EJERCICIOS

191

b) Al hacer clic sobre el boton, la tortuga puede:


Guardar el valor de tiempo
Guardar la hora actual
c) Permanece en espera hasta que se hace un segundo clic. En ese momento, calcula
la diferencia entre el tiempo o la hora almacenados y muestra si te has pasado,
te has quedado corto o has acertado.
Puedes a
nadir cualquier efecto que deje claro cualquiera de los tres resultados (color
de pantalla, de letra, m
usica, . . . )
2. Dise
na un programa que se comporte como la alarma de un reloj:
a) Abra una ventana que pida la hora a la que debe sonar
b) Compruebe la hora recursivamente hasta que coincida con la introducida
c) Cuando coincidan la hora real y la introducida, que suene una meloda
3. Recupera el procedimiento bisiesto?, y haz que xLogo te diga si el a
no actual es
bisiesto o no.
4. Dise
na un procedimiento que te pida la fecha de tu cumplea
nos y determine cuantos
das faltan para el.
Si hoy es tu cumplea
nos, que suene el Cumplea
nos Feliz.
5. Dise
na un procedimiento que determine que da de la semana es hoy.
(Dificultad alta) Amplalo para que te pida una fecha cualquiera y diga que da de
la semana le corresponde. Para ello:
a) Elige una fecha de referencia de la que sepas que da de la semana es.
b) Observa que los 365 das que tiene un a
no son:
365 = 364 + 1 = 7 52 + 1
es decir, cada a
no normal desplaza un da el da de la semana de una fecha fija:
por ejemplo, el 23 de Enero de 2006 fue Lunes, pero el mismo da de 2007 fue
Martes.
c) Ten en cuenta que los a
nos bisiestos desplazan dos das en vez de uno
d) Finalmente, haz un razonamiento analogo para cada mes, estudiando sus respectivos das

Captulo 19
Utilizaci
on de la red con xLogo
19.1.

La red: c
omo funciona eso?

En primer lugar es necesario explicar los conceptos basicos de la comunicacion en una


red para usar correctamente las primitivas de xLogo.

Figura: nocion de red


Dos ordenadores pueden comunicarse a traves de una red si estan equipados con una
tarjeta de red (llamada tambien tarjeta ethernet). Cada ordenador se identifica por una
direccion personal: su direccion I.P. Esta direccion IP consta de cuatro n
umeros enteros
comprendidos entre 0 y 255 separados por puntos. Por ejemplo, la direccion IP del primer
ordenador del esquema de la figura es 192.168.1.1
Dado que no es facil acordarse de este tipo de direccion, tambien se puede hacer corresponder a cada direccion IP un nombre mas facil de recordar. Sobre el esquema anterior,
podemos comunicar con el ordenador de la derecha bien llamandolo por su direccion IP:
192.168.1.2, o llamandolo por su nombre: tortuga.
No nos extendamos mas sobre el significado de estos n
umeros. A
nadamos u
nicamente
una cosa que es interesante saber, el ordenador local en el cual se trabaja tambien se
identifica por una direccion: 127.0.0.1. El nombre que se asocia con el es habitualmente
localhost.
192

19.2. PRIMITIVAS ORIENTADAS A LA RED

19.2.

193

Primitivas orientadas a la red

xLogo dispone de 4 primitivas que permiten comunicarse a traves de una red: escuchatcp,
ejecutatcp, chattcp y enviatcp.
En los ejemplos siguientes, mantendremos el esquema de red de la subseccion anterior.
escuchatcp: esta primitiva es la base de cualquier comunicacion a traves de la red.
No espera ning
un argumento. Permite poner al ordenador que la ejecuta a la espera
de instrucciones dadas por otros ordenadores de la red.
ejecutatcp: esta primitiva permite ejecutar instrucciones sobre otro ordenador de
la red.
Sintaxis: ejecutatcp palabra lista La palabra indica la direccion IP o el nombre del ordenador de destino (el que va a ejecutar las ordenes), la lista contiene las
instrucciones que hay que ejecutar.
Ejemplo: desde el ordenador liebre, deseo trazar un cuadrado de lado 100 en el otro
ordenador. Por tanto, hace falta que desde el ordenador tortuga ejecute la orden
escuchatcp. Luego, desde el ordenador liebre, ejecuto:
ejecutatcp "192.168.2.2 [repite 4 [avanza 100 giraderecha 90]]
o
ejecutatcp "tortuga [repite 4 [avanza 100 giraderecha 90]]
chattcp: permite chatear entre dos ordenadores de la red, abriendo una ventana en
cada uno que permite la conversacion.
Sintaxis: chattcp palabra lista La palabra indica la direccion IP o el nombre
del ordenador de destino, la lista contiene la frase que hay que mostrar.
Ejemplo: liebre quiere hablar con tortuga.
tortuga ejecuta escuchatcp para ponerse en espera de los ordenadores de la red.
liebre ejecuta entonces: chattcp "192.168.1.2 [buenos d
as].
Una ventana se abre en cada uno de los ordenadores para permitir la conversacion
enviatcp: enva datos hacia un ordenador de la red.
Sintaxis: enviatcp palabra lista La palabra indica la direccion IP o el nombre del ordenador de destino, la lista contiene los datos que hay que enviar. Cuando
xLogo recibe los datos en el otro ordenador, respondera Si , que podra asignarse a
una variable o mostrarse en el Hist
orico de comandos.

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION

194

Ejemplo: tortuga quiere enviar a liebre la frase "3.14159 casi el n


umero pi".
liebre ejecuta escuchatcp para ponerse en espera de los ordenadores de la red.
Si tortuga ejecuta entonces: enviatcp "liebre [3.14159 casi el n
umero pi],
liebre mostrara la frase, pero en tortuga aparecera el mensaje:
Qu
e hacer con [ Si ] ?
Deberamos escribir:
es enviatcp "liebre [3.14159 casi el n
umero pi]
o
haz "respuesta enviatcp "liebre [3.14159 casi el n
umero pi]
En el primer caso, el Hist
orico de comandos mostrara Si, y en el segundo "respuesta
contendra la lista [ Si ], como podemos comprobar haciendo
es lista? :respuesta
cierto
es :respuesta
Si
Con esta primitiva se puede establecer comunicacion con un robot didactico a traves
de su interfaz de red. En este caso, la respuesta del robot puede ser diferente, y se
podran decidir otras acciones en base al contenido de :respuesta.
Un peque
no truco: lanzar dos veces xLogo en un mismo ordenador.
En la primera ventana, ejecuta escuchatcp.
En la segunda, ejecuta
ejecutatcp "127.0.0.1 [repite 4 [avanza 100 giraderecha 90]]
As puedes mover a la tortuga en la otra ventana! (Ah s!, esto es as porque 127.0.0.1
indica tu direccion local, es decir, de tu propio ordenador)

19.3.

Rob
otica

Desde 2006, xLogo es capaz de comandar una interfaz externa para robotica, (y as
se presento en el congreso Cafeconf - Aulas Libres). Las primitivas de comunicacion por
red que acabamos de ver, ademas de ser utilizadas para la tareas grupales en red, chat,
comandar la tortuga en una PC desde otra PC, etc. permiten experimentar en robotica.
Me duele reconocer que mucho del trabajo realizado por Marcelo en este area se nos ha
ido con el, pero intentare explicar las cosas de forma lo bastante clara para que cualquiera
pueda seguir el tema sin problemas.
Es aqu mas que en ning
un otro sitio del curso, donde agradecere cualquier ayuda y/o
correccion que usted, lector o lectora, sea capaz de proporcionar.


19.3. ROBOTICA

19.3.1.

195

Presentaci
on
Pr
ologo: Prof. Mara Cristina Moreno.

En los libros de ciencia ficcion, el escritor, como un alquimista, le dio vida a los robots que
hoy se incorporan a nuestra vida cotidiana; desde una simple cafetera, hasta el Mars Rover.
El objetivo es que tecnologa y educacion recorran juntas el camino hacia el futuro.
La propuesta es lograr que en casa y en la escuela se construyan y manejen peque
nos robots
didacticos.
Con estas premisas, Marcelo Duschkin nos dejo el proyecto Mi Primer Robot, basado
en una interfaz electronica simple y economica, TortuRob, que todos pueden construir
libremente, al ser liberada bajo Licencia Creative Commons.

19.3.2.

La electr
onica

El currculo de la asignatura de Tecnologa en la Ense


nanza Secundaria nos presenta un bloque de control de procesos y robotica, pero habitualmente no se acompa
na de
una dotacion adecuada en lo referente al material necesario para experimentar en el taller.
Lo mas habitual es aprovechar las tarjetas controladoras antiguas (tipo Inves, Enconor,
CNICE, ladrillos Lego,. . . ), con el problema que ello conlleva: su incompatibilidad con los
sistemas Windows actuales. Por otro lado, tampoco es raro el caso de disponer de pocas
unidades de los equipos citados, lo que a
nade un sobrecoste economico a la asignatura.
Nuestra propuesta de interfaz electronica es el proyecto TortuRob.
El proyecto TortuRob
Es un circuito basado en un microprocesador PIC16F628A, que recibe comandos desde el
PC, y contiene puertos de entrada y salida para controlar una mecanica de robot. Tambien
estan includos 4 pulsadores y cuatro LEDs, con el objeto de usarlos en la etapa de aprender
a usar el sistema. De esta manera, las primeras pruebas no necesitan de una mecanica a
controlar.

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION

196

La placa es de reducidas dimensiones (9,5 x 7 cm) y es muy facil de armar por el aficionado
a la electronica. Los detalles tecnicos para su construccion pueden descargarse de:
http://downloads.tuxfamily.org/xlogo/robotica/TortuRob.zip

+5

1N4007
+

D4

10K

.1
C10

R7 R8 R9 R10

R11 1K
R12
R13
R14

TX

+ 100uf
C1

D2
D3

1K5 +5
R5

1
2
3

R6

4K7
R4 2K2 BC327
SI !!! positivo a masa

RA0

RB0

RA1

RB1

RA2

RB2

RA3

RB3

RA4

RB4

16F84 RB5
RB6
16

XTAL
8MHz
22pf

OSC1

RB7

R1
220

7
6
1
2
3
4

s/c

BZ1

SW1
SW2
SW3
SW4

+11

C11

C6 C5 C7 C8

10

11

12

13

U2
s/c

2003

+5
15
5

VCC

14

OSC2
GND /MCLR

R15 10K

Gnd

DB9H

17
18

D1

100K
R2

2
3

.1

U1 C/ZOCALO

220

Diodos: 1N4148
R3 1K 2N2222

RX

+11

C9

470/25
C2

912 Vcc

+5

10uf/TANT
+

JK1

+5

FU1
7805

R16

1
2
3
4
5
6
7
8
9

.1

220

+11

R17

R18

R19

C4 C3
RO

VE

AM

Linux
Powered

AZ

Archivo torturob1.fig

Titulo

Rev.
2

TORTUROB 1

INTERFASE PARA XLOGO


Fecha 02/07/07
Hoja
de

Autor M.D.
Obs.

La placa tiene interfaz serie, por ser el sistema mas economico y sencillo, pero como
xLogo utiliza la conexion ethernet, es necesario hacer alg
un tipo de conversion. Lo mas
simple es una conversion por software. En Linux puede utilizarse un script Tcl/Tk liberado
bajo licencia GPL:
http://downloads.tuxfamily.org/xlogo/robotica/tcptty-es.zip
que se ejecuta por detras (background ) de xLogo.
Por desgracia, la version en Visual Basic para Windows no es GPL y no puede proporcionarse un enlace al mismo (por razones obvias).
La otra solucion es utilizar un modulo de hardware externo al PC, es decir, un convertidor
ethernet/rs232 de los hay muchos en el mercado. Esta solucion, por supuesto, es mas
cara, pero tiene una aplicacion interesante:
En un aula con muchos ordenadores en red, se coloca un solo modulo convertidor
con el robot, y cualquier alumno lo comanda desde su puesto.
Finalmente, decir que tiene seis salidas (la septima dedicada a un buzzer ) y soporta cuatro
sensores digitales, que pueden ser: contactos, pulsadores, fotorresistores u optoacopladores.


19.3. ROBOTICA

19.3.3.

197

El lenguaje de la TortuRob

Evidentemente, para poner ejemplos sobre robotica debemos elegir un lenguaje. De


acuerdo a nuestra eleccion sobre la placa, explicaremos el lenguaje de la TortuRob. Obviamente, entendiendo esta terminologa, podremos utilizar los ejemplos en las tarjetas de
que disponga el lector en su Centro.
El protocolo de comunicaci
on con la TortuRob parte de las tres premisas siguientes:
1. La placa TortuRob nunca inicia una comunicacion, solo responde.
2. Todo comando enviado recibe una respuesta.
3. Todos los comandos y respuestas tienen la estructura: $Lx...x %[CR], donde:
$ Identificador de inicio de comando.
% Identificador de fin de comando.
L y x...x L es una letra que identifica la accion (may
uscula si es comando, min
uscula si es respuesta), mientras que x...x son los datos asociados a las ordenes/respuestas anteriores y su longitud es variable.
Con esta breve informacion, veamos unos ejemplos antes de entrar en detalle:
El sem
aforo
La TortuRob posee colores, concretamente, las salidas 3, 4 y 5 se corresponden con
los LED rojo, verde y amarillo, respectivamente. No invita eso a construir un semaforo?
En este programa solo damos ordenes a la placa, concretamente a los LED y al zumbador.
Los codigos asociados a los LED comienzan con A seguido del n
umero del LED y un 0 o
1 seg
un queramos apagarlo o encenderlo, mientras que activamos el buzzer con B seguido
del n
umero de zumbidos que queremos que haga:
para semaforo
haz "estado
haz "estado
haz "estado
haz "estado
espera 100
#
haz "estado
haz "estado
haz "estado
haz "estado

enviatcp
enviatcp
enviatcp
enviatcp

"localhost
"localhost
"localhost
"localhost

[$A40%]
[$A50%]
[$A31%]
[$B1%]

#
#
#
#

apaga verde
apaga amarillo
enciende rojo
un beep (semaforo para ciegos)

enviatcp
enviatcp
enviatcp
enviatcp

"localhost
"localhost
"localhost
"localhost

[$A30%]
[$A50%]
[$A41%]
[$B2%]

#
#
#
#

apaga rojo
apaga amarillo
enciende verde
dos beep (semaforo para ciegos)

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION

198
espera 100
#
haz "estado
haz "estado
haz "estado
haz "estado
espera 30

enviatcp
enviatcp
enviatcp
enviatcp

"localhost
"localhost
"localhost
"localhost

[$A30%]
[$A40%]
[$A51%]
[$B3%]

#
#
#
#

apaga rojo
apaga verde
enciende amarillo
tres beep (semaforo para ciegos)

#
semaforo
fin

# recursivo, volvemos a empezar

Simple, no?
Alarma
Creemos un boton de alarma. Al pulsarlo, aparecera escrito en pantalla un aviso:

ALARMA!
En este programa vamos a activar la zona de los pulsadores y leer la respuesta que da la
controladora. El codigo asociado a los pulsadores lleva asociada la letra D. El programa
resulta ser:
para alarma
borrapantalla
poncolorlapiz 1
ponfuente 30
repite 1000
[ haz "puls enviatcp "localhost [$D0%]
si :puls= [$d1000%]
[ rotula "ALARMA!
ocultatortuga
alto ]
espera 10 ]
fin

# color lapiz -> rojo

# lee pulsadores
# respuesta

La tortuga rotulara en pantalla ALARMA! al apretar uno de los pulsadores de la controladora


(concretamente, el SW1).
Moviendo a la tortuga
En la misma lnea del anterior, vamos a utilizar un programa recursivo con el que controlemos los movimientos de la tortuga mediante los cuatro pulsadores de la TortuRob,
de modo similar al programa de ejemplo de la seccion 3.1 en la pagina 20:


19.3. ROBOTICA

199

El boton 1 hara que la tortuga avance 10 pasos.


El boton 2 hara que la tortuga se de la vuelta.
El boton 3 hara que la tortuga gire 90 grados a la izquierda.
El boton 4 hara que la tortuga gire 90 grados a la derecha.
para tortu
haz "puls enviatcp "localhost [$D0%] # lee pulsadores
si :puls = [$d1000%]
# Pulsaron el boton 1
[ avanza 10 espera 5 ]
# esperamos 5/60 seg para evitar rebotes
si :puls = [$d0100%]
# Pulsaron el boton 2
[ giraderecha 180 espera 5 ]
si :puls = [$d0010%]
# Pulsaron el boton 3
[ giraizquierda 90 espera 5 ]
si :puls = [$d0001%]
# Pulsaron el boton 4
[ giraderecha 90 espera 5 ]
tortu
fin
Vemos que las respuestas de la controladora son muy simples: tras inicializarla con $D0 %,
las respuestas vienen en la posicion correspondiente al pulsador, y es un 1 o un 0 seg
un
este abierto o cerrado.

19.3.4.

Los comandos de la TortuRob

Hemos visto tres ejemplos sencillos de la controladora. Veamos ahora todo lo que puede
hacer. Recordemos:
1. La placa TortuRob nunca inicia una comunicacion, solo responde.
2. Todo comando enviado recibe una respuesta.
3. Todos los comandos y respuestas tienen la estructura: $Lx...x %[CR], donde:
$ Identificador de inicio de comando.
% Identificador de fin de comando.
L y x...x L es una letra que identifica la accion (may
uscula si es comando, min
uscula si es respuesta), mientras que x...x son los datos asociados a las ordenes/respuestas anteriores y su longitud es variable.
Los valores que pueden tomar son:
$Gsssssss % Apaga o activa las salidas correspondientes:
s1: Apaga/activa la salida 1 (CO1, pin 3).

200

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION
s2: Apaga/activa la salida 2 (CO2, pin 4).
s3: Apaga/activa la salida 3, LED rojo (CO1, pin 5).
s4: Apaga/activa la salida 4, LED verde (CO1, pin 6).
s5: Apaga/activa la salida 5, LED amarillo (CO1, pin 7).
s6: Apaga/activa la salida 6, LED azul (CO1, pin 8).
s7: Apaga/activa la salida 7, buzzer.
s puede tomar los valores
0: apagar.
1: encender permanentemente.
a-z: encender durante un tiempo que depende de la letra introducida
(desde medio segundo a 8 segundos).
La respuesta a las ordenes anteriores viene en la forma:
$0 %: El comando se ejecuto correctamente.
$1 %: Error, no se pudo ejecutar el comando.
Ejemplo: $G00100dy %:
Apaga las salidas 1, 2, 4 y 5.
Activa la salida 3 de forma permanente.
Activa la salida 6 durante d fracciones de segundo.
Activa la salida 7 durante y fracciones de segundo.
$Asx % Apaga o activa la salida s durante x fracciones de segundo. El valor
de s puede ser:
1: Salida 1 (CO1, pin 3).
2: Salida 2 (CO2, pin 4).
3: Salida 3, LED rojo (CO1, pin 5).
4: Salida 4, LED verde (CO1, pin 6).
5: Salida 5, LED amarillo (CO1, pin 7).
6: Salida 6, LED azul (CO1, pin 8).
7: Salida 7, buzzer.
mientras que x puede tomar los valores:
0: Apaga la salida.
1: Enciende la salida permanentemente.
a-z: Enciende la salida un tiempo que oscila entre medio segundo y 8
segundos.
La respuesta a las ordenes anteriores viene, como antes, en la forma:
$0 %: El comando se ejecuto correctamente
$1 %: Error, no se pudo ejecutar el comando.
Ejemplo: $A4y %: Activa el LED verde durante y fracciones de segundo.


19.3. ROBOTICA

201

$Bn % Activa el buzzer o zumbador, n veces.


La respuesta es, de nuevo:
$0 %: El comando se ejecuto correctamente
$1 %: Error, no se pudo ejecutar el comando.
Ejemplo: $B3 %: El buzzer emite 3 beeps.
$Dn % Lee el estado de entradas y salidas. n puede ser:
0: Grupo de 4 pulsadores o conector CO2.
1: Contenido del contador binario asociado a CO2, pin1 (SW1).
2: Estado de salidas activadas.
La respuesta viene precedida de una E:
$E %: para cualquier valor de n si hubo error.
$dwxyz %: si n fue 0. wxyz hacen referencia a los pulsadores SW1, SW2,
SW3 y SW4 (o a masa CO2, pin1, pin2, pin3 y pin4) respectivamente,
y seran 0 si el pulsador esta cerrado y 1 si esta abierto.
$cxyz %: si n fue 1, xyz es un valor entre 000 y 255, representando el
valor del contador binario asociado a CO2, pin1 (SW1).
$asssssss %: si n fue 2, hace referencia a las 7 salidas ya explicadas, y
sea 0 si la salida correspondiente esta apagada y 1 si esta activa.
Ejemplos:
$d0010 %: Pulsadores SW1, SW2 y SW4 abiertos, SW3 cerrado.
$c035 %: El contador registro 35 cierres de SW1 desde la u
ltima lectura.
$a0010000 %: Solo la salida 3 esta activa (timer 3 contando).
[CR] Cierre. Lo asigna el sistema de comunicaciones (es decir, el Enter )

Sigue la luz
Analicemos ahora un proyecto con mayor complejidad. Vamos a hacer que nuestra tortuga
responda a estmulos luminosos (en una habitacion oscura y con una linterna, por ejemplo),
sustituyendo los pulsadores por fotodiodos.
El fotodiodo es un diodo que, conectado en inversa, genera una intensidad proporcional
al nivel de luz recibida; aunque podramos intentar disparar directamente los sensores
mediante la intensidad del diodo, el esquema sera muy susceptible a la luz ambiente, por
lo que es mejor conectarlo a masa mediante una resistencia pulldown, de forma que la
tension en la misma sera directamente proporcional a la intensidad/luz recibida:

202

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION

Por supuesto el concepto basico puede refinarse tanto como queramos, ya sea mejorando el
circuito de disparo (ver figura) o sustituyendo el tipo de sensor de activacion, por ejemplo
haciendo que la tortuga reaccione a sonidos en lugar de luces:

La respuesta de la tortuga a los sensores debera ser:


Si le da la luz por un lateral, haremos que gire 90 .
Si se ilumina por delante o por detras, ira en esa direccion.
El programa se detendra cuando se pulse la tecla Escape.
Necesitamos montar la placa en un robot que tenga una base con dos motores y cuatro
sensores, uno a cada lado, otro en el frontal y el cuarto en la parte posterior.
Los motores se montaran a ambos lados de la base, de modo que:


19.3. ROBOTICA

203

Activando los dos, se movera hacia delante.


Activando solo el derecho, girara a la izquierda y viceversa.
Para lograr la marcha atras, conectamos un inversor de giro en C01. Invertiremos la
fase de los motores con los dos contactos del rele (ver figura).

Como tenemos que controlar dos motores, y el inversor de giro afecta a ambos a la vez,
los pondremos en paralelo. Ademas, conectaremos en serie con cada motor el contacto del
rele que regula su puesta en marcha, permitiendo que trabajen independientemente.
Por u
ltimo, y dado que no es conveniente intentar activar los reles directamente, deberemos
agregar un transistor en modo interruptor a cada puerto de disparo, si es que el entrenador
no esta instalado.

Ha llegado el momento de realizar el programa. Elegimos que el LED rojo mueva el motor
izquierdo y LED verde el derecho; encender ambos a la vez hace que el robot avance, y
activando CO1 llamamos al inversor de giro. Por tanto:
el fotodiodo asociado al pulsador 1 ira detras (marcha atras),
el fotodiodo 2 en el costado derecho (enciende rojo motor izquierdo en solitario),

DE LA RED CON XLOGO


CAPITULO 19. UTILIZACION

204

el fotodiodo 3 en el lado izquierdo (enciende verde motor derecho en solitario)


el cuarto fotodiodo en el frontal (ambos encendidos hacia delante).
Traducido a lenguaje TortuRob:
[$d1000 %] [$Ga0aa000 %]: Pulsador 1, activa CO1, rojo y verde
[$d0100 %] [$G00a0000 %]: Pulsador 2, activa rojo
[$d0010 %] [$G000a000 %]: Pulsador 3: activa verde
[$d0001 %] [$G00aa000 %]: Pulsador 4: activa rojo y verde
El programa resulta::
para sigueluz
haz "puls enviatcp "localhost [$D0%]
si :puls = [$d1000%]
[ es enviatcp "localhost [$Ga0aa000%]
si :puls = [$d0100%]
[ es enviatcp "localhost [$G00a0000%]
si :puls = [$d0010%]
[ es enviatcp "localhost [$G000a000%]
si :puls = [$d0001%]
[ es enviatcp "localhost [$G00aa000%]
si tecla? [ si leetecla = 27 [alto] ]
espera 10
sigueluz
fin

# Activar inversion

# Activar izquierdo

# Activar derecho

# Activar ambos

Captulo 20
Acerca de xLogo
20.1.

El sitio

Para conseguir la u
ltima version y correccion de errores, visita el sitio de xLogo de
vez en cuando:
http://xlogo.tuxfamily.org
Sientete libre de contactar al autor si tienes alg
un problema con la instalacion o el uso.
Toda sugerencia sera bienvenida.

20.2.

Acerca de este documento

xLogo: Manual del Usuario


Original en frances revisado por Loc (8 de julio de 2009).

Traducido al espa
nol por Marcelo Duschkin y Alvaro
Valdes (9 de diciembre de 2010)
Guy Walker: Traduccion al ingles.
Alexandre Soares: Traduccion al Portugues.
Miriam Abresch, Michael Malien. Traduccion al Aleman
Michel Gaillard. Traduccion al Esperanto
Marco Bascietto. Traduccion al Italiano
205

CAPITULO 20. ACERCA DE XLOGO

206

Agradecimientos
Quiero empezar por agradecer a Loc su fantastico trabajo con xLogo.
Tambien quiero enviar un sentido recuerdo a Marcelo Duschkin, fallecido en abril de
este a
no 2010, que me animo y me dio todo su apoyo siempre que lo necesite.
A todos los traductores/as del proyecto xLogo:
Ingles: Guy Walker

Gallego: Justo freire

Portugues: Alexandre Soares

Asturiano: Montserrat G.a Fueyo

Aleman: Michael Malien, Miriam


Abresch.

Griego: Anastasios Drakopoulos

Esperanto: Michel Gaillard, Carlos


Enrique Carleos Artime

Arabe:
El Houcine Jarad

Italiano: Marco Bascietto


Catalan: David Arso
H
ungaro: Jozsef Varga

Jose Higinio Cernuda Menendez, por su ayuda con el tema de Robotica.


Olivier SC: por sus sugerencias, y por las invalorables pruebas que permitieron depurar el interprete xLogo.
Daniel Ajoy, por sus sugerencias en cuanto a la compatibilidad de las primitivas en
espa
nol y su valiosa colaboracion en pruebas de esa version.
Eitan Gurari, por la extension LATEX tex4ht, que permite convertir el manual desde
TEX hacia varios formatos:
www.cse.ohio-state.edu/ gurari/TeX4ht
A varios proyectos de software libre muy importantes para poder mantener xLogo:
Java y Java3D:
https://java3d.dev.java.net
Java Help:
http://java.sun.com/javase/technologies/desktop/javahelp
Eclipse: http://www.eclipse.org
JLayer: http://www.javazoom.net/javalayer/javalayer.html
Finalmente, un grandsimo GRACIAS! a TuxFamily, por la calidad de su alojamiento web y su importante contribucion al software libre:
http://www.tuxfamily.org

Captulo 21
Carnaval de Preguntas Artima
nas
Trucos que conocer

21.1.

Preguntas frecuentes

Por m
as que borro un procedimiento en el Editor, reaparece todo
el tiempo!
Cuando se sale del Editor, este se limita u
nicamente a guardar o poner al da los
procedimientos definidos en el. La u
nica forma de borrar un procedimiento en xLogo es
utilizar la primitiva borra o bo.
Ejemplo: borra "toto borra el procedimiento toto

C
omo hago para escribir r
apidamente una orden utilizada previamente?
Primer metodo: con el raton, haz click en la zona del Hist
orico sobre la lnea deseada.
As reaparecera inmediatamente en la Lnea de Comando
Segundo metodo: con el teclado, las flechas Arriba y Abajo permiten navegar por la
lista de los comandos anteriores (mas practico)

En la opci
on Sonido del cuadro de di
alogo Preferencias, no hay
disponible ning
un instrumento
Mira la solucion en la seccion del captulo sobre m
usica, 1.2.1
207


208CAPITULO 21. CARNAVAL DE PREGUNTAS ARTIMANAS
TRUCOS QUE CONOCER

Utilizo la versi
on en Esperanto, pero no puedo escribir los caracteres especiales
Cuando escribes en la Lnea de comandos o en el Editor, si haces click con el boton
derecho del raton, aparece un men
u contextual. En ese men
u se encuentran las funciones habituales de Edicion (copiar, cortar, pegar) y los caracteres especiales del Esperanto
cuando se selecciona ese idioma.

Utilizo la versi
on en Espa
nol, y no puedo utilizar las primitivas
animacion, division, separacion y ponseparacion
Corregido desde la version 0.9.20e. Para versiones anteriores de xLogo:
animacion, se escribe animacicn, con c en lugar de o
division, separacion y ponseparacion se escriben con tilde: divisi
on, separaci
on
y ponseparaci
on.
Obviamente, el mejor consejo es que actualices a la version mas moderna de xLogo.

Uso Windows XP y tengo correctamente instalado y configurado


el JRE; pero hago doble clic en el icono de xLogo y no pasa nada!
Debes estar usando una version muy antigua de xLogo. Dos opciones:
Utiliza una version mas actual de xlogo.jar.
Si presionas Alt+Contrl+Supr y en el Gestor de Procesos matas el correspondiente a javaw, se inicia xLogo. Desde ese momento, funciona correctamente haciendo doble click sobre el icono del archivo xlogo.jar.

21.2.

C
omo puedo ayudar?

Informandome de todos los errores (bugs) que encuentres. Si puedes reproducir


sistematicamente un problema detectado, mejor a
un
Toda sugerencia dirigida a mejorar el programa es siempre bienvenida
Ayudando con las traducciones, en particular el ingles . . .
Las palabras de animo siempre vienen bien

Captulo 22
Configuraci
on avanzada de xLogo
En la seccion 1.2 ya vimos las formas rapidas de configurar xLogo en Windows, Linux
y Mac. A veces en Windows se necesita una mayor intervencion para configurarlo.

22.1.

Asociar los archivos .jar con Java

Si tu ordenador abre el WinZip (o similar), entonces debes modificar la asociacion de


este programa con los archivos .jar

22.1.1.

Configuraci
on del compresor

Configurar WinZIP o WinRAR es facil, solo tienes que buscar la opcion Asociaciones
de Archivo oIntegracion y deshabilitar la casilla asociada a la extension .jar:

Despues de esto, si Java esta correctamente instalado, debera ejecutarse con cualquiera
de las opciones explicadas en 1.2.1
209

AVANZADA DE XLOGO
CAPITULO 22. CONFIGURACION

210

22.1.2.

Configuraci
on de Windows

Si a
un no consigues que xLogo funcione, debes seguir los siguientes pasos (que pueden
variar seg
un que version de Windows tengas):
Si usas Windows XP, en primer lugar, debes tener visible una opcion explorador que solo
se muestra en la Vista Clasica:
Inicio Panel de Control Cambiar a Vista Clasica
Desde este momento, en cualquier ventana del Explorador de Windows puedes hacer
clic en el men
u Opciones de carpeta Tipos de Archivo:

1. Busca en la lista de archivos registrados la asociacion a los .jar


2. Clic en Tipo de archivo, luego opciones Avanzadas . . .
3. En la ventana que se abre, clic en Abrir, luego Editar

4. Clic en Examinar . . . y navegar hasta encontrar javaw.exe que podra estar en


c:\Archivos de Programa\java\jre6\bin\javaw.exe

22.2. ASOCIAR ARCHIVOS .LGO CON XLOGO

211

5. Haciendo doble clic en el archivo, esa ruta aparecera en el campo Aplicacion usada
...
6. Finalmente, cierra todos los cuadros de dialogo. Ahora debe ser posible ejecutar
xLogo haciendo doble clic en su icono
Si estos pasos no funcionan, existe otra posibilidad. Abre una ventana MS-DOS (en
Windows XP: Inicio Todos los Programas Accesorios Smbolo del Sistema), y
teclea la orden siguiente:
c:\Archivos de Programa\java\jre6\bin\javaw -jar \ubicacion_de_xLogo\xlogo.jar
Por ejemplo, si eliges descargar xLogo en el Escritorio, en Windows XP sera:
c:\Documents and settings\usuario\Escritorio\xlogo.jar
Para no repetir este proceso cada vez que quieras ejecutar xLogo, escrbelo en un
archivo de texto y guardalo como xlogo.bat. Ahora, simplemente haciendo doble clic en
este archivo, arrancara xLogo.

22.2.

Asociar archivos .lgo con xLogo

22.2.1.

En Windows

Los archivos .lgo no son reconocidos inicialmente por el ordenador, y si haces doble
clic sobre ellos, aparecera un cuadro de dialogo preguntando con que aplicacion abrirlos.
Tienes que elegir Otros . . . y poner la ruta a javaw.exe que, como dijimos ya varias
veces, podra estar en
c:\Archivos de Programa\java\jre6\bin\javaw.exe
Deberas indicar un nombre para designar los archivos .lgo, por ejemplo: Archivos
Logo.
Para que esto quede registrado en Windows, debes seguir los siguientes pasos (que
pueden variar seg
un que version de Windows tengas):
1. Inicio Panel de Control Cambiar a Vista Clasica Opciones de carpeta
2. Clic en Tipos de archivos
3. Buscar en la lista de archivos registrados la asociacion a los .jar
4. Clic en Tipo de archivo, luego Nuevo
5. Escribe la extension.jar en el cuadro Extension de Archivo, luego OK
6. Clic en el recien agregado LOG y luego clic en Avanzado . . .

AVANZADA DE XLOGO
CAPITULO 22. CONFIGURACION

212

7. Aparece una ventana, clic en Nuevo . . .


8. En Accion, poner Abrir, y hacer clic en Examinar . . . navegar hasta encontrar
javaw.exe que podra estar en
c:\Archivos de Programa\java\jre6\bin\javaw.exe
9. Clic en Abrir y agregar la ruta en el cuadro de Accion de Editar tipo de archivo.
10. Clic en Abrir, luego en Editar
11. Esa ruta debe aparecer en el campo Aplicacion usada . . . Lo que tienes que hacer es
completar la lnea para que se vea:
"c:\Archivos de Programa\java\jre6\bin\javaw.exe -jar xlogo.jar" "%1" %*
(El espacio a ambos lados de -jar es importante)
12. Finalmente, cierras todos los cuadros de dialogo. Ahora debera ser posible abrir los
archivos .lgo con xLogo

22.2.2.

En Linux

Como veras, y contrariamente a lo que se dice, la configuracion es mucho mas facil e


intuitiva (y las cosas funcionan mejor)
En KDE
Crear un icono de acceso directo a xLogo
1. Clic con el boton derecho en el Escritorio: Crear Nuevo Enlace a Aplicacion
2. En la pesta
na General, elige el nombre. xLogo es una buena opcion
3. En la pesta
na Aplicacion, navega hasta Comando, y escribe:
java -jar /home/tu_nombre/xlogo.jar
Tambien puedes rellenar los campos Descripcion, Comentario y Ruta de trabajo. Por
ejemplo:
a) Descripcion: xLogo
b) Comentario: Interprete Java de Logo
c) Ruta de trabajo: /home/tu_nombre/
4. Finalmente cierra el cuadro de dialogo. Ahora debe ser posible ejecutar xLogo haciendo doble clic en su icono, que puedes elegir y modificar si no te gusta el predeterminado.

22.2. ASOCIAR ARCHIVOS .LGO CON XLOGO

213

Asociar los archivos .lgo con xLogo


1. En el Gestor de Archivos (Konqueror), haz clic con el boton derecho sobre un
archivo .lgo
2. Selecciona Editar tipo de Archivo
3. En Aplicacion, Orden de preferencia, escribe:
java -jar /home/tu_nombre/xlogo.jar
Tambien puedes poner un icono para asociar el tipo de archivos.
En GNOME
Crear un icono de acceso directo a xLogo
1. Clic con el boton derecho en el Escritorio: Crear lanzador
2. En el cuadro de dialogo, completa los apartados:
Nombre: xLogo es una buena opcion
Comentario: si quieres una peque
na explicacion, que aparecera en forma de
globo al pasar el raton por encima del icono.
Por ejemplo: Interprete Java de Logo
Comando:
java -jar /home/tu_nombre/xlogo.jar
Icono: Elige entre los del sistema o uno personalizado
3. Finalmente cierra el cuadro de dialogo. Ahora debe ser posible ejecutar xLogo haciendo doble clic en su icono.
Asociar los archivos .lgo con xLogo
1. En el Gestor de Archivos (Nautilus), haz clic con el boton derecho sobre un archivo
.lgo
2. Selecciona Abrir con otra Aplicacion
3. Selecciona Utiliza un Comando Personalizado y escribe:
java -jar /home/tu_nombre/xlogo.jar

Bibliografa
[1] Manual de referencia de xLogo. Autor: Loc Le Coq. Traduccion: Marcelo

Duschkin y Alvaro
Vald
es.
http://downloads.tuxfamily.org/xlogo/downloads-sp/manual-sp.pdf
[2] Diez lecciones para descubrir el lenguaje xLogo. Autor: Loc Le Coq. Traduc
cion: Alvaro
Vald
es.
http://downloads.tuxfamily.org/xlogo/downloads-sp/tutorial.pdf
[3] Wikipedia
http://es.wikipedia.org
[4] Paraso de Logo. Autor: Daniel Ajoy.
http://neoparaiso.com/logo/
[5] Cuaderno de ejercicios de Logo. Autor: Pedro Jos
e Fern
andez.
http://neoparaiso.com/logo/documentos/ejercicios-logo.pdf
[6] Informatica y Matematica. Asignatura optativa (y libre configuracion). Autores:
Eugenio Roanes Macas y Eugenio Roanes Lozano
http://www.ucm.es/info/secdealg/ApuntesLogo/INF_MATN_2006.PDF
[7] Introduccion a la Programacion con Python. Autor: Bartolom
e Sintes Marco
http://www.mclibre.org/consultar/python/

214

Ap
endice A
Iniciando xLogo desde la lnea de
comandos
La sintaxis del comando que ejecuta xLogo es:
java-jar xlogo.jar [-a] [-lang en] [archivo1.lgo archivo2.lgo ...]
Las opciones disponibles son:
El atributo -lang: este atributo especifica el idioma con que ejecutar xLogo.
El parametro indicado con esta opcion se superpone al existente en el fichero .xlogo
de configuracion personal. En la siguiente tabla se muestran los parametros asociados
a todos los idiomas disponibles:
Frances
fr

Ingles
en

Espa
nol
es

Aleman
de

Portugues
pt

Arabe
ar

Esperanto
eo

Gallego
gl

Asturiano
as

Griego
el

Italiano
it

Catalan
ca

H
ungaro
hu

Atributo -a: este atributo determina que se ejecute el Comando de Inicio (ver
seccion 1.7) que figura en el archivo cargado sin necesidad de pulsar el boton de
inicio (seccion 1.6) al iniciarse xLogo.
Atributo -memory: este atributo cambia el tama
no de memoria reservado para xLogo
[archivo1.lgo archivo2.lgo ...]: estos archivos de extension .lgo se cargan al
iniciar xLogo.
Los archivos pueden ser locales (estar en el disco duro del ordenador) o remotos (en
la web). Por lo tanto, se puede especificar una direccion local o una direccion web.
215

216

APENDICE
A. INICIANDO XLOGO DESDE LA LINEA DE COMANDOS
Veamos ejemplos:
java -jar xlogo.jar -lang es prog.lgo
los archivos xlogo.jar y prog.lgo estan en el directorio actual. Este comando
ejecuta xLogo cambiando el idioma a espa
nol y a continuacion carga el fichero
prog.lgo. Por tanto, es necesario que este archivo sea un programa Logo escrito en
Espa
nol.
java -jar xlogo.jar -a -lang en http://xlogo.tuxfamily.org/prog.lgo:
Este comando ejecuta xLogo en Ingles, estando xlogo.jar en el directorio de trabajo, y se carga el fichero http://xlogo.tuxfamily.org/prog.lgo desde la web.
Por u
ltimo, el Comando de Inicio de este fichero se ejecuta en el arranque.

Ap
endice B
Ejecutando xLogo desde la web
B.1.

El problema

Supongamos que usted es administrador/a de un sitio web. En este sitio, habla de


xLogo y quiere ofrecer algunos de los programas que ha creado.
Podra distribuir el fichero Logo en formato .lgo y esperar que los visitantes descarguen primero xLogo, despues el programa y, por u
ltimo, lo carguen para ver que hace.
La alternativa es que el usuario pueda ejecutar xLogo en lnea, y probar su programa sin
apenas esfuerzo.
Para lanzar xLogo desde una pagina web, utilizaremos la tecnologa Java Web Start.
Con ello, solo necesita poner en su web un enlace hacia un archivo con extension .jnlp,
que iniciara la ejecucion de xLogo.

B.2.

C
omo crear un fichero .jnlp

Veamos como hacerlo con un archivo de ejemplo. De hecho, el siguiente ejemplo es el


que se usa en la seccion Ejemplos de la pagina de xLogo en frances.
Este archivo carga el programa que dibuja un dado en la seccion 3D. Veamos primero el
archivo, y veremos despues las explicaciones sobre su contenido.
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://downloads.tuxfamily.org/xlogo/common/webstart">
<information>
<title>xLogo</title>
<vendor>xlogo.tuxfamily.org</vendor>
<homepage href="http://xlogo.tuxfamily.org"/>
<description>Logo Programming Language</description>
217


APENDICE
B. EJECUTANDO XLOGO DESDE LA WEB

218
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>

<resources>
<j2se version="1.4+"/>
<jar href="xlogo.jar"/>
</resources>
<application-desc main-class="Lanceur">
<argument>-lang</argument>
<argument>fr</argument>
<argument>-a</argument>
<argument>http://xlogo.tuxfamily.org/fr/html/examples-fr/3d/de.lgo</argument>
</application-desc>
</jnlp>
Este archivo esta escrito en formato XML, y las cuatro lneas mas importantes son:
<argument>-lang</argument>
<argument>fr</argument>
<argument>-a</argument>
<argument>http://xlogo.tuxfamily.org/fr/html/examples-fr/3d/de.lgo</argument>
Esas lneas especifican los parametros de inicio de xLogo:
Las lneas 1 y 2 fuerzan a xLogo a ejecutarse en frances.
La u
ltima lnea indica la ruta del fichero a cargar.
La lnea 3 indica que se ejecute el Comando de Inicio de este programa al iniciarse
xLogo.
Una u
ltima sugerencia (peticion): Dado que el servidor de Tuxfamily no puede aceptar
infinitas conexiones, le pedimos que tenga una copia del archivo xlogo.jar en su web.
Para ello, cambie la direccion en la segunda lnea del archivo .jnlp, donde dice codebase=
por:
<jnlp spec="1.5+" codebase="http://mi.direccion.web/directorio/xLogo">

Ap
endice C
Programaci
on Estructurada y Dise
no
Modular
A finales de los a
nos sesenta surgio una nueva forma de programar que no solamente
daba lugar a programas fiables y eficientes, sino que ademas estaban escritos de manera
que facilitaba su comprension posterior.

C.1.

Programaci
on Estructurada

El Teorema de Dijkstra, demostrado por Edsger Dijkstra en los a


nos sesenta, demuestra que todo programa puede escribirse utilizando u
nicamente las tres instrucciones
de control siguientes:
Secuencia
Instruccion condicional.
Iteracion (bucle de instrucciones) con condicion inicial
Solamente con estas tres estructuras se pueden escribir programas, si bien ya hemos visto
que existen otras estructuras de control: los procedimientos.

C.2.

Dise
no Modular

El uso de procedimientos y subprocedimientos permite dividir un problema grande en


subproblemas mas peque
nos. Si el objetivo es elaborar un programa para resolver dicho
problema grande, cada subproblema (menos complejo) podra ser resuelto por un modulo
(subprocedimiento) relativamente facil de implementar
Por que descomponer un problema en partes? Experimentalmente esta comprobado
que:
Un problema complejo cuesta mas de resolver que otro mas sencillo
219

220

ESTRUCTURADA Y DISENO
MODULAR
APENDICE
C. PROGRAMACION
La complejidad de un problema global es mayor que la suma de las complejidades de
cada una de sus partes por separado.

La combinacion de las instrucciones de control con los procedimientos permite dise


nar
programas de forma rapida, sencilla y eficiente.

Ap
endice D
La esponja de Menger
En este captulo vamos a construir un solido fractal llamado la esponja de Menger,
cuyas primeras iteraciones son:

Estado inicial (paso 0)

Paso 1

Paso 2

Paso 3

Este tema se divide en dos partes:


Iniciciacion, donde mostramos como crear el solido usando la recursividad.
Desarrollo y optimizacion, donde dibujaremos una esponja de Menger de orden 4.
221

222

D.1.

APENDICE
D. LA ESPONJA DE MENGER

Utilizando recursividad

Consideremos una esponja de Menger de orden n cuyo lado mide L.

El dibujo muestra que, realmente, esta esponja esta formada por 20 esponjas de Menger de
L
orden n 1, cada una de lado . Hemos encontrado la estructura recursiva de la esponja.
3
El programa
para cubo :l
si :contador=10000 [vistapoligono]
# color de las caras laterales
hazlocal "colores [amarillo magenta cyan azul]
# caras laterales
repite 4
[ poncolorlapiz ejecuta elemento contador :colores
cuadrado :l giraderecha 90 avanza :l
giraizquierda 90 balanceaderecha 90]
poncolorlapiz rojo
cabeceaabajo 90 cuadrado :l cabeceaarriba 90
avanza :l cabeceaabajo 90
poncolorlapiz verde
cuadrado :l cabeceaarriba 90 retrocede :l
fin
para cuadrado :c
haz "contador :contador+1
empiezapoligono
repite 4 [avanza :c giraderecha 90]
finpoligono
fin

D.1. UTILIZANDO RECURSIVIDAD

223

# Esponja de Menger
# p: nivel de recursividad
# l: arista del cubo final (grande)
para menger :l :p
si :p=0 [cubo :l]
[ hazlocal "p :p-1
hazlocal "l :l/3
repite 3 [ menger :l :p avanza :l ]
retrocede 3*:l
giraderecha 90 avanza :l giraizquierda 90
menger :l :p avanza 2*:l menger :l :p retrocede 2*:l
giraderecha 90 avanza :l giraizquierda 90
repite 3 [menger :l :p avanza :l] retrocede 3*:l
# lado derecho
cabeceaabajo 90 avanza :l cabeceaarriba 90
menger :l :p avanza 2*:l menger :l :p retrocede 2*:l
cabeceaabajo 90 avanza :l cabeceaarriba 90
repite 3 [menger :l :p avanza :l]
retrocede 3*:l giraizquierda 90 avanza :l giraderecha 90
menger :l :p avanza 2*:l menger :l :p retrocede 2*:l
giraizquierda 90 avanza :l giraderecha 90
repite 3 [menger :l :p avanza :l]
retrocede 3*:l cabeceaabajo 90 retrocede :l cabeceaarriba 90
menger :l :p avanza 2*:l menger :l :p retrocede 2*:l
cabeceaabajo 90 retrocede :l cabeceaarriba 90
]
fin
para esponja :p
borrapantalla ocultatortuga
haz "contador 0
perspectiva poncolorpapel 0
menger 800 :p
mecanografia [Numero de poligonos: ] escribe :contador
vistapoligono
fin
Este programa consta de cuatro procedimientos:
cuadrado :c
Este procedimiento dibuja un cuadrado de lado :c, almacenandolo para dibujarlo en
3-D. La variable contador guardara el n
umero de polgonos dibujados.


APENDICE
D. LA ESPONJA DE MENGER

224
cubo :l

Este procedimiento dibuja un cubo de arista :l, llamando al procedimiento cuadrado.


menger :l :p
Llegamos al mas importante del programa; dibuja el motivo de Menger de orden p y
lado l. Este motivo se crea de modo recursivo, como acabamos de explicar.
esponja :p
Crea una esponja de Menger de orden p y lado 800 y la dibuja en el visor 3D.
La mayor dificultad de este programa proviene de su consumo de memoria. La cantidad
de memoria asignada por defecto para xLogo (ver pag. 17) no permite dibujar una esponja
de orden 3 (esponja 3), ya que requiere dibujar 48 000 polgonos. Debemos aumentar la
memoria asignada a xLogo hasta un mnimo de 256 Mb . . . u optimizar el codigo.

D.2.

Segunda aproximaci
on. S
olido de orden 4

La principal caracterstica del programa anterior es su utilizacion de la estructura recursiva del solido fractal. podemos observar que es similar al metodo utilizado para dibujar
el copo de Koch en la pagina 100. La principal ventaja de utilizar recursividad es que
el codigo del program es el mas peque
no posible. A cambio, la principal desventaja es el
n
umero de polgonos que se deben crear que, como dijimos, alcanza los 48.000. Esto hace
inviable plantearse una esponja de orden superior, pues los requisitos de memoria creceran
muy rapido.
Si queremos dibujar una esponja de Menger de orden 4, debemos replanearnos el programa y olvidar la recursividad.

D.2.1.

La alfombra de Sierpinski

La esponja de Menger es la generalizacion en 3 dimensiones de una figura plana llamada


la alfombra de Sierpinski, cuyas primeras iteraciones son:

Paso 0

Paso 1

Paso 2

Paso 3

Observamos que cada cara de la esponja de Menger es una alfombra de Sierpinski.

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4

D.2.2.

225

Dibujando una alfombra de Sierpinski de orden p

El objetivo es reducir al mmino el n


umero de polgonos necesarios para dibujar una
alfombra de Sierpinski. El ejemplo explica como dibujar una alfombra de Sierpinski de
orden 3. Aqu, el cuadrado inicial consta de 33 = 27 filas y 27 columnas. Escribimos en
base 3 el n
umero de cada fila y cada columna.:
Primera etapa: Para cada fila cuyo n
umero no contiene ning
un 1, trazamos una lnea de
27 unidades. Por simetra, realizamos la misma operacion con las columnas.

Segunda etapa: Ahora buscamos las filas que solo tienen un 1 en la primera posicion.
Dibujaremos alternativamente rectangulos de longitud 9 unidades. Como antes, la
simetra nos obliga a repetir esta operacion con las columnas.

Tercera etapa: Buscamos las filas que solo tienen un 1 en la segunda posicion. Dibujaremos los rectangulos de acuerdo a la serie [3 3 6 3 6 3 3]. (dibujamos 3, 3 en blanco,
dibujamos 6, etc). Repetimos con las columnas.

226

APENDICE
D. LA ESPONJA DE MENGER

Ultima
etapa: Miramos ahora las lneas que contienen un doble 1 en las dos primeras
posiciones. La serie de rectangulos se dibuja de acuerdo al esquema [3 3 3 9 3 3 3], y
repetimos en las columnas.

La construccion de la alfombra de Sierpinski de orden 3 esta completa. Para dibujarlo, solo


necesitamos 16 + 16 + 32 + 16 = 80 polgonos.

D.2.3.

Otros esquemas posibles usando columnas

Para recapitular la construccion anterior, estos son los diferentes tipos de esquemas por
columnas, de acuerdo al n
umero de lneas (* representa 0 o 2):

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4
N
umero de lnea
***
1**
*1*
11*

227

Esquema a aplicar
27
999
3363633
3339333

Del mismo modo, para construir una alfombra de orden 4, necesitamos un cuadrado de
34 = 81 unidades. Los n
umeros de lnea y de columna tendran 4 cifras al descomponerlos a
base 3. Para cada tipo de n
umero de lnea, el esquema a aplicar sera (* representa 0 o 2):
N
umero de lnea
Esquema a aplicar
****
81
1***
27 27 27
*1**
9 9 18 9 18 9 9
**1*
3363636363636363633
*11*
3339336339336339333
1*1*
3 3 6 3 6 3 3 27 3 3 6 3 6 3 3
11**
9 9 9 27 9 9 9
111*
3 3 3 9 3 3 3 27 3 3 3 9 3 3 3
De aqu se deduce que hacen falta 496 polgonos para dibujar una alfombra de Sierpinski
de orden 4.
Por si alguien tiene la duda, este es el esquema para el caso n = 2:
N
umero de lnea
**
1*

D.2.4.

Esquema a aplicar
9
333

El programa

# Dibuja una alfombra de Sierpinski de orden :p y arista :lado


para alfombra :lado :p
haz "unidad :lado/(potencia 3 :p)
si :p=0 [ rec :lado :lado alto]
si :p=1 [repite 4 [rec :lado :unidad avanza :lado giraderecha 90 ] alto]
repitepara (lista "x 1 potencia 3 :p)
[ hazlocal "cantorx cantor :x :p []
# no dibujan los elementos que tengan un 1 en ultima posicion
si no (1=ultimo :cantorx)
[ hazlocal "nom evalua menosultimo :cantorx "
dibujacolumna :x devuelvepropiedad "map :nom ]
]
fin

228

APENDICE
D. LA ESPONJA DE MENGER

# Devuelve la descomposicion en base 3 del numero x


# p indice de profundidad 3^p
# :lista lista vacia inicialmente
para cantor :x :p :lista
si :p=0 [devuelve :lista ]
hazlocal "a potencia 3 :p-1
si :x<= :a
[ devuelve cantor :x :p-1 frase :lista 0]
[ si :x<=2*:a
[devuelve cantor :x-:a :p-1 frase :lista 1]
devuelve cantor :x-2*:a :p-1 frase :lista 0]
fin
# trazado de la columna numero x de acuerdo al esquema de
#
construccion definido en la lista
para dibujacolumna :x :lista
subelapiz
giraderecha 90 avanza (:x-1)*:unidad giraizquierda 90
bajalapiz
des :lista
subelapiz giraizquierda 90 avanza (:x-1)*:unidad
giraderecha 90 avanza :x*:unidad giraderecha 90 bajalapiz des :lista
subelapiz
giraizquierda 90 retrocede :x*:unidad
bajalapiz
fin
# trazado de un rectangulo con las medidas dadas
# el pologono se guarda para verlo en 3d
para rec :lo :la
haz "contador :contador+1
empiezapoligono
repite 2
[avanza :lo giraderecha 90 avanza :la giraderecha 90]
finpoligono
fin
# Inicializa las diferentes columnas posibles para la alfombra de orden 1 a 4
para initmap
ponpropiedad "map 111 [3 3 3 9 3 3 3 27 3 3 3 9 3 3 3]
ponpropiedad "map 110 [9 9 9 27 9 9 9]
ponpropiedad "map 101 [3 3 6 3 6 3 3 27 3 3 6 3 6 3 3]

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
ponpropiedad
fin

"map
"map
"map
"map
"map
"map
"map
"map
"map
"map
"map

011 [3 3 3 9 3 3 6 3 3 9 3 3 6 3 3 9 3 3 3]
000 [81]
100 [27 27 27]
010 [9 9 18 9 18 9 9]
001 [3 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 3]
01 [3 3 6 3 6 3 3]
00 [27]
10 [9 9 9]
11 [3 3 3 9 3 3 3]
1 [3 3 3]
0 [9]

# si la decomposicion es [1 0 1] --> devuelve 101


para evalua :lista :motivo
si vacio? :lista [devuelve :motivo]
[ hazlocal "motivo palabra :motivo primero :lista
devuelve evalua menosprimero :lista :motivo ]
fin
# trazado de los grupos de rectangulos de cada columna alternativamente
para des :lista
hazlocal "suma 0
repitepara (lista "i 1 cuenta :lista)
[ hazlocal "elemento elemento :i :lista
hazlocal "suma :elemento+:suma
si par? :i
[ subelapiz avanza :elemento*:unidad bajalapiz ]
[ rec :elemento*:unidad :unidad
avanza :elemento*:unidad]
]
subelapiz retrocede :suma * :unidad bajalapiz
fin
# prueba si un numero es par
para par? :i
devuelve 0 = resto :i 2
fin
para sierpinski :p
borrapantalla perspectiva ocultatortuga initmap
haz "contador 0
alfombra 810 :p

229

230

APENDICE
D. LA ESPONJA DE MENGER

mecanografia "Numero\ de\ poligonos:\


vistapoligono
fin

escribe :contador

sierpinski 3 dibuja una alfombra de Sierpinski de orden 3 y lado 810. Primera etapa
conseguida, podemos volver a la esponja de Menger.

D.2.5.

La esponja de Menger de orden 4

La esponja de Menger possee m


ultiples propiedades de simetra. Para generar la esponja,
vamos a trazar las diferentes secciones a lo largo del plano (xOy) y las repetiremos sobre los
planos (yOz) y (xOz). Para explicar que pasa, echemos un vistazo a la esponja de orden
3. Cuando cortamos la esponja con un plano vertical, podemos obtener cuatro motivos
distintos:

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4

231

Para trazar una esponja de orden 3, vamos a recorrer los n


umeros de 1 a 27, es decir, de
001 a 222 en base 3. Para cada n
umero, aplicaremos la seccion adecuada que nos generara
la figura en las 3 direcciones: (Ox), (Oy) y (Oz).
El c
odigo
Este programa dibujara los solidos de Menger de orden 0, 1, 2, 3 y 4. El n
umero de
procedimientos es importante, y precisa de algunas explicaciones.
# Comando de Inicio: esponja 3
#
# Dibuja una alfombra de Sierpinski de orden :p y arista :lado
para alfombra :lado :p
haz "unidad :lado/(potencia 3 :p)
si :p = 0 [ rec :lado :lado alto ]
si :p = 1 [ repite 4 [rec :lado :unidad avanza :lado giraderecha 90 ] alto]
repitepara (lista "x 1 potencia 3 :p)
[ hazlocal "cantorx cantor :x :p []
# no traza elementos que tienen un 1 en la ultima posicion
si no (1 = ultimo :cantorx)
[ hazlocal "nom evalue menosultimo :cantorx "
dibujacolumna :x devuelvepropiedad "map :nom ]
]
fin
# devuelve la decomposicion en base 3 del numero x
# p indica de profundidad 3^p
# :lista lista vacia al principio
para cantor :x :p :lista
si :p = 0 [devuelve :lista]
hazlocal "a potencia 3 :p-1
si :x<= :a
[ devuelve cantor :x :p-1 frase :lista 0 ]
[ si :x<=2*:a [devuelve cantor :x-:a :p-1 frase :lista 1]
devuelve cantor :x-2*:a :p-1 frase :lista 2]
fin
# trazado de la columna numero x respecto al esquema de construccion
#
definido en la lista
para dibujacolumna :x :lista
subelapiz
giraderecha 90 avanza (:x-1)*:unidad giraizquierda 90

232

APENDICE
D. LA ESPONJA DE MENGER

bajalapiz
des :lista
subelapiz
giraizquierda 90 avanza (:x-1)*:unidad giraderecha 90
avanza :x*:unidad giraderecha 90
bajalapiz
des :lista
subelapiz giraizquierda 90 retrocede :x*:unidad bajalapiz
fin
# dibuja un rectangulo con las dimensiones dadas
# el poligono se guarda para el visor 3D
para rec :lo :la
haz "contador :contador+1
empiezapoligono
repite 2 [avanza :lo giraderecha 90 avanza :la giraderecha 90]
finpoligono
fin
# Inicializa las diferentes columnas posibles para las alfombras de orden 1 a 4
para initmap
ponpropiedad "map 111 [3 3 3 9 3 3 3 27 3 3 3 9 3 3 3]
ponpropiedad "map 110 [9 9 9 27 9 9 9]
ponpropiedad "map 101 [3 3 6 3 6 3 3 27 3 3 6 3 6 3 3]
ponpropiedad "map 011 [3 3 3 9 3 3 6 3 3 9 3 3 6 3 3 9 3 3 3]
ponpropiedad "map 000 [81]
ponpropiedad "map 100 [27 27 27]
ponpropiedad "map 010 [9 9 18 9 18 9 9]
ponpropiedad "map 001 [3 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 3]
ponpropiedad "map 01 [3 3 6 3 6 3 3]
ponpropiedad "map 00 [27]
ponpropiedad "map 10 [9 9 9]
ponpropiedad "map 11 [3 3 3 9 3 3 3]
ponpropiedad "map 1 [3 3 3]
ponpropiedad "map 0 [9]
fin
# si la decomposicion es [1 0 1] --> devuelve 101
# si la decomposicion es [1 0 2] --> devuelve 100
# los elementos de la lista son concatenados en una palabra.
# los 2 son reemplazados por dos ceros
para evalue :lista :mot
si vacio? :lista

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4
[ devuelve :mot ]
[ hazlocal "primera primero :lista
si :primera=2 [hazlocal "primera 0 ]
hazlocal "mot palabra :mot :primera
devuelve evalue menosprimero :lista :mot
]
fin
# dibujamos los grupos de rectangulos de cada columna, alternativamente
para des :lista
hazlocal "suma 0
repitepara (lista "i 1 cuenta :lista)
[ hazlocal "elemento elemento :i :lista
hazlocal "suma :elemento + :suma
si par? :i
[ subelapiz avanza :elemento*:unidad bajalapiz ]
[ rec :elemento*:unidad :unidad avanza :elemento*:unidad]
]
subelapiz retrocede :suma * :unidad bajalapiz
fin
# prueba si un numero es par
para par? :i
devuelve 0 = resto :i 2
fin
para sierpinski :p
borrapantalla perspectiva ocultatortuga
initmap
haz "contador 0
alfombra 810 :p
mecanografia "numero\ de\ poligonos:\ escribe :contador
vistapoligono
fin
# suprime el ultimo 1 de la lista :lista
para borraultimouno :lista
repitepara (lista "i cuenta :lista 1 cambiasigno 1)
[ hazlocal "elemento elemento :i :lista
si :elemento = 1
[ hazlocal "lista reemplaza :lista :i 0 alto ]
[ si :elemento = 2 [alto]]
]

233

234

APENDICE
D. LA ESPONJA DE MENGER

devuelve :lista
fin
# Esponja de Menger de arista dada y de profundidad :p
para menger :lado :p
haz "unidade :lado/(potencia 3 :p)
repitepara (lista "z 1 potencia 3 :p)
[ hazlocal "cantorz cantor :z :p []
hazlocal "last ultimo :cantorz
hazlocal "cantorz menosultimo :cantorz
si :last = 0
[ hazlocal "orden evalue borraultimouno :cantorz "]
[ hazlocal "orden evalue :cantorz "]
hazlocal "orden palabra "corte :orden
draw3alfombra :lado :orden :z
subelapiz cabeceaarriba 90 avanza :unidad cabeceaabajo 90 bajalapiz
]
draw3alfombra :lado :orden (potencia 3 :p)+1
fin
# trazado de las alfombras de sierpinski de orden :p
# a lo largo de cada eje (ox), (oy) y (oz)
# a la altitud :z
para draw3alfombra :lado :orden :z
subelapiz centro
cabeceaarriba 90 avanza (:z-1)*:unidade cabeceaabajo 90 bajalapiz
poncolorlapiz azul ejecuta :orden :lado
subelapiz centro
balanceaizquierda 90 avanza (:z-1)*:unidade cabeceaabajo 90 bajalapiz
poncolorlapiz amarillo ejecuta :orden :lado
subelapiz centro
cabeceaarriba 90 avanza :lado giraderecha 90
avanza (:z-1)*:unidade cabeceaabajo 90 bajalapiz
poncolorlapiz magenta ejecuta :orden :lado
fin

# procedimiento principal
# dibuja una esponja de Menger d profundidad p
para esponja :p
borrapantalla perspectiva ocultatortuga
hazlocal "tiempo tiempo

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4

235

initmap
haz "contador 0
si :p=0 [cubo 405] [menger 405 :p]
# muestra el tiempo y establece el numero de poligonos necesarios
#
para la construccion
mecanografia "Numero\ de\ poligonos:\ escribe :contador
mecanografia "Tiempo\ transcurrido:\ escribe tiempo -:tiempo
vistapoligono
fin
# seccion para Menger de orden 2
para corte1 :lado
repite 4
[alfombra :lado/3 1 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte0 :lado
alfombra :lado 2
fin
# seccion para Menger de orden 3
para corte10 :lado
repite 4
[ alfombra :lado/3 2 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte01 :lado
repite 4
[ repite 2 [corte1 :lado/3 subelapiz avanza :lado/3 bajalapiz]
avanza :lado/3 giraderecha 90 ]
fin
para corte11 :lado
repite 4
[ corte1 :lado/3 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte00 :lado
alfombra :lado 3
fin
# seccion para Menger de orden 4
para corte000 :lado

236

APENDICE
D. LA ESPONJA DE MENGER

alfombra :lado 4
fin
para corte100 :lado
repite 4
[ alfombra :lado/3 3 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte010 :lado
repite 4
[ repite 2 [corte10 :lado/3 subelapiz avanza :lado/3 bajalapiz]
avanza :lado/3 giraderecha 90]
fin
para corte001 :lado
repite 4
[ repite 2 [corte01 :lado/3 subelapiz avanza :lado/3 bajalapiz]
avanza :lado/3 giraderecha 90]
fin
para corte110 :lado
repite 4
[ corte10 :lado/3 subelapiz avanza :lado bajalapiz giraderecha 90 ]
fin
para corte111 :lado
repite 4
[ corte11 :lado/3 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte101 :lado
repite 4
[ corte01 :lado/3 subelapiz avanza :lado giraderecha 90 bajalapiz]
fin
para corte011 :lado
repite 4
[ repite 2 [corte11 :lado/3 subelapiz avanza :lado/3 bajalapiz]
avanza :lado/3 giraderecha 90]
fin
para corte :lado
alfombra :lado 1

SOLIDO

D.2. SEGUNDA APROXIMACION.


DE ORDEN 4

237

fin
para cubo :lado
repite 2
[ poncolorlapiz azul rec :lado :lado
subelapiz avanza :lado cabeceaabajo 90 bajalapiz
poncolorlapiz amarillo rec :lado :lado
subelapiz avanza :lado cabeceaabajo 90 bajalapiz ]
poncolorlapiz magenta
subelapiz
balanceaizquierda 90 giraizquierda 90 avanza :lado giraderecha 90
bajalapiz rec :lado :lado
subelapiz
giraderecha 90 avanza :lado giraizquierda 90 balanceaderecha 90
giraderecha 90 avanza :lado giraizquierda 90 balanceaderecha 90
bajalapiz rec :lado :lado
balanceaizquierda 90 giraizquierda 90 avanza :lado giraderecha 90
fin
para cubos
borrapantalla perspectiva ocultatortuga
hazlocal "temps tiempo
initmap
haz "contador 0
repite 4
[ si contador=1 [cubo 405]
[menger 405 contador-1]
subelapiz avanza 1000 giraderecha 90 bajalapiz ]
# muestra el tiempo y el numero de poligonos necesarios en la construcion
mecanografia "Numero\ de\ poligonos:\ escribe :contador
mecanografia "Tiempo\ empleado:\ escribe tiempo -:temps
vistapoligono
fin

Con todo lo anterior, y tras ajustar la memoria disponible para xLogo a 640 Mb, si
tecleamos

esponja 4:

238

APENDICE
D. LA ESPONJA DE MENGER

Ap
endice E
El sistema de Lindenmayer
En este tema hemos utilizado materiales procedentes de:
La Wikipedia: http://es.wikipedia.org/wiki/Sistema-L, en sus ediciones espan
ola, inglesa y francesa.
El libro The Algorithmic Beauty of Plants escrito por Przemyslaw Prusinkiewicz y Aristid Lindenmayer.
Esta leccion va a tratar de la nocion de Sistema de Lindenmayer o SistemaL inventado en 1968 por el biologo h
ungaro Aristid Lindenmayer. Un Sistema-L es un conjunto
de reglas y smbolos que modelan el proceso de crecimiento de seres vivos como las plantas o las celulas. El concepto central de los SistemasL es la nocion de re-escritura. La
re-escritura es una tecnica para construir objetos complejos por reemplazo a partir de un
objeto inicial sencillo utilizando reglas de re-escritura.
Para ello, las celulas se modelizan mediante smbolos. En cada generacion, las celulas
se dividen, es decir, un smbolo se sustituye por uno o varios otros smbolos que forman
una palabra.

E.1.

Definici
on formal

Un SistemaL es una gramatica formal que comprende:


1. Un alfabeto V : conjunto de variables del SistemaL. V es el conjunto de palabras
que podemos generar con cualquiera de los smbolos de V , y V + el conjunto de
palabras con al menos un smbolo.
2. Un conjunto de valores constantes S. Algunos de estos smbolos son comunes a todos
los SistemasL, en particular cuando los utilizamos con la tortuga).
3. Un axioma de partida , elegido de V +, es el estado inicial.
239


APENDICE
E. EL SISTEMA DE LINDENMAYER

240

4. Un conjunto de reglas o producciones, denominado P , que definen la forma en la


que las variables pueden ser reemplazadas por combinaciones de constantes y otras
variables.
Una produccion esta formada por dos cadenas. el predecesor y el sucesor.
Un SistemaL definido as, es una tupla {V, S, , P }.

Consideremos el SistemaL siguiente:


Alfabeto: V = {A, B}
Constantes: S = {}
Axioma inicial: = A
Reglas :

A AB
BA

Las dos reglas de produccion dadas son las reglas de re-escritura del sistema. En cada
etapa, A es sustituida por AB, y B es sustituido por A. Estas son las primeras iteraciones
de este sistema de Lindemayer:

Iteracion 1: A
Iteracion 2: AB
Iteracion 3: ABA
Iteracion 4: ABAAB
Bien, bien pero . . . y en que se concreta esto? Pasemos a la siguiente seccion.

POR LA TORTUGA
E.2. INTERPRETACION

E.2.

241

Interpretaci
on por la tortuga

Este primer ejemplo ayuda a entender la nocion de sistema de Lindenmayer y, posiblemente, como vamos a utilizarla de manera eficaz con la tortuga.
Aqu es donde se pone interesante: Cada palabra as construida no tiene ning
un significado especial. Vamos a definir para cada letra de la secuencia, una accion (comando) que
ejecutara la tortuga y generara dibujos en 2D o 3D.

E.2.1.

Simbologa

F : Avanzar un paso (unitario) ( V )


+ : Girar un cierto angulo a la izquierda ( S).
: Girar un cierto angulo a la derecha ( S).
& : Girar un cierto angulo hacia abajo ( S).
: Girar un cierto angulo hacia arriba ( S).
\: Girar sobre s mismo hacia la izquierda un angulo ( S).
/ : Girar sobre s mismo hacia la derecha un angulo ( S).
| : Efectuar una media vuelta. Con xLogo: giraderecha 180
Por ejemplo, con = 90 y un desplazamiento unitario de 10 pasos de tortuga, obtennemos:
Smbolo
Comando xLogo

E.2.2.

F
av 10

+
gi 90

gd 90

&
sn 90

bn 90

\
bi 90

Copo de Koch

Consideremos el sistemaL:
Estado inicial: F F F
Regla de produccion: F F + F F + F

Angulo
= 60 , el paso unitario se divide por 3 en cada iteracion.
Primeras iteraciones:

/
bd 90

|
gd 180

242

APENDICE
E. EL SISTEMA DE LINDENMAYER

cuyo programa en xLogo es:


para coponieve :p
borrapantalla
haz "unidad 300/potencia 3 :p-1
repite 3 [f :p-1 giraderecha 120]
fin
para f :p
si :p=0 [avanza :unidad alto]
f :p-1 giraizquierda 60
f :p-1 giraderecha 120
f :p-1 giraizquierda 60
f :p-1
fin

POR LA TORTUGA
E.2. INTERPRETACION

E.2.3.

243

Curva de Koch de orden 2

Fijemonos ahora en el sistemaL siguiente:


Estado inicial: F F F F
Regla de produccion: F F F + F + F F F F + F
Las primeras representaciones utilizando = 90 y ajustando el paso unitario para que la
figura tenga un tama
no constante:

Ahora es muy facil crear el programa Logo para generar esas figuras:
# p indica la iteracion


APENDICE
E. EL SISTEMA DE LINDENMAYER

244

para koch :p
# entre cada iteracion, la distancia unitaria se divide entre 4
# asi, la figura final tendra unas dimensiones maximas de 600x600
haz "unidad 300/potencia 4 :p-1
repite 3 [ f :p-1 giraizquierda 90]
f :p-1
fin
# la cadena de re-escritura
para f :p
si :p=0 [avanza :unidad alto]
f :p-1 giraizquierda 90
f :p-1 giraderecha 90
f :p-1 giraderecha 90
f :p-1 f :p-1 giraizquierda 90
f :p-1 giraizquierda 90
f :p-1 giraderecha 90 f :p-1
fin

E.2.4.

Curva del drag


on

Terminamos esta serie de ejemplos con la curva drag


on, cuyas condiciones son:
Estado inicial: F
Regla de produccion:

A A + B+
B A B

El programa resulta:
para dragon :p
haz "unidad 300/8/ :p
a :p
fin
para a :p
si :p=0 [avanza :unidad alto]
a :p-1 giraizquierda 90 b :p-1 giraizquierda 90
fin
para b :p
si :p=0 [avanza :unidad alto]
giraderecha 90 a :p-1 giraderecha 90 b :p-1
fin

POR LA TORTUGA
E.2. INTERPRETACION

245

y los resultados son:

dragon 10

E.2.5.

dragon 15

Curva de Hilbert en 3D

El ejemplo siguiente generara la curva de Hilbert en el espacio. Esta es una curva que presenta la propiedad de reemplazar perfectamente un cubo al aumentar el n
umero de iteraciones.
El sistemaL asociado es:
Estado inicial: A

Angulo
= 90 , la longitud unitaria se divide entre dos en cada iteracion
A B F + CF C + F D&F D F + &&CF C + F + B//
B A&F CF BF D F D|F B|F CF A//
Regla de producion:
C |D|F B F + CF A&&F A&F C + F + BF D//
D |CF B F + B|F A&F A&&F B F + B|F C//
para hilbert :p
borrapantalla perspectiva
haz "unidad 400/potencia 2 :p
empiezalinea
pongrosor :unidad/2 a :p
finlinea
vistapoligono
fin

246

APENDICE
E. EL SISTEMA DE LINDENMAYER

para a :p
si :p=0 [alto]
b :p-1 giraderecha 90 avanza :unidad giraizquierda 90
c :p-1 avanza :unidad
c :p-1 giraizquierda 90 avanza :unidad giraderecha 90
d :p-1 cabeceaabajo 90 avanza :unidad cabeceaarriba 90
d :p-1 giraderecha 90 avanza :unidad giraizquierda 90 cabeceaabajo 180
c :p-1 avanza :unidad
c :p-1 giraizquierda 90 avanza :unidad giraizquierda 90
b :p-1 balanceaderecha 180
fin
para b :p
si :p=0 [alto]
a :p-1 cabeceaabajo 90 avanza :unidad cabeceaarriba 90
c :p-1 avanza :unidad
b :p-1 cabeceaarriba 90 avanza :unidad cabeceaarriba 90
d :p-1 cabeceaarriba 180 giraderecha 90 avanza :unidad giraderecha 90
d :p-1 cabeceaarriba 90 giraderecha 180 avanza :unidad cabeceaarriba 90
b :p-1 giraderecha 180 avanza :unidad
c :p-1 cabeceaarriba 90 avanza :unidad cabeceaarriba 90
a :p-1 balanceaderecha 180
fin
para c :p
si :p=0 [alto]
giraderecha 180
d :p-1 cabeceaarriba 90 giraderecha 180 avanza :unidad cabeceaarriba 90
b :p-1 giraderecha 90 avanza :unidad giraizquierda 90
c :p-1 cabeceaarriba 90 avanza :unidad cabeceaarriba 90
a :p-1 cabeceaabajo 180 avanza :unidad
a :p-1 cabeceaabajo 90 avanza :unidad cabeceaarriba 90
c :p-1 giraizquierda 90 avanza :unidad giraizquierda 90
b :p-1 cabeceaarriba 90 avanza :unidad cabeceaarriba 90
d :p-1 balanceaderecha 180
fin
para d :p
si :p=0 [alto]
giraderecha 180
c :p-1 avanza :unidad
b :p-1 giraderecha 90 avanza :unidad giraizquierda 90

POR LA TORTUGA
E.2. INTERPRETACION
b
a
a
b
b
c
fin

:p-1
:p-1
:p-1
:p-1
:p-1
:p-1

giraderecha 180 avanza :unidad


cabeceaabajo 90 avanza :unidad cabeceaarriba 90
cabeceaabajo 180 avanza :unidad
giraderecha 90 avanza :unidad giraizquierda 90
giraderecha 180 avanza :unidad
balanceaderecha 180

En las primeras iteraciones obtenemos:

Hermoso, verdad?

247

Indice alfab
etico
, 28
(, 10
), 10
*, 56
+, 56
-, 56
/, 56
<, 74
<=, 74
=, 76
>, 74
>=, 74
?, 76
[, 10
#, 10, 41
&, 73
", 10
\\, 10
\n, 10
\ , 10
], 10
3d, 163
abreflujo, 155
Abrir, 12
abs, 62
absoluto, 62
accionigu, 120
Acentuacion y tildes, 11
Acerca de ..., 19
acos, 63
Actualizaciones, 5
adios, 13
agrega, 80
agregalineaflujo, 155

aleatorio, 62
Alfombra de Sierpinski, 224
Algoritmo de Euclides, 158
Alto, 7
alto, 42, 93
amarillo, 126
Animacion, 147
animacion, 147
anterior?, 76
antes?, 76
Aproximando , 102, 157, 161
arccos, 63
arco, 65, 166
arcocoseno, 63
arcoseno, 63
arcotangente, 63
arcsen, 63
arctg, 63

Area
de Dibujo, 6
Argumentos, 28
Argumentos Opcionales, 29
asen, 63
Aspecto, 15
atan, 63
av, 29, 165
avanza, 29, 165
Ayuda, 18
azar, 62
azul, 126
azuloscuro, 126
backslash, 10
bajalapiz, 31
bajalapiz?, 76
bajanariz, 164
248

INDICE ALFABETICO

balanceaderecha, 165
balanceaizquierda, 165
balanceo, 165, 167
Barra invertida, 10
bd, 165
bi, 165
bl, 31
bl?, 76
blanco, 126
bn, 164
Booleanos, 76
boprop, 86
borra, 9, 54
borracuadricula, 16
borraejes, 16
borrapantalla, 31, 165
borrapropiedad, 86
Borrar procedimientos, 9, 15
borrasecuencia, 183
borratexto, 108
borratodo, 9, 54
borravariable, 45
bos, 183
botonigu, 119
bov, 45
bp, 31, 165
bt, 108
Bucles, 87
cabeceaabajo, 164
cabeceaarriba, 164
cabeceo, 167
cabeceo?, 165
Calidad del dibujo, 17
calidaddibujo, 131
cambiadirectorio, 152
cambiasigno, 62
car, 109
caracter, 109
carga, 154
cargaimagen, 135, 184
cat, 152
catalogo, 152

249
cd, 152
cdib, 131
centro, 29, 70, 166
chattcp, 193
ci, 135
cierraflujo, 155
cierto, 76
circulo, 177
circulo, 60, 166
cociente, 56
Color de lapiz preasignado, 16
Color de papel preasignado, 16
Colores (ejemplo), 134
colorlapiz, 125
colorpapel, 125
colortexto, 108
Comando de Inicio, 6
comandoexterno, 156
Comentarios, 41
Condicional, 72
contador, 88
Convenciones, 10
Coordenadas, 68
coordenadax, 68, 166
coordenaday, 68, 166
coordenadaz, 167
coordx, 68
coordy, 68
coordz, 167
Copiar, 6, 14
Copo de nieve, 100, 241
Cortar, 6, 14
cos, 63
cosa, 45
coseno, 63
crono, 186
cronometro, 186
cs, 62
Cuadrcula, 16
cuadricula, 16, 67
cuadricula?, 76
Cubo, 171
cuenta, 79

250

INDICE ALFABETICO

decimales, 64
define, 54
definelinea, 169
definepoligono, 169
definepunto, 169
definetexto, 169
Definir archivos de inicio, 14
deflinea, 169
defpoli, 169
defpto, 169
deftxt, 169
Desinstalar, 5
detienecuadricula, 67
detieneejes, 67
detienemp3, 185
detienetodo, 94
dev, 94
devuelve, 94, 104, 105
dibujaigu, 120
diferencia, 56
digitos, 64
dir, 152
directorio, 152
distancia, 70
distancia, 166
division, 56
Dodecaedro, 174

edtodo, 7
Efectos de luz y niebla, 179
ejecuta, 55
ejecutatcp, 193
ejes, 16, 67
Ejes cartesianos, 16
ejex, 16, 67
ejex?, 76
ejey, 16, 67
ejey?, 76
Elegir color del lapiz, 14
Elegir color del papel, 14
elemento, 79
elige, 79
eliminaigu, 119
eliminatortuga, 139
empiezalinea, 169
empiezapoligono, 169
empiezapunto, 169
empiezatexto, 169
encuentracolor, 125
entero?, 76
enviatcp, 193
escribe, 28, 106
escribelineaflujo, 155
escuchamp3, 185
escuchatcp, 193
Esfera, 176
Espacios, 10
espera, 186
Esponja de Menger, 221
esquinasventana, 132
estilo, 109
Estilo de programacion, 40, 42
exp, 63

ec, 125
ed, 7
Edicion, 14
edita, 7
Editar, 7
editatodo, 7
Editor de Procedimientos, 7

Factorial, 97
falso, 76
fecha, 186
Figura de la tortuga, 15
fin, 39
fincrono?, 186
fincronometro?, 186

cuentarepite, 88
cursiva, 109
Curva de Hilbert, 245
Curva de Koch de orden 2, 243
Curva de persecucion, 140
Curva del dragon, 244
cyan, 126

INDICE ALFABETICO

251

finflujo?, 155
finlinea, 169
finpoli, 169
finpoligono, 169
finpto, 169
finpunto, 169
fintexto, 169
fintxt, 169
Flujo de control, 72
Foco, 180
forma, 139
Forma del lapiz, 17
Forma general de una primitiva, 59
Fractales, 100
Frase, 45
frase, 58, 81
ftexto, 108
Fuente, 18
fuente, 111
fuentetexto, 108
Funciones trigonometricas, 63

hazlocal, 52
Historico de Comandos, 7
hora, 186

gd, 29, 165


Gestion de tiempos, 186
gi, 29, 165
giraderecha, 29, 165
giraizquierda, 29, 165
gl, 123
go, 32, 125
goma, 32, 125
gris, 126
grisclaro, 126
grosorlapiz, 123
guarda, 154
Guardar, 12
Guardar como ..., 12
Guardar en formato RTF, 13
Guardar imagen como. . . , 13
guardatodo, 154

Lnea de Comando, 6
largoetiqueta, 106, 166
leecar, 112
leecarflujo, 155
leelineaflujo, 155
leelista, 81, 112
leeprop, 86
leepropiedad, 86
leeraton, 115
leetecla, 112
leeteclado, 113
.lgo, 14
Licencia GPL, 18
limpia, 32
Lista, 29, 45
lista, 58, 81, 82
lista?, 76
listaflujos, 155
listaprocs, 55
listaprop, 86
listapropiedades, 86

hacia, 70
hacia, 166
haz, 45, 52

Icosaedro, 175
Idioma, 15
iguales?, 76
ila, 125
Imprimir imagen, 13
imts, 55
imvars, 45
Indentar, 41
indicesecuencia, 183
indsec, 183
inicializa, 10
instr, 183
instrumento, 183
invierte, 80
inviertelapiz, 125
.jpg, 13, 135
justificadofuente, 111

252
Listas de Propiedades, 86
listasprop, 86
listaspropiedades, 86
listavars, 45
ln, 63
local, 52
log, 63
log10, 63
Logaritmos, 63
logneperiano, 63
lupa, 130
Luz Ambiental, 180
Luz Direccional, 180
Maximo com
un divisor (m.c.d.), 157
magenta, 126
Manual en lnea, 18
Marco de adorno, 16
marron, 126
maximastortugas, 139
maxt, 139
May
usculas y min
usculas, 11
mayor?, 74
mayoroigual?, 74
Memoria destinada a xLogo, 17
menor?, 74
menoroigual?, 74
menosprimero, 80
menosultimo, 80
mensaje, 106
MIDI, 17, 182
miembro, 79
miembro?, 76
mientras, 89, 94
modojaula, 130, 163, 164
modoventana, 130, 163, 164
modovuelta, 130, 163, 164
mp, 80
msj, 106
mt, 31, 123
mu, 80
muestratortuga, 31, 123, 140
Multitortuga, 139

INDICE ALFABETICO

N
umero maximo de tortugas, 17
N
umeros, 28, 45
N
umeros aleatorios, 62
naranja, 126
negrita, 109
negro, 126
nf, 111
nft, 108
Niebla densa, 181
Niebla lineal, 181
ninguno, 109
no, 73
nombrefuente, 111
nombrefuentetexto, 108
Nuevo, 12
numero?, 76
o, 73
objeto, 45
Octaedro, 173
ocultatortuga, 31, 123
Operaciones Binarias, 56
Operaciones Logicas, 73
Operaciones Unitarias, 62
orientacion, 167
ot, 31, 123
palabra, 81
palabra?, 76
Palabras, 28, 45
Parentesis, 65
para, 39
paracada, 90
pcc, 67
pcd, 130
pce, 67
pctexto, 108
Pegar, 6, 14
perspectiva, 163, 164
pest, 108
pf, 111
pfl, 123
pforma, 139

INDICE ALFABETICO

pft, 108
pi, 28
pindsec, 183
pinstr, 183
pmt, 139
pnf, 111
pnft, 108
.png, 13, 135
Polgono estrellado, 37
ponbalanceo, 167
poncabeceo, 167
poncalidaddibujo, 130
poncl, 32, 125
poncolorcuadricula, 67
poncolorejes, 16, 67
poncolorlapiz, 14, 32, 125
poncolorpapel, 14, 125
poncolortexto, 108
poncp, 125
pondecimales, 64, 103
pondigitos, 64
pondir, 152
pondirectorio, 152
ponestilo, 108
ponforma, 15, 139
ponformalapiz, 123
ponfuente, 111
ponfuentetexto, 108
pongrosor, 32, 123
ponindicesecuencia, 183
poninstrumento, 17, 183
ponjustificadofuente, 111
ponlupa, 130
ponmaximastortugas, 139
ponnombrefuente, 111
ponnombrefuentetexto, 108
ponorientacion, 167
ponpos, 68, 166
ponposicion, 68, 166
ponprimero, 80
ponprop, 86
ponpropiedad, 86
ponrumbo, 70, 166

253
ponsep, 132
ponseparacion, 132
pontama~
nopantalla, 132
pontortuga, 139
ponultimo, 80
ponx, 68, 166
ponxy, 68
ponxyz, 167
pony, 68, 166
ponz, 167
ponzoom, 130
Portapapeles, 13
pos, 68, 166
posicion, 68, 166
posicionigu, 119
posraton, 115
potencia, 56
pp, 80
pr, 79
Preferencias, 15
prim?, 76
primero, 79
primitiva?, 76
Primitivas, 28
Primitivas booleanas, 76
Primitivas personalizadas, 14
Prioridad de las operaciones, 65
proc?, 77
procedimiento?, 77
Procedimientos, 38
Procedimientos avanzados, 104
Procedimientos con variables, 46
producto, 56
ptortuga, 139
pu, 80
Puerto TCP, 17
punto, 68, 166
Punto de Luz, 180
quita, 80
raizcuadrada, 62
Raton, 115

INDICE ALFABETICO

254
raton?, 115
rc, 62
re, 29, 165
Recursividad, 97
redondea, 62
reemplaza, 80
refrescar, 147
rellena, 32, 127
rellenapoligono, 36
rellenazona, 32, 127
repite, 32, 87, 94
repitehasta, 92
repitemientras, 91
repitepara, 88
repitesiempre, 91
reponetodo, 10
Resaltado, 18
resto, 56
retrocede, 29, 165
Reutilizacion de variables, 59
Robotica, 194
rojo, 126
rojooscuro, 126
rosa, 126
rotula, 106, 166
RTF, 13
Rumbo, 70
rumbo, 70
rumbo, 166
Ruptura de secuencia, 93
Solidos Platonicos, 170
Salir, 9, 13
Saltos de lnea, 10
sec, 183
secuencia, 183
Seleccionar todo, 14
sen, 63
seno, 63
separacion, 132
si, 72
sisino, 73
Sistema de Lindenmayer, 239

sl, 31
sn, 164
Sonido, 17
subelapiz, 31
subenariz, 164
subindice, 109
Subprocedimientos, 41
subrayado, 109
suma, 56
superindice, 109
tachado, 109
Tama
no de la ventana, 17
Tama
no maximo del lapiz, 17
tama~
nopantalla, 132
tama~
noventana, 132
tan, 63
tangente, 63
tecla?, 112
Teclado, 112
Tetraedro, 171
texto, 54
tg, 63
tiempo, 186
tipea, 57, 106
tocamusica, 183
Tocar m
usica, 182
tortuga, 139
tortugas, 139
TortuRob, 195
tpant, 132
Traduccion de la Licencia, 18
Traducir procedimientos, 15
Traducir xLogo, 18
trazado, 105
Tres Dimensiones, 163
trunca, 62
Truncar un n
umero, 62
tv, 132
ultimo, 79
unicode, 109
vacio?, 76

INDICE ALFABETICO

Valor absoluto de un n
umero, 62
var?, 77
variable?, 77
Variables, 44
Variables booleanas, 76
Variables globales, 52
Variables locales, 52
Variables opcionales, 104
Velocidad de la tortuga, 15
verde, 126
verdeoscuro, 126
violeta, 126
visible?, 76
vista3d, 169
vistapoligono, 169
y, 73
Zoom, 6
zoom, 130

255

Vous aimerez peut-être aussi