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

No hay comentarios:

Publicar un comentario