El FORTRAN da la posibilidad de subdividir las tareas de un

Anuncio
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 ! Arregloa 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
Descargar