7-Saltos

Saltos e el código: GOTO Y GOSUB


  

Sirven para saltar a una parte distinta del programa. 

   Esto será especialmente útil después de comprobar una cierta condición, por ejemplo: "si hay compras de un mismo usuario, superores a 10.000 pesos, saltar a la parte de programa que aplica un descuento especial al usuario."



Orden GOTO 


Para saltar usaramor la orden GOTO (del inglés "Go To", ir a; 


   Alguna versión de BASIC permite o exige que se escriba como dos palabras separadas). 


   Después de esta orden detallaremos el número de línea a la que deseamos saltar. 


Ejemplo:

   Programa, que escribe indefinidamente la palabra "Hola", porque la línea 40 hace que el programa vuelva a la línea 30 una y otra vez:   (Usaremos las lineas de código de 10 en 10 para que se entiendan mejor los saltos)


10 # /programa que se quedara "colgado" 

20 Print "Hola" 

30 Goto 30



Es muy fácil que este programa no se pueda interrumpir y deje el ordenador "colgado". En algún ordenador (y alguna versión de BASIC), se podría interrumpir pulsando dos veces la tecla Esc, o las teclas Ctrl+C, o alguna otra combinación similar de teclas. En otros puede no haber más remedio que apagar el equipo.



   El Basic256 y otra versión moderna, no permite números de líneas, pero aun así permite usar GOTO, si indicamos una etiqueta (una palabra terminada con el símbolo de "dos puntos") a la que saltar:



# /programa quese quedara "colgado" 

v_repetir: Print "Hola" 

Goto v_repetir



   En este caso, el programa no terminará hasta que pulsemos el botón "STOP".



Es importante recordar que GOTO es un salto incondicional, de modo que podemos "saltarnos" un trozo de un programa sin darnos cuenta


Ejemplo:


10 #/este programa no nos despide sin saludar 

20 Goto 40 

30 Print "Hola" 

40 Print "Adios"


   Si nos equivocamos y saltamos a una línea que no existe, el intérprete de BASIC da un mensaje de error como: "Undefined line 50" o "Line does not exist in 10"


10 Print "Hola" 

20 Goto 50



Es habitual usar GOTO junto a IF, para hacer que un bloque de un programa se repita mientras se cumpla una cierta condición.


Ejemplo:


10 Print "Introduzca el num 5" 

20 Input x 

30 If x <> 5 Then Goto 10

40 Print "Correcto!"



Alguna versión de BASIC antigua puede permitir sólo la sintaxis "IF condición Then Goto linea" o cualquiera de dos versiones abreviadas de la misma: 


   IF condición THEN linea 

   IF condición GOTO linea 


y no permitir ninguna otra orden en una condición IF. 



La orden GOTO tiene una gran carencia: el programa sigue avanzando después del salto, como si no hubiera ocurrido ningún salto. 


Pero a veces no es eso lo que más nos interesa, sino que nos encontraremos con tareas repetitivas, y querremos que nuestro programa salte a una zona en la que le hayamos indicado cómo dar esos pasos repetitivos, pero después vuelva y siga trabajando normalmente. 


En estos casos en que queremos que salte y vuelva, emplearemos la orden GOSUB, e indicaremos el punto de retorno con RETURN:


10 # /ejemplo de GOSUB y RETURN

20 # /saludo

30 GOSUB 100

40 PRINT "Juan"

50 GOSUB 100:  # /volvemos a saludar

60 PRINT "Albert"

70 END

100 PRINT "Hola"

110 PRINT "Como estas?"

120 RETURN



Las líneas 100 a 120 forman la "subrutina" (de ahí viene la palabra GOSUB: de "go subroutine", ir a una subrutina) a la que saltamos cada vez que nos interesa, y de la que volvemos para que el programa siga por donde estaba. 


En este caso hemos indicado dónde está el final del programa con la orden END, para evitar que después de la línea 60 el programa siga avanzando y pase a la línea 100 (la subrutina) sin que nosotros se lo pidamos.


El programa anterior sería equivalente a este otro:


30 PRINT "Hola" 

35 PRINT "Como estas?" 

40 PRINT "Juan" 

50 PRINT "Hola" 

55 PRINT "Como estas?" 

60 PRINT "Alberto"



Cada GOSUB es equivalente a que se dieran todos los pasos que hay entre el punto de comienzo del salto (en este caso, la línea 100) y la línea de RETURN.


El equivalente en Basic256 del primer programa con GOSUB sería:


#/ejemplo de GOSUB y RETURN 

#/Vamos a saludar 

GOSUB saludo 

PRINT "Juan" 

GOSUB saludo

PRINT "Alberto" 

END 


saludo:

PRINT "Hola" 

PRINT "Como estas?" 

RETURN



Existe otro uso adicional de GOSUB en los BASIC antiguos: si "hacemos demasiadas cosas" en la misma línea de un IF, no sólo el programa acabará resultando más difícil de leer, sino que además, en muchos BASIC clásicos había un límite de tamaño relativamente pequeño para cada línea de programa, típicamente cerca de 256 letras. Por eso, si tenemos que hacer muchas cosas que dependan de la condición, será mejor moverlas a una subrutina:


10 PRINT "Dime tu nombre" 

20 INPUT nombre$ 

30 IF nombre$="Nacho" THEN GOSUB 100

40 END 

100 REM Saludar 5 veces

110 FOR i = 1 TO 5

120   PRINT"HOLA"

130 NEXT i

140 RETURN



Casi todas las versiones de BASIC permiten la orden GOTO; 

y algunas versiones antiguas no permiten GOSUB. 



Las órdenes GOTO y GOSUB se usan cada vez menos, porque en versiones modernas de BASIC tendremos alternativas más elegantes para estructuras repetitivas, como la orden WHILE. 


Y  tenemos formas más eficientes de crear subrutinas.