Вы находитесь на странице: 1из 65

ABC de Fortran

Curso de Física Computacional

M. en C. Gustavo Contreras Mayén


Elementos básicos de un programa en
Fortran

Nombre del programa.


El nombre del programa es en realidad opcional,
pero es muy buena idea tenerlo.

Zona de declaración.
Aquí se declaran las variables, constantes,
arreglos que se van a utilizar dentro del
programa.
Cuerpo del programa.
Son los comandos que se van a ejecutar en el
código. Los comandos se ejecutan en orden de
aparición.

Zona de cierre.
El programa siempre debe terminar con el
comando END.
Subprogramas
El cuerpo del programa puede llamar a otros
subprogramas para que realicen tareas
específicas.
Es buena práctica de programación separar un
programa en bloques y poner cada bloque en
diferentes subprogramas. De hecho, para
programas largos es buena idea tener cada
subprograma en archivos separados.
Estructura de un comando en Fortran

Los comandos se escriben en líneas de a lo más


132 caracteres (aunque algunos compiladores
aceptan lineas más largas).

Espacios en blanco al principio de una linea se


ignoran. Esto ayuda a mejorar visualmente la
estructura del programa.
Un signo & al final de una línea indica que el
comando continua en la linea siguiente.

Todo lo que siga de un signo ! se considera un


comentario y es ignorado por el compilador.

Es posible poner varios comandos en una línea


separándolos con punto y coma.

Importante: FORTRAN no distingue entre


mayúsculas y minúsculas en un programa,
también ignora más de un espacio en blanco y
lineas en blanco.
Programa hola mundo

PROGRAM hola
! Ahora vamos a saludar al mundo
print *, ‘hola mundo!’
END PROGRAM hola
Compilar un programa
Algunos lenguajes de programación no usan un
compilador, sino un “intérprete” (por ejemplo
BASIC y PERL). La diferencia es que un
intérprete traduce y ejecuta línea por línea, sin
nunca crear un archivo ejecutable.

Un intérprete es más transparente de usar, pero


mucho más lento. FORTRAN funciona siempre
con un compilador.
La manera estándar de compilar un programa
en FORTRAN es abrir una terminal, ir al
directorio que contiene el programa, y escribir:

$> gfortran nombre1.f90

donde nombre1.f90 es el nombre del programa.


Es importante notar que el comando gfortran
puede variar de nombre, por ejemplo el
compilador de INTEL usa el comando ifc o
ifortran.
Al compilar el programa se obtiene un archivo
ejecutable que tiene por default el nombre:
a.out

Para cambiar el nombre del archivo, tecleamos el


comando:

$> gfortran nombre1.f90 -o nombre2.out

La opción -o le dice al compilador que el


ejecutable debe llamarse nombre2.
Para ejecutar el programa se escribe simplemente:

$> ./nombre2.out

donde se usa ./ para indicar a Unix/Linux que debe


buscar el ejecutable en el directorio local.
El código de Fortran
En el curso utilizaremos la técnica de escritura de
código de Fortran necesaria para compilar con
gfortran en Linux, para ello es necesario
considerar lo siguiente:
La primera línea de código inicia en la columna 7,
las primeras 6 columnas están reservadas para
sentencias o comentarios.
Si utilizas una extensión diferente a .f90 el
compilador puede que te muestre un mensaje de
error, ya que como hay caracteres especiales en
zonas reservadas, si no cuenta con el formato
debido, el programa no se compilará.

Recomendamos altamente que siempre uses el


formato f90, ya que gfortran lo reconoce sin
problema alguno.
Tipos de datos 1/3
Logical. Las variables lógicas solo pueden tener
dos valores: .true. (verdero) o .false. (falso).
Integer. Valores enteros guardados en 4 bytes.
Se indican como números sin punto decimal: 1, 2,
-3, 25, etc.
Real. Valores reales guardados en 4 bytes y con
8 cifras significativas. Se indican con punto
decimal, y de ser necesario el exponente de la
potencia de 10 después de una E: 1., -3.1416,
6.25E-10, etc.
Tipos de datos 2/3

Double. Valores reales de cuádruple precisión


guardados en 16 bytes y con 32 cifras
significativas, también se denotan por real(16)

Se indican con punto decimal y el exponente de la


potencia de 10 después de una Q: 1.Q0,
-3.1416Q0, 6.25Q-10, etc.
Tipos de datos 3/3
Complex. Dos valores reales formando un par y
que en operaciones matemáticas se tratan como
la parte real e imaginaria de un número complejo:
(1.,-2.), (1.0E0,-2.0E0). También existen
versiones de doble y cuádruple precisión.

Character. Variables que corresponden a


cadenas de caracteres. Al declarar una variable
de este tipo se debe especificar cuántos
caracteres puede tener. Estas variables deben
estar contenidas en comillas: ’hola’, ’abcdfe’, ’Me
llamo Luis’, ’128.3’, etc.
PROGRAM mi_primer_programa

!Declara las variables a usar Declaración


INTEGER :: i,j,k

WRITE (*,*) ‘Dame los números a multiplicar’


READ (*,*) i,j

k= i * j

WRITE (*,*) ‘Resultado = ‘, k


Ejecución

STOP
END PROGRAM

Cierre
Zona de Declaración
Consiste en una serie de enunciados al inicio que
definen el nombre del programa , la cantidad de
variables, constantes, arreglos, así como el tipo de
datos.

El primer enunciado es PROGRAM. Su longitud


máxima es de 31 caracteres.

Debe de iniciar con una letra.


Siempre será el primer enunciado en un programa.
Variables y constantes
Una constante es un dato que se define antes de
ejecutar el programa, NO cambia de valor durante
la ejecución del mismo.

Una variable es un dato que cambia de valor


durante la ejecución del programa.

Las variables en Fortran deben de tener un


nombre único, deben de comenzar con un
carácter alfabético, su nombre no debe de
exceder más de 31 caracteres, y no usar nombres
reservados.
Declaración de tipo de dato por
defecto

Aquellas variables cuyo nombre inicie con las


letras I, J, K, L, M o N se suponen como tipo
entero, no hay necesidad de declararlas al inicio
del programa.

Todas aquellas variables cuyo nombre inicie con


otra letra, se asumen como tipo real.
Para declarar una variable de manera explícita,
lo hacemos en la zona de declaración.

INTEGER :: var1, var2, var3, …


REAL :: vareal, vareal2, vareal3, …
LOGICAL :: varlog1, varlog2, varlog3, …

Nota: usar dobles puntos (::) es opcional, sirve


para homologar códigos de versiones
anteriores de Fortran.
Constantes nombradas
La declaración de constantes es la siguiente:

tipo, PARAMETER :: nombre = valor

Ejemplos:

REAL, PARAMETER :: pi = 3.141593

CHARACTER, PARAMETER :: mensaje = ‘Error23’


Aritmética real y entera
Entera:
Se realiza sólo con tipo de dato INTEGER.
En la división NO hay residuo, se trunca el
resultado.

Real:
Usa tanto variables y constantes.
En la división se presenta con residuo (con una
precisión limitada)
Orden de evaluación de las expresiones

1. El contenido de paréntesis se evalúa primero,


comenzando por los más internos.
2. Las operaciones de potencias se realizan de
derecha a izquierda
3. Todas las multiplicaciones y divisiones, de
izquierda a derecha.
4. Las sumas y restas también se evalúan de
izquierda a derecha.
Sean a =3, b = 2, c = 5, d= 4, e = 10, f = 2,
g=3

Calcular:

(1) a * b + c * d + e / f ** g

(2) a * (b + c) * d + (e / f) ** g

(3) a * (b + c) * (d + e) / f ** g
Resultados

(1) 27.25

(2) 209

(3) 36.75
Operadores relacionales

Consiste en una relación de dos operandos


numéricos o de cadena, cuya evaluación
devuelve un valor lógico (booleano).

a1 operador a2
Operadores de relación

== .EQ. Igual a
/= .NE. Diferente a
> .GT. Mayor que
>= .GE. Mayor o igual que
< .LT. Menor que
<= .LE. Menor o igual que
Operadores lógicos

Consiste en uno, dos o más operandos lógicos


que devuelven un valor lógico (booleano).

L1 operador L2
Operadores lógicos
L1 .AND. L2 es verdadero si L1 y L2 son
verdaderos.

L1 .OR. L2 es verdadero ya sea que L1 sea


verdadero o lo sea L2.

L1 .EQV. L2 es verdadero si L1 tiene el


mismo valor que L2.

L1 .NEQV. L2 es verdadero si L1 y L2 son


verdadero y falso, respectivamente.

.NOT. L1 el resultado es verdadero si L1 es


falso, y falso si L1 es verdadero
Funciones intrínsecas
Una función es una expresión que acepta uno o
más valores de entrada (parámetros) y calcula un
resultado a partir de ellos.

Fortran incluye una serie de funciones intrínsecas


matemáticas, de caracteres, de arreglos.

A partir de estas funciones, se pueden construir


otras, que reciben el nombre de funciones
externas o definidas por el usuario.
Funciones intrínsecas
SQRT(X) INT(X)
ABS(X) NINT(X)
ACHAR(I) REAL(I)
SIN(X) MOD(A,B)
COS(X) MAX(A,B)
MIN(A,B)
TAN(X)
ASIN(X)
EXP(X) ACOS(X)
LOG(X) ATAN(X)
LOG10(X)
IACHAR(C)
Enunciados de entrada/salida

Una instrucción de entrada, lee uno o varios


valores de un dispositivo de entrada y los
almacena en una variable que ya ha sido definida.

El dispositivo de entrada puede ser un teclado o


un archivo de datos.

Mientras que una instrucción de salida “escribe”


uno o varios valores en un dispositivo de salida,
que puede ser un monitor o un archivo de datos.
Enunciado de entrada
READ (*,*) lista_entrada

donde lista_entrada es el conjunto de variables a


leer.
Los paréntesis (*,*) indican la forma en la que se
va a controlar la información.
El primer * especifica la unidad de entrada/salida
de la cual el dato se va a leer.
Usar un * indica que el dispositivo de entrada
estándar es el teclado.
El segundo * indica el formato con el que el dato
se va a leer.
Enunciado de salida
WRITE(*,*) lista_salida

donde lista de salida es un conjunto de datos


(variables, constantes y expresiones) que serán
desplegadas.

El uso de paréntesis (*,*) es de la misma forma


que en el caso de READ.

El dispositivo estándar de salida, es el monitor.


Estructuras de control y
diseño de un programa en
Fortran
Inicio

Identificar el tipo de
problema que queremos
resolver
División lógica de tareas
(descomposición)

Diseñar el algoritmo
Refinamiento de
las instrucciones

Convertir el algoritmo en
instrucciones de Fortran

Probar el programa

Pasos para el diseño


de un Programa
Fin
¿Qué es un algoritmo?

Un algoritmo es un procedimiento que


ejecuta una serie de instrucciones paso a
paso, para resolver un problema.
Control del programa: Condicionales

Al momento de programar un código, será


necesario evaluar alguna condición dependiendo
del valor de otra(s) variable(s). En Fortran las
sentencias condicionales para evaluar son
cuatro:

i. IF ...
ii. IF ... ELSE ...
iii. IF ... ELSE IF ....
iv. SELECT CASE ...
Sentencia IF ...

IF expresion THEN
instrucción1
instrucción2
...
END IF

Si expresion tiene un valor verdadero, se ejecutan


las instrucciones contenidas dentro del bloque de
la sentencia IF, en caso de que expresion sea
falso, no se ejecuta nada y continua el código.
Sentencia IF ... ELSE
IF expresion THEN
instrucción1
...
ELSE
instrucción1
...
END IF

Si expresion tiene un valor verdadero, se


ejecutan las instrucciones contenidas dentro del
bloque de la sentencia IF, en caso de que
expresion sea falso, se ejecutan las instrucciones
del bloque ELSE.
Sentencia IF ... ELSE IF ...

IF expresion1 THEN Si expresion1 tiene un valor


instrucción1 verdadero, se ejecutan las
... instrucciones contenidas
dentro del bloque de la
ELSE IF expresion2 THEN sentencia IF, si expresion1
instrucción1 es falso, se evalúa
... expresion2 si es verdadero,
se ejecutan las
END IF instrucciones del bloque, si
es falsa, sale de la
sentencia.
Sentencia IF ... ELSE IF ... ELSE
IF expresion1 THEN
instrucción1
...
ELSE IF expresion2 THEN
instrucción1
...
ELSE
instrucción1
... Si expresion1 es falsa y
END IF expresion2 es también
falsa, se ejecutan las
instrucciones del bloque
ELSE.
Sentencias anidadas
En ocasiones tendremos que recurrir a
sentencias, dentro de otras sentencias, que
en programación se le llama SENTENCIAS
ANIDADAS, por lo que hay que tener
cuidado al momento de teclar, por que cada
sentencia que se inicia, debe de cerrarse, si
falta alguna instrucción de cierre, Fortran
nos marcará un error.
IF condicion1 THEN
...
IF condicion2 THEN
...
IF condicion3 THEN
...
END IF
...
END IF Nótese que la identación
... del código nos va a ayudar
END IF bastante para no
“perdernos” al momento de
teclear nuestro código.
IF condicion1 THEN
...
IF condicion2 THEN
... La probabilidad de
IF condicion3 THEN cometer errores de
... sintaxis, por falta de una
END IF instrucción de cierre, es
... mayor cuando no
END IF identamos el código.
...
END IF
Ejercicio
En un ejemplo sencillo usando los condicionales,
habilita un programa que indique la calificación a
partir del puntaje obtenido en un examen:

95 < Calif A
86 < Calif ≤ 95 B
76 < Calif ≤ 86 C
66 < Calif ≤ 76 D
0 < Calif ≤ 66 E
Sentencia
SELECT CASE (expresion1)
CASE (valor1) SELECT CASE
instrucción1
expresion1 se toma como
... referencia, y se va
CASE (valor2) comparando contra valor1, si
instrucción1 son iguales, se ejecutan las
... instrucciones contenidas en el
bloque y sale de la sentencia,
... si no son iguales, se compara
CASE DEFAULT contra valor2, etc. Si no hay
instrucción1 coincidencias, se ejecutan las
... instrucciones del bloque CASE
DEFAULT.
END SELECT
Ejemplo
INTEGER :: valor
...
SELECT CASE (valor)
CASE (1,3,5,7,9)
WRITE (*,*) 'El valor es impar'
CASE (2,4,6,8,10)
WRITE (*,*) 'El valor es par'
CASE (11:)
WRITE (*,*) 'El valor ya es mayor'
CASE DEFAULT
WRITE (*,*) 'El valor es negativo o
cero'
END SELECT
Control del programa: Bucles

Nos permiten repetir una serie de instrucciones


más de una vez, la característica importante de
los bluce en Fortran radica en la manera en que
la repetición se lleva a cabo.

i. DO WHILE ... (bucle de iteración)

ii. DO índice ... (bucle de conteo)


DO WHILE

DO WHILE expresion1 expresion1 es de tipo lógico, si


instruccion1 es verdadera se ejecuta el
conjunto de instrucciones
instruccion2 instruccion1 hasta
... instruccionN, el ciclo se repite
... hasta que expresion1 cambie
instruccion N a un valor falso.
END DO
DO WHILE de conteo
DO índice = inicio, final, incremento
instruccion1
instruccion2
...
instruccion N
END DO
La variable índice es de tipo entero, se le asigna el
valor inicio, se ejecutan las instrucciones del bloque, se
incrementa el valor de índice de acuerdo a incremento
(también llamado paso), si no se indica algún valor, el
cambio es unitario, el ciclo se repite hasta que índice
alcanza el valor final.
Ejercicios:
1. Escribe un programa que calcule el
factorial de un número que proporcione el
usuario.

2. Escribe un programa que calcule los


números de Fibonacci.
Formatos para mostrar datos de
entrada y de salida

El utilizar las instrucciones WRITE(*,*) y


READ(*,*) como lo hemos hecho hasta el
momento, tienen un formato libre.

Es posible modificar el formato para dejarle


una apariencia mucho más notable a la
información que nos devuelve un programa.
WRITE (*,100) i, resultado
100 FORMAT ('El resultado de la iteracion ', I3, ' es ', F7.3)
Cuando se ejecuta un programa en Fortran, el
resultado se envía a un dispositivo de salida, tal
como una impresora o un monitor.

Las especificaciones de salida en Fortran están


pensadas para una impresora, pero son útiles al
direccionar el resultado a un monitor.
La salida se envía a una línea de impresión. La
computadora crea una imagen completa de cada
línea en memoria antes de enviarlo al dispositivo
de salida.

A este tipo de memoria se le llama buffer de


salida.

El buffer de salida utiliza un ancho de 133


caracteres, el primero de ellos se llama caracter
de control.
Buffer de salida

Caracteres de control en Fortran

Caracter Acción

1 Salta a una nueva línea


En blanco Espacio sencillo
0 Doble espacio
+ Sin espacio (se sobre-escribe)
Descriptores de formato
1. Describen la posición vertical de una línea
de texto.
2. Describen la posición horizontal de un
valor en una línea.
3. Describen el formato de salida de un valor
en particular.
4. Controlan la repetición de segmentos de
un formato.
Símbolos utilizados en los descriptores de
formato

Símbolo Significado
c Número de columna.
d Número de dígitos a la derecha del punto
decimal, para entradas o salidas.
m Mínimo de dígitos a mostrar.
n Número de espacios.
r Contador de repetición, es el número de
veces que se usa un descriptor o grupo de
descriptores.
w Ancho del campo, número de caracteres a
usar en la entrada o salida.
Salida para enteros I
Tiene como forma general
rIw o rIw.m

INTEGER index=-12, junk = 4, numero=-12345


WRITE (*,200) index, index+12, junk, numero
WRITE (*,210) index, index+12, junk, numero
WRITE (*,220) index, index+12, junk, numero
200 FORMAT ( ' ', 2I5, I6, I10)
210 FORMAT ( ' ', 2I5.0, I6, I10.8)
220 FORMAT ( ' ', 2I5.3, I6, I5)
Resultado
Salida para reales F
Tiene como forma general
rFw.d

Salida para reales E


Para representar un valor real en notación
científica, se utiliza el descriptor E
rEw.d
Salida para
caracteres A Para darle formato a una
cadena, se utiliza el
descriptor A
rA o rAw
Posición horizontal X y T
Son dos descriptores de formato que permiten
darle un mayor control de espaciamiento de
datos.

nX inserta n espacios en blanco en la línea.

Tc hace una “tabulación” a una columna


específica de la línea

Вам также может понравиться