Documente Academic
Documente Profesional
Documente Cultură
EN FORTRAN 90
INTRODUCCION
Los programas escritos en Fortran realizados en captulos anteriores estn
estructurados en unidades programticas, en base a niveles jerrquicos. Existen
cuatro tipos de unidades programticas:
program que es la unidad programtica principal, sobre la cual hemos ido
trabajando en el transcurso de los anteriores captulos.
subroutine (subrutina) unidad programtica que contempla instrucciones
ejecutables.
function (funcin) unidad programtica que contempla instrucciones ejecutables
module unidad programtica que contempla instrucciones de declaracin de
variables, inicializacin de variables, interfaces entre funciones y subrutinas.
El programa principal, las subrutinas y funciones, son llamadas procedimientos. Un
procedimiento es interno si esta definida dentro de una unidad programtica, la
cual puede ser una unidad hospedante si se trata de un procedimiento que llama
al procedimiento interno, o bien un modulo. Un procedimiento puede ser externo, si
no esta contenida en ninguna otra unidad programtica.
diseo
descendente en
los
SUBRUTINA
Sorden jerrquico de nivel inferior
Una subrutina es subprograma de
al subprograma principal, que tiene como objetivo llevar a cabo
instrucciones ejecutables, que sern ejecutadas por un
subprograma de nivel jerrquico superior, a travs de una
instruccin que llame a la subrutina. La estructura de una
subrutina es:
subroutine <nombre>[(<argumentos (ficticios)>)]
! instrucciones de declaracin de los argumentos (ficticios)
:
! instrucciones de declaracin de los objetos locales
:
! instrucciones ejecutables
:
end subroutine <nombre>
EJEMPLO
program poli
integer::n
real,dimension(0:100)::a
real::x,p,q
print*,"Introduzca un polinomio de grado menor o
igual a 20"
print*,"Introduzca el grado del polinomio"
read*,n
print*,"Introduzca los coeficientes del polinomio"
print*,"con grado decreciente"
read*,(a(i),i=n,0,-1)
print*,"Introduzca el punto x donde desea ser
evaluado"
read*,x
call horner(n,a,x,p,q)
print*,"El valor del polinomio es p(x)= ",p
print*,"El valor de la derivada es p(x)= ",q
subroutine horner(n,a,x,p,q)
! n (entero) grado del polinomio a evaluar
! a (arreglo de a(0:n),
! coeficientes del polinomio
! x valor doble precision, donde se desea
! evaluar el polinomio
! p evaluacion del polinomio en x
! q evaluacion del polinomio derivada en x
integer::n,i
real::x,p,q
real,dimension(0:n)::a
p=a(n);
q=0.0
do i=n-1,0,-1
q=q*x+p;
p=p*x+a(i)
end do
return
end subroutine horner
65.000000
133.000000
USANDO LA
SENTENCIA
CONTAINS
SE CONOCEN
COMO
SUBRUTINAS
INTERNAS
program poli
integer::n
real,dimension(0:100)::a
real::x,p,q
print*,"Introduzca un polinomio de grado menor o igual
a 20"
print*,"Intrudzca el grado del polinomio"
read*,n
print*,"Introduzca los coeficientes del polinomio"
print*,"con grado decreciente"
read*,(a(i),i=n,0,-1)
print*,"Introduzca el punto x donde desea ser evaluado"
read*,x
call horner(n,a,x,p,q)
print*,"El valor del polinomio es p(x)= ",p
print*,"El valor de la derivada es p(x)= ",q
contains
subroutine horner(n,a,x,p,q)
! n (entero) grado del polinomio a evaluar
! a (arreglo de a(0:n),
! coeficientes del polinomio
! x valor doble precision, donde se desea
! evaluar el polinomio
! p evaluacion del polinomio en x
! q evaluacion del polinomio derivada en x
integer::n,i
real::x,p,q
real,dimension(0:n)::a
p=a(n);
q=0.0
do i=n-1,0,-1
q=q*x+p;
p=p*x+a(i)
end do
return
end subroutine horner
end program poli
j=j+1
lo que el programa al ejecutarse, hace realmente es
i=i+1
EJEMPLO
PROGRAM principal
INTEGER :: G,M,S
REAL::n
PRINT*,"INGRESE GRADOS,MINUTOS Y SEGUNDOS A CONVERTIR"
45 minutos
2 segundos equivalen a
SUBPROGRAMAS
FUNCTION
PROGRAM AREA
REAL::RADIO
PRINT*,"INGRESE RADIO DEL CIRCULO"
READ*,RADIO
PRINT*
PRINT*,"AREA DEL CIRCULO= ",AREA_CIRCULO(RADIO)
END PROGRAM AREA
FUNCTION AREA_CIRCULO(R) RESULT(A)
REAL::R, A
REAL,PARAMETER::PI=3.1416
A=PI*R*R
RETURN
END FUNCTION AREA_CIRCULO
INGRESE RADIO DEL CIRCULO
1
AREA DEL CIRCULO=
3.141600
Press any key to continue
PROGRAM AREA
REAL::RADIO
PRINT*,"INGRESE RADIO DEL CIRCULO"
READ*,RADIO
PRINT*
PRINT*,"AREA DEL CIRCULO= ",AREA_CIRCULO(RADIO)
CONTAINS
FUNCTION AREA_CIRCULO(R) RESULT(A)
REAL::R,A
REAL,PARAMETER::PI=3.1416
PROGRAM AREA
A=PI*R*R
REAL::RADIO,A1
RETURN
PRINT*,"INGRESE RADIO DEL CIRCULO"
END FUNCTION AREA_CIRCULO
READ*,RADIO
END PROGRAM AREA
PRINT*
PRINT*,"AREA DEL CIRCULO= ",AREA_CIRCULO(RADIO, A )
END PROGRAM AREA
FUNCTION AREA_CIRCULO(R, AC)
REAL::R,AC
REAL,PARAMETER::PI=3.1416
AREA_CIRCULO=PI*R*R
RETURN
END FUNCTION AREA_CIRCULO
PROGRAM conversion
REAL:: cent,x,var1,var2
print*,"ingrese temperatura en grados F"
read*,x
var1 = cent (x)
print*, x," es= ",var1
print*,"ingrese otra temperatura en grados F"
read*,x
var2 = -2.0*cent(x)+4
print*, x," es= ",var2
end program conversion
FUNCTION cent(temperatura)
REAL:: cent !declaracion del nombre de la funcion
REAL,INTENT(IN):: temperatura !declaracion del argumento formal
REAL,PARAMETER:: CTE=5./9. !parametro local a la funcion
cent= CTE*(temperatura-32.)
END FUNCTION cent
MODULOS
MODULE nombre_modulo
[SAVE]
Declaracin e inicializacin datos
compartidos Cuerpo del mdulo
END MODULE nombre_modulo
PROGRAM principal
USE comparte_datos
IMPLICIT NONE
INTEGER :: j
PRINT*, 'v1', v1
PRINT*, 'v2',v2
v1=v1+v2
PRINT*, 'v1',v1
CALL sub
PRINT*, MATRIZ'
DO i=1,TM
PRINT*, (m(i,j),j=1,2)
END DO
END PROGRAM principal
SUBROUTINE sub
USE comparte_datos
IMPLICIT NONE
m( : , 1 ) = v1
m( : , 2 ) = v2
END SUBROUTINE sub
MODULE comparte_datos
IMPLICIT NONE
SAVE
INTEGER, PARAMETER:: TM=5
INTEGER:: i
INTEGER, DIMENSION(TM) :: v1=1,v2=(/ (i, i=10,14) /)
INTEGER, DIMENSION(TM,2) :: m
END MODULE comparte_datos
PROGRAM PAQUETES
USE COMPARTIDAS
PRINT*,"VALOR DE COORD_X "
CALL SUB1
PRINT*,COORD_X
PRINT*,"VALOR DE COORD_Y"
CALL SUB2
PRINT*,COORD_Y
PRINT*
PRINT*,"RAIZ = ",SUB3(COORD_X,COORD_Y)
END PROGRAM PAQUETES
SUBROUTINE SUB1
USE COMPARTIDAS
IMPLICIT NONE
COORD_X=RAIZ2
RETURN
END SUBROUTINE SUB1
SUBROUTINE SUB2
USE COMPARTIDAS
IMPLICIT NONE
COORD_Y=RAIZ3
RETURN
END SUBROUTINE SUB2
FUNCTION SUB3(X,Y)
REAL::X,Y
SUB3=SQRT(X**2+Y**2)
RETURN
END FUNCTION SUB3
MODULE COMPARTIDAS
IMPLICIT NONE
SAVE
REAL,PARAMETER::RAIZ2=1.41421,RAIZ3=1.73205
REAL::COORD_X,COORD_Y,COORD_Z
END MODULE COMPARTIDAS