introduccion· a la programacion·...

20
INTRODUCCI ´ ON A LA PROGRAMACI ´ ON FORTRAN J. San Fabi´ an Inform´ atica Aplicada a la Qu´ ımica Departamento de Qu´ ımica F´ ısica Aplicada Universidad Aut´ onoma de Madrid Primera versi´ on en Latex: 3 Nov 2004 (18 de febrero de 2008)

Upload: others

Post on 27-Mar-2020

31 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

INTRODUCCION A LA PROGRAMACIONFORTRAN

J. San FabianInformatica Aplicada a la Quımica

Departamento de Quımica Fısica AplicadaUniversidad Autonoma de Madrid

Primera version en Latex: 3 Nov 2004(18 de febrero de 2008)

Page 2: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

2 Introduccion a la Programacion

Indice

1. PRIMERA SESION 41.1. Editar, Compilar y Ejecutar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2. Constantes, Variables y Tipos de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3. Funciones Intrınsecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.4. Bucles (DO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.5. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2. SESION SEGUNDA 112.1. Decisiones (instruccion IF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.1.1. Introduccion de datos por medio de un fichero. . . . . . . . . . . . . . . . . . . . . . 122.2. GOTO (la instruccion que debemos evitar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3. Ejercicio 1: Ecuacion de segundo grado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.4. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3. SESION TERCERA 153.1. Manejo de Vectores y Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.2. Ejercicio 2: Ajuste de una recta por mınimos cuadrados . . . . . . . . . . . . . . . . . . . . . 153.3. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4. CUARTA SESION 174.1. Subprogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2. Ejercicio 3: Integracion numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.3. Problemas Adicionales (opcional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Page 3: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 3

INTRODUCCION A LA PROGRAMACIONFORTRAN

Vamos a comenzar cuatro sesiones (10 horas) de introduccion a la programacion y para ello vamosa utilizar el lenguaje de programacion FORTRAN.

Lea detenidamente y con calma la introduccion siguiente. Siempre que aparezca una [C] esque tiene que contestar alguna cuestion. Cuando aparezca una [P] es porque tiene que hacer unprograma (editar, compilar y ejecutar) y cuando funcione imprimirlo. Los programas que no tenganla [P] no hace falta sacarlos por la impresora. Los programas impresos, las contestaciones a lascuestiones y los ejercicios 1 a 3, estos ultimos en las sesiones 2a a 4a forman el guion de practicasque tiene que entregar al profesor en el plazo de una semana desde la terminacion de la cuartasesion de FORTRAN. Tambien encontrara una serie de ejercicios adicionales que en caso de tenertiempo debe incluir en el guion de practicas (OPCIONAL).Ante un problema estudie detenidamente la informacion que le proporciona el ordenador e intenteresolverlo por sı mismo antes de preguntar al profesor.

Page 4: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

4 Introduccion a la Programacion

1. PRIMERA SESION

1.1. Editar, Compilar y Ejecutar

Los primero que vamos a hacer es escribir, compilar y ejecutar nuestro primer programa en FORTRAN.Para ello siga los pasos siguientes:

1.- (EDITAR) Edite con cualquier editor un fichero llamado prog1.f con el texto de la Fig. 1. En esta figura eleditor utilizado es el ”KWrite”, pero puede utilizar el que le resulte mas comodo (kate, vi, ...). Procureescribir el texto lo mas literal posible respetando la columna en la que se escribe cada cosa. Salve (guarde)el fichero al disco con el nombre prog1.f

Figura 1: Primer programa FORTRAN (prog1.f) editado con el editor Kedit.

2.- (COMPILAR) 1 Ejecute la siguiente instruccion:gfortran prog1.f -o prog1.exe (J−−y)

El sımbolo final (J−−y) significa que debe pulsar dicha tecla o la tecla Intro para hacer operativa la orden. Si haescrito bien el fichero prog1.f no debe aparecer ningun error. Si la compilacion produce algun error, leadetenidamente lo que le indica el ordenador, y con esa informacion revise (reedite) el fichero prog1.f yvuelva a ejecutar la instruccion anterior. Si no consigue solucionar los problemas por sı mismo preguntea su profesor.

3.- (EJECUTAR) Si la compilacion no da ningun error ejecute el comando ls y vera que entre otros tieneen el disco los ficheros prog1.f y prog1.exe. Este ultimo es un fichero ejecutable. Escriba la instruccionsiguiente para ejecutar:

./prog1.exe (J−−y)

El ”./” antes del nombre del ejecutable (prog1.exe) es necesario en las ultimas versiones de linux e indica queel programa ejecutable esta en el subdirectorio de trabajo en el que estamos situados.

Si todo ha funcionado, entonces, hemos editado, compilado y ejecutado nuestro primer programa en FOR-TRAN. En estas cuatro sesiones de practicas vamos a aprender un poco mas sobre la programacion FORTRAN.Como puede suponer es una introduccion al FORTRAN muy breve, le aconsejo que practique y profundice porsu cuenta en la programacion pues puede serle muy util.

1Compilar consiste en traducir el lenguaje fortran a codigo maquina que es capaz de entender el ordenador. Esta operacion la realizaun programa llamado compilador, en este caso el gfortran.

Page 5: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 5

1.2. Constantes, Variables y Tipos de Datos

FORTRAN es un lenguaje de programacion ”vivo” ya que la mayorıa de los programas usados por la comu-nidad cientıfica estan escritos en FORTRAN. Es un lenguaje de alto nivel, es decir, requiere poco conocimientodel hardware y emplea palabra conocidas (normalmente en ingles) que le indican al ordenador lo que tiene quehacer con unas serie de ”objetos” con los que va a trabajar.

El tipo de ”objetos” que va a manejar el or-

Figura 2: Tipo de datos utilizados en el lenguaje FORTRAN.

denador siguiendo las ordenes de nuestro pro-grama son los que se muestran en la Fig. 2.En estas practicas unicamente vamos a traba-jar con numeros enteros y reales y muy de pa-sada con caracteres. Por defecto el FORTRANque estamos usando utiliza 4 bytes (8x4 = 32bits) para guardar un numero entero o un nu-mero real. Esto implica que el numero enteromas grande, en valor absoluto, que podemosusar es el 2147483647. Por otro lado, los nu-meros reales tendran una precision aproxima-da de 7 cifras significativas y los numeros rea-

les que podemos manejar estaran entre 10−38 y 1038.

Los datos pueden estar en nuestro programa

Figura 3: Constantes y variables.

de dos maneras diferentes, como constantes o co-mo variables (Fig. 3). Las variables son como lasmemorias de nuestra calculadora de bolsillo y sucontenido puede cambiar durante la ejecucion delprograma.

Los numeros enteros y reales se definen (esdecir, se le indica al ordenador que son numerosenteros o reales) como se muestra en la Fig. 4. Porotro lado tambien tenemos varios tipos de nume-ros enteros y reales, aunque nosotros vamos a uti-lizar unicamente los que tiene el FORTRAN pordefecto y que hemos senalado en la Fig. 3 (defec-to).

Es importante recordar que las variables enteras se definen con nombres que comienzan por I, J, K, L,M o N (I-N). Y variables reales las que comienzan con las demas letras (A-H, O-Z).

Figura 4: Definicion de enteros y reales.

Page 6: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

6 Introduccion a la Programacion

Con estos datos podemos hacer una serie de operaciones basicas (Fig. 5). Observa que las operacionestienen prioridades, es decir la multiplicacion y la division siempre se realizan antes que las sumas y restas.Para evitar problemas a este respecto conviene utilizar parentesis siempre que tengamos dudas, aunque no seanecesario.

Figura 5: Operaciones basicas.

Una operacion basica y a la vez difıcil de entender cuando la vemos por primera vez es la instruccion deasignacion. Cuando vemos un signo = debemos entender que se realizan las operaciones que hay a laderecha del signo = y el resultado se guarda en la variable que esta a la izquierda del igual. Por tanto, ala izquierda del = siempre debe haber una variable.

Vamos a hacer un programa para repasar los conceptos vistos hasta ahora. EDITE, COMPILE YEJECUTE el programa prog2.f. Evidentemente, los numeros de la columna derecha (entre corchetes)solo sirven para numerar las lıneas y no hay que escribirlos.[C] DISCUTA brevemente los resultados.

Figura 6: Instruccion de asignacion.

C prog2.f 16 Oct 97 { 1}C Autor: .... { 2}C conceptos basicos { 3}C=====7========================= { 4}

P1 = 5.3 { 5}N1 = 3 { 6}P2 = P1 *N1 { 7}N2 = P1 *N1 { 8}

{ 9}PRINT *, ’ P2: ’, P2 {10}PRINT *, ’ N2: ’, N2 {11}

{12}P2 = P2+N1 * 2 {13}PRINT *, ’ P2-NUEVO: ’, P2 {14}

{15}STOP {16}END {17}

En los programas en fortran, las instrucciones co-mienzan en la columna 7. Los comentarios (lasprimeras cuatro lıneas en los programas anterioresson comentarios) se indican con una C (tambienpodrıa ser un asterisco *) en la columna 1. Los co-mentarios son ignorados por el compilador. El pro-grama termina con dos instrucciones que todo pro-grama FORTRAN debe tener (STOP y END).El lenguaje FORTRAN77 (y anteriores) sigue unaserie de reglas rigurosas en cuanto a la colocacion delas instrucciones (estudie la Fig. 7 detenidamente).

Page 7: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 7

Figura 7: Division de las lıneas en FORTRAN77.

[C] REMPLACE la lınea 13 del programa prog2.f por:

1. P2 = (P2 + N1) + 1

2. P2 = N1 / N2

3. P2 = REAL(N1) / REAL(N2)

4. P2 = P2 / 2.0 * N1

5. P2 = P2 / (2.0 * N1)

Vuelva a COMPILAR y EJECUTAR cada caso. ANOTE y ANALICE el resultado. Mantenga elmismo nombre (prog2.f) para todos los casos.

1.3. Funciones Intrınsecas

Las funciones intrınsecas son aquellas definidas por

Figura 8: Funciones intrınsecas.

el propio lenguaje de programacion (por ejemplo el co-seno, la raız cuadrada, el logaritmo, etc). Estan inclui-das en las librerıas del compilador y este las recono-ce de modo automatico (ver Tabla 1). A continuacionmostramos un programa sencillo que emplea funcionesintrınsecas. Observa que los argumentos (valores o va-riables sobre los que se aplica la funcion) van siempreentre parentesis y si hay mas de uno, separados por co-mas.

CUIDADO: Los argumentos de las funciones trigo-nometricas van siempre en radianes en vez de en grados.

EDITE, COMPILE Y EJECUTE el programa prog3.f.Para saber cuanto vale la variable PI inserte debajo

de la instruccion en donde se calcula el valor de PI la instruccionPRINT*, PI

y vuelva a compilar y a ejecutar.

[C] ¿Para que se utiliza la variable RAD?.

Page 8: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

8 Introduccion a la Programacion

C prog3.f 17 Oct 97C Autor: ....C Calcula el coseno de 45 gradosC y la ra ız cuadrada de 36.C ================================

ANG = 45.0RA = 36.0

PI = ACOS(-1.0)RAD = PI/180.0

C Func. trigonometricas en radianesCS = COS (ANG *RAD)RAI= SQRT(RA)

PRINT *, CS, RAISTOPEND

Cuadro 1: Funciones intrınsecas mas habituales.Nombre Tipo argum. Tipo funcion (output) Observaciones

Funciones ”matematicas”:SQRT (gen) Real o comp. (1) Raiz cuadradaEXP (gen) Real o comp. (1) ExponencialLOG (gen) Real o comp. (1) Logaritmo neperianoLOG10 (gen) Real (1) Logaritmo decimal

Funciones trigonometricas (trabajan en radianes)SIN (gen) Real o comp. (1) SenoCOS (gen) Real o comp. (1) CosenoTAN (gen) Real. (1) TangenteASIN (real) Real. (1) ArcosenoACOS (real) Real. (1) ArcocosenoATAN (real) Real. (1) Arcotangente

Funciones de valor absoluto y signosABS (gen) Int. real o comp. (1) Valor absolutoSIGN (genA, genB) Int. o real (1) Devuelve |genA| con el signo de genB.

Funciones de conversionINT (gen) Int. real o comp. Int. Devuelve el valor entero truncando los decimales.REAL (gen) Int. real o comp. Real*4 Convierte un no entero en real.

Funciones de redondeo y truncacionNINT (real) Real Int Devuelve el entero por redondeo.ANINT (real) Real (1) Devuelve un numero real sin decimales, redondeado.

Funcion moduloMOD (ganA, genB) Int. o real (1) Devuelve el resto de dividir genA por genB.

Funciones de maximos y mınimosMAX (genA, genB, ...) Int. o real (1) Devuelve el mayor de los argumentos.MIN (genA, genB, ...) Int. o real (1) Devuelve el menor de los argumentos.

(1) Devuelve el mismo tipo de argumento que la entrada.

Page 9: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 9

1.4. Bucles (DO)

Queremos sumar los diez primeros terminos de la serie siguiente:

SUMA =10

I=1

1

I

El programa serie1.f hace la suma de los diez terminos, sin embargo, es bastante repetitivo.

C serie1.f 16 Oct 97 C bucle1.f 16 Oct 97C Serie 1/I C Serie 1/I con un bucleC===================== C===========================

R = 1.0 R = 1.0R = R + (1.0/2)R = R + (1.0/3) DO I = 2, 10R = R + (1.0/4) R = R + (1.0/I)R = R + (1.0/5) ENDDOR = R + (1.0/6)R = R + (1.0/7) PRINT *, ’ SERIE: ’, RR = R + (1.0/8) STOPR = R + (1.0/9) ENDR = R + (1.0/10)

PRINT *, ’ SERIE: ’, RSTOPEND

Imagine como serıa el programa si quisieramos el sumatorio de los 100 o 1000 primeros terminos de laserie. Para evitar la repeticion del mismo tipo de instrucciones, el FORTRAN tiene la instruccion DO. Conesta instruccion el programa anterior se simplifica como puede ver en el programa bucle1.f. La instruccionDO I = 2, 10 se entiende como ”hacer desde I igual a 2 hasta I igual a 10 el conjunto de instrucciones que estanentre el DO y el ENDDO” (ver Fig. 9).

[C] En los programas serie1.f y bucle1.f ¿son necesarios los parentesis?.

EDITE, COMPILE Y EJECUTE el programa bucle1.f. A continuacion REEMPLACE la instruc-cion R = R + (1,0/I) por R = R + (1/I), ¿El resultado es el mismo?, ¿Por que?.

Si ahora queremos calcular la suma de los 100 primeros terminos tenemos que editar el programa bucle1.f,cambiar el 10 por un 100, volver a compilar y ejecutar. Para evitar el tener que editar y compilar el programacada vez que queremos cambiar el valor lımite de la serie tenemos la instruccion READ (ver el programabuble2.f). Esta instruccion sirve para que el programa lea el contenido de una variable (en este caso la variableN) y lo guarde en memoria. Por tanto, al ejecutar el programa bucle2, el ordenador se quedara esperando a quetecleemos el valor que queremos que valga N. El programa lee este valor cuando despues de teclearlo pulsamosla tecla intro y lo asigna a la variable N.

COPIE bucle1.f a bucle2.f utilizando la ins-truccion siguiente:

cp bucle1.f bucle2.fEDITE bucle2.f y MODIFIQUELO de acuer-do con la figura correspondiente a bucle2.f.COMPILE Y EJECUTE el programa bucle2.Observe la diferencia con respecto a bucle1.

C bucle2.f 16 Oct 97 { 1}C Serie 1/I con un bucle y numero { 2}C de terminos variables. { 3}C=================================== { 4}

PRINT *, ’ Numero de terminos:’ { 5}READ *, N { 6}R = 1.0 { 7}

{ 8}DO I = 2, N { 9}R = R + (1.0/I) {10}ENDDO {11}

{12}PRINT *,’ Terminos: ’,N, {13}

+ ’ Serie: ’,R {14}STOP {15}END {16}

Page 10: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

10 Introduccion a la Programacion

ATENCION: el caracter ”+” o cualquier otro situado en la columna 6 indica que dicha lınea es continuacionde la lınea anterior (ver Fig. 7), por lo tanto, en el ejemplo anterior, las lıneas 13 y 14 equivalen a una solainstruccion:

PRINT*, ’Terminos: ’,N,’ Serie: ’,R

A continuacion, ELIMINE la instruccion correspondiente al ”print*, ’ Numero ...” (lınea 5) y vuelva acompilar y a ejecutar el programa bucle2.f. ¿Cual es la diferencia?.

Figura 9: La instruccion DO, bucle basico.

1.5. Problemas Adicionales (opcionales)

[C] Las variables siguientes tienen los valores indicados, B = 6,0, C = 4,0, M = 5, N = 3 y K = 2. Indique quevalores se almacenaran en la variable J (entera) como resultado de las siguientes operaciones:

a) J = M + N/K; b) J = C + B/K + N ; c) J = M − M/K ∗ K; d) J = N ∗ N ∗ ∗K.

[C] Programe (sobre papel) las siguientes asignaciones aritmeticas:a) AREA = 2·P ·R·sen

(

πρ

)

b) ARC = 2√

y2 + 4X2

3

c) S = − cos4 xx d) G = 1

2 log 1+senx1−senx

e) Z = − 1√

x2−a2

− 2a2

3(√

x2−a2)3

f) B =e

x√

x2

cos“√

x/2+ π

8

2πx

g) Y = (2π)1/2·xx+1·e−x

[C] De los siguientes nombre, ¿cuales son validos como variables enteras, cuales como variables reales y cuales noson validos como variables?. Siempre suponiendo que no hay ninguna instruccion de especificacion previa y con-siderando la norma del FORTRAN 77.

H BETA ALPHA324 I IT* LARGA F(3)21 CHI COSI 12G X+2 42G A*B GAMMA IBM360 COBOL AI F1.4

[C] La ”secuencia de Fibonacci” (Leonardo de Pisa 1202) nos darıa el crecimiento de pares de conejos sobresucesivos perıodos de tiempo suponiendo que ningun conejo muere. Los dos primeros terminos de laserie de Fibonacci son ambos un uno. Los restantes terminos de la serie se calculan sumando los dosterminos precedentes. Escriba un programa que lea un valor entero (NMAX) y que calcule y escriba losprimeros NMAX terminos de la serie de Fibonacci.

[C] Escriba un programa en FORTRAN para calcular1 − 2 + 3 − 4 + 5 − 6 + ... − 1000

Page 11: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 11

2. SESION SEGUNDA

2.1. Decisiones (instruccion IF)

En determinadas ocasiones un programa debe determinar por sı mismo si realiza o no un conjunto de ins-trucciones concretas. Para ello el FORTRAN utiliza la instruccion IF que podemos traducir como el ”si” con-dicional. Si una determinada condicion es cierta, entonces, ejecuta la instruccion (o conjunto de instrucciones).Si no (else) es cierta, entonces hace otra cosa.

En la Fig. 10 se muestran tres formas de

Figura 10: Tres posibilidades de la instruccion IF.

utilizar esta instruccion. La expresion logica ocondicion es una comparacion de cuyo resul-tado determina, el programa, si realiza o no lasinstrucciones correspondientes. En el progra-ma if1.f se utiliza la primera forma de la ins-truccion IF para evitar un error al hacer la raızcuadrada de un numero negativo, estudie esteprograma (ver Tabla 2) y despues comparelocon los programas if2.f e if3.f, que emplean lasegunda y tercera forma de la instruccion IF,respectivamente.

EDITE, COMPILE y EJECUTE los tres programas. Cuando ejecute los programas, el ordenador sequedara esperando a que introduzca los valores de A y B para leerlos, ya que es esta la primera instruccion delos tres programas. Teclee ambos valores separados por uno o varios espacios en blancos (barra espaciadora)y pulso intro. No use las flechas de los cursores para avanzar y/o retroceder.

C if1.f 17 Oct 97 C if2.f 17 Oct 97 C if3.f 17 Oct 97C Instruccion IF C Instruccion IF C Instruccion IFC====================== C ========================= C ========================

READ *, A, B READ *, A, B READ *, A, BC = A - B C = A - B C = A - BIF(C.LE.0.0) C = -1.0 *C IF(C.LT.0.0) THEN IF(C.GT.0.0) THEND = SQRT(C) C = -1.0 *C D = SQRT(C)PRINT *, A, B, C, D PRINT *, ’ N. complejo’ PRINT *, A, B, C, DSTOP ENDIF ELSEEND D = SQRT(C) D = SQRT(-1.0 *C)

PRINT *, A, B, C, D PRINT *, ’ N. complejo’STOP PRINT *, A, B, C, D,’i’END ENDIF

STOPEND

Cuadro 2: Operadores (incluidos lo puntos) utilizados en las comparaciones.Operador Significado.LT. Menor que.LE. Menor o igual que.EQ. Igual a.NE. No igual a.GT. Mayor que.GE. Mayor o igual que

Page 12: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

12 Introduccion a la Programacion

2.1.1. Introduccion de datos por medio de un fichero.

EDITE un fichero llamado, por ejemplo, ”ifdatos.dat” y escriba en el dos numeros separados por variosespacios en blanco; guarde el fichero y ejecute las instrucciones siguientes:

./if1.exe <ifdatos.dat

./if2.exe <ifdatos.dat

./if3.exe <ifdatos.datObserva que cuando utilizamos el simbolo ”<” los datos que nos piden los programas y que antes teniamosque introducir con el teclado ahora los lee del fichero ”ifdatos.dat”. Tambien podemos escribir el resultado enun fichero; ejecute la instruccion:

./if3.exe <ifdatos.dat >ifsalida.saly edite el fichero ”ifsalida.sal” para ver el resultado.

Tenga cuidado de no confundir los sımbolos ”<” y ”>” pues si se equivoca puede borrar el fichero dedatos. Los datos editados en el fichero de datos tiene que estar en la misma posicion (separados por espaciosy/o en diferentes lıneas) que cuando los tecleamos en la pantalla. No tenemos que incluir comentarios enestos ficheros salvo que el programa fortran lea dichos comentarios. En la sesion siguiente utilizaremos confrecuencia la introduccion de datos por medio de un fichero.

2.2. GOTO (la instruccion que debemos evitar)

Observe el programa num1.f, en el introducimos nuevos elementos: la instruccion GOTO y las etiquetas.El GOTO (Fig. 11) significa ”vete a ...”, en este caso ”vete a 10” y el ”10” situado delante de la instruccionPRINT es una etiqueta.Observe que las etiquetas tienen que ir siempre entrelas columnas 1 y 5 (ver Fig. 7). Este programa enrealidad es un modo alternativo de hacer un buclepero sin la instruccion DO.

EDITE, COMPILE Y EJECUTE elprograma num1.f.

C num1.f 17 Oct 97C Escribe numeros enteros del 1 al 100C =====================================

N = 110 PRINT *, N

N = N + 1IF(N .LE. 100) GOTO 10STOPEND

Figura 11: Instruccion GOTO.

Page 13: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 13

2.3. Ejercicio 1: Ecuacion de segundo grado

Figura 12: Diagrama de flujo para resolver una ecuacion de segundo grado.

Queremos resolvemos una ecuacion de segundo grado:

a x2 + b x + c = 0

La solucion (las raıces) de esta ecuacion se obtienen resolviendo la ecuacion siguiente:

x =−b ±

√b2 − 4ac

2a

Al resolver esta ecuacion podemos encontrarnos con algunos problemas. El primer problema se da cuandoa = 0. En este caso no podemos emplear la ecuacion anterior pues al dividir por cero el programa nos dara unerror. Evidentemente, en este caso, la ecuacion a resolver serıa

bx + c = 0 ; x =−c

b

Para simplificar hemos supuesto que a y b no valen ambos cero a la vez. El segundo problema es el calculode la raız. Si su argumento (b2 - 4ac) es negativo la raız no tiene solucion (dentro de los numeros reales) y elprograma nos darıa otro error. Conviene que nuestro programa compruebe estas posibilidades y evite los errores.Como vemos la programacion se va complicando y conviene estructurar los programas antes de escribirlos enel ordenador. Para ello se utilizan los llamados diagramas de flujo. Un diagrama de flujo (no muy ortodoxo)para resolver la ecuacion de segundo grado se muestra en la Fig. 12.

Haga un programa que resuelva la ecuacion de segundo grado. Ayudese en el diagrama de flujo ylas instrucciones dadas anteriormente. Utilice el programa para calcular las raıces de las siguientesecuaciones particulares.OPCIONAL: Incluir en el programa el caso en el que la solucion pueda ser numeros complejos.

2,2x2 − 4,5x + 0,5 = 0 ; Sol : 1,9275 y 0,1179

3,0x2 + 3,0x + 0,75 = 0 ; Sol : −0,5

1,0x2 + 2,0x + 1,5 = 0 ; Sol : −1 + 0,707i y − 1 − 0,707i

Page 14: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

14 Introduccion a la Programacion

2.4. Problemas Adicionales (opcionales)

[C] ¿Que valor quedara almacenado en J al final de las secuencias siguientes? (el tipo de las variables es elcorrespondiente por defecto).

a) M = 9 b) DO K = 1, 4J = 1 J = 0

2 CONTINUE DO N = 1, 5J = J + 1 J = J + NM = M / J ENDDO

IF (M.GT.0) GOTO 2 ENDDOPRINT *, J PRINT *, J

[P] Un numero primo es aquel que solo es divisible por si mismo y por la unidad. Teniendo en cuenta quesi no existe ningun divisor de un numero N entre 2 y (N)1/2 entonces N es un numero primo, escriba unprograma en FORTRAN para calcular y escribir los numero primos menores de 1000.

[P] La media geometrica de N numeros positivos es la n-esima raız del producto de los numeros. Por ejemplo,la media geometrica de 0.5, 4.0 y 13.5 es (0.5*4.0*13.5)1/3 = 3.0. Escribe un programa que preguntepor los numeros positivos y calcule su media geometrica. El programa debe leer numeros hasta que elusuario introduzca un numero negativo.

[P] El examen del espectro del atomo hidrogeno muestra la existencia de series de lineas espectrales, lasfrecuencias de las dos primeras series se calculan con las ecuaciones,

Serie de Lyman : f = c · R ·(

(

1

1

)2 −(

1

n

)2)

; n = 2, 3, 4, ... (ultravioleta)

Serie de Balmer : f = c · R ·(

(

1

2

)2 −(

1

n

)2)

; n = 3, 4, 5, ... (visible)

donde c es la velocidad de la luz (3.0·108 m/s) y R es la constante de Rydberg (1.0967758·107 m−1).Escribe un programa FORTRAN para generar las primeras frecuencias de estas dos series.

[P] Escriba un programa FORTRAN para calcular elmaximo comun divisor (MCD) de dos numerosenteros (M y N) utilizando el algoritmo y dia-grama de flujo de la figura y de acuerdo con lassiguientes etapas:

a) Hacemos que el numero M sea mayor que N,es decir si N es mayor que M intercambia-mos los dos numeros.

b) Calculamos el resto (R) de dividir M por N.Si el resto (R) es cero entonces N es elMCD.

c) Si el resto (R) no es cero damos a M el valorde N y a N el valor de R y repetimos lasetapas b) y c).

Page 15: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 15

3. SESION TERCERA

3.1. Manejo de Vectores y Matrices

Tenemos una tabla como la que mostramos en la Fig. 13 con valores X e Y. Para manejar una serie dedatos en forma de vector o matriz en FORTRAN se definen variables dimensionadas. En el programa dim1.flo primero que hacemos es definir o asignar (instruccion DIMENSION) dos variables X y Y que tienen unmaximo de 10 elemento cada una.

Antes de usar este tipo de variable dimensionada, es ne-cesario definirlas al comienzo del programa para reser-var espacio en la memoria del ordenador. El programalee los valores de X y de Y y los guarda en los vectoresX(I) e Y(I) (instruccion READ). Despues suma todoslos X y todos los Y. Le falta escribir los resultados.

EDITE, COMPILE Y EJECUTE el progra-ma dim1.f. ANADA las instrucciones nece-sarias para obtener la salida de resultados.Estudie con detenimiento el programa, sino entiende algo pregunte a su profesor.

C dim1.f 17 Oct 97C Autor: .....ps}}C Suma los valores de X y de YC =============================

DIMENSION X(10), Y(10)READ *, N

DO I=1,NREAD *, X(I), Y(I)ENDDO

SX = 0.0SY = 0.0DO I=1,NSX = SX + X(I)SY = SY + Y(I)ENDDO

STOPEND

3.2. Ejercicio 2: Ajuste de una recta por mınimos cuadrados

Para ajustar una serie de puntos X e Y a una

Figura 13: Tabla de datos X e Y, representacion grafica y rectaajusta por mınimos cuadrados.

recta (y=a+bx) por mınimos cuadrados utilizare-mos las ecuaciones siguientes. Primero definimosSX, SY, SXX y SXY como:

SX =n

i=1

xi ; SY =n

i=1

yi

SXX =n

i=1

x2i ; SXY =

n∑

i=1

xiyi

Con estas definiciones, el corte en ordenadas(a) y la pendiente (b) de la recta (y = a + bx)vienen dados por:

a =SY − b ·SX

n; b =

SX ·SY − n ·SXY

SX ·SX − n ·SXX

La desviacion cuadratica media del ajuste se define como:

σ =

∑ni=1

(yi − y∗i )2

n − 2=

∑ni=1

(yi − (a + bxi))2

n − 2

σ =

SD2

n − 2; con SD2 =

n∑

i=1

(yi − (a + bxi))2

Page 16: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

16 Introduccion a la Programacion

Figura 14: Un ajuste de mınimos cuadrados se basa en minimizar la suma del cuadrado de la diferencias entre los puntosque usamos en el ajuste (yi) y los puntos de la recta ajustada (y∗i).

y las incertidumbres del corte en ordenadas (σa) y de la pendiente (σb) se estima como:

σa = σ

SXX

n ·SXX − SX ·SX; σb = σ

n

n ·SXX − SX ·SX

El coeficiente de correlacion se puede calcular con la expresion siguiente:

r =SX ·SY − n ·SXY

[

(S2X − n ·SXX)·(S2

Y − n ·SY Y )]1/2

; SY Y =n

i=1

y2i

[P] Utilizando las ecuaciones anteriores haga un programa que lea N puntos X e Y y ajuste unarecta por mınimos cuadrados.En la Fig. 13 se dan los resultados para este ejemplo. Las incertidumbres de la pendiente y delcorte en ordenadas correspondientes a la ultima cifra significativa se dan entre parentesis.

De modo similar se pueden definir matrices, por ejemplo con la instruccionDIMENSION ARRAY(10,10), B(5,5,5)

definimos una matriz llamada ARRAY de 10x10 elementos y otra llamada B de 5x5x5 elementos, sin embargo,esto, como otras muchas instrucciones de FORTRAN, se sale del lımite de esta introduccion. Para su estudio leremitimos a cualquier libro de FORTRAN.

3.3. Problemas Adicionales (opcionales)

[P] Edita y guarda los datos del ejercicio 2 en un fichero. Despues ejecuta el programa del ejercicio 2 demodo que utilice los datos del fichero.

[P] Escribe un programa que ordene de mayor a menor 25 numeros. Lee los numeros de un fichero y al-macenalos en un vector A. El programa debe imprimir los numeros ordenados del vector.

[P] Escribe un programa que intercambie las filas 5 y 8 en una matriz de 10x10 leıda de un fichero. Escribela matriz resultante. Haz lo mismo pero intercambiando las columnas 3 y 7.

Page 17: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 17

4. CUARTA SESION

4.1. Subprogramas

La realizacion de programas complejos se suele ha-

Figura 15: Subprogramas y funciones.

cer dividiendo el programa en trozos cada uno de loscuales realiza una tarea definida. Estos trozos es lo quellamaremos subprogramas. A veces hay un conjunto deinstrucciones que se repiten en un mismo programa. Siprogramamos estas instrucciones en un subprograma, elprograma principal unicamente tiene que ”llamar” a di-cho subprograma sin repetir las instrucciones. En reali-dad, las funciones intrınsecas que hemos visto anterior-mente son subprogramas realizados por el fabricante delcompilador.

La programacion con subprogramas facilita el tra-bajo del programador dando lugar a una programacionmas estructurada. En FORTRAN hay tres tipos princi-pales de subprogramas:

1. Subrutina (SUBROUTINE). Cuando la tarea a realizar modifica varias variables aunque tambien se puedeusar cuando modifica una sola variable o ninguna.

2. Funciones (FUNCTION). Cuando la tarea a realizar devuelve un unico valor escalar.

3. Funciones de proposicion. Se suele usar para la programacion de pequenas formulas (no la vamos a usaren esta introduccion). Esta forma esta obsoleta.

Estos subprogramas realizan tareas in-

Figura 16: Estructura de un subprograma y de un programa.

dependientes y pueden compartir valores(argumentos) con el programa que les ”lla-ma”.

Como puedes ver en los ejemplos quemostramos a continuacion, el subprogramava despues del programa principal, aunquepuede ir antes e incluso en un fichero apar-te pero nunca puede ir intercalado entrelas instrucciones del programa principal (MAINen ingles).

En el caso de la subrutina, se las llamacon la instruccion CALL seguida del nom-bre de la subrutina y en entre parentesis seescriben las variables o constantes (argu-mentos) que va a utilizar el subprograma.

La llamada a una funcion se realiza del mismo modo que con las funciones intrınsecas (observa las di-ferencias entre suma1.f y suma2.f). Cuando se efectua la llamada a un subprograma, el programa principalcede el control al subprograma, este realizar su tarea y al final devuelve el control al programa principal en lainstruccion siguiente al CALL. Las variables modificadas en los subprogramas y que estan compartidas conel programa principal quedan tambien modificadas en el programa principal. Hasta ahora hemos hablado de

Page 18: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

18 Introduccion a la Programacion

C suma1.f 17 Oct 97 C suma2.f 17 Oct 97 C media1.f 17 Oct 97C Subrutina suma 2 numeros C Funcion suma 2 numeros C Calcula la media de losC========================= C======================== C datos de un vectorC Lectura de datos ...... C Lectura de datos .... C ==========================

READ *, A, B READ *, A, B DIMENSION V(100)CALL SUMA(A,B,C) C = SUMA(A,B) C Lectura de datos ......PRINT *, A, B, C PRINT *, A, B, C READ *, NCALL SUMA(A,C,D) D = SUMA(A,C) DO I=1,NPRINT *, A,C,D PRINT *, A,C,D READ *, V(I)STOP STOP ENDDOEND END C Llamo a la subrutina MEDIA

C ======================== C======================== CALL MEDIA (V,N,RMEDIA)C Subrutina SUMA: C FUNCION SUMA: PRINT *, RMEDIAC R3 = R1 + R2 C SUMA = R1 + R2 STOPC ======================== C======================== END

SUBROUTINE SUMA(R1,R2,R3) FUNCTION SUMA(R1,R2) C ==========================R3 = R1 + R2 SUMA = R1 + R2 C Subrutina MEDIA:RETURN RETURN C Z es un vectorEND END C M es el numero de

C elementos del vectorC RM es la media de losC elementosC ==========================

SUBROUTINE MEDIA(Z,M,RM)DIMENSION Z(100)SUM = 0.0DO I=1,MSUM = SUM + Z(I)

ENDDORM = SUM / MRETURNEND

programa principal y subprograma, sin embargo, un subprograma puede a su vez llamar a otros subprogramas,siempre que la llamada no sea recursiva, es decir un subprograma no puede llamarse a si mismo.

Un subprograma comienza con las instrucciones SUBROUTINE o FUNCTION seguido del nombre y entreparentesis los argumentos (ver Fig. 16). Los argumentos tienen que ser los mismos en la llamada del programaprincipal y en el subprograma y, por tanto, aunque pueden cambiar de nombre no pueden cambiar de tipo(reales, enteros, caracteres, ...) ni de orden, es decir en el programa suma1.f A, B y C en la primera llamada ala subroutina son en la subroutina R1, R2 y R3, respectivamente.

Las variables dimensionadas hay que volver a definirlas en los subprogramas (DIMENSION). Los subpro-gramas terminar con la instruccion RETURN que devuelve el control al programa principal (o al subprogramaque llamo a la subrutina).

Edita compilar y ejecuta los programas suma1.f, suma2.f y media1.f, estudia cuidadosamentecomo funcionan y las diferencias que hexisten entre ellos.

Hay otra forma de compartir argumentos entre el programa principal y los subprogramas y viceversa, es lainstruccion COMMON. La declaracion COMMON situa las variables en una posicion de memoria especial ala que tienen acceso las subrutina que contengan el mismo COMMON. Cada COMMON suele llevar asociadoun nombre aunque tambien esta el llamado ”black” COMMON que no tiene nombre. Por ejemplo:

COMMON/NOTAS/ JUN(25),SEP(5)es un COMMON de nombre NOTAS que guarda las variables JUN(25) y SEP(25) en una posicion de memoriaa la que pueden acceder las subrutina que contengan el COMMON/NOTAS/ ...Un ejemplo de ”black” COMMON serıa:

COMMON ARRAY(225,2), VEC(7), RR

Page 19: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

Dpto. Quımica Fısica Aplicada, UAM 19

4.2. Ejercicio 3: Integracion numerica

El valor de una integral definida

Figura 17: Representacion grafica de la integral de una funcion.

∫ b

af(x)dx

viene dado por el area limitado por la curva y=f(x)y el eje de abcisas (x) entre x=a y x=b (Fig. 17).

Una estimacion del area se puede realizar di-vidiendo la superficie total en pequenas porcionesy sumado el area de cada porcion (Fig. 18). En elmetodo trapezoidal, la superficie de cada porcionse aproxima a un trapecio y por lo tanto su areaviene dado por la ecuacion

Figura 18: Integral o area como suma del area de los trapecios

Ai =h

2[f(xi) + f(xi−1)]

Sumando el area de todas las porciones o trapecios,en este caso para un ejemplo con N (no de trape-cios) igual a 6, tenemos:

IT = h2[f(a) + f(x1)] + h

2[f(x1) + f(x2)]

+ h2[f(x2) + f(x3)] + h

2[f(x3) + f(x4)]

+ h2[f(x4) + f(x5)] + h

2[f(x5) + f(b)]

obtenemos la ecuacion que nos da la integral aproxi-mada:

IT =

∫ b

af(x) dx =

h

2

[

f(a) + 2,0

n−1∑

i=1

f(xi) + f(b)

]

(1)

[P] Escriba un programa FORTRAN para integrar numericamente por el metodo de los trapecios. Aplicarel programa para calcular la integral siguiente:

IT =

∫ 2

0

(6x5 − 7) dx

Sigua el esquema siguiente:1. Organizar la lectura de datos (a, b y n).

2. Calcular h como (b-a)/n.

3. Calcular los valores de f(a) y f(b) llamando a la funcion (ver punto 6).

4. Calcular la parte correspondiente al sumatorio. SUM =∑n−1

i=1f(xi) con xi = a + i·h.

5. Aplicar la Ec. (1) y escribir los resultados.

6. Programar la funcion f(x) = 6x5 - 7 como un subprograma de tipo FUNCTION.

Page 20: INTRODUCCION· A LA PROGRAMACION· FORTRANprofesores.fi-b.unam.mx/ing_gpemn/cpi/basica/pdfs/Fortran8.pdf · 1.2. Constantes, Variables y Tipos de Datos FORTRAN es un lenguaje de programacion·

20 Introduccion a la Programacion

4.3. Problemas Adicionales (opcional)

[C] Un metodo usualmente empleado para resolver ecuaciones de la forma f(x) = 0 es el metodo iterativode Newton, el cual se define por

xn+1 = xn − f(xn)

f ′(xn)(2)

Donde f’(xn) es la derivada de la funcion en xn. Escribe un programa que resuelva la iteracion arriba indi-cada. f y f’ debes programarlas como funciones (FUNCTION) separadas. Aplica el programa a resolveruna ecuacion de la forma

x2 − a = 0 (3)

para un valor de a cualquiera.

[C] Escribe un programa para calcular el valor del seno de un angulo (en grados) utilizando la aproximacioniterativa siguiente:

SENO(X) = X − X3

3!+

X5

5!− X7

7!+ . . .

donde X en la ecuacion anterior esta en radianes. Calcula el seno de 140o con 5, 10 y 15 terminos dela serie anterior. (Por supuesto no se puede utilizar las funcion intrınseca SIN del FORTRAN, aunque siquieres puedes utilizar la funcion DACOS para calcular π).

[C] La formula de Stirling nos proporciona un modo alternativo de calcular el factorial de N (N!). La formulaes: N ! =

√2πN ·NN · exp(−N) . Escribe un programa que use la formula de Stirling para calcular el

factorial desde N igual a 1 hasta 20. Comprueba la precision del resultado comparando con el factorialcalculado al modo tradicional.

[C] Escribir un programa para calcular la raız cuadrada de un numero x utilizando la siguiente formula:

b =1

2

(x

a+ a

)

donde b es una aproximacion mejor que a a la raız cuadrada de x. La primera aproximacion se debetomar como (1/2)x y el procedimiento se debe repetir hasta que la diferencia entre a y b sea menor de10−6.