018:trucos

Microhobby 18. Año II, del 05 al 11 de marzo de 1985

Proponemos una manera, sencilla y rápida, de acceder a distintos segmentos del programa estructurados como subrutinas mediante la elección de un número.

El método es crear una variable de cadena conteniendo todos los números de línea a los que queremos bifurcar cuando se cumpla una determinada condición (pulsar una tecla, cierto valor de una variable, etc…)

Luego, realizamos un cálculo de dónde se encuentra el número de línea que interesa, basándonos en la condición y en la longitud de las líneas (dada por la variable step); a continuación, fragmentamos la cadena (a$) y enviamos el control del programa a un sitio determinado mediante la función VAL.

El cometido de la variable step es permitirnos utilizar líneas de salto de los caracteres que queramos; por ejemplo, si nuestro programa no va a bifurcar más allá de la línea 90, podríamos construir a$ como a$ = «6090» y asignar a step el valor 2.

Naturalmente, esta manera de enfocar el problema es igualmente válida para la sentencia GOTO.

10 LET a$ = "01000200030004000500"
15 LET step =4: LET SUP = 0: LET inf = sup
20 INPUT num
25 IF num < 1 OR num > LEN a$ / step then go to 20
30 LET sup = num * step
32 let inf = sup - step + num = 1)
35 go sub val a$ (inf TO sup)
40 stop
100 print 1: return
200 print 2: return
300 print 3: return
400 print 4: return
500 print 5: return

Todos aquellos que se interesen por las aplicaciones científico-técnicas del Spectrum, utilizándolo como una sofisticada calculadora programable, se habrán topado, en alguna ocasión, con la necesidad de calcuar potencias de números o funciones.

El problema se presenta cuando queremos calcular potencias de números negativos, expresiones del tipo —32.

Si intentamos el cálculo en comando directo, nos encontraremos con la sorpresa de que el resultado es -9 (¡) en lugar de +9; para aumentar más aún la confusión, realizando este cálculo en modo programa, normalmente se obtiene un mensaje de error del tipo «argumento no valido», con la consiguiente detención del programa.

El programa 1 evidencia este hecho y le permitirá experimentar con los posibles valores de la base (x) y del exponente (y). El programa 2, propone una manera alternativa de solucionar el problema; en líneas generales, realiza lo siguiente:

Línea 20: detecta si la base es o no menor que cero.

Línea 30: si es negativo, informa de ello y asigna a a$ el carácter «-» para su posterior impresión.

Línea 50: convierte «resultado» a una cadena alfanumérica para poder incluir el signo «-» si la base es menor que cero.

Línea 100: Dependiendo de si la base es o no negativa, borra la pantalla.

No se ha tenido en cuenta el que el exponente sea par o impar a la hora de mostrar el resultado; el método para tenerlo en cuenta sería el mismo.

5 REM *** PROGRAMA 1 ***
10 INPUT x, y
20 PRINT x^y
30 GO TO 10
5 REM *** PROGRAMA 2 ***
6 LET a$ = "  ": LET r$ = a$: LET x=0 : LET y=0
7 CLS
10 INPUT "Base= "; x
15 INPUT "Exponente= "; y
20 LET neg = NOT (SGN x + 1)
30 IF neg THEN PRINT PAPER 5; INK 1; FLASH 1;"base negativa,normalmente se ob-tendría Invalid argument": PRINT : LET x = ABS x: LET a$ = str$ (-neg): LET a$ = a$(1)
40 LET resultado = x^y
50 LET r$ = (a$ (1) and neg) + STR$ resultado
60 PRINT "Resultado de x^y "; INVERSE 1; r$
70 PRINT "Pulsa una tecla": PAUSE 0
100 GO TO (7 AND neg) + (10 AND NOT neg)
  • 018/trucos.txt
  • Última modificación: d/m/Y H:i
  • por miguel