MSWLogo
Logo es
un lenguaje de programación, desarrollado a finales de
los años 70 por un equipo de matemáticos, dirigidos por
Seymour Papert en la Universidad de California (Berkeley), con el fin
de entrenar el pensamiento lógico.
Todas las versiones de
Logo desarrolladas
para Unix, DOS, Macintosh y
Windows, son gratuitas y pueden ser copiadas y distribuidas, sin
ningún tipo de restricción, con fines educativos.
MSWLogo es
la versión de Logo para Windows.
Originalmente, el lenguaje Logo estaba destinado a controlar el
movimiento de un vehículo robotizado, con aspecto de tortuga,
controlado desde un ordenador. En la actualidad, el icono de la tortuga
se ha sustituido por un triángulo que se mueve en la pantalla
del ordenador.
Cada vez que el programador introduce una orden como, por ejemplo,
AVANZA 200,
el icono de la tortuga se mueve obedeciendo la orden y
dibujando, si el lápiz de la tortuga está bajado, una
linea en la pantalla.
Primitivas
MSWLogo es
un lenguaje interpretado, al igual que
VisualBasic o
Java.
Cuando se escribe código de programa en un lenguaje
interpretado, cada una de las órdenes escritas es interpretada y
ejecutada al momento, lo que permite ver inmediatamente si la
instrucción escrita produce el efecto deseado.
Por el contrario, los lenguajes que deben ser compilados (como es el
caso de C++, Fortran, Pascal, etc.), deben ser convertidos a lenguaje
máquina, es decir, convertidos a unos y ceros, para que se
puedan cargar en memoria y ser ejecutados.
Las
órdenes o instrucciones básicas de MSWLogo se
llaman primitivas.
Las primitivas deben escribirse en el cuadro inferior de la
ventana de trabajo. Al pulsar Enter o
hacer clic en el botón Ejecutar,
la primitiva escrita se ejecuta. Si la primitiva está
mal escrita o si le faltan datos, el intérprete contesta “no
sé cómo...” Cada una de las órdenes queda
anotada
en la ventana de trabajo.
|
Un programa típico, para dibujar un triángulo
equilátero, en lenguaje
Logo tiene
el siguiente aspecto:
avanza 100
giraderecha
120
avanza 100
giraderecha
120
avanza 100
giraderecha
120
Las palabras
avanza
y
giraderecha
son primitivas, que indican a la
tortuga que debe desplazarse hacia adelante o girar hacia la derecha.
Los números que completan las instrucciones son los
argumentos,
que le indican cuánto debe avanzar o qué ángulo,
en grados, debe girar.
Para salir de
MSWLogo
basta con introducir la primitiva adios en la
ventana de trabajo o seleccionar
Archivo / Salir en
el menú
principal.
Veamos a continuación una pequeña muestra de las
primitivas más sencillas de MSWLogo y de sus abreviaturas:
| PRIMITIVA |
ACCIÓN |
ABREVIADO
|
| AVANZA 150 |
La tortuga avanza el
número
indicado de puntos (150). |
AV 150 |
| RETROCEDE 80 |
Retrocede el número
de puntos
especificado (80). |
RE 80 |
| GIRADERECHA 15 |
Gira a la derecha el
ángulo
especificado en grados (15º). |
GD
15 |
| GIRAIZQUIERDA 30 |
Gira a la izquierda el
ángulo
indicado (30º). |
GI 30 |
| SUBELAPIZ |
Levanta el lápiz y
no pinta al
moverse por la pantalla. |
SL |
| BAJALAPIZ |
El lápiz toca el
papel y pinta
cuando se mueve. |
BL
|
| GOMA |
La tortuga borra a lo
largo de su
trayectoria. |
|
| OCULTATORTUGA |
Oculta el icono de la
tortuga. |
OT |
| MUESTRATORTUGA |
Muestra el
triángulo que
representa la tortuga. |
MT |
| BORRAPANTALLA |
Borra la pantalla
gráfica y
sitúa la tortuga en el centro. |
BP |
| BORRATEXTO |
Borra la pantalla de
trabajo |
BT
|
| CENTRO |
Lleva la tortuga al centro
de la pantalla sin
borrar. |
|
| ROTULA [hola] |
Escribe el texto
especificado entre
corchetes (hola). |
RO [hola] |
| PONCOLORLAPIZ 4 |
Establece el color con que
pinta. El
4 corresponde al rojo. |
PONCL 4 |
| TONO [800 200] |
Emite un sonido de
[frecuencia (800Hz)
y duración (200ms)] |
|
| PONGROSOR [3 3] |
Fija el grosor y la altura
del
lápiz con el que traza líneas. |
PONG [3
3] |
| ADIOS |
Sale de MSWLogo. |
|
Procedimientos
| Un
procedimiento es un fragmento de programa, formado por una
sucesión de primitivas.
Todos los procedimientos empiezan con la
palabra para y
terminan con la palabra fin. |
Los procedimientos empiezan con la palabra
para, que es una
declaración de comienzo, seguida por el nombre del procedimiento
y terminan con la palabra
fin, que es
la declaración de cierre.
Entre ambas declaraciones se sitúan las primitivas que, al
ejecutarse, componen el procedimiento:
para
nombre
primitiva
1
primitiva
2
.
etc.
fin
Una vez creado, un procedimiento puede ser invocado como una primitiva
más del lenguaje.
Crear un procedimiento
Ejercicio
1: Hola mundo
Por ejemplo, crea un procedimiento llamado
tax que
escriba el mensaje "
Hola, mundo"
en la ventana de trabajo.
para tax
escribe
[Hola, mundo]
fin
Invoca ahora el procedimiento que has creado, escribiendo en la
línea de órdenes de la ventana de trabajo la palabra tax.
¿Funciona? Ten en cuenta que los nombres de los procedimientos
son totalmente arbitrarios. Puedes ponerle a un procedimiento cualquier
nombre que se te ocurra, excepto el nombre de una primitiva.
Modificar un procedimiento
Ejercicio
2: escribe dos frases
Modifica el procedimiento
tax de forma
que escriba
el mensaje "
Hola,
mundo" y en la siguiente línea
"
¿Qué
tal va todo?" en la pantalla de trabajo. Para ello
abre el editor y añade otra línea:
Archivo →
editar → tax
para tax
escribe
[Hola, mundo]
escribe
[¿Qué tal va todo?]
fin
Invoca de nuevo el procedimiento
tax y
comprueba que los cambios que
has introducido se ejecutan correctamente. ¿Lo ves? Esta es la
forma más sencilla de modificar o mejorar un procedimiento ya
escrito.
Rotular textos en la pantalla
Primitiva rotula
Muchas veces, necesitarás que tu programa presente textos o
títulos en la pantalla gráfica. En esos casos
utilizarás la primitiva
rotula. Su
sintaxis es muy sencilla:
rotula
“manzana
escribe
la palabra
<
manzana>
en la pantalla
rotula
[hoy es jueves]
escribe la frase <
hoy es
jueves>
rotula
(lista “febrero “abril “y “septiembre)
escribe
las palabras de la lista
¡compruébalo!
Ejercicio
3: mox
Por ejemplo: crea un procedimiento llamado
mox que
rotule el mensaje "
Esto es un mensaje"
en la pantalla del ordenador.
para mox
rotula
[Esto es un mensaje]
fin
Invócalo, escribiendo
mox en la
línea de comandos de la
ventana de trabajo. Notarás que el rótulo aparece en la
dirección apuntada por la tortuga.
Ejercicio
4: mox corregido
Modifica el procedimiento
mox para
girar la
tortuga antes de rotular y lograr, de ese modo, que el rótulo se
pueda leer horizontalmente, abriendo el menú:
Archivo →
editar → mox
para mox
gd 90
rotula
[Esto es un mensaje horizontal]
fin
Ejercicio 5: mox mejorado
Invoca
mox varias
veces. Notarás que
el mensaje aparece cada vez girado 90 grados respecto al anterior.
Modifica el procedimiento
mox para que
el rótulo siempre
aparezca horizontal, restaurando la posición de la tortuga antes
de rotular.
Archivo →
editar → mox
para mox
bp
gd 90
rotula
[Este mensaje siempre es horizontal]
fin
Si te fijas, al incluir en el código del programa la orden
bp (borrapantalla),
cada vez que llamas al procedimiento
mox la
tortuga se
sitúa en el centro de la pantalla y orientada hacia arriba. Y,
como giramos la tortuga 90 grados, siempre rotula en dirección
horizontal.
Primitiva pontamañotipo
Si quieres puedes
controlar la fuente con la que el programa rotula en la pantalla.
Esto incluye tanto el
tipo de letra,
que deberá estar incluido en la colección de fuentes de
tu sistema operativo, como su
tamaño
y
formato. Su sintaxis es como
sigue:
pontamañotipo
[ [Arial] alto ancho inclinación grosor]
Ejercicio 6: elegir tipo de letra
Escribe, por ejemplo, en la ventana de textos
pontamañotipo
[[ Comic Sans MS] 100 50 0 400]
gd 90
rotula
[¡¡ Hola !!]
y verás cómo aparece
un
cartel escrito con ese tipo y tamaño de letra
Variables
| Una
variable es un dato, que tiene un nombre, y que puede tomar
distintos valores. |
El programador puede crear una variable en cualquier momento,
declarando su nombre y asignándole un valor. Para ello utiliza
la primitiva
haz.
Por ejemplo:
haz
“cosa 50
Las comillas indican que nos referimos al
nombre de la
variable. Esta
instrucción puede leerse así:
crea una variable
llamada
cosa, cuyo valor es 50.
En lo sucesivo, cosa vale 50. Se puede utilizar este valor asignado a
la variable, en un procedimiento, escribiendo dos puntos delante del
nombre de la variable. Por ejemplo:
rotula
:cosa
Los dos puntos indican que ahora nos referimos al valor de la variable.
Esta instrucción puede leerse así:
crea un
rótulo
con el valor de la variable llamada cosa.
Ejercicio 7: por
Por ejemplo: crea un procedimiento llamado
por que
calcule el producto de 15 por 68 y lo presente en la pantalla
gráfica:
para por
bp
haz
“numero1 15
haz
“numero2 68
haz
“resultado :numero1 * :numero2
bp gd 90
rotula
[15 x 68 = ]
av 90
rotula
:resultado
fin
¡¡ Funciona !!
Ejercicio 8: por mejorado
Para mejorar el procedimiento, debes
conseguir que no aparezca un trazo sobre los números (levantando
la tortuga antes de rotular el resultado) y que, al final no se vea la
tortuga. ¿Sabrás hacerlo?
Como ves, en este procedimiento hemos declarado tres variables llamadas
numero1,
numero2 y
resultado.
Observa atentamente cuándo
utilizamos su
nombre
y cuándo utilizamos su
valor.
Nombre y valor de una variable
Es importante que comprendas la diferencia entre el nombre de una
variable y el valor de esa misma variable. Por ejemplo:
Instrucción
|
Producirá
|
rotula “hola
|
hola |
| rotula [hola] |
hola |
haz “hola 79
rotula :hola
|
79
|
haz "hola 79
rotula hola * 2 |
error
|
haz "hola 79
rotula :hola * 2 |
158
|
Guardar los procedimientos en el disco
Un
programa escrito en Logo está
compuesto por uno o varios
procedimientos y debe guardarse en el disco duro, en un archivo. De
este modo, se podrá cargar el archivo y ejecutar el programa
más adelante.
Los archivos que contienen código fuente escrito en MSWLogo
son archivos de texto plano (sin formato) que tienen la
extensión .lgo |
Ejercicio 9: Guardar procedimientos en un archivo
Por ejemplo, guarda en el disco duro todos los
procedimientos creados hasta ahora en un archivo llamado
misejercicios.lgo.
Elige con cuidado en qué carpeta lo vas a
guardar.
Archivo →
guardar como... → misejercicios.lgo
Ejercicio 10: Abrir un archivo lgo con un editor de texto
Cierra
MSWLogo
y busca en tu disco duro el archivo
misejercicios.lgo
que acabas de guardar. Ábrelo con un editor de
textos simple, como
Wordpad o el
Bloc de
notas de Windows.
Observarás que el archivo que contiene tu código fuente
es un simple archivo de texto, que se puede modificar fácilmente
con el editor de textos.
Ejercicio 11: Cargar un archivo lgo en MSWLogo
Inicia de nuevo
MSWLogo
y carga tu archivo de
ejercicios acudiendo al menú:
Archivo →
cargar → misejercicios.lgo
Ejercicio 12: Listado de procedimientos contenidos en un
archivo
Saca un listado de los procedimientos creados
hasta este momento, escribiendo en la línea de órdenes de
la ventana de trabajo:
escribe
contenido
Ejercicio 13: Borrar procedimientos de un archivo
Borra uno de los procedimientos contenidos en el
archivo
misejercicios.lgo
borra "sox
escribe
contenido
Comprobarás que el procedimiento
sox ha
desaparecido de la lista
Ejercicio 14: Borrar todos los procedimientos de un archivo
Borra todos los procedimientos contenidos en el
archivo
misejercicios.lgo
borra
contenido
escribe
contenido
En este momento, el archivo
misejercicios.lgo
ha sido vaciado de
procedimientos. Como no queremos perderlos,
NO GUARDES LOS
CAMBIOS EFECTUADOS:
Archivo →
salir → rechazar
Ejercicio 15: Verificar los procedimientos incluidos en un
archivo
Carga del disco nuevamente los procedimientos
salvados anteriormente.
Archivo →
cargar → misejercicios.lgo
escribe
contenido
Comprueba que has recuperado la versión guardada de
misejercicios.lgo y que están disponibles todos los
procedimientos que incluiste en ese archivo.
Situar la tortuga en la pantalla
| La
posición inicial de la tortuga está en el centro de la
pantalla, donde está el origen de coordenadas [0 0] y orientada
verticalmente hacia arriba, que es el origen desde el que se miden los
ángulos (0º). |
Para crear figuras y presentarlas, la tortuga debe moverse por la
pantalla de gráficos, avanzando o retrocediendo una cantidad
precisa de puntos y girando ángulos precisos. Por eso conviene
mantener el control acerca del lugar en el que se sitúa la
tortuga y en qué dirección se mueve. Para ello hay un
buen puñado de primitivas como, por ejemplo:
| borrapantalla
(bp) |
Borra
todo y sitúa la tortuga en su
posición inicial. |
| limpia |
Borra
todo y deja la tortuga
donde está |
| centro |
Sitúa
la tortuga en la
posición inicial, sin borrar nada. |
| ponpos
[x y] |
Sitúa
la tortuga en las coordenadas especificadas |
| ponrumbo
φ |
Orienta
la tortuga en la dirección del ángulo φ |
| pos |
Devuelve las
coordenadas de la tortuga como una lista [x y] |
Ejercicio 16: trazos
Crea un procedimiento llamado
trazos que
dibuje
una linea de trazos, de 100 pixel de largo. Al terminar el
procedimiento, muestra la tortuga en el centro de la pantalla.
para
trazos
limpia
sl ot
ponpos
[-500 0]
gd 90
bajalapiz
avanza 100 subelapiz avanza 100
bajalapiz
avanza 100 subelapiz avanza 100
bajalapiz
avanza 100 subelapiz avanza 100
bajalapiz
avanza 100 subelapiz avanza 100
bajalapiz
avanza 100 subelapiz avanza 100
bajalapiz
avanza 100 subelapiz avanza 100
ponpos [0
0]
gi 90
mt
fin
Observarás que, por comodidad, está permitido usar
abreviaturas como
ot o
mt en lugar
del nombre completo de la primitiva
ocultatortuga o
muestratortuga,
sl o
bl en
lugar de
subelapiz
o
bajalapiz
Ejercicio 17: cuadro
Haz un procedimiento llamado
cuadro para
dibujar,
en la pantalla gráfica, un cuadrado de 50 píxeles de
lado. La posición de partida será el centro de la
pantalla.
para
cuadro
bp bl
av 50 gd
90
av 50 gd
90
av 50 gd
90
av 50 gd
90
fin
Ejercicio 18: chispa
El siguiente procedimiento, llamado
chispa,
dibuja una estrella mediante trazos:
para
chispa
bp
ponrumbo
0 sl av 10 bl av 40 sl centro
ponrumbo
45 sl av 10 bl av 40 sl centro
ponrumbo
90 sl av 10 bl av 40 sl centro
ponrumbo
135 sl av 10 bl av 40 sl centro
ponrumbo
180 sl av 10 bl av 40 sl centro
ponrumbo
-135 sl av 10 bl av 40 sl centro
ponrumbo
-90 sl av 10 bl av 40 sl centro
ponrumbo
-45 sl av 10 bl av 40 sl centro
ot
fin
Ejercicio 19: marco
Averigua las coordenadas de las cuatro esquinas
de tu pantalla, haciendo avances exploratorios con la tortuga. Cuando
conozcas dichas coordenadas, escribe un procedimiento, llamado
marco que
dibuje un marco rectangular alrededor de la pantalla.
Manejar el lápiz
Para hacer dibujos en la pantalla gráfica, manejamos el
lápiz virtual que está asociado a la tortuga. Hay un
grupo de primitivas básicas, dedicadas al manejo del
lápiz, que debes conocer:
PRIMITIVA
|
ABREVIADO |
ACCIÓN
|
| subelapiz |
sl
|
Levanta el lápiz
del papel y no
pinta al moverse
|
| bajalapiz |
bl
|
Baja el lápiz y
deja un trazo al moverse la
tortuga |
| poncolorlapiz
[RGB] |
poncl
[RGB]
|
Asigna al lápiz un
color
compuesto [rojo verde azul] |
| poncolorlapiz
nº |
poncl
nº |
Asigna al
lápiz el color número n de la tabla |
| pongrosor
[g g] |
pong
[g g]
|
El grosor del lápiz
es de g puntos de alto y de
ancho |
| poncolorpapel
[RGB] |
poncp
[RGB]
|
Establece el color del
fondo de la pantalla gráfica |
| poncolorrelleno
[r v a] |
poccr
[RGB]
|
Fija el color con el que
rellenará
figuras cerradas |
| goma |
|
Sustituye el lápiz
por una
goma que borra al desplazarse |
| ponlapiz |
pla
|
Deja la goma y vuelve a
coger el lápiz |
Ejercicio 20: marcas
Con el siguiente procedimiento, que llamaremos
marcas,
vamos a crear un logotipo compuesto por trazos de color
borrados parcialmente:
para
marcas
bp gd 90
sl
pongrosor
[15 15]
ponpos [0
15] bl poncl 4 av 120 sl
ponpos [0
45] bl poncl 1 av 120 sl
ponpos [0
75] bl poncl 2 av 120 sl
ponpos [0
105] bl poncl 6 av 120 sl
goma
pongrosor [8 8]
ponrumbo
180 sl
ponpos
[15 120] bl av 120 sl
ponpos
[45 120] bl av 120 sl
ponpos
[75 120] bl av 120 sl
ponpos
[105 120] bl av 120 sl
ponlapiz
sl
poncl 0
pongrosor [5 5]
ponpos
[-10 -10] ponrumbo 0 bl
av 140 gd
90 av 140 gd 90 av 140 gd 90 av 140
pongrosor
[0 0]
ot
fin
Repetición
| Para
evitar la escritura repetida de líneas de código
idénticas o muy parecidas, recurrimos a primitivas que indican
al ordenador cuántas
veces debe repetir
una instrucción |
Ejercicio 21: cuadro mejorado
Modifica el procedimiento
cuadro para
dibujar un
cuadrado de 50 píxeles de lado, utilizando muy pocas lineas de
código:
para
cuadro
bp
repite 4
[av 50 gd 90]
fin
Como ves en el ejemplo anterior, con la primitiva
repite se
consigue
reducir drásticamente el número de líneas de
código de tu programa.
La escritura de un
programa es más
clara y elegante cuanto menos lineas de código tiene.
Ejercicio 22: blonda
Con la técnica de la repetición
puedes hacer gráficos impactantes. Por ejemplo, el siguiente
procedimiento, llamado
blonda,
dibuja muchos cuadrados pero la tortuga
se desplaza y gira un poco cada vez que termina de dibujar uno de los
cuadrados.
Los efectos pueden ser sorprendentes, con sólo variar las cifras
de los desplazamientos y los giros.
Pruébalo
introduciendo
modificaciones en el siguiente código:
para
blonda
bp repite
12 [repite 40 [repite 4 [av 100 gd 90] gd 9] av 60 gi 30]
fin
Comentarios en el código
Completar
con comentarios las lineas de
código es una buena
idea. Los comentarios empiezan con el símbolo ; (punto y coma).
Todo lo que se escriba a continuación del punto y coma no se
ejecuta en el programa.
Gracias a los comentarios es más fácil recordar las ideas
que tuvimos al programar, y otro programador puede reparar o mejorar el
código de nuestro programa. |
Ejercicio 23: por mejorado
Por ejemplo, el procedimiento
por se
entendería mejor si el
código ejecutable estuviese complementado con comentarios como
estos:
para por
bp
haz
“numero1 15
;la primera variable toma el valor 15
haz
“numero2 68
;la segunda variable toma el valor 68
haz
“resultado :numero1 * :numero2 ;calculamos el producto
bp gd
90
;la tortuga en
el centro y horizontal
rotula
[15 x 68 = ]
;rotula los factores de la
operación
av
90
;se desplaza a la derecha del signo =
rotula
:resultado
;rotula el resultado
fin
Sangrado del código
|
Cuando una
línea contiene muchas instrucciones juntas resulta
difícil
comprender los efectos que producirá dicho código.
Sólo
se deben unir las instrucciones que forman una unidad funcional.
Además, para mejorar la lectura resulta muy útil
sangrar y alinear las lineas que corresponden al mismo bucle o
subrutina. |
En el procedimiento del ejercicio
anterior hay muchos corchetes que encierran partes que se ejecutan por
separado. Fíjate cómo mejora la lectura del código
si
utilizamos tabuladores para que cada sección del procedimiento
quede claramente separada:
para
blonda
bp
repite 12
[
;hace 12 veces
lo que sigue
repite 40 [
;hace 40 veces
lo que sigue
repite 4 [av 100 gd 90] gd
9] ;hace un
cuadrado y gira a la
derecha
av 60 gi 30]
;avanza y
gira a la izquierda
fin
Los colores
Los
colores de la pantalla y el lápiz, se fijan con las
órdenes poncp
y poncl seguidos
de un código de color.
Ese código del color puede ser un número,
entre 0 y 15,
de modo que cada número se corresponde con un color de la tabla
siguiente, por ejemplo: poncl 1 elige
el lápiz azul.
También se puede emplear un conjunto de tres
cifras entre
corchetes, entre
0 y 255, que se corresponden con la cantidad de luz
roja, verde y azul que compone el color deseado. Por ejemplo: poncp
[207 176 89] |
Tabla de colores
0
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
15
|
|
Ejercicio 24: hexa
Haz un procedimiento, llamado
hexa, que
dibuje un
hexágono de lado 120, con grosor 3 y de color marrón (8)
sobre fondo carmín (12).
para hexa
bp bl
poncp 12
;papel de color carmín
poncl 8
;lápiz marrón
pong [3 3]
;grosor
de 3 puntos
repite 6
[av 120 gd 60]
;dibuja un hexágono
ot
fin
23. Haz un procedimiento llamado dode que dibuje un
dodecágono de lado 40, con grosor 2 y de color azul (1) sobre
fondo amarillo (6)
para dode
bp bl
poncp 6 poncl 1 pong [2 2]
repite 12 [ av 40 gd 30]
ot
fin
Fíjate que, para dibujar cualquier polígono regular de 80
puntos de lado, el conjunto de órdenes es el mismo. La
única variación entre un polígono y otro es el
número de lados, que coincide con el número de
repeticiones, y el ángulo que debe girar la tortuga.
24. Toma una hoja de papel, copia la tabla siguiente
y rellena las celdas vacías con los valores adecuados:
Polígono Lados Orden que se
repite
Triángulo 3 repite 3 [av 80
gd 120]
Cuadrado 4 repite 4 [av 80 gd
90]
Pentágono 5
Hexágono 6
Heptágono 7
Octógono
Eneágono
Decágono
Icosígono
Rellenar de color
Las figuras creadas en el entorno gráfico pueden rellenarse de
color, utilizando la primitiva rellena. El color de relleno se
establece con la primitiva poncolorrelleno.
Para que el relleno funcione se deben cumplir algunos requisitos: la
figura debe estar cerrada, la tortuga debe situarse en el interior de
dicha figura y el lápiz debe estar levantado con la primitiva
subelápiz sl.
25. Por ejemplo: vamos a modificar el procedimiento
cuadro para que el cuadrado que resulta quede relleno de color.
para cuadro
bp bl
poncp 14
;el papel será de color
naranja
poncl 0
;el
lápiz pintará en negro
poncolorrelleno 10
;el relleno será verde oscuro
repite 4 [ av 80 gd 90] ;dibuja un
cuadrado
sl gd 45 av 3
;levanta el lápiz y se mete dentro del
cuadrado
rellena
;rellena de
color
ot
fin
Procedimientos con parámetros
Se puede escribir un procedimiento de tal manera que se ejecute con el
valor de la variable que acompaña al nombre del procedimiento.
Una variable permite guardar un valor, tanto numérico como de
texto. En cualquier momento se puede tomar el contenido de esa variable
o cambiarlo por otro nuevo. Cuando damos un valor a una variable que ya
existía, el valor antiguo se pierde.
26. Escribe un procedimiento capaz de dibujar un
cuadrado cualquiera. El tamaño del cuadrado se
especificará mediante la variable lado que
acompañará al nombre del procedimiento cuando lo invoques.
para cuadro :lado
bp
repite 4 [av :lado gd 90]
fin
Ahora invócalo para que dibuje un cuadrado de lado 100,
tecleando cuadro 100. Prueba también a teclear cuadro 20, cuadro
78 o cuadro 35. ¿Lo ves?. Te obedece.
27. Piensa: ¿Sería posible construir un
único procedimiento, que fuese capaz de dibujar cualquier
polígono regular? Si, porque el ángulo que debe girar la
tortuga puede deducirse fácilmente a partir del número de
lados del polígono.
28. Escribe un procedimiento, de nombre poli seguido
de la variable lados, que dibuje un polígono regular de 80
puntos de lado, con el número de lados indicado en la variable
lados
para poli :lados
bp bl
poncp 12 poncl 8 pong [3 3] ;fija
los colores y el grosor del lápiz
haz “angulo 360/:lados
;calcula el ángulo de giro en cada
vértice
repite :lados [av 80 gd :angulo]
;dibuja el polígono
ot
fin
29. Modifica el procedimiento poli para que admita
dos parámetros: el número de lados y la longitud de esos
lados
para poli :lados :longitud
bp bl
poncp 12 poncl 0 pong [3 3]
haz “angulo 360/:lados
repite :lados [av :longitud gd :angulo]
ot
fin
Para probarlo, escribe en la línea de órdenes el
polígono que quieres que dibuje. Por ejemplo, si le ordenas poli
5 90 deberá dibujar un pentágono cuyos lados miden 90
puntos.
30. Y, si somos capaces de dibujar un polígono
cualquiera, ¿podremos dibujar un círculo?. Escribe un
procedimiento, llamado aro, capaz de dibujar un círculo del
radio que se le indique.
para aro :radio
haz "avance :radio*tan 1
repite 360 [av :avance gd 1]
fin
Primitivas circulo, arcodeelipse
Afortunadamente, hay primitivas que dibujan un círculo de una
forma más sencilla, como la primitiva
circulo,
cuya sintaxis es así:
circulo
r
donde
r es el radio del
círculo,
cuyo centro estará en el centro de la tortuga. Así
pues, para dibujar un círculo cuyo radio es 75, bastará
escribir la orden:
circulo 75
También puedes utilizar la primitiva
arcodeelipse,
cuya función es dibujar arcos de elipse y su sintaxis es como
sigue:
arcodeelipse angulo
mayor menor inicial
donde
angulo es el ángulo
recorrido por el arco,
mayor es
la longitud del eje semiejemayor de la elipse,
menor
es la longitud del semieje menor e
inicial
es el ángulo o rumbo desde el que empieza el arco. Para
dibujar el mismo círculo de 75 de radio, bastará con
escribir:
arcodeelipse
360 75 75 0
31. Ahora, para practicar la programación de
reiteraciones con parámetros, modifica el procedimiento trazos
para crear otro procedimiento llamado trazo :longitud, que dibuje en la
pantalla una línea de trazos, de longitud ajustable, que ocupe
toda la pantalla.
Redacta un programa con el menor número posible de líneas
de código, utilizando la repetición de una única
orden. El procedimiento debería tener un aspecto como este:
para trazo :longitud
...
fin
Uso de procedimientos como primitivas
Un procedimiento creado con primitivas u otros procedimientos, puede
ser utilizado como una primitiva más del lenguaje.
32. Haz un procedimiento, llamado penta, que dibuje
en la pantalla gráfica un pentágono de cualquier longitud
de lado. Posteriormente utiliza ese procedimiento ya creado, en uno
nuevo que dibuje seis pentágonos, unidos entre sí por un
vértice y formando una estrella.
para penta :lado
repite 5 [av :lado gd 72]
fin
para estrella :lado
bp bl
poncp 10 poncl 0 pong [3 3]
repite 6 [penta :lado gd 60]
ot
fin
Fíjate que, en el código del procedimiento estrella
aparece una llamada al procedimiento penta :lado, ¡como si fuese
una primitiva más del lenguaje!
33. Guarda este gráfico, creado con MSWLogo,
en una carpeta de tu disco duro con formato de mapa de bits .bmp. Para
ello abre el menú
bitmap → Guardar como... → Estrellapenta
34. Ábrelo con un editor de imágenes,
como Gimp o Pixia, y comprobarás que puedes trabajar con
él y exportarlo a otro formato. Insértalo también
en un documento de texto como OpenOffice Writer.
35. Escribe un procedimiento, llamado figura, que
dibuje una figura compuesta por un cuadrado, de lado cualquiera, que
tiene un triángulo equilátero en cada uno de sus lados,
como el de la siguiente ilustración:
Figura
36. Aprovechando el procedimiento aro :radio que ya
tienes creado, escribe un procedimiento llamado donut :radio que dibuje
círculos consecutivos, pero de forma que cada vez que empieza a
dibujar un círculo nuevo lo haga desviándose un cierto
ángulo respecto al anterior, para llegar a formar una corona con
aspecto de rosquilla como la de la ilustración siguiente:
Figura donut
Cuando veas aparecer el donut ante tus ojos podrás comprender,
quizá, qué es la programación elegante: conseguir
un resultado espectacular con muy pocas líneas de código.
37. ¿Podrías dibujar una flor? Un
método sencillo podría consistir en dibujar cada
pétalo con un cuarto de círculo hecho con varios
segmentos. Por ejemplo:
para cuarto :paso
repite 9 [av :paso gd 10]
fin
Dibujar un pétalo es fácil, con dos cuartos de
círculo:
para petalo :paso
repite 2 [cuarto :paso gd 90]
fin
38. Ahora te toca a ti lo más fácil:
escribe un procedimiento, llamado flor que sea capaz de dibujar una
flor compuesta de varios pétalos, como esta:
Figura flor
39. Ahora, utilizando repeticiones de procedimientos,
experimenta a tu aire creando imágenes hechas con figuras
sencillas (polígonos simples, círculos, etc.), que
vuelven a dibujarse una y otra vez, tras desplazamientos y giros de la
tortuga.
Estructuras de datos
A veces, manejamos muchos datos y variables en un programa. Los
programadores suelen agrupar los datos y variables formando
estructuras regulares, tales como matrices, listas, frases o palabras.
Estas estructuras nos permiten manejar, de forma racional y ordenada,
grupos de caracteres o grupos de datos para utilizarlos como variables
en nuestros programas.
Una lista es una entidad compuesta por una sucesión de datos,
que pueden ser letras, palabras completas, variables o números.
Para referirnos a uno de los elementos de una lista bastaría con
utilizar el índice que señala al elemento.
Una matriz es una entidad que organiza los datos en filas y columnas.
De este modo, para referirnos a un dato de una matriz bastaría
con citar los índices que señalan a la fila y la columna
en la que se encuentra dicho dato.
Primitiva lista
La primitiva lista crea una lista cuyos elementos son los datos que se
declaran. Por ejemplo:
escribe (lista “Zaragoza “Toledo “León “Huelva)
hará que aparezca Zaragoza Toledo León
Huelva en la ventana de textos
rotula lista [2 3 7 9] [rojo negro]
hará que aparezca [2 3 7 9] [rojo negro] en
la pantalla gráfica
haz “k -240
haz “w 110
ponpos (lista :k :w)
desplazará la tortuga hasta las coordenadas
-240 110
40. Al presentar datos en pantalla
comprenderás la utilidad práctica de las listas. Por
ejemplo, escribe un procedimiento, llamado sumar, que nos pida dos
números y nos devuelva el resultado de sumarlos en la ventana de
gráficos.
para sumar
bp gd 90 ot sl bt
; inicializa las pantallas
ponpos [-200 0]
; sitúa
el puntero
rotula [¿Qué números quieres sumar?]
haz "num1 leepalabra
; pide al
usuario el primer número
haz "num2 leepalabra
; pide y
captura el segundo número
bp gd 90
; limpia la pantalla
ponpos [-200 0]
; sitúa
el puntero al comienzo
rotula [LA SUMA DE ]
ponpos [-85 0]
; de cada uno de los
rotula :num1
ponpos [-45 0]
; fragmentos del mensaje
rotula [+]
ponpos [-30 0]
; de salida
rotula :num2
ponpos [10 0]
rotula [= ]
ponpos [30 0]
rotula :num1 + :num2
; calcula la
suma y la presenta
fin
Observa que, si introduces números largos, se producen problemas
al rotular cada una de las partes del mensaje de salida.
41. Si quieres que la presentación del
resultado sea más elegante, en una sola línea de
código y sin tener que preocuparte de cuánto espacio
necesitas para cada cifra, puedes conseguirlo utilizando la primitiva
lista. El procedimiento sumar quedaría así:
para sumar
bp gd 90 ot sl bt
ponpos [-200 0]
rotula [¿Qué números quieres sumar?]
haz "num1 leepalabra
haz "num2 leepalabra
bp gd 90
ponpos [-200 0]
rotula (lista "La "suma "de :num1 "+ :num2 "= :num1+:num2)
fin
En una única línea de código hemos resuelto la
presentación. Mucho más elegante, ¿no es cierto?
Pruébalo introduciendo números muy largos o muy cortos.
Primitiva leelista
La primitiva leelista presenta una ventana de entrada de datos en
pantalla y construye una lista con los caracteres tecleados por el
usuario en su terminal. Por ejemplo:
rotula leelista
rotulará en la pantalla cualquier texto que
teclees en la ventana de entrada
haz "k leelista
escribe elemento 2 :k
escribirá en la ventana de textos la segunda
de las palabras tecleadas
42. Por ejemplo; hagamos un procedimiento llamado
identidad, capaz de preguntarte tu nombre y luego saludarte
escribiéndolo en la pantalla.
para identidad
bp gd 90 ot sl bt
rotula [¿Cuál es tu nombre y apellidos?]
haz "napel leelista
bp gd 90
rotula (lista “¡Hola! :napel)
fin
43. Escribe un procedimiento llamado pesetas capaz de
convertir euros a pesetas y que presente el resultado sin espacios
superfluos
para pesetas
bp gd 90 sl ot
ponpos [-200 0]
rotula [¿De cuántos euros se trata?]
haz “euros leelista
haz “pesetas :euros *166.386
bp gd 90
ponpos [-200 0] rotula (lista :euros “Euros “son: :pesetas “Pesetas.]
fin
Primitivas elemento, ponelemento, primero
Los elementos de una lista pueden seleccionarse citando el
índice, como vimos en la sintaxis de la primitiva lista.
También pueden modificarse utilizando el índice. Por
ejemplo;
haz “ww lista (“verde “azul “sepia “morado)
rotula elemento 3 :ww
rotulará la palabra sepia en la pantalla
gráfica
haz “ww lista (“verde “azul “sepia “morado)
ponelemento 3 :ww “amarillo
escribe :ww
escribirá verde azul amarillo morado en la
ventana de textos
haz “ww lista (“verde “azul “sepia “morado)
rotula primero :ww
rotulará la palabra verde en la pantalla
gráfica
44. Haz un procedimiento, llamado nombre, que
pregunte su nombre de pila al usuario, lo guarde en una variable, y lo
rotule en la pantalla con el formato TU NOMBRE ES: nombre.
para nombre
bp sl ot gd 90
; prepara la pantalla
rotula [¿Cómo te llamas?]
haz "name primero leelista
; toma la primera palabra tecleada
bp gd 90
; limpia la pantalla
rotula (lista “¡Hola!, :name “¿Qué tal
estás?)
fin
Primitivas palabra y frase
Una palabra es una lista de caracteres. Puede construirse desde
un programa o solicitárselas al usuario desde el teclado. Una
frase, por su parte, es una lista de palabras.
Las palabras y las frases se manejan, por tanto, como una lista
cualquiera, cuyos elementos pueden seleccionarse y modificarse.
palabra dato1 dato2 dato3 ... ;forma una palabra con
los datos indicados
frase palabra1 palabra2 ... ;forma
una frase con las palabras indicadas
elemento indice objeto ;devuelve
el carácter, o la palabra, que ocupa la posición del
índice
45. Por ejemplo, podemos componer el código de
un procesador, por ejemplo, uniendo en una palabra la marca, el modelo
y la velocidad:
para codigo
bp gd 90 ot
haz "numserie (palabra "Intel- "PIV "- "3,2 "Ghz)
;construye la palabra
rotula :numserie
;escribe la palabra
fin
La primitiva palabra ignora los espacios, que nunca pueden formar parte
de una palabra.
46. Ahora modificaremos el anterior procedimiento,
añadiendo una instrucción que extrae algunos elementos de
una palabra y los escribe en la ventana de textos:
para codigo
bp gd 90 ot
haz "numserie (palabra "Intel- "PIV "- "3,2 "Ghz)
;construye la palabra
rotula :numserie
;escribe la palabra
haz “j elemento 7 :numserie
;toma tres
letras de la palabra
haz “k elemento 8 :numserie
haz “m elemento 9 :numserie
haz “tipo (palabra :j :k :m)
;construye una
nueva palabra
escribe (lista “microprocesador :tipo)
;la escribe en los textos
fin
47. Haz un procedimiento con el nombre inicial, que
pregunte tu nombre y responda cuál es la letra inicial de tu
nombre.
para inicial
bp ot sl gd 90
rotula [¿Cuál es tu nombre?]
haz "letra primero leepalabra
bp gd 90
ponpos [-100 0]
rotula [Tu nombre empieza por ]
ponpos [125 0]
rotula :letra
fin
Cálculos matemáticos
Primitivas entero, redondea y raizcuadrada
48. Haz un procedimiento que nos pida un
número con decimales y nos devuelva la parte entera del mismo,
el número redondeado y su raíz cuadrada, en la ventana de
trabajo.
para numeros
bt
escribe [ESCRIBE UN NUMERO CON DECIMALES]
haz "valor leepalabra
escribe (lista "NUMERO "SOLICITADO: :valor)
escribe (lista "LA "PARTE "ENTERA "ES: entero :valor)
escribe (lista "SU "VALOR "REDONDEADO "ES: redondea :valor)
escribe (lista "SU "RAIZ "CUADRADA "ES: rc :valor)
fin
Primitivas azar, resto y muestra
49. Haz un procedimiento, llamado loteria, que genere
dos números aleatorios entre el 0 y el 255 y los muestre en la
ventana de trabajo. Además devolverá el resultado de
dividir el primero entre el segundo, y su resto.
para loteria
bt
;borra la pantalla de trabajo
haz "num1 azar 255
;genera al azar dos números menores que 255
haz "num2 azar 255
escribe (lista "Primer "número "aleatorio: :num1)
escribe (lista "Segundo "número "aleatorio: :num2)
escribe (lista "Su "cociente "es: :num1/:num2)
escribe (lista "Y "queda "un "resto "de: resto :num1 :num2)
fin
50. Escribe un procedimiento, llamado num10, que sea
capaz de escribir 6 números aleatorios entre 0 y 10.
para num10
bt
repite 6 [muestra azar 11]
fin
51. Ahora escribe un procedimiento, al que llamaremos
num25, que escriba ocho cifras elegidas al azar entre el 2 y el 5. Las
cifras no deben ser menores que 2 ni mayores que 6
para num25
bt
repite 8 [haz "num1 azar 4
escribe :num1+2]
fin
52. Finalmente, te voy a presentar un procedimiento,
que he llamado multistar, que dibuja estrellas al azar en la pantalla:
para multistar
bp
poncp [20 9 60]
;Sobre un
fondo azul oscuro
repite 100 [
haz "lado azar 40
;Sortea el tamaño de la estrella < 40
haz "x -450 + azar 900
;Sortea la
coordenada x
haz "y -300 + azar 600
;Sortea la
coordenada y
poncl azar 15
;Sortea el color del lápiz
sl ponpos (lista :x :y) gd :y bl
;Colócate en la posición de dibujo
repite 5 [av :lado gd
144]] ;Dibuja una estrella
ot
;Oculta la tortuga
fin
¡Qué bonito! Lee atentamente el código de las
líneas en las que se fijan las coordenadas en las que
dibujará una estrella y trata de comprender por qué las
he escrito así.
Primitivas sen, cos y tan
53. Haz un procedimiento, con el nombre de trigo, que
nos pida el valor de un ángulo y nos devuelva el seno, el coseno
y la tangente en la ventana de trabajo.
para trigo
bt
haz "valor leepalabra
escribe (lista “Ángulo: :valor “grados)
escribe (lista “Su “seno “es: sen :valor)
escribe (lista “Su “coseno: cos :valor)
escribe (lista “Y “su “tangente: tan :valor)
fin
54. Ahora tú solo: escribe un procedimiento,
llamado senoide :pico, capaz de dibujar en la pantalla la
función y = Vmax *·sen x dándole el valor
máximo de la función :pico
Figura senoide
Procedimientos recursivos
A veces nos puede interesar que un procedimiento se repita una y otra
vez. Podemos ordenar que se repita un número determinado de
veces, como ya has visto. También podemos hacer que se repita
indefinidamente, incluyendo una línea de código, antes
del comando fin que vuelve a llamar al propio procedimiento para que
vuelve a empezar. En este caso, el procedimiento necesitan una orden
alto para detenerse.
Auto llamada
55. En el siguiente ejemplo, haremos un procedimiento
que se llama a si mismo: el procedimiento al que llamaremos zigzag,
dibujará una línea en zigzag, indefinidamente:
para zigzag
ponrumbo 45
;orienta la tortuga en diagonal
av 150 gd 90
;traza un segmento y gira a la derecha
av 150 gi 90
;traza otro segmento y gira a la izquierda
espera 2
;espera un poco
zigzag
;se llama a si mismo
fin
¿Qué pasaría si el segmento de subida del zigzag
fuese más largo o más corto que el flanco de bajada?
Compruébalo.
¿Qué pasaría si incluimos una orden de borrar
pantalla en el código de este procedimiento?
Uso de contadores
56. Con el código del siguiente procedimiento,
llamado filigrana, el ordenador dibujará 200 pentágonos.
Pero cada vez lo hará en un lugar distinto y con una
orientación inicial distinta. Para ello utilizaremos una
variable “k que irá contando. Cada vez que dibuje uno de esos
pentágonos, cambiaremos el valor de dicho contador en una
cantidad fija.
para filigrana
haz "k 1.5
;inicia un
contador
repite 200[
bl
repite 5 [av 50 gd 72]
;dibuja un pentágono
sl gi :k*3 av :k+12
;cambia la posición de la
tortuga
haz "k :k+1]
;incrementa el contador
fin
57. En este otro ejercicio, llamado espiral,
utilizaremos un contador llamado “r que iremos incrementando
geométricamente, multiplicándolo por una cantidad fija.
De este modo dibujaremos una espiral, mediante arcos de circunferencia
que van aumentando su radio progresivamente.
para arco :r
;dibuja un arco de circunferencia
haz "step :r*tan 1 ;calcula el
lado de un polígono de 360 lados
repite 90 [
av :step gd 1]
;dibuja un lado
fin
para espiral
;para dibujar una espiral
bp ot
;limpia la pantalla
haz "r 2
;empezamos fijando un arco pequeño
repite 22 [
;para dar varias vueltas completas
arco :r
;dibuja un arco
haz "r :r*1.28]
;aumenta el radio 1,28 veces
fin
Manejo del tiempo
Primitiva espera
Podemos conseguir que el procesador haga una pausa, con la primitiva
espera, antes de ejecutar la siguiente instrucción. La primitiva
espera detiene la ejecución del programa durante un lapso de
tiempo que se especificará en 1/60 de segundo. Así, por
ejemplo:
espera 120 ;detiene el programa
durante 2 segundos
58. Por ejemplo, escribe un procedimiento llamado num
:bajo :alto, que muestre una vez cada segundo un número elegido
al azar, entre dos cifras límite.
para num :bajo :alto
bt
haz "lapso :alto-:bajo
haz "num1 azar :lapso+1
escribe :bajo+:num1
espera 60
num :bajo :alto
fin
Puedes detener la ejecución del procedimiento tecleando Alto en
la botonera del área de comandos.
Primitiva horamili
La primitiva horamili lee en los registros de Windows y averigua
cuánto tiempo ha estado encendido el ordenador y lo
expresará en milisegundos.
59. Una aplicación práctica de la
primitiva horamili es la medida del tiempo que tarda en ejecutarse un
programa. El procedimiento siguiente cronometrará cuánto
tarda en ejecutarse un dibujo compuesto por 60 elipses:
para crono
bp ot
haz "start horamili
repite 60 [elipse 50 220 gd 6]
haz "tiempo horamili-:start
escribe (lista :tiempo "milisegundos)
fin
¿Cuánto tiempo tardará en dibujar 120 elipses, el
doble? Haz la prueba.
¿Cuánto tiempo tardará en dibujar elipses
más grandes o más pequeñas? Compruébalo.
Primitiva hora
Esta primitiva lee en los registros de Windows y devuelve la hora
actual del sistema, como una lista de palabras. Por ejemplo:
escribe hora ;escribe en la ventana de textos algo
así: Wed May 10 13:31:16 2006
;el formato es anglosajón: Semana Mes Dia
Hora Año
60. Ahora te toca a ti: escribe un procedimiento
llamado clock que rotule en la pantalla gráfica, centrado y con
un tamaño grande, qué hora es:
Figura Reloj digital
Control de la ejecución con el teclado
Imagina que quieres que un programa se esté ejecutando
indefinidamente, hasta que el usuario pulse una tecla del teclado. Un
modo de conseguirlo sería con un procedimiento de control, que
activase la parada del siguiente modo:
para control
ponfoco [pantalla de mswlogo]
ponteclado [parada]
instrucciones del programa
fin
La primitiva ponfoco permite a Logo tomar el control de la ventana que
tiene el foco.
La primitiva ponteclado permite capturar eventos ocurridos en el
teclado.
61. Por ejemplo, con el siguiente procedimiento,
llamado lunares, se desarrollará un programa que dibujará
círculos de color aleatorio, en una posición aleatoria de
la pantalla, hasta que el operador lo detenga pulsando en cualquier
tecla del teclado:
para lunares
bp ot poncp 0
;prepara la
pantalla
ponfoco [pantalla de mswlogo] ;pone el foco en la
pantalla
ponteclado [parada]
;un evento en el teclado detiene
el programa
discos
;llama al procedimiento discos
fin
para discos
repite siempre [
haz "x -500 + azar 900
;elige coordenadas al azar
haz "y -350 + azar 700
sl ponpos (lista :x :y) bl
;sitúa la tortuga en las coordenadas
haz "radio 10+azar 30
;elige el radio al azar
haz "color azar 16
;elige un color al azar
poncl :color poccr :color
circulo :radio rellena
;dibuja un círculo y lo rellena
espera 3]
;una pequeña pausa
fin
Debes comprobar que la ejecución del programa se detiene
pulsando en cualquier tecla del teclado.
62. Ahora te toca a ti: escribe un procedimiento
llamado semana capaz de rotular en pantalla, uno tras otro, los
días de la semana (lunes, martes, miércoles, etc.) en un
bucle que no se detiene hasta que el usuario pulse una tecla en el
teclado:
Figura semana
Código ASCII
El código ASCII establece la equivalencia entre cada uno de los
símbolos de texto que pueden introducirse en el teclado, y un
valor numérico binario de 8 bits (1 byte).
A la letra "A", por ejemplo, le corresponde el número 65 en
binario determinado, a la "z" le corresponde el número 122, y
así sucesivamente. También están incluidos los
símbolos gráficos y los comandos no imprimibles, como el
espacio o el retorno de carro.
Primitivas ascii y caracter.
63. Haz un procedimiento llamado tabasci, que genere
una tabla entre el 0 y el 255 en la que aparezca el valor decimal y su
correspondiente código ASCII. Se mostrará en la ventana
de trabajo.
para tabasci
bt
; Borra la
pantalla de trabajo
haz "x 0
; Crea un contador y lo pone a 0
repite 256 [escribe (lista :x caracter :x) ; Escribe
un número y el carácter
haz "x :x+1]
; equivalente
en ascii
fin
64. ¿Te sientes capaz de escribir un
procedimiento, llamado tabasci2 que, en lugar de escribir los
caracteres ASCII en una sola columna en el cuadro de texto, los
presente rotulados en la pantalla gráfica en forma de tabla?
Inténtalo
a)
65. Escribe ahora un procedimiento que nos pida una
letra y devuelva su código ASCII en la pantalla.
para traduce
bt
; borra la
ventana de textos
escribe [INTRODUCE UNA LETRA EN LA VENTANA]
haz "valor leepalabra
bt
escribe (lista "LETRA: :valor)
escribe (lista "Su "valor "ASCII "es: ascii :valor)
fin
Ejecución secuencial y ejecución condicionada.
En algunos casos, para escribir el código de un programa, basta
con escribir una serie ordenada de primitivas, que se ejecutarán
una detrás de otra (ejecución secuencial).
Pero es frecuente también que en un programa haya que ejecutar
unas primitivas u otras en función de alguna condición.
De esta forma la ejecución del programa se ramificará por
unas primitivas u otras, según se vayan dando determinadas
condiciones (su ejecución está condicionada).
Primitivas si y sisino
La primitiva si permite ordenar al programa que ejecute una
acción, en función de que una condición se cumpla
o no. La sintaxis de la primitiva si es la siguiente:
si condición accion
Si la condición es verdadera ejecuta la acción. Si la
condición es falsa no hace nada y pasa a la instrucción
siguiente. Por ejemplo:
si 1>0 escribe “cierto hará que el programa
escriba la palabra cierto
66. Por ejemplo: escribe un procedimiento llamado
numpos que nos pida un número. Si el número que
introducimos es positivo se mostrará su raíz cuadrada. Si
es negativo no debe calcularlo, ya que daría un error.
para numpos
bt
escribe [INTRODUCE UN NÚMERO EN LA VENTANA]
haz "valor leepalabra
bt
escribe (lista "El "número "es: :valor)
si :valor>0 [escribe (lista "Su "raiz "cuadrada "es: rc
:valor)]
fin
La primitiva si también permite ordenar al programa que ejecute
una acción u otra, en función de que una condición
se cumpla o no. En este caso, la sintaxis de la primitiva si es la
siguiente:
si condición [accion1] [accion2]
Si la condición es verdadera ejecutará la acción1.
Si la condición es falsa ejecutará la acción 2.
67. Por ejemplo: escribe un procedimiento, llamado
posneg, que nos pida un número. Si el número que
introducimos es positivo se mostrará su raíz cuadrada. Si
es negativo se escribirá un mensaje que diga "NO SE PUEDE
CALCULAR LA RAIZ DE UN NEGATIVO".
para posneg
bt
escribe [INTRODUCE UN NÚMERO EN LA VENTANA]
haz "valor leepalabra
bt
escribe (lista "El "número "es: :valor)
si :valor>0 [escribe (lista "Su "raiz "cuadrada "es: rc
:valor)] [escribe (lista "No "tiene "raiz, "es "un "número
"negativo)]
fin
La sintaxis de la primitiva si exige que las dos acciones estén
en la misma línea de código. Hay una primitiva que se
comporta de un modo semejante: se llama sisino. Su sintaxis es similar:
sisino condición [accion1] [accion2]
68. Escribe un procedimiento, llamado santiago, que
formule una pregunta y que informe si la respuesta es correcta o no lo
es. No olvides escribir todas las acciones en la misma línea:
para santiago
bt bp sl ot gd 90 poncp 14
ponpos [-50 100]
rotula [¿De qué color es el caballo blanco de Santiago?]
haz "respuesta leepalabra
limpia ponpos [-50 100]
sisino :respuesta="blanco [rotula (lista "¡!Muy "bien!!
"¡Acertaste! " "Es "blanco)] [rotula (lista
"¡¡Cuánto "lo "siento!! "Fallaste. " "No "es
:respuesta)]
fin
69. Ahora, y para terminar con las prácticas
de ejecución condicionada, escribe un procedimiento llamado
elegir que te ofrezca la posibilidad de elegir entre cuatro tareas
distintas. Por ejemplo, que te pregunte qué tipo de figura
quieres que dibuje:
b) Un cuadrado rojo
c) Un círculo azul
d) Un triángulo amarillo
e) Un pentágono blanco
Si respondes a dibujará un cuadrado rojo; si tecleas b
deberá dibujar un círculo azul, y así
sucesivamente. Si tecleas cualquier otra tecla por error te lo debe
advertir y negarse a hacer ninguna de las cuatro tareas previstas.
Procura que las figuras sean de tamaño semejante, rellenas de
color y sobre un fondo del mismo color.
Concepto de bucle en un programa
Un bucle es una subrutina de un programa, que se ejecuta repetidamente
un número determinado de veces o hasta que se cumple una
condición fijada de antemano.
Primitivas mientras y hasta
Hay dos primitivas, llamadas mientras y hasta, que permiten la
ejecución repetida de un bucle del programa mientras una
expresión sea cierta o hasta que una expresión sea
cierta. Su sintaxis es como sigue:
mientras [expresión] [lista de instrucciones a ejecutar]
hasta [expresión] [lista de instrucciones a ejecutar]
La primitiva hasta ejecutará repetidamente la lista de
instrucciones establecida tantas veces como haga falta, hasta que la
expresión tenga el valor cierto. En cambio, la primitiva
mientras ejecutará repetidamente la lista de instrucciones
establecida tantas veces como haga falta, hasta que la expresión
tenga el valor falso.
Lo primero que hacen ambas primitivas es evaluar si la expresión
da como resultado cierto o falso, por lo que las instrucciones de la
lista podrían no ejecutarse nunca si la primera
evaluación de la expresión arrojase como resultado falso
(en la primitiva mientras) o cierto (en la primitiva hasta).
70. Por ejemplo, haz un procedimiento, llamado
tablamul, que genere un número aleatorio entre el 0 y el 30. Una
vez elegido ese número, el programa debe presentarlo en la
pantalla y, además, presentará en la ventana de texto la
tabla de multiplicar por 7, desde el 0 hasta el número generado
al azar.
para tablamul
bp bt gd 90 sl ot
haz "num azar 30
;elige un
número al azar menor que 30
rotula (lista "Número "elegido: :num)
escribe (lista "TABLA "DEL "SIETE "DE "0 "A :num)
escribe [ ]
;línea en blanco
haz "contador 0
;inicializa un contador
mientras [:contador<:num+1] [escribe (lista :contador "x "7 "=
:contador * 7)
haz "contador :contador + 1]
fin
71. Para redundar en la ejecución de tareas
hasta que se cumpla una condición, vamos a hacer un
procedimiento, llamado tablatrigo, que calcule los valores del seno y
el coseno de un ángulo, desde 0 a 120 grados, y los presente en
la pantalla en forma de tabla ordenada.
para tablatrigo
bp gd 90 sl ot
poncp [245 196 127]
haz "angulo 0
haz "x -400
haz "y 300
hasta [:angulo>120] [
ponpos (lista :x :y) rotula (lista "Ángulo:
:angulo)
ponpos (lista :x+150 :y) rotula (lista "Seno: sen
:angulo)
ponpos (lista :x+450 :y) rotula (lista "Coseno: cos
:angulo)
haz "angulo :angulo+5 haz "y :y-20]
fin
Es posible que tengas que retocar las coordenadas iniciales “x e “y
para que la tabla quede correctamente centrada en tu pantalla.
Primitiva haz.mientras
La primitiva haz.mientras ejecutará repetidamente un conjunto de
instrucciones y lo hará tantas veces como una condición
lógica permanezca con valor CIERTO. Primero ejecuta las
instrucciones y luego evalúa la condición, por lo que las
instrucciones se ejecutarán al menos una vez. La sintaxis de
esta primitiva es como sigue:
haz.mientras [conjunto de instrucciones] [condición a evaluar]
72. Por ejemplo, el siguiente procedimiento, llamado
crece, dibujará polígonos con más lados cada vez,
y seguirá dibujando mientras el número de lados sea
inferior a un valor que hemos fijado en 14, pero que tú puedes
variar a tu gusto:
para poli :lados
bp
poncl :lados
;cada polígono será de un color
repite :lados [
av 800/:lados gd 360/:lados]
;dibuja un polígono
fin
para crece
ot
haz "lados 2
;inicia el contador
poniéndolo a 2
pongrosor [3 3]
;elige un grosor bien visible
poncp [20 40 90]
;papel azul oscuro
haz.mientras [
haz "lados :lados + 1
;incrementa el contador
poli :lados
;dibuja un
polígono
escribe :lados
;escribe el número de lados
espera 30] [:lados<14]
;espera un poco y evalúa la condición
gd 90 sl ponpos [110 50] ;se
sitúa en el centro del último polígono
rotula "FIN
;anuncia que
ha terminado
bl pongrosor [0 0]
;recompone valores para no
afectar a otros
fin
73. Otro ejemplo de haz.mientras: escribe un
procedimiento, llamado multipi, que genere la lista de múltiplos
de π (3,141592), comprendidos entre el 0 y el 150, con una
precisión de tres decimales. La serie de números debe
aparecer en la ventana de texto con una cadencia de 0,5 segundos entre
cada número presentado.
para multipi
bt
escribe [MÚLTIPLOS DE PI 0<n<150]
escribe [ ]
haz "num 0
haz.mientras [escribe formatonumero :num 7 3 haz "num :num +
3.141592654 espera 30] [:num<150]
fin
Primitiva haz.hasta
Esta primitiva es semejante a la anterior. Ejecutará
repetidamente un conjunto de instrucciones y lo hará tantas
veces como la condición lógica especificada permanezca
con valor FALSO. Primero ejecutará las instrucciones y luego
evaluará si sigue sin cumplirse la condición, por lo que
las instrucciones se ejecutarán al menos una vez. La sintaxis de
esta primitiva es como sigue:
haz.hasta [conjunto de instrucciones] [condición a evaluar]
74. Para poner un ejemplo, veamos el siguiente
procedimiento cuenta30, que cuenta de cero a treinta, utilizando la
primitiva haz.hasta:
para cuenta30
bp sl gd 90 ot
;inicia la tortuga
poncp [40 10 90] poncl [220 200 80] ;elige los colores
pontamañotipo [[Times New Roman] ;tipo de
letra Times
400 200
;tamaño
de letra muy grande
0 400 0 0 0 0 3 2 1 18]
;otros datos
del tipo de letra
ponpos [-100 200]
;esquina superior del primer número
haz "k 0
;inicia el
contador k
haz.hasta [
sisino :k<10 [ponpos [-115 200]] [ponpos [-230
200]]
rotula :k
;rotula el
valor del contador
espera 40
;espera algo
más de medio segundo
haz "k :k+1
;incrementa el contador
bp gd 90] [:k>30]
;limpia la pantalla
ponpos [-400 200]
;posición idónea para el cartel de FIN
rotula "FIN
fin
Primitiva formatonumero
Cuando hay que fijar el tamaño y la forma de presentación
de una cifra numérica, recurriremos a la primitiva
formatonumero. Esta primitiva entrega una palabra con una
representación del número que se quiere presentar, con un
tamaño mínimo de caracteres y un número de
dígitos de precisión después del punto decimal. La
sintaxis es como sigue:
formatonúmero número tamaño precisión
número es la cifra que hay que presentar
tamaño indica el número mínimo de caracteres que
tendrá la palabra, incluyendo los dígitos de
precisión especificados. Si fuese necesario,
añadirá espacios en blanco delante de la cifra para
alcanzar el tamaño de palabra indicado.
precisión indica el número de cifras decimales
después del punto
75. Para poner un ejemplo, hagamos un procedimiento
llamado formato203 que genere una lista de números entre el 5,00
y el 15,00 con dos decimales y con un incremento entre ellos de 0,03.
para formato203
bt
escribe [NÚMEROS DE 5 A 15]
escribe [INCREMENTO: 0.03]
escribe [ ]
haz "num1 5.00
haz.hasta [escribe formatonumero :num1 5 2 haz "num1 :num1+0.03][:num1
> 15]
fin
Operaciones lógicas
Primitivas lógicas o, no, y, bity, bito y bitinverso
Naturalmente, un lenguaje de programación debe servir para
manejar funciones lógicas básicas: Y, O, OEXCLUSIVA, etc.
La función lógica y evalúa varias expresiones.
Devuelve el valor cierto si todas las expresiones evaluadas tienen el
valor cierto y devuelve el valor falso si alguna de las expresiones es
falsa. Su sintaxis es como sigue:
y expresion1 expresion2
si debe evaluar 2 expresiones
(y expresion1 expresion2 expresion3 ...)
si debe evaluar más de 2 expresiones
76. Por ejemplo: escribe un procedimiento llamado
logica, que nos pida dos números. Si los dos números son
mayores de 100, nos devolverá la suma de ambos. Si es alguno de
ellos es igual o menor que 100 nos devolverá un mensaje de error.
para logica
bp gd 90 sl ot ponpos [-200 0]
rotula (lista "Introduce "dos "números "mayores "que "100)
haz "num1 leepalabra
haz "num2 leepalabra
bp gd 90 ponpos [-200 0]
sisino y :num1>100 :num2>100 [rotula (lista "La "suma "de :num1
"y :num2 "es: :num1+:num2)] [rotula (lista
"¡¡¡Error!!! "Uno "de "los "dos "números "es
"menor "que "100)]
fin
La función lógica o evalúa varias expresiones.
Devuelve el valor cierto si alguna de las expresiones evaluadas tienen
el valor cierto y devuelve el valor falso si todas las expresiones son
falsas. Su sintaxis es como sigue:
o expresion1 expresion2
si debe evaluar 2 expresiones
(o expresion1 expresion2 expresion3 ...)
si debe evaluar más de 2 expresiones
77. Para comprenderlo, vamos a redactar un
procedimiento llamado logica2 que nos pida dos números, uno de
los cuales debe ser mayor que 500. Si uno o los dos números son
mayores que 500, nos devolverá la suma de ambos. Si los dos
números son iguales o menores que 500, nos devolverá un
mensaje de error.
para logica2
bp gd 90 sl ot ponpos [-200 0]
rotula (lista "Introduce "dos "números. "Uno "de "ellos "debe
"ser "mayor "que "500)
haz "num1 leepalabra
haz "num2 leepalabra
bp gd 90 ponpos [-200 0]
sisino o :num1>500 :num2>500 [rotula (lista "La "suma "de :num1
"y :num2 "es: :num1+:num2)] [rotula (lista
"¡¡¡Error!!! "Ambos "números "son "menores
"que "500)]
fin
La primitiva bity devuelve el resultado de aplicar la función
lógica Y sobre dos o más números, que deben ser
números enteros. Su sintaxis es como sigue:
bity numero1 numero2
Si debe hacer el cálculo con 2 números
(bity numero1 numero2 numero3 ...) Si debe calcularlo
con más de 2 números
La primitiva bito devuelve el resultado de aplicar la función
lógica O sobre dos o más números enteros. Su
sintaxis es similar a la de la primitiva bity
78. Para practicarlo, escribe un procedimiento
llamado funcionyo, que nos pida dos números enteros y nos
devuelva el resultado de hacer la función lógica Y entre
ellos, y la función lógica O.
para funcionyo
bp gd 90 sl ot
ponpos [-50 0]
rotula (lista "Introduce "dos "números "enteros.)
haz "num1 leepalabra
haz "num2 leepalabra
bp gd 90
ponpos [-50 0]
rotula (lista "Los "números "introducidos "son: :num1 "y :num2)
ponpos [-50 -20]
rotula (lista "El "resultado "de "aplicar "la "función "Y "es:
bity :num1 :num2)
ponpos [-50 -40]
rotula (lista "El "resultado "de "aplicar "la "función "O "es:
bito :num1 :num2)
fin
Primitivas prueba, sicierto y sifalso
Estas tres primitivas están vinculadas entre si. La primitiva
prueba evalúa una expresión y recuerda si el resultado ha
sido cierto o falso, para que luego puedan utilizarlo las otras dos
primitivas: sicierto, que puede abreviarse como sic y sifalso, que
puede abreviarse como sif.
La sintaxis del conjunto es como sigue:
prueba expresion
sic [acciones a realizar]
sif [acciones a realizar]
79. Veamos un ejemplo, con un procedimiento, llamado
sorteo50 que genera un número aleatorio entre el 0 y el 100. Si
el número generado es menor que 50 aparecerá un mensaje
indicándolo. Si el número es igual o mayor que 50
aparecerá otro mensaje que nos lo indica.
para sorteo50
bp gd 90 sl ot
haz "num azar 100
ponpos [-50 0]
rotula (lista "El "número "agraciado "es: :num)
ponpos [-50 -20]
prueba :num<50
sic [rotula (lista "que "es "menor "que "50)]
sif [rotula (lista "que "es "mayor "que "50)]
fin
Paso de argumentos entre procedimientos
Se puede realizar un procedimiento que necesite algún dato
previo para poder realizar alguna operación con él y
luego nos devuelva el dato o los datos del resultado.
Estos datos que se pasan al procedimiento, en el momento de llamarlo o
ejecutarlo o que devuelve el procedimiento al finalizar su
ejecución, se denominan argumentos.
Primitiva devuelve
La primitiva devuelve finaliza la ejecución del procedimiento en
el que aparece. Este procedimiento devuelve el dato que lo
acompaña al contexto en el que fue invocado su procedimiento.
80. Por ejemplo: escribe un procedimiento llamado
multiplica, que reciba dos números y devuelva el producto de
ambos a otro procedimiento que lo llame.
para prod :x :y ;Se inicia un
procedimiento con dos datos de entrada
haz "z :x * :y
devuelve :z ;Al
finalizar devuelve z al procedimiento que lo llamó
fin
para multiplica
bt
escribe [Introduce los factores]
haz "x leepalabra
haz "y leepalabra
bt
escribe [El resultado es:]
escribe (lista :x "x :y "= prod :x :y) ;Llama a prod
y le da los datos.
fin
;De prod recibe un dato y lo presenta
Primitiva local
Esta primitiva sirve para declarar una o más variables, que
sólo tendrán validez dentro del procedimiento en el que
se crean. Su sintaxis es como sigue:
local var1 var2 var3
Se creará una variable para cada una de las palabras que
acompañan a la instrucción. Las variables de alcance
local en un procedimiento estarán disponibles para cualquier
procedimiento invocado por él. Las variables creadas con local
no tienen valor inicial; se les tiene que asignar un valor antes de que
el procedimiento intente utilizarlas.
81. Haz un procedimiento llamado rectanx3, que reciba
un número y dibuje un rectángulo cuyo lado horizontal sea
3 veces el vertical. La altura del lado vertical será el
número recibido. Las variables que utilice dicho procedimiento
serán de carácter local.
para rectanx3 :lado
bp bl pong [2 2]
local "ancho
haz "ancho :lado * 3
repite 2 [av :lado gd 90 av :ancho gd 90]
ot
fin
Programación orientada a objetos
La técnica de programación orientada a objetos consiste,
a diferencia de la programación estructurada mediante
procedimientos, en organizar la interacción con el usuario a
través de objetos que aparecen en pantalla. Son objetos
característicos las ventanas, botones, casillas de
selección, etc.
Los objetos son los elementos básicos de la interfaz
gráfica de usuario GUI
Primitivas ventana y estatico
Una ventana es un área de trabajo, típica del interface
gráfico de usuario, dotada de una barra de título, sobre
la que aparecerán otros objetos para facilitar la
interacción del usuario. Una ventana puede arrastrase por la
pantalla, maximizar, minimizar, borrar, etc.
82. Crea tu primera ventana tecleando la siguiente
orden:
creaventana " "primera [Mi primera ventana] 90 50 120 80 [ ]
Observa que la ventana tiene un nombre (en este caso la hemos llamado
primera), su barra de título mostrará el texto que
pongamos entre corchetes (en este caso pondrá Mi primera
ventana), su posición respecto a la esquina superior izquierda
(en este caso x=90 y=50) y su tamaño (en este ejemplo 120 * 80).
La ventana ha sido creada en la ventana principal de la pantalla (“)
83. Puedes desactivar la ventana con la orden:
habilitarventana “primera “falso
una vez deshabilitada, la ventana está inactiva y no puedes
operar con ella ni arrastrarla a otro lugar de tu pantalla.
84. Para activarla de nuevo, bastará con
teclear la orden siguiente:
habilitarventana “primera “verdadero
comprueba que ahora sí puedes operar con la ventana y
arrastrarla por la pantalla
85. Ahora borra la ventana, utilizando la orden
siguiente:
borraventana “primera
Para saber más sobre la sintaxis de las ventanas consulta el
menú de ayuda de MSWLogo.
86. Puedes crear textos estáticos, en el
interior de una ventana, que se mueven con ella. Por ejemplo, si
está creada y activa la ventana “primera y tecleas
creaestatico “primera “texto1 “PAN 50 25 15 9
verás aparecer un texto en la ventana “primera, llamado “texto1,
que contiene la palabra PAN, está situado en las coordenadas 50
25 desde la esquina superior izquierda de la ventana y tiene un
tamaño de 15 x 9.
Vamos a introducir un nuevo texto estático con la orden:
creaestatico “primera “texto2 [SARDINAS ASADAS] 30 30 15 9
observarás que las nuevas coordenadas 30 30 son adecuadas para
el comienzo del letrero, pero las dimensiones del texto son
insuficientes y deberás aumentarlas, por lo menos, hasta 65x9:
creaestatico “primera “texto2 [SARDINAS ASADAS] 30 30 65 9
87. Para borrar los textos estáticos debes
emplear las órdenes:
borraestatico “texto1
borraestatico “texto2
88. Para practicar la creación de ventanas y
la introducción de textos estáticos, escribe un
procedimiento llamado resultado, que reciba dos números y
devuelva el producto de ambos en una nueva ventana.
para resultado
bp gd 90 ot sl
ponpos [-100 100]
rotula [Introduce dos números]
haz "num1 leepalabra
haz "num2 leepalabra
haz "resul :num1 * :num2
bp
creaventana "root "calculo [ Resultado del producto:
] 200 150 100 40 []
creaestatico "calculo "resul1 :num1 5 5 20 10
creaestatico "calculo "resul2 [x] 25 5 10 10
creaestatico "calculo "resul3 :num2 35 5 20 10
creaestatico "calculo "resul4 [=] 55 5 10 10
creaestatico "calculo "resul5 :resul 65 5 20 10
fin
Si te fijas, la posición de cada uno de los textos
estáticos está calculada para números de
tamaño medio. Pero, tanto si se introducen números muy
pequeños, como si los números son muy grandes, las
coordenadas fijas de los textos producen una presentación pobre
y desajustada.
La presentación mejora al reemplazar las cinco primitivas
creaestático por una sola línea de código que
llama a una lista:
para resultado
bp gd 90 ot sl
ponpos [-100 100]
rotula [Introduce dos números]
haz "num1 leepalabra
haz "num2 leepalabra
haz "resul :num1 * :num2
bp
creaventana "root "calculo [Resultado del producto:] 200 150 100 40 [ ]
creaestatico "calculo "resul1 (lista :num1 "x :num2 "= :resul) 5
10 90 10
fin
Haz una prueba: deshabilita la ventana calculo y verás que no
puedes manejarla con el ratón. Si la habilitas de nuevo
podrás activarla y arrastrarla por la pantalla.
Para despejar la pantalla, debes teclear la orden:
borraventana “calculo
Primitiva boton
Un botón es un elemento que permite manipular un programa
mediante el ratón, que puede hacer clic en él o,
simplemente, pasar sobre él.
89. Escribe un procedimiento que cree una ventana,
llamada segunda, en la que haya un botón para cerrarla.
Para segunda
creaventana “ “segunda [Pulsa Aceptar para cerrar] 200 50 90 40 [ ]
creaboton “segunda “boton1 [Aceptar] 30 5 30 20 [sesamo]
fin
La longitud de la ventana (fíjate que en nuestro ejemplo la
longitud de la ventana es 90) ha de ser suficiente para que quepa el
texto (en nuestro caso Pulsa Aceptar para cerrar). La altura de la
ventana ha de bastar para que quepa el botón, que tiene 30 x 20.
Las coordenadas de la posición del botón pretenden que
quede centrado en la ventana. Y ahora, crea el procedimiento sesamo,
que se encargará de cerrar la ventana:
para sesamo
borraventana "segunda
fin
90. Haz un procedimiento, con el nombre ven3boton,
que dibuje en pantalla una ventana con tres botones. Al pulsar el
primero aparecerá un mensaje en la misma ventana que diga
pulsado. Al pulsar el segundo se dibuja un donut en la ventana
gráfica, utilizando nuestro viejo procedimiento del mismo nombre
y el texto del botón cambia a DONUT. Al pulsar el tercero se
cierra la ventana con todo su contenido.
para ven3boton
creaventana " "nueva [Ventana con tres botones] 170 50 190 70 [ ]
creaboton "nueva "primero [Pulsar] 15 30 40 20 [boton1]
creaboton "nueva "segundo [Arrancar] 67 30 50 20 [boton2]
creaboton "nueva "tercero [Cerrar] 130 30 40 20 [borraventana "nueva
poncp 7]
fin
para boton1
creaestatico "nueva "boton1 [PULSADO] 17 10 35 15
fin
para boton2
actualizaboton "segundo [DONUT]
donut 50
ocultatortuga
fin
El primer botón hace que aparezca un nuevo texto
estático. El segundo botón pone en marcha un
procedimiento y, además, cambia el texto del botón y,
finalmente, ¡fíjate qué ahorro!, en la
creación del tercer botón se incluye ya el código
de lo que debe hacer al ser pulsado: borrar la ventana y dejar la
pantalla en blanco. No es necesario un procedimiento adicional.
Primitiva barradesplazamiento
Una barra de desplazamiento es un objeto que tiene un cursor que puede
desplazarse mediante el ratón, para dar diversos valores a una
variable.
91. Escribe un procedimiento que cree una ventana,
llamada tercera, en la que haya un botón para cerrarla y una
barra de desplazamiento.
Para tercera
creaventana " "tercera [Mi primera barra deslizante] 200 50 140 60 [ ]
creabarradesplazamiento "tercera "barra 30 10 80 10 [ ]
ponbarradesplazamiento "barra 0 100 50
creaboton "tercera "close [Cerrar] 55 25 30 20 [borraventana "tercera]
fin
Observa que la longitud de la ventana (en este caso 140) ha de ser
suficiente para que quepa el título (Mi primera barra
deslizante) y la barra (que en nuestro caso mide 80 de largo). La
altura de la ventana ha de bastar para que quepan tanto la barra
(nuestra barra mide 80 x 10) como el botón (que mide 30 x 20).
Las coordenadas de la posición del botón y de la barra
pretenden que queden centrados en la ventana. Comprueba que puedes
mover el cursor con el ratón y que puedes cerrar la ventana.
Fíjate en la primitiva ponbarradesplazamiento. En su sintaxis se
incluye: el nombre de la barra, el valor inicial, el valor final y el
punto de su recorrido en el que se presenta.
92. Aplica lo que has aprendido, escribiendo un
procedimiento llamado venbar, que dibuje en pantalla una barra de
desplazamiento dentro de una ventana. La barra tendrá un rango
de valores entre 50 y 250. Cada vez que se mueva se debe visualizar en
la ventana el valor de su posición y su raíz cuadrada.
Tendremos, además, un botón que sirva para cerrar la
ventana.
para venbar
creaventana " "ultima [Calculadora automática de raices] 150 70
180 70 [ ]
creaestatico "ultima "estat [150] 140 10 20 15
creaestatico "ultima "estat1 [Su raiz cuadrada es:] 15 30 70 10
creaestatico "ultima "estat2 raizcuadrada 150 35 40 30 10
creabarradesplazamiento "ultima "barra 15 10 110 10 [leebarra]
ponbarradesplazamiento "barra 50 250 150
creaboton "ultima "primero [Cerrar] 125 30 40 20 [borraventana "ultima]
fin
La barra de desplazamiento adoptará el valor inicial de 150 (en
el centro de su recorrido). Por lo tanto, el estático estat2
deberá tener como valor inicial la raíz cuadrada de 150
(señalado en amarillo). Cuando el cursor de la barra se mueva se
ejecutará el procedimiento llamado leebarra que habrá que
escribir:
para leebarra
haz "x leebarradesplazamiento "barra
haz "y raizcuadrada :x
actualizaestatico "estat :x
actualizaestatico "estat2 :y
fin
Primitiva dialogo
Una ventana de dialogo se utiliza como marco de trabajo en el que se
pueden añadir otros objetos o controles como botones, barras de
desplazamiento, listboxes, etc. Este objeto es similar a una
ventana, excepto que no devolverá el control al procedimiento
llamante hasta que la ventana de diálogo se cierre.
93. Vamos a crear una ventana de diálogo que
pida al usuario que acepte pulsando un botón. Pero, en primer
lugar, vamos a crear el procedimiento que cerrará la ventana al
pulsar el botón:
para vendialo
creaboton "dialogo1 "botvale "ACEPTAR 25 10 40 20 [borradialogo
"dialogo1]
fin
Ahora que está preparado teclea, en la ventana de trabajo, la
orden siguiente:
creadialogo " "dialogo1 [El sistema debe reiniciarse] 120 60 90 50
[vendialo]
Naturalmente, una vez pulsado el botón pueden ponerse en marcha
procedimientos más ambiciosos que el simple cierre de la ventana
de diálogo.
94. Por ejemplo, escribe un procedimiento que
pregunte al usuario, mediante una ventana de diálogo,
cuántos días faltan para su cumpleaños:
para faltan
creaestatico "cumple "fecha [180] 155 10 20 15
creabarradesplazamiento "cumple "deslizadias 15 10 130 10 [haz "dias
leebarradesplazamiento "deslizadias actualizaestatico "fecha :dias]
ponbarradesplazamiento "deslizadias 0 365 180
creaboton "cumple "ok [Aceptar] 70 30 40 20 [borradialogo "cumple]
fin
y teclea a continuación:
creadialogo " "cumple [¿Cuántos dias faltan para tu
cumpleaños?] 120 60 180 70 [faltan]
Como puedes ver aparece una ventana de diálogo (con el nombre
cumple), con una pregunta en el título y, en la misma ventana de
diálogo, una barra de desplazamiento (llamada deslizadias), un
texto estático (con el nombre fecha) que indica la lectura de la
barra de desplazamiento y un botón (llamado ok) que pone Aceptar.
Al mover la barra de desplazamiento, el texto estático
reflejará la posición de la barra (entre 0 y 365). Al
pulsar el botón Aceptar, se borrará la ventana de
diálogo.
95. Para practicar introduce alguna novedad de tu
propia cosecha. Por ejemplo, haz que rotule al cerrar el
diálogo, sobre una pantalla roja y con letras grandes,
cuántos días faltan para el cumpleaños. Puedes
crear para ello un pequeño procedimiento, llamado happytext, que
será invocado por el botón ok desde su línea de
creación:
creaboton "cumple "ok [Aceptar] 70 30 40 20 [happytext]
Primitivas groupbox y botonradio
Un botón radio es un objeto que permite seleccionar una
opción con dos estados: verdadero (botón seleccionado) o
falso (botón no seleccionado).
Todos los botones radio, que se corresponden con cada una de las
opciones que se presentan al usuario, deben estar asociados en un grupo
o groupbox.
96. Para practicar, escribiremos el código de
una ventana llamada cuarta, en la que el usuario deberá elegir
su rango de edad seleccionando uno de los botones radio que se
presentan reunidos en un groupbox.
para edad
creaventana " "cuarta [Seleccione su grupo de edad] 200 50 115 65 [ ]
creagroupbox "cuarta "marco 5 5 65 40
creabotonradio "cuarta "marco "bot1 [<15 años] 10 13 40 9
creabotonradio "cuarta "marco "bot2 [15 a 18 años] 10 23 55 9
creabotonradio "cuarta "marco "bot3 [>18 años] 10 33 40 9
escribebotonradio "bot1 "verdadero
creaboton "cuarta "cierre [Aceptar] 75 18 30 20 [borraventana "cuarta]
fin
Fíjate bien, todas las coordenadas están referidas a un
origen común, situado en la esquina superior izquierda de la
ventana. La creación de cada objeto incluye una ruta compuesta
por la ventana padre, el objeto padre y su propio nombre.
Sólo puede estar seleccionado uno de los botones radio de un
groupbox. Cuando el usuario selecciona una de las opciones lo pone en
estado “verdadero y, automáticamente, el resto de las opciones
se ponen en estado “falso. Además, al iniciar el groupbox, una
de las opciones debe declararse en estado “verdadero.
97. Haz una calculadora, llamada calcacme, que pida
dos números y dibuje en una ventana un grupo con cuatro botones
radio. Cada botón tendrá asignada una operación
matemática. Cuando pulsemos un botón aparecerá el
resultado de aplicar la operación matemática seleccionada
a los dos números introducidos. Tendrá, además,
otro botón que permita cerrar la ventana:
para calcacme
bp sl gd 90 ot
ponpos [-480 150] bl
pontamañotipo [[Arial] 40 18 0 400 0 0 0 0 3 2 1 18]
rotula (lista "Introduce "dos "números "en "la "ventana
"superior)
haz "num1 leepalabra
haz "num2 leepalabra
bp
creaventana " "ultima [Calculadora aritmética marca "ACME"] 150
70 180 100 [ ]
creagroupbox "ultima "grupo 10 10 160 50
creabotonradio "ultima "grupo "boton1 [ +] 15 15 25 10
creabotonradio "ultima "grupo "boton2 [ -] 15 25 25 10
creabotonradio "ultima "grupo "boton3 [x] 15 35 25 10
creabotonradio "ultima "grupo "boton4 [/] 15 45 25 10
escribebotonradio "boton1 "verdadero
creaboton "ultima "calcular [CALCULAR] 20 67 45 15 [calculo]
creaboton "ultima "cerrar [ACABAR] 115 67 45 15 [borraventana "ultima]
creaestatico "ultima "estat [NUMEROS: ] 50 25 45 15
creaestatico "ultima "estat1 :num1 110 25 20 15
creaestatico "ultima "estat2 :num2 140 25 20 15
creaestatico "ultima "estat3 [RESULTADO:] 50 40 50 15
creaestatico "ultima "estat4 [ ] 110 40 30 15
fin
para calculo
haz "x leebotonradio "boton1
si :x= "verdadero [haz "num3 :num1 +:num2]
haz "x leebotonradio "boton2
si :x= "verdadero [haz "num3 :num1-:num2]
haz "x leebotonradio "boton3
si :x= "verdadero [haz "num3 :num1 *:num2]
haz "x leebotonradio "boton4
si :x= "verdadero [haz "num3 :num1/:num2]
actualizaestatico "estat4 :num3
fin
Primitiva checkbox
Un objeto checkbox es una casilla que el usuario puede seleccionar.
Todas las casillas checkbox deben estar reunidas en un groupbox. El
usuario puede seleccionar varias casillas simultáneamente.
98. Haz un procedimiento, llamado vencom, que dibuje
en una ventana un grupo con tres botones de tipo checkbox. Cada uno
tendrá como etiqueta un número. Cuando pulsemos un
botón aparecerá un mensaje indicando el estado de cada
uno de ellos. Tendrá, además, otro botón que
permita cerrar la ventana.
para vencom
creaventana " "ultima [Ventana con casillas de comprobación] 150
70 180 90 [ ]
creagroupbox "ultima "grupo 10 5 160 50
creacheckbox "ultima "grupo "boton1 [Primero] 15 15 45 10
creacheckbox "ultima "grupo "boton2 [Segundo] 15 25 45 10
creacheckbox "ultima "grupo "boton3 [Tercero] 15 35 45 10
creaboton "ultima "comprobar [COMPROBAR] 15 60 60 15 [comprueba]
creaboton "ultima "cerrar [CERRAR] 120 60 40 15 [borraventana "ultima]
creaestatico "ultima "estat1 [Desactivado] 100 15 60 10
creaestatico "ultima "estat2 [Desactivado] 100 25 60 10
creaestatico "ultima "estat3 [Desactivado] 100 35 60 10
fin
para comprueba
haz "x estadocheckbox "boton1
sisino :x= "verdadero [actualizaestatico "estat1 [Activado]]
[actualizaestatico "estat1 [Desactivado]]
haz "x estadocheckbox "boton2
sisino :x= "verdadero [actualizaestatico "estat2 [Activado]]
[actualizaestatico "estat2 [Desactivado]]
haz "x estadocheckbox "boton3
sisino :x= "verdadero [actualizaestatico "estat3 [Activado]]
[actualizaestatico "estat3 [Desactivado]]
fin
Primitiva listbox
Un objeto listbox es una caja de texto, que contiene una lista de
opciones entre las que el usuario puede elegir una.
99. Haz un procedimiento llamado venmenu que dibuje
en una ventana un menú de opciones mediante listbox. Dicho
menú tendrá 5 opciones: CIRCULO, CUADRADO,
TRIÁNGULO, PENTÁGONO y HEXÁGONO. Después de
elegir una de las opciones de la lista, al pulsar el botón
DIBUJAR, se dibujará la figura seleccionada en el menú.
Con el botón BORRAR podremos limpiar la pantalla gráfica.
Tendrá, además, otro botón que permita cerrar la
ventana.
para venmenu
creaventana " "ultima [Trazado de polígonos] 300 250 180 90 [ ]
crealistbox "ultima "menu "10 10 100 30
añadecadenalistbox "menu [CIRCULO ROJO]
añadecadenalistbox "menu [CUADRADO AZUL]
añadecadenalistbox "menu [TRIANGULO VERDE]
añadecadenalistbox "menu [PENTAGONO AMARILLO]
añadecadenalistbox "menu [HEXAGONO VIOLETA]
creaboton "ultima "calcular [DIBUJAR] 120 20 40 15 [dibujar]
creaboton "ultima "cerrar [ACABAR] 120 50 40 15 [borraventana "ultima]
creaboton "ultima "borrar [BORRAR] 60 50 40 15 [bp]
fin
para dibujar
haz "x leeseleccionlistbox "menu
si :x=[CIRCULO ROJO] [arorojo]
si :x=[CUADRADO AZUL] [cuadroblue]
si :x=[TRIANGULO VERDE] [triverde]
si :x=[PENTAGONO AMARILLO] [pentaillo]
si :x=[HEXAGONO VIOLETA] [hexaviol]
fin
para arorojo
arcodeelipse 360 120 120 0 sl poccr 4 gd 10 av 10 rellena bl ot
fin
para cuadroblue
repite 4 [av 200 gd 90] sl poccr 1 gd 10 av 10 rellena bl ot
fin
para triverde
repite 3 [av 220 gd 120] sl poccr 10 gd 10 av 10 rellena bl ot
fin
para pentaillo
repite 5 [av 150 gd 72] sl poccr 6 gd 10 av 10 rellena bl ot
fin
para hexaviol
repite 6 [av 120 gd 60] sl poccr 13 gd 10 av 10 rellena bl ot
fin
Primitiva combobox
Un objeto combobox es un objeto compuesto por una lista, en la que el
usuario puede elegir una de las opciones que ofrece, y una ventana de
texto en la que el usuario puede introducir una expresión que no
está en la lista.
Para crear un combobox hay que utilizar la sintaxis siguiente:
creacombobox “ventana “nombre “Titulo posx posy largo alto
Una vez creado, podemos añadir el texto de las opciones que se
ofrecen en la lista:
añadelineacombobox “nombre [expresion 1]
añadelineacombobox “nombre [expresion 2]
...
A continuación, designamos cuál de las opciones
aparecerá seleccionada por defecto al crearse el combobox
pontextocombobox “nombre [expresion x]
Para averiguar cuál es la opción elegida por el usuario,
utilizaremos la expresión:
leetextocombobox “nombre
100. Para mostrar un ejemplo del uso del objeto
combobox, veamos el procedimiento elige, en el que MSWLogo
dibujará un polígono, con un número de lados
elegido por el usuario mediante una ventana combobox:
para elige
creaventana " "miventana (lista "Elige "el "número "de "lados)
20 20 100 120 [ ]
creacombobox "miventana "micombo 25 0 50 50
añadelineacombobox "micombo [3 lados]
añadelineacombobox "micombo [4 lados]
añadelineacombobox "micombo [5 lados]
añadelineacombobox "micombo [6 lados]
añadelineacombobox "micombo [7 lados]
añadelineacombobox "micombo [8 lados]
añadelineacombobox "micombo [9 lados]
añadelineacombobox "micombo [10 lados]
creaboton "miventana "boton1 "Dibujar 25 50 50 25 [hazdibujo]
creaboton "miventana "boton2 "Cerrar 25 77 50 25 [cerrar]
fin
para hazdibujo
bp sl av 150 bl
haz "lados primero leetextocombobox "micombo
repite :lados [gd 360/:lados av 1000/:lados]
ot
fin
para cerrar
borraventana "principal
bp
fin
101. Y, para terminar, vamos a escribir el
código de un programa para una agencia de viajes, en el que el
cliente puede elegir el lugar elegido para sus vacaciones. La agencia
de viajes ofrece una lista de destinos comunes, los más
solicitados, pero también permite al cliente solicitar un
destino que no está en esa lista. Un objeto combobox es la
opción ideal:
para viaje
creaventana " "destino [Elija el destino de su viaje] 150 80 120 120 []
creacombobox "destino "listado 20 5 80 50
añadelineacombobox "listado [Turquia]
añadelineacombobox "listado [Viena clásica]
añadelineacombobox "listado [Praga romántica]
añadelineacombobox "listado [Italia]
añadelineacombobox "listado [Fiordos noruegos]
añadelineacombobox "listado [Viñedos de Francia]
añadelineacombobox "listado [Costas de España]
añadelineacombobox "listado [Islas Canarias]
pontextocombobox "listado [Fiordos noruegos]
creaboton "destino "botacepto "Elegir 20 60 30 20 [confirmar]
creaboton "destino "botcierre "Cerrar 70 60 30 20 [borraventana
"destino]
creaestatico "destino "eleccion [Su elección:] 20 85 80 9
creaestatico "destino "texto [Fiordos noruegos] 20 95 80 9
fin
para confirmar
haz "lugar leetextocombobox "listado
actualizaestatico "texto :lugar
fin
Haz la prueba, eligiendo lugares de la lista ofrecida por la agencia y,
también, eligiendo un lugar de vacaciones que no está en
la lista.
Mensajes del sistema
A veces, durante la ejecución de un programa, el sistema debe
comunicarse con el usuario para informarle de algo, preguntarle o
pedirle que tome una decisión. El modo habitual de hacerlo es
utilizar una ventana con botones y algunos otros objetos.
Logo tiene en su biblioteca de primitivas varios mensajes de sistema ya
preparados: sinobox, seleccionbox, preguntabox, etc. Vamos a practicar
con ellos:
Primitiva Mensaje
Esta primitiva detiene la ejecución del programa y muestra una
ventana con un mensaje al usuario. El procesamiento no
continuará hasta que el usuario se dé por enterado
pulsando el botón ACEPTAR. la ventana de trabajo quedará
inhabilitada hasta que el usuario pulse el botón. La sintaxis de
la primitiva es:
mensaje [titular de la ventana] [texto del mensaje]
102. Por ejemplo: crea un procedimiento llamado sox
que muestre en la pantalla un aviso pidiendo que lo aceptes o lo
rechaces:
para sox
mensaje [Plan para esta tarde] [¿Quieres ir al cine?]
fin
103. Modifica el procedimiento sox para que pregunte
otra cosa distinta.
Archivo → editar → sox
para sox
mensaje [Plan para esta tarde] [¿Qué tal una siesta?]
fin
104. Prueba a crear un mensaje de alarma con el que
el sistema informa al usuario que debe cerrar todos los programas antes
de seguir:
para alarma
mensaje [ERROR DE EJECUCIÓN] [Debes cerrar todos los programas]
fin
Observa que la ventana se dimensiona automáticamente para
adaptarse a la longitud del texto.
Primitiva Sinobox
Esta primitiva detiene la ejecución del programa y lanza un
mensaje, con un título y un texto de mensaje. El programa
no continuará hasta que el usuario pulse en uno de los botones
Si o No. La ventana de trabajo quedará estará
inhabilitada hasta que se pulse un botón. La sintaxis de la
primitiva es:
sinobox [titular de la ventana] [texto del mensaje]
Una vez que el usuario pulsa un botón, la instrucción
devolverá VERDADERO si el usuario ha pulsado el botón Si
y devolverá FALSO si ha pulsado No.
105. Imagina, por ejemplo, que estamos haciendo un
programa para jugar al ajedrez. Al comienzo de la partida, el programa
debe preguntar al usuario con qué color desea jugar. Así
podrá decidir si dibuja el tablero desde un lado o desde el
otro. Puede hacerlo por ejemplo con una ventana de mensaje sinobox, de
este modo:
sinobox [ELEGIR EL COLOR DE LAS FICHAS] [¿Quieres jugar con
blancas?]
Logo responde que no sabe qué hacer con los valores, cierto o
falso, que devuelve la primitiva. Eso sucede porque una vez que el
usuario ha contestado, la primitiva sinobox devolverá el valor
CIERTO o FALSO y el programa deberá hacer algo con dichos
valores, dibujando el tablero con las fichas blancas o las fichas
negras en el lado del usuario, por ejemplo.
Para simplificar, hagamos que el programa rotule Usted juega con
blancas o Usted juega con negras, según lo que elija el usuario:
para fichas
bp gd 90 sl ponpos [-150 100] bl
sisino sinobox [ELEGIR EL COLOR DE LAS FICHAS] [¿Va a jugar con
blancas?] [rotula [Usted juega con blancas]] [rotula [Usted juega con
negras]]
fin
recuerda que la primitiva sisino necesita que todo el código
esté en una única línea.
Primitiva Seleccionbox
Este comando detiene el procesamiento y lanza un mensaje con un
título y una lista de opciones. El programa no continuará
hasta que el usuario pulse en el botón ACEPTAR o en el
botón CANCELAR. La sintaxis de esta primitiva es:
seleccionbox [titulo de la ventana] [lista de opciones]
Una vez que se pulsa ACEPTAR el comando devolverá un
índice que se corresponde con el elemento de la lista de
opciones que, en ese momento, esté seleccionado: 1 para la
primera opción, 2 para la segunda opción, etc. La
primitiva devolverá el valor 0 si el usuario pulsa el
botón CANCELAR. Luego, el programa abordará un
procedimiento u otro en función del índice devuelto por
la primitiva seleccionbox.
106. Imagina, por ejemplo, el programa de reservas de
avión de una agencia de viajes. En un momento de su
ejecución, el programa pide al cliente que indique cuál
es el destino de su viaje para luego emprender acciones acordes con esa
decisión. Podríamos hacerlo, por ejemplo, con un mensaje
de tipo seleccionbox:
seleccionbox [ELIJA UN DESTINO PARA SU VIAJE] [Península Islas
Europa Caribe]
Pruébalo. Verás que puedes elegir un elemento de la
lista, pero Logo responde que no sabe qué hacer con los
índices que devuelve la primitiva
107. Lo que podemos hacer con los índices, por
ejemplo, sería mostrar al cliente el mapa de la zona elegida.
Además, mostraremos en pantalla un mensaje para que el cliente
confirme el viaje que ha elegido. Podríamos hacerlo así:
para viajar
bp sl ponpos [-175 30] gd 90 ot
poncp [30 40 120] poncl [200 200 30]
haz "x seleccionbox [ELIJA UN DESTINO PARA SU VIAJE] [Península
Canarias Europa Caribe]
si :x=1 [cargadib "c:\\españa.bmp mensaje [El viaje que usted ha
elegido] [¿Desea viajar por la península?]]
si :x=2 [cargadib "c:\\canarias.bmp mensaje [El viaje que usted ha
elegido] [¿Prefiere las Islas Canarias?]]
si :x=3 [cargadib "c:\\europa.bmp mensaje [El viaje que usted ha
elegido] [¿Sueña con un viaje por Europa?]]
si :x=4 [cargadib "c:\\caribe.bmp mensaje [El viaje que usted ha
elegido] [¿Su destino preferido es el caribe?]]
espera 90 limpia
ponpos [-380 50]
pontamañotipo [[Arial] 100 50 0 400]
rotula [¡¡BUEN VIAJE!!]
fin
Para que este procedimiento funcione, los archivos gráficos
tienen que estar en el directorio especificado en el código. Si
los dejas, por ejemplo, en C:/Archivos de programa deberás
decirlo así en el código:
cargadib “c:\\Archivos de programa\\canarias.bmp
Ejercicios libres
Bueno, ha llegado la hora de abordar la escritura de programas sin
ayuda. Te voy a proponer algunos proyectos para que tú
desarrolles íntegramente un programa que cumpla los requisitos
para cada proyecto. Al hacer estos ejercicios ten en cuenta las
siguientes instrucciones:
? Hazlo con todo el cuidado por los pequeños
detalles del que seas capaz.
? Utiliza repeticiones y bucles. No escribas
más líneas de código que las necesarias.
? Añade comentarios para que se entiendan las
ideas que tratas de desarrollar.
? Prueba cada parte de tu programa por separado para
asegurarte de que funciona.
? Somete al programa a condiciones extremas y
situaciones no previstas.
1. Damero
Escribe un procedimiento llamado damero capaz de presentar,
perfectamente centrado en la pantalla un tablero de damas. Ten en
cuenta que un tablero de damas está compuesto por 64 cuadrados
iguales, organizados en 8 filas de 8 cuadrados cada fila. Los cuadrados
de color claro se alternan con los cuadrados de color oscuro. Las filas
impares tienen los cuadrados claros y oscuros en orden inverso al de
las filas pares.
Figura damero
Si aceptas un desafío mayor, haz que se pueda invocar el
procedimiento damero :lado de tal forma que sea capaz de construir el
tablero con los cuadrados del tamaño especificado en la variable
:lado. Así si tecleas damero 20 te dibujará un damero de
20x20 y si tecleas damero 80 dibujará un tablero de 80x80.
Añade además un cerco decorativo a los cuadrados que
forman el tablero.
Figuras dos dameros
2. Escapar del corral
Este programa busca mostrar a la tortuga moviéndose al azar para
escapar de un recinto dibujado en la pantalla. El programa debe
componerse, por lo menos de dos procedimientos: uno que dibuja el
corral, con un pequeño pasillo para escapar, y otro que hace que
la tortuga se mueva al azar.
Figura corral
El movimiento de la tortuga debe ser errático, girando al azar a
la izquierda y a la derecha después de cada pequeño paso.
Por ejemplo:
gd azar 30 gi azar 22 ;gira un
ángulo aleatorio de 0 a 30º (derecha) y de 0 22º
(izda.)
Para saber si la tortuga ha tropezado con el muro del corral es
útil la primitiva pixel, que devuelve el color del pixel sobre
el que se encuentra el centro de la tortuga. Su sintaxis es así:
si pixel=color [haz esto], por ejemplo:
si pixel=0 [re 10]
;la tortuga retrocede 10 si toca un pixel negro
Cada vez que la tortuga tropieza con el muro, debería retroceder
y girar un poco antes de volver avanzar para tratar de salir del corral.
3. Reloj
Construye un programa capaz de presentar en pantalla un reloj
analógico, es decir con agujas para señalar la hora, los
minutos y los segundos. El diseño de la esfera del reloj es
libre, para que puedas darle un toque personal: un reloj moderno o
antiguo, con todas las cifras o sólo con las cuatro cifras
principales, con trazos o con viñetas para señalar las
horas y minutos, con colores atractivos, etc.
Figura Reloj
Para facilitar la construcción del programa es conveniente que
dividas el código en varios procedimientos separados, que se
llaman consecutivamente:
? Dibujar la esfera
? Obtener los datos desde el reloj del sistema
? Calcular el ángulo que tendrá cada
aguja
? Dibujar las agujas
? Enlazar todos los procedimientos y hacer que suene
el tic-tac
Las agujas deben dibujarse en un ángulo acorde con la hora
mostrada. Por ejemplo: a las 9:45 la aguja horaria está
más cerca de las 10 que de las 9.
Para que el funcionamiento del reloj sea impecable y muestre la hora
correcta, debes utilizar el reloj del sistema, utilizando la primitiva
hora.
Y, para añadir un efecto impactante, haz que suene un sonido
cada vez que la aguja de los segundos da un paso, a modo de tic-tac
4. Calculadora vectorial
Este ejercicio consiste en diseñar un programa que sea capaz de
hacer operaciones con magnitudes vectoriales. Introduciendo los valores
de un vector (su módulo y su argumento) el programa debe ser
capaz de dibujarlo al pulsar en un botón.
Después de dibujar dos vectores, el programa debe dibujar el
vector suma y el vector diferencia. Si el usuario introduce más
de 3 vectores, el programa sólo calculará la suma o
resultante.
Figura interface calculadora
El aspecto del interface de programa con el usuario podría ser,
por ejemplo, como este:
Tenemos una barra deslizante para fijar el módulo entre 0 y 500,
con un texto estático que indica el valor del módulo
elegido.
Otra barra deslizante nos servirá para elegir el ángulo,
entre 0 y 360 grados, con un texto estático que indica el
ángulo elegido.
Hay, además, 4 botones con funciones bien definidas:
? Dibujar. Representa en la pantalla el vector
elegido con las barras deslizantes.
? Calcular. Calcula los vectores suma y/o diferencia
y los dibuja.
? Borrar. Limpia del escritorio los vectores
dibujados para un nuevo cálculo, y
? Cerrar. Cierra el programa.
El aspecto del escritorio, al realizar un cálculo, podría
ser como se muestra aquí:
Figura escritorio calculadora
Cada vector lleva una etiqueta, rotulada cerca de la flecha pero sin
interferir con ella, en la que se identifica de qué vector se
trata, su módulo y su argumento. Además, los resultados
del cálculo, la suma y la resta, se representan con un color y
un grosor distintos de los vectores que intervienen en la
operación.
Epílogo
Bien, espero que hayas disfrutado de tu aprendizaje como programador.
Ahora no me queda más que animarte a que apliques lo que has
aprendido a crear los programas que puedas imaginar. Buena suerte.
Luis González
Profesor de Tecnologías de la Información
Madrid 060530