Todo sobre: VAL y VAL$ Este texto reune todas mis notas sobre las funciones VAL y VAL$ y todo lo relacionado con las mismas, ya sea existentes en otros BASICs o en el Basic Sinclair, asi como sus equivalentes y diferencias en el ZX SPECTRUM. VAL sintaxis= VAL(v$) donde: v$= una constante o variable de cadena conteniendo un número función que extrae o convierte el valor dentro de una cadena a un número válido. Casos válidos son: Ejemplo 1: 10 LET A$="10": PRINT VAL(A$) Ejemplo 2: 100 LET XX=VAL("2500") Ejemplo 3: PRINT VAL(" 100 ") Pero en el caso de que no sean números: Ejemplo 4: 10 LET A$=" ": PRINT VAL(A$) Atari, Amstrad CPC y Spectrun darán error. Apple ][, BBC y C=64 devolverán cero. Ejemplo 5: 10 LET A$="": PRINT VAL(A$) Atari, BBC y Spectrun darán error. Apple ][, Amstrad CPC y C=64 devolverán cero. Ejemplo 6: PRINT VAL("AA2") La gran mayoría de versiones de BASIC devolverán cero, menos el Spectrum que buscará verificar si es un nombre de variable válido. Ejemplo 7: PRINT VAL("100AA") Todos o casi todos los BASICs extraerán el valor numérico e ignorarán las letras o lo que siga a continuación. El Spectrum da error. En el caso del ejemplo 3 vemos que el Basic generalmente ignora los espacios y extrae solo el número. VAL en el Spectrum sintaxis= VAL v$ donde: v$= una constante o variable de cadena contieniendo exclusivamente un número VAL como extractr de valores numéricos Los ejemplos 1 al 3 son válidos para el Spectrum. Pero los ejemplos 3 al 6 hay que evitarlos mediante una rutina que depure y elimine los espacios y caracteres que no sean dígitos válidos. VAL como evaluador de expresiones Esta es una exclusividad del Basic Sinclair. Imposible en otros BASICs. Ejemplo 8: PRINT VAL("100*AA") Si la variable AA existe devolverá el valor de su multiplicación por 100, de lo contrario dará error de variable no hallada. Debido a su capacidad de evaluar expresiones que incluyen no solo números sino también variables, cálculos y funciones, VAL puede considerarse como la más potente, versatil y útil de todas las funciones que tiene el Spectrum y por ello la más usada por quienes programan en Basic Sinclair. VAL$ sintaxis= VAL$ v$ donde: v$= una constante o variable de cadena contieniendo otra(s) cadena(s) Exclusividad del Basic Sinclair, inexistente en otros BASICs. A diferencia de VAL que opera con números, VAL$ opera solamente con cadenas, su argumento parámetro es una cadena y nos devuelve a su vez otra cadena, en cambio dará error si no fuera así. Curiosamente, el manual del Spectrum es muy parco en cuanto a ejemplos del uso de esta función, reduciendolo a solamente extraer cadenas de dentro de muchas comillas. Incluso dice textualmente que es "probablemente menos util", dejando al usuario buscarle una utilidad o abandonarlo a falta de mayores explicaciones y aplicaciones. Ejemplos tomados del manual: VAL$ """chocolate"""" = "chocolate" LET a$="99": PRINT VAL$ "a$" Tomando esos ejemplos como base, vamos a ver cual sería un uso realmente práctico de VAL$. Y para ello vamos a ver la creación de una especie de ON ...PRINT. Convirtiendo del BASIC estandar al más puro Basic Sinclair 10 INPUT N 20 ON N GOTO 100,200,300,400 30 ... 100 PRINT "ESTA ES LA OPCION 1":GOTO 10 200 PRINT "LA SEGUNDA OPCION":GOTO 10 300 PRINT "AHORA LA TERCERA":GOTO 10 400 PRINT "Y LA CUARTA":GOTO 10 En el ejemplo tenemos muchos PRINTs y GOTOs. Pasamos a la sigte. alternativa: (la de los BASICs sin ON GOTO) 10 INPUT N 30 ... 100 IF N=1 THEN PRINT "ESTA ES LA OPCION 1" 200 IF N=2 THEN PRINT "LA SEGUNDA OPCION" 300 IF N=3 THEN PRINT "AHORA LA TERCERA" 400 IF N=4 THEN PRINT "Y LA CUARTA" Ya no hay GOTOs pero en cambio hay muchos IF y PRINTs. Veamos otra opción: 100 DATA "ESTA ES LA OPCION 1","LA SEGUNDA OPCION","AHORA LA TERCERA", "Y LA CUARTA" 110 FOR N=1TO4:READ C$(N):NEXT N 120 INPUT N 130 PRINT C$(N) Esto ya no es nada repetitivo, pero en el Spectrum falta añadirle DIM c$( 4,19). Incluso podemos retipearlo todo como: 120 INPUT N 130 PRINT ("ESTA ES LA OPCION 1" AND N=1)+("LA SEGUNDA OPCION" AND N=2)+("AHORA LA TERCERA" AND N=3)+("Y LA CUARTA" AND N=4) Ahora llegamos finalmente al VAL$ que nos interesa con el sigte. cambio: 100 LET A$="ESTA ES LA OPCION 1" 110 LET B$="LA SEGUNDA OPCION" 120 LET C$="AHORA LA TERCERA" 130 LET D$="Y LA CUARTA" 140 INPUT N 150 PRINT VAL$("A$B$C$D$"(N*2-1 TO N*2)) Como se ve, en el Spectrum tenemos no uno, sino cinco formas de hacer lo mismo, siendo el último más Spectrumniano y Sinclairiano que este ON PRINT ya no puede haber. Tras repasar los ejemplos 3 y 5 que di, decidí que podía actualizar este texto añadiendole un ejemplo más del uso de VAL$: en un menú. Empecemos con el método INPUT numérico y READ-DATA. 10 REM menú de carga de subprogramas 20 DATA "matemats","lenguaje","historia","fisica","quimica","artes" 30 DIM c$(6,8):RESTORE 40 FOR N=1 TO 6:READ C$(N) 50 PRINT N;"-";C$(N): NEXT N 60 INPUT "Elija opción 1 - 6 ";N: IF N=0 THEN STOP 70 IF N>6 OR N<1 THEN GOTO 60 80 LOAD C$(N) Y a continuación lo convertimos a un INPUT alfanumérico con VAL$: 100 LET A$="matemats": LET B$="lenguaje" 110 LET C$="historia": LET D$="fisica" 120 LET E$="quimica": LET F$="artes" 130 FOR N=65 TO 70: LET Z$=CHR$ N 140 PRINT Z$;"-";VAL$(Z$+"$"): NEXT N 150 INPUT "Elija opción A - F ";Z$: IF Z$="" THEN STOP 160 IF Z$>"F" OR Z$<"A" THEN GOTO 150 170 LOAD VAL$(Z$+"$") Así que sí, hay que ingeniarselas para poder encontrarle un buen uso a VAL$, a diferencia de VAL. (c)2020 - 2021 zx_if1@hotmail.com