Sei sulla pagina 1di 10

Un breve curso de FORTRAN (por E.

Velasco)

Introducción
Escritura del programa
Conceptos básicos del lenguaje
• Variables
• Entradas y salidas
• Operadores matemáticos y funciones intrínsecas
• Salto incondicional
• Bucles
• Estructuras condicionales
• Subrutinas y funciones extrínsecas
Ejercicios y problemas

Introducción
El FORTRAN (FORmula TRANslator) es un lenguaje de programación muy
potente. Es el primer lenguaje científico, siendo desarrollado a últimos de
la década de los 50, pero es aún ampliamente utilizado en aplicaciones
científicas y de ingeniería. La última versión de FORTRAN actualmente es
la version FORTRAN 90, que reemplazó a la versión FORTRAN 77 a
comienzos de la década de los 90. El FORTRAN 90 incorporá nuevas
estructuras y características en su sintáxis, si bien aún es compatible con
la anterior versión. Por ello, en este breve curso se pasa revista a los
elementos básicos del FORTRAN 77. Se trata de un curso muy
introductorio; para una exposición más detallada habrá que consultar
algún manual de FORTRAN.
En los primeros tiempos de la informática cualquier cálculo que implicara
la evaluación de fórmulas matemáticas había de hacerse mediante
complicados programas, que traducían esas fórmulas al lenguaje del
ordenador, muy primitivo. EL FORTRAN es un lenguaje de alto nivel,
orientado a facilitar las cosas al usuario, y que permite escribir el
programa de manera casi idéntica a como se escriben las fórmulas en un
papel.
En FORTRAN las instrucciones que el usuario transmite al ordenador se
encuentran en un fichero de texto (en código ASCII), que es necesario
escribir (utilizando un editor de textos cualquiera). El nombre del fichero
sigue las convenciones del sistema operativo del ordenador. En DOS un
programa FORTRAN suele tener la extensión '.FOR', por ejemplo,
'CALCULO.FOR'; en Unix es tradicional que la extensión sea '.f', por
ejemplo, 'calculo.f'. Los nombres de los programas son libres (salvo ciertas
limitaciones de longitud y tipos especiales de caracteres que no pueden
aparecer en el nombre del fichero).
Al contrario que el BASIC, que es un lenguaje interpretado, el FORTRAN es
un lenguaje compilado. Ésto significa que, una vez escrito el programa,
éste ha de ser traducido en bloque al lenguaje máquina, o sea, el lenguaje
que entiende el procesador del ordenador, mediante un proceso llamado
compilación; por contra, en un lenguaje interpretado las líneas de
programa se van traduciendo según el flujo va pasando por ellas, con lo
que el proceso de ejecución se enlentece.
Escritura del programa
Las instrucciones del programa se escriben en el fichero dispuestas en
líneas. En FORTRAN 77 las columnas de la 1 a la 5 se reservan para que se
puedan incluir etiquetas, en forma de números, que hagan de señalización
con vistas a la posibilidad de que el flujo del programa vuelva a esa línea
desde otra parte del programa. La columna 6 se reserva para incluir un
símbolo que le indique al compilador que esa línea es la continuación de la
línea anterior. Por tanto, las instrucciones del programa en sí comienzan a
partir de la columna 6 (es decir, de la 7 a la 80). Un ejemplo de programa
sencillo es:
PROGRAM EJEMPLO
REAL A, B, C
A=1
B=A+1
PRINT *, A,B
C=A+B+1
PRINT *,'C es igual a=',C
END
En este programa se introduce un 1 en la variable A (ahora veremos qué
son las variables); a continuación se define la variable B como A más 1, y
se escriben las dos variables en la pantalla. Luego se define la variable C
como la suma de A, B y 1 y, finalmente, se escribe un letrero y el valor de C
en la pantalla. Es imprescindible acabar los programas con la instrucción
END. Por contra, la instrucción que indica el comienzo del programa,
PROGRAM, no es imprescindible, aunque su presencia es recomendable
para hacer más clara la estructura en caso de que existan subrutinas y
funciones definidas en el programa (ver más abajo).
Conceptos básicos del lenguaje
• VARIABLES
El primer concepto importante es el de variable. Una variable es una
zona reservada en la memoria del ordenador, a la que se asigna un
nombre. En esta zona podemos guardar un número, o bien una
secuencia o cadena de caracteres. Las variables en las que se
pueden almacenar números se llaman numéricas, y pueden tener
como nombres una combinación de caracteres, si bien el primero no
puede ser un número; el número de caracteres varía según el
compilador. En el programa-ejemplo anterior, A, B y C son variables.
Otros ejemplos pueden ser SUMA,RESTO, RESUL1, etc. Las variables
se definen al comienzo del programa (es conveniente de hecho,
aunque no obligatorio en FORTRAN 77, definir todas las variables de
un programa al comienzo del mismo).
Las variables numéricas pueden ser enteras, reales o complejas. Nos
referiremos aquí a las enteras y a las reales. Las variables enteras
contienen números enteros (es decir, sin parte fraccionaria), p. ej.,
-5, y se definen al comienzo del programa mediante la instrucción
INTEGER. Las variables reales contienen números reales, ya sea con
notación decimal (p.ej. 3.14159) o exponencial (p.ej.1.457E5, que
quiere decir 1,457.10^5), y se definen al comienzo del programa
mediante la instrucción REAL. Dependiendo de la precisión con la
que queramos representar los números que va a contener la
variable, las variables enteras y reales pueden ser de simple
precisión (cuatro bytes) o de doble precisión (ocho bytes). Este
hecho se indica en la definición de la variable; p. ej.,
REAL*4 SUMA
REAL*8 RESTO
define SUMA como una variable real de simple precisión, y RESTO
como una variable real de doble precisión. Si no se indica la
precisión, el compilador entiende que se trata de variables reales en
simple precisión, p. ej., REAL SUMA es equivalente a REAL*4 SUMA.
Algunos compiladores permiten el uso de variables reales de
cuádruple precisión, definidas con REAL*16. En notación
exponencial las variables reales de simple, doble y cuádruple
precisión se definen con la letra E, D y Q, para el exponente; p. ej.,
-3.14159E0, 5.67899876478E4, -1.276238978673524678Q-3. Para
las variables enteras, tenemos
INTEGER*4 PRIMER
INTEGER*8 SEGUN
Si no se especifica la precisión, el compilador entiende que la
variable entera es de simple precisión. Algunos compiladores
permiten definir variables enteras de sólo dos bytes. Recuérdese
que n bits permiten representar números enteros (negativos y
positivos, incluyendo el cero) entre -2n-1+1 y 2n-1. Así, dos bytes (es
decir, 2.8=16 bits) permiten representar números sólo entre -32767
y +32768.
Las variables en las que se pueden almacenar caracteres se llaman
alfanuméricas; su nombre sigue las mismas convenciones que el de
las variables numéricas, pero se definen mediante la instrucción
CHARACTER, seguida de *n, siendo n el número de caracteres que
puede almacenar la variable. Así, p. ej.,
CHARACTER*10 NOMBRE
define una variable llamada NOMBRE que puede contener hasta diez
caracteres. Los caracteres almacenados en las variables
alfanuméricas pueden ser cualesquiera y han de estar incluidos
entre comillas simples, p. ej., '1', 'El resultado es:', etc.
Se pueden definir conjuntos de variables, a modo de componentes
de un vector o matriz. Estas variables tienen un nombre y un índice.
Por ejemplo, A(I) es una componente del vector A; la variable I
contiene un número entero y es un índice. También podemos tener
matrices, p. ej., B(I,J), con dos índices, I y J. Las variables vectores
y matrices también han de declararse al principio del programa, con
la instrucción DIMENSION; Así, podemos escribir
DIMENSION A(10)
lo que indica que el vector A tiene diez componentes, A(1), A(2), ...,
A(10).
Para una más extensa exposición del tema de variables en
FORTRAN, consúltese un manual.

• ENTRADAS Y SALIDAS
Las entradas de datos a un programa y las salidas de datos
producidos por éste se realizan en FORTRAN por medio de las
instrucciones READ y WRITE. Para escribir también se utiliza la
instrucción PRINT. La sintáxis de las instrucciones READ y WRITE
es:
READ (unidad, formato) lista de variables
WRITE (unidad, formato) lista de variables
Para una explicación de las unidades de lectura y escritura y los
formatos es FORTRAN se recomienda acudir a un manual de
FORTRAN. La situación más sencilla es aquélla en la que los datos se
introducen mediante el teclado, y los datos salen en la pantalla, con
formato libre. En estos casos se utiliza la sintáxis
READ (*,*) lista de variables
WRITE (*,*) lista de variables
Para la escritura en la pantalla con formato libre existe también la
instrucción PRINT *,(la coma es parte de la instrucción).
Por ejemplo, el siguiente programa lee desde el teclado dos
variables, A y B, las suma y envía el resultado a la pantalla:
PROGRAM SUMA
REAL A, B, C
READ (*,*) A, B
C=A+B
WRITE (*,*) 'La suma es: ', C
END

• OPERADORES MATEMÁTICOS Y FUNCIONES INTRÍNSECAS


Los números y variables numéricas se pueden combinar utilizando
operadores matemáticos, como + (suma), - (resta), *
(multiplicación) y / (división; en el caso de división entre enteros la
división es la división entera, p. ej., 3/2 = 1). Otra operación
matemática de interés es la exponenciación, que se representa
mediante ** ; p. ej., 2**3 es dos elevado al cubo.
Algunas funciones están incluidas en el FORTRAN. Son las funciones
intrínsecas, cuyo argumentos (o argumentos) se incluyen entre
paréntesis. Funciones intrínsecas son la raiz cuadrada, SQRT, la
funciones trigonométricas seno, SIN, coseno, COS, tangente, TAN,
arcoseno, ASIN, arcocoseno ACOS, arcotangente, ATAN, la función
exponencial, EXP y algunas otras. La sintáxis de estas funciones es,
p. ej.,
SQRT(3.0), SIN(2.3), EXP(-1.0).
Obsérvese que los argumentos de estas funciones son números
reales en simple precisión. Si los argumentos son en doble precisión
hay que colocar la letra D delante del nombre de la función. Así, p.
ej., tendríamos
DSQRT(3.0D0), DSIN(2.3D0), DEXP(-1D0).

• SALTO INCONDICIONAL
Un salto incondicional es un cambio del flujo de un programa a otra
línea de éste. Esta línea de destino ha de estar identificada con un
número de línea, que debe situarse en las columnas 1-5. El salto se
produce cuando el control del flujo encuentra la instrucción GO TO,
seguida del número de la línea de destino. Un ejemplo de programa
con salto incondicional sería
A = 2.0
B = SQRT(A)
...
GO TO 1
...
1 C = B**2
...
donde ... indica un número indeterminado de líneas de programa.
Obsérvese cómo el flujo del programa cambiaría a la línea
identificada con el número 1 cuando el flujo pase por la instrucción
GO TO 1 y que, por tanto, las líneas de programa desde esa
instrucción hasta la línea 1 no se ejecutarían. Al identificar las líneas
de programa mediante números, téngase en cuenta que los
números son simples etiquetas, y que no tiene por qué mantenerse
una numeración creciente.

• BUCLES
El bucle es una estructura que permite efectuar repeticiones de un
conjunto de instrucciones. Las instrucciones de control de un bucle
son DO-END DO. Asociada al bucle existe una variable de control,
normalmente entera, que hace de índice. La sintáxis general de la
estructura en bucle es
DO índice = valor inicial, valor final, incremento
...
END DO
En cada iteración la variable índice va cambiando, desde valor inicial
hasta su valor final, aumentando cada vez su valor en incremento.
Éste último puede no aparecer, en cuyo caso se considera
implícitamente que su valor es la unidad. El siguiente ejemplo
resuelve la ecuación implícita x=cos x mediante el método de las
iteraciones:
PROGRAM TRASCEND
REAL X
INTEGER N
READ (*,*) X, N
DO I = 1, N
X = COS(X)
END DO
WRITE(*,*) X
END
La instrucción READ lee un valor inicial aproximado, X, para la
solución de la ecuación (que es 0,739085), y el número de
iteraciones que se desea, N. Una vez efectuadas las N iteraciones, el
bucle acaba y se escribe el resultado con WRITE. El modo en que la
estructura DO-END DO funciona es el siguiente. En la primera
iteración la variable de control, en este caso I, asume el valor inicial,
1. Se ejecuta la instrucción del bucle, y cuando el control llega a la
instrucción END DO se vuelve a transferir el flujo al comienzo del
bucle. El índice I toma ahora el valor 2, y así se repite el bucle hasta
que el valor de I es N, en cuyo caso se efectúa la iteración por última
vez y el flujo continúa con las instrucciones que vienen después del
END DO. En el ejemplo, el total de iteraciones realizadas es N. Como
prueba de este programa, se pueden ensayar valores iniciales para X
de 1, y un número de iteraciones N variable entre 10 y 40.
Una aplicación interesante de la estructura DO-END DO es la suma
de series infinitas de números. Consideremos la serie
1/1² + 1/2² + 1/3² + 1/4² + ...

cuya suma es pi²/6. Un simple programa permite calcular las sumas


parciales de esta serie:
SUM = 0.0
READ (*,*) N
DO I = 1, N
SUM = SUM + 1.0/I**2
END DO
PRINT *, SUM
END
Este programa calcula la suma parcial con N términos, SN.
Aumentando el valor N se puede valorar si la serie converge o no, y
en su caso la cantidad a la que converge. La siguiente tabla ha sido
producida con el programa anterior.
N SN
1.5497677
10
3
1.6349839
100
0
1.6439345
1000
7
1000 1.6448340
0 7
2000 1.6448840
0 7
3000 1.6449007
0 3
4000 1.6449090
0 7
Cambiando la línea interior del bucle, obviamente, se pueden sumar
otras series.

• ESTRUCTURAS CONDICIONALES
Una condición es una situación en la que dos variables se comparan
y, dependiendo del resultado de esa comparación, se ejecuta una
instrucción o conjunto de instrucciones. El tipo más sencillo de
estructura que involucra una condición es, por ejemplo,
AMIN = A
IF (A .GT. B) AMIN = B
...
Esta estructura determina el mínimo de los valores de dos variables,
A y B, y lo almacena en la variable AMIN. La instrucción IF efectúa la
comparación entre A y B, utilizando el operador .GT. (del inglés
Greater Than). Si A>B, se ejecuta la instrucción AMIN = B. Si no se
cumpliese esa condición, el control pasaría directamente a las líneas
que siguen a la línea, representadas por ..., sin que la instrucción
AMIN = B se ejecutara.
Los operadores matemáticos condicionales son:
.EQ. : igual a (EQual to)
.LT. : menor que (Less Than)
.GT. : mayor que (Greater Than)
.LE. : menor o igual que (Less to or Equal than)
.GE. : mayor o igual que (Greater to or Equal than)
Una estructura condicional más sofisticada es la estructura IF-THEN-
ELSE-END IF. Esta estructura permite ejecutar un bloque de
instrucciones u otro dependiendo del resultado de la condición. La
estructura se utiliza de la forma
IF (condición) THEN
...
ELSE
...
END IF
Si el resultado de la condición es verdadero, se ejecutaría el primer
bloque de instrucciones (antes del ELSE), mientras que si es falso,
se ejecutaría el segundo bloque de instrucciones (después del
ELSE). La segunda parte se puede también eliminar, quedando la
estructura más simple
IF (condición) THEN
...
END IF
Sólo en el caso en que la condición sea verdadera se ejecutaría el
bloque de instrucciones ... Si la condición resultara falsa, se
continuaría con las instrucciones situadas a continuación del END IF
sin que se ejecuten las instrucciones situadas dentro de la
estructura IF-THEN-END IF.
La última estructura condicional interesante es el salto condicional.
Un salto condicional es un cambio del flujo de un programa a otra
línea de éste, pero siempre que se cumpla una determinada
condición. Al igual que en los saltos incondicionales, la línea de
destino ha de estar identificada con un número de línea, que debe
situarse en las columnas 1-5. El salto se puede producir cuando el
control del flujo encuentra una instrucción IF:
IF (condición) GO TO número de línea
Como ejemplo de las estructuras condicionales, vamos a efectuar la
suma de la serie
1/1²+1/2²+1/3²+1/4²+1/5²+...
cuyo término general es 1/n². El programa, obviamente, no puede
calcular la suma infinita, pero sí sumas parciales de la serie.
Supongamos que queremos sumar los M primeros términos de la
serie, es decir, calcular la suma parcial SM). El siguiente programa
resuelve este problema con ayuda de un salto condicional:
PROGRAM SERIE
REAL SUM
INTEGER M, N
M = 10
SUM = 0.0
N=0
N=N+1
IF (N .LE. M) THEN
SUM = SUM + 1/N**2
GO TO 1
END IF
PRINT *, SUM
END

• SUBRUTINAS Y FUNCIONES EXTRÍNSECAS


Muchas veces es necesario en un programa efectuar un conjunto de
instrucciones de una manera reiterativa. Las subrutinas y funciones
evitan tener que escribir el mismo trozo de código varias veces.
Además, ayudan a hacer el programa más ordenado e inteligible. Las
subrutinas y funciones extrínsecas son trozos de programa que se
definen separadamente del programa principal, y sus variables
necesitan ser definidas en la subrutina ya que son variables locales,
no compartidas con el programa principal o con las de otras
subrutinas.
Subrutinas
Se definen mediante la instrucción SUBROUTINE. La subrutina ha de
acabar con un END. La sintáxis completa es
SUBROUTINE nombre (lista de argumentos)
...
END
La subrutina se invoca con la instrucción CALL. Un ejemplo de
utilización de subrutinas es la transformación entre coordenadas
polares y cartesianas:
PROGRAM POLAR_CARTES
REAL X, Y, RHO, THETA
READ (*,*) RHO, THETA
CALL POLARES (X, Y, RHO, THETA)
PRINT *, X, Y
END
SUBROUTINE POLARES (X, Y, RHO, THETA)
REAL X, Y, RHO, THETA
X = RHO * COS (THETA)
Y = RHO * SIN (THETA)
END
Funciones extrínsecas
La sintáxis es muy parecida a la de las subrutinas pero, al contrario
que en éstas, en las que puede haber cualquier número de
argumentos de entrada y salida, en las funciones sólo hay una
variable de salida, que es el propio nombre de la función. Se definen
mediante la instrucción FUNCTION, y acaba también con END. La
estructura general es
FUNCTION nombre (lista de argumentos)
...
END
Un ejemplo es el cálculo de la función factorial:
PROGRAM CALCULO_FACT
INTEGER N
REAL FACT, FACTORIAL
READ (*,*) N
FACT = FACTORIAL (N)
PRINT *, FACT
END
FUNCTION FACTORIAL (N)
INTEGER I, N
REAL FACTORIAL, PROD
PROD = 1.0
DO I = 2, N
PROD = PROD * I
END DO
END
Obsérvese que el nombre de la función ha de ser declarado como si
fuera una variable más, tanto en el programa principal de llamada
como en la propia función.
Ejercicios y problemas
• Rutina para sumar una serie
• Multiplicación de matrices
• Interpolación de Lagrange

Actualizado el 7 de febrero de 2001 por E. Velasco