Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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.
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
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.
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
• 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.
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
(𝑛𝑎 , 𝑛 1 𝑎 , 𝑛 2 𝑎 , … , 2𝑎 , 𝑎 ) n componentes
(deri(1), deri(2), deri(3) ,..., deri(n‐1), deri(n))
( , , ,… , , 𝑎 , 𝐶) (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.
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.