Algorítmica y Lenguajes de Programación Funciones y subrutinas Funciones y subrutinas. Introducción El diseño descendente permite obtener un programa que resuelva un problema dividiendo este en subproblemas cada vez más sencillos. Cada subproblema tiene asociado un pseudocódigo de alto nivel compuesto por acciones no primitivas. Cuando una de estas acciones no primitivas se repite en varios puntos del algoritmo es interesante darle un nombre y reutilizarla. Estas acciones con nombre se denominan subprogramas, pudiendo ser, a su vez, funciones y subrutinas. 2 1
Funciones y subrutinas. Ventajas Las ventajas de los subprogramas son múltiples: Facilitan la modularidad y estructuración de los algoritmos. Facilitan la lectura e inteligibilidad de los algoritmos. Permiten economizar el esfuerzo del programador al permitir reutilizar el mismo código en varios puntos del mismo algoritmo. Facilitan la depuración y mantenimiento de los programas. 3 Funciones y subrutinas. Funciones (i) Las funciones son subprogramas con 0 ó más argumentos que siempre devuelven un valor de retorno. Las funciones pertenecen entonces a un tipo determinado. La invocación de una función puede formar parte de: Una expresión. La parte derecha de una asignación. Una invocación de una función no puede formar: Una sentencia aislada. La parte izquierda de una asignación. 4 2
Funciones y subrutinas. Funciones (ii) Funciones intrínsecas: Las funciones intrínsecas son proporcionadas directamente por el lenguaje de programación. La mayor parte de funciones intrínsecas son funciones matemáticas como la raíz cuadrada, los logaritmos o funciones trigonométricas. Por cada una de las funciones intrínsecas más habituales en FORTRAN existe una función o un operador equivalentes en la notación algorítmica. 5 Funciones y subrutinas. Funciones (iii) Funciones de usuario (i): En muchas ocasiones el usuario estará interesado en deir sus propias funciones. Las funciones de usuario deben estar deidas dentro del algoritmo principal: deiciones de constantes declaraciones de variables program nombre_programa variables y constantes sentencias del algoritmo DEFINICIONES DE FUNCIONES end sentencias del programa contains DEFINICIONES DE FUNCIONES 6 3
Funciones y subrutinas. Funciones (iv) Funciones de usuario (ii): Para deir una función es necesario: El nombre de la función. El tipo de la función. Los argumentos de la función y el tipo de los mismos. Sintaxis de deición de funciones: tipo funcion nombre (arg1 tipo1,, argn tipon) sentencia1 sentencia2 sentencian tipo function nombre (arg1,, argn) declaración arg1 declaración argn sentencia1 sentencia2 sentencian end 7 Funciones y subrutinas. Funciones (v) Ejemplos de funciones de usuario: logico funcion siempreverdad () siempreverdad verdadero logical function siempreverdad () siempreverdad=.true. end function entero funcion maximo (a entero, b entero) si a>b entonces maximo a si no maximo b si integer function maximo (a, b) integer a,b if (a>b) then maximo=a else maximo=b end if end function 8 4
Funciones y subrutinas. Ámbitos (i) Las funciones pueden acceder a una serie de variables: Argumentos. Variables deidas dentro de la función. Estas variables se denominan locales por contraposición a las variables declaradas dentro del algoritmo principal denominadas globales. Las variables locales sólo existen mientras la función se está ejecutando. Si una variable local se denomina igual que una variable global la función sólo puede acceder a la primera. En FORTRAN las subrutinas pueden modificar los valores de los argumentos recibidos; este fenómeno se denomina efecto lateral y hay que manejarlo con precaución. 9 Funciones y subrutinas. Ámbitos (ii) Consecuencias de los efectos laterales: 01. program programa 02. implicit none 03. 04. integer x,y 05. 06. x=1;y=1 07. 08. print *,suma(x,y) 09. print *,suma(x,y) 10. 11. contains 12. integer function suma (a,b) 13. implicit none 14. integer a,b 15. 16. a=a+b 17. suma=a 18. end function 19. End Aparentemente las líneas 08 y 09 hacen lo mismo. La línea 16 de la función suma hace que el argumento a cambie de valor, esto afecta a la variable x que es la que fue pasada a la función. Consecuencia: el programa se comporta de manera inesperada. Moraleja: una función NUNCA debe modificar el valor de los argumentos que recibe. 10 5
Funciones y subrutinas. Subrutinas (i) Subrutinas o procedimientos: Las subrutinas son subprogramas con 0 ó más argumentos que nunca devuelven un valor de retorno. Las subrutinas, por tanto, no tienen tipo. La invocación de una subrutina sólo puede aparecer en una sentencia de llamada a procedimiento (llamar/call). Una invocación de subrutina no puede formar: Una expresión. La parte derecha de una asignación. La parte izquierda de una asignación. 11 Funciones y subrutinas. Subrutinas (ii) Las subrutinas se deen en la misma zona que las funciones. La sintaxis de la deición es la siguiente: accion nombre_subrutina ([ent sal ent sal] arg1 tipo1,, [ent sal ent sal] argn tipon) sentencia1 sentencian subroutine nombre_subrutina (arg1,, argn) declaración arg1 declaración argn sentencia1 sentencian 12 6
Funciones y subrutinas. Subrutinas (iii) Ejemplos de subrutinas: accion intercambio (a,b entero) temporal entero temporal a a b b temporal subroutine intercambio (a,b) implicit none integer a,b integer temporal temporal=a a=b b=temporal end subroutine accion asteriscos (n entero) i entero desde i 1 hasta n hacer escribir * desde subroutine asteriscos (n) implicit none integer n integer i do i=1, n print *, * end do end subroutine 13 Funciones y subrutinas. Resumen (i) 1. Los subprogramas facilitan la utilización de técnicas de diseño descendente para la construcción de programas. 2. Los subprogramas: Facilitan la modularidad y estructuración de los algoritmos. Facilitan la lectura e inteligibilidad de los algoritmos. Permiten una economización del esfuerzo del programador al poder escribir código reutilizable en muchas partes de un mismo algoritmo. Facilitan la depuración y mantenimiento de los programas. 3. Los subprogramas pueden ser funciones y subrutinas. 4. Las funciones son subrutinas con 0 ó más argumentos y que devuelven un único valor de retorno. 5. Las funciones pueden formar parte de expresiones o aparecer en la parte derecha de una sentencia de asignación pero nunca pueden constituir una sentencia aislada o aparecer en la parte izquierda de una asignación. 6. Las funciones son invocadas mediante su nombre seguido de los argumentos entre paréntesis. 14 7
Funciones y subrutinas. Resumen (ii) 7. Existen dos tipos de funciones: intrínsecas y deidas por el usuario. 8. Las funciones intrínsecas son funciones de uso muy común: raíz cuadrada, logaritmos, funciones trigonométricas, etc. 9. Las funciones deidas por el usuario deben describirse dentro del algoritmo principal. 10. Los argumentos y variables declaradas dentro del cuerpo de una función (o subrutina) se denominan variables locales, las variables declaradas dentro del programa principal son variables globales. Los subprogramas tienen acceso a las variables globales aunque en el caso de que una variable local se denomine igual que una variable global tiene preferencia la primera. 11. Las subrutinas son subprogramas que no devuelven ningún resultado; sin embargo, gracias a la utilización de los efectos laterales es posible su utilización para permitir el retorno de varios resultados. 15 8