Subrutinas Personalizadas

Definir Subrutinas personaizadas (Procedimientos y Funciones)


   La programación estructurada procura que los programas sean más fáciles de diseñar y mantener. Esto se consigue mediante ciertos tipos de instrucciones, que permiten que un programa no sea simplemente una serie de instrucciones que se procesan una tras otra.


Algunas de estas instrucciones ya las hemos visto: 


WHILE

LOOP 

UNTIL 


Pero hay más posibilidades, como la de definir "bloques" dentro de un programa, empleando lo que llamaremos funciones y procedimientos.


   Hemos empleado alguna de las "funciones" predefinidas que incorpora el lenguaje , y que nos permiten calcular el valor absoluto de un número, el seno o el coseno de un ángulo, etc. 


Ahora comenzaremos por ver la forma en que en muchos BASIC antiguos podíamos definir nuestra propias funciones. Vamos a crear una función que nos devuelve el cuadrado de un cierto número


DEF FNcuadrado (x) = x * x 

PRINT "El cuadrado de 2 es "; FNcuadrado(2)



   Se usa la orden DEF FN, y justo a continuación de la palabra FN se indica el nombre que tendrá la función, los parámetros que aceptará esa función (en nuestro caso, un único número, que hemos llamado X, y que es el número cuyo cuadrado queremos elevar), y finamente un signo = y la expresión matemática que indica cómo calcular esa función (en nuestro caso, al ser el cuadrado, multiplicamos el número por sí mismo). En la siguiente línea hemos utilizado esa función para calcular el cuadrado del número 2 (hay que indicar el nombre de la función, también precedido por las letra FN).


   En los BASIC modernos, las funciones pueden dar más pasos, en vez de limitarse a una única operación matemática, y se definen de una forma distinta:


FUNCTION RaizCubica (x) 

ValorTemporal = ABS(x) ^ .33333333333# 

IF x < 0 THEN ValorTemporal = ValorTemporal * (-1) 

RaizCubica = ValorTemporal 

END FUNCTION


PRINT "La raiz cúbica de -27 es "; RaizCubica(-27)


En este ejemplo, si X es negativo, QBasic da un error al elevar X a .3333, de modo que lo que he hecho es utilizar un valor temporal, elevando el valor absoluto del número y cambiando luego el signo si corresponde. Finalmente, doy a "RaizCubica" el valor definitivo.

Finalmente, en QBasic también existe la posibilidad de crear "subrutinas" (lo que en otros lenguajes de programación se llama "procedimientos"). Es algo parecido a lo que conseguíamos con GOSUB, pero de forma más elegante y más legible, además de que se pueden indicar parámetros, igual que hacíamos en las funciones. Por ejemplo, podemos crear una subrutina que escriba un cierto texto centrado en una fila de la pantalla que indiquemos:


SUB EscribeCentrado (texto$, y) 

LOCATE y, 40 - (LEN(texto$) / 2) 

PRINT texto$ 

END SUB


CLS 

PRINT "Hola" 

EscribeCentrado "Ejemplo", 10 

EscribeCentrado "Segundo ejemplo", 15


Aquí se ve como la forma de usar una subrutina en QBasic también es ligeramente distinta a la de las funciones, porque en las subrutinas los parámetros no se indican entre paréntesis (además del hecho de que una función devuelve un valor, que deberemos mostrar con PRINT o utilizar como valor intermedio para otras operaciones, mientras que una subrutina no devuelve ningún valor).

También existe la posibilidad de acceder a la subrutina con la orden CALL (entonces sí que habrá que indicar los parámetros entre paréntesis), así:


SUB EscribeCentrado (texto$, y) 

LOCATE y, 40 - (LEN(texto$) / 2) 

PRINT texto$ 

END SUB


CLS 

PRINT "Hola" 

CALL EscribeCentrado ("Ejemplo", 10) 

CALL EscribeCentrado ("Segundo ejemplo", 15)