Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Programación básica, Apuntes de Programación del Sistema

Apuntes de programación básica

Tipo: Apuntes

2017/2018

Subido el 23/09/2018

SMIR-91
SMIR-91 🇲🇽

2.5

(4)

7 documentos

1 / 34

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Introducci´on a FORTRAN
Miguel Alcubierre
Instituto de Ciencias Nucleares, UNAM
Abril 2005
´
Indice
1. Introducci´on 3
2. Compilar y correr programas en FORTRAN 4
3. Elementos asicos de un programa en FORTRAN 5
4. Constantes y variables 6
4.1. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2. Declaraci´on de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.3. Conversi´on entre tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5. Operaciones en FORTRAN 9
6. Arreglos 10
6.1. Arreglos de tama˜no fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6.2. Asignaci´on din´amica de memoria . . . . . . . . . . . . . . . . . . . . . . . 14
7. Funciones intr´ınsecas 14
8. Control de flujo del programa 16
8.1. Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.2. IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
8.3. Control ogico de loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22

Vista previa parcial del texto

¡Descarga Programación básica y más Apuntes en PDF de Programación del Sistema solo en Docsity!

Introducci´on a FORTRAN

Miguel Alcubierre

 - Abril Instituto de Ciencias Nucleares, UNAM 
    1. Introducci´on ´Indice
    1. Compilar y correr programas en FORTRAN
    1. Elementos b´asicos de un programa en FORTRAN
    1. Constantes y variables
    • 4.1. Tipos de datos
    • 4.2. Declaraci´on de variables
    • 4.3. Conversi´on entre tipos
    1. Operaciones en FORTRAN
    1. Arreglos
    • 6.1. Arreglos de tama˜no fijo
    • 6.2. Asignaci´on din´amica de memoria
    1. Funciones intr´ınsecas
    1. Control de flujo del programa
    • 8.1. Loops
    • 8.2. IF
    • 8.3. Control l´ogico de loops
    1. Entrada y salida de datos (input/output)
    • 9.1. Unidades de entrada y salida
    • 9.2. Formato de entrada y salida
  • 10.Subprogramas
    • 10.1. Funciones
    • 10.2. Subrutinas
    • 10.3. M´odulos
  1. Compilar y correr programas en FORTRAN

Los programas en FORTRAN se escriben en un editor de texto cualquiera (vi, emacs, etc´etera). Normalmente, el nombre del archivo debe llevar como sufijo .f, o .f90. A este archivo se le llama el “c´odigo fuente”. Una vez escrito el programa, este debe compilarse, es decir, debe ser le´ıdo por un programa llamado “compilador” que lo traduce a lenguaje de m´aquina y produce un nuevo archivo con el programa ejecutable. Algunos lenguajes de programaci´on no usan un compilador, sino un “int´erprete” (por ejemplo BASIC y PERL). La diferencia es que un interprete traduce y ejecuta linea por linea, sin nunca crear un archivo ejecutable. Un interprete es m´as transparente de usar, pero mucho m´as lento. FORTRAN funciona siempre con un compilador. Hay muchos compiladores diferentes, con diversas opciones al compilar (por ejemplo, algunos prefieren el sufijo .f y otros el sufijo .f90). Existe un compilador gratuito de FORTRAN 90 para Linux de producido por INTEL que puede bajarse de la red. La manera estandard de compilar un programa en FORTRAN es abrir una terminal, ir al directorio que contiene el programa, y escribir:

f90 nombre1.f

donde nombre1.f90 es el nombre del programa. Es importante notar que el comando f90 puede variar de nombre, por ejemplo el compilador de INTEL usa el comando ifc o ifortran. Pero siempre es posible hacer un alias. Al compilar el programa se obtiene un ejecutable que tiene por default el nombre a.out. Esto puede cambiarse haciendo:

f90 nombre1.f90 -o nombre

La opci´on -o le dice al compilador que el ejecutable debe llamarse nombre2. Para correr el programa se escribe simplemente

./nombre

donde se usa ./ para indicar a Unix que debe buscar el ejecutable en el directorio local. Para programas que est´an contenidos en varios archivos, hay una etapa m´as. El com- pilador primero genera “archivos objeto” con sufijo .o que contienen la traducci´on a lenguaje de m´aquina de cada archivo individual. Despu´es se hace una liga (link) entre los diversos archivos objeto para construir el ejecutable.

  1. Elementos b´asicos de un programa en FORTRAN

Un programa en FORTRAN tiene los siguientes elementos b´asicos:

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

Declaraciones de variables utilizadas en el programa.

Cuerpo del programa. Comandos a ejecutar en el c´odigo. Los comandos se ejecutan en orden de aparici´on. El programa siempre debe terminar con el comando END.

Subprogramas. El cuerpo del programa puede llamar a subprogramas que realicen tareas espec´ıficas. Es buena pr´actica de programaci´on separar un programa en blo- ques y poner cada bloque en diferentes subprogramas. De hecho, para programas largos es buena idea tener cada subprograma en archivos separados.

La estructura de un comando en FORTRAN 90 tiene las siguientes propiedades:

Los comandos se escriben en lineas de a lo m´as 132 caracteres (aunque algunos compiladores aceptan lineas m´as largas).

Espacios en blanco al principio de una linea se ignoran. Esto ayuda a mejorar vi- sualmente la estructura del programa. Hay que recordar que no solo la m´aquina va a leer el programa, sino tambi´en seres humanos (por lo menos el autor), por lo que una estructura visualmente clara en importante.

Un signo & al final de una linea 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. Los comentarios son para las personas, no para la m´aquina. Hacen m´as f´acil de entender el programa para personas que no lo escribieron, y sirven incluso para que el autor sepa lo que hace el programa si lo vuelve a ver tiempo despu´es.

Es posible poner varios comandos en una linea separ´andolos con punto y coma.

Importante: FORTRAN no distingue entre may´usculas y min´usculas en un progra- ma, tambi´en ignora m´as de un espacio en blanco y lineas en blanco. Que se use es cuesti´on de estilo personal.

logical Las variables l´ogicas solo pueden tener dos valores: .true. (ver- dadero) y .false. (falso).

integer Valores enteros guardados en 4 bytes. Se indican como n´umeros 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´es de una E: 1., -3.1416, 6.25E-10, etc.

double Valores reales de doble precisi´on guardados en 8 bytes y con 16 cifras significativas, tambi´en se denotan por real(8). Se indican con punto decimal y el exponente de la potencia de 10 despu´es de una D: 1.D0, -3.1416D0, 6.25D-10, etc. Son muy ´utiles en c´alculos num´ericos largos, donde los errores de redondeo pueden hacer que las ´ultimas 4 o 5 cifras significativas de un n´umero real sean basura.

quadruple Valores reales de cu´adruple precisi´on guardados en 16 bytes y con 32 cifras significativas, tambi´en se denotan por real(16). Se indican con punto decimal y el exponente de la potencia de 10 despu´es de una Q: 1.Q0, -3.1416Q0, 6.25Q-10, etc.

complex Dos valores reales formando un par y que en operaciones matem´aticas se tratan como la parte real e imaginaria de un n´umero complejo: (1.,-2.), (1.0E0,-2.0E0). Tambi´en existen versiones de doble y cu´adruple precisi´on.

character Variables que corresponden a cadenas de caracteres. Al declarar una variable de este tipo se debe especificar cuantos caracteres puede tener. Estas variables deben estar contenidas en comillas: ’hola’, ’abcdfe’, ’Me llamo Luis’, ’128.3’, etc.

4.2. Declaraci´on de variables

Las variables utilizadas en un programa FORTRAN deben declararse como uno de los tipos mencionados en la secci´on anterior. Por compatibilidad con versiones viejas de FORTRAN, se asume que aquellas variables que no han sido declaradas tienen un tipo im- pl´ıcito de acuerdo a la siguiente regla: variables cuyos nombres empiezan con {i,j,k,l,m,n} se asumen enteras, y todas las dem´as se asumen reales. El uso de declaraciones impl´ıcitas

es indeseable, pues hace m´as dif´ıcil detectar posibles errores de tecleo. Para evitar usar declaraciones impl´ıcitas se debe poner al principio de las declaraciones la linea:

implicit none

Ejemplo: Programa “valores”.

program valores

implicit none

logical flag integer i real a character(30) texto

i = 1 a = 2. texto = ’Estas son las variables:’

print *, texto print *, flag,i,a

end program valores

El programa anterior primero declara que no hay variables impl´ıcitas, luego declara una variable l´ogica, una entera, una real y una cadena de caracteres. Luego les asigna valores y las imprime a la pantalla. N´otese el uso de comillas para la variable de tipo character, y como se ha declarado como de 30 caracteres (suficientes para contener la frase ’Estas son las variables’). Tambi´en es importante se˜nalar el uso del operador =. Este operador no significa “igual”, sino que significa “asignar”, y sirve para asignar valores a variables.

4.3. Conversi´on entre tipos

En FORTRAN es muy importante declarar las variables correctamente. Muchos er- rores comunes est´an relacionados con utilizar tipos equivocados de variables. Por ejemplo,

mente son absurdas como por ejemplo:

a = a + 1

Esto significa tomar la variable a, sumarle 1, y asignar el resultado de nuevo a la variable a.

  • Suma (2.0+3.0 → 5.0).
  • Resta (2.0-3.0 → -1.0).
  • Multiplicaci´on (2.0*3.0 → 6.0).

/ Divisi´on (2.0/3.0 → 0.66666667).

** Exponenciaci´on (2.0**3.0 → 8.0).

Las operaciones se realizan en el siguiente orden:

  1. T´erminos entre par´entesis, comenzando por los de m´as adentro.
  2. Exponenciaci´on.
  3. Multiplicaci´on y divisi´on de izquierda a derecha.
  4. Sumas y restas de izquierda a derecha.

IMPORTANTE: Igual que cuando uno hace operaciones a mano, es mucho m´as dif´ıcil dividir que multiplicar, por lo que resulta mucho m´as lento. A FORTRAN le toma mucho m´as tiempo calcular 5.0/2.0 que calcular 5.0*0.5. Siempre que sea posible se deben evitar las divisiones para tener un c´odigo m´as eficiente.

  1. Arreglos

FORTRAN puede almacenar en memoria vectores y matrices utilizando variables lla- madas “arreglos” que contienen muchos elementos. Los arreglos pueden ser de cualquiera de los tipos aceptados por FORTRAN.

6.1. Arreglos de tama˜no fijo

La manera m´as directa de declarar un arreglo es dando su tama˜no desde el principio. Por ejemplo, para declarar un vector de 3 componentes y una matriz de 4 por 5 se escribe:

real, dimension(3) :: v real, dimension(4,5) :: m

Es posible declarar arreglos con un n´umero arbitrario de dimensiones. Por ejemplo, un arreglo de 4 ´ındices cuyos valores van de 1 a 2 se declara como:

real, dimension(2,2,2,2) :: R

Tambi´en se puede dar expl´ıcitamente el rango permitido para los ´ındices:

real, dimension(0:8), v real, dimension(2:5), v

Esto declara al vector v1 con ´ındices que van de 0 a 8, y al vector v2 con ´ındices que van de 2 a 5. Existe una abreviaci´on de la declaraci´on de arreglos. Por ejemplo, los arreglos v,m,R de los ejemplos anteriores se pueden tambi´en declarar como:

real :: v(3), m(4,5), R(2,2,2,2)

Para referirse a un miembro espec´ıfico del arreglo, se utilizan expresiones del tipo:

a = v(1) + m(1,1) + R(1,2,1,2)

Es posible tambi´en realizar operaciones con arreglos completos a la vez (esto no era posible en FORTRAN 77). Por ejemplo, si a,b,c son arreglos con las mismas dimensiones, podemos escribir:

a = b+c a = bc a = b*

La primera operaci´on suma uno a uno los elementos de los arreglos b y c y los coloca

! Dar la matriz c de golpe.

c = 2.

! Definir a como la division de b entre c.

a = b/c

! Imprimir v1 completo.

print *, ’Vector v1:’ print *, v print *

! Imprimir v2 componente a componente.

print *, ’Vector v2:’ print *, v2(1),v2(2),v2(3) print *

! Imprimir componente c(0,0).

print *, ’Componente c(0,0):’ print *, c(0,0) print *

! Imprimir componente b(1,1).

print *, ’Componente b(1,1):’ print *, b(1,1) print *

! Imprimir a completo.

print *, ’Matriz a completa:’ print *, a print *

end program arreglos

En el ejemplo anterior se muestran declaraciones y operaciones con arreglos. N´otese que al imprimir es posible imprimir componentes individuales, o arreglos completos. En este ´ultimo caso el arreglo se escribe recorriendo primero los ´ındices de la izquierda y luego los de la derecha (al rev´es de lo que uno esperar´ıa normalmente). Otro punto a notar es el comando print * sin nada que le siga, esto hace que FORTRAN imprima una linea en blanco.

6.2. Asignaci´on din´amica de memoria

En algunas ocasiones resulta ´util declarar un arreglo sin asignarlo un n´umero fijo de componentes desde el principio, y solo asignarlas despu´es (debido por ejemplo a que se leen datos del exterior, ver secci´on 9). Para hacer esto, los arreglos se pueden declarar como:

real, allocatable, dimension (:) :: v real, allocatable, dimension (:,:) :: m

Antes de realizar cualquier operaci´on con un arreglo de este tipo se le debe asignar memoria de la siguiente forma:

allocate(v(3),m(4,5))

Al terminar los c´alculos es posible eliminar esta memoria con el comando:

deallocate(v,m)

Esto es particularmente ´util en c´odigos largos que utilizan mucha memoria, o en casos donde el tama˜no de los arreglos depende ya sea de valores externos o de que se cumplan ciertas condiciones en el c´odigo.

  1. Funciones intr´ınsecas

FORTRAN cuenta con una serie de funciones matem´aticas pre-definidas llamadas “funciones intr´ınsecas”. Una lista de algunas de ellas (no todas) es:

sqrt(x) Ra´ız cuadrada de x.

! Ahora a calcular pi. Recuerden que cos(pi) = -1.

pi = acos(-1.0)

print *, ’El valor de pi es’ print *, pi print *

! Ya tenemos pi, ahora calcular su seno, coseno y tangente

print *, ’Seno, coseno y tangente de pi’ print *, sin(pi),cos(pi),tan(pi) print *

! Cual es la raiz cuadrada de 2?

print *, ’Raiz de 2’ print *, sqrt(2.0) print *

end program intrinsecas

Cosas por notar en este ejemplo son las siguientes: FORTRAN no conoce el valor de π. En general no es buena idea definir este valor directamente, es mejor calcularlo usando funciones trigonom´etricas inversas para obtener mayor precisi´on. N´otese tambi´en que al correr este programa, el seno y la tangente de π no dan cero sino n´umeros de orden 10−^7. Esto es debido al error de redondeo en la ´ultima cifra significativa de los n´umeros reales. Si utilizamos doble precisi´on, el error ser´a del orden 10−^15. Cuando uno realiza muchas operaciones num´ericas, el error de redondeo se propaga y puede contaminar varias cifras decimales. Por ello es buena idea usar doble precisi´on para c´alculos num´ericos complejos.

  1. Control de flujo del programa

En general, un programa FORTRAN ejecuta las comandos en el orden en el que se escribieron, uno a la vez. Sin embargo, frecuentemente hay situaciones en las que esto es demasiado simple para lo que uno quiere hacer. A veces es necesario repetir una misma operaci´on muchas veces con ligeras variaciones, y otras veces hay operaciones que solo

deben realizarse si se cumple alguna condici´on. Para este tipo de situaciones existen los llamados “comandos de control del programa” y que caen en dos tipos b´asicos: “loops” y condicionales.

8.1. Loops

Un “loop” es un conjunto de instrucciones que deben realizarse muchas veces y tiene la forma estandard:

do i=start,end,increment

comando 1 comando 2 comando 3 ...

end do

Todos los comandos que est´an contenidos entre la linea do i=... y la linea end do se repiten varias veces, dependiendo de los valores de start,end,increment que deben ser enteros. la primera vez, la variable i toma el valor start. Al terminar, el valor de i se incrementa en increment, si el valor final es mayor que end el loop ya no se ejecuta de nuevo y el programa continua en el comando que siga despu´es de end do, de lo contrario se vuelven a ejecutar los comandos dentro del loop hasta que se obtenga i>end. Nota: El indentar los comandos dentro del loop no es necesario (FORTRAN ignora los espacios extra), pero es una buena idea pues hace m´as f´acil identificar visualmente donde comienza y termina el loop.

Ejemplo: Programa “fibonacci”.

program fibonacci

! Este programa calcula los numeros de la serie ! de fibonacci hasta nmax.

implicit none

integer i,nmax

comando 1 comando 2 else comando 3 comando 4 end if

Al ejecutar esto, el programa verifica si la expresi´on l´ogica entre par´entesis despu´es del if es verdadera. De serlo, se ejecutan los comandos siguientes. De ser falsa, se ejecutan los comandos despu´es del else (n´otese que el [else] es opcional). La expresi´on l´ogica puede utilizar cualquiera de los siguientes operadores l´ogicos:

== Igualdad: if (i==3) then. Una versi´on equivalente de este oper- ador (que de hecho es la ´unica v´alida en FORTRAN 77) es .eq.: if (i.eq.3) then.

Mayor que: if (i>3) then. Una versi´on equivalente de este oper- ador (que de hecho es la ´unica v´alida en FORTRAN 77) es .gt.: if (i.gt.3) then.

= Mayor o igual: if (i>=3) then. Una versi´on equivalente de este operador (que de hecho es la ´unica v´alida en FORTRAN 77) es .ge.: if (i.ge.3) then.

< Menor que: if (i>3) then. Una versi´on equivalente de este oper- ador (que de hecho es la ´unica v´alida en FORTRAN 77) es .lt.: if (i.lt.3) then.

<= Menor o igual: if (i<=3) then. Una versi´on equivalente de este operador (que de hecho es la ´unica v´alida en FORTRAN 77) es .le.: if (i.le.3) then.

/= No igual: if (i/=3) then. Una versi´on equivalente de este oper- ador (que de hecho es la ´unica v´alida en FORTRAN 77) es .ne.: if (i.ne.3) then.

.not. Negaci´on l´ogica: if (.not.flag) then, donde flag ha sido declara- da como una variable l´ogica.

.or. “O” l´ogico: if ((i==3).or.(i==5)) then.

.and. “Y” l´ogico: if ((i==3).and.(j==5)) then.

El comando if puede simplificarse si solo hay un comando en su interior:

if (i==3) comando

Este comando indica que si se cumple la condici´on el comando indicado debe ejecutarse. Tambi´en es posible tener muchas alternativas en un condicional:

if (expresi´on l´ogica 1) then comando 1 else if (expresi´on l´ogica 2) comando 2 else if (expresi´on l´ogica 3) comando 3 else comando 4 end if

Ejemplo: Programa “condicional”.

program condicional

implicit none

! Declaramos una variable logica y una entera.

logical flag integer i

! Dejar un espacio para que se vea menos feo.

print *

! Contar de 1 a 20.

do i=1,