Anterior
Manual de aprendizaje MSWLogo

Siguiente


Indice:

MSWLogo


Si quieres, puedes descargar el manual en formato pdf para imprimirlo

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



Arriba


Anterior Inicio
Tecnologías de la Información

Siguiente