Mostrando entradas con la etiqueta Basic. Mostrar todas las entradas
Mostrando entradas con la etiqueta Basic. Mostrar todas las entradas

martes, 26 de noviembre de 2013

Introducción a la programación usando BASIC (VII): CONTANTES, READ/DATA/RESTORE

Artículo publicado en el número 7 de RetroWiki Magazine

CONTANTES, READ/DATA/RESTORE

Una constante es un valor que no cambiará a lo largo de la ejecución del programa, en BASIC no existe la definición de constantes, pero se pueden simular usando variables. Pongo un ejemplo de un conversor de grados a radianes, para lo que usaremos el valor de PI, y luego guardaremos el valor de la relación entre grados y radianes. Una vez calculados estos valores, no cambiarán ya en el resto del programa:


10 REM Constantes 
20 LET PI=3.1416 
30 LET RD=180/PI 
40 INPUT "Valor en grados: ",G 
50 IF (G=0) THEN STOP 
60 LET R=G/RD 
70 PRINT G;" grados son ";R;" radianes" 
80 PRINT



En BASIC existe otro mecanismo para definir valores que no cambian a lo largo de la ejecución, la instrucción DATA permite acceso secuencial a datos, es una especie de almacén en el que almacenar cosas, con la limitación de que solo se pueden ver de una en una y una tras otra.

Ejemplo sencillo, pedimos una fecha y la imprimimos en formato texto con el nombre del mes en lugar de su número:

100 REM IMPRESION DE FECHAS
110 INPUT "Dia: ";D
120 IF (D=0) THEN STOP
130 IF (D<1 or="">31) THEN PRINT "Dia no valido" : GOTO 110
140 INPUT "Mes: ";M
150 IF (M=0) THEN STOP
160 IF (M<1 or="">31) THEN PRINT "Mes no valido" : GOTO 140
170 INPUT "Año: ";A
180 IF (A=0) THEN STOP
190 LET M$=""
200 RESTORE 400
210 FOR I=1 TO M
220   READ M$
230 NEXT I
240 PRINT : PRINT "Fecha: ";D; " de ";M$;" de ";A
250 PRINT : PRINT
260 GOTO 110
400 DATA "Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto"
410 DATA "Septiembre","Octubre","Noviembre","Diciembre"


El programa pide primero día, mes y año, si se deja a cero cualquiera el programa termina, si se introduce un día o mes fuera de rango también termina. Luego pone en blanco la variable m$ (ojo, existe una variable llamada m y otra llamada m$, son diferentes y no tienen nada que ver entre sí, lo he hecho así para que se vea claramente este tema). Llama a la instrucción RESTORE, que vuelve a poner a cero el contador interno para los DATA, lee el número de meses indicado en la variable m el data correspondiente, la primera vez que pasa por el bucle lee “Enero”, la segunda vez lee “Febrero”, y así sucesivamente. El resultado de la ejecución del programa es este:


Pensemos que lo vamos a hacer multi formato o multi idioma, es muy sencillo el cambio, ya que la instrucción RESTORE tiene como opción la línea a partir de la cual empezamos a leer datos, por lo que solos necesario tener dos secuencias de DATA

100 REM IMPRESION DE FECHAS 
110 INPUT "Dia: ";D 
120 IF (D=0) THEN STOP 
130 IF (D<1) OR (D>31) THEN PRINT "Dia no válido" : GOTO 110
140 INPUT "Mes: ";M 
150 IF (M=0) THEN STOP 
160 IF (M<1) OR (M>31) THEN PRINT "Mes no válido" : GOTO 140
170 INPUT "Año: ";A 
180 IF (A=0) THEN STOP 
190 INPUT "Formato (C/L): ",F$ 
200 IF (F$="l") THEN F$="L" 
210 IF (F$="c") THEN F$="C" 
211 IF (F$<>"L") AND (F$<>"C") THEN PRINT "Formato no válido" : GOTO 190 
220 REM Proceso ------------------------------- 
230 LET M$="" 
240 IF (F$="L") THEN RESTORE 400 
241 IF (F$="C") THEN RESTORE 420 
250 FOR I=1 TO
260   READ M$ 
270 NEXT
280 PRINT : PRINT "Fecha: ";D; " de ";M$;" de ";A 
290 PRINT : PRINT 
300 GOTO 110 
310 REM Datos ------------------------------- 
400 DATA "Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto" 
410 DATA "Septiembre","Octubre","Noviembre","Diciembre" 
420 DATA "Ene","Feb","Mar","Abr","May","Jun" 430 DATA "Jul","Ago","Sep","Oct","Nov","Dic"


Este programa es muy similar al anterior, solo que pide una variable adicional con el tipo de formato, la pone en mayúsculas para evitar comparaciones, y según su valor usa una u otra línea de DATA 




Avanzamos con el BASIC, ir probando cosas de los DATA, que ofrecen un mecanismo sencillo para almacenar cosas en el propio programa.

 Jose Antonio Vaqué Urbaneja, podéis
contactar conmigo en mi mail

viernes, 4 de octubre de 2013

Introducción a la programación usando BASIC (VI): BUCLES ANIDADOS


Artículo publicado en el número 6 de RetroWiki Magazine

BUCLES ANIDADOS.

Los bucles FOR son sencillos de usar, y podemos anidar unos dentro de otros sin problemas, para crear estructuras que recorran varias variables a la vez. Como primer ejemplo muy sencillo crearé un programa que imprime las tablas de multiplicar:

10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30 PRINT "Tabla del ";I
40 FOR J=1 TO 10
50 PRINT " ";I;"x";J;"=";I*J
60 NEXT J
70 PRINT
80 NEXT I

Vemos que recorremos en I desde 1, imprimimos la cabecera de la tabla, luego recorremos J desde 1 hasta 10, imprimimos la tabla multiplicando I por J, aumentamos I en uno, y volvemos a empezar con la cabecera y recorriendo J de 1 a 10, y así hasta que I alcance 9. Para mejorar la lectura, los bucles se indentan, y así es más sencillo leer el programa, así que lo reescribo de esta manera:
10 PRINT "Tablas de multiplicar"
20 FOR I=1 TO 9
30    PRINT "Tabla del ";I
40    FOR J=1 TO 10
50       PRINT " ";I;"x";J;"=";I*J
60    NEXT J
70 PRINT
80 NEXT I


El programa es el mismo, pero así es más sencillo leerlo. Lo importante es que se entienda que el bucle interno, el que recorre J, siempre empieza en 1 cada vez que llega a la instrucción FOR, es un concepto que suele costar de entender a los principiantes.

El resultado de la ejecución del programa no es muy bonito, ya que imprime 100 líneas en la pantalla:



Lo mejoraremos, imprimiendo varias tablas en horizontal, así caben más a la vez en la pantalla, para ello usaremos la instrucción STEP del bucle:
100 PRINT "Tablas de multiplicar"
110 LET C=5
120 FOR I=1 TO 9 STEP C
130    GOSUB 210
140    FOR J=1 TO 10
150       GOSUB 270
160    NEXT J
170    PRINT
180 NEXT I
190 IF (INKEY$="") THEN GOTO 190
200 STOP
210 REM ----- Imprimir la cabecera -------------------------
220 LET A=80/C
230 FOR K=1 TO C
240    PRINT TAB(A*(K-1)); "Tabla del ";I+(K-1);
250 NEXT K
260 RETURN
270 REM ----- Imprimir la linea ----------------------------
280 PRINT
290 LET A=80/C
300 FOR K=0 TO C-1
310    PRINT TAB(A*K); I+K;"x";J;"=";(I+K)*J;
320 NEXT K
330 RETURN


Empezamos definiendo en C las columnas que deseamos tener en la pantalla, para que quepan en una sola usaremos 5 columnas, pero podéis jugar con esta variable y ver las diferencias. Luego un bucle de 1 a 9 de C en C, imprimimos la cabecera con GOSUB 210, luego un bucle de 1 a 10 e imprimimos las líneas con otro GOSUB 270. No es necesario hacer esta separación, pero el programa queda más compacto y legible, además de que podemos cambiar de manera sencilla la parte de la cabecera o de las líneas, debéis pensar en hacer los programas lo más modulares posibles, es una buena técnica de programación.

Para imprimir la cabecera dividimos el ancho de la pantalla (80 columnas) entre las tablas que vamos a imprimir, así tenemos el ancho de cada tabla (80/5=16). Montamos un bucle desde 1 hasta las columnas a montar, e imprimimos las cabeceras, para ello usaremos I que nos da la base, y K-1 para recorrer desde 0 hasta 4, así tendremos I+0, I+1, I+2, I+3, I+4.

Para imprimir las líneas usamos lo mismo, pero recorremos el bucle desde 0 hasta 4 directamente, y así no tenemos que ir restando uno cada vez. Ambos sistemas son equivalentes, podéis usar el que más os guste o el que mas claro veais.

Ahora el resultado es mejor caben 10 tablas en una sola pantalla, pero ojo, ¿el bucle no era de 1 hasta 9?, pues sí pero realmente recorre I haciendo igual a 1 y hace el primer ciclo de 5 tablas, 1+5=6 y hace el segundo ciclo de 5 tablas, y luego 6+5=11 y salimos del bucle por pasarnos de 9, por tanto realmente solo recorre dos valores al usar un STEP (1 y 6), no los 9 indicados, o los 10 que se imprimem, esto lo he puesto así para que se entienda mejor su uso. Probar con varios valores de C y lo entenderéis mejor.



Adelante, escribir el programa, mejorarlo, probar cosas, solo se aprende a programar programando, por tanto no dejéis de buscar problemas sencillos de programación y solucionarlos con nuestro querido BASIC.



Jose Antonio Vaqué Urbaneja,
podéis contactar conmigo en mi mail

sábado, 29 de diciembre de 2012

Introducción a la programación usando BASIC (V): FOR y GOSUB


Artículo publicado en el número 5 de RetroWiki Magazine

BUCLES y SUBRUTINAS.

En este artículos presento los bucles y el manejo de las subrutinas, con esto simplificamos el manejo del control del programa, sin usar tantas sentencias GOTO.

BUCLES FOR

Una vez hemos repasado las sentencias IF y GOTO, que son las básicas para el manejo del programa, en esta entrada veremos dos que nos simplificarán su manejo, haciendo que el propio programa realice el control.

Un bucle es un trozo del programa que se ejecuta repetidamente, al final del bucle una sentencia GOTO nos retorna al principio, y en cualquier momento podemos salir de él usando otros GOTO. Vamos a hacer un bucle que nos calcule el factorial de un número, sabemos que el factorial de un número (que se marca con el símbolo de admiración) es el producto de los números entre 1 y el número que estamos calculando, así el factorial de 5 es:
5! = 5.4.3.2.1 = 120


100 REM --------------------------------------------------------
110 REM - Calculo de factoriales, JAVaqué‚ 2012                -
120 REM --------------------------------------------------------
130 CLS: INPUT "Número: ";N              :REM Pedimos el número mero
140 IF (N>=0) THEN GOTO 170             :REM No para negativos
150 PRINT "ERROR: No se puede calcular el factorial de un negativo"
160 GOTO 240                            :REM Ir al final
170 LET R=1                             :REM R será el resultado
180 IF (N=0) THEN GOTO 230              :REM El factorial de 0 es uno
190 LET S=1                             :REM En S lo que multiplicamos
200 LET R=S*R                           :REM Multiplicamos anterior
210 LET S=S+1                           :REM Sumamos 1 al número
220 IF (S<=N) THEN GOTO 200             :REM Mientras no sea mayor
230 PRINT ,N;"! = ";R                   :REM El resultado
240 PRINT : PRINT                       :REM Dejamos línea en blanco
250 INPUT "¿Otro? (S/N): ";O$           :REM Preguntamos si seguimos
260 PRINT : PRINT                       :REM Dejamos línea en blanco
270 IF (O$="S") OR (O$="s") GOTO 130    :REM Si es si seguimos
280 IF (O$="N") OR (O$="n") GOTO 310    :REM Si es no salimos
290 PRINT "Responda S o N" : GOTO 240   :REM Repetir pregunta
310 PRINT "Fin del programa"

La parte marcada en verde es la inicialización de las variables necesarias, en R tendremos el resultado, lo empezamos en uno ya que lo usamos multiplicando (si fuera sumando empezaríamos en cero), en S ponemos un contador hasta el número, empezamos a contar en uno. Luego en rojo el bucle, multiplicamos el resultado anterior por el contador del número, le sumamos uno al número, y se repite mientras no lleguemos a superar el número. Para entender mejor un bucle se usan diagramas de valores de variables, en el que se expresa como van cambiando las variables del programa a lo largo del tiempo, con un valor de ejemplo:

Paso Valor de N Valor de R Valor de S
130 INPUT N
<Se pide el número>
5 Indeterminado Indeterminado
170 LET R=1 5 1 Indeterminado
180 IF (N=0) THEN GOTO 230
<NO es 0, comienza el bucle>
5 1 Indeterminado
190 LET S=1 5 1 1
PASO 1 POR EL BUCLE
200 LET R=S*R 5 1 1
210 LET S=S+1 5 1 2
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 1 2
PASO 2 POR EL BUCLE
200 LET R=S*R 5 2 2
210 LET S=S+1 5 2 3
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 2 3
PASO 3 POR EL BUCLE
200 LET R=S*R 5 6 3
210 LET S=S+1 5 6 4
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 6 4
PASO 4 POR EL BUCLE
200 LET R=S*R 5 24 4
210 LET S=S+1 5 24 5
220 IF (S<=N) THEN GOTO 200
<Es menos, seguir el bucle>
5 24 5
PASO 5 POR EL BUCLE
200 LET R=S*R 5 120 5
210 LET S=S+1 5 120 6
220 IF (S<=N) THEN GOTO 200
<Es mayor, fin del bucle>
5 120 6


Podemos simplificar esto usando la sentencia FOR - NEXT, que es el bucle usado en el BASIC para realizar estas labores. Es un bucle automático, en el que una variable va aumentando (o disminuyendo) su valor de forma automática. Veamos como cambiar las 6 líneas anteriores por
170 LET R=1                  :REM En R tendremos el resultado
180 IF (N=0) THEN GOTO 230   :REM El factorial de cero es uno
190 FOR S=1 TO N             :REM Bucle desde 1 hasta el valor de N
200   LET R=S*R              :REM Multiplicamos por el anterior
220 NEXT S                   :REM Repetir el bucle

Es muy similar, pero nos ahorramos inicializar el valor de S e ir comparando, el bucle se repite de forma automática, la sintaxis es FOR variable = inicial TO final [STEP suma] en el que usamos una variable por su nombre, que partirá de un valor inicial, y se irá sumando el valor indicado por STEP, hasta que se sobrepase al valor final, momento en que se sale del bucle
Paso Valor de N Valor de R Valor de S
130 INPUT N
<Se pide el número>
5 Indeterminado Indeterminado
170 LET R=1 5 1 Indeterminado
180 IF (N=0) THEN GOTO 230
<NO es 0, comienza el bucle>
5 1 Indeterminado
190 FOR S=1 TO N 5 1 1
PASO 1 POR EL BUCLE      
200 LET R=S*R 5 1 1
220 NEXT S
<Es menos, seguir el bucle>
5 1 2
PASO 2 POR EL BUCLE      
200 LET R=S*R 5 2 2
220 NEXT S
<Es menos, seguir el bucle>
5 2 3
PASO 3 POR EL BUCLE      
< 200 LET R=S*R 5 6 3
220 NEXT S
<Es menos, seguir el bucle>
5 6 4
PASO 4 POR EL BUCLE      
200   LET R=S*R 5 24 4
220 NEXT S
<Es menos, seguir el bucle>
5 24 5
PASO 5 POR EL BUCLE      
200 LET R=S*R 5 120 5
220 NEXT S
<Es mayor, fin del bucle>
5 120 6

Podemos usar STEP para indicar decremento, usando un valor negativo de incremento, si queremos usar bucle que empiece por 10 y llegue hasta 1 decrementando de uno en uno, usaremos FOR i=10 TO 1 STEP -1.

Podemos usar STEP para indicar que cuente de n en n, no tiene por qué ser uno, por ejemplo sumaremos todos los números múltiplos de 2 menores de cien, usaremos un bucle FOR i=0 TO 99 STEP 2, lo que hará un bucle  con los valores 0,0+2=2, 2+2=4, 4+2=6, etc. Si queremos multiplicar todos los números múltiplos de 13 menores de 130 inclusive, podemos usar FOR i=130 TO 0 STEP -13 (lo que dará 130, 117, 104,…, 13, 0) o bien FOR i=0 TO 130 STEP 13 (lo que dará 0, 13, 26,…, 117, 130).

En versiones más modernas del BASIC existen otras instrucciones de control de bucle, pero solo el FOR está disponible en todas las versiones de BASIC de nuestras máquinas.

Subrutinas

La sentencia GOTO hemos visto que transfiere la ejecución del programa a otra parte del mismo, y si queremos regresar a donde estábamos debemos usar otro GOTO. Para evitar este mecanismo, podemos usar el manejo de subrutinas, que nos ayudará en la definición de partes del programa reutilizables en otros programas, usando las instrucciones GOSUB y RETURN.

Una subrutina es un trozo del programa que se ejecuta por si mismo, de manera independiente del resto del programa, y que podemos llamar cuando queramos, devolviendo el control al punto donde la hemos llamado de forma automática, sin necesidad de sabe desde que punto la hemos llamado. Voy ha convertir nuestro programa de cálculo de factoriales en una subrutina, y nos dará la diferencia entre el factorial de dos números:

100 REM -------------------------------------------------------------
110 REM - Calculo de diferencia de dos factoriales, JAVaqué 2012    -
120 REM -------------------------------------------------------------
130 INPUT "Primer Número: ";N        :REM Pedimos el primer número
140 GOSUB 1000                       :REM Llamamos a la subrutina
150 IF (R=-1) THEN GOTO 130          :REM No para negativos
160 LET N1=N : LET F1=R              :REM Guardamos el valor
170 INPUT "Segundo Número: ";N       :REM Pedimos el segundo número
180 GOSUB 1000                       :REM Llamamos a la subrutina
190 IF (R=-1) THEN GOTO 130          :REM No para negativos
200 LET N2=N : LET F2=R              :REM Guardamos el valor
210 PRINT ,N1;"! (";F1;")- ";N2;"! (";F2;") = ";F1-F2 
220 PRINT : PRINT                    :REM Dejamos línea en blanco
230 INPUT "¨Otro? (S/N): ";O$        :REM Preguntamos si seguimos o no
240 PRINT : PRINT                    :REM Dejamos línea en blanco
250 IF (O$="S") OR (O$="s") GOTO 130 :REM Si es si seguimos
260 IF (O$="N") OR (O$="n") GOTO 280 :REM Si es no salimos
270 PRINT "Responda S o N": GOTO 220 :REM Si no es si o no repetir pregunta
280 PRINT "Fin del programa"
290 STOP                             :REM Necesario para finalizar
1000 REM -------------------------------------------------------------
1010 REM - Subrutina de cálculo de un facTOrial.                     -
1020 REM - Pasamos en N el número a calcular                         -
1030 REM - Retorna en F el factorial, o -1 si no puede calcularlo    -
1040 REM -------------------------------------------------------------
1050 IF (N>=0) THEN GOTO 1090       :REM No para negativos
1060 PRINT "ERROR: No se puede calcular el factorial de un negativo"
1070 LET R=-1                       :REM Marcamos el error
1080 RETURN                         :REM Salimos
1090 LET R=1                        :REM En R tendremos el resultado
1100 FOR S=1 TO N                   :REM Bule de 1 a N
1110   LET R=S*R                    :REM Multiplicamos por el anterior
1120 NEXT S                         :REM Bucle
1130 RETURN                         :REM Salimos

Tras pedir el primer número, llamamos a la nueva subrutina en la línea en verde usando GOSUB nro_de_linea, esto equivale a hacer GOTO 1000, y hacemos el cálculo del número factorial. Si el número es negativo ponemos el resultado como -1 indicando error y retornamos a la llamada usando la instrucción RETURN, que en este caso sería como hacer un GOTO 150. Si el número es correcto, calculamos el factorial  y al final volvemos con otro RETURN, lo que nuevamente sería equivalente a hacer un GOTO 150. Luego pedimos el segundo número, y llamamos nuevamente a la subrutina, lo que equivale a hacer un GOTO 1000, pero cuando finalice la subrutina con el RETURN primero o con el segundo, hará esta vez un GOTO 190, por lo que podemos usar la misma subrutina desde dos partes de nuestro programa, sin preocuparnos de desde donde se llame, cuando finalice continúa el programa por donde estaba, lo que es una gran ventaja, ya que no hay que preocuparse de donde era ese lugar. 

Solo existe una limitación, hay una pila de llamadas a subrutinas, en donde el programa guarda la dirección de retorno de la misma, y esta pila tiene un tamaño limitado, dependiendo de la versión del BASIC serán mas o menos, el mínimo creo que son 7, por lo que no podemos usar llamadas anidadas a subrutinas en muchos niveles, para evitar esto. Por otro lado, siempre que se pueda es mejor hacer un salto a una subrutina que poner muchos GOTO, ya que mejora la legibilidad del programa, sobre todo pensando que se puede salir de una subrutina desde cualquier parte, sin pensar a donde regresamos, evitando muchos GOTO a la misma línea.

En esta entrada hemos aprendido a manejar los bucles FOR y las subrutinas. En la próxima entrada seguiré con los bucles hablando de bucles anidados, y mejoraré el control del programa usando ON GOTO y ON GOSUB (que no son del primer BASIC pero si están en casi todos), y mejoraré nuestra calculadora. Luego nos queda DEF FN y READ/DATA para terminar el repaso de los comandos estándar. Animaros a teclear estos programas y a idear nuevos, entenderlo bien, e intentar mejorarlo, solo se aprende a programar programando.


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog

miércoles, 29 de agosto de 2012

Introducción a la programación usando BASIC (IV): Cadenas, GOTO

Artículo publicado en el número 4 de RetroWiki Magazine

CONTROL DEL PROGRAMA Y MANEJO DE CADENAS. EJEMPLO: CALCULADORA

En la entrada anterior presentamos la instrucción básica de control del programa, la sentencia IF condición THEN acción, que junto al uso del GOTO permite realizar cualquier programa, mas adelante usaremos otras sentencias de control, que agilizan el manejo del programa, pero vamos a centrar esta entrada en estas dos, junto con instrucciones de manejo de cadenas, para hacer una nueva versión de la calculadora.

Vamos a hacer una calculadora que nos pregunte que operación deseamos usar, la escribamos en una solo línea, la analice y la ejecute. Así podemos poner “3+2-7” y debe darnos como resultado -2. De momento usaremos solo operaciones sencillas, ya iremos ampliando. Iremos por partes (al final el programa completo)


100 REM ********************************************************
110 REM Calculadora. J.A.Vaque 2011
120 REM ********************************************************
130 REM
140 REM ********************************************************
150 REM Presentar la pantalla
160 REM ********************************************************
170 CLS
180 PRINT "Calculadora simple. Version 3.0"
190 PRINT "*******************************"
200 PRINT
210 REM Introducir valores
220 PRINT "Introduzca la operación a efectuar: ";
230 INPUT P$
240 IF (P$="FIN") OR (P$="fin") OR (P$="Fin") THEN GOTO 680


La primera parte es sencilla, empieza por comentarios que ponemos el nombre del programa, el autor y la fecha. Luego presenta la pantalla inicial entre las líneas 140 y 200, seguido de la pregunta principal, el INPUT en que se guarda el valor de lo introducido en la variable P$. Lo primero es analizar esa cadena, si hemos elegido “FIN” acaba el programa. Por ejemplo podemos escribir la expresión 32-23*2
 
250 REM ********************************************************
260 REM Analizamos la cadena. Inicializamos valores necesarios
270 REM ********************************************************
280 LET NUM=0
290 LET RES=0
300 LET O$=""
310 REM ********************************************************
320 REM Analizamos la cadena. Analizar y ejecutar
330 REM ********************************************************
340 IF LEN(P$)=0 THEN GOTO 520
350 LET C$=LEFT$(P$,1)
360 LET P$=RIGHT$(P$,LEN(P$)-1)
370 LET OK=0
380 IF (C$&gt;="0") AND (C$&lt;="9") THEN GOTO 460
390 IF (C$="+") OR (C$="-") OR (C$="*") OR (C$="/") THEN GOTO 520
400 IF OK=1 THEN GOTO 340
410 PRINT "Error en la cadena analizada"
420 STOP

Ya tenemos en la variable P$ una cadena con una operación, podemos empezar a analizarla, para lo que primero inicializamos tres variables que nos controlarán el proceso, en NUM iremos guardando los números que vamos leyendo, en nuestro ejemplo 32, 23 y 2. En la variable RES guardaremos el resultado final de la operación. En la variable O$ guardaremos la operación a efectuar, en nuestro ejemplo menos y por.

Empieza el análisis en la línea 340, para lo que vamos sacando caracteres de la cadena P$, y el proceso finalizará cuando la cadena esté vacía. En ese momento tenemos que ejecutar la última operación que tengamos pendiente con el último número que tengamos encontrado. Eso es lo que hacemos en la línea 340, cuando ya hemos terminado de analizar saltamos a la operación.

Luego en la línea 350 guardamos el primer carácter de la cadena en la variable C$, para lo que usamos una operación de cadenas, LEFT$(cadena, longitud) extrae de una cadena los caracteres de su izquierda con la longitud que indiquemos. En la línea 360 quitamos el primer carácter de la cadena, usando la operación contraria, RIGHT$(cadena, longitud) extrae de la cadena los últimos caracteres por su derecha. Para ello usamos la función LEN(cadena), que nos retorna la longitud total de la cadena, y al restarle uno sacamos los caracteres de la cadena menos el primero.

NOTA: En el Spectrum no existe LEFT$ ni RIGHT$, en su lugar se usa Cadena$(ini TO fin), en donde Cadena es una variable, ini es la posición inicial, fin la final, si no se indica inicial es desde el principio, si no se indica final es hasta el fin. Por eso hay que cambiar esas dos líneas para que ponga:


350 LET C$=P$(1 TO 1)
360 LET P$=P$(2 TO)

En la línea 370 ponemos un indicador, que nos dirá si los siguientes procesos han encontrado un carácter correcto. Si el carácter a analizar es un número, en la línea 380 lo vemos y enviamos a la línea 460, donde está la rutina en que montará los números. Si es una operación, la línea 390 la reconoce y envía a la rutina que ejecuta la operación. Ambas rutinas cambian el indicador de carácter correcto encontrado, si no lo han hecho el carácter no es bueno, y en las líneas 400 a 420 parar el programa.

430 REM ********************************************************
440 REM Guardarse el numero
450 REM ********************************************************
460 LET OK=1
470 LET NUM=NUM*10+VAL(C$)
480 GOTO 340
490 REM ********************************************************
500 REM Ejecutar la operacion
510 REM ********************************************************
520 LET OK=1
530 IF (O$&lt;&gt;"") THEN GOTO 560
540 LET RES = NUM
550 GOTO 600
560 IF (O$="+") THEN RES = RES + NUM
570 IF (O$="-") THEN RES = RES - NUM
580 IF (O$="*") THEN RES = RES * NUM
590 IF (O$="/") AND (NUM&lt;&gt;0) THEN RES = RES / NUM
600 LET O$=C$
610 LET NUM=0
620 IF (LEN(P$)&lt;&gt;0) THEN GOTO 340
630 REM ********************************************************
640 REM presentar el resultado
650 REM ********************************************************
660 PRINT "Resultado: ";RES
670 GOTO 200
671 REM ********************************************************
672 REM Final del programa
673 REM ********************************************************
680 PRINT
690 PRINT "Fin del programa"
700 PRINT

Nos quedan tres rutinas, la que guarda el número que hemos encontrado está entre las líneas 460 y 480, solo pone el indicador de correcto, y luego añade el dígito al número que llevamos, para lo que solo tienes que multiplicar lo que llevamos por 10 y sumarle el número encontrado. Como el número encontrado es un carácter, debe convertirse en número, para ello usamos la función VAL(cadena), que nos devuelve el valor numérico de una cadena de caracteres.

La rutina de análisis de la operación primero pone el indicador de correcto, y luego mira si ya tenemos una operación, si es la primera, entonces solo hay que guardarse el número que hemos encontrado hasta el momento como el primer resultado y saltamos a las parte que guarda la operación para después en O$, borra el número encontrado para comenzar el siguiente, y mientras queda cadena, sigue procesando. Si ya hay una operación, salta a la línea 560, en la que primero hay que ejecutar la operación anterior, que tenemos guardada en O$, luego guardamos la operación, borramos el número, y mientras quede cadena seguir procesando.

Lo último es la rutina que está entre la línea 660 que presenta el resultado, y luego volvemos a empezar pidiendo otras operaciones, y entre las líneas 680 y 700 está el final del programa.

Control de errores

La línea 590 contiene un control de errores, como no se puede dividir por cero, antes de realizar esa operación se verifica que sea posible, si no es posible no se hace. El uso del indicador y el error de las líneas 400 a 420 es otro tipo de control de errores, ambos son necesarios para que el programa no se pare por errores.

En esta entrada hemos reforzado el uso de las instrucciones IF y GOTO, hemos aprendido algunas funciones de manejo de cadenas, y hemos usado un pequeño control de errores, mejorando la calculadora básica. En la próxima entrada seguiremos con control del programa, mejoraremos esta calculadora usando otras funciones de control de flujo. Animaros a teclear este programa, entenderlo bien, e intentar mejorarlo, solo se aprende a programar programando.



Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog


EL PROGRAMA COMPLETO


100 REM ******************************************************
110 REM Calculadora. J.A.Vaqué 2011
120 REM ******************************************************
130 REM
140 REM ******************************************************
150 REM Presentar la pantalla
160 REM ******************************************************
170 CLS
180 PRINT "Calculadora simple. Version 3.0"
190 PRINT "*******************************"
200 PRINT
210 REM Introducir valores
220 PRINT "Introduzca la operación a efectuar: ";
230 INPUT P$
240 IF (P$="FIN") OR (P$="fin") OR (P$="Fin") THEN GOTO 680
250 REM ******************************************************
260 REM Analizamos la cadena. Inicializamos valores necesarios
270 REM ******************************************************
280 LET NUM=0
290 LET RES=0
300 LET O$=""
310 REM ******************************************************
320 REM Analizamos la cadena. Analizar y ejecutar
330 REM ******************************************************
340 IF LEN(P$)=0 THEN GOTO 520
350 LET C$=LEFT$(P$,1)
360 LET P$=RIGHT$(P$,LEN(P$)-1)
370 LET OK=0
380 IF (C$&lt;="0") AND (C$&gt;="9") THEN GOTO 460
390 IF (C$="+") OR (C$="-") OR (C$="*") OR (C$="/") THEN GOTO 520
400 IF OK=1 THEN GOTO 340
410 PRINT "Error en la cadena analizada"
420 STOP
430 REM ******************************************************
440 REM Guardarse el número
450 REM ******************************************************
460 LET OK=1
470 LET NUM=NUM*10+VAL(C$)
480 GOTO 340
490 REM ******************************************************
500 REM Ejecutar la operación
510 REM ******************************************************
520 LET OK=1
530 IF O$&lt;&gt; "" THEN GOTO 560
540 LET RES = NUM
550 GOTO 600
560 IF (O$="+") THEN LET RES = RES + NUM
570 IF (O$="-") THEN LET RES = RES - NUM
580 IF (O$="*") THEN LET RES = RES * NUM
590 IF (O$="/") AND (NUM&lt;&gt;0) THEN LET RES = RES / NUM
600 LET O$=C$
610 LET NUM=0
620 IF LEN(P$)&lt;&gt;0 THEN GOTO 340
630 REM ******************************************************
640 REM presentar el resultado
650 REM ******************************************************
660 PRINT "Resultado: ";RES
670 GOTO 200
671 REM ******************************************************
672 REM Final del programa
673 REM ******************************************************
680 PRINT
690 PRINT "Fin del programa"
700 PRINT

jueves, 26 de abril de 2012

Introducción a la programación usando BASIC (III): IF

Artículo publicado en el número 3 de RetroWiki Magazine

CONTROL DEL PROGRAMA. EJEMPLO: CALCULADORA SIMPLE


NOTA: Los programas los verifico en un Spectrum y en GWBasic, pero al usar solo instrucciones estándar del BASIC, deben funcionar en cualquier máquina, si tenéis cualquier problema, contactar conmigo y os pasaré las correcciones necesarias para vuestra máquina.

En la entrada anterior presentamos la entrada/salida, con las instrucciones INPUT y PRINT, y el uso general de variables, pero el programa se iba ejecutando siempre linealmente, siguiendo lo que se denomina su flujo. Cualquier alteración en el recorrido del programa se denomina un control del flujo, y es lo que veremos en este artículo.

La instrucción de control de flujo más sencilla es el IF, que tiene una pregunta, y en función de si se cumple o no hace una u otra cosa. La sintaxis de esta instrucción es IF condición THEN acción:

  • Condición es una pregunta, si el resultado de la pregunta se cumple (es cierto), entonces se ejecuta la acción, si no se cumple (es falso), entonces se pasa directamente a la siguiente línea del programa. Por ejemplo la pregunta puede ser si el contenido de variable es igual a un valor o al contenido de otra variable, si es diferente, si es mayor o menor.
  • Acción es una instrucción que se ejecutará solo si se cumple la condición. Hay versiones del BASIC que permiten ejecutar varias instrucciones, como el Spectrum.
Vamos con un ejemplo, que es lo más sencillo para aclarar las cosas, pediremos dos números y una operación, y en función de ella sacaremos el resultado:

100 REM ---------------------------
110 REM Calculadora. J.A.Vaque 2011
120 REM ---------------------------
130 REM
140 REM Preparar la pantalla
150 CLS
160 PRINT "Calculadora simple. Version 2.0"
170 PRINT"*******************************"
180 PRINT
190 REM Introducir valores
200 PRINT "Introduzca el primer valor: ";
210 INPUT valor1
220 PRINT
230 PRINT "Introduzca el segundo valor: ";
240 INPUT valor2
250 PRINT
260 PRINT "Que operacion desea (1=+, 2=-, 3=*, 4=/): ";
270 INPUT operacion
280 PRINT
290 PRINT
300 REM Presentar el resultado
310 IF operacion=1 THEN PRINT "Suma: "; valor1+valor2
320 IF operacion=2 THEN PRINT "Resta: "; valor1-valor2
330 IF operacion=3 THEN PRINT"Producto: "; valor1*valor2
340 IF operacion=4 THEN PRINT "Division: “; valor1/valor2


En la línea 260 pedimos un número, que representa la operación a ejecutar, y luego en las líneas 310 a 340 preguntamos si la operación introducida es la que espero, entonces imprimo el resultado, si no es la que espero no hago nada. Podemos hacer lo mismo con resultados alfabético, solo cambia esto (recordar que en el Spectrum hay que poner o$ en lugar de operacion$):


260 PRINT "Que operacion desea (+ - * /): ";
270 INPUT o$
280 PRINT
290 PRINT
300 REM Presentar el resultado
310 IF o$=”+” THEN PRINT "Suma: "; valor1+valor2
320 IF o$=”-“ THEN PRINT "Resta: "; valor1-valor2
330 IF o$=”*” THEN PRINT "Producto: "; valor1*valor2
340 IF o$=”/” THEN PRINT "Division: valor1/valor2

La instrucción tiene una variante, IF condición THEN acción1 ELSE acción2, se ejecuta la acción1 si se cumple la condición, o la acción 2 si no se cumple. Por ejemplo podemos usar:

     IF numero > 5 THEN PRINT “Mayor” ELSE PRINT “Menor”

Hasta ahora el programa se ejecuta una vez, y luego hay que dar otro RUN para volver a empezar, podemos usar otra instrucción de control de flujo para hacer que el programa vuelva a empezar, que es GOTO línea, en donde línea es una de las líneas del programa, esto hace que el flujo se desvíe hasta la línea indicada y siga la ejecución por esa línea. Hagamos algo sencillo, tras la operación preguntará si deseamos seguir o terminar, si queremos seguir, mediante un GOTO “saltaremos” al inicio de nuevo:

100 REM ---------------------------
110 REM Calculadora. J.A.Vaque 2011
120 REM ---------------------------
130 REM
140 REM Preparar la pantalla
150 CLS
160 PRINT "Calculadora simple. Version 2.0"
170 PRINT "*******************************"
180 PRINT
190 REM Introducir valores
200 PRINT "Introduzca el primer valor: ";
210 INPUT valor1
220 PRINT
230 PRINT "Introduzca el segundo valor: ";
240 INPUT valor2
250 PRINT
260 PRINT "Que operación desea (+ - * /): ";
270 INPUT o$
280 PRINT
290 PRINT
300 REM Presentar el resultado
310 IF o$=”+” THEN PRINT "Suma: "; valor1+valor2
320 IF o$=”-“ THEN PRINT "Resta: "; valor1-valor2
330 IF o$=”*” THEN PRINT "Producto: "; valor1*valor2
340 IF o$=”/” THEN PRINT "Division: “; valor1/valor2
350 REM Preguntar si seguir o acabar
360 PRINT
370 PRINT
380 PRINT “Desea continuar (S/N)?: “;
390 INPUT s$
400 IF s$=”S” THEN GOTO 180
410 PRINT
420 PRINT “Fin del programa”
430 STOP

Esto es lo que se denomina un bucle, el programa se repite hasta que algo le hace salir del bucle, un bucle se puede ejecutar una vez, varias veces, o indefinidamente, lo único que hay que controlar es que los bucles tengan una salida, si no puede que se queden ejecutando algo indefinidamente, y el programa no acabe nunca, es lo que se denomina un bucle infinito.

Una forma de salir de un bucle es terminar el programa. En este ejemplo he terminado el programa con una instrucción STOP en la última línea, esta instrucción hace que el programa finalice, no es necesaria ponerla si el programa finaliza cuando terminan las líneas, como en este caso, pero más adelante la usaremos para terminar el programa a mitad. Y siempre es bueno tener una disciplina de programación.

En la próxima entrada seguiré con el control de flujo mediante el IF, explotaremos más el GOTO, hablaré del control de errores, y haremos nuestra calculadora un poco más funcional.

Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en mi mail o ver más cosas en mi blog

miércoles, 21 de marzo de 2012

Introducción a la programación usando BASIC (II): Variables, INPUT y PRINT

Artículo publicado en el número 2 de RetroWiki Magazine

Entrada/Salida. Variables. Primer programa: Calculadora


NOTA DE SINTAXIS: Lo que sea propio de la programación estará en negrita, y las palabras propias del BASIC estarán siempre en mayúsculas y negrita. Todo lo que esté en azul dentro del texto hay que escribirlo literalmente (en el Spectrum gomas ya sabéis que no se escribe así, en otro artículo hablaré del por qué). Los listados de los programas estarán en recuadros. La respuesta del ordenador dentro del texto estará en verde, a no ser que sean imágenes de la pantalla que aparecerán en cuadros. Las pulsaciones de teclas aparecerán en rojo.

En el primer artículo puse una referencia del lenguaje, y un pequeño ejemplo para abrir boca, en los cursos ahora se empieza con teoría, seudocódigo, y cosas más académicas como el lenguaje de definición de la sintaxis, pero como la única forma de aprender a programar es programando, vamos a aprender a programar programando, y para nuestro primer programa elegiré hacer una calculadora, lo que nos ayudará con los conceptos básicos sobre variables y el control del programa, e iré poco a poco ampliando la funcionalidad.

El BASIC es interpretado, eso significa que cuando escribimos algo, el sistema responde a todo lo que se escribe. Si es una sentencia la ejecuta inmediatamente, si comienza por un número añade esa línea al programa, si es un comando lo ejecuta. Usaremos esto para nuestras primeras operaciones, por ejemplo si escribimos PRINT 25*3 y pulsamos el INTRO o ENTER, se ejecuta, y vemos en la pantalla el resultado 75 mientras que si escribimos PRINT 25/3 aparece 8,3333333 (el número de ceros puede variar dependiendo de la máquina).

Así podemos jugar un poco con nuestra primera instrucción PRINT, que lo único que hace es mostrar en la pantalla los resultados de lo que le digamos. Vemos que el sistema puede trabajar con los 4 operadores matemáticos básicos (+ suma, - resta, * multiplica, / divide), luego añadiremos alguno.
Si vamos a empezar un programa, primero pensemos lo que queremos, vamos a hacer que el sistema nos solicite dos números, una operación, y nos muestre el resultado en la pantalla. Los números que introducimos los debemos guardar en un sitio, pues si no los tenemos almacenados no podemos usarlos. Los almacenes de valores se denominan variables. Una variable tiene un nombre propio, y este nombre estará compuesto por hasta 8 caracteres, números o letras, pero siempre debe empezar por una letra. A ese nombre se le puede añadir el carácter $ para indicar que su contenido será alfabético, si no será un valor numérico. RESTRICCION: En el BASIC del Spectrum las variables de tipo cadenas solo pueden tener en su nombre una letra, o una letra seguida de un número, mientras que si alguno es el afortunado poseedor de una máquina mucho más antigua, todas las variables serán solo de una letra, o una letra seguida de un número.

Para introducir valores en el sistema por el teclado usaremos la instrucción INPUT, que es un poco lo contrario del PRINT, cuya sintaxis es INPUT nombre_variable. El sistema se para, pone un indicador en la pantalla (generalmente un interrogante aunque en el Spectrum no saca nada), y se queda esperando que introduzcamos un valor. Así si escribimos INPUT prueba y pulsamos ENTER, aparece un interrogante, si escribimos 3.5 le estamos introduciendo el valor tres coma cinco (recordar que el sistema inglés usa el punto como nosotros la coma decimal, y usa la coma como separador de millares como usamos nosotros el punto). No veremos nada en pantalla, o recibimos un mensaje de OK, pero ya ha guardado ese valor en una variable, que se llama nro. Si ahora escribimos PRINT prueba aparece en pantalla el valor de la variable, por tanto aparece en pantalla 3.5  

Punto importante, los valores de las variables no se pierden hasta que les demos otro valor, o reseteemos el aparato, lo apaguemos, o si escribimos el comando NEW y damos ENTER (hacerlo), que limpia la memoria y elimina el programa que tengamos en ese momento. Si tras esta limpieza escribimos PRINT prueba aparece un mensaje de error, indicando que no hay ninguna variable que se denomine prueba en el sistema, o cero en algunos sistemas como el Amstrad.

Ahora ya podemos poner la sintaxis completa de la instrucción de impresión que es PRINT valores en donde valores puede ser:
  • Una variable (se presenta tu contenido)
  • Una contante, que a su vez puede ser o bien un número que escribimos tal cual, o una cadena de caracteres alfabética, cuyas letras deben ponerse entre las comillas dobles, para que el sistema sepa lo que es, por ejemplo “hola”
  • El resultado de una expresión, como hemos usado antes al poner 25/3, se presenta su evaluación.
  • O una combinación de varios valores, que debemos separar o bien por un punto y coma, o bien por una coma simple. Si usamos el punto y coma se imprimen uno tras otro, si usamos la coma, el resultado se presenta en la próxima parada de tabulación (una tabulación cada 8 caracteres de la pantalla generalmente, pero depende del sistema en que programemos).
Veremos esto, si escribimos PRINT 1,2;3 aparece en la pantalla 1                 23 vemos que presenta el valor 1, una serie de espacios, el valor 2, y unido el valor 3. Si escribimos PRINT “hola”,”hola”;”hola” aparece en la pantalla hola                holahola

Vamos con el primer programa, pediremos dos números, y presentamos el resultado de su suma, resta, producto y división. Si lo tecleamos, veremos que con esto tan sencillo hemos empezado a recibir datos, y cada vez que pulsamos RUN nos pide los dos números y presenta el resultado. Solo que es un poco lio lo que se presenta en la pantalla, por tanto lo mejoraremos un poco.

10 INPUT valor1
20 INPUT valor2
30 PRINT valor1+valor2
40 PRINT valor1-valor2
50 PRINT valor1*valor2
60 PRINT valor1/valor2



Lo primero es comentar que vamos a hacer, para lo que usaremos la sentencia REM, que lo que hace es introducir un comentario en el listado del programa. Luego lo que haremos es presentar cosas en pantalla, solicitar dos números, dando mensajes que le permitan saber al usuario qué hacer, y luego pondremos el resultado de las cuatro operaciones con ambos números. No es mucho mejor, pero creo que si es mucho más claro para el usuario, y los programas los ejecutan usuarios, no siempre los propios programadores.

Este es nuestro nuevo programa, primero hay que teclear NEW, y a continuacion introducimos este programa:

100 REM --------------------------------
110 REM - Calculadora. J.A. Vaque 2011 -
120 REM --------------------------------
130 PRINT "Calculadora simple. Versión 1.0"
140 PRINT "*******************************"
150 PRINT
160 PRINT "Introduzca el primer valor: ";
170 INPUT valor1
180 PRINT
190 PRINT "Introduzca el segundo valor: ";
200 INPUT valor2
210 PRINT
220 PRINT
230 PRINT "Suma....: "; valor1+valor2
240 PRINT "Resta...: "; valor1-valor2
250 PRINT "Producto: "; valor1*valor2
260 PRINT "cociente: "; valor1/valor2

Las líneas 100 a 120 son comentarios, las 130 a 150 ponen lo que hace el programa. De la 160 a la 200 introducimos valores, ojo que la 160 y la 190 deben acabar en punto y coma, para que el input salga en la misma línea (salvo en el Spectrum que los input van en la última línea siempre). La 210 separa el input de los resultados, y la 220 separa un poco más, dejando una línea en blanco. Y por último las 230 a 260 presentan el resultado. Cada vez que la ejecutamos vemos cómo se va ejecutando, pero no queda una pantalla muy elegante, añadiremos la línea 125 CLS y vemos que se limpia la pantalla antes de cada ejecución, por lo que queda un poco mejor. 


Animaros a ir probando cosas, meter más INPUTS y PRINT, poner y quitar comas y puntos y coma, jugar un poco con los valores. Por ejemplo, os propongo algo sencillo, podéis poner también los resultados inversos, en lugar de primero mas segundo, segundo más primero, y ver que operaciones son conmutativas y cuáles no.
Saliendo del BASIC estándar, hay una forma de alterar la posición donde imprime o lee en la pantalla, con la sintaxis PRINT TAB (columna, línea); valores esto posiciona el cursor en el punto indicado mediante columna y línea, y luego imprime en la pantalla a partir de ese punto. Hay una variante que es usar la sentencia AT columna, línea lo que posiciona el cursor, y luego podemos ya usar el PRINT normalmente.
En la entrada muchas versiones del BASIC permiten añadir en el INPUT una cadena de caracteres, que se imprime como si hubiésemos usado un PRINT previo, y nos permiten ahorrar instrucciones, por ejemplo podemos poner INPUT “Introduce un número”; n

En el próximo capítulo veremos las sentencias de control, y seguiremos ampliando esta sencilla calculadora en el próximo número, pero es importante ir poco a poco y asentar conceptos. Si tenéis cualquier duda, en los foros de RetroWiki o en mi mail os las solucionaré.

Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en
javu61@gmail.com o ver más cosas en old8bits.blogspot.com

martes, 20 de marzo de 2012

Introducción a la programación usando BASIC (I): Hola mundo

Artículo publicado en el número 1 de RetroWiki Magazine

Una característica común a casi todos nuestros sistemas retro es que cuando arrancan disponen de una versión del BASIC con la que podemos trabajar. En estos artículos partiremos de cero, aprendiendo como se programa usando el más querido, uno de los más usados, y a la vez el más denostado lenguaje de la historia.

Pequeña historia del BASIC

Los primeros lenguajes ampliamente difundidos fueron el FORTAN (1957) y el COBOL (1960). El primer lenguaje diseñado académicamente fue el ALGOL (1959) padre de todos los lenguajes estructurados, mientras que el primer lenguaje funcional fue LISP (1958). Todos estos adolecían del problema de que necesitaban bastantes recursos de máquina para el desarrollo, compilación y ejecución del programa.

En 1964 John Kemeny y Thomas Kurtz en la prestigiosa universidad de Dartmouth de Estados Unidos idearon un lenguaje más sencillo el Beginner's All-purpose Symbolic Instruction Code (Principiantes - Propósito general – Código de Instrucciones Simbólicas), lo que le permitía ejecutarse en una terminal de ordenador de forma interactiva con el usuario, sin necesidad de grandes requerimientos de hardware. Inicialmente el BASIC también era un lenguaje compilado, pero rápidamente se convirtió en uno interpretado, aumentando su manejabilidad.El lenguaje se inspiró en la sintaxis del FORTAN, aunque con alguna característica del ALGOL. No fue un lenguaje popular en sus inicios, aunque por su sencillez fue portado a muchas máquinas, hasta que en 1975 se incluyó en el primer ordenador popular de la historia, el Altair 8080. Esta versión fue llamada Altair Basic, y fue el primer producto de Microsoft, cuyos inicios fueron desarrollar versiones del Basic que estaban incluidas en las ROM de máquinas como el Apple II, los primeros IBM PC, o posteriormente el MSX Basic.

Características básicas

El BASIC de nuestros aparatos es muy similar en cuanto a sintaxis, pero hay diferencias en cuanto a las funciones que incluye cada uno. En este artículo usaré características del BASIC original, el más simple, que son comunes a todas las versiones, aunque los ejemplos los he escrito en GWBASIC por comodidad, la primera versión de Microsoft para MSDOS.

Variables

Una variable es un contenedor de información, que tiene dos propiedades, un nombre y un tipo de contenido, y almacena cierta información. Solo existen dos tipos de variables en BASIC, los números (ya sean enteros o reales) y las cadenas de caracteres. Hay versiones en que se diferencia entre variables enteras y reales, ya que las operaciones con enteros son mucho más rápidas que las operaciones con reales, pero ordenadores como el Spectrum no lo hacen, y por eso su BASIC es uno de los más lentos. Los nombres de las variables solo podían tener una letra, o una letra seguida de un número, y las variables de tipo cadena de caracteres deben añadir a su nombre el símbolo $ para distinguirlas. Esta característica fue pronto ampliada, y normalmente los nombres de las variables pueden tener hasta 8 caracteres de largo, pero en versiones “profesionales” como las de NIXDORF se mantiene una sola letra, y en los Spectrum las variables de cadena de caracteres solo pueden tener una letra en su nombre.

Sentencias

El BASIC tiene muy pocas sentencias, por lo que es muy sencillo de aprender a manejar, esta es la lista de las clásicas, luego se han ido añadiendo, pero no usaremos más que estas.


REM Comentarios

DEF Definir funciones de una sola línea

DIM Tamaño de los arreglos

END / STOP Final del programa

LET / = Asignación de datos a variables

INPUT / PRINT Entrada y salida por pantalla y teclado

IF / THEN / ELSE Condicionales

FOR / NEXT Bucles

GOTO Salto incondicional

GOSUB / RETURN Salto a una subrutina

DATA Manejo de datos estáticos
En todos los sistemas existe también CLS (CLear Screen) este es un comando que no estaba entre los originales, permite borrar la pantalla completamente. En algunos sistemas se usa CLEAR en su lugar.

Operadores

Tampoco cuenta con una lista muy amplia de operadores, que podemos agrupar entre cinco operadores aritméticos (realizan operaciones aritméticas entre variables numéricas) que son:


+ para sumar

- para restar o invertir el signo

* para multiplicar

/ para dividir (puede ser división entera en ciertas versiones)

^ o ** para la exponenciación (el símbolo depende de la versión del Basic)

También existen otros seis operadores lógicos (se usan en los condicionales) que son

= para idicar igual

<> para indicar no igual (diferente)

< para indicar menor

<= para indicar menor o igual

> para indicar mayor

>= para indicar mayor o igual
Los operadores se evalúan normalmente de izquierda a derecha, pero se puede alterar ese orden usando paréntesis. Aunque no estaba inicialmente definido, se utiliza el + para concatenar cadenas de caracteres.

Funciones

Cada versión de BASIC aporta un conjunto propio de funciones, y es lo que más diferencia unas versiones de otras. Esta es una lista de las definidas en el BASIC original:

SQR Raíz cuadrada

ABS Valor absoluto de un número (el número sin su signo)

INT Parte entera de un número

RND Devuelve un número real al azar entre 0 y 1

SIN / COS / TAN / ATN Seno, Coseno, Tangente y Arco tangente (en radianes)

EXP, LOG Exponencial (ex) y Logaritmo natural

A esto añadiremos la función LEN$ que nos da la longitud de una cadena de caracteres.

Comandos

El intérprete reconoce las líneas que comienzan por un número, asumiendo que son líneas del programa. Si se escribe un número y una sentencia que no exista, se añade al programa, si ya existe se reemplaza. Si solo se indica el número se borra la línea. Además, hay una serie de comandos que nos ayudan a la edición y ejecución del programa. Esta parte también cambia de uno a otro equipo, pero en general encontramos estos comandos:

RUN Ejecuta el programa

LIST Lista todas las líneas del programa, se puede añadir desde y hasta línea

LIST n Lista las líneas del programa desde la linea n en adelante

LIST n,m Lista las líneas del programa desde la linea n hasta la m

EDIT n Edita la línea n

NEW Borra todo el programa de la memoria

DELETE n Borra la línea n del programa

DELETE n,m Borra las líneas de la n a la m incluidas

RENUM Renumera las líneas del programa

Primer programa

Nuestro primer programa será el típico Hello World, la primera vez que oí hablar de él fue relacionado con la primera vez que pusieron en marcha el primer prototipo de MAC, tras un día de arreglos por fin consiguieron ese texto en la pantalla.Como BASIC es un sistema interpretado, cualquier cosa que escribamos la interpreta como un comando y la ejecuta. Es muy útil si queremos hacer cosas que no son del BASIC, sino del intérprete de comandos, como limpiar la pantalla, para lo que usaremos CLS o CLEAR según la versión del BASIC. Si escribimos PRINT “Hola mundo”, en la siguiente línea aparecerá Hola mundo. Si lo que queremos es escribir un programa, solo debemos comenzar con un número entero, ese será el número de la línea, y nos servirá para referirnos a ella durante la edición o ejecución del programa. Si escribimos 10 PRINT “Hola mundo”, no sale nada en la pantalla, o en algunos equipos, como el Spectrum, se ve esta línea al principio de la pantalla. Pero si hacemos un LIST, veremos la lista de sentencias que tenemos introducidas. Si introducimos el comando RUN se ejecuta el programa y aparece el mensaje.

Mejorando el programa

Una buena práctica es poner comentarios a los programas, para luego mejorar su lectura, y borrar la pantalla antes de empezar, para que se vea mejor lo que presentamos. El programa termina cuando no hay más líneas, pero es conveniente añadir un final. Vamos a ello, añadiremos las siguientes sentencias, primero haremos un CLS para borrar la pantalla y un NEW para borrar todo. Si hacemos un LIST veremos que no hay nada. Introducimos este programa:

10 REM Este es un ejemplo de Hola Mundo en BASIC
20 CLS
30 PRINT “Hola mundo”
40 END

Si hacemos un LIST vemos las líneas. Si hacemos un RUN vemos el resultado.


Mejoremos el programa, en lugar de saludar a todo el mundo, haremos que nos salude a nosotros. Para ello pediremos que nos introduzcan nuestro nombre, y saludaremos con él. También informaremos de que se ha acabado el programa. Para ello añadiremos estas líneas:

25 PRINT “Introduzca du nombre: “
26 INPUT N$
35 PRINT “Hola “;N$
36 PRINT “Hola “,N$
37 PRINT
38 PRINT “FIN DEL PROGRAMA”
39 PRINT

Hemos añadido unas líneas entre las existentes, por eso se numeran las líneas de 10 en 10, para poder añadir nuevas líneas intermedias. Si ejecutamos, obtenemos este resultado:

Vemos la diferencia entre las líneas 35 y 36, al separar los elementos del PRINT por un punto y coma, se imprimen juntos, si separamos por una coma, se va a la próxima parada de tabulación. Vemos que cada PRINT va en una línea, y que el INPUT muestra un interrogante. Añadamos un punto y coma al final de la línea 25, en este caso el INPUTse ejecuta en la misma línea.Estos ejemplos deben funcionar en cualquier BASIC, seguiré en próximos artículos con esta introducción a la programación usando nuestro querido BASIC, siempre usando pequeños programas de ejemplo. 


Jose Antonio Vaqué Urbaneja, podéis contactar conmigo en