Tutorial Basic256 PDF
Tutorial Basic256 PDF
Tutorial Basic256 PDF
http://www.basicbook.org
James M. Reneau
P.O. Box 278
Russell, Kentucky 41169-2078 USA
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 1 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 2 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 3 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
TABLA DE CONTENIDOS
Prefacio.....................................................................................................................14
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 4 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Capítulo 11: Control del Teclado – Usando el Teclado para hacer Cosas.......117
Obteniendo la última tecla presionada...........................................................................117
Ejercicios:...................................................................................................................... 123
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 5 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Ejercicios:...................................................................................................................... 143
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 6 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Apéndice H: Glosario............................................................................................251
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 7 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
INDICE DE PROGRAMAS
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 8 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 9 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 10 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 11 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Programa 119: División simple que puede dar Error en Tiempo de Ejecución.
.................................................................................................................................208
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 12 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 13 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
INDICE DE ILUSTRACIONES
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 14 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 15 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Agradecimientos
Dedicatoria:
Créditos:
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 16 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Prefacio
capítulos 10, 11, 12, 13*, 14, 15, 16, 17 and 19* para el segundo ciclo de 9
semanas
2. una breve introducción a los conceptos de programación
capítulos 1, 3**, 4* , 5, 6, 7, 9, and 14
3. una introducción a estructura de datos para no-programadores.
capítulos 1, 3**, 4* , 5, 6, 7, 9, 14, 15*, 16*, 17 and 18
4. un breve proyecto de programación para un curso de sistemas de bases de
datos
capítulos 1, 3**, 4* , 5, 6, 7, 9, 14, 15*, 16*, 19 and 20
5. un breve proyecto de programación para un curso sobre redes
capítulos 1, 3**, 4* , 5, 6, 7, 9, 14, 15*, 16*, 19 and 21
* Capítulo Opcional
** Sólo sección de Variables
Numéricas.
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 17 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
La ventana de BASIC-256
La ventana de BASIC-256 está dividida en cinco secciones: La Barra de Menú (Menu Bar),
la Barra de Herramientas, (Tool Bar) El Area de Programa (Program Area), el Area de
Salida de Texto (Text Output Area) y el Area de Salida Gráfica (Graphics Output Area) (Ver
Ilustración 1: La Ventana de BASIC-256 a continuación).
Barra de Menú:
La Barra de Menú contiene varios y diferentes menús desplegables. Estos menús incluyen:
"FILE" (Archivos), "EDIT" (Edición), "VIEW" (Ver), "RUN" (Correr, Ejecutar), y "ABOUT"
(Acerca de…).
El menú FILE el permite guardar y recargar programas guardados, imprimir y salir de
BASIC-256.
El menú EDIT nos permite cortar, copiar y pegar texto e imágenes desde el programa y las
áreas de salida texto y gráfica.
El menú VIEW nos permite elegir el mostrar u ocultar varias partes de la ventana de
BASIC-256.
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 18 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
El menú RUN nos permite ejecutar y depurar (debug) nuestros programas (NdT: Depurar
un programa es correrlo en un modo especial que nos permite ejecutarlo línea por línea y
así, por ejemplo, buscar y encontrar errores)
El menú ABOUT muestra una ventana de diálogo con información acerca de BASIC-256 y
la versión que está usando.
Barra de Herramientas:
Las opciones de menú más usadas están también disponibles en la Barra de Herramientas.
Área de Programa:
Los programas consisten en instrucciones para decirle a la computadora exactamente QUE
hacer y COMO hacerlo. Ud. escribirá sus programas, los modificará y corregirá, y cargará y
guardará los mismos en esta área de la pantalla.
Área de Salida Texto:
En esta área se mostrará la salida de su programa. Esta puede incluir números y palabras.
Si el programa necesita hacerle una pregunta, la misma (y lo que Ud. responda) será
mostrado aquí.
Área de Salida Gráfica:
BASIC-256 es un lenguaje de programación gráfico (como pronto verá). Formas, figuras y
gráficos que Ud. creará con sus programas serán mostrados aquí.
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 19 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
say
La expresión say es usada para hacer que BASIC-256 lea una
expresión en voz alta usando los parlantes de la computadora.
Para terminar el programa en el que está trabajando y empezar con uno completamente
nuevo, utilice el botón “New” (Nuevo) en la Barra de Herramientas. El botón le mostrará la
siguiente ventana de diálogo:
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 20 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Si realmente desea sacar el programa de pantalla, presione “Yes”. Caso contrario, presione
“Cancel” (cancelar) y todo quedará como si no hubiere presionado el botón “New”.
También puede, con el comando say, hacer decir a la computadora los números en voz
alta. Pruebe el siguiente programa:
1 say 123456789
Programa 2: Diga un Número
Después de escribir el programa en el Área de Programa, use el mouse para hacer clic en
el botón “Run” de la Barra de Herramientas. ¿Dijo BASIC-256 lo que esperaba?
números
BASIC-256 le permite ingresar números en formato decimal. No use
comas para separar los cientos o miles cuando ingrese números
grandes. Si necesita ingresar un número menor que cero,
simplemente coloque el signo negativo (-) precediéndolo.
Ejemplos: 1.56, 23456, -6.45 y .5
Operador Operación
Suma
+ expresión1 + expresión2
- Resta
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 21 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
expresión1 - expresión2
Multiplicación
* expresión1 * expresión2
División
/ expresión1 / expresión2
Tabla 1: Operadores Matemáticos Básicos
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 22 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
1 say 12 * (2 + 10)
Programa 3: Diga la Respuesta
La computadora le debería haber dicho "144" (Verifique el volumen…).
1 say 5 / 2
Programa 4: Diga otra respuesta
¿Escuchó a la computadora decir "2.5"?
+
-
*
/
()
Las cuatro operaciones matemáticas básicas trabajan con números
para efectuar cálculos. Se requiere un valor numérico a ambos lados
de estos operadores. Es posible también usar paréntesis para
agrupar operaciones.
Ejemplo: 1 + 1, 5 * 7, 3.14 * 6 + 2, (1 + 2) * 3 y 5 - 5
Probemos otra:
1 say 2 + " monedas mas"
Programa 6: Diga Dos Monedas Más
El signo + en el último ejemplo fue usado como operador de concatenación debido a que el
segundo término es un string. Como la computadora no sabe cómo hacer matemáticas con
strings, entonces concatena.
+ (concatenar)
Otro uso para el signo (+) es decirle a la computadora que concatene
(junte) strings.
Si uno o ambos operandos son del tipo string, la concatenación se
hará sin problemas y se obtendrá un string más largo. Si ambos
operandos son numéricos, entonces se sumarán.
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 23 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
print expresion
print expresion;
El comando print es usado para mostrar texto y números en el Area
de Salida de Texto de la ventana de BASIC-256. Cada comando print
comienza en una nueva línea, pero Ud. puede imprimir varias cosas
en una misma línea usando punto y coma (;) al final de la expresión.
El comando print, por defecto, avanza en el área de texto de modo que el siguiente print es
sobre la próxima línea. Si Ud. Coloca un “;” (punto y coma) al final de la expresión a ser
impresa, se suprimirá el avance de línea, de modo que el próximo print se hará, a
continuación, en la misma línea.
1 cls
2 print "Hola ";
3 print "mundo, ";
4 print "estoy aquí!."
Programa 8: Varios print en una sola línea
cls
El comando cls limpia toda la información mostrada en el Área de
Salida de Texto.
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 24 of 258
Capítulo 1: Conociendo BASIC-256 – Diga Hola
Ejercicios:
z a h d g p b a n n q m c
j g j r o i q l o c q o x
r u n t u u n i l c n s z
v w s y o b s s k c y l l
e n a t i s s p a n p a x
r s e p e q r t t f r p t
r b k r y o e a r m m r a
o r p i g n x d o i f n i
r x n r a y t i h l n a f
e g a t m d w n v e d g i
t m i a c v c e i j f d n
b o t c c a u s o r c i s
n a m z i z i g n c p r u
cls, concatenation, error, expression, print, program, quote, run, say,
stop, string, syntax
© 2014James M. Reneau (CC BY-NC-SA 3.0 US) Traducción al castellano por Oswy (Mayo 2014)
Página 25 of 258
Capítulo 2: Dibujando Formas Básicas
#
rem
Las declaraciones # y rem definen “comentarios”.
Una declaración comentario permite al programador poner notas
descriptivas en el programa. La computadora “ve” las declaraciones #
o rem e ignora todo el resto del texto en la línea
En la línea 3 del programa puede verse la declaración clg. Es similar a la declaración cls
que vimos en el Capítulo 1, excepto que clg limpiará el Área de Salida Gráfica de la
pantalla.
clg
El comando clg borra el área de salida gráfica de modo que
tendremos un lugar limpio para visualizar nuestros dibujos.
Nombre del Color y valores RGB Nombre del Color y valores RGB
El área de salida gráfica, por defecto, es de 300 píxeles de ancho (x) por 300 píxeles de
alto (y). Un pixel es el punto más pequeño que puede ser mostrado en su monitor. El
vértice superior izquierdo es el origen (0,0), y el inferior derecho corresponde a (300,300).
Cada píxel puede ser representado por un par de números, el primero (x) mide cuán lejos
del eje X (lado superior) está, y el segundo (y) cuán lejos del eje Y (lado derecho). Este
modo de marcar los puntos en el plano se conoce en matemáticas como Sistema de
Coordenadas Cartesiano.
Siguiendo el análisis del Programa 9, la línea 5 del mismo contiene rect. Es usado para
dibujar un rectángulo en pantalla. Toma cuatro números separados por comas; los 2
primeros corresponden a las coordenadas del vértice superior izquierdo y los dos últimos a
la del vértice inferior derecho (ver ilustración siguiente). Los 4 números son expresados en
unidades de píxeles.
altura
ancho
Ilustración 7: Rectángulo
La línea 7 del programa introduce la declaración circle para dibujar un círculo. Este toma 3
argumentos numéricos, los primeros 2 corresponden a las coordenadas cartesianas de su
centro (en píxeles) y el tercero su radio (en píxeles también).
Ilustración 8: Círculo
circle x, y, radius
La declaración circle usa el color de dibujo corriente y dibuja un
círculo lleno con su centro en (x, y) y radio r especificado.
A continuación un par de programas ejemplo que usan las nuevas declaraciones clg,
color, rect and circle. Ingrese los programas e introduzca modificaciones. Dibuje con ellos
una cara ceñuda, una cara alienígena o una que luzca como alguien que Ud. conozca.
1 # c2_rectanglesmile.kbs
2 # dibuje una cara sonriente con rectángulos
3
4 # limpie el area gráfica
5 clg
6
7 # dibuje la cara
8 color yellow
9 rect 0,0,299,299
10
11 # dibuje la boca
12 color black
13 rect 100,200,100,25
14
15 # ponga los ojos
16 color black
17 rect 75,75,50,50
18 rect 175,75,50,50
19
20 say "Hola!."
Programa 10: Cara con Rectángulos
1 # c2_circlesmile.kbs
2 # cara sonriente hecha con círculos
3
4 # limpie la pantalla
5 clg
6 color white
7 rect 0,0,300,300
8
9 # dibuje la cara
10 color yellow
11 circle 150,150,150
12
13 # dibuje la boca
14 color black
15 circle 150,200,70
16 color yellow
17 circle 150,150,70
18
19 # coloque los ojos
20 color black
21 circle 100,100,30
22 circle 200,100,30
Programa 11: Cara sonriente con círculos
1 # c2_triangle.kbs
2 # dibuja un triangulo
3 clg
4 color black
5 line 150, 100, 100, 200
6 line 100, 200, 200, 200
7 line 200, 200, 150, 100
Programa 12: Dibuje un Triángulo
El siguiente programa es una muestra de lo que se puede hacer solo con líneas. Dibuja un
cubo 3D en la pantalla.
1 # c2_cube.kbs
2 # use lineas para dibujar un cubo en 3D
3 clg
4 color black
5
6 # dibuje el cuadrado del fondo
7 line 150, 150, 150, 250
8 line 150, 250, 250, 250
9 line 250, 250, 250, 150
10 line 250, 150, 150, 150
11
12 # dibuje el cuadrado del frente
13 line 100, 100, 100, 200
14 line 100, 200, 200, 200
15 line 200, 200, 200, 100
16 line 200, 100, 100, 100
17
penwidth n
Cambia el ancho de la “punta de lápiz” con el que se dibuja. La punta
del lápiz representa el ancho de la línea que está siendo dibujada y
también el ancho de la línea a usar para el contorno de la forma.
clear
La palabra clear puede ser usada en una declaración de color para
decirle a BASIC-256 que solo dibuje el borde de la figura. Esto se
logra definiendo el color de relleno como “clear”.
4 clg
5 color red
6 plot 99,100
7 plot 100,99
8 plot 100,100
9 plot 100,101
10 plot 101,100
11 color darkgreen
12 plot 200,200
Programa 15: Use Plot para dibujar puntos
Salida 15: Use Plot para dibujar puntos (marcados para enfatizar su ubicación)
plot x, y
Dibuja un punto (del tamaño de 1 pixel) del color corriente en la
posición x, y. O, lo que es equivalente, cambia el color del pixel en
coordenadas x, y al color corriente.
El Programa Grande siguiente toma la idea de una cara y hace que esta hable. Antes de
que el programa diga cada palabra, la parte inferior de la cara se redibuja con una forma
diferente de boca. Esto crea una animación gruesa y hace la cara más divertida.
1 # c2_talkingface.kbs
2 # dibuje el fondo de cara con ojos
3
4 color yellow
5 rect 0,0,300,300
6 color black
7 rect 75,75,50,50
8 rect 175,75,50,50
9
10 # borre la vieja boca
11 color yellow
12 rect 0,150,300,150
13 # dibuje la nueva boca
14 color black
15 rect 125,175,50,100
16 # diga la palabra
17 say "Yo"
18
19 color yellow
20 rect 0,150,300,150
21 color black
22 rect 100,200,100,50
23 say "estoy"
24
25 color yellow
26 rect 0,150,300,150
27 color black
28 rect 125,175,50,100
29 say "complacido"
30
31 color yellow
32 rect 0,150,300,150
33 color black
34 rect 125,200,50,50
35 say "que"
36
37 color yellow
38 rect 0,150,300,150
39 color black
40 rect 100,200,100,50
41 say "seas"
42
43 color yellow
44 rect 0,150,300,150
45 color black
46 rect 125,200,50,50
47 say "mi"
48
49 # dibuje toda la cara nueva con una sonrisa.
50 color yellow
51 rect 0,0,300,300
52 color black
53 circle 150,175,100
54 color yellow
55 circle 150,150,100
56 color black
57 rect 75,75,50,50
58 rect 175,75,50,50
59 say "amigo"
Ejercicios:
r e t a n i d r o o c
e e a r a e l c r u m
m e l c r i c e s s r
a c k v c e c c u y o
r y j l n t i i t p l
k a g t a h d h w l o
q n e n p a g i q o c
y r g a r i d p j t e
c l r e e t s a v e h
e g p h h u e n i l d
j r x p e n w i d t h
center, circle, clear, clg, color, coordinate, cyan, graphics, height, line,
penwidth, plot, radius, rectangle, remark, save, width
La frecuencia es medida en una unidad llamada hertz (Hz). Representa cuántos ciclos
(subidas y bajadas) la onda vibra en un segundo. Una persona normal puede oír
frecuencias desde los 20 Hz (sonidos muy bajos) hasta 20.000 Hz (sonidos muy altos).
BASIC-256 puede producir tonos en el rango de 50 Hz a 7000 Hz.
Otra propiedad del sonido es su longitud. Las computadoras actuales son muy rápidas y
pueden medir con precisión tiempos del orden de milisegundos. Un milisegundo (ms) es
una milésima (1/1000) de un segundo.
Hagamos algunos sonidos en nuestra computadora:
1 # c3_sounds.kbs
2 # sound = sonido
3 sound 233, 1000
4 sound 466, 500
5 sound 233, 1000
Programa 17: Reproducir tres notas individuales
Ud. debería haber oído un ruido como un “click” en sus parlantes entre las notas
reproducidas en el ejemplo anterior. Esto es causado porque la computadora necesita crear
¿Como hacemos para que BASIC-256 reproduzca un tono? La primera cosa que
necesitamos es convertir las notas musicales a frecuencias. La Ilustración 10 muestra dos
octavas de notas musicales, sus nombres y la frecuencia aproximada que la nota produce.
En música, Ud. también encontrará una marca especial llamada “pausa”. La pausa significa
no reproducir nada (silencio) por un cierto período de tiempo. Si en su programa está
usando una lista de sonidos, es posible insertar una pausa especificando una frecuencia =0
durante el tiempo necesario.
Ahora que tenemos las frecuencias necesitamos la duración para cada una de las notas.
La Tabla 2 muestra las notas y pausas más frecuentes, cuán largas estas son cuando son
comparadas entre sí, y unas pocas duraciones típicas.
Las duraciones en milisegundos (ms) pueden ser calculadas si se conoce el ritmo de la
música en beats (latidos) por minuto (BPM) usando la Fórmula 1:
Ahora, con la tabla y la fórmula para calcular las duraciones de las notas, podemos escribir
el programa para reproducir “Carga!”
1 # c3_charge.kbs
2 # reproduzca carga!
3
4 sound {392, 375, 523, 375, 659, 375, 784, 250, 659, 250, 784, 250}
5 say "Carga!"
Programa 19: Carga!
Variables Numéricas
Las computadoras son realmente buenas recordando cosas, ahí donde nosotros los
humanos a veces tenemos problemas. El lenguaje BASIC nos permite dar nombres a
lugares en la memoria de la computadora y luego guardar información en ellos. Estos
lugares son llamados variables.
Hay cuatro tipos de variables: variables numéricas, variables string, variables array
numérico (numeric array variables) y variables array string (string array variables). En este
capítulo aprenderá a usar variables numéricas, las otras en capítulos porteriores.
variable numérica
Una variable numérica le permite asignar un nombre a un
bloque de memoria RAM de su computadora. En su programa, Ud.
podrá guardar y recuperar valores numéricos (enteros o decimales)
de estas variables.
El nombre de una variable numérica debe empezar con una letra,
puede contener letras y números y es sensible a mayúsculas y
minúsculas. Ud. no puede usar palabras reservadas por el lenguaje
BASIC-256 como nombre de sus variables (Ver apéndice I).
Ejemplos de nombres válidos: a, b6, micasa, x, zoo.
1 # c3_numericvariables.kbs
2 # uso de variables numericas
3
4 let numerador = 30
5 let denominador = 7
6 let result = numerador / denominador
7 print result
Programa 20: Variables Numéricas simples
1 let a = 7
2 let b = a / 2 + .7
3 print a + b
Programa 21: Asignación de una variable
1 # c3_charge2.kbs
2 # reproducir Carga - usando variables
3
4 beats = 120
5 dottedeighth = 1000 * 60 / beats * .75
6 eighth = 1000 * 60 / beats * .5
7
8 sound {392, dottedeighth, 523, dottedeighth, 659, dottedeighth, 784,
eighth, 659, eighth, 784, eighth}
9 say "Charge!"
1 # c3_littlefuge.kbs
2 # Musica de J.S.Bach - XVIII Pequeña Fuga en G Menor
4 tempo = 100 # beats por minuto
5 milimin = 1000 * 60 # milisegundos en un minuto
6 q = milimin / tempo # cuarto de nota es un beat
7 h = q * 2 # media nota (2 cuartos)
8 e = q / 2 # octavo de nota (1/2 cuarto)
9 s = q / 4 # dieciseisavo de nota (1/4 cuarto)
10 de = e + s # octavo punteado - octavo + dieciseisavo
11 dq = q + e # cuarto punteado - cuarto + octavo
12
13 sound {392, q, 587, q, 466, dq, 440, e, 392, e, 466, e, 440, e, 392, e, 370,
e, 440, e, 294, q, 392, e, 294, e, 440, e, 294, e, 466, e, 440, s, 392, s, 440, e,
294, e, 392, e, 294, s, 392, s, 440, e, 294, s, 440, s, 466, e, 440, s, 392, s, 440,
s, 294, s}
Programa 24 : Programa Grande – Fuga en G Menor
Ejercicios:
d j r a h e r t z q y t x
n a v a r i a b l e l z s
o s h a l f n g k j u e x
c s s h o r t c u t c g j
e i e h t h g i e a h i n
s g t u r l s l r t b k x
i n a t y f i b n d e d t
l m r s a i x e n e x l u
l e b y c n e u q e r f i
i n i b q t o e v a t c o
m t v z x s j w h o l e b
m u s i c r e t r a u q a
i j s q s e y t e t o n t
assignment, braces, eighth, frequency, half, hertz, millisecond, music,
note, octave, quarter, shortcut, sixteenth, sound, variable, vibrate,
whole
3.3. Escriba un programa con dos variables “a” y “b” que asignará a
dos números. Imprima la suma de a y b, la diferencia de a y b, el
producto de a y b y el cociente de b dividido por a. Corra el
programa con diferentes valores de a y b. ¿Qué pasa cuando a o
b se les asigna el valor cero?
Pseudocódigo
“Pseudocódigo” es la palabra extravagante que se usa para escribir y describir, paso a
paso, lo que su programa necesitará hacer. La palabra pseudocódigo viene del prefijo
griego “pseudo- “, que significa falso y “código” para las líneas de programa reales. No es
creado para que la computadora lo use directamente, sino para ayudarse a uno mismo a
entender la complejidad de un problema y dividirlo en piezas que tienen claramente
definido qué es lo que tienen que hacer.
No hay una única ni una mejor manera de escribir pseudocódigo. Hay docenas de
estándares, y cada uno de ellos puede ser el adecuado para un tipo particular de problema.
En esta introducción usaremos simples oraciones en castellano para explicar y entender
nuestro problema.
¿Como haría Ud. para escribir un programa para dibujar un colectivo escolar? (como el
mostrado en la Ilustración 13).
Ahora, dividamos cada uno de los pasos en piezas más pequeñas y escribamos nuestro
pseudocódigo:
Ahora que tenemos nuestro programa desarrollado, todo lo que tenemos que hacer es
escribirlo en lenguaje de programación:
El programa completo del bus escolar (Programa 25) puede verse a continuación. Lea en
detalle el programa terminado y verá líneas de comentarios usados para ayudar al
programador a recordar los pasos usados durante la resolución inicial del problema.
1 # c4_schoolbus.kbs
2 # dibuja un bus escolar
3
4 clg
5
6 # dibujar ruedas
7 color black
8 circle 50,120,20
9 circle 200,120,20
10
11 # dibujar el cuerpo del bus
12 color yellow
13 rect 50,0,200,100
14 rect 0,50,50,50
Programa 25: Bus Escolar
En este ejemplo del Bus Escolar podemos ver que hay muchas maneras diferentes para
dividir el problema en pequeñas piezas. Podríamos haber dibujado el frente antes que el
cuerpo… podríamos listar decenas de maneras diferentes de abordar este simple
problema.
Una cosa muy importante para recordar: NO HAY MODO EQUIVOCADO de cómo encarar
un problema. Algunos serán mejores que otros (tendrán menos declaraciones, serán más
fáciles de leer y entender…), pero lo importante es resolver el problema.
Diagramas de Flujo
Otra de las técnicas que los programadores utilizan para entender un problema es el
llamado “Diagramas de Flujo”. Siguiendo el viejo adagio de que “una imagen es equivalente
a miles de palabras”, los programadores dibujan a veces n diagrama representando la
lógica del programa. El diagrama de flujo es uno de los métodos más viejos y comúnmente
usados de “dibujar” la estructura de un programa.
Esta breve introducción a los diagramas de flujo cubrirá solo una pequeña parte de lo que
puede hacerse con ellos, pero con unos pocos símbolos y conectores seremos capaces de
modelar procesos realmente complejos. Esta técnica le será útil no solo para programar,
sino para resolver diversos problemas con los que puede encontrarse. A continuación unos
pocos símbolos básicos:
La mejor manera de aprender a armar un diagrama de flujo es mirar con detalle algunos
ejemplos y meter nuestras manos en ellos.
Mire con cuidado la Ilustración 14 (arriba) y siga todas las flechas. Puede ver cómo este
diagrama representa la situación descripta?
Note en este segundo diagrama de flujo que hay un par de veces en que necesitamos repetir un
proceso. Ud. no ha visto aún cómo hacer esto en BASIC-256, pero lo aprenderá en los próximos
capítulos.
Ejercicios:
z d s y m b o l t r p
e m e w t a f r m r t
y d k c l u a v o s e
p q o z i h p g r p r
x r i c c s r n r e m
z f o w o a i e i t i
a u o c m d x o u s n
q l h m e p u p n q a
f o i q m s t e d u t
b n m h r u s w s b o
g e p r o b l e m p r
decision, flowchart, input, output, problem, process, programming,
pseudocode, steps, symbol, terminator
1 # c5_ilikejim.kbs
2 # Me gusta Ana – variables string
3
4 nombre$ = "Ana"
5 mensaje_1$ = '"' + nombre$ + '" es mi amiga.'
6 mensaje_2$ = "Me gusta " + nombre$ + "."
7
8 print mensaje_1$
9 say mensaje_1$
10 print mensaje_2$
11 say mensaje_2$
Programa 26: Me gusta Ana
"Ana" es mi amiga.
Me gusta Ana.
Salida 26: Me gusta Ana.
Variable String
Una variable string le permite asignar un nombre a un bloque de
memoria de la computadora. Ud. En su programa puede guardar o
recuperar texto y caracteres de una variable string.
El nombre de una variable string debe comenzar con una letra; puede
contener letras y números; es sensible a mayúsculas y minúsculas y
debe terminar con el signo $. Además, recuerde que Ud. no puede
usar las palabras reservadas por BASIC-256 como nombre de sus
variables (ver Apéndice I).
Ejemplos de nombres de variables string válidos: d$, c7$, book$, X$,
and bienVenido$.
1 # c5_ilikeinput.kbs
2 # usando input para preguntar por un nombre
3
4 input "ingrese su nombre> ", name$
5 mensaje_1$ = name$ + " es mi amigo."
6 mensaje_2$ = "Me gusta " + name$ + "."
7
8 print mensaje_1$
9 say mensaje_1$
10 print mensaje_2$
11 say mensaje_2$
Programa 27: Me Gusta (preguntando el nombre)
1 # c5_sayname.kbs
2
3 input "Cual es su nombre?", name$
4 input "Cual es su edad?", age
5 saludo$ = "Un gusto conocerte, " + name$ + "."
6 print saludo$
7 say saludo$
8
9 saludo$ = "En 8 años tu edad será de " + (age+8) + " años. Wow, que
número!"
10 print saludo$
11 say saludo$
Programa 29: Nombre y Edad
Cual es su nombre?Jose
Cual es su edad?13
1 # c5_sillystory.kbs
2
3 print "Una Historia Tonta."
4
5 input "Ingrese un sustantivo? ", noun1$
6 input "Ingrese un verbo? ", verb1$
7 input "Ingrese una habitación en su casa? ", room1$
8 input "Ingrese un verbo? ", verb2$
9 input "Ingrese un sustantivo? ", noun2$
10 input "Ingrese un adjetivo? ", adj1$
11 input "Ingrese un verbo? ", verb3$
12 input "Ingrese un sustantivo? ", noun3$
13 input "Ingrese su nombre? ", name$
14
15 sentence$ = " Una Historia Tonta, por " + name$ + "."
16 print sentence$
17 say sentence$
18
19 sentence$ = "Un día, no hace mucho tiempo, ví un " + noun1$ + " " +
verb1$ + " bajando las escaleras."
20 print sentence$
21 say sentence$
22
23 sentence$ = "Estaba yendo a mi " + room1$ + " para " + verb2$ + " un " +
noun2$
24 print sentence$
25 say sentence$
26
27 sentence$ = "El " + noun1$ + " se hizo " + adj1$ + " cuando yo " + verb3$
+ " con un " + noun3$ + "."
28 print sentence$
29 say sentence$
30
31 sentence$ = "Fin."
32 print sentence$
33 say sentence$
Programa 30: Programa Grande – Generador de Historias Tontas
Ejercicios:
e d l e p g a g j n
p l e a k x l k o g
y r b f b x p e z i
q s o a a h r f l s
q j t m i u i v k r
t s i r p r l w r a
a x f n i t a t g l
h l f y p n y v q l
p w r n i u g x z o
y v c l d z t w v d
default, dollarsign, input, prompt, string, variable
true
false
Las constantes booleanas true y false pueden ser usadas en
cualquier expresión numérica o lógica, pero son usualmente el
resultado de una comparación o un operador lógico. En realidad, la
constante true es guardada como un número “1” y la constante false
como un número “0”.
Operadores de Comparación
Previamente, hemos discutido los operadores aritméticos básicos. Ahora es tiempo de
mirar algunos operadores adicionales. En un programa, a menudo necesitamos comparar
dos valores para decidir qué hacer. Un operador comparación trabaja con dos valores y
devuelve true o false basado en el resultado de la comparación
Operador Operación
Menor que
expresión 1 < expresión 2
<
Devuelve true si la expresión 1 es menor que la expresión 2.
Caso contrario devuelve false.
Menor que o Igual a
expresión 1 <= expresión 2
<=
Devuelve true si la expresión 1 es menor que o igual a la expresión 2.
Caso contrario devuelve false
Mayor que
expresión 1 > expresión 2
>
Devuelve true si la expresión 1 es mayor que la expresión 2.
Caso contrario devuelve false
Mayor que o Igual a
expresión 1 >= expresión 2
>=
Devuelve true si la expresión 1 es mayor que o igual a la expresión 2.
Caso contrario devuelve false
Igual
expresión 1 = expresión 2
=
Devuelve true si la expresión 1 es igual a la expresión 2.
Caso contrario devuelve false
No Igual
<> expresión 1 <> expresión 2
Devuelve true si la expresión 1 no es igual a la expresión 2,.
Caso contrario devuelve false
Tabla 7: Operadores de Comparación
true
false
< <= > >= = <>
Las seis operaciones de comparación son :
Menor (<), menor o igual (<=), mayor (>), mayor o igual (>=), igual (=),
y no igual (<>).
Son usadas para comparar números y cadenas (strings). Las strings
son comparadas alfabéticamente de izquierda a derecha. Ud. puede
también usar paréntesis para agrupar operaciones.
1 # c6_compareages.kbs
2 # compare dos edades
3
4 input "Cual es su edad? ", edad_mia
5 input "Cual es la edad de su amigo? ", edad_amigo
6
7 print "Usted es ";
8 if edad_mia < edad_amigo then print "menor que";
9 if edad_mia = edad_amigo then print "de la misma edad que";
10 if edad_mia > edad_amigo then print "mayor que";
11 print " su amigo."
Programa 31: Compare dos Edades
Cual es su edad? 13
Cual es la edad de su amigo? 12
Usted es mayor que su amigo.
Salida 31: Compare dos Edades
rand
Cuando se usa rand en una expresión, éste devuelve un número
aleatorio. El número devuelto se encontrará siempre en el intervalo 0 a
1, pero nunca será 1 (0≤número<1).
A menudo Ud. querrá generar un número “n” entero en el intervalo
desde 1 hasta R. En ese caso, puede usarse la siguiente sentencia:
n = int (rand * R) + 1
int (number)
int (string)
La función int remueve la parte decimal de un número, y devuelve
solamente la parte entera. No efectúa ningún redondeo.
int también intentará convertir un string en un número entero. Si el
string no contiene un número, entonces int devolverá un cero (0).
Ej.:
int (3,0345) = 3
int (3,9983) = 3 (no hay redondeo)
int (nume7ro) = 7
int (numero) = 0
1 # c6_coinflip.kbs
2
3 moneda = rand
4 if moneda < .5 then print "Cara."
5 if moneda >= .5 then print "Cruz."
Programa 32: Tirando una Moneda
Cruz.
Salida 32: Tirando una Moneda
Operadores Lógicos
A veces, es necesario juntar varias comparaciones simples. Esto puede hacerse con los
cuatro operadores lógicos: and, or, xor, y not (en castellano: y, ó, o excluyente y no). Los
operadores lógicos trabajan de manera muy similar a como lo hacen las conjunciones en el
lenguaje Inglés, excepto que “or” es usado como “uno” o “el otro” o “ambos”.
Operador Operación
OR Or Lógico
expresión1 OR expresión2
Si cualquiera, expresión1 o expresión2 es verdadera, devuelve true.
Caso contrario devuelve false.
expresión1
OR
TRUE FALSE
TRUE TRUE TRUE
expresión 2
FALSE TRUE FALSE
if condición then
declaracion(es) a ejecutar cuando es true
end if
La declaración if / end if le permite crear un bloque de código a
ejecutar cuando la condición es verdadera (true). Es una buena
práctica indentar (usar sangrías) las líneas de código dentro del bloque
if/endif para mejorar la legibilidad del programa.
1 # c6_dado.kbs
2 # Tirar 2 dados (die) de 6 caras cada uno
3
4 die1 = int(rand * 6) + 1
5 die2 = int(rand * 6) + 1
6 total = die1 + die2
7 print "dado 1 = " + die1
8 print "dado 2 = " + die2
9 mensaje$ = "Ud. tiró " + total + "."
10
11 if total = 2 then
12 mensaje$ += " Ojos de Serpiente."
13 end if
14 if total = 12 then
15 mensaje$ += " Una docena."
16 end if
17 if die1 = die2 then
18 mensaje$ += " Doblete, tire nuevamente!"
19 end if
20
21 print mensaje$
22 say mensaje$
Programa 33: Tirando dados
dado 1 = 6
dado 2 = 6
Ud. tiró 12. Una docena. Doblete, tire nuevamente!
Salida 33: Tirando dados
if condition then
declaracion(es) a ejecutar cuando es verdadera
else
declaracion(es) a ejecutar cuando es falsa
end if
Las declaraciones if, else y endif le permiten definir dos bloques
de código. El primer bloque, después de la cláusula then, ejecuta si
la condición es verdadera (true); y el segundo bloque, después de la
cláusula else, ejecutará cuando la condición sea falsa (false).
1 # c6_coinflip2.kbs
2 # tirar moneda con else
3
4 coin = rand
5 if coin < .5 then
6 print "Cara."
7 say "Cara."
8 else
9 print "Cruz."
10 say "Cruz."
11 end if
Programa 34: Tirando una Moneda con else
Cara.
Salida 34: Tirando una Moneda con else
Decisiones Anidadas
Una última cosa. Con las declaraciones if/end if y if/else/end if, es posible anidar un if
dentro de otro. Esto puede sonar confuso, pero veremos cómo trabaja en próximos
capítulos.
1 # c6_dieroll.kbs
2 # tirar un dado de 6 caras y mostrar en la pantalla
3
4 # hw – alto y ancho de los puntos en el dado
5 hw = 70
6 # margin – espacio antes de cada punto
7 # 1/4 del espacio dejado después de dibujar 3 puntos
8 margin = (300 - (3 * hw)) / 4
9 # z1 – posición x e y de la parte superior de la fila de arriba y la columna
de puntos
10 z1 = margin
11 # z2 – posición x e y de la parte superior de la fila y la columna del medio
de puntos
12 z2 = z1 + hw + margin
13 # z3 – posición x e y de la parte de arriba de la fila de abajo y la columna
de puntos
14 z3 = z2 + hw + margin
15
16 # tire el dado
17 tiro = int(rand * 6) + 1
18
19 color black
20 rect 0,0,300,300
21
22 color white
23 # fila de arriba
24 if tiro <> 1 then rect z1,z1,hw,hw
25 if tiro = 6 then rect z2,z1,hw,hw
26 if tiro >= 4 and tiro <= 6 then rect z3,z1,hw,hw
27 # fila del medio
28 if tiro = 1 or tiro = 3 or tiro = 5 then rect z2,z2,hw,hw
29 # fila de abajo
30 if tiro >= 4 and tiro <= 6 then rect z1,z3,hw,hw
31 if tiro = 6 then rect z2,z3,hw,hw
32 if tiro <> 1 then rect z3,z3,hw,hw
33
Ejercicios:
b t t h e n m r n s
i o r w l f o r z e
e d o u l d d o d s
r n r l e w n t j l
a a e u e t a a r e
p n t l n a r r o o
m o a a d s n e p l
o t e u i h l p t e
c i r q f f s o h s
w f g e e s l a f s
and, boolean, compare, else, endif, equal, false, greater, if, less, not,
operator, or, random, then, true
El Loop FOR
El loop (bucle) más común es el for. El loop for ejecuta repetidamente un bloque de
declaraciones un especificado número de veces, y lleva la cuenta de las veces que lo
ejecutó. La cuenta puede comenzar con cualquier número, y puede cambiar con cualquier
incremento. El Programa 36 muestra una declaración for simple usada para decir los
números del 1 al 10 inclusive. El Programa 37 cuenta de a 2, comenzando en 0 y
terminando en 10.
1 # c7_for.kbs
2 for t = 1 to 10
3 print t
4 say t
5 next t
Programa 36: Declaración for
1
2
3
4
5
6
7
8
9
10
Salida 36: Declaración for
1 # c7_forstep2.kbs
2 for t = 0 to 10 step 2
3 print t
4 say t
5 next t
Programa 37: for – Con incremento 2
0
2
4
6
8
10
La sentencia for puede tambiér ser usada para contar hacia atrás. Para hacer esto
simplemente tenemos que usar un incremento (step) negativo-
1 # c7_stepneg1.kbs
2
3 for t = 10 to 0 step -1
4 print t
5 pause 1.0
6 next t
Programa 39: Sentencia for – Cuenta hacia atrás.
10
9
8
7
6
5
4
3
2
1
0
Salida 39: Sentencia for – Cuenta hacia atrás.
pause segundos
La sentencia pause (pausa) indica a BASIC-256 que detenga
la ejecución del programa durante el número especificado de
segundos. El número de segundos puede ser un número decimal en
caso que se requiera una pausa muy controlada.
do
declaracion(es)
until condicion
Ejecute el bloque de declaraciones mientras la condición sea
falsa. Como la condición se verifica al final del loop, la/las
declaración(es) serán ejecutadas al menos una vez.
NuncaMas.
NuncaMas.
NuncaMas.
NuncaMas.
NuncaMas.
(… y seguirá hasta que Ud. lo detenga.)
Salida 41: Loop para siempre
while condicion
declaracion(es)
end while
Ejecuta el bloque de declaración(es) mientras que la
condición sea verdadera. Como la condición se verifica antes del
loop, la/s declaración(es) se ejecutarán ninguna o más veces.
El Programa 42 usa la sentencia while para contar de 1 a 10, igual que el Programa 36 lo
hacía con una sentencia for.
1 # c7_whilefor.kbs
2
3 t=1
4 while t <= 10
5 print t
6 t=t+1
7 end while
Programa 42: While contando hasta 10.
1
2
3
4
5
6
7
8
9
10
Salida 42: While contando hasta 10.
exit do
exit for
exit while
Salta fuera del loop corriente salteando el resto de código en el loop.
continue do
continue for
continue while
No ejecute el resto de código en este loop, pero continúe con el loop
normalmente.
Gráficos Acelerados
Cuando necesitamos ejecutar muchos gráficos rápidamente, como en una animación o un
juego, BASIC-256 ofrece un sistema gráfico rápido. Este modo se habilita con la sentencia
fastgraphics (graficosrapidos). Una vez que el modo gráfico rápido es habilitado, la salida
gráfica se actualizará solo cuando Ud. ejecute la sentencia refresh (refrescar).
fastgraphics refresh
Inicia el modo gráfico rápido. En este modo, la pantalla será
actualizada solo cuando se ejecute la sentencia refresh.
Una vez que el programa ejecuta la sentencia fastgraphics, no es
posible volver al modo gráfico estándar (lento).
1 # c7_kaleidoscope.kbs
2
3 clg
4 fastgraphics
5 for t = 1 to 100
6 r = int(rand * 256)
7 g = int(rand * 256)
8 b = int(rand * 256)
9 x = int(rand * 300)
10 y = int(rand * 300)
11 h = int(rand * 100)
12 w = int(rand * 100)
13 color rgb(r,g,b)
14 rect x,y,w,h
15 rect 300-x-w,y,w,h
16 rect x,300-y-h,w,h
17 rect 300-x-w,300-y-h,w,h
18 next t
19 refresh
Programa 44: Caleidoscopio
1 # c7_bouncingball.kbs
2
3 fastgraphics
4 clg
5
6 # posición inicial de la pelota
7 x = rand * 300
8 y = rand * 300
9 # size of ball
10 r = 10
11 # velocidad en direcciones x e y
12 dx = rand * r + 2
13 dy = rand * r + 2
14
15 color green
16 rect 0,0,300,300
17
18 while true
19 # borre la pelota vieja
20 color white
21 circle x,y,r
22 # calcule la nueva posicion
23 x = x + dx
24 y = y + dy
Ejercicios:
f l g b w p e t s w i i
f a w t b q l i t n u i
t n s n v h p h b c f e
i a k t c v r o o e l l
x d r k g e w n o i l c
e x o u f r d e h l o i
i g f r y i a w l n l c
t x e n t g d p t i w k
g s d i o n e i h p h a
h w o a e d n z m i g w
x n s d z u u d w t c d
x o m i e h d g m o v s
condition, continue, do, endwhile, exit, fastgraphics, for, loop, next,
refresh, step, until, while
7.1. Escriba un programa que use for para sumar los enteros desde
1 a 42 y muestre la respuesta. Ayuda: antes de empezar el loop
asigne a la variable cero (0) para acumular el total.
7.2. Escriba un programa que pregunte al usuario ingresar un entero
entre 2 y 12 en un loop. Mantenga corriendo el loop mientras el
usuario ingrese un número en ese rango. Calcule el factorial (n!)
del número ingresado usando un loop for y muéstre el resultado
en pantalla.
Recuerde factoriales:
2!=2*1,
3!=3*2*1,
5! = 5*4*3*2*1
n!=n*(n-1)*(n-2)*…*3*2*1 = n*(n-1)!
7.3. Escriba un programa para mostrar los números 1 hasta 8
multiplicados por 1 hasta 8. Ayuda: Use un loop for dentro de otro
loop for. Formatee su salida para que luzca como lo siguiente:
1*1=1
1*2=2
1*3=3
1*4=4
1*5=5
1*6=6
1*7=7
1*8=8
2*1=2
2*2=4
2*3=6
…
7.4. Reescriba el programa anterior (7.3) para mostrar sus resultados
en forma de tabla, como la siguiente:
1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24
4 8 12 16 20 24 28 32
5 10 15 20 25 30 35 40
6 12 18 24 30 36 42 48
7 14 21 28 35 42 49 56
8 16 24 32 40 48 56 64
text x, y, expresión
Dibuja el contenido de la expresión en el área de salida gráfica con
su esquina superior derecha especificada por x e y. Usa el tipo,
tamaño y peso de letra especificado en el última declaración font.
Argumento Descripción
1 # c8_resizegraphics.kbs
2 # cambiar el tamaño de la ventana grafica
3
4 graphsize 500,500
5 xcenter = graphwidth/2
6 ycenter = graphheight/2
7
8 color black
9 line xcenter, ycenter - 10, xcenter, ycenter + 10
10 line xcenter - 10, ycenter, xcenter + 10, ycenter
11
12 font "Tahoma",12,50
13 text xcenter + 10, ycenter + 10, "Center at (" +
xcenter + "," + ycenter + ")"
graphwidth o graphwidth()
graphheight o graphheight()
Funciones que devuelven el ancho y alto del área de salida gráfica,
para que pueda usar esa información en su programa.
(150,10
0)
(125,15 (175,15
0) 0)
(100,15 (200,15
0) 0)
(125,20 (175,20
0) 0)
Ilustración 18: Flecha Roja Grande
Ahora, empezando en la punta de la flecha y en sentido de las agujas del reloj, escribimos
los valores x e y.
1 # c8_bigredarrow.kbs
2 clg
3 color red
4 poly {150, 100, 200, 150, 175, 150, 175, 200, 125, 200, 125, 150, 100,
150}
Programa 48: Flecha Roja Grande
Estampando un Polígono
La sentencia poly nos permite colocar un polígono en pantalla en una posición específica,
pero puede resultar difícil moverlo y/o ajustar su tamaño. Estos problemas son resueltos
por la sentencia stamp (sello). Esta sentencia toma una definición de polígono y nos
permite poner el polígono en cualquier posición especificada en la pantalla.
Opcionalmente, nos permite cambiar la escala (tamaño) del polígono y/o rotarlo.
Dibujemos un triángulo equilátero (los tres lados iguales) en un trozo de papel. Pongamos
el punto (0, 0) en su vértice superior y hacemos cada lado de 10 unidades de largo (ver
Ilustración 19).
(0,
0)
(-5, (5,
8.6)
Ilustración 19: Triángulo Equilátero
8.6)
Ahora, crearemos un programa usando la forma más simple de la sentencia stamp para
llenar la pantalla de triángulos. El Programa 49 hace justamente esto. Usa el “sello” de un
triángulo en dos loops for anidados para llenar la pantalla.
1 # c8_stamptriangle.kbs
2 # use un sello para dibujar muchos triángulos
3
4 clg
5 color black
6 for x = 25 to 200 step 25
7 for y = 25 to 200 step 25
8 stamp x, y, {0, 0, 5, 8.6, -5, 8.6}
9 next y
10 next x
Programa 49: Llenando la pantalla con triángulos
Veamos otro ejemplo de uso de stamp. El Programa 50 usa el mismo triángulo que el
programa anterior, pero coloca 100 de ellos en posiciones al azar, con escala al azar y
rotados también al azar.
1 # c8_stamptriangle2.kbs
2 # stamp triangulos con tamaño, rotación y posición al azar
4 clg
5 color black
6 for t = 1 to 100
7 x = rand * graphwidth
8 y = rand * graphheight
9 s = rand * 7 # scale hasta 7 veces + grande
10 r = rand * 2 * pi # rotar hasta 2pi (360 grados)
11 stamp x, y, s, r, {0, 0, 5, 8.6, -5, 8.6}
12 next t
Programa 50: Cien triángulos al azar.
pi
La constante “pi” (π) puede ser usada en expresiones de modo que
Ud. No tenga que recordar su valor (aprox. 3.14159…).
total de luz). Si los 3 son colocados a su máximo valor posible de 255, tendremos Blanco.
1 # c8_512colors.kbs
2 # show a few of the 16 million colors
3 graphsize 256, 256
4 clg
5
6 for r = 0 to 255 step 32
7 for g = 0 to 255 step 32
8 for b = 0 to 255 step 32
9 color rgb(r,g,b)
10 rect b/8+g, r, 4, 32
11 next b
12 next g
13 next r
Programa 51: 512 colores de los 16 millones
1 # c8_stamptriangle3.kbs
2 # stamp triangulos de color, tamaño y rotación al azar
3
4 clg
5 penwidth 3
6
7 for t = 1 to 100
8 x = rand * graphwidth
9 y = rand * graphheight
10 s = rand * 7 # scale hasta 7 veces +grande
11 r = rand * 2 * pi # rotacion hasta 2pi
12 rpen = rand * 256 # obtenga la parte RGB de un color para lápiz al
azar
13 gpen = rand * 256
14 bpen = rand * 256
15 rbrush = rand * 256 # color de llenado al azar
16 gbrush = rand * 256
17 bbrush = rand * 256
18 color rgb(rpen, gpen, bpen), rgb(rbrush, gbrush, bbrush)
19 stamp x, y, s, r, {0, 0, 5, 8.6, -5, 8.6}
20 next t
Programa 52: 100 Triángulos al azar de colores al azar.
9 color rgb(0,0,255,127)
10 circle 100,200,100
11
12 color rgb(0,0,0,127)
13 circle 200,200,100
Programa 53: Círculos transparentes
1 # c8_stamptriangle4.kbs
2 # stamp randomly colored, sized and rotated triangles
3
4 clg
5 penwidth 3
6 for t = 1 to 100
7 x = rand * graphwidth
8 y = rand * graphheight
9 s = rand * 7 # scale hasta 7 veces mayor
10 r = rand * 2 * pi # rotacion hasta 2pi
11 rpen = rand * 256 # obtenga la parte RGB de un color de lápiz al azar
12 gpen = rand * 256
13 bpen = rand * 256
14 apen = rand * 256
15 rbrush = rand * 256 # color de llenado al azar
16 gbrush = rand * 256
17 bbrush = rand * 256
18 abrush = rand * 256
19 color rgb(rpen, gpen, bpen, apen), rgb(rbrush, gbrush, bbrush, abrush)
20 stamp x, y, s, r, {0, 0, 5, 8.6, -5, 8.6}
21 next t
Programa 54: 100 Triángulos al azar con colores transparentes al azar.
(0,
0)
(-5,
20)
(5,
20)
(0,
25)
Ilustración 21: Programa Grande: Una Flor para Ud. – Stamp de un pétalo.
1 # c8_aflowerforyou.kbs
2 # use stamps para dibujar una flor
3
4 clg
5
6 color green
7 rect 148,150,4,150
8
9 color rgb(255,128,128)
10 for r = 0 to 2*pi step pi/4
11 stamp graphwidth/2, graphheight/2, 2, r, {0, 0, 5, 20, 0, 25, -5, 20}
12 next r
13
14 color rgb(128,128,255)
15 for r = 0 to 2*pi step pi/5
16 stamp graphwidth/2, graphheight/2, 1, r, {0, 0, 5, 20, 0, 25, -5, 20}
17 next r
18
19 message$ = "A flower for you." # (Una flor para ti.)
20 color darkyellow
21 font "Tahoma", 14, 50
22 text 10, 10, message$
23 say message$
Programa 55 Programa Grande: Una Flor para Tí.
Ejercicios:
t n e r a p s n a r t j
k c r l s e u l b h e s
v g p r t r z a g c c g
b h d x a r x i t i f r
a s e m s d e f h g w a
p t e t f h i p p r i p
a o a e h o a a f e t h
e m i p r r n r n e h s
p w a n g g e t q n g i
l r u o t d e u u j i z
g r a p h w i d t h e e
s i p o l y g o n c w f
alpha, blue, degrees, font, graphheight, graphics, graphsize,
graphwidth, green, pi, point, polygon, radian, red, rgb, stamp, text,
transparent, weight
8.1. Use dos sentencias poly y una rect para dibujar una casa
simple, similar a la mostrada abajo. Su casa puede ser de los
colores que Ud. elija.
(0, -1)
(-0.886, (0.886,
-0.5) -0.5)
(-0.886, (0.886,
0.5) 0.5)
(0,
1)
8.2. Use la sentencia color con un pincel claro y una sentencia poly
para dibujar un hexágono en el centro de la pantalla gráfica, con
cada lado de 100 píxeles de longitud.
8.3. Reescriba el programa anterior (8.2) usando la sentencia stamp.
Use la característica de escala de stamp de modo que pueda
dibujar un hexágono de cualquier tamaño cambiando solo un
número.
8.4. Ponga la sentencia stamp del programa (8.3) dentro de un loop
for y dibuje una serie de hexágonos anidados cambiando la
escala de uno al siguiente. Experimente con el argumento step y
con rotar el hexágono al mismo tiempo.
Funciones
Una función es un pequeño programa dentro de uno de mayor tamaño que hace algo muy
específico. Ud puede invocar una función y enviarle valores (o ninguno si no hace falta) y
ésta le devolverá un valor como resultado. Ud ya conoce algunas funciones propias de
BASIC-256, como rand y rgb. Ahora crearemos las nuestras.
Entrada(s)
Salida
Ilustración 22: Diagrama de Bloques de una Función
Return valor
Ejecute la sentencia return dentro de una función para devolver un
valor y transferir el control del programa nuevamente al código
desde donde se llamó a la función.
end
Terminar el programa (fin).
1 # c9_minimum.kbs
2 # función para encontrar el minimo
3
4 input "Ingrese un numero ", a
5 input "Ingrese un segundo número ", b
6
7 print "El menor de los números es ";
8 print minimo(a,b)
9 end
10
11 function minimo(x,y)
12 # devuelve el menor de dos números (x,y) pasados por argumento
13 if x<y then return x
14 return y
15 end function
Programa 56: Función Mínimo
Ingrese un numero 7
Ingrese un segundo número 3
El menor de los números es 3
Salida 56: Función Mínimo
1 # c9_gameroller.kbs
2 # Juego de Dados
3
4 print "Tirador de Dados"
5 s = get ("Caras del dado",6)
6 n = get ("Numero de dados", 2)
7 total = 0
8 for x = 1 to n
9 d = die(s)
10 print d
11 total = total + d
12 next x
13 print "Total = "+ total
14 end
15
16 function get (message$, default)
17 # lea un numero de pantalla
18 # si ingresaron cero tome el valor por defecto
19 input message$ + " (default " + default + ")? ", n
20 if n = 0 then n = default
21 return n
22 end function
23
24 function die(caras)
25 # tire un dado y devuelva el valor de la cara
26 return int(rand*caras)+1
27 end function
Programa 57: Juego de Dados
Tirador de Dados
Caras del dado (default 6)? 6
Numero de dados (default 2)? 3
6
3
1
Total = 10
Salida 57: Juego de Dados
En los ejemplos anteriores hemos creado funciones que devuelven un valor numérico. Pero
también se pueden crear funciones que devuelvan un valor string. Una función string, como
una variable, debe tener el símbolo “$” después de su nombre para especificar que
devolverá un string.
1 # c9_repeatstring.kbs
2 # funcion string simple – haga copias
3
4 a$ = "ja"
5 b$ = repeat$(a$,20)
6 print a$
7 print b$
8 end
9
10 function repeat$(w$,n)
11 a$ = ""
12 for t = 1 to n
13 a$ += w$
14 next t
15 return a$
16 end function
Programa 58: Función String Simple
ja
jajajajajajajajajajajajajajajajajajajaja
Salida 58: Función String Simple
Note en los ejemplos anteriores que las variables dentro de una función existen solo dentro
de la función. Si una variable con el mismo nombre es usado fuera de la función, esta NO
cambia el valor de la variable dentro de la función.
Subrutinas
Al igual que las funciones, una subrutina es un programa pequeño que efectúa algo bien
específico. Las subrutinas permiten que un bloque de código sea usado en distintas partes
del programa sin tener que reescribirlo. Una subrutina puede tener valores que se le
pasaron en su llamado y que le dicen a la subrutina cómo comportarse.
Las subrutinas son como las funciones, excepto que no devuelven un valor y que no se
pueden invocar solo por su nombre, sino que se debe usar la sentencia call para
ejecutarlas.
Return
Ejecute la sentencia return dentro de una subrutina para devolver el
control del programa nuevamente al código desde donde se la llamó.
Esta versión de return no incluye un valor de retorno (como en el
caso de las funciones) dado que una subrutina no devuelve un valor.
1 # c9_subroutineclock.kbs
2 # muestre un reloj digital en pantalla
3
4 fastgraphics
5 font "Tahoma", 20, 100
6 color blue
7 rect 0, 0, 300, 300
8 color yellow
9 text 0, 0, "My Clock."
10 while true
11 call displaytime()
12 pause 1.0
13 end while
14 end
15
16 subroutine displaytime()
17 color blue
18 rect 100, 100, 200, 100
19 color yellow
20 text 100, 100, hour + ":" + minute + ":" + second
21 refresh
22 end subroutine
Programa 59: Subrutina Reloj
Nota:
En el programa anterior, hour, minute y second en la subrutina displaytime son funciones
propias de BASIC-256. Vea el concepto siguiente para una descripción más detallada.
1 # c9_subroutineclockimproved.kbs
2 # reloj mejorado
3
4 fastgraphics
5 font "Tahoma", 20, 100
6 color blue
7 rect 0, 0, 300, 300
8
9 call displayyear()
10 while true
11 call displaytime()
12 pause 1.0
13 end while
14
15 end
16
17 subroutine displayyear()
18 color blue
19 rect 50,50, 200, 100
20 color yellow
21 text 50,50, padnumber$(month) + "/" + padnumber$(day) + "/" +
padnumber$(year)
22 refresh
23 end subroutine
24
25 subroutine displaytime()
26 color blue
27 rect 50,100, 200, 100
28 color yellow
29 text 50, 100, padnumber$(hour) + ":" + padnumber$(minute) + ":" +
padnumber$(second)
30 refresh
31 end subroutine
32
33 function padnumber$(n)
34 padnumber$ = string(n)
35 if n < 10 then
36 padnumber$ = "0" + padnumber$
37 end if
38 end function
Programa 60: Subrutina Reloj Mejorado
1 # c9_gamerollerinclude.kbs
2 # Tirador de Dados
3
4 include "e2_c9_function_dado.kbs"
5 include "e2_c9_inputnumberfunction.kbs"
6
7 print "die roller"
8 s = inputnumber("caras del dado ",6)
9 n = inputnumber("numero de dados ", 2)
10 total = 0
11 for x = 1 to n
12 d = dado(s)
13 print d
14 total = total + d
15 next x
16 print "total "+ total
17 end
Programa 61: Tirador de Dados – Con Funciones included.
1 # c9_function_dado.kbs
2 # funcion para tirar un dado de N caras
3
4 function dado (caras)
5 # tire un dado y devuelva a caras
6 return int(rand*caras)+1
7 end function
Programa 62: Tirador de Dados – Función die
1 # c9_inputnumberfunction.kbs
2
3 function inputnumber (prompt$, default)
4 # lea un numero de pantalla
5 # si ingresaron cero tome el valor por defecto
6 input prompt$ + " (default " + default + ") ?", n
7 if n = 0 then n = default
8 return n
9 end function
Programa 63: Tirador de Dados – Función inputnumber
Ahora que hemos separado las funciones, podemos usarlas en diferentes programas sin
tener que cambiar el código de la función o re-escribirlas.
1 # c9_addingmachine.kbs
2 # una linda maquina de sumar
3 include "e2_c9_inputnumberfunction.kbs"
4
5 print "Maquina de Sumar"
6 print "Presione STOP para terminar"
7
8 total = 0
9 while true
10 a = inputnumber("+ ",0)
11 total = total + a
12 print total
13 end while
14 end
Programa 64: Máquina de Sumar – Usando la función inputnumber
Maquina de Sumar
Presione STOP para terminar
+ (default 0) ?6
6
+ (default 0) ?
6
+ (default 0) ?55
61
+ (default 0) ?
Salida: Máquina de Sumar – Usando la función: inputnumber
1 # c9_goto.kbs
2 top:
3 print "Hola"
4 goto top
Programa 65: Goto con Label
Hola
Hola
Hola
Hola
Hola
Hola
(... y se repite para siempre…)
label:
Un label (rótulo) le permite dar un nombre a un lugar en su
programa de modo que pueda saltar directamente a esa ubicación.
Es posible tener múltiples “labels” en un programa, pero cada uno
de ellos puede existir solo en un lugar.
Un nombre de label es seguido por un doble punto (:), debe estar en
una línea que no tenga ninguna otra declaración, debe comenzar con
una letra, pudiendo contener letras y números y es sensible a
mayúsculas y minúsculas.
No es permitido usar palabras reservadas por BASIC-256 (ver
Apéndice I) como nombre de un label, así como tampoco nombres de
funciones o subrutinas.
Ejemplos de nombres de labels válidos: far999:, About:, aqui08:.
goto label
La sentencia goto causa que la ejecución salte a la sentencia
inmediatamente siguiente a la línea label.
Las subrutinas y funciones nos permiten reusar bloques de código. La sentencia gosub
también le permite al programador reusar código. Las variables en un block gosub son
globales, esto es, son válidas en todo lugar del programa.
El Programa 66 muestra un ejemplo de una subrutina que es llamada tres veces.
1 # c9_gosub.kbs
2 # un uso de gosub simple
3
4 x = 10
5 for t = 1 to 3
6 print "x igual a: " + x
7 gosub muestralinea
8 next t
9 end
10
11 muestralinea:
12 print "------------------"
13 x=x*2
14 return
Programa 66: Gosub
x igual a: 10
------------------
x igual a: 20
------------------
x igual a: 40
------------------
Salida 66: Gosub
gosub label
La sentencia gosub causa que la ejecución salte a la subrutina
definida por el label.
1 # c9_roll2dice2.kbs
2 # tirar dos dados en modo gráfico
3
4 include "e2_c9_diefunction.kbs"
5 clg
6 total = 0
7
8 roll = die(6)
9 total = total + roll
10 call dibujedado(30,30, roll)
11
12 roll = die(6)
13 total = total + roll
14 call dibujedado(130,130, roll)
15
16 print "Ud. tiró " + total + "."
17 end
18
19 subroutine dibujedado(x,y,n)
20 # defina x, y para el vértice superior izquierdo y
21 # n para el numero de puntos
22 # dibuje dado de 70x70 pixeles con puntos de 10x10 pixels
23 color black
24 rect x,y,70,70
25 color white
26 # fila superior
27 if n <> 1 then rect x + 10, y + 10, 10, 10
28 if n = 6 then rect x + 30, y + 10, 10, 10
29 if n >= 4 and n <= 6 then rect x + 50, y + 10, 10, 10
30 # mitad
Ejercicios:
g o t o d e j j v e q y
k x a w r n x d s q a n
u i d r x i o p i d r o
l n h r g t z c s c e i
k c l e p u j d e p t t
g l e t a o m n h s a c
o u b u l r h e t v n n
s d a r l b f r n h i u
u e l n a u i a e t m f
b m z j c s l e r n r n
e t u n i m e y a o e b
h o u r s o w w p m t n
argument, call, day, end, file, function, gosub, goto, hour, include, label,
minute, month, parenthesis, return, second, subroutine,
terminate, year
9.2. Escriba un programa que pregunte por dos puntos x1, y1 y x2,
y2 y muestre la fórmula de la recta que pasa por ellos, en
formato: y=mx+n
Escriba una función que devuelva la pendiente (m), que puede
calcularse con la ecuación:
(y1− y2) / (x1−x2)
9.3. En matemáticas, el término “factorial” de un número se define
como el producto de números consecutivos y se nota como el
número seguido de un signo de admiración (!). El símbolo n!
significa:
n! = n * (n-1) * (n-2) * … * 4 * 3 * 2 * 1
Modo Seguimiento
En modo seguimiento, hay tres funciones numéricas (mousex, mousey y mouseb) que
devuelven las coordenadas del puntero del mouse sobre el área de salida gráfica. Si el
puntero del mouse no está en la ventana gráfica, sus movimientos no serán registrados
(devolverán la última posición del puntero en la ventana gráfica).
1 # c10_mousetrack.kbs
2 # Siguiendo el Mouse con un circulo
3
4 print "Mueva el mouse en la ventana gráfica."
5 print "Presione el boton Izquierdo para salir."
6 fastgraphics
7 # siga ejecutando hasta que el usuario presione el botón izq.
9 while mouseb <> 1
10 # limpie la pantalla
11 color white
12 rect 0, 0, graphwidth, graphheight
13 # dibuje un Nuevo circulo
14 color red
15 circle mousex, mousey, 10
16 refresh
17 end while
18
19 print "Listo."
20 end
Programa 68: Siguiendo el Mouse
mousex or mousex()
mousey or mousey()
mouseb or mouseb()
Estas tres funciones devuelven la ubicación corriente del puntero del
mouse en el área gráfica. Cualquier movimiento del mouse fuera del
área gráfica no será registrado, pero se devolverá la última posición
conocida dentro de dicha área.
Modo Click
El segundo modo de controlar el mouse es llamado modo "Click". En modo click, la
posición del mouse y el botón (o combinación de botones) son guardados cuando ocurre
un click. Una vez que el click es procesado por el programa, la instrucción clickclear puede
ser ejecutada para reiniciar el click, de modo que próximo click pueda ser guardado.
1 # c10_mouseclick.kbs
2 # X marca el punto en donde se hizo el click
3
4 print "Mueva el mouse en la ventana gráfica."
5 print "Presione botón izquierdo para marcar su punto "
6 print "Presions botón derecho para salir."
7 clg
8 clickclear
9 while clickb <> 2
10 # limpie último click y espere a que se presione un botón
11 clickclear
12 while clickb = 0
13 pause .01
14 end while
15 #
16 color blue
17 stamp clickx, clicky, 5, {-1, -2, 0, -1, 1, -2, 2, -1, 1, 0, 2, 1, 1, 2, 0, 1, -1, 2,
-2, 1, -1, 0, -2, -1}
18 end while
19 print "Terminado."
20 end
Programa 69: Mouse Modo Click
clickx or clickx()
clicky or clicky()
clickb or clickb()
Los valores de las tres funciones click son actualizados cada vez
que un botón del mouse es presionado cuando el puntero esté en el
área gráfica. La última ubicación del mouse cuando se recibió el
último click está disponible usando estas tres funciones.
clickclear
El comando clickclear reinicia a cero las funciones clickx, clicky
y clickb de modo que se registre un nuevo click cuando clickb sea
diferente de cero (0).
1 # c10_colorchooser.kbs
2 fastgraphics
3
4 print "Selector de Color – Encuentre uno"
5 print "Click & arrastre los deslizadores rojo, verde y azul"
6
7 # variables para guardar los componentes de color
8 r = 128
9 g = 128
10 b = 128
11
12 call display(r,g,b)
13
14 while true
15 # espere por un click
16 while mouseb = 0
17 pause .01
18 end while
19 # cambie color con deslizadores
20 # deslizador rojo y rango es 0 >= red < 75
21 if mousey < 75 then
22 r = mousex
23 if r > 255 then r = 255
24 end if
25 # deslizador verde y rango es 75 >= red < 150
26 if mousey >= 75 and mousey < 150 then
27 g = mousex
28 if g > 255 then g = 255
29 end if
30 # deslizador azul y rango es 150 >= red < 225
31 if mousey >= 150 and mousey < 225 then
32 b = mousex
33 if b > 255 then b = 255
34 end if
35 call display(r,g,b)
36 end while
37 end
38
39 subroutine colorline(r,g,b,x,y)
40 # dibuje parte de la barra de color
41 # el color r,g,b de x,y a x,y+37
42 color rgb(r, g, b)
43 line x, y, x, y+37
44 end subroutine
45
46 subroutine redsliderbar(r,g,b)
47 # dibuje la barra roja desde 0,0 a 255,74
48 font "Tahoma", 30, 100
49 color rgb(255, 0, 0)
50 text 260, 10, "r"
51 for t = 0 to 255
52 # rojo y tonos rojos
53 call colorline(t, 0, 0, t, 0)
54 call colorline(t, g, b, t, 38)
55 next t
56 color black
57 rect r-1, 0, 3, 75
58 end subroutine
59
60 subroutine greensliderbar(r,g,b)
61 # dibuje la barra verde desde 0,75 a 255,149
62 font "Tahoma", 30, 100
63 color rgb(0, 255, 0)
64 text 260, 85, "g"
65 for t = 0 to 255
66 # verde y tonos verdes
67 call colorline(0, t, 0, t, 75)
68 call colorline(r, t, b, t, 113)
69 next t
70 # slider
71 color black
72 rect g-1, 75, 3, 75
73 end subroutine
74
75 subroutine bluesliderbar(r,g,b)
76 # dibuje la barra azul desde 0,150 a 255,224
77 font "Tahoma", 30, 100
78 color rgb(0, 0, 255)
79 text 260, 160, "b"
80 for t = 0 to 255
81 # azul y tonos azules
82 call colorline(0, 0, t, t, 150)
83 call colorline(r, g, t, t, 188)
84 next t
85 # deslizador
86 color black
87 rect b-1, 150, 3, 75
88 end subroutine
89
90 subroutine display(r, g, b)
91 clg
92 call redsliderbar(r,g,b)
93 call greensliderbar(r,g,b)
94 call bluesliderbar(r,g,b)
95 # dibuje muestra
96 color black
97 font "Tahoma", 13, 100
98 text 5, 235, "(" + r + "," + g + "," + b + ")"
99 color rgb(r,g,b)
100 rect 151,226,150,75
101 refresh
102 end subroutine
Programa 70: Programa Grande – Selector de Color
Ejercicios:
r f m t x v t x n j
j a a o h k s f o u
n c e y u t c l e c
b e x l e s h i y l
k n z m c s e w l i
c t m o r k u b k c
i e z u n i c o g k
l r p s g s g i m y
c j i e h w l h l m
c x l x m f z a t c
center, clickb, clickclear, clickx, clicky, left, mouseb, mousex, mousey,
right
46,62
187,59
178,132
108,96
1 # c11_readkey.kbs
2 print "Presione una tecla - Q para salir."
3 do
4 k = key
5 if k <> 0 then
6 if k >=32 and k <= 127 then
7 print chr(k) + "=";
8 end if
9 print k
10 end if
11 until k = asc("Q")
12 end
Programa 71: Leer el Teclado
key
key()
La función key devuelve el valor de la última tecla presionada por el
usuario. Una vez que el valor de la tecla es leído por la función, el
mismo es puesto a cero para denotar que ninguna tecla ha sido
presionada.
Unicode
El estándar Unicode fue creado para asignar valores numéricos a
letras y caracteres de todos los sistemas de escritura usados en
todo el mundo. Hay más de 107.000 caracteres diferentes definidos
en la versión 5.0 del estándar Unicode. Ver: http://www.unicode.org
asc(expresión)
La función asc devuelve un número entero representando el valor
Unicode del primer caracter del string expresión.
chr(entero)
La función chr devuelve un string conteniendo un solo caracter con
el valor Unicode del argumento entero.
Otro ejemplo de un programa de teclado podría ser uno para mostrar una letra y tomar el
tiempo que le insume al usuario presionar la tecla correspondiente. Este programa también
introduce la sentencia msec que devuelve la cantidad de milisegundos (1/1000 de
segundo) transcurrido desde que el programa comenzó a ejecutarse.
1 # c11_msec.kbs
2
3 # obtenga el código para un carácter al azar entre A-Z
4 c = asc("A") + int(rand*26)
5
6 # muestre la letra (a partir de su código numerico)
7 print "Presione '" + chr(c) + "'"
8
9 time = msec # tome el tiempo inicial
10 do # espere por una tecla presionada
11 k = key
12 until k = c
13 time = msec – time # calcule el tiempo transcurrido
14 print "Le tomó " + (time/1000) + " segundos presionar la tecla."
Programa 72: Prueba de Velocidad con el Teclado
Presione 'C'
Le tomó 1.833 segundos presionar la tecla.
Salida 72: Prueba de Velocidad con el Teclado
msec()
msec
La función msec devuelve el tiempo que el programa ha estado
corriendo, en milisegundos (1/1000 de un segundo).
Veamos ahora un ejemplo un poco más complejo. El Programa 73 dibuja una pelota roja en
pantalla y el usuario puede moverla usando el teclado.
1 # c11_moveball.kbs
2 # mover una pelota en pantalla con el teclado
3
4 print "Use i para arriba, j para izquierda, k para derecha, m para abajo y q
para salir."
5
6 fastgraphics
7 clg
8
9 # posición de la pelota
10 # comience en el centro de la pantalla
11 x = graphwidth /2
12 y = graphheight / 2
13 r = 20 # tamaño de la perota (radio)
14
15 # dibuje la pelota inicialmente en pantalla
16 call drawball(x, y, r)
17
18 # loop y espere hasta que el usuario presione una tecla
19 while true
20 k = key
21 if k = asc("I") then
22 y=y-r
23 if y < r then y = graphheight - r
24 call drawball(x, y, r)
25 end if
26 if k = asc("J") then
27 x=x-r
28 if x < r then x = graphwidth - r
29 call drawball(x, y, r)
30 end if
31 if k = asc("K") then
32 x=x+r
33 if x > graphwidth - r then x = r
34 call drawball(x, y, r)
35 end if
36 if k = asc("M") then
37 y=y+r
1 # c11_fallinglettergame.kbs
2
3 speed = .15 # velocidad de caida – menor = + rapido
4 nletters = 10 # letras para jugar
5 score = 0
6 misses = 0
7 color black
8 fastgraphics
9
10 clg
11 font "Tahoma", 20, 50
12 text 20, 80, "Juego de Lluvia de Letras"
13 font "Tahoma", 16, 50
14 text 20, 140, "Presione una tecla para comenzar"
15 refresh
16 # “limpie” el teclado y espere por una tecla presionada
17 k = key
18 while key = 0
19 pause speed
20 end while
21
22 misses = nletters # primero asume que perdió todas
23 for n = 1 to nletters
24 letter = int((rand * 26)) + asc("A")
25 x = 10 + rand * 225
26 for y = 0 to 250 step 20
27 clg
28 # muestre letra
29 font "Tahoma", 20, 50
30 text x, y, chr(letter)
31 # muestre score y puntos
32 font "Tahoma", 12, 50
33 value = (250 - y)
34 text 10, 270, "Valor "+ value
35 text 200, 270, "Score "+ score
36 refresh
37 k = key
38 if k <> 0 then
39 if k = letter then
40 score = score + value
41 misses-- # no perdió esta!
42 else
43 score = score - value
44 end if
45 exit for
46 end if
47 pause speed
48 next y
49 next n
50 clg
51 font "Tahoma", 20, 50
52 text 20, 40, " Juego de Lluvia de Letras"
53 text 20, 80, "Game Over"
54 text 20, 120, "Score: " + score
55 text 20, 160, "Perdió: " + misses
56 refresh
57 end
Programa 74: Programa Grande - Juego de Lluvia de Letras
Ejercicios:
k g c v f k e t
e a o w y c o u
y b n o h o z n
t b t r b l n i
f u r r t s g c
i t o a t p y o
h j l m e a b d
s i c s a c j e
arrow, asc, capslock, chr, control, key, shift, unicode
11.3. Cree un programa que simule un piano usando las teclas del
teclado. Espere en un loop de modo que cuando el usuario
presione una tecla, el programa haga un sonido por un período
de tiempo corto. Asigne sonidos de distinta frecuencia a las
teclas en el teclado
imgsave nombre_archivo
imgsave nombre_archivo, tipo
Guarda la salida gráfica en un archivo imagen de nombre
nombre_archivo. Si tipo no es especificado, la gráfica será
guardada por defecto como un archivo Portable Network Graphics
(PNG). Opcionalmente puede guardar la imagen como “.BMP” o
“.JPG” especificando el tipo como último argumento.
imgload x, y, filename
imgload x, y, escala, filename
imgload x, y, escala, rotacion, filename
Lee la imagen encontrada en el archivo filename y la muestra en la
ventana gráfica. Los valores de x e y representan la ubicación en
donde colocar el “centro” de la imagen. Las imágenes pueden ser
cargadas desde diversos formatos gráficos, incluyendo: BMP, PNG,
GIF, JPG, y JPEG. Opcionalmente, puede re-escalarlas (escala,
cambiar el tamaño) mediante una escala decimal, donde 1 es
tamaño completo. También puede rotar la imagen alrededor de su
centro en sentido a las agujas del reloj especificando rotación
5 speed = .05
6 for t = 1 to 3
7 n = int(rand * 6 + 1)
8 for pt = 1 to 200 step 10
9 font "Tahoma",pt,100
10 clg
11 color black
12 text 10,10, n
13 refresh
14 pause speed
15 next pt
16 speed = speed / 2
17 next t
18 # wait for sound to complete
29 wavwait
20 wavplay "canción_2.wav"
21 wavwait
22 end
Programa 78: Tirando Números con Música de fondo.
wavplay filename
wavplay ( filename )
wavwait
wavstop
La sentencia wavplay carga un archivo de audio (.wav) desde la
carpeta corriente y lo reproduce. La reproducción será sincrónica, lo
que significa que el programa continuará ejecutándose con la
siguiente declaración en el programa tan pronto el audio comience a
reproducirse.
Wavstop hará que el archivo de audio en reproducción, se detenga.
Wavwait hará que el programa se detenga y espere a que la
reproducción del audio termine para continuar ejecutándose.
10 dx = rand * 10
11 dy = rand * 10
12 while true
13 if spritex(0) <=0 or spritex(0) >= graphwidth -1 then
14 dx = dx * -1
15 wavplay "4359__NoiseCollector__PongBlipF4.wav"
16 end if
17 if spritey(0) <= 0 or spritey(0) >= graphheight -1 then
18 dy = dy * -1
19 wavplay "4361__NoiseCollector__pongblipA_3.wav"
20 endif
21 spritemove 0, dx, dy
22 pause .05
23 end while
Programa 79: Rebote una Pelota con Sprite y Efectos Sonoros
spritedim numerodesprites
spritedim ( numerodesprites )
La sentencia spritedim inicializa, o aloja en memoria, lugar
suficiente para guardar el número especificado de sprites
(numerodesprites). Puede alojar tantos sprites como su programa
requiera, pero tenga presente que demasiados puede hacer la
ejecución de su programa demasiada lenta.
spritehide spritenumero
spritehide ( spritenumero )
spriteshow spritenumero
spriteshow ( spritenumero )
La sentencia spriteshow causa que un sprite cargado, creado u
oculto, sea mostrado en el área gráfica.
Spritehide hace que el sprite especificado no se muestre en la
pantalla. A pesar de estar oculto, el sprite sigue existiendo y puede
ser mostrado luego.
spriteplace spritenumero, x, y
spriteplace ( spritenumero, x, y )
La sentencia spriteplace le permite ubicar el centro de un sprite
en una ubicación especificada en el área gráfica.
spritev(spritenumero)
Esta función devuelve true si un sprite cargado está siendo mostrado
en el área gráfica de salida. Devolverá false si no es visible.
spriteh(spritenumero)
spritew(spritenumero)
spritex(spritenumero)
spritey(spritenumero)
Estas funciones devuelven diversa información sobre el sprite cargado.
spriteh Devuelve la altura de un sprite en pixeles.
Los sprites también pueden ser creados usando un polígono como vimos en el Capítulo 8.
Esto se implementa usando la sentencia spritepoly.
1 # c12_spritepoly.kbs
2 # crea un sprite de un polígono que sigue al mouse
4 spritedim 1
5 color red, blue
6 penwidth 1
7 spritepoly 0, {15,0, 30,10, 20,10, 20,30, 10,30, 10, 10, 0,10}
9 color green
10 rect 0, 0, graphwidth, graphheight
11
12 spriteshow 0
13 while true
14 spriteplace 0, mousex, mousey
15 pause .01
16 end while
Programa 81: Creando el Sprite de un Polígono
1 # c12_sprite_paddleball.kbs
2 # juego de fronton hecho con sprites
3 # sonidos de http://www.freesound.org/people/NoiseCollector
4
5 print "Juego de Frontón"
6 print "Las teclas J y K mueven la raqueta. "
7 input "Presione enter para comenzar >", wait$
8
9 color white
10 rect 0, 0, graphwidth, graphheight
11
12 spritedim 2
13 color blue, darkblue
14 spritepoly 0, {0,0, 80,0, 80,20, 70,20, 70,10, 10,10, 10,20, 0,20}
15 spriteplace 0, 100,270
16 spriteshow 0
17 spriteload 1, "greenball.png"
18 spriteplace 1, 100,100
19 spriteshow 1
20 penwidth 2
21
22 dx = rand * .5 + .25
23 dy = rand * .5 + .25
24
25 bounces = 0
26
27 while spritey(1) + spriteh(1) - 5 < spritey(0)
28 k = key
29 if chr(k) = "K" then
30 spritemove 0, 20, 0
31 end if
32 if chr(k) = "J" then
33 spritemove 0, -20, 0
34 end if
35 if spritecollide(0,1) then
36 # rebote y aumente velocidad
37 dy = dy * -1
38 dx = dx * 1.1
39 bounces = bounces + 1
40 wavstop
41 wavplay "96633__CGEffex__Ricochet_metal5.wav"
42 # mover sprite fuera de la paleta
43 while spritecollide(0,1)
44 spritemove 1, dx, dy
45 end while
46 end if
47 if spritex(1) <=0 or spritex(1) >= graphwidth -1
then
48 dx = dx * -1
49 wavstop
50 wavplay "4359__NoiseCollector__PongBlipF4.wav"
51 end if
52 if spritey(1) <= 0 then
53 dy = dy * -1
54 wavstop
55 wavplay "4361__NoiseCollector__pongblipA_3.wav"
56 end if
57 spritemove 1, dx, dy
58 # ajuste la velocidad aqui
59 pause .002
60 end while
61
62 print "Ud. Rebotó la pelota " + bounces + " veces."
Programa 82: Juego de Frontón con Sprites
Ejercicios:
i s d d i m e n s i o n o z u
s e j i e s c a l e h e w d w
k p v c i r z n r o y d a s o
z j r p m a u o z l u i v p h
a e m i t s t t o m e l w r s
c f v f t a m p c c l l a i e
q o h o t e e i a i g o i t t
w j l i m t l l d w p c t e i
q a o l i e p o a e f e w h r
w n v r i e t v a i t t j i p
q b p p t s s i m d h i s d s
o s v i l t i a r m t r r e c
u u r w o a g o y p s p r p z
h p a p g e y a n d s s e f s
s f t s b k i m g l o a d u o
collision, dimension, image, imgload, picture, rotation, scale,
spritecollide, spritedim, spritehide, spriteload, spritemove,
spriteplace, spritepoly, spriteshow, wavplay, wavstop, wavwait
12.2. Ahora escriba un programa simple para tirar una moneda que
muestre el resultado usado las imágenes creadas en el
problema Genere un número aleatorio y pruebe: si el número
es menor que 0.5 muestre la cabeza, caso contrario la cola.
Como un extra, haga que cabezas y colas aparezcan en la
pantalla de manera aleatoria hasta que el usuario presione una
tecla.
12.3. Use un programa de audio para grabar dos archivos WAV con
su voz, uno diciendo “cabeza!” y otro diciendo “cola!”. Agregue
1 # c13_printpage.kbs
2 # imprimir una pagina con texto
3
4 printer on
5 x = 100 # empiece la 1ra. linea 100 pixes debajo.
6
7 font "Times New Roman", 30, 100
8 for t = 1 to 10
9 text 0, x, "The number t is " + t
10 x = x + textheight()
11 next t
12 printer off
Programa 83 : Imprimiendo una Página con Texto
printer on
printeron
Enciende la impresora.
Una vez que la impresora está encendida, las sentencias gráficas
(line, plot, text, rect, circle, poly, stamp, graphwidth, graphheight,
textwidth y textheight) ahora dibujarán y devolverán información de la
página de impresión
printer off
printeroff
Finaliza la impresión del documento corriente.
Si su salida está siendo enviada a un dispositivo de impresión, el
documento empezará a imprimirse. Si su salida está direccionada a
un archive PDF, el archivo será escrito y guardado en la ubicación
especificada.
textwidth (string)
textheight()
textwidth (ancho de texto) y textheight (alto de texto) devuelven el
ancho y alto respectivamente de un string en pixels cuando es
dibujado en la salida gráfica o dispositivo de impresión con la
sentencia text.
textwidth devuelve el ancho real del string.
textheight devuelve la altura estándar, en píxeles, del font activo.
printer page
printerpage
Si necesita imprimir una nueva página, ejecute la sentencia
printer page. La misma guardará la página corriente y toda
nueva salida irá a la próxima página.
printer cancel
printercancel
Si ha empezado a imprimir un documento y decide que no necesita
terminarlo, la sentencia printer cancel apagará la impresora y
no producirá mas salida por el dispositivo.
1 # c13_multtable.kbs
2 # imprima la tabla de multiplicar del 12 hasta 12
3 printer on
4 color black
5 font "Arial", 12, 100
6
7 # size of a cell on grid
8 w = 700/13
9 h = textheight()*2
10 #
11 pad = 5
12
13 # dibuje la grilla
14 penwidth 2
15 for x = 0 to 14
16 line x*w,0,x*w,14*h
17 next x
18 for y = 0 to 14
19 line 0,y*h,14*w,y*h
20 next y
21
22 # ponga los números de fila y de columna
23 font "Arial", 12, 100
24 for x = 0 to 12
25 text (x+1)*w+pad,pad,x
26 next x
27 for y = 0 to 12
28 text pad,(y+1)*h+pad,y
29 next y
30
31 # ponga los productos
32 font "Arial", 12, 50
33 for x = 0 to 12
34 for y = 0 to 12
35 text (x+1)*w+pad,(y+1)*h+pad,(x*y)
36 next y
37 next x
38 printer off
Programa 85: Tabla de Multiplicar
Ejercicios:
k l a n d s c a p e
j f d r e p a p t g
p o r t r a i t x a
b s g n i t t e s p
t h g i e h t x e t
r e s o l u t i o n
o k p r i n t e r o
m a r g i n d f d p
g h t d i w t x e t
o z c a n c e l x p
cancel, landscape, margin, page, paper, pdf, portrait, printer,
resolution, settings, textheight, textwidth
13.1. Tome el programa del Problema 5.1 o 5.1 y haga que imprima la
lírica de las canciones en una página después que el usuario
tipee palabras para llenar los blancos.
Puede necesitar mantener una variable con el número de línea
que esté enviando a la salida de modo que pueda calcular
cuán abajo en la página debe comenzar la línea.
13.2. Use la subrutina de la cara sonriente que creó en el Problema 9.1
para crear una página con una cara sonriente en cada una de las
4 esquinas y la palabra “SONRISA” centrada en la página.
Ingrese un numero> 63
a[0] = 100
a[1] = 200
a[2] = 0
a[3] = 200
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = -137
a[9] = 63
variable [index]
variable [indexfila, indexcolumna]
variable$[index]
variable$[indexfila, indexcolumna]
Puede usar una “referencia” al array (una variable con índice(s) en
corchetes cuadrados) casi en cualquier lugar en el que pueda usar
una variable simple. El índice o índices deben ser valores enteros
entre cero (0) y uno menos que el tamaño del array (como fue
definido al crearlo, con la sentencia dim).
Puede ser confuso, pero BASIC-256 usa cero (0) como índice del
primer elemento en un array. Así, el último elemento es el tamaño
menos uno (1). En computación arrays numerados de esta manera
se conocen como “cero-indexados”.
Podemos usar arrays numéricos para dibujar varias pelotas rebotando en la pantalla de
una sola vez. El Programa 85 usa 5 arrays para guardar la posición de cada pelota, su
dirección y su color. Se usan loops para inicializar los arrays y para animar las pelotas. El
programa también usa la función rgb() para calcular y guardar los valores de color para
cada una de las pelotas.
1 # c14_manyballbounce.kbs
2 # use arrays para mantener la direccion, posición,
3 # y color de varias pelotas en pantalla
4 fastgraphics
5 r = 10 # tamaño de la pelota
6 balls = 50 # numero de pelotas
7 dim x(balls)
8 dim y(balls)
9 dim dx(balls)
10 dim dy(balls)
11 dim colors(balls)
12
13 for b = 0 to balls-1
14 # posición inicial de las pelotas
15 x[b] = 0
16 y[b] = 0
17 # velocidad en dirección x e y
18 dx[b] = rand * r + 2
19 dy[b] = rand * r + 2
20 # cada pelota tiene su propio color
21 colors[b] = rgb(rand*256, rand*256, rand*256)
22 next b
23
24 color green
25 rect 0,0,300,300
26 while true
27 # limpie pantalla (erase screen)
28 clg
29 # ubique y dibuje las pelotas
30 for b = 0 to balls -1
31 x[b] = x[b] + dx[b]
32 y[b] = y[b] + dy[b]
33 # si off los bordes laterales rebotan la pelota
34 if x[b] < 0 or x[b] > 300 then
35 dx[b] = dx[b] * -1
36 end if
37 # si off los bordes sup e inf rebotan la pelota
38 if y[b] < 0 or y[b] > 300 then
39 dy[b] = dy[b] * -1
40 end if
41 # dibuje nueva pelota
42 color colors[b]
43 circle x[b],y[b],r
44 next b
45 # refresque el display
46 refresh
47 pause .05
48 end while
Programa 87: Varias Pelotas Rebotando.
Otro ejemplo de pelota rebotando puede verse en el Programa 88. Este segundo ejemplo
usa sprites y dos arrays para seguir la dirección en la que cada sprite se está moviendo.
1 # c14_manyballsprite.kbs
2 # otro modo de rebotar pelotas, usando sprites.
3 fastgraphics
4 color white
5 rect 0, 0, graphwidth, graphheight
6 n = 20
7 spritedim n
8 dim dx(n)
9 dim dy(n)
10
11 for b = 0 to n-1
12 spriteload b, "greenball.png"
13 spriteplace b,graphwidth/2,graphheight/2
14 spriteshow b
15 dx[b] = rand * 5 + 2
16 dy[b] = rand * 5 + 2
17 next b
18
19 while true
20 for b = 0 to n-1
21 if spritex(b) <=0 or spritex(b) >= graphwidth -1 then
22 dx[b] = dx[b] * -1
23 end if
24 if spritey(b) <=0 or spritey(b) >= graphheight -1 then
25 dy[b] = dy[b] * -1
26 end if
27 spritemove b, dx[b], dy[b]
28 next b
29 refresh
30 end while
Programa 88: Varias Pelotas Rebotando Usando Sprites
Arrays de Strings
Los arrays también pueden ser usados para guardar valores string. Para crear un array de
strings, use una variable string en la sentencia dim. Todas las reglas vistas para arreglos
numéricos son válidas para strings, excepto que el tipo de los datos es diferente. Puede ver
el uso de un array de strings en el Programa 89 a continuación.
1 # c14_listoffriends.kbs
2 # use un array de strings para guardar nombres
3 print "Haga una lista de mis amigos"
4 input "Cuantos amigos tiene? ", n
5
6 dim names$(n)
7
8 for i = 0 to n-1
9 input "Ingrese el nombre de un amigo? ", names$[i]
10 next i
11 cls
12 print "Mis amigos:"
13 for i = 0 to n-1
14 print "Amigo numero ";
15 print i + 1;
16 print ": " + names$[i]
17 next i
18 end
Programa 89: Lista de Mis Amigos
Asignando Arrays
Hemos visto el uso de llaves ({}) para reproducir música, dibujar polígonos y definir stamps.
Las llaves pueden usarse también para crear y asignar un array completo con los valores
que deseemos.
1 # c14_arrayassign.kbs
2 # usando una lista de valores para crear un array asignado
3
4 numero = {56, 99, 145}
5 nombre$ = {"Alicia", "Franco", "Luciano"}
6
7 for i = 0 to 2
8 print number[i] + " " + name$[i]
9 next i
Programa 90: Asignando un Array con una Lista
56 Alicia
99 Franco
145 Luciano
Salida 90: Asignando un Array con una Lista
Sonidos y Arrays
En el Capítulo 3 vimos como usar una lista de frecuencias y duraciones (colocadas entre
llaves) para reproducir múltiples sonidos de una vez. La sentencia sound también aceptará
una lista de frecuencias y duraciones desde un array. El array deberá tener un número par
de elementos; las frecuencias deberían ser guardadas en los elementos pares (0,2,4,…) y
las duraciones en los impares (1,3,5,…).
El Programa 91 a continuación una simple fórmula lineal para hacer un sonido “espacial”.
1 # c14_spacechirp.kbs
2 # reproduzca un sonido espacial
4 # valores pares 0,2,4... - frecuencia
5 # valores impares 1,3,5... - duracion
Gráficos y Arrays
En el Capítulo 8 vimos el uso de listas para crear polígonos y stamps. Los arrays también
pueden usarse para dibujar polígonos, stamps y sprites. Su uso ayuda a simplificar y a
hacer más elegante su código permitiendo que una figura sea definida una sola vez, sea
guardada en un array y usada tantas veces y en los lugares que su programa lo necesite
En un array usado para una figura, los elementos pares (0,2,4,…) contienen los valores x
para cada uno de los puntos, mientras que los elementos impares (1,3,5,…) contienen los
valores y de esos puntos. El array tendrá dos valores para cada punto en la figura.
En el Programa siguiente usaremos el stamp del capítulo de mouse para dibujar una gran
X con sombra. La sombra se logra “estampando” una forma gris corrida en la dirección en
que se quiera la sombra y luego estampando la forma que produce la sombra.
1 # c14_shadowstamp.kbs
2 # crear un stamp desde un array
3
4 xmark = {-1, -2, 0, -1, 1, -2, 2, -1, 1, 0, 2, 1, 1, 2, 0, 1, -1, 2, -2, 1, -1, 0, -2,
-1}
5 clg
6 color grey
7 stamp 160,165,50,xmark
8 color black
9 stamp 150,150,50,xmark
Programa 92: Stamp con Sombra
20 grades[1,0] = 66
21 grades[1,1] = 99
22 grades[1,2] = 98
23 grades[1,3] = 88
24 # tercer estudiante
25 students$[2] = "Ali"
26 grades[2,0] = 79
27 grades[2,1] = 81
28 grades[2,2] = 87
29 grades[2,3] = 73
30 total = 0
31 for row = 0 to nstudents-1
32 studenttotal = 0
33 for column = 0 to nscores-1
34 studenttotal = studenttotal + grades[row, column]
35 total = total + grades[row, column]
36 next column
37 print "El promedio de " + students$[row] + "es ";
38 print studenttotal / nscores
39 next row
40 print "El promedio de la clase es ";
41 print total / (nscores * nstudents)
42 end
Programa 94: Calculadora de Notas
El Array de Numeros:
tienes 3 elementos.
elemento 0 77
elemento 1 55
elemento 2 33
El Array de Numeros al Azar:
tiene 5 elementos.
elemento 0 7
elemento 1 5
elemento 2 1
elemento 3 9
elemento 4 10
array [?]
array$[?]
array [?,]
array$[?,]
array [,?]
array$[,?]
La referencia [?] devuelve la longitud de un array uni-dimensional o el
número total de elementos (filas*columnas) de un array bi-
dimensional.
En un array bi-dimensional, la referencia [?,] devuelve el número de
filas mientras que [,?] devuelve el número de columnas.
ref(array)
ref(array$)
La función ref() se usa para pasar a una subrutina o función, una
referencia a un array. La referencia al array debe ser especificada en
la creación de la subroutina/función y cuando es llamada.
Si la subrutina cambia un elemento en el array referenciado, el valor
también cambia fuera de la subrutina.
Note que esto es un comportamiento diferente al de otras variables,
cuyos valores al pasar a una subrutina/función son “copiados” a
nuevas variables dentro de la subrutina o función. Esto es, aunque
los valores sean cambiados dentro de la subrutina/función, estos
cambios no se reflejan fuera de las mismas, ya que lo que se cambió
fue una copia.
1 55
2 33
3 22
Salida 96: Re-Dimensionando un Array
redim variable(ítems)
redim variable$(items)
redim variable(rows, columns)
redim variable$(rows, columns)
La sentencia redim cambia el tamaño de un array en la memoria de
la computadora. Los datos guardados con anterioridad serán
mantenidos, si se ajustan al nuevo tamaño.
Cuando se re-dimensionan arrays 2-D, los valores son copiados de
manera lineal. Los datos pueden ser “corridos” de manera indeseada
si Ud. está cambiando el número de columnas.
1 # c14_spacewarp.kbs
2 # Game: Lluvia de basura espacial
3
4 # defina pelotas y arrays para ellas
5 balln = 5
6 dim ballx(balln)
7 dim bally(balln)
8 dim ballspeed(balln)
9 ballr = 10 # radio de las pelotas
10
11 # defina valores minimo y maximo
12 minx = ballr
13 maxx = graphwidth - ballr
14 miny = ballr
15 maxy = graphheight - ballr
16
17 # score initial
18 score = 0
19
20 # defina tamaño del jugador, dist.p/moverse y ubicación
21 playerw = 30
22 playerm = 10
23 playerh = 10
24 playerx = (graphwidth - playerw)/2
25
26 # defina otras variables
27 keyj = asc("J") # valor para la tecla 'j'
28 keyk = asc("K") # valor para la tecla 'k'
29 keyq = asc("Q") # valor para la tecla 'q'
30 growpercent = .20 # crecimiento al azar – mayor, mas rapido
31 speed = .15 # velocidad - menor, mas rapido
32
33 print "SpaceWarp – Use teclas j y k para esquivar la basura espacial."
34 print "q para Salir"
35
36 fastgraphics
37
38 # defina positiones pelotas inicial y velocidad
39 for n = 0 to balln-1
40 bally[n] = miny
41 ballx[n] = int(rand * (maxx-minx)) + minx
42 ballspeed[n] = int(rand * (2*ballr)) + 1
43 next n
44
45 more = true
46 while more
47 pause speed
48 score = score + 1
49
50 # limpie pantalla
51 color black
52 rect 0, 0, graphwidth, graphheight
53
54 # dibuje pelotas y verifique si hay colisiones
55 color white
56 for n = 0 to balln-1
57 bally[n] = bally[n] + ballspeed[n]
58 if bally[n] > maxy then
59 # ball fell off of bottom - put back at top
60 bally[n] = miny
61 ballx[n] = int(rand * (maxx-minx)) + minx
62 ballspeed[n] = int(rand * (2*ballr)) + 1
63 end if
64 circle ballx[n], bally[n], ballr
65 if ((bally[n]) >= (maxy-playerh-ballr)) and
((ballx[n]+ballr) >= playerx) and ((ballx[n]-ballr)
<= (playerx+playerw)) then more = false
66 next n
67
68 # dibuje jugador (draw player)
69 color red
Ejercicios:
a t d v i t f p a u
y o y n s z o n c b
e r d q a i m n o e
o e o s c o l u m n
x e d m c z d y v i
c o l l e c t i o n
a r r a y m n h z y
y h t s i l e g d f
d i m e n s i o n l
y j n f z r o w l t
array, collection, column, dimension, index, list, memory, row
Operadores Nuevos
Además de las operaciones matemáticas básicas que hemos visto hasta ahora, hay tres
operadores básicos adicionales en BASIC-256. Operadores para estas tres operaciones
existen en la mayoría de los lenguajes de computación. Estos son los operadores: módulo,
división entera y potencia.
Operador Módulo
El operador módulo (%) devuelve el resto de una división entera.
1 # c15_modulo.kbs
2 input "ingrese un número: ", n
3 if n % 2 = 0 then print "divisible por 2"
4 if n % 3 = 0 then print "divisible por 3"
5 if n % 5 = 0 then print "divisible por5"
6 if n % 7 = 0 then print "divisible por 7"
7 end
Programa 98: El Operador Módulo
Ingrese un número: 10
divisible por 2
divisible por 5
Salida 98: El Operador Módulo
expresion1 % expresion2
El operador módulo efectúa una división entera de expression1 por
expression2 y devuelve el resto de este proceso.
Si una o ambas expresiones no son enteros, serán convertidas a
entero eliminando la parte decimal (al igual que la función int()) antes
de efectuar la operación de división.
Ud. puede no haberlo pensado, pero el operador módulo (%) es usado muy a menudo por
los programadores. Dos usos de los más comunes son: 1) probar si un número se divide
por otro (Programa 98), y 2) para limitar un número a un rango específico (Programa 99).
1 # re-escritura de moveball.kbs usando el operador modulo
2 # para mantener la pelota en la pantalla.
3
4 print "Use i para moverse hacia arriba, j para la izquierda, k para la
derecha, m para abajo y q para salir"
5 fastgraphics
6 clg
7 ballradius = 20
8 # posición de la pelota
9 # comience en el centro de la pantalla
10 x = graphwidth /2
11 y = graphheight / 2
12
13 # dibuje la pelota inicialmente en pantalla
14 call drawball(x, y, ballradius)
15
16 # loop y espere que el usuario presione una tecla
17 while true
18 k = key
19 if k = asc("I") then
20 # y puede hacerse negativo, + graphheight lo mantiene positivo
21 y = (y - ballradius + graphheight) % graphheight
22 call drawball(x, y, ballradius)
23 end if
24 if k = asc("J") then
25 x = (x - ballradius + graphwidth) % graphwidth
26 call drawball(x, y, ballradius)
27 end if
28 if k = asc("K") then
29 x = (x + ballradius) % graphwidth
30 call drawball(x, y, ballradius)
31 end if
32 if k = asc("M") then
33 y = (y + ballradius) % graphheight
34 call drawball(x, y, ballradius)
35 end if
36 if k = asc("Q") then end
37 end while
38
39 subroutine drawball(bx, by, br)
40 color white
41 rect 0, 0, graphwidth, graphheight
42 color red
43 circle bx, by, br
44 refresh
45 end subroutine
1 # c15_integerdivision.kbs
2 input "dividendo ", dividendo
3 input "divisor ", divisor
4 print dividendo + " / " + divisor + " is ";
5 print dividendo \ divisor;
6 print "r";
7 print dividendo % divisor;
Programa 100: Verifique su división Larga
dividendo 43
divisor 6
43 / 6 is 7r1
Salida 100: Verifique su división Larga
expr1 \ expr2
La división entera (\) efectúa la división expr1 / expr2 y devuelve
el número de veces que expr1 cabe en expr2.
Si una o ambas expresiones no son enteros, serán convertidas a
entero eliminando la parte decimal (al igual que la función int()) antes
de efectuar la operación de división.
Operator Potencia
El operador potencia (^) eleva un número a la potencia de otro número.
1 # c15_power.kbs
2 for t = 0 to 16
3 print "2 ^ " + t + " = ";
4 print 2 ^ t
5 next t
Programa 101: Las Potencias de Dos
2 ^ 0 = 1
2 ^ 1 = 2
2 ^ 2 = 4
2 ^ 3 = 8
2 ^ 4 = 16
2 ^ 5 = 32
2 ^ 6 = 64
2 ^ 7 = 128
2 ^ 8 = 256
2 ^ 9 = 512
2 ^ 10 = 1024
2 ^ 11 = 2048
2 ^ 12 = 4096
2 ^ 13 = 8192
2 ^ 14 = 16384
2 ^ 15 = 32768
2 ^ 16 = 65536
Salida 101: Las Potencias de Dos
expr1 ^ expr2
El operador potencia (^) eleva expr1 a la potencia de expr2.
La expresión matemática a = bc debe ser escrita en BASIC-256
como a = b^c.
Función Descripción
1 # c15_intceilfloor.kbs
2 for t = 1 to 10
3 n = rand * 100 - 50
4 print n;
5 print " int=" + int(n);
6 print " ceil=" + ceil(n);
7 print " floor=" + floor(n)
8 next t
Programa 102: Diferencia entre Int, Ceiling y Floor
Función Descripción
Función Descripción
cos (expresion) Devuelve el coseno de un ángulo
sin (expresion) Devuelve el seno de un ángulo
tan (expresion) Devuelve la tangente de un ángulo
degrees (expresion) Convierte radianes (0 - 2π) a grados (0-360).
radians (expresion) Convierte grados (0-360) a radianes (0 - 2π).
Devuelve el coseno inverso (arco coseno) de un
acos (expresion)
ángulo
Devuelve el seno inverso (arco seno) de un
asin (expresion)
ángulo
Devuelve la tangente inversa (arco tangente) de
atan (expresion)
un ángulo
La discusión de las primeras tres funciones refiere a los lados de un triángulo recto. La
Ilustración 24 muestra un triangulo recto con sus lados y ángulos identificados.
Tangente:
La tangente (tan) es la razón de la longitud del lado opuesto sobre la longitud del lado
adyacente.
1 # c15_handyclock.kbs
2
3 fastgraphics
4 while true
5 clg
6 # draw outline
7 color black, white
8 penwidth 5
9 circle 150,150,105
10 # dibuje las 60 marcas (cada 5 haga una mas larga)
11 color black
12 penwidth 1
13 for m = 0 to 59
14 a = 2 * pi * m / 60
15 if m % 5 = 0 then
16 pip = 5
17 else
18 pip = 1
19 end if
20 circle 150-sin(a)*95,150-cos(a)*95,pip
21 next m
22 # dibuje las manecillas
23 h = hour % 12 * 60/12 + minute/12 + second /3600
24 call drawhand(150,150,h,50,6,green)
25 m = minute + second / 60
26 call drawhand(150,150,m,75,4,red)
27 call drawhand(150,150,second,100,3,blue)
28 refresh
29 pause 1
30 end while
31
32 subroutine drawhand(x, y, f, l, w, handcolor)
33 # pase la ubicación x e y
34 # f como ubicación en la cara del reloj 0-59
35 # longitud, ancho, y color de la manecilla
36 color handcolor
37 stamp x, y, 1, f/60*2*pi - pi / 2, {0,-w,l,0,0,w}
38 end subroutine
Programa 103: Programa Grande – Reloj con Manecillas
Ejercicios:
e c e i l i n g n d a b
f t z n n u r a r b g s
c y i t a e t e s m o k
f s r s g a m p h c t j
a a r e o a l t a n i s
t o t o i p i l e p d n
t n l n o r p c c o e a
i a d u a l a o o w g i
r e o g d j f s s e r d
r o o l d o i x k r e a
r l p a f n m w c s e r
d s h y p o t e n u s e
abs, acos, adjacent, asin, atan, ceiling, cos, degrees, float, floor,
hypotenuse, int, integer, logarithm, modulo, opposite, power, radians,
remainder, sin, tan
Función Descripción
La Función String()
La función string() toma una expresión en cualquier formato y la devuelve como un string.
Esta función es un modo conveniente de convertir un número entero o punto flotante en
caracteres de modo que pueda ser manejado como un string.
1 # c16_string.kbs
2 # convierte un numero a string
3
4 a$ = string(10 + 13)
5 print a$
6 b$ = string(2 * pi)
7 print b$
Programa 104: La función String
23
6.283185
Salida 104: La función String
string(expresion)
Convierte expresion (string, entero o punto flotante) a un valor
string
La función Length()
La función length() (longitud) toma una expresión string y devuelve su longitud (en
caracteres o letras).
1 # c16_length.kbs
2 # encuentre el largo de un string
3 # debería imprimir 6, 0, y 17
4 print length("Hola.")
5 print length("")
6 print length("Programando Rulz!")
Programa 105: La función Length
6
0
17
Salida 105: La función Length
length(expression)
Devuelve la longitud (nro. De caracteres) del string expression.
Devuelve cero (0) para el string vacío "".
abcd
kl
def
jklm
left(bstring, largo)
Devuelve un sub-string de longitud largo a partir del extremo
izquierdo de bstring. Si largo es igual o mayor que la longitud de
bstring, devolverá bstring completa.
right(bstring, largo)
Devuelve un sub-string de longitud largo a partir del extremo derecho
de bstring. Si largo es igual o mayor que la longitud de bstring,
devolverá bstring completa.
hola.
HOLA.
Salida 107: Las funciones Upper y Lower
lower(bstring)
upper(bstring)
Devuelve una copia de bstring pero en minúsculas o mayúsculas
respectivamente. Caracteres no-alfabéticos no serán modificados.
La función Instr()
La función instr() busca, dentro de un string, la ocurrencia de un sub-string. El valor
devuelto es la posición en el string donde comienza el sub-string. Si el sub-string no se
encuentra, la función devolverá cero (0).
1 # c16_instr.kbs
2 # un string dentro de otro
3
4 a$ = "abcdefghijklm"
5 print 'la ubicación de "hi" es ';
6 print instr(a$,"hi")
7 print 'la ubicación de "bye" es ';
8 print instr(a$,"bye")
Programa 108: La función Instr()
la ubicación de "hi" es 8
la ubicación de "bye" es 0
Salida 108: La función Instr()
instr(haystack, needle)
1 # c16_radix.kbs
2 # convierte un numero de una base (2-36) a otra
3
4 # letras usadas para los dígitos 11 al 26
5 digits$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
6
7 frombase = getbase("desde base")
8 input "numero en base " + frombase + " >", number$
9 number$ = upper(number$)
10
11 # convierta numero a base 10 y guárdelo en n
12 n=0
13 for i = 1 to length(number$)
14 n = n * frombase
15 n = n + instr(digits$, mid(number$, i, 1)) - 1
16 next i
17
18 tobase = getbase("to base")
19
20 # ahora construya string en tobase
21 result$ = ""
22 while n <> 0
23 result$ = mid(digits$, n % tobase + 1, 1) + result$
24 n = n \ tobase
25 end while
26
27 print "en base " + tobase + " el numero es " + result$
28 end
29
30 function getbase(message$)
31 # obtenga la base desde 2 a 36
32 do
33 input message$+"> ", base
34 until base >= 2 and base <= 36
35 return base
36 end function
Programa 109: Big Program - Radix Conversion
desde base> 10
numero en base 10 >999 a base> 16
en base 16 el numero es 3E7
Salida 109: Big Program - Radix Conversion
Ejercicios:
u r h t g n e l
p g i r a g k f
p r n l c f l r
e q i i e f e t
r d r g r f x s
v i i r h t t n
p m m x o t s i
r e w o l f w i
instr, left, length, lower, mid, right, string, upper
codificado.
Corrimiento (shift) >4
mensaje >i could really go for some pizza
M GSYPH VIEPPC KS JSV WSQI TMDDE
1 # c17_readlfile.kbs
2 # leer un archivo de texto simple
3
4 input "Archivo> ", fn$
5 if not exists(fn$) then
6 print fn$ + " El archivo no existe."
7 end
8 end if
9 #
10 n=0
11 open fn$
12 while not eof
13 l$ = readline
14 n=n+1
15 print n + " " + l$
16 end while
17 #
18 print "El archivo " + fn$ + " tiene " + size + " bytes."
19 close
Programa 110: Leer Líneas desde un Archivo
Archivo> e2_c17_test.txt
1 These are the times that
2 try men's souls.
3 - Thomas Paine
El archivo e2_c17_test.txt tiene 57 bytes long.
Salida 110: Leer Líneas desde un Archivo
exist(expresión)
Busca en la computadora un archivo con nombre expresión
(string). El disco y la ruta de acceso debe ser especificada como
parte del nombre del archivo; pero si éstos se omiten, entonces se
buscará el archivo en el directorio corriente.
Devuelve true si el archivo existe, false caso contrario.
open expresión
open (expresión)
open unumero, expresión
open (unumero, expresión)
Abre el archivo de nombre expresión para leer y escribir y le asigna
unumero como número de unidad de E/S. A partir de este momento
su programa se referirá a ese archivo por su número de unidad
(unumero), no por su nombre.
BASIC-256 puede tener un total de ocho (8) archivos abiertos
simultáneamente (unidades E/S número 0 a 7). Si no se especifica
unumero, entonces el archivo será abierto como unidad cero (0).
Si el archivo no existe, entonces será creado de modo que se pueda
escribir en él (ver write y writeline). Asegúrese de ejecutar la sentencia
close cuando el programa haya terminado de usar el archivo.
eof
eof()
eof(unumero)
La función eof devuelve el valor true si se alcanzó el final del archivo
y false caso contrario (aún quedan más datos)
Si no se especifica unumero, entonces el archivo que se usará será
la unidad cero (0).
readline
readline()
readline(unumero)
Devuelve un string con el contenido de la línea corriente del archivo
abierto (hasta encontrar EOL). Si estamos al final del archivo
[eof(filename)=true], entonces devuelve un string vacío (“”).
Si no se especifica unumero, entonces el archivo que se usará será
la unidad cero (0).
size
size()
size(unumero)
Esta función devuelve la longitud de un archivo abierto, en Bytes.
Si no se especifica unumero, entonces el archivo que se usará será
close
close()
close unumero
close(unumero)
La sentencia close completa cualquier operación de E/S pendiente y
libera el número asignado a esa unidad.
Si no se especifica unumero, entonces el archivo que se cerrará será
la unidad cero (0).
1 # c17_resetwrite.kbs
2 # escriba texto a un archivo, vuelva al comienzo y
3 # muestre el texto
4
5 open "e2_c17_resetwrite.dat"
6 print "Ingrese una línea en blanco para cerrar el archivo."
7
8 # limpie el archivo (reset) y vuelva a empezar
9 reset
10 while true
11 input ">", l$
12 if l$ = "" then exit while
13 writeline l$
14 end while
15
16 # vaya al inicio y muestre contenido
17 seek 0
18 k=0
19 while not eof()
20 k=k+1
21 print k + " " + readline()
22 end while
23
24 close
25 end
Programa 111: Limpie el archivo y escriba líneas
reset or
reset() or
reset unumero
reset(unumero)
Borre todos los datos en un archivo abierto y mueva el puntero del
archivo al comienzo del mismo.
Si no se especifica unumero, entonces el archivo que se usará será
la unidad cero (0).
seek expresión
seek(expresión)
seek unumero,expresión
seek (unumero,expresión)
Posiciona el puntero del archivo para la próxima operación de
escritura o lectura. Para mover el puntero al comienzo del archivo use
el valor cero (0). Para moverlo al final del archivo (EOF) use la
función size() como argumento de la sentencia seek
Si no se especifica unumero, entonces el archivo que se usará será
la unidad cero (0).
writeline expresión
writeline(expresión)
writeline unumero, expresión
writeline (unumero, expresión)
Escribe el contenido de expresión a un archivo abierto y agrega al
final una marca EOL (End Of Line, Fin de Línea). El puntero del
archivo será posicionado al final de la escritura, de modo que queda
posicionado para escribir una nueva línea
Si no se especifica unumero, el archivo que se usará será la
unidad cero (0).
1 # c17_appendwrite.kbs
2 # agregar nuevas líneas al final del archivo
3 # luego mostrarlas en pantalla
4
5 open "e2_c17_appendwrite.dat"
6 print "Ingrese una línea en blanco para cerrar el archivo."
7
8 # mueva el puntero al final del archivo y agregue
9 seek size
10 while true
11 input ">", l$
12 if l$ = "" then exit while
13 writeline l$
14 end while
15
16 # mueva puntero al comienzo del archivo y muestre contenido
17 seek 0
18 k=0
19 while not eof()
20 k=k+1
21 print k + " " + readline()
22 end while
23
24 close
25 end
Programa 112: Agregue Líneas al Final de un Archivo
read
read()
read(unumero)
Lee la siguiente palabra o número (token) desde un archivo. Los
tokens están delimitados por espacios, tabs o EOL (el carácter End-
Of-Line). Múltiples delimitadores entre tokens serán tratados como
uno solo.
write expresión
write (expresión)
write unumero,expresión
write (unumero,expresión)
Escribe el string expresión en un archivo. No adiciona EOL u otro
delimitador. Si no se especifica unumero, el archivo que se usará
será la unidad cero (0).
1 # c17_phonelist.kbs
2 # Agregue un nro. Telefónico a la lista y muéstrelo
3
4 filename$ = "c17_phonelist.txt"
5
6 print "phonelist.kbs - Maneje su directorio telefónico."
7 do
8 input "Agregar, Listar, Salir (a/l/s)? ",action$
9 if left(lower(action$),1) = "a" then call addrecord(filename$)
10 if left(lower(action$),1) = "l" then call listfile(filename$)
11 until left(lower(action$),1) = "s"
12 end
13
14 subroutine listfile(f$)
15 if exists(f$) then
16 # liste nombres y TE números en el archivo
17 open f$
18 print "el archivo tiene " + size + " bytes"
19 while not eof
20 # lea siguiente línea del archivo e imprimala
21 print readline
22 end while
23 close
24 else
25 print "No hay TEs en el archivo. Agregue primero."
26 end if
27 end subroutine
28
29 subroutine addrecord(f$)
30 input "Nombre a agregar? ", name$
31 input "Nro. TE a agregar? ", phone$
32 open f$
33 # seek to the end of the file
34 seek size()
35 # we are at end of file - add new line
36 writeline name$ + ", " + phone$
37 close
38 end subroutine
Programa 113: Programa Grande – Lista Telefónica
Ejercicios:
e n i l e t i r w e
s y r o t c e r i d
n e k o t s q h e r
e f m e t s f l e p
p p s s i i i a s c
o e i z l m d e l e
r x e e i l e o r o
e e r t i k s y e f
t k e n z e l j a d
b r e w r i t e d n
close, delimiter, directory, eof, exists, file, open, read, readline, reset,
seek, size, token, write, writeline, words
Pablo,57,30
Escriba un programa que lea los datos del archivo tareas.txt y
escriba un nuevo archivo llamado “findegrado.txt” con los
nombres de los estudiantes, una coma, y su nota. Calcule la
nota para cada estudiante en base al promedio de sus
calificaciones. El archivo de salida debería tener algo asi como:
Alicia,66.5
…
Stack
Un stack (pila de cosas, de datos) es una de las estructuras de datos más comunes
usadas por los programadores para muy diversas tareas. Un stack trabaja como una “pila
de descarte”. Cuando se agrega una pieza de datos a un stack (esta acción se llama “push”
en inglés), esta se agrega en la parte superior del mismo y de ese modo los datos van
“apilándose” unos sobre otros. Cuando se saca una pieza del stack, se toma siempre la de
arriba (proceso llamado “pop” en inglés) quedando disponible la que estaba
inmediatamente debajo. La Ilustración 31 siguiente muestra gráficamente el proceso.
1 # c18_stack.kbs
2 # implementando un stack usando un array
3
4 dim stack(1) # array para contener el stack con tamaño inicial
5 nstack = 0 # numero de elementos en el stack
6 global stack, nstack
7
8 call push(1)
9 call push(2)
10 call push(3)
11 call push(4)
12 call push(5)
13 while not vacio()
14 print pop()
15 end while
16 end
17
18 function vacio()
19 # devuelva true si el comienzo está vacío
20 return nstack=0
21 end function
22
23 function pop()
24 # tome el primer numero del stack y devuelvalo
25 # o imprima un mensaje y devuelva -1
26 if nstack = 0 then
27 print "stack vacio"
28 return -1
29 end if
30 nstack = nstack - 1
31 value = stack[nstack]
32 return value
33 end function
34
35 subroutine push(valor)
36 # ponga el numero en la variable “valor” sobre el stack
37 # agrande el stack si esta lleno
38 if nstack = stack[?] then redim stack(stack[?] + 5)
39 stack[nstack] = valor
40 nstack = nstack + 1
41 end subroutine
Programa 114: Stack
5
4
3
2
1
Salida 114: Stack
global variable
global variable, variable...
Global le dice a BASIC-256 que las variables a continuación
podrán ser vistas en todo el programa (tanto dentro como fuera de
funciones o subrutinas). El uso de variables “globales” no es
usualmente recomendado, excepto cuando hay real necesidad de
compartir valores o arrays. Aún así, su uso debe ser minimizado.
Queue
El queue (cola, pronunciado Qiu en inglés) es otro tipo de estructura de datos muy común.
El queue, en su forma más simple, es como la cola en el comedor de la escuela: El primero
en la línea es el primero en salir a comer. La ilustración 32 muestra el diagrama de bloques
de un queue (compárelo con el de stack arriba). Este tipo de estructura es descripto como
“primero que entra, primero que sale” o FIFO (en inglés, First-In, First-Out).
El término enqueue (en inglés pronunciado in-qiu) y dequeue (pronounciado dee-q) son
los nombres usados para describir las acciones de agregar un nuevo ítem al final de la fila
(tail o cola) o remover un ítem del frente de la fila (head o cabeza).
El Programa 115 usa un array y dos punteros que siguen y mantienen la pista de la cabeza
(head) y la cola (tail) de la fila.
1 # c18_queue.kbs
2 # implementando un queue usando un array
3 global queuesize, queue, queuetail, queuehead, inqueue
4 call createqueue(5)
5
6 call enqueue(1)
7 call enqueue(2)
8
9 print dequeue()
10 print
11
12 call enqueue(3)
13 call enqueue(4)
14
15 print dequeue()
16 print dequeue()
17 print
18
19 call enqueue(5)
20 call enqueue(6)
21 call enqueue(7)
22
23 # vacie el queue
24 while inqueue > 0
25 print dequeue()
26 end while
27 end
28
30 subroutine createqueue(z)
31 # máximo nro. de entradas en la queue a cualquier tiempo
32 queuesize = z
33 # array para contener la queue con valor inicial
34 dim queue(z)
35 # ubicación en la queue de la próxima entrada nueva
36 queuetail = 0
37 # ubicación en la queue de la próxima entrada a ser devuelta (servida)
38 queuehead = 0
39 # numero de entradas en la queue
40 inqueue = 0
41 end subroutine
42
43 function dequeue()
44 if inqueue = 0 then
45 print "queue is empty"
46 value = -1
47 else
48 value = queue[queuehead]
49 inqueue--
50 queuehead++
51 if queuehead = queuesize then queuehead = 0
52 end if
53 return value
54 end function
55
56 subroutine enqueue(value)
57 if inqueue = queuesize then
2
3
4
5
6
7
Sample Output 115: Queue
Linked List
En la mayoría de los libros, la discusión del material de este capítulo comienza con linked
list (lista encadenada, enlazada). Pero, debido a que BASIC-256 maneja la memoria de
manera diferente que muchos otros lenguajes de programación, esta discusión fue
postergada hasta después de haber introducidolos conceptos de stack y queues.
Una linked list es una secuencia de nodos que contienen datos y un puntero o índice al
próximo nodo de la lista. O sea que, además de los nodos con información ahora también
necesitamos un puntero (pointer) que apunte al primer nodo. Llamamos al primer nodo la
“cabeza” (head). Analice la Ilustración 33 y verá como cada nodo apunta a otro.
Una ventaja de una linked list sobre un array es la facilidad que ofrece para insertar o
borrar un nodo. Para borrar un nodo, todo lo que necesita es cambiar el puntero del nodo
anterior (Ilustración 34) y liberar el nodo descartado de modo que pueda ser reusado.
Insertar un nuevo nodo es tan simple como crear un nuevo nodo: apuntando el nuevo nodo
al nodo precedente a donde se quiere insertar y modificando el pointer del nodo precedente
para apuntar al nodo que se está insertando. La Ilustración 35 muestra el proceso de
insertar un nuevo nodo en la segunda posición de la lista.
Las linked list son una de las estructuras de datos más simples. En el lenguaje BASIC
(debido a no ser compilado, sino interpretado) no es posible alojar memoria como en otros
lenguajes de programación, de modo que si se quiere usar linked list, es necesario simular
su comportamiento mediante el uso de arrays.
En el Programa 116 usamos el array data$ para guardar el texto en la lista, el array
nextitem contiene el índice al próximo nodo y el array freeitem contiene una pila (stack) de
índices de arrays libres (no usados).
1 # c18_linkedlist.kbs
2 # crer una “linked list” usando arrays
3
4 # data$ es array conteniendo los strings de datos en la lista
5 # nextitem es un array con punteros al próximo ítem de datos
6 # si nextitem es -2:esta libre o si -1:es el final
7
8 global head, data$, nextitem
9 call initialize(6)
10
11 # lista de 3 personas
12 call append("Bob")
13 call append("Sue")
14 call append("Guido")
15 call displaylist()
16 call displayarrays()
17 call wait()
18
19 print "eliminar persona 2"
20 call delete(2)
21 call displaylist()
22 call displayarrays()
23 call wait()
24
25 print "insertar Mary al frente de la lista (#1)"
26 call insert("Mary",1)
27 call displaylist()
28 call displayarrays()
29 call wait()
30
31 print "insertar John en posicion 2"
32 call insert("John",2)
33 call displaylist()
34 call displayarrays()
35 call wait()
36
37 print "eliminar persona 1"
38 call delete(1)
39 call displaylist()
40 call displayarrays()
41 call wait()
42 end
43
44 subroutine wait()
45 input "Intro para continuar> ",foo$
46 print
47 end subroutine
48
49 subroutine initialize(n)
50 head = -1 # comienzo de lista (-1 pointer a ningún lado)
51 dim data$(n)
52 dim nextitem(n)
53 # inicialice items como libres
54 for t = 0 to data$[?]-1
55 call freeitem(t)
56 next t
57 end subroutine
58
59 subroutine freeitem(i)
60 # elemento libre en el array, en posicion i
61 data$[i] = ""
62 nextitem[i] = -2
63 end subroutine
64
65 function findfree()
66 # encuentre un ítem libre (un item apuntando a -2)
67 for t = 0 to data$[?]-1
68 if nextitem[t] = -2 then return t
69 next t
70 print 'no hay elementos libres para alojar'
71 end
72 end function
73
74 function createitem(text$)
75 # crear un nuevo ítem en la lista
76 # y devolver índice a la nueva ubicacion
77 i = findfree()
78 data$[i] = text$
79 nextitem[i] = -1
80 return i
81 end function
82
83 subroutine displaylist()
84 # muestre la lista siguiendo la linked list
85 print "list..."
86 k=0
87 i = head
88 do
89 k=k+1
90 print k + " ";
91 print data$[i]
92 i = nextitem[i]
93 until i = -1
94 end subroutine
95
96 subroutine displayarrays()
97 # muestre datos realmente guardados y como
98 print "arrays..."
99 for i = 0 to data$[?]-1
100 print i + " " + data$[i] + " >" + nextitem[i] ;
101 if head = i then print " <<head";
102 print
103 next i
104 end subroutine
105
106 subroutine insert(text$, n)
107 # inserte text$ en la posición n
108 index = createitem(text$)
109 if n = 1 then
110 nextitem[index] = head
1 # c18_bubblesortf.kbs
2 # implementando un ordenamiento simple
4 # El ordenamiento burbuja es uno de los algoritmos MAS
5 # LENTOS para ordenar, pero el mas fácil de implementar
6 # y entender
7 # El algoritmo para el ordenamiento burbuja es:
8 # 1. Pase a través del array barriendo valores adyacentes
9 # de modo que el menor valor quede primero.
10 # 2. Ejecute el paso 1 una y otra vez hasta que no haya
1 # c18_insertionsort.kbs
2 # implementando un ordenamiento eficiente
3
4 # El Ordenamiento por Insercion hace un loop a través de
5 # los items comenzando en el segundo elemento.
6
7 # toma el elemento corriente y lo inserta en la posicion
8 # ordenada correcta en los elementos previamente ordenados
9
10 # moviéndose desde atrás de la ubicación corriente y
11 # corriendo los elementos con un valor mayor hacia
12 # adelante para hacer lugar al corriente valor en el
13 # lugar correcto (en un array parcialmente ordenado).
14
15 dim d(20)
16
17 # llene el array con números desordenados
18 for i = 0 to d[?]-1
19 d[i] = int(rand * 1000)
20 next i
21
22 print "*** Desordenado ***"
23 call displayarray(ref(d))
24
25 call insertionsort(ref(d))
26
27 print "*** Ordenado ***"
28 call displayarray(ref(d))
29 end
30
31 subroutine displayarray(ref(a))
32 # imprima los valores del array
33 for i = 0 to a[?]-1
34 print a[i] + " ";
35 next i
36 print
37 end subroutine
38
39 subroutine insertionsort(ref(a))
40 for i = 1 to a[?] - 1
41 currentvalue = a[i]
42 j=i-1
43 done = false
44 do
45 if a[j] > currentvalue then
46 a[j+1] = a[j]
47 j=j-1
Ejercicios:
k f i f o e q i q h m t o
n o f i l u x q q y e r b
i h p v e o d t q y u o d
l m p u f d s r c t e s e
v o e k x v m o i s u n u
p g f c i l e s a i q o e
q l f a u h m e l l n i u
v o i t q s o l l i e t q
i b c s z u r b o d t r e
z a i v e p y b c s z e d
d l e y d j h u a r o s p
z y n g o v c b t y l n q
m x t s n y i t e i q i b
allocate, bubblesort, dequeue, efficient, enqueue, fifo, global,
insertionsort, lifo, link, list, memory, node, pop, push, queue, stack
1 # c19_trycatch.kbs
2 # simple try catch
3
4 print "Dividir dos Números"
5 while true
6 input "numerador? ", n
7 input "denominador? ", d
8 try
9 q = n/d
10 print "El cociente es " + q
11 catch
12 print "No es posible dividir " + n + " por " + d
13 end try
14 end while
Programa 120: Simple Programa que divide y Atrapa error
try
declaraciones(s) a probar
catch
declaraciones a ejecutar si ocurre un error
end try
1 # c19_trap.kbs
2 # atrapado de error con informe
3
4 try
5 print "z = " + z
6 catch
7 print "Error Atrapado"
8 print " Error = " + lasterror
9 print " En línea = " + lasterrorline
10 print " Mensaje = " + lasterrormessage
11 end try
12 print "Programa aún corriendo después del error."
Programa 121: Try/Catch – Con Mensajes
Error Atrapado
Error = 12
En línea = 4
Mensaje = Unknown variable z (variable z desconocida)
Programa aún corriendo después del error.
Salida 121: Try/Catch – Con Mensajes
lasterror or lasterror()
lasterrorline or lasterrorline()
lasterrormessage or lasterrormessage()
lasterrorextra or lasterrorextra()
Las cuatro funciones lasterror devolverán información sobre el
último error atrapado. Estos valores permanecerán sin cambios hasta
que eventualmente otro error sea encontrado.
1 # c19_inputnumber.kbs
2
3 input "Ingrese un numero> ",a
4 print a
Programa 122: Error de Conversión de Tipo
En el tercer caso, cuando el programa se corre con la opción “error” habilitada, cuando
ocurre una conversión de tipo inválida se muestra un error y la ejecución del programa se
detiene. Este error es atrapable con try/catch/end try.
Ingrese un numero> abcd
ERROR on line 3: Unable to convert string to number.
(No es posible convertir el string a un número)
Salida 122: Error de Conversión de Tipo – Opción Error
Hay una segunda manera de atrapar errores en tiempo de ejecución: usando una
subrutina. Cuando un error de este tipo ocurre, el programa llamará a la rutina
especificada. Cuando la subrutina devuelva el control al programa, este continuará en la
línea siguiente a la de donde se hizo el llamado a la subrutina.
En el Programa 123 siguiente vemos que el programa llama a la subrutina cuando trata de
leer el valor de z (una variable no definida). Si intentamos correr el mismo programa con la
línea 1 comentada o removida, el programa terminará inmediatamente después de que
ocurra el error.
1 # c19_simpletrap.kbs
2 # atrapando error con subrutina
3
4 onerror atrap # se define subrutina a llamar
5 print "z = " + z
6 print "Aún corriendo después del error"
7 end
8
9 subroutine atrap()
10 print "Se atrapó un error."
11 end subroutine
Programa 123: Captura de Error Simple con Subrutina
Se atrapó un error.
z=0
Aún corriendo después del error
Salida 123: Captura de Error Simple con Subrutina
onerror nombresub
Crea una trampa de errores que saltará automáticamente a la
subrutina nombresub cuando ocurra un error.
Ejercicios:
e u q r l w f e p j x s p w n c
p g u b i r r h f j w w w o c p
b l a s t e r r o r e x t r a p
q e e s v w j l p g a m w l o q
t a n n s r q o i i t m r a n o
r f x i d e o u c a t c h t e y
y h z r l t m r f k o s k v r i
q o i b m r r r r s i e f b r f
x l f x o z o y o e l b b i o a
y k m f z o r r q r t s k e r a
z a h l e i r y r p r s f g y m
i l i l n r e j f e p e a n r l
a q c m t q r k o g t l t l u u
r e u k z b b o u f l s g s t j
m s u h l a r x r m v w a q a l
u b z r l h a l k p a r t l n l
catch, endtry, error, lasterror, lasterrorextra, lasterrorline,
lasterrormessage, offerror, onerror, trap, try
El Lenguaje SQL
Hoy en día, la mayoría de las bases de datos relacionales usan el lenguaje SQL para
implementar la manipulación de datos. SQL es el acrónimo de Structured Query Language.
El lenguaje SQL original fue desarrollado por IBM en 1970. Es un lenguaje muy poderoso y
ha sido adoptado durante todos estos años como un estándar para programación de BD.
En la actualidad hay diversas implementaciones con pequeñas diferencias entre ellas.
BASIC-256 usa SQLite como “motor” de Base de Datos. Puede encontrar información
detallada sobre SQLite y su sintaxis en su sitio Web: http://www.sqlite.org.
Aquí Ud. ha visto tres nuevas sentencias de BD: dbopen: abre una archivo de BD o lo crea
si no existe, dbexecute: ejecuta un comando SQL en la BD abierta, y dbclose: cierra el
archivo de BD abierto.
dbopen filename
Abre un archivo de BD SQLite de nombre filename. Si la BD no
existe, entonces crea una nueva vacía.
dbexecute sqlsentencia
Ejecuta la sentencia SQLite sqlsentencia sobre el archivo BD
SQLite abierto. No devuelve ningún valor, pero un error en tiempo de
ejecución atrapable ocurrirá si hubiera cualquier problema al ejecutar la
sentencia sobre la BD.
dbclose
Cierra el archivo BD SQlite corriente abierto. Este comando asegura
que todos los datos fueron escritos en el archivo BD.
Estas mismas tres sentencias pueden ser usadas para ejecutar otros comandos SQLite. El
comando INSERT INTO en el Programa 126 agrega nuevas filas de datos a las tablas. El
comando UPDATE (Programa 127) cambiará la información de una fila existente.
1 # c20_addpetsdb.kbs
2 # agregue filas a la BD
3 file$ = "mascotas.sqlite3"
4 dbopen file$
5
6 call addowner(1, "Jim", "555-3434")
7 call addpet(1, 1, "Spot", "Cat")
8 call addpet(2, 1, "Fred", "Cat")
9 call addpet(3, 1, "Elvis", "Cat")
10
11 call addowner(2, "Sue", "555-8764")
12 call addpet(4, 2, "Alfred", "Dog")
13 call addpet(5, 2, "Fido", "Cat")
14
1 # c20_updatepetsdb.kbs
2 # actualice una fila de la BD
3 dbopen "mascotas.sqlite3"
4
5 # cree y cargue datos
6 s$ = "UPDATE owner SET phonenumber = " + chr(34) +
"555-5555" + chr(34) + " where owner_id = 1;"
7 print s$
8 dbexecute s$
9 dbclose
Programa 127: Actualizar una Fila en una BD
dbopenset sqlstatement
Ejecuta un comando SELECT sobre la BD y crea un “conjunto de
registros” (“record set”) para permitir al programa leer el resultado. El
conjunto de registros puede contener 0 o más filas como fueron
extraídos por SELECT.
dbrow ó dbrow ()
Función para avanzar el resultado de la última dbopenset a la
próxima fila. Devuelve false si estamos al final de los datos
seleccionados.
Después de un comando dbopenset y antes de que pueda leer
ningún dato, Ud. debe avanzar a la primera fila usando dbrow,
dbint (column)
dbfloat (column)
dbstring (column)
Estas funciones devolverán datos de la corriente fila del conjunto de
registros. Ud. debe conocer el número de la columna numérica (basada
en cero) de los datos deseados.
dbint Devuelve el dato de la celda como un entero.
dbcloseset
Cierra y descarta los resultados del último comando dbopenset.
1 # c20_rolofile.kbs
2 # un ejemplo de BD para mantener una lista de nros. de TE
3
4 dbopen "rolofile.sqlite3"
5 call createtables()
6
7 do
8 print
9 print "rolofile - phone numbers"
10 print "1-agregar una persona"
11 print "2-listado de personas"
12 print "3-agregar No. de telefono"
13 print "4-listado de Nos. de telefonos "
14 input "0-exit >", opcion
15 print
16
17 if opcion=1 then call addperson()
60 end subroutine
61
62 subroutine addphone()
63 print "Agregar un Número de Teléfono"
64 input "person id > ", person_id$
65 person_id$ = upper(person_id$)
66 if not ispersononfile(person_id$) then
67 print "La persona no existe el el archivo"
68 else
69 input "phone number > ", phone$
70 if phone$ = "" then
71 print "Por favor, ingrese un nro. de Teléfono"
72 else
73 type$ = inputphonetype$()
74 dbexecute "INSERT INTO phone (person_id,
phone, type) values (" + quote$(person_id$) + "," +
quote$(phone$) + "," + quote$(type$) + ");"
75 print phone$ + " agregado."
76 end if
77 end if
78 end subroutine
79
80 function ispersononfile(person_id$)
81 # devuelve true/false dependiendo de si la persona está en la tabla de
personas.
82 onfile = false
83 dbopenset "select person_id from person where
person_id = " + quote$(person_id$)
84 if dbrow() then onfile = true
85 dbcloseset
86 return onfile
87 end function
88
89 subroutine listpeople()
90 dbopenset "select person_id, name from person order by
person_id"
91 while dbrow()
92 print dbstring("person_id") + " " + dbstring("name")
93 end while
94 dbcloseset
95 end subroutine
96
97 subroutine listphone()
98 input "person id to list (return for all) > ",person_id$
99 person_id$ = upper(person_id$)
100 stmt$ = "SELECT person.person_id, person.name,
phone.phone, phone.type FROM person LEFT JOIN phone
ON person.person_id = phone.person_id"
101 if person_id$ <> "" then stmt$ += " WHERE
person.person_id = " + quote$(person_id$)
102 stmt$ += " ORDER BY person.person_id"
103 dbopenset stmt$
104 while dbrow()
105 print dbstring("person_id") + " " +
dbstring("name") + " " + dbstring("phone") + " " +
dbstring("type")
106 end while
107 dbcloseset
108 end subroutine
Ejercicios:
y p z t c e l e s o x x d
e l i b a m l n a x x t b
t q x h o o e t g n e d i
a s t p s t l n e s t f n
e e a e a n i f n t t s t
r q t d s r o e b m a d r
c n p u t e p i n d b m e
i u e s c o s m t c l u s
d q b p b e u o l a e y n
b d u d o l x o l z l f i
r m o e o b s e p c w e m
o x h c r e d t b o b y r
w c g h t y j c r d s d m
column, create, dbclose, dbcloseset, dbexecute, dbfloat, dbint,
dbopen, dbopenset, dbrow, dbstring, insert, query, relationship, row,
select, sql, table, update
Conección Socket
Los sockets de flujo (de datos) TCP crean una conexión entre dos computadoras o
programas. Paquetes de información pueden ser enviados y recibidos de modo bi-
direccional sobre la conexión.
Para comenzar una conexión necesitamos que una computadora o programa actúe como
servidor (server, esperando por una llamada) y la otra como cliente (client, para que haga
la llamada). La ilustración 40 muestra gráficamente como la conexión server/cliente se
establece.
SERVER 2 CLIENT
1 # c21_simpleclient.kbs
2 # conectar al server simple y obtener el mensaje
3 #
4 input "¿Cual es la dirección IP del server simple?", addr$
5 if addr$ = "" then addr$ = "127.0.0.1"
6 #
7 NetConnect addr$, 9999
8 print NetRead
9 NetClose
Programa 131: Cliente de Red Simple
netaddress
netaddress ( )
Función que devuelve un string conteniendo el valor numérico IPv4
de la dirección de red asociada a la computadora
netlisten nro_puerto
netlisten (nro_puerto)
netlisten nro_socket, nro_puerto
netlisten (nro_socket, nro_puerto)
Abre una conexión de red (server) sobre un port específico y espera
a que se conecte otro programa (cliente). Si nro_socket no se
especifica, se usará el socket número cero (0).
netclose
netclose ( )
netclose nro_socket
netclose (nro_socket)
Cierra la conexión de red especificada (socket). Si socketnumber
no se especifica, se cerrará el socket número cero (0).
netwrite string
netwrite (string)
netwrite nro_socket, string
netwrite (nro_socket, string)
Envía un string a la conexión de red abierta especificada. Si
nro_socket no es especificado, usará el zócalo cero (0) para escribir.
netread
netread ( )
netread (nro_socket)
Lee datos de la conexión de red especificada y lo devuelve como un
string. Esta función es “bloqueante” (espera hasta que un dato es
recibido). Si nro_socket no es especificado, usará el zócalo cero (0)
para la conexión.
Chat en la Red
El siguiente ejemplo agrega una nueva función (netdata) a las declaraciones de red que ya
hemos visto. Esta nueva función permitirá a nuestros clientes de red procesar otros
eventos, como presionar teclas, y luego leer datos de la red únicamente cuando hay datos
para leer.
El programa de chat por red combina los programas de cliente y servidor en uno solo. Si
Ud. inicia la aplicación y no puede conectarse a un server, el error es capturado y el
programa entonces se convierte en un server. Este es uno de los diversos métodos
disponibles para permitir a un único programa cumplir con ambos roles.
1 # c21_chat.kbs
2 # use port 9999 para chat simple
3
4 input "Chat a la direccion (¿volver por server o host local?)", addr$
5 if addr$ = "" then addr$ = "127.0.0.1"
6 #
7 # trate de conectarse al server
8 # si no hay uno, vuélvase uno.
9 try
10 NetConnect addr$, 9999
11 catch
12 print "Arrancando server – Esperando por cliente chat"
13 NetListen 9999
14 end try
15 print "Conectado"
16
17 while true
18 # obtenga tecla apretada y envíela
19 k = key
20 if k <> 0 then
21 call show(k)
22 netwrite string(k)
23 end if
24 # obtenga tecla de la red y muéstrela
25 if NetData() then
26 k = int(NetRead())
27 call show(k)
28 end if
29 pause .01
30 end while
31 end
32
33 subroutine show(keyvalue)
34 if keyvalue=16777220 then
35 print
36 else
37 print chr(keyvalue);
38 end if
39 end subroutine
Programa 132: Chat por Red
Lo siguiente se observa cuando el usuario en el lado del cliente tipea el mensaje "HOLA
SERVER" y luego el usuario en el server responde "HOLA CLIENTE".
netdata or netdata()
netdata ( nro_scket )
Devuelve true si hay datos de red esperando a ser leídos. Esto
permite al programa continuar con las operaciones sin esperar que
arribe un nuevo paquete de datos de red.
1 # c21_battle.kbs
2 # usa port 9998 para server
3
4 spritedim 4
5 call tanksprite(0,white) # yo
6 call tanksprite(1,black) # oponente
7 call projectilesprite(2,blue) # mi tiro
8 call projectilesprite(3,red) # tiro del oponente
9
10 kspace = 32
11 kleft = 16777234
12 kright = 16777236
13 kup = 16777235
14 kdown = 16777237
15
16 dr = pi / 20 # cambio de direccion
17 dxy = 2.5 # velocidad de movimiento
18 shotdxy = 5 # velocidad del proyectil
19 port = 9998 # puerto para comunicarse
20
21 print "Tank Battle – Ud es el tanque blanco."
22 print "Su misión es disparar y matar al tanque negro. "
23 print "Use flechas para moverse y la barra espaciadora"
24 print "para disparar."
25 print
26
27 input "Es Ud. el server? (y or n)", mode$
28 if mode$ = "y" then
29 print "Ud. es el server. Esperando que un cliente se conecte."
30 NetListen port
31 else
32 input "Dirección del Server para conectarse (Intro para local host)?", addr$
33 if addr$ = "" then addr$ = "127.0.0.1"
34 NetConnect addr$, port
35 end if
36
37 # defina mi posición por defecto y envíesela a mi oponente
38 x = 100
39 y = 100
40 r=0
41 # projectil: posición dirección y visible
42 p = false
43 px = 0
44 py = 0
45 pr = 0
46 call writeposition(x,y,r,p,px,py,pr)
48
49 # actualice la pantalla
50 color green
51 rect 0, 0, graphwidth, graphheight
52 spriteshow 0
53 spriteshow 1
54 spriteplace 0, x, y, 1, r
55 while true
56 # adquiera tecla apretada y mueva el tanque en pantalla
57 k = key
58 if k <> 0 then
59 if k = kup then
60 x = ( graphwidth + x + sin(r) * dxy ) % graphwidth
61 y = ( graphheight + y - cos(r) * dxy ) % graphheight
62 end if
63 if k = kdown then
64 x = ( graphwidth + x - sin(r) * dxy ) % graphwidth
65 y = ( graphheight + y + cos(r) * dxy ) % graphheight
66 end if
67 if k = kleft then r = r - dr
68 if k = kright then r = r + dr
69 if k = kspace then
70 pr = r
71 px = x
72 py = y
73 p = true
74 spriteshow 2
75 end if
76 spriteplace 0, x, y, 1, r
77 call writeposition( x, y, r, p, px, py, pr )
78 if spritecollide( 0, 1 ) then
79 netwrite "F"
80 print "Ud. embistió al otro tanque y ambos murieron. Game Over."
81 end
82 end if
83 end if
87
84 # mueva mi proyectil (si hay uno)
85 if p then
86 px = px + sin( pr ) * shotdxy
87 py = py - cos( pr ) * shotdxy
88 spriteplace 2, px, py, 1, pr
89 if spritecollide( 1, 2 ) then
90 NetWrite "W"
91 print "Ud. mató a su oponente. Game over."
92 end
93 end if
94 if px<0 or px > graphwidth or py <0 or py> graphheight then
95 p = false
96 spritehide 2
97 end if
98 call writeposition( x, y, r, p, px, py, pr )
99 end if
100 #
101 # adquiera posición desde la red y
102 # defina las variables de ubicación para el oponente
103 # dé vuelta las coordenadas como las decodificamos
104 while NetData()
105 position$ = NetRead()
106 while position$ <> ""
107 if left(position$,1) = "W" then
108 print "Ud. está muerto - Game Over."
109 end
110 end if
111 if left(position$,1) = "F" then
112 print "Ud. fue impactado y ambos murieron-Game Over"
113 end
114 end if
115 op_x = graphwidth - unpad( ref( position$ ),3)
116 op_y = graphheight - unpad( ref( position$ ), 3)
117 op_r = pi + unpad( ref( position$ ), 5)
118 op_p = unpad( ref( position$ ), 1)
Ejercicios:
m r d t n s i p n n
j r f d o c k e e e
v v r c l r t g s t
p h k i o s d e o c
k e e w i a r k l o
t n t l e v v c c n
t e t r e t t n t n
n e t r c x g o e e
n e x p o r t m n c
n e t i r w t e n t
client, listen, netclose, netconnect, netlisten, netread, network,
netwrite, port, server, socket, tcp
1 – Descargando el programa:
Conéctese a Internet, navegue hasta el sitio http://www.basic256.org y siga el link de
descarga. Una vez que esté en la página Sourceforge del proyecto, haga click en el botón
verde "Download Now!" (Ilustración 41) para comenzar la descarga.
El proceso de descarga podrá preguntarle eventualmente que es lo que quiere hacer con el
archivo. Seleccione el botón "Save File" (Ilustración 42).
2 - Instalando
Una vez finalizada la descarga del archivo (Ilustración 43) haga click con el mouse sobre el
archivo descargado en la lista de descarga. Verá a continuación uno o dos diálogos
preguntándole si realmente desea ejecutar el archivo (Ilustración 44) (Ilustración 45).
Deberá presionar los botones “OK” o “Run” de esos diálogos.
Lea y acepte la licencia de software GNU GPL y presione "I Agree" (Acepto) (Ilustración
47). La licencia GNU GPL es una de las licencias de software "Open Source" y "Free" más
comúnmente usadas. Ud. tiene el derecho de usar, dejar de usar y modificar los programas
liberados bajo GPL. Esta licencia solo se aplica al software BASIC-256 y no al contenido de
este libro.
La Instalación está completa cuando vea la siguiente ventana (Ilustración 50). Presione
"Close" (“Cerrar”).
3 – Iniciando BASIC-256
Ud. puede ahora buscar en Start (Inicio) > All Programs (Todos los Programas) >
(Ilustración 51)
Deberá ver un ítem en el menú para BASIC-256. Desde este menú Ud. puede abrir el
programa, desinstalarlo o ver la documentación (Ilustración 52).
Black 0, 0, 0
red 255, 0, 0
darkred 128, 0, 0
green 0, 255, 0
darkgreen 0, 128, 0
blue 0, 0, 255
darkblue 0, 0, 128
clear
F - 175
F# - 185
G - 196
G# - 208
A - 220
A# - 233
B – 247
Middle C - 262
C# - 277
D - 294
D# - 311
E - 330
F - 349
F# - 370
G - 392
G# - 415
A - 440
A# - 466
B - 494
C - 523
C# - 554
D - 587
D# - 622
E - 659
F - 698
F# - 740
G - 784
G# - 831
A - 880
A# - 932
Space 32 A 65 L 76 W 87
0 48 B 66 M 77 X 88
1 49 C 67 N 78 Y 89
2 50 D 68 O 79 Z 90
3 51 E 69 P 80 ESC 16777216
4 52 F 70 Q 81 Backspace 16777219
5 53 G 71 R 82 Enter 16777220
7 55 I 73 T 84 Up Arrow 16777235
# cyan
abs dark
acos darkblue
and darkcyan
arc darkgeeen
asc darkgray
asin darkgrey
atan darkorange
black darkpurple
blue darkred
call darkyellow
catch day
ceil dbclose
changedir dbcloseset
chord dbexecute
chr dbfloat
circle dbint
clear dbnull
clg dbopen
clickb dbopenset
clickclear dbrow
clickx dbstring
clicky debuginfo
close degrees
cls dim
color dir
colour do
confirm editvisible
continue else
continuedo end
continuefor endfunction
continuewhile endif
cos endsubroutine
count endtry
countx endwhile
currentdir eof
error_arrayindex error_none
error_arrayindexmissing error_nonnumeric
error_arraysizelarge error_nosuchvariable
error_arraysizesmall error_notanumber
error_byref error_notimplemented
error_byreftype error_penwidth
error_colornumber error_permission
error_dbcolno error_polyarray
error_dbconnnumber error_polypoints
error_dbnotopen error_printernotoff
error_dbnotset error_printernoton
error_dbnotsetrow error_printeropen
error_dbopen error_putbitformat
error_dbquery error_radix
error_dbsetnumber error_radixstring
error_divzero error_rgb
error_filenotopen error_spritena
error_filenumber error_spritenumber
error_fileopen error_spriteslice
error_filereset error_strend
error_filewrite error_stringmaxlen
error_folder error_strneglen
error_fontsize error_strstart
error_fontweight exists
error_for1 exitdo
error_for2 exitfor
error_freedb exitwhile
error_freedbset exp
error_freefile explode
error_freenet explodex
error_imagefile false
error_imagesavetype fastgraphics
error_imagescale float
error_infinity floor
error_logrange font
error_netaccept for
error_netbind freedb
error_netconn freedbset
error_nethost freefile
error_netnone freenet
error_netread frombinary
error_netsock fromhex
error_netsocknumber fromoctal
error_netsockopt fromradix
error_netwrite getbrushcolor
getcolor netconnect
getpenwidth netdata
getsetting netlisten
getslice netread
global netwritenext
gosub next
goto not
graphheight offerror
graphsize onerror
graphwidth open
gray openb
green or
grey orange
hour ostype
if outputvisible
imgload pause
imgsave penwidth
implode pi
include pie
input pixel
instr plot
instrx poly
int portin
key portout
kill print
lasterror printercancel
lasterrorextra printeroff
lasterrorline printeron
lasterrormessage printerpage
left purple
length putslice
line radians
log rand
log10 read
lower readbyte
md5 readline
mid rect
minute red
month redim
mouseb ref
mousex refresh
mousey rem
msec replace
netaddress replacex
netclose reset
return tan
rgb text
right textheight
say textwidth
second then
seek throwerror
setsetting to
sin tobinary
size tohex
sound tooctal
spritecollide toradix
spritedim true
spriteh try
spritehide until
spriteload upper
spritemove version
spriteplace volume
spritepoly wavplay
spriteshow wavstop
spriteslice wavwait
spritev while
spritew white
spritex write
spritey writebyte
sqr writeline
stamp xor
step year
string yellow
system
0 ERROR_NONE
Apéndice H: Glosario
Lista de términos usados en este libro.
algoritmo (algorithm)
Un proceso paso a paso para resolver el problema
argumento (argument)
Un dato incluido en una declaración o un llamado a una función usado para pasar
información. En BASIC-256, los argumentos NO son cambiados por la declaración o la
función.
arreglo (array)
Una colección de datos, guardada en la memoria de la computadora, que es accedida o
referenciada por uno o más índices enteros. Ver también arreglo numérico, arreglo uni-
dimensional, arreglo bi-dimensional y string array.
constante (constant)
Un valor que no puede ser cambiado.
declaración (statement)
A single complete action. Statements perform something and do not return a value.
entero (integer)
Un valor numérico sin punto decimal. Típicamente tiene un rango de -2.147.483.648 a
2.147.483.647.
error de sintaxis (syntax error)
Un error con la estructura de una declaración de modo que el programa no puede ejecutar.
falso (false)
Valor booleano representando NO VERDADERO. En BASIC-256 es realmente un nombre
para representar el entero cero (0). Ver también Algebra Booleana (Boolean Algebra) y
verdadero (true).
fuente (Font)
Un estilo de dibujar letras
frecuencia (frequency)
El número de ocurrencias de un evento en un especificado período de tiempo (Ver también
hertz).
función (function)
Un tipo especial de declaración en BASIC-256 que puede tomar como entrada cero o mas
valores, hacer cálculos y devolver información a su programa.
grados (degrees)
Unidad de medida angular. Los angulos en el plano pueden ser medidos en grados entre 0
y 360. Un ángulo recto mide 90 grados. Ver también ángulo y radian.
hertz (hz)
Unidad de frecuencia en ciclos por segundo. En honor al físico alemán Heinrich Hertz. Ver
también frecuencia.
lista (list)
Una colección de valores que puede ser usado para asignar arreglos (arrays) y en algunas
declaraciones. En BASIC-256, las listas son representadas por una serie de valores
separados por coma (,) todos dentro de paréntesis ({}).
operador (operator)
Actúa sobre una o más piezas de datos para efectuar una acción.
pixel
El punto más pequeño identificable en una pantalla de computadora.
pseudocódigo (pseudocode)
Descripción de lo que un programa necesita hacer en un lenguaje natural (no de
computadora) La palabra contiene el prefijo “pseudo” que significa falso y “código” por
lenguaje de computación
punto (point)
Unidad de medida usada para el tamaño de texto. 1 punto = 1/72". Un carácter definido en
12 puntos tendrá 12/72" or 1/6" de alto.
Puerto (port)
Un número definido por software usado para crear y comunicarse con un zócalo (socket).
radian
Unidad de medida angular. Angulos en el plano pueden tener medidas en radianes
comprendidas entre 0 y 2π. Un ángulo recto mide π/2 radianes. Ver también ángulo y
grados.
radio (radius)
Distancia de un crculo a su centro. Tambien la mitad del dímetro del circulo
RGB
Acronismo por Red Green Blue (Rojo-Verde-Azul).
rótulo (label)
Un nombre asociado a un lugar específico (línea) de un programa. Usado para efectuar un
saldo con las sentencias GOTO y GOSUB.
sincrónico (synchronous)
Ocurriendo al mismo tiempo
sprite
Una imagen que es integrada en una escena gráfica.
SQL
Acrónimo para Structured Query Language (Lenguaje de Consulta Estructurado). SQL es el
lenguaje mós usado para operar datos en una base de datos relacional.
string
Una secuencia de caracteres (letras, números y símbolos). Son definidas colocándola entre
comillas (").
string array
Un conjunto o arreglo de strings.
string empty
Un string sin ningún carácter y longitud cero (0). Se representa por dos apóstrofes
(quotation marks) (""). Ver también string.
string variable
Una variable que puede ser usada para guardar valores string. Una variable string se
denota colocando un signo pesos ($) al final del nombre de la variable.
sub-string
Parte de un string
subrutina (subroutine)
Un bloque de código o porción de un programa largo que efectúa una tarea específica
independientemente del resto del programa. Una pieza de software que puede ser usada y
reusada por diferentes partes del programa.
verdadero (true)
Valor booleano representando NO FALSO. En BASIC-256 es realmente un nombre para
representar el entero uno (1). Ver también Algebra Booleana (Boolean Algebra) y falso
(false).
Unicode
Estándar moderno usado para representar caracteres y símbolos de todos los lenguajes
del mundo como números enteros.
variable (variable)
Una ubicación con nombre en la memoria de la computadora que puede ser cambiada o
alterada.
zócalo (Socket)
Un terminal por software que permite la comunicación bi-direccional (2 way) en una red