Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

viernes, 17 de agosto de 2012

Subrutina y Funciones

-->
¿por qué se usan?
Cuando escribimos nuestro código fuente, es necesario ordenarlo de alguna manera, organizándolo de forma que no repitamos las mismas ordenes. Para ello podemos usar subrutinas y funciones.

¿que diferencia hay?
Las subrutinas, pueden recibir datos, y solo van a contener ordenes.
Las funciones, suelen recibir datos, y además de contener ordenes, también nos van a devolver un resultado (que será un tipo de dato).


Esquema de como se declara:
Subrutina 
[ FAST ] [ STATIC ] { PUBLIC | PRIVATE } { PROCEDURE | SUB }   Identifier   (     [ [ BYREF ] Parameter AS Datatype [ , ... ] ] [ , ]     [ OPTIONAL [ BYREF ] Optional Parameter AS Datatype [ , ... ] ] [ , ] [ ... ]   )  
 ...  
END

Función
[ FAST ] [ STATIC ] { PUBLIC | PRIVATE } { FUNCTION | PROCEDURE | SUB }   Identifier   (     [ [ BYREF ] Parameter AS Datatype [ , ... ] ] [ , ]     [ OPTIONAL [ BYREF ] Optional Parameter AS Datatype [ , ... ] ] [ , ] [ ... ]   )   AS Datatype 
  ...
 END
Nota:
Toda funcion debe de retornar algun tipo de dato (aunque sea NULL), usando para ello la orden Return
-->
Al llegar a la orden Return, la función se deja de ejecutar y envía el valor especificado como valor de retorno, que debe de coincidir con el tipo indicado en DataType.
Este seria el esquema de como funciona una función:

Enlace para más información:
http://gambaswiki.org/wiki/lang/methoddecl



Como veis, tiene bastantes opciones... veremos algunos ejemplos para aclararlo:
Public|Private:
Al igual que las variables, las funciones y subrutinas al definirlas le estamos diciendo desde donde se puede acceder a ellas (desde todos los formularios/modulos (Public), véase Uso del Operador Punto , o solo desde el mismo formulario o módulo donde fue declarada (Private) )

Uso de una función:
-->
Hay varias formas de llamar a una función, dependiendo de lo que se desea hacer con el resultado o resultados que regrese, pero la regla que siempre se conserva es que la lista de parámetros debe coincidir con los valores que recibe la función en su declaración en tipo y cantidad.
•Un estatuto de asignación si el valor que regresa es necesario en otra operación
a = nombre (lista de parámetros)
•Una expresión
a = cantidad * nombre (lista de parámetros)

•El orden de salida, si solo nos interesa imprimir el resultado, en caso de que no haya parámetros de referencia
print nombreFuncion (lista de parámetros)
No confundir con
print nombreFuncion
cuyo resultado no tiene nada que ver, ya que imprime “el nombre interno” de la funcion en el Ide de Gambas, sin devolvernos ningún calculo ni resultado ninguno.

-->
•Una condición
               If (nombre_funcion(lista de parámetros) > 7) then ….
•En Bucles:
                while (nombre_funcion(lista de parámetros) > 7)


Ejemplo:
-->
¿como declarariamos una función, accesible solo al módulo donde estamos, llamala “promedio” y que nos devuelva el promedio de 3 números enteros? Hay que tener en cuenta que el resultado puede contener número decimales.

-->
Private Function promedio(a as integer, b as integer, c as integer) as float
Return (a+b+c)/3
End


Private -> definimos que solo lo podremos usar en el módulo o formulario donde la hemos definico
Function  -> es una función, con lo cual nos devolverá algo.
promedio -> nombre de la función
(a as integer, b as integer, c as integer) -> son los 3 parametros de entrada, que estamos indicando que son numeros enteros.
as float -> tipo de variable que devolverá, en este caso devolvera un float.
Return (a+b+c)/3 -> retornamos el valor de la operación (a+b+c)/3
End-> fin de la definición de la función 

Nota: Sobre Return
En una función puede ver varios return, ejemplo:

Public Function ver(clave As String) As String
If clave = "OK" Then
Return "Ok, es la clave"
Endif
Return "clave no es valida"

End
  
En esta función, dependiendo del valor que se introduzca, retorna "ok,es la clave", o "clave no es valida"





¿como usariamos esta función?

--> -->
public sub main()
dim valor as float 'definimos una variable que será la que contenga lo que devuelva la función
valor= promedio(3,4,2) ' calculamos el promedio de los numeros 3,4 y 2, y se lo asignamos a la variable “valor”
print "El promedio es: ";valor ' escribimos el contenido de la variable en la consola
End

 
Al ejecutar el programa, escribiría en la consola:
El promedio es: 3,33333333333333

-->
Otro ejemplo: Usando parámetros opcionales.
Declara una función, accesible desde todos los formularios, llamandola “sumatorio” y que nos sume 2 numero decimales, siendo opcional sumar un 3º número. El módulo donde se encuentra se llama FuncionesAritmeticas:

 
-->
Public Function sumatorio(a as float, b as float, optional c as float) as float
return (a+b+c)
end

Uso: 
Como es accesible a todos los formularios y módulos, si la llamamos desde otro lugar que no sea donde este definida, le añadimos el nombre del módulo donde esté definida: "FuncionesAritmeticas"
 
-->
Public sub main()
Dim valor As Float
valor = FuncionesAritmeticas.sumatorio(2, 3)
Print "sumatorio:"; valor
End

Como vereis, el hecho de pasarle dos parametros (los números 2 y 3), no dá problemas porque el 3º lo hemos definido opcional ("optional")



FAST: 
Con esta palabra reservamos, hacemos posible que se ejecute más rápidamente la función o subrutina (disponible desde Gambas3.2)


BYREF
Paso por referencia. Lo veremos más adelante.

STATIC
El método sólo puede acceder a las variables estáticas de la clase.

Nota:
-->
  • Si una función no se manda llamar, nunca se ejecuta.

Ejemplo:
-->
Ejemplo 1: Se necesita una función que calcule la distancia entre 2 puntos con coordenadas (Xa, Ya) y (Xb, Yb) . Para calcularla se usa la fórmula:
DISTANCIA = (xa – xb)² + (ya – yb)²
Definición de Función:
-->
Public Function distancia(xx1 As Float, yy1 As Float, xx2 As Float, yy2 As Float) As Float
Dim p1, p2, result As Float
p1 = (xx2 - xx1) ^ 2
p2 = (yy2 - yy1) ^ 2
result = Sqr(p1 + p2)
Return result
End
Progrma principal:
-->
'----------------------
' Funcion: Calculo de distancia
'----------------------
Dim x1, x2, y1, y2 As Float
Print "Dame las coordenadas del 1º punto:"
Print "X:"
Input x1
Print "Y:"
Input Y1
Print "Dame las coordenadas del 2º punto:"
Print "X:"
Input x2
Print "Y:"
Input Y2


Print "Resultado: ", distancia(x1, y1, x2, y2)


-->
Ejemplo 2: 
Se desea obtener el perímetro de un triángulo dadas las coordenadas de los 3 puntos.
La definición de la función es la misma que la del ejercicio anterior..(estamos aprovechando el código de un programa en otro distinto).

Programa Principal:
  -->
'----------------------
' Funcion: Calculo de perimetro de un triangulo dado por coordenadas
'----------------------
Dim x1, y1, x2, y2, x3, y3, p12, p13, p23 As Float 'defino variables para el calculo del perimetro


Print "Dame las coordenadas del 1er punto "
Input x1
Input y1
Print "Dame las coordenadas del 2do punto "
Input x2
Input y2
Print "Dame las coordenadas del 3er punto “"
Input x3
Input y3
' calculando la distancia entre el punto 1 y 2
p12 = distancia(x1, y1, x2, y2)
' calculando la distancia entre el punto 1 y 3
p13 = distancia(x1, y1, x3, y3)
' calculando la distancia entre el punto 2 y 3
p23 = distancia(x2, y2, x3, y3)
Print "El perimetro es ", p12 + p13 + p23


Si deseas usar funciones o subrutinas que esten definidas en otros formularios o módulos de tu programa, tendras que declararla como públicas, y usar el operador punto ".". Para mas detalle visita este enlace: Uso del Operador Punto

Descarga el cóodigo fuente de los ejemplo: enlace







3 comentarios:

  1. Todo tu curso es bueno, pero veo aquí un muy mal ejemplo de explicación de funciones.Es farragoso, recomiendo hacerlo mejor la verdad.

    ResponderEliminar
  2. Todo tu curso es bueno, pero veo aquí un muy mal ejemplo de explicación de funciones.Es farragoso, recomiendo hacerlo mejor la verdad.

    ResponderEliminar
    Respuestas
    1. Si, quizas he intentado explicar todas las cosas que gambas3 incluye a la hora de trabajar con Funciones y Subrutinas. Pero creo que los ejemplos son claros.

      Eliminar

A falta de donativos... un poco de publicidad