Visual Basic / Ejemplo de función

Un ejemplo de construcción de una función es Visual Basic es la función signo. Esta es una función que devuelve un valor según si un número o el resultado de una expresión es mayor, menor o igual que 0. Suele representarse en la forma SGN(número).

La mayor parte de los lenguajes de programación aplican esta función. No obstante, si no la aplican, es fácil construirla uno mismo, más abajo se presentan tres métodos.

Implementaciones de la función

editar

Cuando un lenguaje no posee dicha función puede proveerse fácilmente con alguno de los métodos que se muestra a continuación en pseudocódigo.

Se presentan tres métodos para implementar la función. Dado que en computación es importante la velocidad, se hace referencia a las mismas.

  • El método basado en lógica y aritmética tarda lo mismo para cualquiera de los valores de un número.
  • El método basado en comparaciones tarda distinto, según sea el valor positivo, negativo o cero y, por consiguiente, según el orden en que se realicen las comprobaciones para dichos casos. Es ligeramente más rápido que el anterior.
  • Finalmente, para el método del valor absoluto, el tiempo también es diferente según sea 0 o distinto de 0 (no discrimina si es positivo o negativo). En cualquier caso, este método es más lento que los anteriores, debido a la operacón de división, que es más costosa.

Uso de la lógica y la aritmética (caso 1)

editar

En lenguajes donde TRUE = -1 y FALSE = 0 En lenguajes de programación se aprovecha la mitad alta de la gama de datos para expresar números negativos cuando el tipo elegido de datos admite esa posibilidad.

     Funcion Signo(N)
        Devolver (N < 0) - (N > 0)
     Fin Funcion

Examinado el código, se observa que las expresiones de comparación devuelven TRUE= -1 o FALSE=0

  • Caso N Mayor que 0: si un número es mayor que 0, luego éste resultado = -1, y por lo tanto no puede ser cierta la expresión (n < 0), entonces al restar, se resta -1. Se verifica que: 0-(-1) = 1
  • Caso N igual a 0: Si N vale 0, ambas expresiones son falsas, dan por resultado 0, luego su resta también dará 0. Se verifica que: 0-0 = 0
  • Caso N menor que 0: Si n<0, entonces esta expresión = TRUE = -1; por tanto, la otra expresión no puede ser cierta, entonces se le resta 0, que es el resultado de la expresión final (n < 0). Se verifica que: -1-0 = -1

Usando lógica y aritmética (caso 2)

editar

En lenguajes donde TRUE = 1 y FALSE = 0 En lenguaje natural (y cálculo mental), nos resulta más evidente así:

     Funcion Signo(N)
        Devolver (N > 0) - (N < 0)
     Fin Funcion

Examinado el código, se observa que las expresiones de comparación devuelve TRUE = 1 o bien FALSE = 0

  • Caso N mayor que 0: si un número es mayor que 0, luego el resultado de esta expresión = 1, y por lo tanto no puede ser cierta la expresión n < 0; entonces, al restar se resta 0. Se verifica que: 1-0 = 1
  • Caso N igual a 0: Si N vale 0, ambas expresiones dan por su lado un resultado de 0, luego su resta también dará 0. Se verifica que: 0-0 = 0
  • Caso N menor que 0: Si n < 0, entonces devuelve TRUE = 1, y la expresión n > 0 da 0; por tanto, se le resta 1 resultado de la expresión final (n < 0). Se verifica que 0-1 = -1

Usando comparaciones

editar

Se puede conseguir mayor velocidad de cálculo al preguntar por el signo de una gran cantidad de números, si se sabe a priori si existe una mayor cantidad de números con valores positivos, negativos o iguales a 0, modificando la función de modo que se compruebe en primer lugar la posibilidad más frecuente. En este pseudocódigo, por tanto, se da prioridad a valores positivos, luego negativos y por último a números cuyo valor es 0.

     Funcion Signo(N)
       Si N > 0 luego
          devolver 1
       En otro caso
          Si N < 0 luego
               devolver -1
          En otro caso
               devolver 0
          Fin condición
       Fin condición
     Fin Funcion

Usando el valor absoluto

editar

Esta función es la más lenta de todas las aquí mostradas. Sin embargo, si se sabe a priori que el valor de los números a evaluar son mayoritariamente 0 o bien distintos de 0, es posible modificar la función para que, al evaluar la comprobación, realice en primer lugar el caso más frecuente.

     Funcion Signo(N)
       Si N <> 0 luego
          devolver N \ ABS(N)  - se hace una división entera, que es más rápida
       En otro caso
          devolver 0
       Fin condición
     Fin Funcion

Ejemplos

editar
  • Obtener el signo de una variable. En el ejemplo ponemos directamente el valor, puede asumirse que la variable en un momento dado contiene tal valor.
    • Signo de un número positivo: SGN(25) = 1
    • Signo de un número negativo: SGN(-23) = -1
    • Signo de 0: SGN(0) = 0
  • Obtener el signo de una variable, para condicionar un bucle: Si necesitamos realizar un ciclo de operaciones desde un punto inicial hasta un punto final, necesitamos saber si el punto final es mayor o menor que el inicial para determinar si la cuenta de ciclos es creciente, decreciente o nulo.

En pseudocódigo:

    Direccion = SGN(Inicio - Final)
    Decidir que hacer cuando Direccion = 0  - Un bucle con un incremento de 0 es un bucle infinito  
    Iniciar ciclo para todo elemento en la lista comenzando en Inicio hasta Final con incremento de Direccion
       hacer las operaciones deseadas al elemento apuntado
    Fin ciclo

Programación en código VB

editar
  • Nótese cómo el bucle iniciaría en 586 e iría hacia atrás hasta llegar a 236. La función signo interviene para determinar cómo es el incremento: si creciente, decreciente o nulo. Si se presenta este último caso, debe decidirse entonces la acción a tomar, tal como se detalla en el siguiente párrafo.
  • Si inicio y final tuvieran el mismo valor, el incremento de cada ciclo sería 0. Esto provocaría un ciclo infinito que se remedia con la condición previa al bucle, y se permitiría ejecutar 1 vez el bucle. Si cuando son iguales se desea omitir la ejecución, se debe condicionar a usar el bucle sólo si la Dirección es distinta de 0. Ambas situaciones quedan reflejadas en el código
    DIM direccion AS INTEGER, Inicio AS LONG, Final AS LONG, K AS LONG

    Inicio = 586
    Final = 234 
    Direccion = SGN(Inicio - Final)
  
- Si dirección = 0, lo condicionamos para que el bucle se ejecute 1 vez.

    IF Direccion = 0 THEN Direccion = 1      - Éste es un ejemplo de condicionado de variables.
    FOR K = Inicio TO Final STEP Direccion    - Éste es un ejemplo que determina si la cuenta de los ciclos es creciente o decreciente.
         - las operaciones que se necesite realizar
    NEXT

- Si dirección = 0, lo condicionamos para que el bucle no se ejecute ninguna vez.
    IF Direccion <> 0 THEN                   - Éste es un ejemplo de control del flujo.
       For K = Inicio TO Final STEP Direccion - Éste es un ejemplo que determina si la cuenta de los ciclos es creciente o decreciente.
            - las operaciones que se necesite realizar
       Next
    END IF

Puede verse como la utilidad queda patente, cuando se asignan cualesquiera valores a inicio y final, el código se ejecutará correctamente sea cual sea el caso.