Está en la página 1de 107

FUNDAMENTOS 

DE FORTRAN 90
ESTRUCTURA DE UN PROGRAMA FORTRAN
Editamos fichero texto .f90 , columnas 1‐132 , comentarios con ! al inicio de la línea
Sentencias declarativas
SALUDO [program nombre_programa]
implicit none
integer :: ivar1, ivar2, ivar3,….
DECLARACIÓN DE VARIABLES real:: rvar1, rvar2,….
character :: cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….
!interacción con el usuario
write(*,*) ‘Dame dos números’
ENTRADA DE DATOS read(*,*) ivar1, ivar2
!sentencias de asignación
ivar1=3
Sentencias ejecutivas

ivar2=4
!lectura de un fichero

!cálculos con los datos de entrada para obtener el 
ALGORITMO
resultado y solucionar el problema que nos plantean
!interacción con el usuario: volcado en pantalla
SALIDA DE DATOS
write(6,*) ‘El resultado es’, ivar3
!volcado a un fichero
DESPEDIDA end [program nombre_programa]
PASOS A SEGUIR:  de la escritura a la ejecución

EDITAR: editamos fichero texto .f90 , columnas 1‐132

COMPILAR:  compilamos en el terminal o en símbolo del sistema para traducir el 
“código fuente”

gfortran nombre_programa_fuente.f90    –o     nombre_ejecutable(.exe)

EJECUTAR:  ejecutamos  escribiendo en el terminal o en símbolo del sistema el 
nombre del ejecutable

nombre_ejecutable(.exe)
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,…. El nombre de una variable puede tener 
logical :: lvar1, lvar2,…. hasta 31 caracteres, puede contener letras 
y números y el símbolo _ . Sin embargo, el 
primer carácter siempre tiene que ser una 
letra.
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….

• Por defecto, su nombre empieza por (A‐H,O‐Z)
• La parte entera y la parte decimal del número se separan mediante un punto (.). 
Es decir, no puede incluir comas. Si el número es positivo, el signo (+) es opcional.
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….

integer, paramenter :: docena=12
real, parameter:: pi=3.141592
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….

character :: archivo_datos*16, archivo_resultados*16, compuesto*20 
……
archivo_datos=“datos_entrada.dat”
compuesto=“agua”
DECLARACIÓN DE VARIABLES
implicit none
integer :: ivar1, ivar2, ivar3,….
real:: rvar1, rvar2,….
character ::  cvar1*n, cvar2*m,….
logical :: lvar1, lvar2,….
Damos valor a las variables ENTRADA DE DATOS
!interacción con el usuario
write(*,*) ‘Dame dos números’ También
read(*,*) ivar1, ivar2 !en pantalla y formato libre
!sentencias de asignación print *, ‘Dame dos números’
ivar1=3 !de teclado y formato libre
ivar2=4 read*, ivar1, ivar2
!lectura de un fichero
• Válido con comilla simple ‘ ó doble “
• Varias variables y texto ‘‐’ separados por comas
ENTRADA DE DATOS
Damos valor a las variables
!interacción con el usuario Cuando se ejecuta una instrucción de 
write(*,*) ‘Dame dos números’ asignación, el procesador evalúa el valor de la 
read(*,*) ivar1, ivar2 expresión que se encuentra a la derecha del 
!sentencias de asignación signo = (operador de asignación) y guarda el 
ivar1=3 valor obtenido en la variable cuyo nombre 
ivar2=4 aparece a la izquierda del signo =.
!lectura de un fichero

SENTENCIAS DE ASIGNACIÓN
Damos valor a las variables
!interacción con el usuario ENTRADA DE DATOS
write(*,*) ‘Dame dos números’
read(*,*) ivar1, ivar2
!sentencias de asignación
ivar1=3
ivar2=4
!lectura de un fichero

Libero la unidad con …     
ENTRADA DE DATOS
Damos valor a las variables
!lectura de un fichero

Fichero datostemp.dat
1990  9.2 11.3 14.7 18.3 21.4 25.4 29.5 33.2 31.6 26.3 17.4 12.1 10.9
1992  9.3 13.3 15.7 18.7 20.4 25.6 29.1 34.2 37.6 28.3 16.4 14.1 12.9
1993  9.5 10.3 14.8 19.3 21.9 28.4 29.0 33.6 30.6 25.3 17.8 15.1 10.3
....
2019  9.5 11.3 15.7 19.3 22.4 25.4 29.5 35.2 32.6 26.8 16.7 13.1 11.9

!leo la primera fila del fichero con formato libre

integer:: anho
real:: tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
open(1, file=‘datostem,dat’)
read(1,*) anho, tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
FORMATO DE LECTURA Y ESCRITURA

341 i3 ; 341,256,784,121 4(i3)

34.1 f4.1 ; 3.41,2.56,7.84,1.21 4(f4.2)


FORMATO DE LECTURA Y ESCRITURA

‘hola’ a4 ; ‘ana’,’sol’ 2(a3)


Damos valor a las variables
!lectura de un fichero ENTRADA DE DATOS

Fichero datostemp.dat
1990  9.2 11.3 14.7 18.3 21.4 25.4 29.5 33.2 31.6 26.3 17.4 12.1 10.9
1992  9.3 13.3 15.7 18.7 20.4 25.6 29.1 34.2 37.6 28.3 16.4 14.1 12.9
1993  9.5 10.3 14.8 19.3 21.9 28.4 29.0 33.6 30.6 25.3 17.8 15.1 10.3
....
2019  9.5 11.3 15.7 19.3 22.4 25.4 29.5 35.2 32.6 26.8 16.7 13.1 11.9
!leo la primera fila del fichero con formato libre
integer:: anho
real:: tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
open(1, file=‘datostem,dat’)
read(1,*) anho, tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic

!leo la primera fila del fichero con formato fijo
integer:: anho
real:: tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
open(1, file=‘datostem,dat’)
read(1,’(i4,12(1x,f4.1))’) anho, tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
‐‐‐‐‐
read(1,20) anho, tene, tfeb, tmar, tabr, tmay, tjun, tago, tsep, toct, tnov, tdic
20 format(i4,12(1x,f4.1))
OPERACIONES ARITMÉTICAS

Cuidado con división entre  enteros:       entero/entero = entero             5/2=2      5/2.=2.5
OPERACIONES ARITMÉTICAS

3.*(A+(B*C‐D)/E)
OPERACIONES ARITMÉTICAS
ESTRUCTURAS 
Si necesitamos repetir… BUCLES DO DE REPETICIÓN

Importante inicializar contadores y acumuladores
ESTRUCTURAS 
Si necesitamos imponer condiciones… BLOQUES IF DE DECISIÓN
ESTRUCTURAS 
Si necesitamos imponer condiciones… BLOQUES IF DE DECISIÓN
ESTRUCTURAS 
Si necesitamos imponer condiciones… BLOQUES IF DE DECISIÓN
Ejemplo 3: A partir de la lista de los impares 1,3,5,7,… calcula cuántos necesitamos para obtener una 
suma mayor que un valor dado y cuál es el valor menor de esa suma.

Otra opción con EXIT
ESTRUCTURAS 
Si necesitamos imponer condiciones… BLOQUES IF DE DECISIÓN
Ejemplo 4: A partir de la lista de los números naturales, calcula cuántos necesitamos para obtener 
una suma par mayor que un valor dado y cuál es el valor de la suma.

Necesitamos imponer varias condiciones

Funciones intrínsecas FORTRAN
Necesitamos saber si un número es par
Función MOD(dividendo,divisor)
FUNCIONES INTRÍNSECAS FORTRAN

Algunas….

Lista funciones intrínsecas compilador gfortran
(https://gcc.gnu.org/onlinedocs/gfortran/Intrinsic‐Procedures.html)
Repetición con condiciones: otra forma…

No existe índice del bucle, quizás necesitemos un contador o acumulador

Estructuras anidadas …. ……
…. ……
!cierro j
!cierro i
Repetición con condiciones: otra forma…
Ejemplo 5: Volvemos a hacer el ejemplo3 pero con la estructura DO WHILE…ENDDO. A partir de la 
lista de los impares 1,3,5,7,… calcula cuántos necesitamos para obtener una suma mayor que un 
valor dado y cuál es el valor menor de esa suma.

No existe índice del bucle, quizás necesitemos un contador o acumulador: aquí es i
Más ejemplos…

Ejemplo 6: Escribe el código FORTRAN con el que se obtenga la tabla de valores  (tiempo, distancia al 
suelo) de un movimiento de caída libre desde una altura inicial de 10 m para valores de tiempo 
desde t=0 con un incremento dt =0.1 s.
Más ejemplos…
Ejemplo 7: Escribe un programa FORTRAN que calcule los diez primeros términos de la serie 
∑ para un x dado.
Más ejemplos…
Ejemplo 8: Escribe un programa FORTRAN que calcule cuántos términos de la serie ∑
debo tomar para que su suma sea mayor que 500 para un x dado.
Un paso más: trabajando con ARREGLOS
Llamamos   arreglos   a    VECTORES y    MATRICES

VECTOR: arreglo unidimensional ó de rango 1.
Al declarar su tipo debemos también indicar su tamaño.

INTEGER, DIMENSION(5):: a,b
INTEGER:: a(5),b(5),c(6)
INTEGER, DIMENSION(3):: c

Otras posibles formas:
INTEGER, DIMENSION(1:3):: c     ‐>    c vector con componentes c(1),c(2),c(3)
INTEGER, DIMENSION(0:3):: d  ‐>   d vector con componentes d(0),d(1),d(2),d(3)

¿Cómo asignamos valores? Debemos dar valor a cada componente

MATRIZ: arreglo bidimensional ó de rango =2. Si rango >2 es supermatriz.
Al declarar su tipo debemos también indicar su tamaño.
En rango=2: (filas,columnas)
a(1,1)  a(1,2)  a(1,3)
INTEGER, DIMENSION(3,3):: A,B a(2,1)  a(2,2)  a(2,3)
INTEGER, DIMENSION(7,3):: c a(3,1)  a(3,2)  a(3,3)
Un paso más: trabajando con ARREGLOS

VECTORES
Un paso más: trabajando con ARREGLOS

MATRICES
Un paso más: trabajando con ARREGLOS

La lectura (escritura) también podemos hacerla desde (en) un fichero al que hemos asignado una unidad
La estructuras    (a(i),i=iini,ifin)    o   (b(i,j),j=jini,jfin)  o   ((b(i,j),j=jini,jfin),i=iini,ifin) se llaman  DO IMPLÍCITO
Un paso más: trabajando con ARREGLOS

También podemos dar valor a las componentes de vectores:
• En el momento de la declaración
a.

b.

• Con sentencias de asignación en la parte ejecutiva del programa
a.

b.

c.
Un paso más: trabajando con ARREGLOS

Y con matrices:
• En el momento de la declaración
a. A(4,3)

• Con sentencias de asignación en la parte ejecutiva del programa
a.

b. A =  0. 

c.
Ejemplo 9: Escribe un programa FORTRAN que muestre las distintas formas de escribir por
pantalla un arreglo unidimensional para un vector v de tres componentes cuyos valores
asignamos en la declaración.

Trabajo igual si lo que


me piden es LEER el
vector (desde teclado,
de un fichero…)

Con formato libre (*)


Error de redondeo de la máquina
Ejemplo 10: Escribe un programa FORTRAN que muestre las distintas formas de escribir por pantalla un
arreglo bidimensional para una matriz a de tres filas y dos columnas cuyos valores asignamos en la
declaración.

a(1,1)  a(1,2)
a= a(2,1)  a(2,2)
a(3,1)  a(3,2)

1 4
a= 2  5
3  6

Trabajo igual si lo que


me piden es LEER el
vector (desde teclado,
de un fichero…)
Ejemplo 10: Escribe un programa FORTRAN que muestre las distintas formas de escribir por pantalla un
arreglo bidimensional para una matriz a de tres filas y dos columnas cuyos valores asignamos en la
declaración.

a(1,1)  a(1,2)
a= a(2,1)  a(2,2)
a(3,1)  a(3,2)

1 4
a= 2  5
3  6
Ejemplo 11: Escribe un programa FORTRAN que lea el fichero siguiente en forma de: (a) vectores
columna y (b) matriz. Después deberá escribir por pantalla los vectores en forma de fila y la matriz en
forma de fila primero barriendo por filas y segundo barriendo por columnas.

La salida debe ser:


Vector u: 1 2 3
Vector v: 4 5 6
Matriz w barrida por filas: 1 4 2 5 3 6
Matriz w barrida por columnas: 1 2 3 4 5 6

datos.txt
1     4
2     5
3     6

(a) vectores (b) matriz
u(3)  v(3) j=1    j=2
i=1 1       4 i=1 1       4
i=2      2       5 i=2                       w(3,2)   
2       5
i=3      3       6 i=3      3       6
datos.txt
1     4
2     5
3     6

(a) vectores

u(3)  v(3)
i=1 1       4
i=2      2       5
i=3      3       6

(b) matriz
j=1    j=2
i=1 1       4
i=2                       w(3,2)   
2       5
i=3      3       6
datos.txt
Ejemplo 11: Escribe un programa FORTRAN que lea el fichero siguiente en
forma de: (a) vectores columna y (b) matriz. Después deberá escribir por 1     4
pantalla los vectores en forma de fila y la matriz en forma de fila primero 2     5
barriendo por filas y segundo barriendo por columnas. 3     6

La salida debe ser: (a) vectores (b) matriz


Vector u: 1 2 3 j=1    j=2
Vector v: 4 5 6
u(3)  v(3)
Matriz w barrida por filas: 1 4 2 5 3 6 i=1 1       4 i=1 1       4
Matriz w barrida por columnas: 1 2 3 4 5 6 i=2      2       5 i=2                       w(3,2) 
2       5
i=3      3       6 i=3      3       6
Algunas operaciones y algoritmos con VECTORES
SUMA:
• Componente a componente

• En bloque

PRODUCTO:
• Componente a componente *

• En bloque
Aplicación en: producto 
SUMATORIO:
escalar, desarrollos en serie…

Aplicación en: factorial…
PRODUCTORIO:

Tarea.  Sean:
Ejemplo 12: Escribe un programa FORTRAN que calcule el producto escalar de dos vectores con un
máximo de 100 componentes. El valor de las componentes enteras las lee del fichero
“componentes.dat”. Después deberá escribir por pantalla el resultado de dicho producto.

Dimensionado máximo

Argumento ‘end” en read
Etiqueta de fin de fichero
Calculamos número  filas

Producto escalar de 2 vectores

Fichero “componentes.dat”
2     5
3  6
2  3
7  6
1  3
9 1
v     w
Algunas operaciones y algoritmos con MATRICES
• Componente a componente

• En bloque más adelante…

Aplicación en:
• Traza de una matriz:

• Traspuesta de una matriz:

• Producto de dos matrices:
Ejemplo 13: Escribe un programa FORTRAN que calcule la matriz identidad n*n donde n viene dado
por el usuario . Después deberá escribir por pantalla la matriz.

También es válido el algoritmo:
Más algoritmos útiles…
Algoritmo de búsqueda del valor máximo de una lista
semilla para
la búsqueda

Algoritmo de búsqueda del valor mínimo de una lista
semilla para
la búsqueda

Algoritmo de ordenación de una lista. Método de la burbuja

‘pivote’ es la variable que guarda 
el valor de b(i) para que no se 
pierda. Si sólo hacemos:
b(i)=b(j)
b(j)=b(i)
ambas componentes se harán 
iguales y se pierde el valor inicial 
de b(i).
Algoritmo de ordenación de una lista. Método de la burbuja

‘pivote’ es la variable que guarda 
el valor de b(i) para que no se 
pierda. Si sólo hacemos:
b(i)=b(j)
b(j)=b(i)
ambas componentes se harán 
iguales y se pierde el valor inicial 
de b(i).
Ejemplo 14: Escribe un programa FORTRAN que a partir de la lista de valores (2,8,4,5,1,9,3,10,7,6)
obtenga el máximo, el mínimo y la ordene con los algoritmos estudiados.
Tarea.

• Cálculo de parámetros muestrales.


Escriba un programa que lea un número arbitrario de datos, los guarde en un vector x y calcule los
parámetros muestrales media, varianza y varianza de la media. Los resultados deben aparecer en pantalla y
ser guardados en un fichero. En el programa considere que la lista de datos más grande con la que puede
trabajar tiene 100 elementos.

• Ajuste de datos a una recta por el método de mínimos cuadrados.


Escriba un programa que lea un número arbitrario de pares de datos guardándolos en vectores x e y, y
calcule su recta de ajuste, el coeficiente de correlación lineal, la varianza y las varianzas de a y b. Considere
que el tamaño de vector más grande con el que puede trabajar en el programa tiene 100 elementos.
Subprogramas: FUNCIONES Y SUBRUTINAS
Subprogramas:       FUNCIONES Y SUBRUTINAS
Subprogramas: FUNCIONES

IMPLICIT NONE
…… Declaración de variables (tipo, dimensión…)
…… Algoritmo
…… nombre_funcion = expresion
[RETURN] opcional
END FUNCTION

lista con
Subprogramas: FUNCIONES

Se programan de forma general
Las entradas van a través de los argumentos de la función
La salida va a través de la variable que lleva el nombre de la función y es única
Los arreglos requieren varios argumentos: nombre y tamaño
Subprogramas: SUBRUTINAS

IMPLICIT NONE
…… Declaración de variables (tipo, dimensión…)
…… Algoritmo
…… argumento_salida_1 = expresión_1
…… argumento_salida_2 = expresión_2
……
…… argumento_salida_n= expresión_n
[RETURN] opcional
END SUBROUTINE
Subprogramas: SUBRUTINAS

Se programan de forma general
Las entradas y salidas van a través de los argumentos de la subrutina
Las salidas pueden ser múltiples
Los arreglos requieren varios argumentos: nombre y tamaño
RETOMAMOS…..
Ejemplo 12: Escribe un programa FORTRAN que calcule el producto escalar de dos vectores con un
máximo de 100 componentes. El valor de las componentes enteras las lee del fichero
“componentes.dat”. Después deberá escribir por pantalla el resultado de dicho producto.
RETOMAMOS…..
Ejemplo 15: Escribe una función que calcule el producto escalar de dos vectores enteros. Escribe un
programa FORTRAN que, haciendo uso de dicha función, obtenga el producto escalar de dos vectores
enteros con un máximo de 100 componentes. El valor de las componentes enteras las lee del fichero
“componentes.dat”. Después deberá escribir por pantalla el resultado de dicho producto.
RETOMAMOS…..
Ejemplo 15b: Escribe una función que calcule el producto escalar de dos vectores enteros. Escribe un
programa FORTRAN que, haciendo uso de dicha función, obtenga el producto escalar de dos vectores
enteros con un máximo de 100 componentes. El valor de las componentes enteras las lee del fichero
“componentes.dat”. Después deberá escribir por pantalla el resultado de dicho producto.
Ejemplo 16: Escribe dos funciones FORTRAN: una que calcule el producto escalar de dos vectores
enteros y otra que obtenga el ángulo formado entre dos vectores de enteros. Escribe un programa
FORTRAN que, haciendo uso de dichas funciones, obtenga y escriba en pantalla el producto escalar de
dos vectores enteros con un máximo de 100 componentes y el ángulo formado entre ellos. La
dimensión de los vectores y el valor de sus componentes las pide al usuario.

Utiliza la función anterior de 
cálculo del producto escalar
Ejemplo 16: Escribe dos funciones FORTRAN: una que calcule el producto escalar de dos vectores
enteros y otra que obtenga el ángulo formado entre dos vectores de enteros. Escribe un programa
FORTRAN que, haciendo uso de dichas funciones, obtenga y escriba en pantalla el producto escalar de
dos vectores enteros con un máximo de 100 componentes y el ángulo formado entre ellos. La
dimensión de los vectores y el valor de sus componentes las pide al usuario.

Declaro las funciones

Hago uso de ellas poniendo
detrás la lista de argumentos
de los que dependen
Ejemplo 16b: Escribe dos funciones FORTRAN: una que calcule el producto escalar de dos vectores
enteros y otra que obtenga el ángulo formado entre dos vectores de enteros. Escribe un programa
FORTRAN que, haciendo uso de dichas funciones, obtenga y escriba en pantalla el producto escalar de
dos vectores enteros con un máximo de 100 componentes y el ángulo formado entre ellos. La
dimensión de los vectores y el valor de sus componentes las pide al usuario.

Guardando ambas funciones en sendos archivos:
func_prodesc.f90
func_angvect.f90

La compilación y ejecución sería:
Ejemplo 17: Escribe una subrutina FORTRAN que calcule el producto escalar de dos vectores enteros y
el ángulo formado entre ellos. Escribe un programa FORTRAN que, haciendo uso de dicha subrutina,
obtenga y escriba en pantalla el producto escalar de dos vectores enteros con un máximo de 100
componentes y el ángulo formado entre ellos. La dimensión de los vectores y el valor de sus
componentes las pide al usuario.

argumentos de entrada
subroutine prodescang (v1, n, v2, pesc, ang)
argumentos de salida
Ejemplo 17: Escribe una subrutina FORTRAN que calcule el producto escalar de dos vectores enteros y
el ángulo formado entre ellos. Escribe un programa FORTRAN que, haciendo uso de dicha subrutina,
obtenga y escriba en pantalla el producto escalar de dos vectores enteros con un máximo de 100
componentes y el ángulo formado entre ellos. La dimensión de los vectores y el valor de sus
componentes las pide al usuario.

Declaro argumentos de
entrada y salida

Llamo a la subrutina con toda 
la lista de argumentos detrás
respetando orden y tipo
Ejemplo 17b: Escribe una subrutina FORTRAN que calcule el producto escalar de dos vectores enteros
y el ángulo formado entre ellos. Escribe un programa FORTRAN que, haciendo uso de dicha subrutina,
obtenga y escriba en pantalla el producto escalar de dos vectores enteros con un máximo de 100
componentes y el ángulo formado entre ellos. La dimensión de los vectores y el valor de sus
componentes las pide al usuario.

Guardando la subrutina en  archivo aparte:
sub_prodescang.f90

La compilación y ejecución sería:
Ejemplo 18: Escribe una subrutina FORTRAN que ordene una lista de menor a mayor. Escribe un
programa FORTRAN que a partir de los datos del fichero “pcp_1955‐2019.dat” obtenga y escriba en
pantalla:
a) para cada mes, haciendo uso de dicha subrutina, el percentil 95% de las series de precipitación
mensual que aparecen en el archivo. Una vez calculado este umbral, escribirá las fechas (mes y
año) que exceden cada uno de los umbrales mensuales calculados anteriormente.
b) para cada año, la precipitación acumulada anual. Y, una vez calculadas las precipitaciones
acumuladas anuales, haciendo uso de la subrutina, decir cuál ha sido el año más lluvioso y cuál ha
sido el año más seco.
c) repetir el apartado b) programando y haciendo uso de sendas funciones que calculen el valor
máximo y el valor mínimo de una lista, respectivamente, usando los algoritmos de búsqueda de
máximo y búsqueda de mínimo vistos.
Fichero “pcp_1955‐2019.dat”

j=1         j=2         j=3        j=4         j=5         j=6        j=7         j=8         j=9        j=10       j=11       j=12
i=1
i=2
i=3
i=4

…..

…..                                                                                          …..           

i=n

anho(n)                                                                        pcp(n,12)
a) Fichero “pcp_1955‐2019.dat”

j=1         j=2         j=3        j=4         j=5         j=6        j=7         j=8         j=9        j=10       j=11       j=12
i=1
i=2
i=3
i=4

…..

…..                                                                                          …..           

i=n

anho(n)                                                                        pcp(n,12)

mes(n)    mes(n)                                                  …..                                                         mes(n)
ordeno y obtengo el 95% percentil

perc95(1)    perc95(2)                                         …..                                                            perc95(12)
b)

acumulo en suma
Fichero “pcp_1955‐2019.dat”

j=1         j=2         j=3        j=4         j=5         j=6        j=7         j=8         j=9        j=10       j=11       j=12
i=1 anu(1)
i=2
i=3
i=4

…..

…..                                                                                          …..            ….

i=n anu(n)

anho(n)                      pcp(n,12)

ordeno el vector de acumuladas anuales y 
veo cuál es el mayor valor y cuál el menor
c)

acumulo en suma
Fichero “pcp_1955‐2019.dat”

j=1         j=2         j=3        j=4         j=5         j=6        j=7         j=8         j=9        j=10       j=11       j=12
i=1 anu(1)
i=2
i=3
i=4

…..

…..                                                                                          …..            ….

i=n anu(n)

anho(n)                      pcp(n,12)

Aplico las funciones de búsqueda de máximo 
y mínimo al vector de acumuladas anuales y 
veo cuál es el mayor valor y cuál el menor
Ejemplo 19: Escribe un programa FORTRAN que multiplique dos matrices A y B cuyas dimensiones y
componentes son dadas por el usuario. Comprueba que el resultado es el mismo que el obtenido a
través de MATMUL(A,B).

A(n,m)  y  B(m,h)                     C(n,h)=A(n,m)*B(m,h)

𝑎 … 𝑎 𝑏 … 𝑏 𝑐 … 𝑐
. . . . . .
*                                        = . . .
𝑎 … 𝑎 𝑏 … 𝑏 𝑐 … 𝑐

Y cada elemento de C  será:

𝑐 𝑎 𝑏

Con   i=1,n    y    j=1,h
Suponemos para el producto    C(n,h)=A(n,m)*B(m,h)    n=2,    m=2,    h=3  :

A(2,2)  y  B(2,3)                     C(2,3)=A(2,2)*B(2,3)

𝑎 𝑎 𝑏 𝑏 𝑏 𝑐 𝑐 𝑐
𝑎 𝑎 *                                        = 𝑐 𝑐 𝑐
𝑏 𝑏 𝑏

Y cada elemento de C  será: 𝑐 𝑎 𝑏

Con   i=1,n    ,    j=1,h     y     k=1,m   ,   en nuestro caso   i=1,2   ,   j=1,3   y  k=1,2

do i=1, 2 do i=1, n
do j=1, 3 do j=1, h
c(i,j)=0 c(i,j)=0
do k=1, 2 do k=1, m
c(i,j)=c(i,j)+a(i,k)*b(k,j) c(i,j)=c(i,j)+a(i,k)*b(k,j)
end do end do
end do end do
end do end do
Algunas funciones intrínsecas interesantes:

• minval(a): calcula el valor mínimo de la matriz o vector a

• minloc(a): nos da la localización donde se encuentra este valor

• maxval(a) : calcula el valor máximo de la matriz o vector a

• maxloc(a) : nos da la localización donde se encuentra este valor

• transpose(a): calcula la traspuesta de a

• dot_product(a,b): calcula el producto escalar de los vectores a,b

• matmul(a,b) : calcula el producto matricial de los arreglos a,b
Jugamos con los números…
Ejemplo 20: Escribe una función FORTRAN que calcule si un número es narcisista o no. Escribe un
programa FORTRAN que, haciendo uso de dicha función, escriba en pantalla todos los números
narcisistas incluidos en un intervalo que da el usuario.

Nota: Un número narcisista es un número de N dígitos que resulta ser igual a la suma de las potencias 
de orden N de sus dígitos. Por ejemplo: 153 tiene 3 cifras, y cumple que
153 1 5 3

Dividiendo enteros en Fortran:
i=1     n1=153
153/10=15    con resto    3
c(1)=3
n1=15
i=2
i=2      15/10=1       con resto     5
c(2)=5
n1=1
i=3
i=3      1/10=0         con resto     1
c(3)=1
n1=0
i=4
Para do while porque n1<1
Ejemplo 21: Escribe una función FORTRAN que calcule si un número es palíndromo o no. Escribe un
programa FORTRAN que, haciendo uso de dicha función, escriba en pantalla todos los números
palíndromos incluidos en un intervalo que da el usuario.

Nota: Un número natural es un palíndromo si se lee igual de izquierda a derecha y de derecha a 
izquierda. Por ejemplo: 343, 1001, 25852, 789987, 1234321 son palíndromos.
Algo más sobre variables character
Leer desde una variable character con formato

Como si fuéramos a leer de una unidad determinada, podemos leer de una variable character con el
formato deseado, obteniendo nuevas variables: enteras, reales,…
Ejemplo 22:
Los polinomios de grado n se pueden representar como vectores de dimensión (n+1), correspondiendo 
cada elemento del vector al coeficiente de un término. Así por ejemplo si n es igual a 6, el polinomio
3.5𝑥 2.5𝑥 7.2𝑥 12.5𝑥 3.2𝑥 0.1
se representaría por el vector   3.5, 2.5, 7.2, 12.5, 0, 3.2, 0.1 .
Escribe un programa FORTRAN que calcule la derivada y la integral de un polinomio de grado n a partir
del vector que representa los coeficientes de dicho polinomio ordenados a partir del término de mayor
grado hasta el de término independiente, como en el ejemplo anterior. Tomar como constante de
integración C=1.
En general:

poli 𝑎𝑛 𝑥 𝑎 𝑥 𝑎 𝑥 ⋯ 𝑎 𝑥 𝑎 grado n

(𝑎 , 𝑎 ,𝑎 ,…, 𝑎 ,𝑎 ) (n+1) componentes


(poli(1),poli(2),poli(3),...,poli(n),poli(n+1))

deri 𝑛𝑎𝑛𝑥 𝑛 1 𝑎 𝑥 𝑛 2 𝑎 𝑥 ⋯ 2𝑎 𝑥 𝑎 grado (n‐1)

(𝑛𝑎 , 𝑛 1 𝑎 , 𝑛 2 𝑎 , … , 2𝑎 , 𝑎 ) n componentes
(deri(1), deri(2), deri(3) ,..., deri(n‐1), deri(n))

inte 𝑥 𝑥 𝑥 ⋯ 𝑥 𝑎 𝑥 𝐶 grado (n+1)

( , , ,… , , 𝑎 , 𝐶) (n+2) componentes
(inte(1),inte(2),inte(3),...,inte(n+1),inte(n+2))
Ponemos el polinomio derivado en función del polinomio inicial.

poli(1)=𝑎 i=1 deri(1) = 𝑛𝑎 = n * poli(1)


poli(2)=𝑎 i=2 deri(2) = 𝑛 1 𝑎 = 𝑛 1 * poli(2)
poli(3)=𝑎 i=3 deri(3) = 𝑛 2 𝑎 = 𝑛 2 ∗ poli(3)
... ... ...
poli(n)=𝑎 i=n‐1 deri(n‐1) = 2𝑎 = 2 ∗ poli(n−1)
poli(n+1)=𝑎 i=n deri(n) = 1𝑎 = 1 ∗ poli(n)

En general, para cualquier i:


do i=1,n
deri(i) = 𝑛 1 𝑖 ∗ poli(i) deri(i)  =   𝑛 1 𝑖 ∗ poli(i)
end do
Ponemos el polinomio integrado en función del polinomio inicial.

poli(1)=𝑎 i=1 inte(1) = = poli(1) / (n+1)


poli(2)=𝑎 i=2 inte(2) = = poli(2) / n
poli(3)=𝑎 i=3 inte(3) = = poli(3) / (n‐1)
...
... ...
poli(n)=𝑎
i=n+1 inte(n+1) = 𝑎 = poli(n+1) / 1
poli(n+1)=𝑎
i=n+2 inte(n+2) = 𝐶 , siendo 𝐶 la constante de integración

En general, para cualquier i: do i=1,n+1


inte(i) = poli(i) / 𝑛 2 𝑖
inte(i) = poli(i) / 𝑛 2 𝑖 end do
inte(n+2)  =  𝐶
Ejemplo 23: Programar una subrutina FORTRAN que obtenga la descomposición en factores primos
de un número n dado. El resultado será un vector cuyas componentes son los factores primos del
número n.
Ejemplo 24: A partir del fichero datos_casos_covid19.dat:
* leer los datos
* realizar un nuevo fichero diario nacional
* realizar ficheros diarios para cada Comunidad Autónoma (CCAA)
* calcular la fecha a partir de la que todas las CCAA reportan datos en continuo

Fichero datos_casos_covid19.dat
(Fuente: https://cnecovid.isciii.es/covid19/#documentaci%C3%B3n‐y‐datos)

Fichero iso_ca.dat
Fichero   ES_EX.dat
Ejemplo 25: ¡Otros números con nombre propio!: los números perfectos.
Un número perfecto es un entero positivo que es igual a la suma de sus divisores propios positivos
(se incluye el 1 pero no el número en cuestión). Así, 6 es un número perfecto porque sus divisores
propios son 1, 2 y 3; y 6 = 1 + 2 + 3. Los siguientes números perfectos son 28, 496 y 8128.
Realizar un programa FORTRAN que liste los números perfectos incluidos en un intervalo dado por
el usuario.

Más simple…
sin vector de divisores propios
Ejemplo 26: Ya conocemos hace tiempo los números primos. Son aquellos divisibles sólo por ellos
mismos y por la unidad. Vamos a utilizar la subrutina FORTRAN que obtiene la descomposición en
factores primos de un número n dado (ejemplo 23) para calcularlos.
Se nos pide realizar un programa FORTRAN que liste los números primos incluidos en un intervalo
dado por el usuario.
Ejemplo 27: También hace tiempo surgieron los números poligonales. En la Antigua Grecia, los
pitagóricos solían representar los números mediante puntos en un pergamino o piedrecillas en la 
arena y los clasificaban según las formas poligonales de estas distribuciones de puntos, es decir, 
asociaban los números a figuras geométricas obtenidas por la disposición regular de puntos, cuya 
suma determina el número representado. Así obtenían los diversos tipos de números poligonales 
asociados a polígonos de lado l.
Se nos pide realizar un programa FORTRAN que obtenga la lista de los n números poligonales
asociados a un polígono de lado l:
a) Para n y l dados por el usuario
b) Obtener la tabla completa tal y como aparece en la imagen, con n hasta 10 y l hasta 6.
Ejemplo 28: Otros números con nombre propio son los números libres de cuadrados.
Un número libre de cuadrados es todo número natural que cumple que en su descomposición en 
factores primos no aparece ningún factor repetido. Por ejemplo, el número 30 es un número libre 
de cuadrados.
Se nos pide, haciendo uso de la subrutina que obtiene la descomposición en factores primos de un 
número dado (ver ejemplo 23), realicemos un programa FORTRAN que liste los números libres de 
cuadrados y no primos en un intervalo dado por el usuario.
Ejemplo 29: Un poco de geometría…
Hacer un programa FORTRAN que escriba en pantalla cuántos puntos 
hay en las áreas definidas entre la circunferencia y el cuadrado que la 
inscribe, incluyendo ambos contornos, de acuerdo con la imagen.  
Escribir también el porcentaje de puntos en las áreas citadas respecto 
del total existente en el área encerrada por el cuadrado, incluido su 
contorno. Pedir al usuario el valor del radio r.
Ejemplo 30: Terminamos con el cálculo del número pi.
Hacer un programa FORTRAN que estime el valor de π usando la siguiente suma infinita:

1 1 1
π 4 1 ⋯
3 5 7

Comparando este valor aproximado con el valor exacto obtenido con la función arco coseno, el 
programa debe detenerse cuando encuentre una diferencia entre ambos menor que 10−3 e indicar 
por pantalla el valor aproximado de π al que se ha llegado y el número de sumandos utilizados.

También podría gustarte