Lenguajes de Programación FORTRAN - 90 / 95 Profesora Ana Lilia Laureano Cruces Alumnos Martha Mora Torres / UNAM – Noviembre 2004 Ignacio Adriano Rivas.
Download ReportTranscript Lenguajes de Programación FORTRAN - 90 / 95 Profesora Ana Lilia Laureano Cruces Alumnos Martha Mora Torres / UNAM – Noviembre 2004 Ignacio Adriano Rivas.
Lenguajes de Programación FORTRAN - 90 / 95
Profesora Ana Lilia Laureano Cruces Alumnos Martha Mora Torres / UNAM – Noviembre 2004 Ignacio Adriano Rivas UAM-A / Febrero 2005 1
FORTRAN 90 / 95
FORTRAN 90/95
representa el primer cambio significativo en 20 años del lenguaje programación estructurada.
FORTRAN
(FORmula TRANslation), colocándose así a la altura de los más modernos lenguajes de
FORTRAN
fue el primer lenguaje denominado de “alto nivel”, haciendo posible el uso de nombres simbólicos para representar cantidades y fórmulas matemáticas en forma razonablemente comprensible y fue propuesto a finales de 1953 por John Backus.
2
FORTRAN 90 / 95
La estructura de un programa en FORTRAN 90/95 es de la siguiente forma (lo que se encuentra entre corchetes es opcional): [ PROGRAM
nombre del programa
] [
expresiones declarativas
] [
expresiones
de
ejecución
] [ CONTAINS
subprogramas internos
] END [ PROGRAM [
nombre del programa
]] Los enunciados son la base del programa y a excepción del enunciado de asignación, todos empiezan con una palabra clave.
3
FORTRAN 90 / 95
Los comentarios se escriben anteponiendo un signo de cierre de admiración (
!
) Si una línea del programa es muy larga, ésta puede continuar en la línea siguiente colocando al final de la primera línea el
signo &:
A = 174.6 *
&
(T – 1981.2) **3 Tipos de Datos: Se dividen en 2 clases, los numéricos (
INTEGER
,
REAL
y
COMPLEX
) y los no numéricos (
CHARACTER
y
LOGICAL
). 4
FORTRAN 90 / 95
Asociado al tipo existen varias clases de ellos, de acuerdo al número de bits disponible para su almacenamiento, por lo que puede haber 2 clases de enteros:
SHORT
y
LONG
.
Constantes: usadas para denominar los valores de un tipo en particular Nombres y variables: Consiste entre 1 y 31 caracteres alfanuméricos y deben empezar con una letra (excepto en las cadenas de caracteres, FORTRAN 90/95 no es sensible a mayúsculas o minúsculas): MINOMBRE significa lo mismo que MiNombre. 5
FORTRAN 90 / 95
Regla implícita del tipo de dato: Esta regla, predetermina a las variables que empiezan con las letras de la i a la n como enteras, mientras que a las que empiezan con cualquier otra letra, como reales. Por lo anterior, para evitar errores, es recomendable deshabilitar dicha regla agregando la siguiente línea:
IMPLICIT NONE
Operadores:
/ ** *
Exponencial Multiplicación División 2**4 (2 4 ) 2*A B / Delta
+
Suma A+9 Resta X - Y 6
FORTRAN 90 / 95
Asignación numérica: El propósito es calcular el valor de una expresión numérica y asignarla a una variable. Su forma general es:
variable
=
expr
Entradas y salidas de datos:
x = a + b
una forma de alimentar datos mientras el programa está corriendo es utilizando la declaración READ, y tiene la forma:
READ
*,
list
donde
list
es una lista de variables separadas por comas:
READ
*, A, B, C 7
FORTRAN 90 / 95
La declaración
, se utiliza para la salida de datos. Su forma general es:
*,
list
Donde
list
puede ser una lista de constantes, variables, expresiones y cadenas de caracteres separadas por comas:
*, “la raiz cuadrada de”, 2, ‘es’, sqrt(2.0) También podemos usar la declaración
WRITE
:
OPEN
( 2, file=‘prn’)
WRITE
(2, *) ‘Esto se envía a la impresora’
*, ‘Esto se envía a la pantalla’ 8
FORTRAN 90 / 95
Ciclos: la forma general del ciclo DO es:
DO
i
=
j
,
k block
END DO
donde i es una variable entera, j y k son expresiones enteras, y block es cualquier número de declaraciones, las cuales se ejecutan repetidamente dependiendo del valor de j y k.
DO
i=1, 10
*, i
END DO
9
FORTRAN 90 / 95
Decisiones: Declaración
IF-THEN-ELSE IF
condition
THEN
block 1
[
ELSE
block E
]
END IF
La expresión parameter: se utiliza como expresión de inicialización
REAL
,
PARAMETER
:: pi=3.141593
INTEGER
,
PARAMETER
:: dos=2 10
FORTRAN 90 / 95
Operadores relacionales: .LT.
o < .LE.
o <= menor que a .LT.
5 menor o igual que b .LE.
4 .EQ.
o == igual .NE.
o /= .GT.
o > diferente mayor que b a .EQ.
.NE.
3 0 b .GT.
4 .GE.
o >= mayor o igual que Operadores lógicos: .NOT.
Negación lógica .AND.
.OR.
Intersección lógica Unión lógica x .GE.
0 .EQV. y .NEQV.
Equivalencia y no equivalencia 11
FORTRAN 90 / 95
Construcción
CASE
: Similar a
IF-THEN-ELSE
basados en un , permite seleccionar entre un número de situaciones o casos
SELECTOR
, este debe ser de tipo ordinal.
[ name: ] SELECT CASE (
expr
) CASE (
SELECTOR1
) [ name ]
block 1
CASE (
SELECTOR2
) [ name ]
block 2
[ CASE DEFAULT [ name ]
block d
END SELECT [ name ] 12
Ejemplo:
FORTRAN 90 / 95
READ*, ch vocales : SELECT CASE (ch) CASE (‘a’, ‘e’, ‘i’, ‘o’, ‘u’) PRINT*, ‘vocal’ CASE default PRINT*, ‘consonante u otro caracter’ END SELECT vocales END 13
FORTRAN 90 / 95
DO con salida condicional (simulamos un WHILE o un REPEAT):
DO IF
(
expr lógica
)
exit
block
END DO
WHILE DO WHILE (
expr lógica
)
block
END DO O
DO
block
IF
(
expr lógica
)
EXIT END DO
REPEAT-UNTIL 14
FORTRAN 90 / 95
Ejemplo: DO WRITE *, “tu invitado: “ READ *, invitado IF (invitado == 10) EXIT END DO Do while: DO WHILE (
expr lógica
)
block
END DO 15
FORTRAN 90 / 95
Los Programas diseñados con los principios de programación estructurada y un diseño modular descendente son estructurados por medio de abstracciones procedurales y funcionales. Estos procedimientos se comunican con el programa principal de manera específica, a través del paso de datos y son invocados o llamados desde éste.
Existen dos formas de estructurar el programa a través de : funciones (abstracciones-funcionales) y subrutinas (abstracciones-procedurales).
El paso de datos se conoce como paso de parámetros, estos pueden ser pasados por referencia o por valor. 16
FORTRAN 90/95
Paso de parámetros por referencia:
Es un mecanismo que permite el paso de un parámetro utilizando una dirección de memoria con el fin de facilitar ya sea el retorno al programa principal de un valor producido por un subprograma o el retorno al programa principal de un valor modificado por el subprograma.
• • INTENT ( OUT ) ! producido INTENT ( INOUT ) ! modificado 17
FORTRAN 90/95
Parámetros
por valor:
Es un mecanismo que permite el paso de un parámetro utilizando su valor con el fin de evitar su modificación, de esta forma al terminar de ejecutarse el subprograma y retornar el control al programa principal el valor de ese parámetro continúa siendo el mismo. En otras palabras el valor de este parámetro sólo puede ser utilizado.
• INTENT (IN) ! Sólo puede ser utilizado 18
D i s e ñ o M o d u l a r D e s c e n d e n t e Programa Principal Abstracción Procedural 1 Abstracción Procedural 2 Abstracción Funcional 1 19
FORTRAN 90 / 95 Ejemplo de función: PROGRAM new IMPLICIT NONE REAL:: x=2 x = x – f(x) PRINT*, x, f(x) FUNCTION f(x) REAL INTENT (IN) :: x REAL :: f f = x ** 3 END FUNCTION f END PROGRAM new
20
FORTRAN 90 / 95
Ejemplo de subrutina: IMPLICIT NONE INTEGER :: a, b READ*, a, b CALL inter(a, b) SOUBROUTINE inter(x, y) INTEGER temp INTEGER INTENT (IN) :: x INTEGER INTENT (OUT) :: y temp = x x = y y = temp END END SOUBROUTINE 21
FORTRAN 90 / 95
Recursión : Muchas funciones matemáticas pueden estar definidas recursivamente, es decir que están definidas en términos de casos más simples de ellas mismas.
Para implementarlas es necesario que una función se invoque a sí misma. Normalmente en FORTRAN 90/95 esto es posible, agregando el prefijo
RECURSIVE
como palabra clave en el encabezado de la función es como podrá invocarse a sí misma.
22
FORTRAN 90 / 95
Ejemplo: IMPLICIT NONE INTEGER :: i i = 10 PRINT *, i, factorial(i) RECURSIVE FUNCTION factorial(n) RESULT (fact) INTEGER :: fact INTEGER INTENT (IN) :: n IF (n .LE.1) THEN fact=1 ELSE fact=n*factorial(n-1) END IF END FUNCTION END 23
FORTRAN 90 / 95
Módulos: son contenedores físicos que permiten albergar expresiones declarativas o abstracciones procedurales o funcionales. Estos módulos pueden ser compilados por separado o pueden estar dentro de un programa: Puede contener más de una abstracción funcional o procedural, o Puede tener expresiones declarativas y/o de especificación accesibles a todas las unidades del programa.
24
Ejemplo:
FORTRAN 90 / 95
módulo aparte USE utilerias IMPLICIT NONE INTEGER :: a, b READ *, a, b b = Pi MODULE utilerias REAL, PARAMETER :: pi =3.14159
CONTAINS SOUBROUTINE inter(x, y) INTEGER temp CALL inter(a,b) PRINT *, a,b INTEGER INTENT (IN) :: x INTEGER INTENT (OUT) :: y temp = x x = y y = temp END SOUBROUTINE inter END MODULE utilerias 25
FORTRAN 90 / 95
Programas Externos.
for Progma Principal.
f90 Mod-Sub1 Int-Sub1 INCLUDE Externos.FOR
USE Module-Sub_1,Module Sub2 Int – Sub1 Int – Sub2 Mod-Sub2 Int-Sub2 26
FORTRAN 90 / 95
Compilación Separada:
Para compilar un módulo por separado, es necesario agrupar todos las abstracciones procedurales y funcionales dentro de un archivo independiente cuya extensión debe ser
.FOR
Finalmente, dentro del PROGRAMA principal se debe declarar un
.F90 INCLUDE
del archivo que contiene los módulos, cuya extensión debe ser 27
Archivo: Areas.for
MODULE Compartir CONTAINS SUBROUTINE Impresion (Area, op) IMPLICIT NONE !Declaraiones de Variables INTEGER, INTENT(IN):: op, area ImpAreas: SELECT CASE (op) CASE (1) PRINT *, 'El area del Triangulo es ', area CASE (2) PRINT *, 'El area del Cuadrado es ', area CASE (3) PRINT *, 'El area del Circulo es ', area END SELECT ImpAreas END SUBROUTINE Impresión !Rutinas de las áreas SUBROUTINE Triangulo (op) IMPLICIT NONE INTEGER, INTENT(IN) :: op INTEGER :: base, altura, area PRINT *,'DAME LOS DATOS DEL TRIANGULO' PRINT *,'Dame la Altura' READ *,altura PRINT *,'Dame la Base' READ *,base Area = (base * altura)/2 CALL Impresion (Area, op) END SUBROUTINE Triangulo SUBROUTINE Cuadrado (op) !su bloque CALL Impresion (Area, op) END SUBROUTINE Cuadrado SUBROUTINE Circulo (op) !su bloque CALL Impresion (Area, op) END SUBROUTINE Circulo END MODULE Compartir 28
Archivo: Areas.f90
INCLUDE "Areas.for" PROGRAM SelecAreas USE Compartir IMPLICIT NONE INTEGER :: op PRINT *, 'Areas Disponibles' DO WHILE (Op /= 4) PRINT *, 'SELECCIONA UNA OPCION ENTRE 1..4' PRINT *, '(1) TRIANGULO' PRINT *, '(2) CUADRADO' PRINT *, '(3) CIRCULO' PRINT *, '(4) SALIDA' PRINT *, 'CUAL ES LA OPCION DESEADA' READ *, op Areas: SELECT CASE (op) CASE (1) CALL Triangulo (op) CASE (2) CALL Cuadrado (op) CASE (3) CALL Circulo (op) CASE (4) PRINT *, 'ABUR' CASE DEFAULT PRINT *, 'has hecho una seleccion eeronea el rango valido es 1..4' END SELECT Areas END DO END PROGRAM SelecAreas 29
MODULE Compartidas IMPLICIT NONE SAVE !Tipos Derivados TYPE Alumno CHARACTER (LEN = 12) :: nombre INTEGER :: PromEx, PromPr, PromTa, CaFi END TYPE Alumno INTEGER, PARAMETER :: Max = 45 END MODULE Compartidas PROGRAM PromAlumnos USE Compartidas IMPLICIT NONE TYPE ( Alumno ) :: UnAl ( Max ) INTEGER Cuantos !PROGRAMA PRINCIPAL CALL Lectura(UnAl, Cuantos) CALL Promedio(UnAl, Cuantos) CALL imprimir(UnAl, Cuantos) END PROGRAM PromAlumnos 30
CONTAINS Especifica que un módulo o procedimiento contiene procedimientos internos SAVE Se pueden utilizar MODULE (s) para pasar grandes cantidades de datos entre procedimientos dentro de un programa. Al incluir este comando se asegura que el contenido del MODULE , permanece sin cambio entre los USE .
PARAMETER Define el valor de una constante 31
FORTRAN 90 / 95
Arreglos: La siguiente expresión declara un arreglo
REAL, DIMENSION
(10) :: x x es el arreglo con 10 elementos, el arreglo puede tener más de una dimensión:
REAL, DIMENSION
(2,3) :: num num, es un arreglo de 2 dimensiones, la primera dimensión tiene una extensión de 2 y la segunda tiene una extensión de 3.
32
FORTRAN 90 / 95
Arreglos utlizando (memoria dinámica) Una manera de evitar el desperdicio de la memoria (que se hace al no utilizar la totalidad de la misma reservada en las declaraciones de arreglos con un máximo número de elementos predeterminados) es usando memoria dinámica de la siguiente manera: REAL, DIMENSION(:), ALLOCATABLE :: x x no tiene un tamaño específico hasta que aparece una declaración del tipo: ALLOCATE ( x(n) ) Cuando ya no se necesite, se remueve la localidad de memoria con la declaración: DEALLOCATE ( x ) 33
Ejemplo:
FORTRAN 90 / 95
INTEGER, DIMENSION(:), ALLOCATABLE :: vector INTEGER :: i DO i = 1,4 PRINT*, ‘Total elementos vector’ READ*, n ALLOCATE (vector(n) suma = 0.0
DO j = 1,n suma = suma + vector (j) ** 2 END DO PRINT *, ‘Suma de cuadrados = ’, suma END DO DEALLOCATE ( vector ) 34
FORTRAN 90 / 95
Estructuras: Son tipos de variables que encapsulan varios datos como una unidad.
TYPE
[[,
acceso
] ::]
nombredeltipo
[
PRIVATE
]
definición de componentes
END TYPE
[
nombredeltipo
] De manera predeterminada un tipo y todos sus componentes son accesibles (acceso público)
TYPE
registroestudiantil
CHARACTER
(20) nombre
INTEGER
numtareas
END TYPE
registroestudiantil 35
FORTRAN 90 / 95
Ejemplo PROGRAM registros IMPLICIT NONE TYPE DatosEstudiante CHARACTER(LEN =12) :: nomb,Ap1,Ap2 INTEGER ::edad END TYPE DatosEstudiante ! Declaración de variables TYPE (DatosEstudiante) :: alumnos(45) INTEGER :: i DO i = 1,max PRINT* , ‘dame el nombre del alumno’ READ*, PRINT*, alumnos(i) % nombre ‘dame la edad del alumno’ READ*, alumnos(i) % edad END DO END PROGRAM registros 36
FORTRAN 90 / 95
Apuntadores: La implementación de los apuntadores en FORTRAN se realiza mediante las siguientes declaraciones: POINTER , se usa para declarar a una variable tipo puntero.
Con la instrucción TARGET , se restringen las variables a las que un puntero puede apuntar.
REAL , POINTER :: p ! p apunta a un objeto del ! mismo tipo REAL , TARGET :: r = 13 ! r es una variable que puede ser ! apuntada por una variable de tipo ! puntero p r r p apunta a r , por lo que se le denomina apuntador o alias (atributo pointer).
es el objeto al que se refiere target).
p y está denominado como el objeto (atributo 37
FORTRAN 90 / 95
INTEGER, POINTER :: aa,bb,cc
INTEGER, TARGET :: xx,yy
aa
bb
cc
xx xx yy
aa
yy
38
FORTRAN 90 / 95
Lo que el código hace con las localidades de memoria es: aa xx aa bb xx cc aa yy 39
FORTRAN 90 / 95
Cualquier apuntador en un programa se encuentra en cualquiera de los siguientes 3 estados: indefinido: se encuentran así, en la declaración Nulo o desasociado: objeto.
significa que no apunta a ningún La asociación entre variables POINTERs y TARGETs se rompe con el uso de la siguiente instrucción.
• NULLIFY (p1) asociado: indica si el puntero posee un estado de asociación.
• • • nulo o desasociado se puede verificar con la función ASSOCIATED (p1), la cual nos regresa verdadero si p1 es un alias de un objeto y falso, si no lo es.
40
FORTRAN 90 / 95
Si deseamos manejar memoria dinámica, se declara de la siguiente forma: REAL , POINTER :: p1 ALLOCATE (p1) lo anterior indica que p1 apunta a un área de memoria disponible para almacenar una variable del tipo real.
Para liberar la memoria utilizar: DEALLOCATE (p1) Definir arreglos con apuntadores o (memoria dinámica): REAL, DIMENSION (:), POINTER :: x INTEGER, DIMENSION (:,:), ALLOCATABLE : : a 41
FORTRAN 90 / 95
Los apuntadores también pueden definirse para apuntar a tipos derivados de datos: TYPE (empleado), POINTER :: qqq qqq es una variable apuntador que señala objetos del tipo derivado de datos empleado.
TYPE empleado • • INTEGER :: numero CHARACTER (32) :: nombre END TYPE empleado 42
FORTRAN 90 / 95
Lo anterior se utilza para las listas encadenadas: TYPE Nodo • • • INTEGER :: ii CHARACTER (LEN = 2) :: identifi TYPE (NODO), POINTER :: puntero END TYPE Nodo Con esta declaración de tipo derivado se puede conseguir que unos datos apunten a otros.
43
FORTRAN 90 / 95
TYPE (Nodo), TARGET :: nn_1,nn_2,nn_3 !nn_1 apunta a nn_2 nn_1%ii = 1 nn_1%identifi = ‘ab’ nn_1%puntero nn_2 !nn_2 apunta a nn_1 nn_2%ii = 2 nn_2%identifi = ‘cd’ nn_2%puntero nn_1 !nn_3 apunta a nn_2 nn_3%ii = 3 nn_3%identifi = ‘ef’ nn_3%puntero nn_2 44
FORTRAN 90 / 95
Dentro de los avances que se observan en
Fortran 90 / 95
están: el gran conjunto de procedimientos intrínsecos, incluyendo las funciones elementales que operan en todos o en elementos seleccionados de los argumentos (arreglos).
Otro de sus grandes potenciales es la inclusión de estructuras de control bien definidas, y formas de tipificar las variables que se utilizan, así como mecanismos de abstracción que permiten aprovechar todo el potencial de los últimos avances de análisis y diseño de ingeniería de software.
45
FORTRAN 90 / 95
Sólo mencionaremos algunas de ellas:
Funciones numéricas elementales: ABS(A): Valor absoluto del número entero, REALo complejo A.
- ACOS(X): Coseno inverso (arco coseno) - AIMAG(Z): Parte imaginaria.
- COS(X): Coseno COSH(X): Coseno hiperbólico EXP(X): Función exponencial.
- LOG(X): Logaritmo natural.
46
FORTRAN 90 / 95
Funciones elementales para el uso de caracteres : ACHAR(I): Caracter con código ASCII I para I en el rango de 0-127.
CHAR(I [,KIND]): Caracter en la posición I de la secuencia obtenida por el sistema con un tipo dado.
ICHAR(C): Posición del caracter C en la secuencia obtenida por el sistema 47
FORTRAN 90 / 95
Funciones no elementales en el uso de caracteres LEN(STRING): (Función informativa) número de caracteres en STRING si es escalar o en un elemento de STRING si éste es un arreglo.
REPEAT(STRING, NCOPIES): Concatenación de NCOPIES de STRING; ambos argumentos son escalares.
TRIM(STRING): STRING (escalar) regresa la longitud sin espacios en blanco.
48
FORTRAN 90 / 95
Funciones relativas a representaciones numéricas : Son funciones relacionadas con los modelos (expresión matemática) usados para representar enteros y reales internamente.
DIGITS(X): Número de dígitos significativos en el modelo del número REALo entero X.
MAXEXPONENT(X): Máximo exponente (entero) en el modelo que incluye al número REALX.
FRACTION(X): Parte fraccionaria del modelo para X.
49
FORTRAN 90 / 95
Además existen otras funciones sobre: Manipulación de Bits Multiplicación de Vectores y Matrices Reducción de arreglos Información de arreglos e información de cualquier tipo Manipulación y construcción de arreglos Lógica Elemental - Relacionadas al tipo de variable También se incluyen Subrutinas intrínsecas no elementales sobre: Números aleatorios y el reloj de tiempo real.
50
fin
51