Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Introducción a Fortran
Mario Merino Martí[email protected]
Escuela Técnica Superior de Ingenieros AeronáuticosUniversidad Politécnica de Madrid
4 de marzo de 2011
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Índice
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
¿Qué es programar?
“Un ordenador es una herramienta enormemente tonta, peroincreíblemente rápida”
Programar es dar instrucciones de forma secuencial a unordenador para que realice por nosotros una tarea.El ordenador sólo entiende instrucciones en forma de unosy ceros (código máquina). No queremos escribir enbinario: nos inventamos lenguajes de programaciónNosotros escribimos nuestro código o algoritmo en unlenguaje, y un programa (compilador) se encarga detraducirlo a código máquina (“.exe”).Cada lenguaje tiene su sintaxis y vocabulario propio. Elcompilador no admite fallos ni ambigüedades.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Estructura de un programa en FortranFortran (de “formula translation”) es el lenguajecientífico e ingenieril por excelencia. Se inventó por y parael cálculo numérico.Un programa en Fortran es una lista secuencial y finitade instrucciones. El programa empieza y terminasiempre así:Fortran no distingue entre mayúsculas y minúsculas, eignora espacios y líneas en blanco extra.
program nombre_del_programa! Declaración de variables! Instrucciones SECUENCIALES! Esto es un comentario
end program nombre_del_programa
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
El entorno de desarrolloPara escribir el código de un programa, sirve cualquier editorde texto. ¡Pero mejor utilizar una herramienta especializada!
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Tipos y declaración I
Una variable es un nombre al que le asociamos un número odato, para poder referirnos a él en el código de forma genérica.Hay que declarar cada variable en la parte inicial delprograma, para que el compilador sepa que existe y de quétipo es. Existen varios tipos de variables:
Variables enteras: integerVariables reales, precisión simple: real*4Variables reales, precisión doble: real*8Otros tipos (character, logical...)
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Tipos y declaración II
Se declaran así:
program nombre_del_programaimplicit none ! ponedlo SIEMPREinteger :: i, nreal*4 :: s, tempreal*8 :: h, x, y! ...
end program nombre_del_programa
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Asignación de valores y uso I
Una vez las variables han sido declaradas, se les puede dar unvalor con el operador asignación “=”:
! ...integer :: nreal*4 :: x, hreal*8 :: y! ...n = 34h = 4.91234x = 5. ! Los reales SIEMPRE con punto o exponente (1e0)y = 1d0 ! El exponente con “d” se utiliza para doble precisión! ...
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Asignación de valores y uso II
Una variable se puede sobreescribir cuantas veces sedesee, y utilizar en operaciones y funciones:
! ...x = x + x + 124.5d0 - cos(x)! ...
Este ejemplo calcula x + x + 124.5− cos (x), y después loguarda en la variable x , olvidando su valor anterior.
Fortran NO tiene constantes físicas ni matemáticas “deserie”. Hay que escribirlas cada vez. Un buen truco paratener el número π es usar: pi = acos(-1d0)
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Operadores algebraicos (+,-,*,/,**)Suma, resta, producto, cociente y potencia se escriben así: +,-, *, /, **. La potencia tiene prioridad sobre producto ycociente, y estos sobre suma y resta. Se pueden usarparéntesis para establecer el orden de las operaciones:
5.+2.*4.**(-3) es distinto de ((5.+2.)*4.)**(-3)
¡OJO! EL COCIENTE DE ENTEROS PRODUCE COMO RE-SULTADO UN ENTERO. SI SE QUIERE UN RESULTADOREAL, NO OLVIDAR EL PUNTO NUNCA (o usar DBLE).
! ...x = 2/3 ! El resultado es 0x = 2./3. ! El resultado es 0.66666...x = dble(2)/dble(3) ! El resultado es 0.66666...! ...
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Leer y escribir por pantalla
Se puede escribir cualquier cosa por pantalla usando:
write(*,*) ’Hola. El valor de x es: ’, x
Se puede pedir al usuario que introduzca por teclado un valorn con:
read(*,*) n
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Funciones matemáticas “de serie”
Algunas funciones sólo funcionan con reales real*4 y real*8.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Ejemplo 1: raízPracticamos declaración y uso de variables, read y write, yfunciones intrínsecas.
program ejemplo1implicit noneinteger :: nreal*8 :: raiz
write(*,*) ’Por favor, introduzca un numero n’read(*,*) nraiz = sqrt(dble(n))write(*,*) ’El numero introducido es: ’, nwrite(*,*) ’Su raiz cuadrada es: ’, raiz
end program ejemplo1
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Ejecución condicional (if)A veces interesa que una parte del código sólo se ejecute sise verifica una condición. Por ejemplo, si el número nintroducido en el ejemplo anterior es negativo, nos gustaríaavisar al usuario. Esto puede hacerse con la construcción:
if (condición) then ... else ... end if:! ...write(*,*) ’Por favor, introduzca un numero n’read(*,*) nif (n<0) then
write(*,*) ’Atencion: el numero es negativo’else
raiz = sqrt(dble(n))end if! ...
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Condiciones
Las condiciones van entre paréntesis. Los operadores decomparación son
<, >: menor y mayor que<=, >=: menor o igual y mayor o igual que==: igual que/=: distinto que
Se pueden construir condiciones más complicadas con losoperadores lógicos .AND., .OR., .NOT.:
(x<-3. .OR. x>=7.)
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Tareas repetitivas (do) ICuando se quiere hacer una operación muchas veces (o unnúmero indeterminado de veces), es muy útil emplear buclesdo.
! ...do i=1,10
write(*,*) ’Esta es la iteracion numero ’, iend do! ...
El código comprendido entre el do y el end do seejecuta tantas veces como se especifique (10)Un bucle do posee un contador (i). El contador vadesde el valor inicial hasta el final, de uno en uno.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Tareas repetitivas (do) IILa variable contador (i) se puede utilizar en nuestrasoperaciones si queremos.! ...s = 0do i=1,10
s = s + i**2end do! ...
En general, se puede especificar también elincremento del contador: do i=20,0,-2 (ve desdei=20 hasta i=0 de -2 en -2).Se pueden “anidar” varios bucles uno dentro de otro (verejercicios).
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Ejemplo 2: sumatoriosSe realizan con una variable de acumulación, que hay queponer a cero inicialmente. En cada iteración se suma sobreella la expresión deseada. En este ejemplo, s = ∑n
i=1 i:program ejemplo2
implicit noneinteger :: n, ireal*8 :: swrite(*,*) ’Por favor, introduzca un numero n’read(*,*) ns = 0d0 ! Ponemos a cero la variable de acumulacióndo i=1,n
s = s + i ! Acumulamos el valor a sumarend dowrite(*,*) ’El sumatorio es: ’, s
end program ejemplo2Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Ejemplo 3: productosTambién con variable de acumulación, que hay que poner auno inicialmente. En cada iteración se multiplica con laexpresión deseada. En este ejemplo, s = ∏n
i=1 i:program ejemplo3
implicit noneinteger :: n, ireal*8 :: pwrite(*,*) ’Por favor, introduzca un numero n’read(*,*) np = 1d0 ! Ponemos a uno la variable de acumulacióndo i=1,n
p = p * i ! Acumulamos el valor del productoend dowrite(*,*) ’El producto es: ’, p
end program ejemplo3Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Subprogramas
A veces queremos reutilizar un trozo de código en múltiplesocasiones para realizar una misma tarea en distintos lugares denuestro programa.
Las funciones y subrutinas son trozos de código(programas independientes) que pueden ser ejecutadosdesde el programa principal en cualquier momento.Tienen la misma estructura que un programa.Son “cajas negras:” mi programa las llama con unosargumentos de entrada, y recibe unos argumentos desalida, sin preocuparse de lo que sucede en ellas.Se escriben fuera del programa principal.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Funciones I
Se escriben entre las instrucciones function y endfunction.Hay que declararlas en el programa principal comouna variable con el atributo external.Devuelven el valor asignado al nombre de la función.Hay que declarar el nombre de la función dentro de lafunción (no deja de ser una variable más).Una vez creadas, se usan igual que las funcionesintrínsecas: e.g.: x = 1. + f(x) * 2.6.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Funciones II
program mainimplicit nonereal*8, external :: f
! ...write(*,*) f(3.52)! ...
end program main
function f(x)implicit nonereal*8 :: f, xf = x**2 +log(x)
end function f
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Subrutinas I
Se escriben entre las instrucciones subroutine y endsubroutine.No hay que declararlas en el programa principal si estánen el mismo archivo de texto.Trabajan sobre los argumentos que se les entrega, quepueden ser de entrada, de salida, o de entrada/salida.No hay que declarar su nombre dentro de la subrutina (elnombre no es variable)Se llaman desde el programa principal con la instruccióncall: e.g.: call mi_sub(x,y,z)
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
Subrutinas II
program mainimplicit none
! ...call mi_sub(x,y)write(*,*) y! ...
end program main
subroutine mi_sub(a,b)implicit nonereal*8 :: a, b! ...
end subroutine mi_sub
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Ejercicio guiado 1Se desea elaborar un programa que pida al usuario un númeroentero n, y que a partir de él calcule
r = 3√
n + n,
el sumatorio
S =n∑
i=1i2 = 12 + 22 + . . .+ n2,
y el factorial
P = n! =n∏
i=1i = 1 · 2 · 3 · . . . · n.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Ejercicio guiado 2
Encapsular el código anterior dentro de una subrutina, que seallamada desde el programa principal para los siguientes valoresn:
n = 1, 7, 15,−4
¿Qué sucede en el último caso?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
Ejercicios
Número 17 (cálculos sencillos)Número 31 (funciones intrínsecas). Intentad encapsular elcódigo en funciones después.Número 46, apartados d), f), i) (bucles)Número 90 (funciones)
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
¿Fin?
Index
1 Introducción2 Elementos Básicos de Fortran
VariablesFunciones intrínsecas e instrucciones básicasCondicionalesBuclesFunciones y subrutinas
3 Ejercicios para practicar4 Para profundizar un poco más
¿Fin?
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
¿Fin?
¡Desde luego que no es el fin!
Fortran es ampliamente extenso. Os animo a que primerodominéis estos rudimentos, y que según os surja la necesidad,ampliéis vuestro conocimiento de Fortran. En concreto:
Vectores y matrices (arrays).Escribir con formato; escribir y leer archivos.Sentencias “exit,” “select case,” “do while.”Argumentos opcionales de las sentencias “read,” “write.”Opciones de Plato y cómo usar el debugger.Variables con atributo “allocatable,” “pointer.”Modules, interfaces, estructuras.
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
¿Fin?
Cómo continuar
Para más información:“Introducción a FORTRAN 90”, J.J. Sánchez y C.Vázquez.Ayuda de Plato “Fortran 95 language overview.”Libros y manuales de Fortran (biblioteca).Búsquedas en internet.
Cualquier duda: [email protected] (o subid aldepartamento).
Mario Merino Martínez Introducción a Fortran
IntroducciónElementos Básicos de Fortran
Ejercicios para practicarPara profundizar un poco más
¿Fin?
Imprescindibles
No olvidar NUNCA el punto “.” en real*4 y “d” enreal*8.Usar SIEMPRE “implicit none.”Leer COMPLETAMENTE los errores del compilador:nos dicen cómo resolverlos.Hacer los bucles “do” con contadores INTEGER.No hacer líneas demasiado largas. Fortran sólo lee hastala columna 132 (continuar línea con &).Escribir códigos profusamente comentados (!)
Mario Merino Martínez Introducción a Fortran