Algorítmica y Lenguajes de Programación Funciones y subrutinas Funciones y subrutinas. Introducción n n n 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 n Las ventajas de los subprogramas son múltiples: n n n n 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) n n n 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: n n n Una expresión. La parte derecha de una asignación. Una invocación de una función no puede formar: n n Una sentencia aislada. La parte izquierda de una asignación. 4 2 Funciones y subrutinas. Funciones (ii) n Funciones intrínsecas: n n n 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) n Funciones de usuario (i): n n En muchas ocasiones el usuario estará interesado en definir sus propias funciones. Las funciones de usuario deben estar definidas dentro del algoritmo principal: definiciones de constantes declaraciones de variables inicio sentencia s del algoritmo DEFINICIONES DE FUNCIONES fin program nombre_programa variables y constantes sentencia s del programa contains DEFINICIONES DE FUNCIONES end 6 3 Funciones y subrutinas. Funciones (iv) n Funciones de usuario (ii): n Para definir una función es necesario: n n n n 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 definición de funciones: tipo funcion nombre (arg1∈ ∈ tipo1,..., argN∈ ∈ tipoN) inicio sentencia1 sentencia2 ... sentenciaN fin tipo function nombre (arg1, ..., argN) declaración arg1 ... declaración argN sentencia1 sentencia2 ... sentenciaN end 7 Funciones y subrutinas. Funciones (v) n Ejemplos de funciones de usuario: logico funcion siempreVerdad () inicio siempreVerdad ß ß verdadero fin logical function siempreVerdad () siempreVerdad=.true. end function entero funcion maximo (a ∈ ∈ entero, b ∈ ∈ entero) inicio si a>b entonces integer function maximo (a, b) integer a,b maximo ß ß a si no maximo ß ß b fin si fin if (a>b) then maximo =a else maximo =b end if end function 8 4 Funciones y subrutinas. Ámbitos (i) n Las funciones pueden acceder a una serie de variables: n n n n n n Argumentos. Variables definidas 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) n Consecuencias de los efectos laterales: 01. program programa 02. 03. implicit none 04. 05. integer x,y 06. 07. x=1;y=1 08. print *,suma(x,y) 09. 10. print *,suma(x,y) 11. 12. contains integer function suma (a,b) 13. implicit none 14. 15. integer a,b 16. 17. a=a+b suma=a 18. end function 19. E nd 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) n Subrutinas o procedimientos: n n n n 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: n n n Una expresión. La parte derecha de una asignación. La parte izquierda de una asignación. 11 Funciones y subrutinas. Subrutinas (ii) n n Las subrutinas se definen en la misma zona que las funciones. La sintaxis de la definición es la siguiente: accion nombre_subrutina ([ent |sal| ent sal] arg1∈ ∈ tipo1, ..., [ ent|sal|ent sal] argN∈ ∈ tipoN ) inicio sentencia1 ... sentenciaN fin subroutine nombre_subrutina (arg1, ..., argN ) inicio declaración arg1 ... declaración argN sentencia1 ... sentenciaN fin 12 6 Funciones y subrutinas. Subrutinas (iii) n Ejemplos de subrutinas: accion intercambio (a,b ∈ ∈ entero) inicio temporal ∈ ∈ entero temporal ß ß a a ß ß b b ß ß temporal fin accion asteriscos (n ∈ ∈ entero) inicio i ∈ ∈ entero desde iß ß 1 hasta n hacer escribir ‘*’ fin desde fin subroutine intercambio (a,b) implicit none subroutine asteriscos (n) implicit none integer a,b integer temporal temporal=a a=b b=temporal end subroutine integer n integer i do i=1, n print *, ‘*’ end do end subroutine 13 Funciones y subrutinas. Resumen (i) Los subprogramas facilitan la utilización de técnicas de diseño descendente para la construcción de programas. Los subprogramas: 1. 2. • • • • 3. 4. 5. 6. 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. Los subprogramas pueden ser funciones y subrutinas. Las funciones son subrutinas con 0 ó más argumentos y que devuelven un único valor de retorno. Las funciones pueden formar parte de expresiones o aparecer en a l 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. 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 definidas 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 definidas 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 glo bal 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