Академический Документы
Профессиональный Документы
Культура Документы
Indice:
MSWLogo
Logo es un lenguaje de programacin, desarrollado a finales de los aos
70 por un equipo de matemticos, dirigidos por Seymour Papert en la
Universidad de California (Berkeley), con el fin de entrenar el pensamiento
lgico.
Todas las versiones de Logo desarrolladas para Unix, DOS, Macintosh y
Windows, son gratuitas y pueden ser copiadas y distribuidas, sin ningn
tipo de restriccin, con fines educativos. MSWLogo es la versin de Logo
para Windows.
Originalmente, el lenguaje Logo estaba destinado a controlar el
movimiento de un vehculo robotizado, con aspecto de tortuga, controlado
desde un ordenador. En la actualidad, el icono de la tortuga se ha
sustituido por un tringulo 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 lpiz 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 cdigo 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 instruccin 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 mquina,
es decir, convertidos a unos y ceros, para que se puedan cargar en
memoria y ser ejecutados.
ACCIN
ABREVIADO
AVANZA 150
RETROCEDE 80
RE 80
GIRADERECHA 15
GD 15
BAJALAPIZ
GOMA
OCULTATORTUGA
BL
OT
MT
BORRAPANTALLA
BP
BORRATEXTO
BT
CENTRO
ROTULA [hola]
RO [hola]
PONGROSOR [3 3]
ADIOS
Sale de MSWLogo.
Procedimientos
Un procedimiento es un fragmento de programa, formado
por una sucesin 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 declaracin
de comienzo, seguida por el nombre del procedimiento y terminan con la
palabra fin, que es la declaracin de cierre. Entre ambas declaraciones se
sitan 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
ms del lenguaje.
Crear un procedimiento
Ejercicio 1: Hola mundo
4 de 50
Modificar un procedimiento
Ejercicio 2: escribe dos frases
Modifica el procedimiento tax de forma que escriba el mensaje "Hola,
mundo" y en la siguiente lnea "Qu tal va todo?" en la pantalla de
trabajo. Para ello abre el editor y aade otra lnea:
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 ms
sencilla de modificar o mejorar un procedimiento ya escrito.
escribe la palabra
escribe la frase <hoy es
escribe las palabras de la
10/12/2015 18:45
5 de 50
comprubalo!
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
Invcalo, escribiendo mox en la lnea de comandos de la ventana de
trabajo. Notars que el rtulo aparece en la direccin apuntada por la
tortuga.
10/12/2015 18:45
6 de 50
Primitiva pontamaotipo
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 coleccin de fuentes de tu sistema operativo, como su tamao y
formato. Su sintaxis es como sigue:
pontamaotipo [ [Arial] alto ancho inclinacin grosor]
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 asignndole 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
instruccin 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 instruccin puede leerse as: crea un rtulo 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 grfica:
10/12/2015 18:45
7 de 50
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 nmeros (levantando la tortuga antes de rotular el resultado) y
que, al final no se vea la tortuga. Sabrs hacerlo?
Como ves, en este procedimiento hemos declarado tres variables llamadas
numero1, numero2 y resultado. Observa atentamente cundo utilizamos
su nombre y cundo utilizamos su valor.
Instruccin
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
10/12/2015 18:45
8 de 50
10/12/2015 18:45
9 de 50
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 versin guardada de misejercicios.lgo y
que estn disponibles todos los procedimientos que incluiste en ese
archivo.
limpia
centro
ponpos
[x y]
ponrumbo
pos
10/12/2015 18:45
10 de 50
100
100
100
100
100
100
subelapiz
subelapiz
subelapiz
subelapiz
subelapiz
subelapiz
avanza
avanza
avanza
avanza
avanza
avanza
100
100
100
100
100
100
sl av 10 bl av 40 sl centro
10/12/2015 18:45
11 de 50
ponrumbo
ponrumbo
ponrumbo
ponrumbo
ponrumbo
ponrumbo
ponrumbo
ot
fin
45 sl av 10 bl av 40 sl centro
90 sl av 10 bl av 40 sl centro
135 sl av 10 bl av 40 sl centro
180 sl av 10 bl av 40 sl centro
-135 sl av 10 bl av 40 sl centro
-90 sl av 10 bl av 40 sl centro
-45 sl av 10 bl av 40 sl centro
Manejar el lpiz
Para hacer dibujos en la pantalla grfica, manejamos el lpiz virtual que
est asociado a la tortuga. Hay un grupo de primitivas bsicas, dedicadas
al manejo del lpiz, que debes conocer:
PRIMITIVA
ABREVIADO
ACCIN
subelapiz
sl
bajalapiz
bl
poncl n
pongrosor [g g]
pong [g g]
goma
ponlapiz
pla
10/12/2015 18:45
12 de 50
Repeticin
Para evitar la escritura repetida de lneas de cdigo
idnticas o muy parecidas, recurrimos a primitivas que
indican al ordenador cuntas veces debe repetir una
instruccin
10/12/2015 18:45
13 de 50
Comentarios en el cdigo
Completar con comentarios las lineas de cdigo es una
buena idea. Los comentarios empiezan con el smbolo ;
(punto y coma). Todo lo que se escriba a continuacin del
punto y coma no se ejecuta en el programa.
Gracias a los comentarios es ms fcil recordar las ideas
que tuvimos al programar, y otro programador puede
reparar o mejorar el cdigo de nuestro programa.
fin
10/12/2015 18:45
14 de 50
Los colores
Los colores de la pantalla y el lpiz, se fijan con las
rdenes poncp y poncl seguidos de un cdigo de color.
Ese cdigo del color puede ser un nmero, entre 0 y 15,
de modo que cada nmero se corresponde con un color
de la tabla siguiente, por ejemplo: poncl 1 elige el lpiz
azul.
Tambin 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
10
11
12
13
7
15
10/12/2015 18:45
15 de 50
Rellenar de color
Las figuras creadas en el entorno grfico 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
10/12/2015 18:45
16 de 50
10/12/2015 18:45
17 de 50
10/12/2015 18:45
18 de 50
10/12/2015 18:45
19 de 50
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 sucesin de datos, que
pueden ser letras, palabras completas, variables o nmeros. Para
referirnos a uno de los elementos de una lista bastara con utilizar el
ndice que seala 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 bastara con citar los
ndices que sealan 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 Len Huelva)
har que aparezca Zaragoza Toledo Len 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 grfica
haz k -240
haz w 110
ponpos (lista :k :w)
desplazar la tortuga hasta las coordenadas -240 110
40. Al presentar datos en pantalla comprenders la utilidad prctica de
las listas. Por ejemplo, escribe un procedimiento, llamado sumar, que nos
pida dos nmeros y nos devuelva el resultado de sumarlos en la ventana
de grficos.
para sumar
bp gd 90 ot sl bt
; inicializa las pantallas
ponpos [-200 0]
; sita el puntero
rotula [Qu nmeros quieres sumar?]
haz "num1 leepalabra
; pide al usuario el primer nmero
haz "num2 leepalabra
; pide y captura el segundo nmero
bp gd 90
; limpia la pantalla
10/12/2015 18:45
20 de 50
ponpos [-200 0]
; sita 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 nmeros largos, se producen problemas al
rotular cada una de las partes del mensaje de salida.
41. Si quieres que la presentacin del resultado sea ms elegante, en
una sola lnea de cdigo y sin tener que preocuparte de cunto espacio
necesitas para cada cifra, puedes conseguirlo utilizando la primitiva lista.
El procedimiento sumar quedara as:
para sumar
bp gd 90 ot sl bt
ponpos [-200 0]
rotula [Qu nmeros 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 lnea de cdigo hemos resuelto la presentacin. Mucho ms
elegante, no es cierto? Prubalo introduciendo nmeros 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 escribindolo en la pantalla.
para identidad
bp gd 90 ot sl bt
rotula [Cul es tu nombre y apellidos?]
haz "napel leelista
10/12/2015 18:45
21 de 50
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 cuntos 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
10/12/2015 18:45
22 de 50
indicados
frase palabra1 palabra2 ...
;forma una frase con las palabras
indicadas
elemento indice objeto
;devuelve el carcter, o la palabra, que ocupa
la posicin del ndice
45. Por ejemplo, podemos componer el cdigo 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, aadiendo una
instruccin 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 cul es la letra inicial de tu nombre.
para inicial
bp ot sl gd 90
rotula [Cul es tu nombre?]
haz "letra primero leepalabra
bp gd 90
ponpos [-100 0]
rotula [Tu nombre empieza por ]
ponpos [125 0]
rotula :letra
fin
Clculos matemticos
Primitivas entero, redondea y raizcuadrada
48. Haz un procedimiento que nos pida un nmero con decimales y nos
devuelva la parte entera del mismo, el nmero redondeado y su raz
cuadrada, en la ventana de trabajo.
para numeros
bt
escribe [ESCRIBE UN NUMERO CON DECIMALES]
10/12/2015 18:45
23 de 50
10/12/2015 18:45
24 de 50
Qu bonito! Lee atentamente el cdigo de las lneas en las que se fijan las
coordenadas en las que dibujar una estrella y trata de comprender por
qu las he escrito as.
10/12/2015 18:45
25 de 50
10/12/2015 18:45
26 de 50
10/12/2015 18:45
27 de 50
programa
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
;sita 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 crculo y lo rellena
espera 3]
;una pequea pausa
fin
Debes comprobar que la ejecucin 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 das de la semana (lunes, martes,
mircoles, etc.) en un bucle que no se detiene hasta que el usuario pulse
una tecla en el teclado:
Figura semana
Cdigo ASCII
El cdigo ASCII establece la equivalencia entre cada uno de los smbolos
de texto que pueden introducirse en el teclado, y un valor numrico
binario de 8 bits (1 byte).
A la letra "A", por ejemplo, le corresponde el nmero 65 en binario
determinado, a la "z" le corresponde el nmero 122, y as sucesivamente.
Tambin estn incluidos los smbolos grficos 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
cdigo 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 nmero y el carcter
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 grfica en forma de
tabla? Intntalo
a)
65. Escribe ahora un procedimiento que nos pida una letra y devuelva
su cdigo ASCII en la pantalla.
para traduce
10/12/2015 18:45
28 de 50
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
Ejecucin secuencial y ejecucin condicionada.
En algunos casos, para escribir el cdigo de un programa, basta con
escribir una serie ordenada de primitivas, que se ejecutarn una detrs de
otra (ejecucin secuencial).
Pero es frecuente tambin que en un programa haya que ejecutar unas
primitivas u otras en funcin de alguna condicin. De esta forma la
ejecucin del programa se ramificar por unas primitivas u otras, segn
se vayan dando determinadas condiciones (su ejecucin est
condicionada).
Primitivas si y sisino
La primitiva si permite ordenar al programa que ejecute una accin, en
funcin de que una condicin se cumpla o no. La sintaxis de la primitiva si
es la siguiente:
si condicin accion
Si la condicin es verdadera ejecuta la accin. Si la condicin es falsa no
hace nada y pasa a la instruccin 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 nmero. Si el nmero que introducimos es positivo se mostrar
su raz cuadrada. Si es negativo no debe calcularlo, ya que dara un error.
para numpos
bt
escribe [INTRODUCE UN NMERO EN LA VENTANA]
haz "valor leepalabra
bt
escribe (lista "El "nmero "es: :valor)
si :valor>0 [escribe (lista "Su "raiz "cuadrada "es: rc :valor)]
fin
La primitiva si tambin permite ordenar al programa que ejecute una
accin u otra, en funcin de que una condicin se cumpla o no. En este
caso, la sintaxis de la primitiva si es la siguiente:
si condicin [accion1] [accion2]
Si la condicin es verdadera ejecutar la accin1. Si la condicin es falsa
ejecutar la accin 2.
67. Por ejemplo: escribe un procedimiento, llamado posneg, que nos
pida un nmero. Si el nmero que introducimos es positivo se mostrar
su raz 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 NMERO EN LA VENTANA]
haz "valor leepalabra
10/12/2015 18:45
29 de 50
bt
escribe (lista "El "nmero "es: :valor)
si :valor>0 [escribe (lista "Su "raiz "cuadrada "es: rc :valor)] [escribe (lista
"No "tiene "raiz, "es "un "nmero "negativo)]
fin
La sintaxis de la primitiva si exige que las dos acciones estn en la misma
lnea de cdigo. Hay una primitiva que se comporta de un modo
semejante: se llama sisino. Su sintaxis es similar:
sisino condicin [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 lnea:
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 "Cunto "lo "siento!! "Fallaste. " "No "es :respuesta)]
fin
69. Ahora, y para terminar con las prcticas de ejecucin 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 crculo azul
d) Un tringulo amarillo
e) Un pentgono blanco
Si respondes a dibujar un cuadrado rojo; si tecleas b deber dibujar un
crculo 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 tamao 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 nmero determinado de veces o hasta que se cumple una condicin
fijada de antemano.
Primitivas mientras y hasta
Hay dos primitivas, llamadas mientras y hasta, que permiten la ejecucin
repetida de un bucle del programa mientras una expresin sea cierta o
hasta que una expresin sea cierta. Su sintaxis es como sigue:
mientras [expresin] [lista de instrucciones a ejecutar]
hasta [expresin] [lista de instrucciones a ejecutar]
La primitiva hasta ejecutar repetidamente la lista de instrucciones
establecida tantas veces como haga falta, hasta que la expresin tenga el
10/12/2015 18:45
30 de 50
10/12/2015 18:45
31 de 50
Primitiva haz.hasta
Esta primitiva es semejante a la anterior. Ejecutar repetidamente un
conjunto de instrucciones y lo har tantas veces como la condicin lgica
especificada permanezca con valor FALSO. Primero ejecutar las
instrucciones y luego evaluar si sigue sin cumplirse la condicin, por lo
que las instrucciones se ejecutarn al menos una vez. La sintaxis de esta
primitiva es como sigue:
haz.hasta [conjunto de instrucciones] [condicin 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
10/12/2015 18:45
32 de 50
bp sl gd 90 ot
;inicia la tortuga
poncp [40 10 90] poncl [220 200 80] ;elige los colores
pontamaotipo [[Times New Roman] ;tipo de letra Times
400 200
;tamao 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 nmero
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 ms de medio segundo
haz "k :k+1
;incrementa el contador
bp gd 90] [:k>30]
;limpia la pantalla
ponpos [-400 200]
;posicin idnea para el cartel de FIN
rotula "FIN
fin
Primitiva formatonumero
Cuando hay que fijar el tamao y la forma de presentacin de una cifra
numrica, recurriremos a la primitiva formatonumero. Esta primitiva
entrega una palabra con una representacin del nmero que se quiere
presentar, con un tamao mnimo de caracteres y un nmero de dgitos
de precisin despus del punto decimal. La sintaxis es como sigue:
formatonmero nmero tamao precisin
nmero es la cifra que hay que presentar
tamao indica el nmero mnimo de caracteres que tendr la palabra,
incluyendo los dgitos de precisin especificados. Si fuese necesario,
aadir espacios en blanco delante de la cifra para alcanzar el tamao de
palabra indicado.
precisin indica el nmero de cifras decimales despus del punto
75. Para poner un ejemplo, hagamos un procedimiento llamado
formato203 que genere una lista de nmeros entre el 5,00 y el 15,00 con
dos decimales y con un incremento entre ellos de 0,03.
para formato203
bt
escribe [NMEROS 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 lgicas
Primitivas lgicas o, no, y, bity, bito y bitinverso
Naturalmente, un lenguaje de programacin debe servir para manejar
funciones lgicas bsicas: Y, O, OEXCLUSIVA, etc.
La funcin lgica y evala 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
10/12/2015 18:45
33 de 50
si debe evaluar ms de 2
76. Por ejemplo: escribe un procedimiento llamado logica, que nos pida
dos nmeros. Si los dos nmeros 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 "nmeros "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
"nmeros "es "menor "que "100)]
fin
La funcin lgica o evala 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 ms de 2
expresiones
77. Para comprenderlo, vamos a redactar un procedimiento llamado
logica2 que nos pida dos nmeros, uno de los cuales debe ser mayor que
500. Si uno o los dos nmeros son mayores que 500, nos devolver la
suma de ambos. Si los dos nmeros 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 "nmeros. "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 "nmeros "son
"menores "que "500)]
fin
La primitiva bity devuelve el resultado de aplicar la funcin lgica Y sobre
dos o ms nmeros, que deben ser nmeros enteros. Su sintaxis es como
sigue:
bity numero1 numero2
Si debe hacer el clculo con 2 nmeros
(bity numero1 numero2 numero3 ...) Si debe calcularlo con ms de 2
nmeros
La primitiva bito devuelve el resultado de aplicar la funcin lgica O sobre
dos o ms nmeros enteros. Su sintaxis es similar a la de la primitiva bity
10/12/2015 18:45
34 de 50
10/12/2015 18:45
35 de 50
Primitiva devuelve
La primitiva devuelve finaliza la ejecucin del procedimiento en el que
aparece. Este procedimiento devuelve el dato que lo acompaa al contexto
en el que fue invocado su procedimiento.
80. Por ejemplo: escribe un procedimiento llamado multiplica, que
reciba dos nmeros 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 ms variables, que slo tendrn
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 acompaan a la
instruccin. Las variables de alcance local en un procedimiento estarn
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 nmero y
dibuje un rectngulo cuyo lado horizontal sea 3 veces el vertical. La altura
del lado vertical ser el nmero recibido. Las variables que utilice dicho
procedimiento sern de carcter 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
Programacin orientada a objetos
La tcnica de programacin orientada a objetos consiste, a diferencia de la
programacin estructurada mediante procedimientos, en organizar la
interaccin con el usuario a travs de objetos que aparecen en pantalla.
Son objetos caractersticos las ventanas, botones, casillas de seleccin, etc.
Los objetos son los elementos bsicos de la interfaz grfica de usuario GUI
10/12/2015 18:45
36 de 50
10/12/2015 18:45
37 de 50
Primitiva boton
Un botn es un elemento que permite manipular un programa mediante
el ratn, 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 botn 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 (fjate 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 botn, que tiene 30 x 20. Las coordenadas de la posicin del
10/12/2015 18:45
38 de 50
Primitiva barradesplazamiento
Una barra de desplazamiento es un objeto que tiene un cursor que puede
desplazarse mediante el ratn, para dar diversos valores a una variable.
91. Escribe un procedimiento que cree una ventana, llamada tercera, en
la que haya un botn 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 ttulo (Mi primera barra deslizante) y la barra
(que en nuestro caso mide 80 de largo). La altura de la ventana ha de
10/12/2015 18:45
39 de 50
bastar para que quepan tanto la barra (nuestra barra mide 80 x 10) como
el botn (que mide 30 x 20). Las coordenadas de la posicin del botn y de
la barra pretenden que queden centrados en la ventana. Comprueba que
puedes mover el cursor con el ratn y que puedes cerrar la ventana.
Fjate 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 posicin y
su raz cuadrada. Tendremos, adems, un botn que sirva para cerrar la
ventana.
para venbar
creaventana " "ultima [Calculadora automtica 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 esttico estat2 deber tener como valor
inicial la raz cuadrada de 150 (sealado 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 aadir 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 dilogo se cierre.
93. Vamos a crear una ventana de dilogo que pida al usuario que
acepte pulsando un botn. Pero, en primer lugar, vamos a crear el
procedimiento que cerrar la ventana al pulsar el botn:
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:
10/12/2015 18:45
40 de 50
10/12/2015 18:45
41 de 50
10/12/2015 18:45
42 de 50
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 simultneamente.
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 nmero. Cuando pulsemos un botn aparecer un mensaje
indicando el estado de cada uno de ellos. Tendr, adems, otro botn que
permita cerrar la ventana.
para vencom
creaventana " "ultima [Ventana con casillas de comprobacin] 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, TRINGULO, PENTGONO y HEXGONO.
Despus de elegir una de las opciones de la lista, al pulsar el botn
10/12/2015 18:45
43 de 50
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 expresin que no est en
la lista.
Para crear un combobox hay que utilizar la sintaxis siguiente:
creacombobox ventana nombre Titulo posx posy largo alto
10/12/2015 18:45
44 de 50
Una vez creado, podemos aadir el texto de las opciones que se ofrecen en
la lista:
aadelineacombobox nombre [expresion 1]
aadelineacombobox nombre [expresion 2]
...
A continuacin, designamos cul de las opciones aparecer seleccionada
por defecto al crearse el combobox
pontextocombobox nombre [expresion x]
Para averiguar cul es la opcin elegida por el usuario, utilizaremos la
expresin:
leetextocombobox nombre
100. Para mostrar un ejemplo del uso del objeto combobox, veamos el
procedimiento elige, en el que MSWLogo dibujar un polgono, con un
nmero de lados elegido por el usuario mediante una ventana combobox:
para elige
creaventana " "miventana (lista "Elige "el "nmero "de "lados) 20 20 100
120 [ ]
creacombobox "miventana "micombo 25 0 50 50
aadelineacombobox "micombo [3 lados]
aadelineacombobox "micombo [4 lados]
aadelineacombobox "micombo [5 lados]
aadelineacombobox "micombo [6 lados]
aadelineacombobox "micombo [7 lados]
aadelineacombobox "micombo [8 lados]
aadelineacombobox "micombo [9 lados]
aadelineacombobox "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 cdigo 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 ms solicitados, pero tambin permite al cliente solicitar un
destino que no est en esa lista. Un objeto combobox es la opcin ideal:
para viaje
creaventana " "destino [Elija el destino de su viaje] 150 80 120 120 []
creacombobox "destino "listado 20 5 80 50
10/12/2015 18:45
45 de 50
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
10/12/2015 18:45
46 de 50
10/12/2015 18:45
47 de 50
10/12/2015 18:45
48 de 50
necesarias.
? Aade 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 desafo mayor, haz que se pueda invocar el procedimiento
damero :lado de tal forma que sea capaz de construir el tablero con los
cuadrados del tamao 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. Aade adems un cerco decorativo a los
cuadrados que forman el tablero.
Figuras dos dameros
2. Escapar del corral
Este programa busca mostrar a la tortuga movindose 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 pequeo pasillo para escapar, y otro que hace que la
tortuga se mueva al azar.
Figura corral
El movimiento de la tortuga debe ser errtico, girando al azar a la
izquierda y a la derecha despus de cada pequeo paso. Por ejemplo:
gd azar 30 gi azar 22
de 0 22 (izda.)
Cada vez que la tortuga tropieza con el muro, debera 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 analgico,
es decir con agujas para sealar la hora, los minutos y los segundos. El
10/12/2015 18:45
49 de 50
diseo de la esfera del reloj es libre, para que puedas darle un toque
personal: un reloj moderno o antiguo, con todas las cifras o slo con las
cuatro cifras principales, con trazos o con vietas para sealar las horas y
minutos, con colores atractivos, etc.
Figura Reloj
Para facilitar la construccin del programa es conveniente que dividas el
cdigo 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 ms 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 aadir 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 disear un programa que sea capaz de hacer
operaciones con magnitudes vectoriales. Introduciendo los valores de un
vector (su mdulo y su argumento) el programa debe ser capaz de
dibujarlo al pulsar en un botn.
Despus de dibujar dos vectores, el programa debe dibujar el vector suma
y el vector diferencia. Si el usuario introduce ms de 3 vectores, el
programa slo calcular la suma o resultante.
Figura interface calculadora
El aspecto del interface de programa con el usuario podra ser, por
ejemplo, como este:
Tenemos una barra deslizante para fijar el mdulo entre 0 y 500, con un
texto esttico que indica el valor del mdulo elegido.
Otra barra deslizante nos servir para elegir el ngulo, entre 0 y 360
grados, con un texto esttico que indica el ngulo elegido.
Hay, adems, 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
clculo, y
? Cerrar. Cierra el programa.
El aspecto del escritorio, al realizar un clculo, podra ser como se
muestra aqu:
Figura escritorio calculadora
10/12/2015 18:45
50 de 50
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 mdulo
y su argumento. Adems, los resultados del clculo, la suma y la resta, se
representan con un color y un grosor distintos de los vectores que
intervienen en la operacin.
10/12/2015 18:45