90 likes | 252 Views
Subrutinas y funciones. El FORTRAN da la posibilidad de subdividir las tareas de un programa complejo en partes simples y claras . → Procedimientos Externos SUBRUTINAS Subprogramas FUNSIONES.
E N D
Subrutinas y funciones El FORTRAN da la posibilidad de subdividir las tareas de un programa complejo en partes simples y claras . → Procedimientos Externos SUBRUTINAS Subprogramas FUNSIONES
Testeo independiente: un subprograma que puede ser compilado independientemente. Puede ser probado separadamente y elimina fuente de errores en programas largos.(programa unitario). • Código “ re-usable”: en muchos casos hay procedimientos o cálculos que deben usarse reiteradamente en diferentes programas o en el mismo. Los subprogramas • permiten acceder al calculo sin programarlo reiteradamente. • Aísla efectos: Las variables que pueden ser cambiadas por el procedimiento son aquellas que figuran en la lista de argumentos. Si existe un error puede sólo estar en esos argumentos. SUBROUTINES SUBROUTINE nombre (lista de argumentos) …… Sección de declaración ….. Sección de ejecución …….. RETURN END SUBROUTINE [nombre]
La lista de argumentos son variables o arreglos que son pasados y llamados desde el programa principal. (argumentos ficticios (dummy)) Cuando un programa llama a la subrutina , el programa suspende su ejecución y se ejecuta la subrutina hasta que en esta se encuentra con RETURN o END SUBROUTINE la ejecución vuelve al programa principal a la sentencia posterior a la llamada a la subrutina. El llamado del desde el programa: CALL nombre_de _la_subrutina( lista de argumentos) La lista de argumentos con que el programa llama a la subrutina (argumentos actuales) tiene que ser del mismo tipo que las declaradas en ella y guardar el mismo orden (argumentos ficticios (dummy )) Atributo INTENT Declara el tipo de las variables ficticias: INTENT (IN) El argumento ficticio es usado solo para entrada de datos de la subrutina INTENT (OUT) El argumento ficticio es usado solo para salida de datos de la subrutina INTENT (INOUT) El argumento ficticio es usado solo para entrada de datos en la subrutina y devolver los resultados al llamado del programa.
Ej: SUBROUTINE cal_hipotenusa (lon1, lon2, hipotenusa) ! Proposito: Calcular la hipotenusa a partir de los catetos del triangulo rectángulo ! IMPLICIT NONE ! Diccionario y declaración de variables REAL , INTENT(IN) : : lon1 ! longitud del lado 1 REAL , INTENT(IN) : : lon2 ! longitud del lado 2 REAL , INTENT(OUT) : : hipotenusa ! longitud de la hipotenusa REAL : : tem ! Auxiliar temporaria ! ! Calculo de la hipotenusa tem= lon1**2 + lon2**2 hipotenusa = SQRT(tem) ! RETURN END SUBROUTINE cal_hipotenusa • Los argumentos ficticios son usados para pasar los datos a la subrutina asi que ellos son declarados como valores de entrada “INTENT(IN)” . El argumento ficticio hipotenusa es un real determinado en la subrutina asi que tiene que ser declarado como variable de salida “INTENT(OUT)” .
La variable tem está definida dentro de la subrutina y no pasa al programa principal. Este tipo de variables que son inaccesibles desde el programa principal se llaman variables locales. • La sentencia RETURN es opcional ya que cuando la subrutina se encuentra con un END SUBROUTINE vuelve al programa principal. RETURN es necesaria cuando se quiere retornal al programa principal antes de finalizar la subrutina. Para testear la subrutina hay que utilizar un simple programa que verifique su funcionamiento antes de utilizarla dentro de un programa complejo. Ej: PROGRAM test_hiotenusa ! Proposito: verificar la subrutina hipotenusa ! IMPLICIT NONE ! Diccionario y declaración de variables REAL : : l1 ! longitud del lado 1 REAL : : l2 ! longitud del lado 2 REAL : : hipo ! longitud de la hipotenusa WRITE(* ,*) “test de cal_hipotenusa”
WRITE(* ,*) “Entre la longitud del cateto1” READ (* ,* ) l1 WRITE(* ,*) “Entre la longitud del cateto2” READ (* ,* ) l2 ! CALL cal_hipotenusa( l1, l2, hipo) ! WRITE(* ,*) “Escribo el resultado de la hipotenusa” WRITE(* ,*) “La longitud de la hipotenusa es:”, hipo END PROGRAM test_hiotenusa NOTAR: los argumentos actuales con que llamamos a la subrutina son distintos de aquellos que se pusieron en la definición d la subrutina (argumentos ficticios). Esto significa que en el llamado a la subrutina se asigna: lon1 ← l1 lon2 ← l2 hipotenusa → hipo Ej : reescribir el programa “ordenar” utilizando una subrutina que ordene.
PROGRAM lee_ordena_escribe ! Propósito: ! Leer, ordenar e imprimir una serie de valores en forma ascendente IMPLICIT NONE ! Diccionario y declaración de variables y constantes INTEGER, PARAMETER : : ndatos ! número de datos INTEGER : : i ! Índice INTEGER : : j ! Índice INTEGER : : iguardo ! Índice del menor valor REAL, DIMENSION(ndatos) : : arr ! Arreglo a ser ordenado ! WRITE(*, *) “El número de datos :”, ndatos WRITE(*, *) “Entre los valores de la serie” READ(*, *) (arr(i), i=1,ndatos) WRITE (*,*) (arr(i), i=1,ndatos) ! CALL ORDENA( arr, ndatos) ! Imprimo WRITE(*, *) “ la serie ordenada es” WRITE(*, *) arr END PROGRAM lee_ordena_escribe
SUBROUTINE ordena( a, nvalores) • ! Propósito: ordenar en forma ascendente una serie de valores • IMPLICIT NONE • ! Diccionario y declaración de variables y constantes • ! • INTEGER, INTENT(IN) : : nvalores ! número de datos • REAL, DIMENSION(nvalores ), INTENT(INOUT) : : a ! Arreglo a ser ordenado! • INTEGER : : i ! Índice • INTEGER : : j ! Índice • INTEGER : : iguardo ! Índice del menor valor • REAL : : tem ! Variable temporal para hacer el intercambio • ! • Todo: DO i=1, nvalores-1 • ! encuentro el menor valor desde a(i) hasta a nvalores • Iguardo=i • min: DO j=i+1, nvalores • IF(a(j) < a(iguardo)) THEN • iguardo= j • END IF • END DO min
! a(Iguardo) tiene el menor valor así que intercambio con a(i) si i /= iguardo • IF(i /= iguardo) THEN • tem= a(i) • a(i) = a(iguardo) • a(iguardo) = tem • END IF • END DO todo • END SUBROUTINE ordenar