Académique Documents
Professionnel Documents
Culture Documents
http://www.basicbook.org
James M. Reneau
P.O. Box 278
Russell, Kentucky 41169-2078 USA
The work released under Creative Commons Attribution-NoncommercialShare Alike 3.0 United States License. See http://creativecommons.org for
more information.
TABLA DE CONTENIDOS
Prefacio.....................................................................................................................14
Captulo 1: Conociendo BASIC-256 Diga Hola..................................................15
La ventana de BASIC-256...............................................................................................15
Su primer programa La declaracin say (decir)........................................................17
BASIC-256 es realmente bueno con nmeros Aritmtica Simple..................................18
Otro uso para el signo + (Concatenacin).......................................................................20
rea de Salida de Texto El comando print (imprimir)..................................................21
Que es un Error de Sintaxis? (Syntax error")...............................................................21
Ejercicios:........................................................................................................................ 22
Captulo 11: Control del Teclado Usando el Teclado para hacer Cosas.......117
Obteniendo la ltima tecla presionada...........................................................................117
Ejercicios:...................................................................................................................... 123
Ejercicios:...................................................................................................................... 143
INDICE DE PROGRAMAS
Programa 1: Diga Hola.........................................................................................19
Programa 2: Diga un Nmero.................................................................................20
Programa 3: Diga la Respuesta..............................................................................22
Programa 4: Diga otra respuesta...........................................................................22
Programa 5: Diga hola a Juan................................................................................22
Programa 6: Diga Dos Monedas Ms....................................................................22
Programa 7: Imprima Hola Mundo.........................................................................23
Programa 8: Varios print en una sola lnea...........................................................23
Programa 9: Manchas Grises.................................................................................25
Programa 10: Cara con Rectngulos.....................................................................29
Programa 11: Cara sonriente con crculos...........................................................30
Programa 12: Dibuje un Tringulo.........................................................................31
Programa 13: Dibuje un Cubo................................................................................32
Programa 14: Penwidth y Contorno......................................................................33
Programa 15: Use Plot para dibujar puntos.........................................................34
Programa 16: Programa Grande Cara que Habla..............................................36
Programa 17: Reproducir tres notas individuales...............................................39
Programa 18: Lista de Sonidos..............................................................................40
Programa 19: Carga!...............................................................................................42
Programa 20: Variables Numricas simples.........................................................43
Programa 21: Asignacin de una variable............................................................43
Programa 22: Re-asignacin de una Variable......................................................44
Programa 23: Reproducir Charge! usando Variables..........................................44
2014James M. Reneau (CC BY-NC-SA 3.0 US)
Pgina 8 of 258
INDICE DE ILUSTRACIONES
Ilustracin 1: La Ventana de BASIC-256..........................................................................15
Ilustracin 2: BASIC-256 Caja de Dilogo New........................................................17
Ilustracin 3: Nombres de Colores..................................................................................23
Ilustracin 4: El Sistema de Coordenadas Cartesiano del rea de salida grfica........24
Ilustracin 5: Opcin de lneas de
Agradecimientos
Un gran muchas gracias para toda la gente que ha trabajado en el
proyecto BASIC-256 en Sourceforge. Muy especialmente, a Ian Larsen
(aka: DrBlast) por crear el lenguaje de programacin BASIC-256 y su
original visin.
Siento tambin la necesidad de agradecer a los chicos programadores del
Summer 2000 de la Escuela de Nivel Medio Russell y a Julia Moore.
Tambin un saludo a mi gente, Sergey Lupin y Joel Kahn.
Dedicatoria:
A mi esposa Nancy y mi hija Anna.
Crditos:
Algo de arte de dominio pblico de http://www.openclipart.com.
Prefacio
La primera edicin de este libro fue creada como una introduccin a la
programacin en lenguaje BASIC para estudiantes del ciclo medio y superior que
deseaban crear cdigo por sus propios medios. En el ultimo par de aos el texto ha
evolucionado para ser usado es educacin secundaria y post-secundaria.
Esta segunda edicin mantiene la mayora del material de la primera e incluye la
actualizacin de BASIC-256 para incluir Subrutinas, Funciones y un mejor manejo
de errores. Adems de actualizar el lenguaje y mejorar el texto y los programas, se
agregaron ejercicios al final de cada captulo para reforzar los conceptos discutidos
y enfrentar a nuevos retos al lector o estudiante.
Los captulos del libro pueden ser estructurados para ser usados en una variedad
de modos:
1. Una introduccin a la programacin de 9 o 19 semanas.
captulos 1, 2, 3, 4 , 5, 6, 7, 8, y 9 para el primer ciclo de 9 semanas
*
captulos 10, 11, 12, 13*, 14, 15, 16, 17 and 19* para el segundo ciclo de 9
semanas
* Captulo Opcional
** Slo seccin de Variables
Numricas.
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 Grfica (Graphics Output Area) (Ver
Ilustracin 1: La Ventana de BASIC-256 a continuacin).
Barra de Men:
La Barra de Men contiene varios y diferentes mens desplegables. Estos mens incluyen:
"FILE" (Archivos), "EDIT" (Edicin), "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 imgenes desde el programa y las
reas de salida texto y grfica.
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)
Pgina 18 of 258
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 lnea por lnea y
as, por ejemplo, buscar y encontrar errores)
El men ABOUT muestra una ventana de dilogo con informacin acerca de BASIC-256 y
la versin que est usando.
Barra de Herramientas:
Las opciones de men ms usadas estn tambin disponibles en la Barra de Herramientas.
New (Nuevo)
Open (Abrir)
Save (Guardar)
Run (Correr)
Debug (Depurar)
Step (Paso)
Stop (Parar)
Undo (Deshacer)
Redo (Rehacer)
Cut (Cortar)
Copy (Copiar)
Paste (Pegar)
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.
1 say "Hola!"
Programa 1: Diga Hola
Una vez que haya escrito el programa, use el mouse y haga clic en Run (que significa
ejecutar, correr el programa) ubicado en la Barra de Herramientas (Tools Bar).
Escuch a BASIC-256 decirle hola por los altavoces de la computadora?
say
La expresin say es usada para hacer que BASIC-256 lea una
expresin en voz alta usando los parlantes de la computadora.
1 say 123456789
Programa 2: Diga un Nmero
Despus de escribir el programa en el rea de Programa, use el mouse para hacer clic en
el botn Run de la Barra de Herramientas. Dijo BASIC-256 lo que esperaba?
nmeros
BASIC-256 le permite ingresar nmeros en formato decimal. No use
comas para separar los cientos o miles cuando ingrese nmeros
grandes. Si necesita ingresar un nmero menor que cero,
simplemente coloque el signo negativo (-) precedindolo.
Ejemplos: 1.56, 23456, -6.45 y .5
Operacin
Suma
expresin1 + expresin2
Resta
expresin1 - expresin2
Multiplicacin
expresin1 * expresin2
Divisin
expresin1 / expresin2
say 12 * (2 + 10)
1 say 5 / 2
Programa 4: Diga otra respuesta
Escuch a la computadora decir "2.5"?
+
*
/
()
Las cuatro operaciones matemticas bsicas trabajan con nmeros
para efectuar clculos. Se requiere un valor numrico a ambos lados
de estos operadores. Es posible tambin usar parntesis para
agrupar operaciones.
Ejemplo: 1 + 1, 5 * 7, 3.14 * 6 + 2, (1 + 2) * 3 y 5 - 5
+ (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 concatenacin se
har sin problemas y se obtendr un string ms largo. Si ambos
operandos son numricos, entonces se sumarn.
1 print "hola"
2 print "mundo"
Programa 7: Imprima Hola Mundo
Una vez ingresado el programa, haga clic con el mouse en Run, en la Barra de
Herramientas. En la ventana de Salida de Texto se mostrar hola en la primera lnea y
mundo en la segunda.
print expresion
print expresion;
El comando print es usado para mostrar texto y nmeros en el Area
de Salida de Texto de la ventana de BASIC-256. Cada comando print
comienza en una nueva lnea, pero Ud. puede imprimir varias cosas
en una misma lnea usando punto y coma (;) al final de la expresin.
El comando print, por defecto, avanza en el rea de texto de modo que el siguiente print es
sobre la prxima lnea. Si Ud. Coloca un ; (punto y coma) al final de la expresin a ser
impresa, se suprimir el avance de lnea, de modo que el prximo print se har, a
continuacin, en la misma lnea.
1
2
3
4
cls
print "Hola ";
print "mundo, ";
print "estoy aqu!."
cls
El comando cls limpia toda la informacin mostrada en el rea de
Salida de Texto.
Ejercicios:
z
j
r
v
e
r
r
o
r
e
t
b
n
a
g
u
w
n
s
b
r
x
g
m
o
a
h
j
n
s
a
e
k
p
n
a
i
t
m
d
r
t
y
t
p
r
i
r
t
a
c
z
g
o
u
o
i
e
y
g
a
m
c
c
i
p
i
u
b
s
q
o
n
y
d
v
a
z
b
q
n
s
s
r
e
x
t
w
c
u
i
a
l
i
s
p
t
a
d
i
n
e
s
g
n
o
l
k
a
t
r
o
h
v
i
o
n
n
c
c
c
n
f
m
i
l
e
j
r
c
q
q
n
y
p
r
m
f
n
d
f
c
p
m
o
s
l
a
p
r
n
a
g
d
i
r
c
x
z
l
x
t
a
i
f
i
n
s
u
#
rem
Las declaraciones # y rem definen comentarios.
Una declaracin 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 lnea
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 26 of
En la lnea 3 del programa puede verse la declaracin clg. Es similar a la declaracin cls
que vimos en el Captulo 1, excepto que clg limpiar el rea de Salida Grfica de la
pantalla.
clg
El comando clg borra el rea de salida grfica de modo que
tendremos un lugar limpio para visualizar nuestros dibujos.
black (0,0,0)
white (255,255,255)
red (255,0,0)
darkred (128,0,0)
green (0,255,0)
darkgreen (0,128,0)
blue (0,0,255)
darkblue (0,0,128)
cyan (0,255,255)
darkcyan (0,128,128)
purple (255,0,255)
darkpurple (128,0,128)
yellow (255,255,0)
darkyellow (128,128,0)
orange (255,102,0)
darkorange (170,51,0)
grey/gray (164,164,164)
darkgrey/darkgray (128,128,128)
Pgina 27 of
El rea de salida grfica, por defecto, es de 300 pxeles de ancho (x) por 300 pxeles de
alto (y). Un pixel es el punto ms pequeo que puede ser mostrado en su monitor. El
vrtice superior izquierdo es el origen (0,0), y el inferior derecho corresponde a (300,300).
Cada pxel puede ser representado por un par de nmeros, el primero (x) mide cun lejos
del eje X (lado superior) est, y el segundo (y) cun lejos del eje Y (lado derecho). Este
modo de marcar los puntos en el plano se conoce en matemticas como Sistema de
Coordenadas Cartesiano.
Siguiendo el anlisis del Programa 9, la lnea 5 del mismo contiene rect. Es usado para
dibujar un rectngulo en pantalla. Toma cuatro nmeros separados por comas; los 2
primeros corresponden a las coordenadas del vrtice superior izquierdo y los dos ltimos a
la del vrtice inferior derecho (ver ilustracin siguiente). Los 4 nmeros son expresados en
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 28 of
unidades de pxeles.
altura
ancho
Ilustracin 7: Rectngulo
Puede ver que el rectngulo en el programa comienza en el vrtice superior izquierdo y
cubre toda el rea de Salida Grfica.
rect x, y, ancho, altura
La declaracin rect usa el color vigente y dibuja un rectngulo en la
ventana de salida grfica. El vrtice superior izquierdo del rectngulo
es especificado por los primeros dos nmeros y su ancho y altura por
los otros dos argumentos.
La lnea 7 del programa introduce la declaracin circle para dibujar un crculo. Este toma 3
argumentos numricos, los primeros 2 corresponden a las coordenadas cartesianas de su
centro (en pxeles) y el tercero su radio (en pxeles tambin).
Ilustracin 8: Crculo
circle x, y, radius
La declaracin circle usa el color de dibujo corriente y dibuja un
crculo lleno con su centro en (x, y) y radio r especificado.
A continuacin un par de programas ejemplo que usan las nuevas declaraciones clg,
color, rect and circle. Ingrese los programas e introduzca modificaciones. Dibuje con ellos
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 29 of
una cara ceuda, una cara aliengena o una que luzca como alguien que Ud. conozca.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# c2_rectanglesmile.kbs
# dibuje una cara sonriente con rectngulos
# limpie el area grfica
clg
# dibuje la cara
color yellow
rect 0,0,299,299
# dibuje la boca
color black
rect 100,200,100,25
# ponga los ojos
color black
rect 75,75,50,50
rect 175,75,50,50
say "Hola!."
# c2_circlesmile.kbs
# cara sonriente hecha con crculos
# limpie la pantalla
clg
color white
rect 0,0,300,300
# dibuje la cara
color yellow
Pgina 30 of
11
12
13
14
15
16
17
18
19
20
21
22
circle 150,150,150
# dibuje la boca
color black
circle 150,200,70
color yellow
circle 150,150,70
# coloque los ojos
color black
circle 100,100,30
circle 200,100,30
Pgina 31 of
1
2
3
4
5
6
7
# c2_triangle.kbs
# dibuja un triangulo
clg
color black
line 150, 100, 100, 200
line 100, 200, 200, 200
line 200, 200, 150, 100
El siguiente programa es una muestra de lo que se puede hacer solo con lneas. Dibuja un
cubo 3D en la pantalla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# c2_cube.kbs
# use lineas para dibujar un cubo en 3D
clg
color black
# dibuje el cuadrado del fondo
line 150, 150, 150, 250
line 150, 250, 250, 250
line 250, 250, 250, 150
line 250, 150, 150, 150
# dibuje el cuadrado del frente
line 100, 100, 100, 200
line 100, 200, 200, 200
line 200, 200, 200, 100
line 200, 100, 100, 100
Pgina 32 of
18
19
20
21
22
# c2_shapeoutline.kbs
# dibujar una forma con contorno
clg
penwidth 7
color blue, rgb(255,128,128)
circle 100,50,44
color black
penwidth 5
line 50,50,250,250
color red
penwidth 10
line 175,100,100,175
color green, clear
penwidth 10
rect 150,175,75,75
Pgina 33 of
penwidth n
Cambia el ancho de la punta de lpiz con el que se dibuja. La punta
del lpiz representa el ancho de la lnea que est siendo dibujada y
tambin el ancho de la lnea a usar para el contorno de la forma.
clear
La palabra clear puede ser usada en una declaracin 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.
# c2_plot.kbs
# use plot para dibujar puntos
Pgina 34 of
4
5
6
7
8
9
10
11
12
clg
color red
plot 99,100
plot 100,99
plot 100,100
plot 100,101
plot 101,100
color darkgreen
plot 200,200
Salida 15: Use Plot para dibujar puntos (marcados para enfatizar su ubicacin)
plot x, y
Dibuja un punto (del tamao de 1 pixel) del color corriente en la
posicin 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 animacin gruesa y hace la cara ms divertida.
1
2
3
4
# c2_talkingface.kbs
# dibuje el fondo de cara con ojos
color yellow
Pgina 35 of
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
rect 0,0,300,300
color black
rect 75,75,50,50
rect 175,75,50,50
# borre la vieja boca
color yellow
rect 0,150,300,150
# dibuje la nueva boca
color black
rect 125,175,50,100
# diga la palabra
say "Yo"
color yellow
rect 0,150,300,150
color black
rect 100,200,100,50
say "estoy"
color yellow
rect 0,150,300,150
color black
rect 125,175,50,100
say "complacido"
color yellow
rect 0,150,300,150
color black
rect 125,200,50,50
say "que"
color yellow
rect 0,150,300,150
color black
rect 100,200,100,50
say "seas"
color yellow
rect 0,150,300,150
color black
rect 125,200,50,50
say "mi"
# dibuje toda la cara nueva con una sonrisa.
color yellow
rect 0,0,300,300
color black
circle 150,175,100
color yellow
circle 150,150,100
color black
rect 75,75,50,50
rect 175,75,50,50
Pgina 36 of
59
say "amigo"
Pgina 37 of
Ejercicios:
r
e
m
a
r
k
q
y
c
e
j
e
e
e
c
y
a
n
r
l
g
r
t
a
l
k
j
g
e
g
r
p
x
a
r
c
v
l
t
n
a
e
h
p
n
a
r
c
n
a
p
r
e
h
e
i
e
i
e
t
h
a
i
t
u
n
d
l
c
c
i
d
g
d
s
e
w
r
c
e
c
i
h
i
p
a
n
i
o
r
s
u
t
w
q
j
v
i
d
o
u
s
y
p
l
o
t
e
l
t
c
m
r
o
l
o
c
e
h
d
h
center, circle, clear, clg, color, coordinate, cyan, graphics, height, line,
penwidth, plot, radius, rectangle, remark, save, width
2.1. Modifique el Programa 11: Cara sonriente con crculos para
mostrar la cara de Mr. Yuck (abajo). Puede necesitar usar la
sentencia penwidth para aumentar el grosor de las lneas que
dibuje.
Pgina 38 of
Cto.
Menguante
Luna Llena
Cto. Creciente
Pgina 39 of
# c3_sounds.kbs
# sound = sonido
sound 233, 1000
sound 466, 500
sound 233, 1000
Pgina 40 of
Pgina 41 of
NOMBRE DE NOTA
Smbolo para
Longitud
Nota - Reposo
Dotted Whole
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
6.000
A 100
BPM
A 120
BPM
A 140
BPM
3600 ms
3000 ms
2571 ms
Pgina 42 of
Whole
4.000
2400 ms
2000 ms
1714 ms
Dotted Half
3.000
1800 ms
1500 ms
1285 ms
Half
2.000
1200 ms
1000 ms
857 ms
Dotted Quarter
1.500
900 ms
750 ms
642 ms
Quarter
1.000
600 ms
500 ms
428 ms
Dotted Eighth
0.750
450 ms
375 ms
321 ms
Eighth
0.500
300 ms
250 ms
214 ms
Dotted Sixteenth
0.375
225 ms
187 ms
160 ms
Sixteenth
0.250
150 ms
125 ms
107 ms
# c3_charge.kbs
# reproduzca carga!
sound {392, 375, 523, 375, 659, 375, 784, 250, 659, 250, 784,
say "Carga!"
250}
Variables Numricas
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 informacin en ellos. Estos
lugares son llamados variables.
Hay cuatro tipos de variables: variables numricas, variables string, variables array
numrico (numeric array variables) y variables array string (string array variables). En este
captulo aprender a usar variables numricas, las otras en captulos porteriores.
variable numrica
Una variable numrica le permite asignar un nombre a un
bloque de memoria RAM de su computadora. En su programa, Ud.
podr guardar y recuperar valores numricos (enteros o decimales)
de estas variables.
El nombre de una variable numrica debe empezar con una letra,
puede contener letras y nmeros y es sensible a maysculas y
minsculas. Ud. no puede usar palabras reservadas por el lenguaje
BASIC-256 como nombre de sus variables (Ver apndice I).
Ejemplos de nombres vlidos: a, b6, micasa, x, zoo.
Pgina 43 of
# c3_numericvariables.kbs
# uso de variables numericas
let numerador = 30
let denominador = 7
let result = numerador / denominador
print result
let a = 7
let b = a / 2 + .7
print a + b
Pgina 44 of
Declaracin Completa
Pgina 45 of
variable+= expresin
a+=9
variable -= expresin
b -= a+2
variable++
foo++
variable = variable + 1
foo = foo + 1
Variable-bar--
Variable = variable - 1
bar = bar - 1
Pgina 46 of
Ejercicios:
d
n
o
c
e
s
i
l
l
i
m
m
i
j
a
s
s
i
g
n
m
e
n
t
u
j
r
v
h
s
e
t
a
r
b
i
v
s
s
a
a
a
h
h
u
t
s
y
b
z
i
q
h
r
l
o
t
r
y
a
c
q
x
c
s
e
i
f
r
h
l
f
i
n
t
s
r
e
r
a
n
t
g
s
i
x
e
o
j
e
y
t z q y t x
b l e l z s
g k j u e x
c u t c g j
i e a h i n
l r t b k x
b n d e d t
e n e x l u
u q e r f i
e v a t c o
w h o l e b
t r a u q a
t e t o n t
Pgina 47 of
Pgina 48 of
Pseudocdigo
Pseudocdigo es la palabra extravagante que se usa para escribir y describir, paso a
paso, lo que su programa necesitar hacer. La palabra pseudocdigo viene del prefijo
griego pseudo- , que significa falso y cdigo para las lneas 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 pseudocdigo. Hay docenas de
estndares, y cada uno de ellos puede ser el adecuado para un tipo particular de problema.
En esta introduccin usaremos simples oraciones en castellano para explicar y entender
nuestro problema.
Como hara Ud. para escribir un programa para dibujar un colectivo escolar? (como el
mostrado en la Ilustracin 13).
Pgina 49 of
Ahora, dividamos cada uno de los pasos en piezas ms pequeas y escribamos nuestro
pseudocdigo:
Seleccionar color negro
Dibujar ambas ruedas.
Seleccionar el color amarillo
Dibujar el cuerpo del bus.
Dibujar el frente del bus.
Tabla 4: Bus Escolar - Pseudocdigo
Ahora que tenemos nuestro programa desarrollado, todo lo que tenemos que hacer es
escribirlo en lenguaje de programacin:
Seleccionar color negro
Dibujar ambas ruedas.
Seleccionar el color amarillo.
Dibujar el cuerpo del bus.
Dibujar el frente del bus
color black
circle 50,120,20 circle 200,120,20
color yellow
rect 50,0,200,100
rect 0,50,50,50
# c4_schoolbus.kbs
# dibuja un bus escolar
clg
# dibujar ruedas
color black
circle 50,120,20
circle 200,120,20
# dibujar el cuerpo del bus
color yellow
rect 50,0,200,100
rect 0,50,50,50
Pgina 50 of
Pgina 51 of
Diagramas de Flujo
Otra de las tcnicas 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
lgica del programa. El diagrama de flujo es uno de los mtodos ms viejos y comnmente
usados de dibujar la estructura de un programa.
Esta breve introduccin a los diagramas de flujo cubrir solo una pequea parte de lo que
puede hacerse con ellos, pero con unos pocos smbolos y conectores seremos capaces de
modelar procesos realmente complejos. Esta tcnica le ser til no solo para programar,
sino para resolver diversos problemas con los que puede encontrarse. A continuacin unos
pocos smbolos bsicos:
Smbolo
Nombre y Descripcin
Flujo: Una flecha representa el moverse desde un
smbolo o paso en el proceso a otro. Se debe seguir la
direccin de la flecha
Terminal
Proceso
Entrada
& Salida
Decisi
n
Pgina 52 of
Pgina 53 of
Pgina 54 of
Ejercicios:
z
e
y
p
x
z
a
q
f
b
g
d
m
d
q
r
f
u
l
o
n
e
s y
e w
k c
o z
i c
o w
o c
h m
i q
m h
p r o
m
t
l
i
c
o
m
e
m
r
b
b
a
u
h
s
a
d
p
s
u
l
o l
f r
a v
p g
r n
i e
x o
u p
t e
s w
e m p
t
m
o
r
r
i
u
n
d
s
r
r
r
s
p
e
t
s
q
u
b
p
t
e
r
m
i
n
a
t
o
Pgina 55 of
# c5_ilikejim.kbs
# Me gusta Ana variables string
nombre$ = "Ana"
mensaje_1$ = '"' + nombre$ + '" es mi amiga.'
mensaje_2$ = "Me gusta " + nombre$ + "."
print mensaje_1$
say mensaje_1$
print mensaje_2$
say mensaje_2$
Pgina 56 of
# c5_ilikeinput.kbs
# usando input para preguntar por un nombre
input "ingrese su nombre> ", name$
mensaje_1$ = name$ + " es mi amigo."
mensaje_2$ = "Me gusta " + name$ + "."
print mensaje_1$
say mensaje_1$
print mensaje_2$
say mensaje_2$
"prompt", variablestring$
"prompt", variablenumerica
variablestring$
variablenumerica
Pgina 57 of
# c5_mathwiz.kbs
# muestre varias operaciones matematicas
input "a? ", a
input "b? ", b
print a + "+" + b + "=" + (a+b)
print a + "-" + b + "=" + (a-b)
print b + "-" + a + "=" + (b-a)
print a + "*" + b + "=" + (a*b)
print a + "/" + b + "=" + (a/b)
print b + "/" + a + "=" + (b/a)
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 aos tu edad ser de " + (age+8) + " aos. Wow, que
nmero!"
10 print saludo$
11 say saludo$
Programa 29: Nombre y Edad
Cual es su nombre?Jose
Cual es su edad?13
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 58 of
Pgina 59 of
Pgina 60 of
Ejercicios:
e
p
y
q
q
t
a
h
p
y
d
l
r
s
j
s
x
l
w
v
l
e
b
o
t
i
f
f
r
c
e
a
f
a
m
r
n
y
n
l
p
k
b
a
i
p
i
p
i
d
g
x
x
h
u
r
t
n
u
z
a
l
p
r
i
l
a
y
g
t
g
k
e
f
v
w
t
v
x
w
j
o
z
l
k
r
g
q
z
v
n
g
i
s
r
a
l
l
o
d
Pgina 61 of
true
false
Las constantes booleanas true y false pueden ser usadas en
cualquier expresin numrica o lgica, pero son usualmente el
resultado de una comparacin o un operador lgico. En realidad, la
constante true es guardada como un nmero 1 y la constante false
como un nmero 0.
Operadores de Comparacin
Previamente, hemos discutido los operadores aritmticos bsicos. Ahora es tiempo de
mirar algunos operadores adicionales. En un programa, a menudo necesitamos comparar
dos valores para decidir qu hacer. Un operador comparacin trabaja con dos valores y
devuelve true o false basado en el resultado de la comparacin
Operador Operacin
<
Menor que
expresin 1 < expresin 2
Devuelve true si la expresin 1 es menor que la expresin 2.
Caso contrario devuelve false.
<=
>
Mayor que
expresin 1 > expresin 2
Devuelve true si la expresin 1 es mayor que la expresin 2.
Caso contrario devuelve false
>=
Pgina 62 of
<>
Igual
expresin 1 = expresin 2
Devuelve true si la expresin 1 es igual a la expresin 2.
Caso contrario devuelve false
No Igual
expresin 1 <> expresin 2
Devuelve true si la expresin 1 no es igual a la expresin 2,.
Caso contrario devuelve false
true
false
< <= > >= = <>
Las seis operaciones de comparacin son :
Menor (<), menor o igual (<=), mayor (>), mayor o igual (>=), igual (=),
y no igual (<>).
Son usadas para comparar nmeros y cadenas (strings). Las strings
son comparadas alfabticamente de izquierda a derecha. Ud. puede
tambin usar parntesis para agrupar operaciones.
# c6_compareages.kbs
# compare dos edades
input "Cual es su edad? ", edad_mia
input "Cual es la edad de su amigo? ", edad_amigo
print "Usted es ";
if edad_mia < edad_amigo then print "menor que";
if edad_mia = edad_amigo then print "de la misma edad que";
if edad_mia > edad_amigo then print "mayor que";
print " su amigo."
Pgina 63 of
Pgina 64 of
rand
Cuando se usa rand en una expresin, ste devuelve un nmero
aleatorio. El nmero devuelto se encontrar siempre en el intervalo 0 a
1, pero nunca ser 1 (0nmero<1).
A menudo Ud. querr generar un nmero 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 funcin int remueve la parte decimal de un nmero, y devuelve
solamente la parte entera. No efecta ningn redondeo.
int tambin intentar convertir un string en un nmero entero. Si el
string no contiene un nmero, 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
2
3
4
5
# c6_coinflip.kbs
moneda = rand
if moneda < .5 then print "Cara."
if moneda >= .5 then print "Cruz."
Operadores Lgicos
A veces, es necesario juntar varias comparaciones simples. Esto puede hacerse con los
cuatro operadores lgicos: and, or, xor, y not (en castellano: y, , o excluyente y no). Los
operadores lgicos trabajan de manera muy similar a como lo hacen las conjunciones en el
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 65 of
Operacin
AND
And Lgico
expresin1 AND expresin2
Si ambas, expresin1 y expresin2 son verdaderas (true), devuelve true
Caso contrario, devuelve false (falso)
expresin1
AND
expresin2
OR
TRUE
FALSE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
Or Lgico
expresin1 OR expresin2
Si cualquiera, expresin1 o expresin2 es verdadera, devuelve true.
Caso contrario devuelve false.
expresin1
OR
expresin 2
XOR
TRUE
FALSE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
Or Lgico Exclusivo
expresin1 XOR expresin2
Si solo una de las dos expresiones es verdadera, devuelve true. Caso
contrario, devuelve false. El operador XOR trabaja como a menudo lo hace
"or" en el lenguaje: Ud. puede degustar la torta xor comrsela
expresin1
XOR
expresin 2
NOT
TRUE
FALSE
TRUE
FALSE
TRUE
FALSE
TRUE
FALSE
TRUE
FALSE
FALSE
TRUE
Pgina 66 of
and
or
xor
not
if condicin then
declaracion(es) a ejecutar cuando es true
end if
La declaracin if / end if le permite crear un bloque de cdigo a
ejecutar cuando la condicin es verdadera (true). Es una buena
prctica indentar (usar sangras) las lneas de cdigo dentro del bloque
if/endif para mejorar la legibilidad del programa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# c6_dado.kbs
# Tirar 2 dados (die) de 6 caras cada uno
die1 = int(rand * 6) + 1
die2 = int(rand * 6) + 1
total = die1 + die2
print "dado 1 = " + die1
print "dado 2 = " + die2
mensaje$ = "Ud. tir " + total + "."
if total = 2 then
mensaje$ += " Ojos de Serpiente."
end if
if total = 12 then
mensaje$ += " Una docena."
end if
if die1 = die2 then
mensaje$ += " Doblete, tire nuevamente!"
end if
print mensaje$
say mensaje$
Pgina 67 of
dado 1 = 6
dado 2 = 6
Ud. tir 12. Una docena. Doblete, tire nuevamente!
Salida 33: Tirando dados
# c6_coinflip2.kbs
# tirar moneda con else
coin = rand
if coin < .5 then
print "Cara."
say "Cara."
else
print "Cruz."
say "Cruz."
end if
Decisiones Anidadas
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 68 of
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 cmo trabaja en prximos
captulos.
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 despus de dibujar 3 puntos
8
margin = (300 - (3 * hw)) / 4
9
# z1 posicin x e y de la parte superior de la fila de arriba y la columna
de puntos
10
z1 = margin
11
# z2 posicin x e y de la parte superior de la fila y la columna del medio
de puntos
12
z2 = z1 + hw + margin
13
# z3 posicin 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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 69 of
34
35
36
Pgina 70 of
Ejercicios:
b
i
e
r
a
p
m
o
c
w
t
o
d
n
a
n
o
t
i
f
t
r
o
r
e
t
a
e
r
g
h
w
u
l
u
l
a
u
q
e
e
l
l
e
e
n
d
i
f
e
n
f
d
w
t
a
s
h
f
s
m
o
d
n
a
r
n
l
s
l
r
r
o
t
a
r
e
p
o
a
n
z
d
j
r
o
p
t
h
f
s
e
s
l
e
o
l
e
s
s
and, boolean, compare, else, endif, equal, false, greater, if, less, not,
operator, or, random, then, true
Pgina 71 of
El Loop FOR
El loop (bucle) ms comn es el for. El loop for ejecuta repetidamente un bloque de
declaraciones un especificado nmero de veces, y lleva la cuenta de las veces que lo
ejecut. La cuenta puede comenzar con cualquier nmero, y puede cambiar con cualquier
incremento. El Programa 36 muestra una declaracin for simple usada para decir los
nmeros 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: Declaracin for
1
2
3
4
5
6
7
8
9
10
Salida 36: Declaracin 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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 72 of
# c7_moire.kbs
# dibuje un patrn moire
clg
color black
for t = 1 to 300 step 3
line 0,0,300,t
line 0,0,t,300
next t
Pgina 73 of
La sentencia for puede tambir ser usada para contar hacia atrs. Para hacer esto
simplemente tenemos que usar un incremento (step) negativo1
2
3
4
5
6
# c7_stepneg1.kbs
for t = 10 to 0 step -1
print t
pause 1.0
next t
# c7_dountil.kbs
do
input "Ingrese un nmero entre 1 y 10? ",n
until n>=1 and n<=10
print "Ud. ingres " + n + " y detuvo el loop"
Pgina 74 of
declaracion(es)
until condicion
Ejecute el bloque de declaraciones mientras la condicin sea
falsa. Como la condicin se verifica al final del loop, la/las
declaracin(es) sern ejecutadas al menos una vez.
# c7_whilefor.kbs
Pgina 75 of
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.
# maquina de sumar
# c7_exitwhile.kbs
total = 0
while true
input "Ingrese un valor (-999 para salir) > ", v
if v = -999 then exit while
total = total + v
end while
print "La suma de lo ingresado es " + total
>
>
>
>
>
34
-34
234
44
-999
Pgina 76 of
exit do
exit for
exit while
Salta fuera del loop corriente salteando el resto de cdigo en el loop.
continue do
continue for
continue while
No ejecute el resto de cdigo en este loop, pero contine con el loop
normalmente.
Grficos Acelerados
Cuando necesitamos ejecutar muchos grficos rpidamente, como en una animacin o un
juego, BASIC-256 ofrece un sistema grfico rpido. Este modo se habilita con la sentencia
fastgraphics (graficosrapidos). Una vez que el modo grfico rpido es habilitado, la salida
grfica se actualizar solo cuando Ud. ejecute la sentencia refresh (refrescar).
fastgraphics refresh
Inicia el modo grfico rpido. 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 grfico estndar (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
Pgina 77 of
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# c7_bouncingball.kbs
fastgraphics
clg
# posicin inicial de la pelota
x = rand * 300
y = rand * 300
# size of ball
r = 10
# velocidad en direcciones x e y
dx = rand * r + 2
dy = rand * r + 2
color green
rect 0,0,300,300
while true
# borre la pelota vieja
color white
circle x,y,r
# calcule la nueva posicion
x = x + dx
y = y + dy
Pgina 78 of
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Pgina 79 of
Ejercicios:
f
f
t
i
x
e
i
t
g
h
x
x
l
a
n
a
d
x
g
x
s
w
n
o
g
w
s
k
r
o
f
e
d
o
s
m
b
t
n
t
k
u
r
n
i
a
d
i
w
b
v
c
g
f
y
t
o
e
z
e
p
q
h
v
e
r
i
g
n
d
u
h
e
l
p
r
w
d
a
d
e
n
u
d
t
i
h
o
n
e
w
p
i
z
d
g
s
t
b
o
o
h
l
t
h
m
w
m
w
n
c
e
i
l
n
i
p
i
t
o
i
u
f
l
l
o
l
w
h
g
c
v
i
i
e
l
c
i
c
k
a
w
d
s
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 nmero en ese rango. Calcule el factorial (n!)
del nmero ingresado usando un loop for y mustre 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 nmeros 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
Pgina 80 of
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
Pgina 81 of
# c8_graphichello.kbs
# dibujando texto
clg
color red
font "Tahoma",33,100
text 100,100,"Hello."
font "Impact",33,50
text 100,150,"Hello."
font "Courier New",33,50
text 100,250,"Hello."
Pgina 82 of
Descripcin
font_name
size_in_point
weight
# c8_resizegraphics.kbs
# cambiar el tamao de la ventana grafica
graphsize 500,500
xcenter = graphwidth/2
ycenter = graphheight/2
Pgina 83 of
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 + ")"
Programa 47: Redefiniendo el tamao del rea de salida grfica
graphwidth o graphwidth()
graphheight o graphheight()
Funciones que devuelven el ancho y alto del rea de salida grfica,
para que pueda usar esa informacin en su programa.
Pgina 84 of
(125,15
0)
(100,15
0)
(125,20
0)
(175,15
0)
(200,15
0)
(175,20
0)
# c8_bigredarrow.kbs
clg
color red
poly {150, 100, 200, 150, 175, 150, 175, 200, 125, 200, 125, 150, 100,
Pgina 85 of
Estampando un Polgono
La sentencia poly nos permite colocar un polgono en pantalla en una posicin especfica,
pero puede resultar difcil moverlo y/o ajustar su tamao. Estos problemas son resueltos
por la sentencia stamp (sello). Esta sentencia toma una definicin de polgono y nos
permite poner el polgono en cualquier posicin especificada en la pantalla.
Opcionalmente, nos permite cambiar la escala (tamao) del polgono y/o rotarlo.
Dibujemos un tringulo equiltero (los tres lados iguales) en un trozo de papel. Pongamos
el punto (0, 0) en su vrtice superior y hacemos cada lado de 10 unidades de largo (ver
Ilustracin 19).
(0,
0)
(-5,
8.6)
Ilustracin 19: Tringulo Equiltero
(5,
8.6)
# c8_stamptriangle.kbs
# use un sello para dibujar muchos tringulos
clg
color black
for x = 25 to 200 step 25
for y = 25 to 200 step 25
stamp x, y, {0, 0, 5, 8.6, -5, 8.6}
next y
next x
Pgina 86 of
Pgina 87 of
Veamos otro ejemplo de uso de stamp. El Programa 50 usa el mismo tringulo que el
programa anterior, pero coloca 100 de ellos en posiciones al azar, con escala al azar y
rotados tambin al azar.
1
2
# c8_stamptriangle2.kbs
# stamp triangulos con tamao, rotacin y posicin al azar
4
5
6
7
8
9
10
11
12
clg
color black
for t = 1 to 100
x = rand * graphwidth
y = rand * graphheight
s = rand * 7
# scale hasta 7 veces + grande
r = rand * 2 * pi
# rotar hasta 2pi (360 grados)
stamp x, y, s, r, {0, 0, 5, 8.6, -5, 8.6}
next t
pi
La constante pi () puede ser usada en expresiones de modo que
Ud. No tenga que recordar su valor (aprox. 3.14159).
Pgina 88 of
total de luz). Si los 3 son colocados a su mximo valor posible de 255, tendremos Blanco.
1
2
3
4
5
6
7
8
9
10
11
12
13
# c8_512colors.kbs
# show a few of the 16 million colors
graphsize 256, 256
clg
for r = 0 to 255 step 32
for g = 0 to 255 step 32
for b = 0 to 255 step 32
color rgb(r,g,b)
rect b/8+g, r, 4, 32
next b
next g
next r
# c8_stamptriangle3.kbs
# stamp triangulos de color, tamao y rotacin al azar
clg
penwidth 3
Pgina 89 of
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 lpiz 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 Tringulos al azar de colores al azar.
# c8_transparent.kbs
# mostrar la transparencia en los colores.
clg
color rgb(255,0,0,127)
circle 100,100,100
color rgb(0,255,0,127)
circle 200,100,100
Pgina 90 of
9
10
11
12
13
color rgb(0,0,255,127)
circle 100,200,100
color rgb(0,0,0,127)
circle 200,200,100
# c8_stamptriangle4.kbs
# stamp randomly colored, sized and rotated triangles
clg
penwidth 3
for t = 1 to 100
x = rand * graphwidth
y = rand * graphheight
s = rand * 7
# scale hasta 7 veces mayor
r = rand * 2 * pi # rotacion hasta 2pi
rpen = rand * 256 # obtenga la parte RGB de un color de lpiz al azar
gpen = rand * 256
bpen = rand * 256
apen = rand * 256
rbrush = rand * 256 # color de llenado al azar
gbrush = rand * 256
bbrush = rand * 256
abrush = rand * 256
color rgb(rpen, gpen, bpen, apen), rgb(rbrush, gbrush, bbrush, abrush)
stamp x, y, s, r, {0, 0, 5, 8.6, -5, 8.6}
next t
Pgina 91 of
(0,
0)
(-5,
20)
(5,
20)
(0,
25)
Ilustracin 21: Programa Grande: Una Flor para Ud. Stamp de un ptalo.
1
2
3
4
5
6
7
# c8_aflowerforyou.kbs
# use stamps para dibujar una flor
clg
color green
rect 148,150,4,150
Pgina 92 of
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
color rgb(255,128,128)
for r = 0 to 2*pi step pi/4
stamp graphwidth/2, graphheight/2, 2, r, {0, 0, 5, 20, 0, 25, -5, 20}
next r
color rgb(128,128,255)
for r = 0 to 2*pi step pi/5
stamp graphwidth/2, graphheight/2, 1, r, {0, 0, 5, 20, 0, 25, -5, 20}
next r
message$ = "A flower for you." # (Una flor para ti.)
color darkyellow
font "Tahoma", 14, 50
text 10, 10, message$
say message$
Pgina 93 of
Ejercicios:
t
k
v
b
a
p
a
e
p
l
g
s
n
c
g
h
s
t
o
m
w
r
r
i
e
r
p
d
e
e
a
i
a
u
a
p
r
l
r
x
m
t
e
p
n
o
p
o
a
s
t
a
s
f
h
r
g
t
h
l
p
e
r
r
d
h
o
r
g
d
w
y
s
u
z
x
e
i
a
n
e
e
i
g
n
l
a
i
f
p
a
r
t
u
d
o
a
b
g
t
h
p
f
n
q
u
t
n
r
h
c
i
g
r
e
e
n
j
h
c
t
e
c
f
w
i
t
h
g
i
e
w
j
s
g
r
a
p
h
s
i
z
e
f
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.
Pgina 94 of
(0, -1)
(-0.886,
-0.5)
(0.886,
-0.5)
(-0.886,
0.5)
(0.886,
0.5)
(0,
1)
8.2. Use la sentencia color con un pincel claro y una sentencia poly
para dibujar un hexgono en el centro de la pantalla grfica, con
cada lado de 100 pxeles de longitud.
8.3. Reescriba el programa anterior (8.2) usando la sentencia stamp.
Use la caracterstica de escala de stamp de modo que pueda
dibujar un hexgono de cualquier tamao cambiando solo un
nmero.
8.4. Ponga la sentencia stamp del programa (8.3) dentro de un loop
for y dibuje una serie de hexgonos anidados cambiando la
escala de uno al siguiente. Experimente con el argumento step y
con rotar el hexgono al mismo tiempo.
Pgina 95 of
Funciones
Una funcin es un pequeo programa dentro de uno de mayor tamao que hace algo muy
especfico. Ud puede invocar una funcin 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
Ilustracin 22: Diagrama de Bloques de una Funcin
Function nombredefuncion ( argumento(s) )
Declaracin(es)
End Function
Function nombredefuncion$ ( argumentos(s) )
Declaracin(es)
End Function
La declaracin Function (Funcin) crea un nuevo block de cdigo y
le asocia al mismo un nombre nico. Se recomienda que no nombre
a su funcin con el mismo nombre de una variable en su programa;
esto causar confusin.
Dentro de los parntesis requeridos Ud. puede definir una lista de
variables que recibirn valores en la parte del programa principal
desde donde se llama a la funcin. Estas variables pertenecen a la
funcin y no estn disponibles para usar en el programa que llama a
la funcin.
Una definicin de funcin debe ser cerrada o terminada por una
sentencia End Function (Fin de Funcin). Esto le dice a la
computadora que la definicin de la funcin termina ah.
El valor a ser devuelto por una funcin puede ser definido de dos
maneras: 1) usando la sentencia return (devolver) con el valor a
continuacin; 2) definiendo el nombre de la funcin al valor dentro
de la funcin que se desea devolver.
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 96 of
Return valor
Ejecute la sentencia return dentro de una funcin para devolver un
valor y transferir el control del programa nuevamente al cdigo
desde donde se llam a la funcin.
end
Terminar el programa (fin).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# c9_minimum.kbs
# funcin para encontrar el minimo
input "Ingrese un numero ", a
input "Ingrese un segundo nmero ", b
print "El menor de los nmeros es ";
print minimo(a,b)
end
function minimo(x,y)
# devuelve el menor de dos nmeros (x,y) pasados por argumento
if x<y then return x
return y
end function
# c9_gameroller.kbs
# Juego de Dados
print "Tirador de Dados"
s = get ("Caras del dado",6)
n = get ("Numero de dados", 2)
total = 0
for x = 1 to n
d = die(s)
print d
Pgina 97 of
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
total = total + d
next x
print "Total = "+ total
end
function get (message$, default)
# lea un numero de pantalla
# si ingresaron cero tome el valor por defecto
input message$ + " (default " + default + ")? ", n
if n = 0 then n = default
return n
end function
function die(caras)
# tire un dado y devuelva el valor de la cara
return int(rand*caras)+1
end function
# c9_repeatstring.kbs
# funcion string simple haga copias
a$ = "ja"
b$ = repeat$(a$,20)
print a$
print b$
end
function repeat$(w$,n)
a$ = ""
for t = 1 to n
a$ += w$
next t
return a$
Pgina 98 of
16
end function
Subrutinas
Al igual que las funciones, una subrutina es un programa pequeo que efecta algo bien
especfico. Las subrutinas permiten que un bloque de cdigo 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 cmo 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.
Subroutine nombresubroutina( argumento(s) )
declaraciones
End Subroutine
La sentencia subroutine (subrutina) crea un bloque de
declaraciones de programa y asigna a ese bloque un nombre nico.
Se recomienda no usar como nombre de una subrutina el mismo
nombre que el de una variable en el programa porque puede
generar confusin.
Entre los parntesis requeridos, es posible definir una lista de
variables que recibir valores de la parte del programa que llama a
la subrutina. Estas variables son locales a la subrutina y no estn
directamente disponibles para el programa que la llama.
La definicin de una subrutina debe terminar con la sentencia End
Subroutine (Fin de Subrutina)
Pgina 99 of
Return
Ejecute la sentencia return dentro de una subrutina para devolver el
control del programa nuevamente al cdigo desde donde se la llam.
Esta versin de return no incluye un valor de retorno (como en el
caso de las funciones) dado que una subrutina no devuelve un valor.
Pgina 100 of
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# c9_subroutineclock.kbs
# muestre un reloj digital en pantalla
fastgraphics
font "Tahoma", 20, 100
color blue
rect 0, 0, 300, 300
color yellow
text 0, 0, "My Clock."
while true
call displaytime()
pause 1.0
end while
end
subroutine displaytime()
color blue
rect 100, 100, 200, 100
color yellow
text 100, 100, hour + ":" + minute + ":" + second
refresh
end subroutine
Pgina 101 of
hour o hour()
[hora]
minute o minute() [minuto]
second o second() [segundo]
day o day()
[da]
month o month() [mes]
year o year()
[ao]
Las funciones year, month, day, hour, minute y second
devuelven los componentes de un sistema de reloj. Ellas le permiten a
su programa saber los datos completos de hora y fecha.
year
month
day
hour
minute
second
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()
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 102 of
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
# c9_gamerollerinclude.kbs
# Tirador de Dados
include "e2_c9_function_dado.kbs"
include "e2_c9_inputnumberfunction.kbs"
print "die roller"
s = inputnumber("caras del dado ",6)
n = inputnumber("numero de dados ", 2)
total = 0
Pgina 103 of
11
12
13
14
15
16
17
for x = 1 to n
d = dado(s)
print d
total = total + d
next x
print "total "+ total
end
# c9_function_dado.kbs
# funcion para tirar un dado de N caras
function dado (caras)
# tire un dado y devuelva a caras
return int(rand*caras)+1
end function
# c9_inputnumberfunction.kbs
function inputnumber (prompt$, default)
# lea un numero de pantalla
# si ingresaron cero tome el valor por defecto
input prompt$ + " (default " + default + ") ?", n
if n = 0 then n = default
return n
end function
# c9_addingmachine.kbs
# una linda maquina de sumar
include "e2_c9_inputnumberfunction.kbs"
print "Maquina de Sumar"
print "Presione STOP para terminar"
total = 0
while true
a = inputnumber("+ ",0)
total = total + a
print total
Pgina 104 of
13
14
end while
end
Pgina 105 of
label:
Un label (rtulo) le permite dar un nombre a un lugar en su
programa de modo que pueda saltar directamente a esa ubicacin.
Es posible tener mltiples 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 lnea que no tenga ninguna otra declaracin, debe comenzar con
una letra, pudiendo contener letras y nmeros y es sensible a
maysculas y minsculas.
No es permitido usar palabras reservadas por BASIC-256 (ver
Apndice I) como nombre de un label, as como tampoco nombres de
funciones o subrutinas.
Ejemplos de nombres de labels vlidos: far999:, About:, aqui08:.
goto label
La sentencia goto causa que la ejecucin salte a la sentencia
inmediatamente siguiente a la lnea label.
Las subrutinas y funciones nos permiten reusar bloques de cdigo. La sentencia gosub
tambin le permite al programador reusar cdigo. Las variables en un block gosub son
globales, esto es, son vlidas en todo lugar del programa.
El Programa 66 muestra un ejemplo de una subrutina que es llamada tres veces.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# c9_gosub.kbs
# un uso de gosub simple
x = 10
for t = 1 to 3
print "x igual a: " + x
gosub muestralinea
next t
end
muestralinea:
print "------------------"
x=x*2
return
Pgina 106 of
gosub label
La sentencia gosub causa que la ejecucin salte a la subrutina
definida por el label.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# c9_roll2dice2.kbs
# tirar dos dados en modo grfico
include "e2_c9_diefunction.kbs"
clg
total = 0
roll = die(6)
total = total + roll
call dibujedado(30,30, roll)
roll = die(6)
total = total + roll
call dibujedado(130,130, roll)
print "Ud. tir " + total + "."
end
subroutine dibujedado(x,y,n)
# defina x, y para el vrtice superior izquierdo y
# n para el numero de puntos
# dibuje dado de 70x70 pixeles con puntos de 10x10 pixels
color black
rect x,y,70,70
color white
# fila superior
if n <> 1 then rect x + 10, y + 10, 10, 10
if n = 6 then rect x + 30, y + 10, 10, 10
if n >= 4 and n <= 6 then rect x + 50, y + 10, 10, 10
# mitad
Pgina 107 of
31
32
33
34
35
36
Pgina 108 of
Ejercicios:
g
k
u
l
k
g
o
s
u
b
e
h
o
x
i
n
c
l
u
d
e
m
t
o
t
a
d
h
l
e
b
a
l
z
u
u
o
w
r
r
e
t
u
r
n
j
n
r
d
r
x
g
p
a
l
l
a
c
i
s
e
n
i
t
u
o
r
b
u
s
m
o
j
x
o
z
j
m
h
f
i
l
e
w
j
d
p
c
d
n
e
r
a
e
y
w
v
s
i
s
e
h
t
n
e
r
a
p
e
q
d
c
p
s
v
h
t
n
o
m
q
a
r
e
t
a
n
i
m
r
e
t
y
n
o
i
t
c
n
u
f
n
b
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 frmula de la recta que pasa por ellos, en
formato: y=mx+n
Escriba una funcin que devuelva la pendiente (m), que puede
calcularse con la ecuacin:
(y1 y2) / (x1x2)
9.3. En matemticas, el trmino factorial de un nmero se define
como el producto de nmeros consecutivos y se nota como el
nmero seguido de un signo de admiracin (!). El smbolo n!
significa:
n! = n * (n-1) * (n-2) * * 4 * 3 * 2 * 1
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 109 of
Pgina 110 of
Modo Seguimiento
En modo seguimiento, hay tres funciones numricas (mousex, mousey y mouseb) que
devuelven las coordenadas del puntero del mouse sobre el rea de salida grfica. Si el
puntero del mouse no est en la ventana grfica, sus movimientos no sern registrados
(devolvern la ltima posicin del puntero en la ventana grfica).
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
17
18
19
20
# c10_mousetrack.kbs
# Siguiendo el Mouse con un circulo
print "Mueva el mouse en la ventana grfica."
print "Presione el boton Izquierdo para salir."
fastgraphics
# siga ejecutando hasta que el usuario presione el botn izq.
while mouseb <> 1
# limpie la pantalla
color white
rect 0, 0, graphwidth, graphheight
# dibuje un Nuevo circulo
color red
circle mousex, mousey, 10
refresh
end while
print "Listo."
end
Pgina 111 of
mousex or mousex()
mousey or mousey()
mouseb or mouseb()
Estas tres funciones devuelven la ubicacin corriente del puntero del
mouse en el rea grfica. Cualquier movimiento del mouse fuera del
rea grfica no ser registrado, pero se devolver la ltima posicin
conocida dentro de dicha rea.
mousex
mousey
mouseb
Modo Click
El segundo modo de controlar el mouse es llamado modo "Click". En modo click, la
posicin del mouse y el botn (o combinacin de botones) son guardados cuando ocurre
un click. Una vez que el click es procesado por el programa, la instruccin clickclear puede
ser ejecutada para reiniciar el click, de modo que prximo click pueda ser guardado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# c10_mouseclick.kbs
# X marca el punto en donde se hizo el click
print "Mueva el mouse en la ventana grfica."
print "Presione botn izquierdo para marcar su punto "
print "Presions botn derecho para salir."
clg
clickclear
while clickb <> 2
# limpie ltimo click y espere a que se presione un botn
clickclear
while clickb = 0
pause .01
end while
#
Pgina 112 of
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
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).
Pgina 113 of
Pgina 114 of
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# c10_colorchooser.kbs
fastgraphics
print "Selector de Color Encuentre uno"
print "Click & arrastre los deslizadores rojo, verde y azul"
# variables para guardar los componentes de color
r = 128
g = 128
b = 128
call display(r,g,b)
while true
# espere por un click
while mouseb = 0
pause .01
end while
# cambie color con deslizadores
# deslizador rojo y rango es 0 >= red < 75
if mousey < 75 then
r = mousex
if r > 255 then r = 255
end if
# deslizador verde y rango es 75 >= red < 150
if mousey >= 75 and mousey < 150 then
g = mousex
if g > 255 then g = 255
end if
# deslizador azul y rango es 150 >= red < 225
if mousey >= 150 and mousey < 225 then
b = mousex
if b > 255 then b = 255
end if
call display(r,g,b)
end while
end
subroutine colorline(r,g,b,x,y)
# dibuje parte de la barra de color
# el color r,g,b de x,y a x,y+37
color rgb(r, g, b)
line x, y, x, y+37
end subroutine
Pgina 115 of
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
subroutine redsliderbar(r,g,b)
# dibuje la barra roja desde 0,0 a 255,74
font "Tahoma", 30, 100
color rgb(255, 0, 0)
text 260, 10, "r"
for t = 0 to 255
# rojo y tonos rojos
call colorline(t, 0, 0, t, 0)
call colorline(t, g, b, t, 38)
next t
color black
rect r-1, 0, 3, 75
end subroutine
subroutine greensliderbar(r,g,b)
# dibuje la barra verde desde 0,75 a 255,149
font "Tahoma", 30, 100
color rgb(0, 255, 0)
text 260, 85, "g"
for t = 0 to 255
# verde y tonos verdes
call colorline(0, t, 0, t, 75)
call colorline(r, t, b, t, 113)
next t
# slider
color black
rect g-1, 75, 3, 75
end subroutine
subroutine bluesliderbar(r,g,b)
# dibuje la barra azul desde 0,150 a 255,224
font "Tahoma", 30, 100
color rgb(0, 0, 255)
text 260, 160, "b"
for t = 0 to 255
# azul y tonos azules
call colorline(0, 0, t, t, 150)
call colorline(r, g, t, t, 188)
next t
# deslizador
color black
rect b-1, 150, 3, 75
end subroutine
subroutine display(r, g, b)
clg
call redsliderbar(r,g,b)
Pgina 116 of
93
94
95
96
97
98
99
100
101
102
call greensliderbar(r,g,b)
call bluesliderbar(r,g,b)
# dibuje muestra
color black
font "Tahoma", 13, 100
text 5, 235, "(" + r + "," + g + "," + b + ")"
color rgb(r,g,b)
rect 151,226,150,75
refresh
end subroutine
Pgina 117 of
Ejercicios:
r
j
n
b
k
c
i
l
c
c
f
a
c
e
n
t
e
r
j
x
m
a
e
x
z
m
z
p
i
l
t
o
y
l
m
o
u
s
e
x
x
h
u
e
c
r
n
g
h
m
v
k
t
s
s
k
i
s
w
f
t
s
c
h
e
u
c
g
l
z
x
f
l
i
w
b
o
i
h
a
n
o
e
y
l
k
g
m
l
t
j
u
c
l
i
c
k
y
m
c
Pgina 118 of
Pgina 119 of
# c11_readkey.kbs
print "Presione una tecla - Q para salir."
do
k = key
if k <> 0 then
if k >=32 and k <= 127 then
print chr(k) + "=";
end if
print k
end if
until k = asc("Q")
end
Pgina 120 of
Unicode
El estndar Unicode fue creado para asignar valores numricos a
letras y caracteres de todos los sistemas de escritura usados en
todo el mundo. Hay ms de 107.000 caracteres diferentes definidos
en la versin 5.0 del estndar Unicode. Ver: http://www.unicode.org
asc(expresin)
La funcin asc devuelve un nmero entero representando el valor
Unicode del primer caracter del string expresin.
chr(entero)
La funcin chr devuelve un string conteniendo un solo caracter con
el valor Unicode del argumento entero.
Otro ejemplo de un programa de teclado podra ser uno para mostrar una letra y tomar el
tiempo que le insume al usuario presionar la tecla correspondiente. Este programa tambin
introduce la sentencia msec que devuelve la cantidad de milisegundos (1/1000 de
segundo) transcurrido desde que el programa comenz a ejecutarse.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# c11_msec.kbs
# obtenga el cdigo para un carcter al azar entre A-Z
c = asc("A") + int(rand*26)
# muestre la letra (a partir de su cdigo numerico)
print "Presione '" + chr(c) + "'"
time = msec
# tome el tiempo inicial
do
# espere por una tecla presionada
k = key
until k = c
time = msec time # calcule el tiempo transcurrido
print "Le tom " + (time/1000) + " segundos presionar la tecla."
Pgina 121 of
msec()
msec
La funcin msec devuelve el tiempo que el programa ha estado
corriendo, en milisegundos (1/1000 de un segundo).
Veamos ahora un ejemplo un poco ms 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 # posicin de la pelota
10 # comience en el centro de la pantalla
11 x = graphwidth /2
12 y = graphheight / 2
13 r = 20 # tamao 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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 122 of
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1
2
3
4
5
6
7
8
9
# c11_fallinglettergame.kbs
speed = .15 # velocidad de caida menor = + rapido
nletters = 10 # letras para jugar
score = 0
misses = 0
color black
fastgraphics
Pgina 123 of
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
clg
font "Tahoma", 20, 50
text 20, 80, "Juego de Lluvia de Letras"
font "Tahoma", 16, 50
text 20, 140, "Presione una tecla para comenzar"
refresh
# limpie el teclado y espere por una tecla presionada
k = key
while key = 0
pause speed
end while
misses = nletters # primero asume que perdi todas
for n = 1 to nletters
letter = int((rand * 26)) + asc("A")
x = 10 + rand * 225
for y = 0 to 250 step 20
clg
# muestre letra
font "Tahoma", 20, 50
text x, y, chr(letter)
# muestre score y puntos
font "Tahoma", 12, 50
value = (250 - y)
text 10, 270, "Valor "+ value
text 200, 270, "Score "+ score
refresh
k = key
if k <> 0 then
if k = letter then
score = score + value
misses-- # no perdi esta!
else
score = score - value
end if
exit for
end if
pause speed
next y
next n
clg
font "Tahoma", 20, 50
text 20, 40, " Juego de Lluvia de Letras"
text 20, 80, "Game Over"
text 20, 120, "Score: " + score
text 20, 160, "Perdi: " + misses
refresh
Pgina 124 of
57
end
Pgina 125 of
Ejercicios:
k
e
y
t
f
i
h
s
g
a
b
b
u
t
j
i
c
o
n
t
r
o
l
c
v
w
o
r
r
a
m
s
f
y
h
b
t
t
e
a
k
c
o
l
s
p
a
c
e
o
z
n
g
y
b
j
t
u
n
i
c
o
d
e
Pgina 126 of
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 perodo
de tiempo corto. Asigne sonidos de distinta frecuencia a las
teclas en el teclado
Pgina 127 of
# c12_5pointed.kbs
#
graphsize 100,100
clg
color black,clear
for s = 1 to 50 step 2
stamp 50,50,s,s,{0,-1, .95,-.31, .59,.81, -.59,.81,-.95,-.31}
next s
#
imgsave "c12_5pointed.png"
imgsave nombre_archivo
imgsave nombre_archivo, tipo
Guarda la salida grfica en un archivo imagen de nombre
nombre_archivo. Si tipo no es especificado, la grfica 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.
Pgina 128 of
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 grfica. Los valores de x e y representan la ubicacin en
donde colocar el centro de la imagen. Las imgenes pueden ser
cargadas desde diversos formatos grficos, incluyendo: BMP, PNG,
GIF, JPG, y JPEG. Opcionalmente, puede re-escalarlas (escala,
cambiar el tamao) mediante una escala decimal, donde 1 es
tamao completo. Tambin puede rotar la imagen alrededor de su
centro en sentido a las agujas del reloj especificando rotacin
Pgina 129 of
# c12_numberpopper.kbs
# reproduccin de archivos .wav
fastgraphics
wavplay "cancion_1.wav"
Pgina 130 of
5
6
7
8
9
10
11
12
13
14
15
16
17
18
29
20
21
22
speed = .05
for t = 1 to 3
n = int(rand * 6 + 1)
for pt = 1 to 200 step 10
font "Tahoma",pt,100
clg
color black
text 10,10, n
refresh
pause speed
next pt
speed = speed / 2
next t
# wait for sound to complete
wavwait
wavplay "cancin_2.wav"
wavwait
end
# c12_sprite1ball.kbs
# sonidos de http://www.freesound.org/people/NoiseCollector
color white
rect 0, 0, graphwidth, graphheight
spritedim 1
spriteload 0, "blueball.png"
spriteplace 0, 100,100
spriteshow 0
Pgina 131 of
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dx = rand * 10
dy = rand * 10
while true
if spritex(0) <=0 or spritex(0) >= graphwidth -1 then
dx = dx * -1
wavplay "4359__NoiseCollector__PongBlipF4.wav"
end if
if spritey(0) <= 0 or spritey(0) >= graphheight -1 then
dy = dy * -1
wavplay "4361__NoiseCollector__pongblipA_3.wav"
endif
spritemove 0, dx, dy
pause .05
end while
Pgina 132 of
spriteplace spritenumero, x, y
spriteplace ( spritenumero, x, y )
La sentencia spriteplace le permite ubicar el centro de un sprite
en una ubicacin especificada en el rea grfica.
spritev(spritenumero)
Esta funcin devuelve true si un sprite cargado est siendo mostrado
en el rea grfica de salida. Devolver false si no es visible.
spriteh(spritenumero)
spritew(spritenumero)
spritex(spritenumero)
spritey(spritenumero)
Estas funciones devuelven diversa informacin sobre el sprite cargado.
spriteh
Pgina 133 of
spritew
spritex
spritey
# c12_spritebumper.kbs
# muestre dos sprites con colisin
color white
rect 0, 0, graphwidth, graphheight
spritedim 2
# Parachoques estacionario
spriteload 0, "paddle.png"
spriteplace 0,graphwidth/2,graphheight/2
spriteshow 0
# Pelota moviendose
spriteload 1, "greenball.png"
spriteplace 1, 50, 50
spriteshow 1
dx = rand * 5 + 5
dy = rand * 5 + 5
while true
if spritex(1) <=0 or spritex(1) >= graphwidth -1 then
dx = dx * -1
end if
if spritey(1) <= 0 or spritey(1) >= graphheight -1 then
dy = dy * -1
end if
if spritecollide(0,1) then
dy = dy * -1
print "bump"
end if
spritemove 1, dx, dy
pause .05
end while
Pgina 134 of
# c12_spritepoly.kbs
# crea un sprite de un polgono que sigue al mouse
spritedim 1
color red, blue
penwidth 1
spritepoly 0, {15,0, 30,10, 20,10, 20,30, 10,30, 10, 10, 0,10}
color green
rect 0, 0, graphwidth, graphheight
spriteshow 0
while true
spriteplace 0, mousex, mousey
pause .01
end while
Pgina 135 of
spritenumero, { puntos }
( spritenumero, { puntos } )
spritenumero, variable_array
( spritenumero, variable_array )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# c12_sprite_paddleball.kbs
# juego de fronton hecho con sprites
# sonidos de http://www.freesound.org/people/NoiseCollector
print "Juego de Frontn"
print "Las teclas J y K mueven la raqueta. "
input "Presione enter para comenzar >", wait$
color white
rect 0, 0, graphwidth, graphheight
spritedim 2
color blue, darkblue
spritepoly 0, {0,0, 80,0, 80,20, 70,20, 70,10, 10,10, 10,20, 0,20}
spriteplace 0, 100,270
spriteshow 0
spriteload 1, "greenball.png"
spriteplace 1, 100,100
Pgina 136 of
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
then
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
spriteshow 1
penwidth 2
dx = rand * .5 + .25
dy = rand * .5 + .25
bounces = 0
while spritey(1) + spriteh(1) - 5 < spritey(0)
k = key
if chr(k) = "K" then
spritemove 0, 20, 0
end if
if chr(k) = "J" then
spritemove 0, -20, 0
end if
if spritecollide(0,1) then
# rebote y aumente velocidad
dy = dy * -1
dx = dx * 1.1
bounces = bounces + 1
wavstop
wavplay "96633__CGEffex__Ricochet_metal5.wav"
# mover sprite fuera de la paleta
while spritecollide(0,1)
spritemove 1, dx, dy
end while
end if
if spritex(1) <=0 or spritex(1) >= graphwidth -1
dx = dx * -1
wavstop
wavplay "4359__NoiseCollector__PongBlipF4.wav"
end if
if spritey(1) <= 0 then
dy = dy * -1
wavstop
wavplay "4361__NoiseCollector__pongblipA_3.wav"
end if
spritemove 1, dx, dy
# ajuste la velocidad aqui
pause .002
end while
print "Ud. Rebot la pelota " + bounces + " veces."
Pgina 137 of
Pgina 138 of
Ejercicios:
i
s
k
z
a
c
q
w
q
w
q
o
u
h
s
s
e
p
j
e
f
o
j
a
n
b
s
u
p
f
d
j
v
r
m
v
h
l
o
v
p
v
r
a
t
d
i
c
p
i
f
o
i
l
r
p
i
w
p
s
i
e
i
m
t
t
t
m
i
i
t
l
o
g
b
m
s
r
a
s
a
e
t
e
e
s
t
a
e
k
e
c
z
u
t
m
e
l
p
t
s
i
g
y
i
n
a
n
o
t
p
i
l
o
v
i
a
o
a
m
s
l
r
z
o
c
a
d
a
a
m
r
y
n
g
i
e
o
l
m
c
i
w
e
i
d
m
p
d
l
o
h
y
u
e
l
g
p
f
t
h
t
s
s
o
n
e
d
i
l
l
o
c
e
t
i
r
p
s
a
o
w
a
v
w
a
i
t
w
j
s
r
r
e
d
z
d
s
p
r
i
t
e
h
i
d
e
p
f
u
u
w
o
h
s
e
t
i
r
p
s
c
z
s
o
12.2. Ahora escriba un programa simple para tirar una moneda que
muestre el resultado usado las imgenes creadas en el
problema Genere un nmero aleatorio y pruebe: si el nmero
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
Pgina 139 of
Pgina 140 of
# c13_printpage.kbs
# imprimir una pagina con texto
printer on
x = 100 # empiece la 1ra. linea 100 pixes debajo.
font "Times New Roman", 30, 100
for t = 1 to 10
text 0, x, "The number t is " + t
x = x + textheight()
next t
printer off
Pgina 141 of
printer on
printeron
Enciende la impresora.
Una vez que la impresora est encendida, las sentencias grficas
(line, plot, text, rect, circle, poly, stamp, graphwidth, graphheight,
textwidth y textheight) ahora dibujarn y devolvern informacin de la
pgina de impresin
printer off
printeroff
Finaliza la impresin del documento corriente.
Si su salida est siendo enviada a un dispositivo de impresin, el
documento empezar a imprimirse. Si su salida est direccionada a
un archive PDF, el archivo ser escrito y guardado en la ubicacin
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 grfica o dispositivo de impresin con la
sentencia text.
textwidth devuelve el ancho real del string.
textheight devuelve la altura estndar, en pxeles, del font activo.
Puede cambiar el destino y las propiedades de impresin seleccionando la pestaa
"Printing (Impresin) en la ventana de Preferences (Preferencias)". Podr seleccionar
cualquier impresora configurada en Windows y el tamao y orientacin de la pgina.
Pgina 142 of
# c13_drawpage.kbs
# Draw on the page
printer on
# coloque el texto en el CENTRO de la pagina
color black
font "Arial", 40, 500
words$ = "Center"
x = ( graphwidth - textwidth(words$) ) / 2
y = ( graphheight - textheight() ) / 2
text x,y,words$
# dibuje un circulo alrededor del texto
# llenelo con color clear
color black, clear
penwidth 5
circle graphwidth/2, graphheight/2, 100
# dibuje un triangulo usando poly
color black, grey
penwidth 10
poly {200,100, 300,300, 100,300 }
# dibuje un patrn moire en la pagina
color black
penwidth 1
for t = 0 to 400 step 3
line graphwidth, graphheight, graphwidth-400, graphheight-t
line graphwidth, graphheight, graphwidth-t, graphheight-400
next t
printer off
Pgina 143 of
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
2
3
4
5
6
7
8
9
10
11
# c13_multtable.kbs
# imprima la tabla de multiplicar del 12 hasta 12
printer on
color black
font "Arial", 12, 100
# size of a cell on grid
w = 700/13
h = textheight()*2
#
pad = 5
Pgina 144 of
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# dibuje la grilla
penwidth 2
for x = 0 to 14
line x*w,0,x*w,14*h
next x
for y = 0 to 14
line 0,y*h,14*w,y*h
next y
# ponga los nmeros de fila y de columna
font "Arial", 12, 100
for x = 0 to 12
text (x+1)*w+pad,pad,x
next x
for y = 0 to 12
text pad,(y+1)*h+pad,y
next y
# ponga los productos
font "Arial", 12, 50
for x = 0 to 12
for y = 0 to 12
text (x+1)*w+pad,(y+1)*h+pad,(x*y)
next y
next x
printer off
Pgina 145 of
Ejercicios:
k
j
p
b
t
r
o
m
g
o
l
f
o
s
h
e
k
a
h
z
a
d
r
g
g
s
p
r
t
c
n
r
t
n
i
o
r
g
d
a
d
e
r
i
e
l
i
i
i
n
s
p
a
t
h
u
n
n
w
c
c
a
i
t
t
t
t
d
t
e
a
p
t
e
x
i
e
f
x
l
p
t
x
s
e
o
r
d
e
x
e
g
a
p
t
n
o
p
t
p
13.1. Tome el programa del Problema 5.1 o 5.1 y haga que imprima la
lrica de las canciones en una pgina despus que el usuario
tipee palabras para llenar los blancos.
Puede necesitar mantener una variable con el nmero de lnea
que est enviando a la salida de modo que pueda calcular
cun abajo en la pgina debe comenzar la lnea.
13.2. Use la subrutina de la cara sonriente que cre en el Problema 9.1
para crear una pgina con una cara sonriente en cada una de las
4 esquinas y la palabra SONRISA centrada en la pgina.
Pgina 146 of
# c14_arraynumeric1d.kbs
# array numrico uni-dimensional
dim a(10)
# se crea el array a de 10 elementos. Es un array
# numrico porque a denota una variable numrica
a[0] = 100
a[1] = 200
a[3] = a[1] + a[2]
input "Ingrese un numero> ", a[9]
a[8] = a[9] - a[3]
for t = 0 to 9
print "a[" + t + "] = " + a[t]
next t
Pgina 147 of
variable (items)
array numrico
variable$(items)
array de strings ($)
variable (filas, columnas)
variable$(filas, columnas)
# c14_manyballbounce.kbs
# use arrays para mantener la direccion, posicin,
# y color de varias pelotas en pantalla
fastgraphics
r = 10
# tamao de la pelota
balls = 50 # numero de pelotas
dim x(balls)
dim y(balls)
dim dx(balls)
dim dy(balls)
dim colors(balls)
for b = 0 to balls-1
# posicin inicial de las pelotas
x[b] = 0
y[b] = 0
# velocidad en direccin x e y
Pgina 148 of
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
dx[b] = rand * r + 2
dy[b] = rand * r + 2
# cada pelota tiene su propio color
colors[b] = rgb(rand*256, rand*256, rand*256)
next b
color green
rect 0,0,300,300
while true
# limpie pantalla (erase screen)
clg
# ubique y dibuje las pelotas
for b = 0 to balls -1
x[b] = x[b] + dx[b]
y[b] = y[b] + dy[b]
# si off los bordes laterales rebotan la pelota
if x[b] < 0 or x[b] > 300 then
dx[b] = dx[b] * -1
end if
# si off los bordes sup e inf rebotan la pelota
if y[b] < 0 or y[b] > 300 then
dy[b] = dy[b] * -1
end if
# dibuje nueva pelota
color colors[b]
circle x[b],y[b],r
next b
# refresque el display
refresh
pause .05
end while
Pgina 149 of
Pgina 150 of
Arrays de Strings
Los arrays tambin 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
numricos son vlidas 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 continuacin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# c14_listoffriends.kbs
# use un array de strings para guardar nombres
print "Haga una lista de mis amigos"
input "Cuantos amigos tiene? ", n
dim names$(n)
for i = 0 to n-1
input "Ingrese el nombre de un amigo? ", names$[i]
next i
cls
print "Mis amigos:"
for i = 0 to n-1
print "Amigo numero ";
print i + 1;
print ": " + names$[i]
next i
end
Pgina 151 of
Asignando Arrays
Hemos visto el uso de llaves ({}) para reproducir msica, dibujar polgonos y definir stamps.
Las llaves pueden usarse tambin para crear y asignar un array completo con los valores
que deseemos.
1
2
3
4
5
6
7
8
9
# c14_arrayassign.kbs
# usando una lista de valores para crear un array asignado
numero = {56, 99, 145}
nombre$ = {"Alicia", "Franco", "Luciano"}
for i = 0 to 2
print number[i] + " " + name$[i]
next i
Sonidos y Arrays
En el Captulo 3 vimos como usar una lista de frecuencias y duraciones (colocadas entre
llaves) para reproducir mltiples sonidos de una vez. La sentencia sound tambin aceptar
una lista de frecuencias y duraciones desde un array. El array deber tener un nmero par
de elementos; las frecuencias deberan ser guardadas en los elementos pares (0,2,4,) y
las duraciones en los impares (1,3,5,).
El Programa 91 a continuacin una simple frmula lineal para hacer un sonido espacial.
1
2
4
5
#
#
#
#
c14_spacechirp.kbs
reproduzca un sonido espacial
valores pares 0,2,4... - frecuencia
valores impares 1,3,5... - duracion
Pgina 152 of
7
8
9
10
11
12
13
14
15
Grficos y Arrays
En el Captulo 8 vimos el uso de listas para crear polgonos y stamps. Los arrays tambin
pueden usarse para dibujar polgonos, stamps y sprites. Su uso ayuda a simplificar y a
hacer ms elegante su cdigo 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 captulo de mouse para dibujar una gran
X con sombra. La sombra se logra estampando una forma gris corrida en la direccin 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
Pgina 153 of
# c14_randompoly.kbs
# dibujar 5 poligonos pegados (lados compartidos) al azar
dim shape(10)
for t = 0 to 8 step 2
x = 300 * rand
y = 300 * rand
shape[t] = x
shape[t+1] = y
next t
clg
color black
poly shape
Pgina 154 of
# c14_grades.kbs
# calculate average grades for each student
# and whole class using a two dimensional array
nstudents = 3 # number of students
nscores = 4 # number of scores per student
dim students$(nstudents)
dim grades(nstudents, nscores)
# guarde las notas como columnas y los estudiantes como filas
# primer estudiante
students$[0] = "Panqui"
grades[0,0] = 90
grades[0,1] = 92
grades[0,2] = 81
grades[0,3] = 55
# segundo estudiante
students$[1] = "Lucho"
Pgina 155 of
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
grades[1,0] = 66
grades[1,1] = 99
grades[1,2] = 98
grades[1,3] = 88
# tercer estudiante
students$[2] = "Ali"
grades[2,0] = 79
grades[2,1] = 81
grades[2,2] = 87
grades[2,3] = 73
total = 0
for row = 0 to nstudents-1
studenttotal = 0
for column = 0 to nscores-1
studenttotal = studenttotal + grades[row, column]
total = total + grades[row, column]
next column
print "El promedio de " + students$[row] + "es ";
print studenttotal / nscores
next row
print "El promedio de la clase es ";
print total / (nscores * nstudents)
end
Pgina 156 of
# c14_size.kbs
# Longitud de array y pasando a una subroutina
print "El Array de Numeros:"
number = {77, 55, 33}
call showarray(ref(number))
print "El Array de Numeros al Azar:"
dim r(5)
for a = 0 to r[?] - 1
r[a] = int(rand*10)+1
next a
call showarray(ref(r))
#
end
#
subroutine showarray(ref(a))
print "tiene " + a[?] + " elementos."
for i = 0 to a[?] - 1
print "elemento " + i + " " + a[i]
next i
end subroutine
Pgina 157 of
ref(array)
ref(array$)
La funcin ref() se usa para pasar a una subrutina o funcin, una
referencia a un array. La referencia al array debe ser especificada en
la creacin de la subroutina/funcin y cuando es llamada.
Si la subrutina cambia un elemento en el array referenciado, el valor
tambin cambia fuera de la subrutina.
Note que esto es un comportamiento diferente al de otras variables,
cuyos valores al pasar a una subrutina/funcin son copiados a
nuevas variables dentro de la subrutina o funcin. Esto es, aunque
los valores sean cambiados dentro de la subrutina/funcin, estos
cambios no se reflejan fuera de las mismas, ya que lo que se cambi
fue una copia.
# c14_redim.kbs
# se crea un array de 3 elementos
number = {77, 55, 33}
# se crea un nuevo elemento al final
redim number(4)
number[3] = 22
#
for i = 0 to 3
print i + " " + number[i]
next i
Pgina 158 of
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 tamao de un array en la memoria de
la computadora. Los datos guardados con anterioridad sern
mantenidos, si se ajustan al nuevo tamao.
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 nmero de columnas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# c14_spacewarp.kbs
# Game: Lluvia de basura espacial
# defina pelotas y arrays para ellas
balln = 5
dim ballx(balln)
dim bally(balln)
dim ballspeed(balln)
ballr = 10
# radio de las pelotas
# defina valores minimo y maximo
minx = ballr
maxx = graphwidth - ballr
miny = ballr
maxy = graphheight - ballr
# score initial
score = 0
# defina tamao del jugador, dist.p/moverse y ubicacin
playerw = 30
playerm = 10
playerh = 10
playerx = (graphwidth - playerw)/2
Pgina 159 of
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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 160 of
70
rect playerx, maxy - playerh, playerw, playerh
71
refresh
72
73
# haga el jugador mas grande (make player bigger)
74
if (rand<growpercent) then playerw = playerw + 1
75
76
# lea tecla del jugador y mueva si tecla fue presionada
77
k = key
78
if k = keyj then playerx = playerx - playerm
79
if k = keyk then playerx = playerx + playerm
80
if k = keyq then more = false
81
82
# mantenga jugador en pantalla
83
if playerx < 0 then playerx = 0
84
if playerx > graphwidth - playerw then playerx =
graphwidth - playerw
85
86
end while
87
88
print "score " + string(score)
89
print "Usted esta M-U-E-R-T-O."
90
end
Programa 97: Big Program Lluvia de Basura Espacial
Pgina 161 of
Ejercicios:
a
y
e
o
x
c
a
y
d
y
t
o
r
e
e
o
r
h
i
j
d
y
d
o
d
l
r
t
m
n
v
n
q
s
m
l
a
s
e
f
i
s
a
c
c
e
y
i
n
z
t
z
i
o
z
c
m
l
s
r
f
o
m
l
d
t
n
e
i
o
p
n
n
u
y
i
h
g
o
w
a
c
o
m
v
o
z
d
n
l
u
b
e
n
i
n
y
f
l
t
Pgina 162 of
Pgina 163 of
Operadores Nuevos
Adems de las operaciones matemticas bsicas que hemos visto hasta ahora, hay tres
operadores bsicos adicionales en BASIC-256. Operadores para estas tres operaciones
existen en la mayora de los lenguajes de computacin. Estos son los operadores: mdulo,
divisin entera y potencia.
Operacin
Operador
Mdulo
Descripcin
Devuelve el resto de una divisin entera.
Divisin Entera
Potencia
Operador Mdulo
El operador mdulo (%) devuelve el resto de una divisin entera.
1
2
3
4
5
6
7
# c15_modulo.kbs
input "ingrese un nmero: ", n
if n % 2 = 0 then print "divisible
if n % 3 = 0 then print "divisible
if n % 5 = 0 then print "divisible
if n % 7 = 0 then print "divisible
end
por 2"
por 3"
por5"
por 7"
Pgina 164 of
por otro (Programa 98), y 2) para limitar un nmero a un rango especfico (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
# posicin 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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 165 of
# c15_integerdivision.kbs
input "dividendo ", dividendo
input "divisor ", divisor
print dividendo + " / " + divisor + " is ";
print dividendo \ divisor;
print "r";
print dividendo % divisor;
Operator Potencia
El operador potencia (^) eleva un nmero a la potencia de otro nmero.
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
2
2
2
2
2
2
2
^
^
^
^
^
^
^
^
0
1
2
3
4
5
6
7
=
=
=
=
=
=
=
=
1
2
4
8
16
32
64
128
Pgina 166 of
2
2
2
2
2
2
2
2
2
^
^
^
^
^
^
^
^
^
8 = 256
9 = 512
10 = 1024
11 = 2048
12 = 4096
13 = 8192
14 = 16384
15 = 32768
16 = 65536
Descripcin
int (expression)
ceil (expression)
floor (expression)
Pgina 167 of
Pgina 168 of
1
2
3
4
5
6
7
8
# c15_intceilfloor.kbs
for t = 1 to 10
n = rand * 100 - 50
print n;
print " int=" + int(n);
print " ceil=" + ceil(n);
print " floor=" + floor(n)
next t
Descripcin
float (expresin)
abs (expresin)
log (expresin)
log10 (expresin)
Pgina 169 of
Descripcin
cos (expresion)
sin (expresion)
tan (expresion)
acos (expresion)
asin (expresion)
atan (expresion)
La discusin de las primeras tres funciones refiere a los lados de un tringulo recto. La
Ilustracin 24 muestra un triangulo recto con sus lados y ngulos identificados.
Seno:
El seno (sin) es la razn de la longitud del lado opuesto sobre la longitud de la hipotenusa.
Pgina 170 of
Coseno:
El coseno (cos) es la razn de la longitud del lado adyacente sobre la longitud de la
hipotenusa.
Tangente:
La tangente (tan) es la razn de la longitud del lado opuesto sobre la longitud del lado
adyacente.
La tangente tiene este rango debido a que a medida que el ngulo se aproxima a /2
radianes, el lado opuesto (a) se va haciendo cada vez ms pequeo; y ser efectivamente
cero cuando el ngulo sea exactamente /2 radianes.
Pgina 171 of
Pgina 172 of
# c15_handyclock.kbs
fastgraphics
while true
clg
# draw outline
color black, white
penwidth 5
circle 150,150,105
# dibuje las 60 marcas (cada 5 haga una mas larga)
color black
penwidth 1
for m = 0 to 59
a = 2 * pi * m / 60
if m % 5 = 0 then
pip = 5
else
pip = 1
end if
circle 150-sin(a)*95,150-cos(a)*95,pip
next m
# dibuje las manecillas
h = hour % 12 * 60/12 + minute/12 + second /3600
call drawhand(150,150,h,50,6,green)
m = minute + second / 60
call drawhand(150,150,m,75,4,red)
call drawhand(150,150,second,100,3,blue)
Pgina 173 of
28
29
30
31
32
33
34
35
36
37
38
refresh
pause 1
end while
subroutine drawhand(x, y, f, l, w, handcolor)
# pase la ubicacin x e y
# f como ubicacin en la cara del reloj 0-59
# longitud, ancho, y color de la manecilla
color handcolor
stamp x, y, 1, f/60*2*pi - pi / 2, {0,-w,l,0,0,w}
end subroutine
Pgina 174 of
Ejercicios:
e
f
c
f
a
t
t
i
r
r
r
d
c
t
y
s
a
o
n
a
e
o
l
s
e
z
i
r
r
t
l
d
o
o
p
h
i
n
t
s
e
o
n
u
g
l
a
y
l
n
a
g
o
i
o
a
d
d
f
p
i
u
e
a
a
p
r
l
j
o
n
o
n
r
t
m
l
i
p
a
f
i
m
t
g
a
e
p
t
l
c
o
s
x
w
e
n
r
s
h
a
e
c
o
s
k
c
n
d
b
m
c
n
p
o
w
e
r
s
u
a
g
o
t
i
d
e
g
r
e
e
s
b
s
k
j
s
n
a
i
d
a
r
e
abs, acos, adjacent, asin, atan, ceiling, cos, degrees, float, floor,
hypotenuse, int, integer, logarithm, modulo, opposite, power, radians,
remainder, sin, tan
6 lados
7 lados
12 lados
Pgina 175 of
Descripcin
string(expresion)
length(string)
left(string, longitud)
right(string, longitud)
upper(expresion)
lower(expresion)
instr(oracion, sub)
La Funcin String()
La funcin string() toma una expresin en cualquier formato y la devuelve como un string.
Esta funcin es un modo conveniente de convertir un nmero entero o punto flotante en
caracteres de modo que pueda ser manejado como un string.
1
2
3
4
5
6
7
# c16_string.kbs
# convierte un numero a string
a$ = string(10 + 13)
print a$
b$ = string(2 * pi)
print b$
Pgina 176 of
string(expresion)
Convierte expresion (string, entero o punto flotante) a un valor
string
La funcin Length()
La funcin length() (longitud) toma una expresin string y devuelve su longitud (en
caracteres o letras).
1
# c16_length.kbs
2
# encuentre el largo de un string
3
# debera imprimir 6, 0, y 17
4
print length("Hola.")
5
print length("")
6
print length("Programando Rulz!")
Programa 105: La funcin Length
6
0
17
Salida 105: La funcin Length
length(expression)
Devuelve la longitud (nro. De caracteres) del string expression.
Devuelve cero (0) para el string vaco "".
# c16_leftrightmid.kbs
# mostrar funcionamiento de funciones: right, left y mid
a$ = "abcdefghijklm"
print left(a$,4)
# imprime primeras 4 letras
print right(a$,2)
# imprime ltimas 2 letras
print mid(a$,4,3)
# imprime letras 4ta. a 7ma.
print mid(a$,10,9)
# imprime letras 10ma. a 11va.
Pgina 177 of
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.
# c16_upperlower.kbs
a$ = "Hola."
print lower(a$)
print upper(a$)
lower(bstring)
upper(bstring)
Devuelve una copia de bstring pero en minsculas o maysculas
respectivamente. Caracteres no-alfabticos no sern modificados.
Pgina 178 of
La funcin Instr()
La funcin instr() busca, dentro de un string, la ocurrencia de un sub-string. El valor
devuelto es la posicin en el string donde comienza el sub-string. Si el sub-string no se
encuentra, la funcin devolver cero (0).
1
2
3
4
5
6
7
8
# c16_instr.kbs
# un string dentro de otro
a$ = "abcdefghijklm"
print 'la ubicacin de "hi" es ';
print instr(a$,"hi")
print 'la ubicacin de "bye" es ';
print instr(a$,"bye")
# c16_radix.kbs
# convierte un numero de una base (2-36) a otra
# letras usadas para los dgitos 11 al 26
Pgina 179 of
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
digits$ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
frombase = getbase("desde base")
input "numero en base " + frombase + " >", number$
number$ = upper(number$)
# convierta numero a base 10 y gurdelo en n
n=0
for i = 1 to length(number$)
n = n * frombase
n = n + instr(digits$, mid(number$, i, 1)) - 1
next i
tobase = getbase("to base")
# ahora construya string en tobase
result$ = ""
while n <> 0
result$ = mid(digits$, n % tobase + 1, 1) + result$
n = n \ tobase
end while
print "en base " + tobase + " el numero es " + result$
end
function getbase(message$)
# obtenga la base desde 2 a 36
do
input message$+"> ", base
until base >= 2 and base <= 36
return base
end function
Pgina 180 of
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
Pgina 181 of
codificado.
Corrimiento (shift) >4
mensaje >i could really go for some pizza
M GSYPH VIEPPC KS JSV WSQI TMDDE
Corrimiento (shift) >22
mensaje >M GSYPH VIEPPC KS JSV WSQI TMDDE
I COULD REALLY GO FOR SOME PIZZA
Pgina 182 of
# c17_readlfile.kbs
# leer un archivo de texto simple
input "Archivo> ", fn$
if not exists(fn$) then
print fn$ + " El archivo no existe."
end
end if
#
n=0
open fn$
while not eof
l$ = readline
n=n+1
print n + " " + l$
end while
#
print "El archivo " + fn$ + " tiene " + size + " bytes."
close
Pgina 183 of
exist(expresin)
Busca en la computadora un archivo con nombre expresin
(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
open
open
open
expresin
(expresin)
unumero, expresin
(unumero, expresin)
eof
eof()
eof(unumero)
La funcin eof devuelve el valor true si se alcanz el final del archivo
y false caso contrario (an quedan ms 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 lnea corriente del archivo
abierto (hasta encontrar EOL). Si estamos al final del archivo
[eof(filename)=true], entonces devuelve un string vaco ().
Si no se especifica unumero, entonces el archivo que se usar ser
la unidad cero (0).
size
size()
size(unumero)
Esta funcin devuelve la longitud de un archivo abierto, en Bytes.
Si no se especifica unumero, entonces el archivo que se usar ser
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 184 of
# c17_resetwrite.kbs
# escriba texto a un archivo, vuelva al comienzo y
# muestre el texto
open "e2_c17_resetwrite.dat"
print "Ingrese una lnea en blanco para cerrar el archivo."
# limpie el archivo (reset) y vuelva a empezar
reset
while true
input ">", l$
if l$ = "" then exit while
writeline l$
end while
# vaya al inicio y muestre contenido
seek 0
k=0
while not eof()
k=k+1
print k + " " + readline()
end while
close
end
Pgina 185 of
# c17_appendwrite.kbs
# agregar nuevas lneas al final del archivo
# luego mostrarlas en pantalla
Pgina 186 of
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
open "e2_c17_appendwrite.dat"
print "Ingrese una lnea en blanco para cerrar el archivo."
# mueva el puntero al final del archivo y agregue
seek size
while true
input ">", l$
if l$ = "" then exit while
writeline l$
end while
# mueva puntero al comienzo del archivo y muestre contenido
seek 0
k=0
while not eof()
k=k+1
print k + " " + readline()
end while
close
end
Pgina 187 of
expresin
(expresin)
unumero,expresin
(unumero,expresin)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# c17_phonelist.kbs
# Agregue un nro. Telefnico a la lista y mustrelo
filename$ = "c17_phonelist.txt"
print "phonelist.kbs - Maneje su directorio telefnico."
do
input "Agregar, Listar, Salir (a/l/s)? ",action$
if left(lower(action$),1) = "a" then call addrecord(filename$)
if left(lower(action$),1) = "l" then call listfile(filename$)
until left(lower(action$),1) = "s"
end
subroutine listfile(f$)
if exists(f$) then
# liste nombres y TE nmeros en el archivo
open f$
print "el archivo tiene " + size + " bytes"
while not eof
# lea siguiente lnea del archivo e imprimala
print readline
end while
close
else
print "No hay TEs en el archivo. Agregue primero."
end if
end subroutine
Pgina 188 of
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 Telefnica
phonelist.kbs - Maneje su directorio telefnico.
Agregar, Listar, Salir (a/l/s)?l
El archivo tiene 46 bytes
jim, 555-5555
sam, 555-7777
doug, 555-3333
Agregar, Listar, Salir (a/l/s)? a
Nombre a agregar? ang
Nro. TE a agregar? 555-0987
Agregar, Listar, Salir (a/l/s)? l
El archivo tiene 61 bytes
jim, 555-5555
sam, 555-7777
doug, 555-3333
ang, 555-0987
Agregar, Listar, Salir (a/l/s)? q
Salida 113: Programa Grande Lista Telefnica
Pgina 189 of
Ejercicios:
e
s
n
e
p
o
r
e
t
b
n
y
e
f
p
e
x
e
k
r
i
r
k
m
s
i
e
r
e
e
l
o
o
e
s
z
e
t
n
w
e
t
t
t
i
l
i
i
z
r
t
c
s
s
i
m
l
k
e
i
i
e
q
f
i
d
e
s
l
t
r
r
h
l
a
e
o
y
j
e
w
i
e
e
s
l
r
e
a
d
e
d
r
p
c
e
o
f
d
n
close, delimiter, directory, eof, exists, file, open, read, readline, reset,
seek, size, token, write, writeline, words
Pgina 190 of
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 debera tener algo asi como:
Alicia,66.5
Pgina 191 of
Stack
Un stack (pila de cosas, de datos) es una de las estructuras de datos ms 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 accin se llama push
en ingls), esta se agrega en la parte superior del mismo y de ese modo los datos van
apilndose unos sobre otros. Cuando se saca una pieza del stack, se toma siempre la de
arriba (proceso llamado pop en ingls) quedando disponible la que estaba
inmediatamente debajo. La Ilustracin 31 siguiente muestra grficamente el proceso.
# c18_stack.kbs
# implementando un stack usando un array
dim stack(1) # array para contener el stack con tamao inicial
nstack = 0 # numero de elementos en el stack
global stack, nstack
Pgina 192 of
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
call push(1)
call push(2)
call push(3)
call push(4)
call push(5)
while not vacio()
print pop()
end while
end
function vacio()
# devuelva true si el comienzo est vaco
return nstack=0
end function
function pop()
# tome el primer numero del stack y devuelvalo
# o imprima un mensaje y devuelva -1
if nstack = 0 then
print "stack vacio"
return -1
end if
nstack = nstack - 1
value = stack[nstack]
return value
end function
subroutine push(valor)
# ponga el numero en la variable valor sobre el stack
# agrande el stack si esta lleno
if nstack = stack[?] then redim stack(stack[?] + 5)
stack[nstack] = valor
nstack = nstack + 1
end subroutine
Pgina 193 of
global variable
global variable, variable...
Queue
El queue (cola, pronunciado Qiu en ingls) es otro tipo de estructura de datos muy comn.
El queue, en su forma ms simple, es como la cola en el comedor de la escuela: El primero
en la lnea es el primero en salir a comer. La ilustracin 32 muestra el diagrama de bloques
de un queue (comprelo con el de stack arriba). Este tipo de estructura es descripto como
primero que entra, primero que sale o FIFO (en ingls, First-In, First-Out).
# c18_queue.kbs
# implementando un queue usando un array
global queuesize, queue, queuetail, queuehead, inqueue
call createqueue(5)
call enqueue(1)
call enqueue(2)
print dequeue()
Pgina 194 of
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
print
call enqueue(3)
call enqueue(4)
print dequeue()
print dequeue()
print
call enqueue(5)
call enqueue(6)
call enqueue(7)
# vacie el queue
while inqueue > 0
print dequeue()
end while
end
subroutine createqueue(z)
# mximo nro. de entradas en la queue a cualquier tiempo
queuesize = z
# array para contener la queue con valor inicial
dim queue(z)
# ubicacin en la queue de la prxima entrada nueva
queuetail = 0
# ubicacin en la queue de la prxima entrada a ser devuelta (servida)
queuehead = 0
# numero de entradas en la queue
inqueue = 0
end subroutine
function dequeue()
if inqueue = 0 then
print "queue is empty"
value = -1
else
value = queue[queuehead]
inqueue-queuehead++
if queuehead = queuesize then queuehead = 0
end if
return value
end function
subroutine enqueue(value)
if inqueue = queuesize then
Pgina 195 of
58
59
60
61
62
63
64
65
Linked List
En la mayora de los libros, la discusin del material de este captulo comienza con linked
list (lista encadenada, enlazada). Pero, debido a que BASIC-256 maneja la memoria de
manera diferente que muchos otros lenguajes de programacin, esta discusin fue
postergada hasta despus 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
prximo nodo de la lista. O sea que, adems de los nodos con informacin ahora tambin
necesitamos un puntero (pointer) que apunte al primer nodo. Llamamos al primer nodo la
cabeza (head). Analice la Ilustracin 33 y ver como cada nodo apunta a otro.
Pgina 196 of
# c18_linkedlist.kbs
# crer una linked list usando arrays
# data$ es array conteniendo los strings de datos en la lista
# nextitem es un array con punteros al prximo tem de datos
# si nextitem es -2:esta libre o si -1:es el final
global head, data$, nextitem
call initialize(6)
# lista de 3 personas
call append("Bob")
call append("Sue")
call append("Guido")
call displaylist()
call displayarrays()
Pgina 197 of
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
call wait()
print "eliminar persona 2"
call delete(2)
call displaylist()
call displayarrays()
call wait()
print "insertar Mary al frente de la lista (#1)"
call insert("Mary",1)
call displaylist()
call displayarrays()
call wait()
print "insertar John en posicion 2"
call insert("John",2)
call displaylist()
call displayarrays()
call wait()
print "eliminar persona 1"
call delete(1)
call displaylist()
call displayarrays()
call wait()
end
subroutine wait()
input "Intro para continuar> ",foo$
print
end subroutine
subroutine initialize(n)
head = -1 # comienzo de lista (-1 pointer a ningn lado)
dim data$(n)
dim nextitem(n)
# inicialice items como libres
for t = 0 to data$[?]-1
call freeitem(t)
next t
end subroutine
subroutine freeitem(i)
# elemento libre en el array, en posicion i
data$[i] = ""
nextitem[i] = -2
end subroutine
Pgina 198 of
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
function findfree()
# encuentre un tem libre (un item apuntando a -2)
for t = 0 to data$[?]-1
if nextitem[t] = -2 then return t
next t
print 'no hay elementos libres para alojar'
end
end function
function createitem(text$)
# crear un nuevo tem en la lista
# y devolver ndice a la nueva ubicacion
i = findfree()
data$[i] = text$
nextitem[i] = -1
return i
end function
subroutine displaylist()
# muestre la lista siguiendo la linked list
print "list..."
k=0
i = head
do
k=k+1
print k + " ";
print data$[i]
i = nextitem[i]
until i = -1
end subroutine
subroutine displayarrays()
# muestre datos realmente guardados y como
print "arrays..."
for i = 0 to data$[?]-1
print i + " " + data$[i] + " >" + nextitem[i] ;
if head = i then print " <<head";
print
next i
end subroutine
subroutine insert(text$, n)
# inserte text$ en la posicin n
index = createitem(text$)
if n = 1 then
nextitem[index] = head
Pgina 199 of
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
123
148
159
150
151
152
153
154
155
156
head = index
else
k=2
i = head
while i <> -1 and k <> n
k=k+1
i = nextitem[i]
end while
if i <> -1 then
nextitem[index] = nextitem[i]
nextitem[i] = index
else
print "No es posible insertar mas all de la lista"
end if
end if
end subroutine
subroutine delete(n)
# elimine elemento n de la linked list
if n = 1 then
# elimine head haga el segundo elemento la nueva head
index = head
head = nextitem[index]
call freeitem(index)
else
k=2
i = head
while i <> -1 and k <> n
k=k+1
i = nextitem[i]
end while
if i <> -1 then
index = nextitem[i]
nextitem[i] = nextitem[nextitem[i]]
call freeitem(index)
else
print "
print "No es posible borrar mas all del final de la lista "
end if
end if
end subroutine
subroutine append(text$)
# apendice text$ al final de la linked list
index = createitem(text$)
if head = -1 then
# no hay cabeza aun haga al tem cabeza
Pgina 200 of
157
158
159
160
161
162
163
164
165
166
head = index
else
# muvase al final de la lista y agregue un nuevo item
i = head
while nextitem[i] <> -1
i = nextitem[i]
end while
nextitem[i] = index
endif
end subroutine
Pgina 201 of
Pgina 202 of
#
#
#
#
#
#
#
#
#
c18_bubblesortf.kbs
implementando un ordenamiento simple
El ordenamiento burbuja es uno de los algoritmos MAS
LENTOS para ordenar, pero el mas fcil de implementar
y entender
El algoritmo para el ordenamiento burbuja es:
1. Pase a travs del array barriendo valores adyacentes
de modo que el menor valor quede primero.
2. Ejecute el paso 1 una y otra vez hasta que no haya
Pgina 203 of
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Pgina 204 of
Pgina 205 of
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# c18_insertionsort.kbs
# implementando un ordenamiento eficiente
# El Ordenamiento por Insercion hace un loop a travs de
# los items comenzando en el segundo elemento.
# toma el elemento corriente y lo inserta en la posicion
# ordenada correcta en los elementos previamente ordenados
#
#
#
#
dim d(20)
# llene el array con nmeros desordenados
for i = 0 to d[?]-1
d[i] = int(rand * 1000)
next i
print "*** Desordenado ***"
call displayarray(ref(d))
call insertionsort(ref(d))
print "*** Ordenado ***"
call displayarray(ref(d))
end
subroutine displayarray(ref(a))
# imprima los valores del array
for i = 0 to a[?]-1
print a[i] + " ";
next i
print
end subroutine
subroutine insertionsort(ref(a))
for i = 1 to a[?] - 1
currentvalue = a[i]
j=i-1
done = false
do
if a[j] > currentvalue then
a[j+1] = a[j]
j=j-1
Pgina 206 of
48
49
50
51
52
53
54
55
Pgina 207 of
Ejercicios:
k
n
i
l
v
p
q
v
i
z
d
z
m
f
o
h
m
o
g
l
o
b
a
l
y
x
i
f
p
p
e
f
f
i
c
i
e
n
t
f
i
v
u
k
c
a
t
s
v
y
g
s
o
l
e
f
x
i
u
q
z
e
d
o
n
e
u
o
d
v
l
h
s
u
p
j
v
y
q
x
d
s
m
e
m
o
r
y
h
c
i
i
q
t
r
o
s
e
l
b
b
u
b
t
q
q
q
c
i
a
l
l
o
c
a
t
e
h
y
y
t
s
i
l
i
d
s
r
y
i
m
e
u
e
u
q
n
e
t
z
o
l
q
t
r
o
s
n
o
i
t
r
e
s
n
i
o
b
d
e
u
e
u
q
e
d
p
q
b
Pgina 208 of
# c19_divider.kbs
# divisin simple
print "Divida dos numeros"
while true
input "numerador? ", n
input "denominador? ", d
q = n/d
print "El cociente es " + q
end while
Programa 119: Divisin simple que puede dar Error en Tiempo de Ejecucin.
Divida dos numeros
numerador? 6
denominador? 9
El cociente es 0.6666667
numerador? 5
denominador? 2
El cociente es 2.5
numerador? 9
denominador? 0
ERROR on line 8: Division by zero.
Salida 119: Divisin simple que puede dar Error en Tiempo de Ejecucin.
# c19_trycatch.kbs
# simple try catch
Pgina 209 of
3
4 print "Dividir dos Nmeros"
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
Dividir dos Nmeros
numerador? 5
denominador? 6
El cociente es
0.8333333
numerador? 99
denominador? 0
No es posible dividir 99 por 0
numerador? 4
denominador? 3
El cociente es
1.3333333
Numerador ?
Salida 120: Simple Programa que divide y Atrapa error
try
declaraciones(s) a probar
catch
declaraciones a ejecutar si ocurre un error
end try
Atrapar errores cuando no tiene significado puede causar problemas y enmascarar u
ocultar otros problemas en su programa. Esta tcnica de atrapar errores debe ser usada
nicamente cuando sea claramente necesaria, en caso contrario se debe evitar.
# c19_trap.kbs
# atrapado de error con informe
Pgina 210 of
4
5
6
7
8
9
10
11
12
try
print "z = " + z
catch
print "Error Atrapado"
print "
Error = " + lasterror
print "
En lnea = " + lasterrorline
print "
Mensaje = " + lasterrormessage
end try
print "Programa an corriendo despus del error."
lasterror
lasterrorline
lasterrormessage
lasterrorextra
Pgina 211 of
Pgina 212 of
Hay una segunda manera de atrapar errores en tiempo de ejecucin: 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
lnea 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
lnea 1 comentada o removida, el programa terminar inmediatamente despus de que
ocurra el error.
1
2
3
4
5
6
7
8
9
10
11
# c19_simpletrap.kbs
# atrapando error con subrutina
onerror atrap # se define subrutina a llamar
print "z = " + z
print "An corriendo despus del error"
end
subroutine atrap()
print "Se atrap un error."
end subroutine
onerror nombresub
Crea una trampa de errores que saltar automticamente a la
subrutina nombresub cuando ocurra un error.
# c19_trapoff.kbs
# Atrapado de errores con informe.
onerror errortrap
print "z = " + z
Pgina 213 of
6
7
8
9
10
11
12
13
14
15
Pgina 214 of
Ejercicios:
e
p
b
q
t
r
y
q
x
y
z
i
a
r
m
u
u
g
l
e
a
f
h
o
l
k
a
l
q
e
s
b
q
u
a
e
n
x
z
i
f
m
h
i
c
u
u
z
r
b
s
s
n
i
r
b
x
f
l
l
m
k
h
r
l
i
t
v
s
d
l
m
o
z
e
n
t
z
l
l
w
r
e
w
r
e
t
r
z
o
i
r
q
b
a
h
f
r
r
j
q
o
m
r
o
r
r
e
r
b
r
a
e
h
r
l
o
u
r
r
y
r
y
j
k
o
x
l
p
f
o
p
i
c
f
r
o
q
r
f
o
u
r
k
j
j
r
g
i
a
k
s
e
r
p
e
g
f
m
p
x
w
e
a
t
t
o
i
l
t
r
p
t
l
v
a
s
w
x
m
m
c
s
e
b
s
s
e
l
s
w
r
p
w
t
w
r
h
k
f
b
k
f
a
t
g
a
t
w
o
r
l
a
t
v
b
i
e
g
n
l
s
q
l
n
c
a
o
n
e
r
r
o
r
y
r
u
t
a
n
c
p
p
q
o
y
i
f
a
a
m
l
u
j
l
l
Pgina 215 of
Filas
Columnas
Relaciones
Una referencia de una clave de una tabla como una columna de otra
tabla. Esto crea una conexin entre tablas.
El Lenguaje SQL
Hoy en da, la mayora de las bases de datos relacionales usan el lenguaje SQL para
implementar la manipulacin de datos. SQL es el acrnimo 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 aos como un estndar para programacin de BD.
En la actualidad hay diversas implementaciones con pequeas diferencias entre ellas.
BASIC-256 usa SQLite como motor de Base de Datos. Puede encontrar informacin
detallada sobre SQLite y su sintaxis en su sitio Web: http://www.sqlite.org.
Pgina 216 of
12
13
14
15
16
17
18
19
20
21
# c20_createpetsdb.kbs
# crear la BD "mascotas.sqlite"
# borre BD vieja si existe
file$ = "mascotas.sqlite3"
if exists(file$) then kill(file$)
# abrir archivo de BD
# owner=dueo, pet=mascota, petname=nombre de la mascota
dbopen file$
stmt$ = "CREATE TABLE owner (owner_id INTEGER,
ownername TEXT, phonenumber TEXT, PRIMARY KEY
(owner_id));"
print stmt$
dbexecute stmt$
stmt$ = "CREATE TABLE pet (pet_id INTEGER, owner_id
INTEGER, petname TEXT, type TEXT, PRIMARY KEY
(pet_id), FOREIGN KEY (owner_id) REFERENCES owner
(owner_id));"
print stmt$
dbexecute stmt$
dbclose
print file$ + " creada OK."
end
Pgina 217 of
dbexecute sqlsentencia
Ejecuta la sentencia SQLite sqlsentencia sobre el archivo BD
SQLite abierto. No devuelve ningn valor, pero un error en tiempo de
ejecucin 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 informacin de una fila existente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# c20_addpetsdb.kbs
# agregue filas a la BD
file$ = "mascotas.sqlite3"
dbopen file$
call
call
call
call
Pgina 218 of
15
call addowner(3, "Amy", "555-4321")
16
call addpet(6, 3, "Bones", "Dog")
17
18
call addowner(4, "Dee", "555-9659")
19
call addpet(7, 4, "Sam", "Goat")
20
dbclose
21
end
22
23 subroutine addowner(owner_id, ownername$, phonenumber$)
24 stmt$ = "INSERT INTO owner (owner_id, ownername,
phonenumber) VALUES (" + owner_id + "," + chr(34) +
ownername$ + chr(34) + "," + chr(34) + phonenumber$ +
chr(34) + ");"
25 print stmt$
26 try
27
dbexecute stmt$
28
catch
29
print "No se puede agregar dueo (owner) " + owner_id + " " +
lasterrorextra
30 end try
31 end subroutine
32
33 subroutine addpet(pet_id, owner_id, petname$, type$)
34 stmt$ = "INSERT INTO pet (pet_id, owner_id,
petname, type) VALUES (" + pet_id + "," + owner_id +
"," + chr(34) + petname$ + chr(34) + "," + chr(34) +
type$ + chr(34) + ");"
35 print stmt$
36 try
37
dbexecute stmt$
38 catch
39
print "No se puede agregar mascota " + pet_id + " " + lasterrorextra
40 end try
41 endsubroutine
Programa 126: Inserta Filas en una BD
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES
(1,"Jim","555-3434");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (1,1,"Spot","Cat");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (2,1,"Fred","Cat");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (3,1,"Elvis","Cat");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES
(2,"Sue","555-8764");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (4,2,"Alfred","Dog");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (5,2,"Fido","Cat");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES
(3,"Amy","555-4321");
Pgina 219 of
# c20_updatepetsdb.kbs
# actualice una fila de la BD
dbopen "mascotas.sqlite3"
# cree y cargue datos
s$ = "UPDATE owner SET phonenumber = " + chr(34) +
"555-5555" + chr(34) + " where owner_id = 1;"
print s$
dbexecute s$
dbclose
Pgina 220 of
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 ms filas como fueron
extrados por SELECT.
Pgina 221 of
dbrow dbrow ()
Funcin para avanzar el resultado de la ltima dbopenset a la
prxima fila. Devuelve false si estamos al final de los datos
seleccionados.
Despus de un comando dbopenset y antes de que pueda leer
ningn dato, Ud. debe avanzar a la primera fila usando dbrow,
Pgina 222 of
dbint (column)
dbfloat (column)
dbstring (column)
Estas funciones devolvern datos de la corriente fila del conjunto de
registros. Ud. debe conocer el nmero de la columna numrica (basada
en cero) de los datos deseados.
dbint
dbfloat
dbstring
dbcloseset
Cierra y descarta los resultados del ltimo comando dbopenset.
# c20_rolofile.kbs
# un ejemplo de BD para mantener una lista de nros. de TE
dbopen "rolofile.sqlite3"
call createtables()
do
print
print "rolofile - phone numbers"
print "1-agregar una persona"
print "2-listado de personas"
print "3-agregar No. de telefono"
print "4-listado de Nos. de telefonos "
input "0-exit >", opcion
print
if opcion=1 then call addperson()
Pgina 223 of
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
subroutine createtables()
# incluya la clusula IF NOT EXISTS para evitar error si la
# tabla ya existe.
dbexecute "CREATE TABLE IF NOT EXISTS person
(person_id TEXT PRIMARY KEY, name TEXT);"
42 dbexecute "CREATE TABLE IF NOT EXISTS phone
(person_id TEXT, phone TEXT, type TEXT, PRIMARY KEY
(person_id, phone));"
43 end subroutine
44
45 subroutine addperson()
46 print "Agregar una Persona"
47 input "person id > ", person_id$
48 person_id$ = upper(person_id$)
49 if ispersononfile(person_id$) or person_id$ = "" then
50
print "La persona ya existe o la entrada est vaca"
51 else
52
input "person name > ", person_name$
53
if person_name$ = "" then
54
print "Por favor, ingrese el nombre"
55
else
56
dbexecute "INSERT INTO person (person_id,name)
VALUES (" + quote$(person_id$) + "," + quote$
(person_name$) + ");"
57
print person_id$ + " agregada."
58
end if
59 end if
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 224 of
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
end subroutine
subroutine addphone()
print "Agregar un Nmero de Telfono"
input "person id > ", person_id$
person_id$ = upper(person_id$)
if not ispersononfile(person_id$) then
print "La persona no existe el el archivo"
else
input "phone number > ", phone$
if phone$ = "" then
print "Por favor, ingrese un nro. de Telfono"
else
type$ = inputphonetype$()
dbexecute "INSERT INTO phone (person_id,
phone, type) values (" + quote$(person_id$) + "," +
quote$(phone$) + "," + quote$(type$) + ");"
print phone$ + " agregado."
end if
end if
end subroutine
75
76
77
78
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
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 225 of
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
Programa 129: BD para Mantener una Lista dr Nmerous Telefnicos
Pgina 226 of
Ejercicios:
y
e
t
a
e
r
c
i
d
b
r
o
w
p
l
q
s
e
q
n
u
q
d
m
x
c
z
i
x
t
a
t
p
e
b
u
o
h
g
t
b
h
p
e
d
u
s
p
d
e
c
h
c
a
o
s
a
s
t
c
b
o
o
r
t
e
m
o
t
n
r
e
o
e
l
b
e
y
l
l
e
l
i
o
p
s
u
x
s
d
j
e
n
t
n
f
e
i
m
o
o
e
t
c
s
a
g
e
n
b
n
t
l
l
p
b
r
o
x
n
s
t
m
d
c
a
z
c
o
d
x
x
e
t
t
a
b
l
e
l
w
b
s
x
t
d
f
s
d
m
u
y
f
e
y
d
d
b
i
n
t
r
e
s
n
i
m
r
m
Pgina 227 of
Coneccin Socket
Los sockets de flujo (de datos) TCP crean una conexin entre dos computadoras o
programas. Paquetes de informacin pueden ser enviados y recibidos de modo bidireccional sobre la conexin.
Para comenzar una conexin necesitamos que una computadora o programa acte como
servidor (server, esperando por una llamada) y la otra como cliente (client, para que haga
la llamada). La ilustracin 40 muestra grficamente como la conexin server/cliente se
establece.
SERVER
CLIENT
2
3
Pgina 228 of
# c21_simpleserver.kbs
# envie un mensaje al cliente sobre port 999
print "Escuchando el port 9999 en " + netaddress()
NetListen 9999
NetWrite "El server simple envi este mensaje."
NetClose
# c21_simpleclient.kbs
# conectar al server simple y obtener el mensaje
#
input "Cual es la direccin IP del server simple?", addr$
if addr$ = "" then addr$ = "127.0.0.1"
#
NetConnect addr$, 9999
print NetRead
NetClose
netaddress
netaddress ( )
Funcin que devuelve un string conteniendo el valor numrico IPv4
de la direccin de red asociada a la computadora
netlisten
netlisten
netlisten
netlisten
nro_puerto
(nro_puerto)
nro_socket, nro_puerto
(nro_socket, nro_puerto)
Pgina 229 of
netclose
netclose ( )
netclose nro_socket
netclose (nro_socket)
Cierra la conexin de red especificada (socket). Si socketnumber
no se especifica, se cerrar el socket nmero cero (0).
netwrite
netwrite
netwrite
netwrite
string
(string)
nro_socket, string
(nro_socket, string)
netconnect
netconnect
netconnect
netconnect
servername, nro_port
(servername, nro_port)
nro_socket, servername, nro_port
(nro_socket, servername, nro_port)
netread
netread ( )
netread (nro_socket)
Lee datos de la conexin de red especificada y lo devuelve como un
string. Esta funcin es bloqueante (espera hasta que un dato es
recibido). Si nro_socket no es especificado, usar el zcalo cero (0)
para la conexin.
Chat en la Red
El siguiente ejemplo agrega una nueva funcin (netdata) a las declaraciones de red que ya
hemos visto. Esta nueva funcin 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 aplicacin 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 mtodos
disponibles para permitir a un nico programa cumplir con ambos roles.
1
2
# c21_chat.kbs
# use port 9999 para chat simple
Pgina 230 of
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Pgina 231 of
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# c21_battle.kbs
# usa port 9998 para server
spritedim 4
call tanksprite(0,white)
call tanksprite(1,black)
call projectilesprite(2,blue)
call projectilesprite(3,red) # tiro
# yo
# oponente
# mi tiro
del oponente
kspace = 32
kleft = 16777234
kright = 16777236
kup = 16777235
kdown = 16777237
dr = pi / 20
dxy = 2.5
shotdxy = 5
port = 9998
print
print
print
print
# cambio de direccion
# velocidad de movimiento
# velocidad del proyectil
# puerto para comunicarse
Pgina 232 of
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
print
input "Es Ud. el server? (y or n)", mode$
if mode$ = "y" then
print "Ud. es el server. Esperando que un cliente se conecte."
NetListen port
else
input "Direccin del Server para conectarse (Intro para local host)?", addr$
if addr$ = "" then addr$ = "127.0.0.1"
NetConnect addr$, port
end if
# defina mi posicin por defecto y envesela a mi oponente
x = 100
y = 100
r=0
# projectil: posicin direccin y visible
p = false
px = 0
py = 0
pr = 0
call writeposition(x,y,r,p,px,py,pr)
# actualice la pantalla
color green
rect 0, 0, graphwidth, graphheight
spriteshow 0
spriteshow 1
spriteplace 0, x, y, 1, r
while true
# adquiera tecla apretada y mueva el tanque en pantalla
k = key
if k <> 0 then
if k = kup then
x = ( graphwidth + x + sin(r) * dxy ) % graphwidth
y = ( graphheight + y - cos(r) * dxy ) % graphheight
end if
if k = kdown then
x = ( graphwidth + x - sin(r) * dxy ) % graphwidth
y = ( graphheight + y + cos(r) * dxy ) % graphheight
end if
if k = kleft then r = r - dr
if k = kright then r = r + dr
if k = kspace then
pr = r
px = x
py = y
Pgina 233 of
73
74
75
76
77
78
79
80
81
82
83
87
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
p = true
spriteshow 2
end if
spriteplace 0, x, y, 1, r
call writeposition( x, y, r, p, px, py, pr )
if spritecollide( 0, 1 ) then
netwrite "F"
print "Ud. embisti al otro tanque y ambos murieron. Game Over."
end
end if
end if
# mueva mi proyectil (si hay uno)
if p then
px = px + sin( pr ) * shotdxy
py = py - cos( pr ) * shotdxy
spriteplace 2, px, py, 1, pr
if spritecollide( 1, 2 ) then
NetWrite "W"
print "Ud. mat a su oponente. Game over."
end
end if
if px<0 or px > graphwidth or py <0 or py> graphheight then
p = false
spritehide 2
end if
call writeposition( x, y, r, p, px, py, pr )
end if
#
# adquiera posicin desde la red y
# defina las variables de ubicacin para el oponente
# d vuelta las coordenadas como las decodificamos
while NetData()
position$ = NetRead()
while position$ <> ""
if left(position$,1) = "W" then
print "Ud. est muerto - Game Over."
end
end if
if left(position$,1) = "F" then
print "Ud. fue impactado y ambos murieron-Game Over"
end
end if
op_x = graphwidth - unpad( ref( position$ ),3)
op_y = graphheight - unpad( ref( position$ ), 3)
op_r = pi + unpad( ref( position$ ), 5)
op_p = unpad( ref( position$ ), 1)
Pgina 234 of
119
op_px = graphwidth - unpad( ref( position$ ), 3)
120
op_py = graphheight - unpad( ref( position$ ), 3)
121
op_pr = pi + unpad( ref( position$ ), 5)
122
# display opponent
123
spriteplace 1, op_x, op_y, 1, op_r
124
if op_p then
125
spriteshow 3
126
spriteplace 3, op_px, op_py, 1, op_pr
127
else
128
spritehide 3
129
end if
130
end while
131 end while
132 #
133 pause .05
134 end while
135
136 subroutine writeposition(x,y,r,p,px,py,pr)
137 position$ = lpad$( int( x ), 3 ) + lpad$( int( y ), 3 ) + lpad$( r, 5 ) + lpad$(
p, 1 ) + lpad$( int( px ), 3 ) + lpad$( int( py ), 3 ) + lpad$ ( pr, 5 )
138 NetWrite position$
139 end subroutine
140
141 function lpad$( n, l )
142 # devuelva un nmero sin espacios en blanco a la isquierda
143 s$ = left( n, l )
144 while length( s$ ) < l
145
s$ = " " + s$
146 end while
147 return s$
148 end function
149
150 function unpad( ref( l$ ), l )
151 # devuelva un nmero con un espacio eliminado al comienzo
152 # y el string acortado en 1 que es lo que se saco
153 n = float( left( l$, l ) )
154 if length( l$ ) > l then
155
l$ = mid( l$, l + 1, 99999 )
156 else
157
l$ = ""
158 end if
159 return n
160 end function
161
162 subroutine tanksprite( spritenumber , c )
163 color c
164 spritepoly spritenumber, {0,0, 7,0, 7,7, 14,7, 20,0, 26,7, 33,7, 33,0, 40,0,
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 235 of
Pgina 236 of
Ejercicios:
m
j
v
p
k
t
t
n
n
n
r
r
v
h
e
n
e
e
e
e
d
f
r
k
e
t
t
t
x
t
t
d
c
i
w
l
r
r
p
i
n
o
l
o
i
e
e
c
o
r
s
c
r
s
a
v
t
x
r
w
i
k
t
d
r
v
t
g
t
t
p
e
g
e
k
c
n
o
m
e
n
e
s
o
l
c
t
e
n
n
n
e
t
c
o
n
n
e
c
t
Pgina 237 of
Apndice A
1 Descargando el programa:
Conctese a Internet, navegue hasta el sitio http://www.basic256.org y siga el link de
descarga. Una vez que est en la pgina Sourceforge del proyecto, haga click en el botn
verde "Download Now!" (Ilustracin 41) para comenzar la descarga.
Pgina 238 of
Apndice A
2 - Instalando
Una vez finalizada la descarga del archivo (Ilustracin 43) haga click con el mouse sobre el
archivo descargado en la lista de descarga. Ver a continuacin uno o dos dilogos
preguntndole si realmente desea ejecutar el archivo (Ilustracin 44) (Ilustracin 45).
Deber presionar los botones OK o Run de esos dilogos.
Pgina 239 of
Apndice A
Pgina 240 of
Apndice A
Pgina 241 of
Apndice A
3 Iniciando BASIC-256
Ud. puede ahora buscar en Start (Inicio) > All Programs (Todos los Programas) >
(Ilustracin 51)
Pgina 242 of
Apndice B
Color
Valores RGB
Black
0, 0, 0
White
red
255, 0, 0
darkred
128, 0, 0
green
0, 255, 0
darkgreen
0, 128, 0
blue
0, 0, 255
darkblue
0, 0, 128
cyan
0, 255, 255
darkcyan
0, 128, 128
purple
255, 0, 255
darkpurple
128, 0, 128
yellow
255, 255, 0
darkyellow
128, 128, 0
orange
255, 102, 0
darkorange
176, 61, 0
gray /grey
darkgray / darkgrey
MUESTRA
clear
Pgina 243 of
Apndice C
F - 175
G - 196
A - 220
F# - 185
G# - 208
A# - 233
B 247
Middle C - 262
D - 294
C# - 277
D# - 311
E - 330
F - 349
F# - 370
G - 392
A - 440
G# - 415
A# - 466
B - 494
C - 523
D - 587
C# - 554
D# - 622
E - 659
F - 698
F# - 740
G - 784
G# - 831
A - 880
A# - 932
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 244 of
Apndice D
Tecla
Tecla
Tecla
Space
32
65
76
87
48
66
77
88
49
67
78
89
50
68
79
90
51
69
80
ESC
16777216
52
70
81
Backspace
16777219
53
71
82
Enter
16777220
54
72
83
Left Arrow
16777234
55
73
84
Up Arrow
16777235
56
74
85
Right Arrow
16777236
57
75
86
Down Arrow
16777237
Pgina 245 of
Apndice E
CHR
CHR
CHR
CHR
CHR
CHR
NUL
SYN
22
44
66
88
110
SOH
ETB
23
45
67
89
111
STX
CAN
24
46
68
90
112
ETX
EM
25
47
69
91
113
ET
SUB
26
48
70
92
114
ENQ
ESC
27
49
71
93
115
ACK
FS
28
50
72
94
116
BEL
GS
28
51
73
95
117
BS
RS
30
52
74
96
118
HT
US
31
53
75
97
119
LF
10
Space 32
54
76
98
120
VT
11
33
55
77
99
121
FF
12
"
34
56
78
100
122
CR
13
35
57
79
101
123
SO
14
36
58
80
102
124
SI
15
37
59
81
103
125
DLE
16
&
38
<
60
82
104
126
DC1
17
'
39
61
83
105
DEL
127
DC2
18
40
>
62
84
106
DC3
19
41
63
85
107
DC4
20
42
64
86
108
NAK
21
43
65
87
109
Pgina 246 of
Apndice F
cyan
dark
darkblue
darkcyan
darkgeeen
darkgray
darkgrey
darkorange
darkpurple
darkred
darkyellow
day
dbclose
dbcloseset
dbexecute
dbfloat
dbint
dbnull
dbopen
dbopenset
dbrow
dbstring
debuginfo
degrees
dim
dir
do
editvisible
else
end
endfunction
endif
endsubroutine
endtry
endwhile
eof
Pgina 247 of
Apndice F
error_arrayindex
error_arrayindexmissing
error_arraysizelarge
error_arraysizesmall
error_byref
error_byreftype
error_colornumber
error_dbcolno
error_dbconnnumber
error_dbnotopen
error_dbnotset
error_dbnotsetrow
error_dbopen
error_dbquery
error_dbsetnumber
error_divzero
error_filenotopen
error_filenumber
error_fileopen
error_filereset
error_filewrite
error_folder
error_fontsize
error_fontweight
error_for1
error_for2
error_freedb
error_freedbset
error_freefile
error_freenet
error_imagefile
error_imagesavetype
error_imagescale
error_infinity
error_logrange
error_netaccept
error_netbind
error_netconn
error_nethost
error_netnone
error_netread
error_netsock
error_netsocknumber
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
error_none
error_nonnumeric
error_nosuchvariable
error_notanumber
error_notimplemented
error_penwidth
error_permission
error_polyarray
error_polypoints
error_printernotoff
error_printernoton
error_printeropen
error_putbitformat
error_radix
error_radixstring
error_rgb
error_spritena
error_spritenumber
error_spriteslice
error_strend
error_stringmaxlen
error_strneglen
error_strstart
exists
exitdo
exitfor
exitwhile
exp
explode
explodex
false
fastgraphics
float
floor
font
for
freedb
freedbset
freefile
freenet
frombinary
fromhex
fromoctal
Pgina 248 of
Apndice F
error_netsockopt
error_netwrite
getcolor
getpenwidth
getsetting
getslice
global
gosub
goto
graphheight
graphsize
graphwidth
gray
green
grey
hour
if
imgload
imgsave
implode
include
input
instr
instrx
int
key
kill
lasterror
lasterrorextra
lasterrorline
lasterrormessage
left
length
line
log
log10
lower
md5
mid
minute
month
mouseb
mousex
mousey
msec
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
fromradix
getbrushcolor
netconnect
netdata
netlisten
netread
netwritenext
next
not
offerror
onerror
open
openb
or
orange
ostype
outputvisible
pause
penwidth
pi
pie
pixel
plot
poly
portin
portout
print
printercancel
printeroff
printeron
printerpage
purple
putslice
radians
rand
read
readbyte
readline
rect
red
redim
ref
refresh
rem
replace
Pgina 249 of
Apndice F
netaddress
netclose
return
rgb
right
say
second
seek
setsetting
sin
size
sound
spritecollide
spritedim
spriteh
spritehide
spriteload
spritemove
spriteplace
spritepoly
spriteshow
spriteslice
spritev
spritew
spritex
spritey
sqr
stamp
step
string
system
replacex
reset
tan
text
textheight
textwidth
then
throwerror
to
tobinary
tohex
tooctal
toradix
true
try
until
upper
version
volume
wavplay
wavstop
wavwait
while
white
write
writebyte
writeline
xor
year
yellow
Pgina 250 of
Apndice G
ERROR_NONE
ERROR_FOR1
ERROR_FOR2
ERROR_FILENUMBER
ERROR_FILEOPEN
ERROR_FILENOTOPEN
"Archivo no abierto."
ERROR_FILEWRITE
ERROR_FILERESET
10
ERROR_ARRAYSIZELARGE
11
ERROR_ARRAYSIZESMALL
12
ERROR_NOSUCHVARIABLE
"Variable desconocida"
15
ERROR_ARRAYINDEX
16
ERROR_STRNEGLEN
17
ERROR_STRSTART
18
ERROR_STREND
19
ERROR_NONNUMERIC
20
ERROR_RGB
21
ERROR_PUTBITFORMAT
22
ERROR_POLYARRAY
23
ERROR_POLYPOINTS
24
ERROR_IMAGEFILE
25
ERROR_SPRITENUMBER
26
ERROR_SPRITENA
27
ERROR_SPRITESLICE
28
ERROR_FOLDER
Pgina 251 of
Apndice G
29
ERROR_INFINITY
30
ERROR_DBOPEN
31
ERROR_DBQUERY
32
ERROR_DBNOTOPEN
33
ERROR_DBCOLNO
34
ERROR_DBNOTSET
35
ERROR_TYPECONV
36
ERROR_NETSOCK
37
ERROR_NETHOST
38
ERROR_NETCONN
39
ERROR_NETREAD
40
ERROR_NETNONE
41
ERROR_NETWRITE
42
ERROR_NETSOCKOPT
43
ERROR_NETBIND
44
ERROR_NETACCEPT
45
ERROR_NETSOCKNUMBER
46
ERROR_PERMISSION
47
ERROR_IMAGESAVETYPE
50
ERROR_DIVZERO
51
ERROR_BYREF
52
ERROR_BYREFTYPE
53
ERROR_FREEFILE
54
ERROR_FREENET
55
ERROR_FREEDB
56
ERROR_DBCONNNUMBER
Pgina 252 of
Apndice G
57
ERROR_FREEDBSET
58
ERROR_DBSETNUMBER
59
ERROR_DBNOTSETROW
60
ERROR_PENWIDTH
61
ERROR_COLORNUMBER
62
ERROR_ARRAYINDEXMISSING
63
ERROR_IMAGESCALE
64
ERROR_FONTSIZE
65
ERROR_FONTWEIGHT
66
ERROR_RADIXSTRING
67
ERROR_RADIX
68
ERROR_LOGRANGE
69
ERROR_STRINGMAXLEN
70
ERROR_NOTANUMBER
71
ERROR_PRINTERNOTON
72
ERROR_PRINTERNOTOFF
73
ERROR_PRINTEROPEN
65535 ERROR_NOTIMPLEMENTED
WARNING #
65537
Pgina 253 of
Apndice H
Apndice H: Glosario
Lista de trminos usados en este libro.
algoritmo (algorithm)
Un proceso paso a paso para resolver el problema
ngulo (angle)
Un ngulo es formado cuando dos segmentos de recta comienzan en el mismo punto en el
plano. La medida de un ngulo es la cantidad de rotacin de una lnea respecto a la otra en
el plano, expresada usualmente en grados o radianes.
argumento (argument)
Un dato incluido en una declaracin o un llamado a una funcin usado para pasar
informacin. En BASIC-256, los argumentos NO son cambiados por la declaracin o la
funcin.
arreglo (array)
Una coleccin de datos, guardada en la memoria de la computadora, que es accedida o
referenciada por uno o ms ndices enteros. Ver tambin arreglo numrico, arreglo unidimensional, arreglo bi-dimensional y string array.
ASCII
Acronismo por American Standard Code for Information Interchange (Cdigo Americano
Estndar para Intercambio de Informacin). Define un cdigo numrico usado para
representar letras y smbolos usados en el lenguaje Ingls. Ver tambin Unicode.
asncrono (asynchronous)
Procesos o eventos pasando uno despus de otro.
Pgina 254 of
Apndice H
constante (constant)
Un valor que no puede ser cambiado.
declaracin (statement)
A single complete action. Statements perform something and do not return a value.
entero (integer)
Un valor numrico sin punto decimal. Tpicamente tiene un rango de -2.147.483.648 a
2.147.483.647.
falso (false)
Valor booleano representando NO VERDADERO. En BASIC-256 es realmente un nombre
para representar el entero cero (0). Ver tambin Algebra Booleana (Boolean Algebra) y
verdadero (true).
fuente (Font)
Un estilo de dibujar letras
frecuencia (frequency)
El nmero de ocurrencias de un evento en un especificado perodo de tiempo (Ver tambin
hertz).
funcin (function)
Un tipo especial de declaracin en BASIC-256 que puede tomar como entrada cero o mas
valores, hacer clculos y devolver informacin 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 tambin ngulo y radian.
hertz (hz)
Unidad de frecuencia en ciclos por segundo. En honor al fsico alemn Heinrich Hertz. Ver
tambin frecuencia.
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 255 of
Apndice H
lista (list)
Una coleccin 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 parntesis ({}).
operador (operator)
Acta sobre una o ms piezas de datos para efectuar una accin.
pixel
El punto ms pequeo identificable en una pantalla de computadora.
pseudocdigo (pseudocode)
Descripcin de lo que un programa necesita hacer en un lenguaje natural (no de
computadora) La palabra contiene el prefijo pseudo que significa falso y cdigo por
lenguaje de computacin
punto (point)
Unidad de medida usada para el tamao de texto. 1 punto = 1/72". Un carcter definido en
12 puntos tendr 12/72" or 1/6" de alto.
Puerto (port)
Un nmero definido por software usado para crear y comunicarse con un zcalo (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 tambin ngulo y
grados.
radio (radius)
Distancia de un crculo a su centro. Tambien la mitad del dmetro del circulo
RGB
Acronismo por Red Green Blue (Rojo-Verde-Azul).
rtulo (label)
Un nombre asociado a un lugar especfico (lnea) de un programa. Usado para efectuar un
saldo con las sentencias GOTO y GOSUB.
sincrnico (synchronous)
Ocurriendo al mismo tiempo
Pgina 256 of
Apndice H
sprite
Una imagen que es integrada en una escena grfica.
SQL
Acrnimo para Structured Query Language (Lenguaje de Consulta Estructurado). SQL es el
lenguaje ms usado para operar datos en una base de datos relacional.
string
Una secuencia de caracteres (letras, nmeros y smbolos). Son definidas colocndola entre
comillas (").
string array
Un conjunto o arreglo de strings.
string empty
Un string sin ningn carcter y longitud cero (0).
(quotation marks) (""). Ver tambin 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 cdigo o porcin de un programa largo que efecta una tarea especfica
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 tambin Algebra Booleana (Boolean Algebra) y falso
(false).
Unicode
Estndar moderno usado para representar caracteres y smbolos de todos los lenguajes
del mundo como nmeros enteros.
variable (variable)
Una ubicacin con nombre en la memoria de la computadora que puede ser cambiada o
alterada.
zcalo (Socket)
Un terminal por software que permite la comunicacin bi-direccional (2 way) en una red
2014James M. Reneau (CC BY-NC-SA 3.0 US)
258
Traduccin al castellano por Oswy (Mayo 2014)
Pgina 257 of
Apndice H
Pgina 258 of