


























Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Apuntes de programación básica
Tipo: Apuntes
1 / 34
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!



























- Abril Instituto de Ciencias Nucleares, UNAM 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.
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.
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.
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.
/ Divisi´on (2.0/3.0 → 0.66666667).
** Exponenciaci´on (2.0**3.0 → 8.0).
Las operaciones se realizan en el siguiente orden:
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.
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.
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.
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.
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.
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.
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,