Está en la página 1de 20

A LA PROGRAMACION

INTRODUCCION
FORTRAN

J. San Fabian
Informatica Aplicada a la Qumica
Departamento de Qumica Fsica Aplicada
Universidad Autonoma de Madrid
Primera version en Latex: 3 Nov 2004
(18 de febrero de 2008)
2 Introduccion a la Programacion

Indice

1. PRIMERA SESION 4
1.1. Editar, Compilar y Ejecutar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2. Constantes, Variables y Tipos de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3. Funciones Intrnsecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4. Bucles (DO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

SEGUNDA
2. SESION 11
2.1. Decisiones (instruccion IF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1. Introduccion de datos por medio de un fichero. . . . . . . . . . . . . . . . . . . . . . 12
2.2. GOTO (la instruccion que debemos evitar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3. Ejercicio 1: Ecuacion de segundo grado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

TERCERA
3. SESION 15
3.1. Manejo de Vectores y Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2. Ejercicio 2: Ajuste de una recta por mnimos cuadrados . . . . . . . . . . . . . . . . . . . . . 15
3.3. Problemas Adicionales (opcionales) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16


4. CUARTA SESION 17
4.1. Subprogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2. Ejercicio 3: Integracion numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3. Problemas Adicionales (opcional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Dpto. Qumica Fsica Aplicada, UAM 3

A LA PROGRAMACION
INTRODUCCION
FORTRAN

Vamos a comenzar cuatro sesiones (10 horas) de introducci o n a la programacion y para ello vamos
a utilizar el lenguaje de programacio n FORTRAN.
Lea detenidamente y con calma la introduccio n siguiente. Siempre que aparezca una [C] es
que tiene que contestar alguna cuestio n. Cuando aparezca una [P] es porque tiene que hacer un
programa (editar, compilar y ejecutar) y cuando funcione imprimirlo. Los programas que no tengan
la [P] no hace falta sacarlos por la impresora. Los programas impresos, las contestaciones a las
cuestiones y los ejercicios 1 a 3, e stos u ltimos en las sesiones 2a a 4a forman el guion de practicas
que tiene que entregar al profesor en el plazo de una semana desde la terminaci o n de la cuarta
sesion de FORTRAN. Tambien encontrara una serie de ejercicios adicionales que en caso de tener
tiempo debe incluir en el guion de practicas (OPCIONAL).
Ante un problema estudie detenidamente la informacio n que le proporciona el ordenador e intente
resolverlo por s mismo antes de preguntar al profesor.
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 el
editor utilizado es el KWrite, pero puede utilizar el que le resulte mas comodo (kate, vi, ...). Procure
escribir 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)
y) significa que debe pulsar dicha tecla o la tecla Intro para hacer operativa la orden. Si ha
El smbolo final (J
escrito bien el fichero prog1.f no debe aparecer ning u n error. Si la compilacion produce algun error, lea
detenidamente lo que le indica el ordenador, y con esa informaci o n revise (reedite) el fichero prog1.f y
vuelva a ejecutar la instruccion anterior. Si no consigue solucionar los problemas por s mismo pregunte
a su profesor.

3.- (EJECUTAR) Si la compilacion no da ningun error ejecute el comando ls y vera que entre otros tiene
en el disco los ficheros prog1.f y prog1.exe. Este u ltimo es un fichero ejecutable. Escriba la instruccio n
siguiente para ejecutar:
./prog1.exe (J
y)

El ./ antes del nombre del ejecutable (prog1.exe) es necesario en las u ltimas versiones de linux e indica que
el 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 introduccio n al FORTRAN muy breve, le aconsejo que practique y profundice por
su cuenta en la programacion pues puede serle muy u til.
1
Compilar consiste en traducir el lenguaje fortran a co digo maquina que es capaz de entender el ordenador. Esta operaci o n la realiza
un programa llamado compilador, en este caso el gfortran.
Dpto. Qumica Fsica Aplicada, UAM 5

1.2. Constantes, Variables y Tipos de Datos

FORTRAN es un lenguaje de programacio n vivo ya que la mayora de los programas usados por la comu-
nidad cientfica estan escritos en FORTRAN. Es un lenguaje de alto nivel, es decir, requiere poco conocimiento
del hardware y emplea palabra conocidas (normalmente en ingles) que le indican al ordenador lo que tiene que
hacer con unas serie de objetos con los que va a trabajar.
El tipo de objetos que va a manejar el or-
denador siguiendo las ordenes de nuestro pro-
grama son los que se muestran en la Fig. 2.
En estas practicas u nicamente vamos a traba-
jar con numeros enteros y reales y muy de pa-
sada con caracteres. Por defecto el FORTRAN
que estamos usando utiliza 4 bytes (8x4 = 32
bits) para guardar un numero entero o un nu-
mero real. Esto implica que el numero entero
mas grande, en valor absoluto, que podemos
usar es el 2147483647. Por otro lado, los nu -
meros reales tendran una precision aproxima-
Figura 2: Tipo de datos utilizados en el lenguaje FORTRAN. da de 7 cifras significativas y los nu meros rea-
les que podemos manejar estaran entre 1038 y 1038 .
Los datos pueden estar en nuestro programa
de dos maneras diferentes, como constantes o co-
mo variables (Fig. 3). Las variables son como las
memorias de nuestra calculadora de bolsillo y su
contenido puede cambiar durante la ejecucio n del
programa.
Los numeros enteros y reales se definen (es
decir, se le indica al ordenador que son nu meros
enteros o reales) como se muestra en la Fig. 4. Por
otro lado tambien tenemos varios tipos de nume-
ros enteros y reales, aunque nosotros vamos a uti-
lizar u nicamente los que tiene el FORTRAN por
defecto y que hemos senalado en la Fig. 3 (defec-
Figura 3: Constantes y variables.
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 dema s letras (A-H, O-Z).

Figura 4: Definicion de enteros y reales.


6 Introduccion a la Programacion

Con estos datos podemos hacer una serie de operaciones b a sicas (Fig. 5). Observa que las operaciones
tienen 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 sea
necesario.

Figura 5: Operaciones basicas.

Una operacion basica y a la vez difcil de entender cuando la vemos por primera vez es la instrucci o n de
asignacion. Cuando vemos un signo = debemos entender que se realizan las operaciones que hay a la
derecha del signo = y el resultado se guarda en la variable que esta a la izquierda del igual. Por tanto, a
la izquierda del = siempre debe haber una variable.

Vamos a hacer un programa para repasar los conceptos vistos hasta ahora. EDITE, COMPILE Y
EJECUTE el programa prog2.f. Evidentemente, los nu meros de la columna derecha (entre corchetes)
solo sirven para numerar las lneas 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} En los programas en fortran, las instrucciones co-
C conceptos basicos { 3} mienzan en la columna 7. Los comentarios (las
C=====7========================= { 4}
P1 = 5.3 { 5} primeras cuatro lneas en los programas anteriores
N1 = 3 { 6} son comentarios) se indican con una C (tambien
P2 = P1 * N1 { 7}
N2 = P1 * N1 { 8} podra ser un asterisco *) en la columna 1. Los co-
{ 9} mentarios son ignorados por el compilador. El pro-
PRINT * , P2: , P2 {10} grama termina con dos instrucciones que todo pro-
PRINT * , N2: , N2 {11}
{12} grama FORTRAN debe tener (STOP y END).
P2 = P2+N1 * 2 {13} El lenguaje FORTRAN77 (y anteriores) sigue una
PRINT * , P2-NUEVO: , P2 {14}
{15} serie de reglas rigurosas en cuanto a la colocacio n de
STOP {16} las instrucciones (estudie la Fig. 7 detenidamente).
END {17}
Dpto. Qumica Fsica Aplicada, UAM 7

Figura 7: Division de las lneas en FORTRAN77.

[C] REMPLACE la lnea 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 el


mismo nombre (prog2.f) para todos los casos.

1.3. Funciones Intrnsecas

Las funciones intrnsecas son aquellas definidas por


el propio lenguaje de programacio n (por ejemplo el co-
seno, la raz cuadrada, el logaritmo, etc). Estan inclui-
das en las libreras del compilador y e ste las recono-
ce de modo automatico (ver Tabla 1). A continuacio n
mostramos un programa sencillo que emplea funciones
intrnsecas. Observa que los argumentos (valores o va-
riables sobre los que se aplica la funcio n) van siempre
entre 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 Figura 8: Funciones intrnsecas.
de la instruccion en donde se calcula el valor de PI la instruccio n
PRINT*, PI
y vuelva a compilar y a ejecutar.
[C] Para que se utiliza la variable RAD?.
8 Introduccion a la Programacion

C prog3.f 17 Oct 97
C Autor: ....
C Calcula el coseno de 45 grados
C y la ra z cuadrada de 36.
C ================================
ANG = 45.0
RA = 36.0
PI = ACOS(-1.0)
RAD = PI/180.0
C Func. trigonometricas en radianes
CS = COS (ANG * RAD)
RAI= SQRT(RA)
PRINT * , CS, RAI
STOP
END

Cuadro 1: Funciones intrnsecas mas habituales.


Nombre Tipo argum. Tipo funcio n (output) Observaciones
Funciones matematicas:
SQRT (gen) Real o comp. (1) Raiz cuadrada
EXP (gen) Real o comp. (1) Exponencial
LOG (gen) Real o comp. (1) Logaritmo neperiano
LOG10 (gen) Real (1) Logaritmo decimal
Funciones trigonometricas (trabajan en radianes)
SIN (gen) Real o comp. (1) Seno
COS (gen) Real o comp. (1) Coseno
TAN (gen) Real. (1) Tangente
ASIN (real) Real. (1) Arcoseno
ACOS (real) Real. (1) Arcocoseno
ATAN (real) Real. (1) Arcotangente
Funciones de valor absoluto y signos
ABS (gen) Int. real o comp. (1) Valor absoluto
SIGN (genA, genB) Int. o real (1) Devuelve |genA| con el signo de genB.
Funciones de conversion
INT (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 truncacion
NINT (real) Real Int Devuelve el entero por redondeo.
ANINT (real) Real (1) Devuelve un numero real sin decimales, redondeado.
Funcion modulo
MOD (ganA, genB) Int. o real (1) Devuelve el resto de dividir genA por genB.
Funciones de maximos y mnimos
MAX (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.
Dpto. Qumica Fsica Aplicada, UAM 9

1.4. Bucles (DO)

Queremos sumar los diez primeros terminos de la serie siguiente:


10
X 1
SU M A =
I
I=1

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 97


C Serie 1/I C Serie 1/I con un bucle
C===================== C===========================
R = 1.0 R = 1.0
R = R + (1.0/2)
R = R + (1.0/3) DO I = 2, 10
R = R + (1.0/4) R = R + (1.0/I)
R = R + (1.0/5) ENDDO
R = R + (1.0/6)
R = R + (1.0/7) PRINT * , SERIE: , R
R = R + (1.0/8) STOP
R = R + (1.0/9) END
R = R + (1.0/10)
PRINT * , SERIE: , R
STOP
END

Imagine como sera el programa si quisieramos el sumatorio de los 100 o 1000 primeros terminos de la
serie. Para evitar la repeticion del mismo tipo de instrucciones, el FORTRAN tiene la instrucci o n DO. Con
esta instruccion el programa anterior se simplifica como puede ver en el programa bucle1.f. La instrucci o n
DO I = 2, 10 se entiende como hacer desde I igual a 2 hasta I igual a 10 el conjunto de instrucciones que est a n
entre 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 continuaci o n 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 programa
cada vez que queremos cambiar el valor lmite de la serie tenemos la instruccio n READ (ver el programa
buble2.f). Esta instruccion sirve para que el programa lea el contenido de una variable (en este caso la variable
N) y lo guarde en memoria. Por tanto, al ejecutar el programa bucle2, el ordenador se quedar a esperando a que
tecleemos el valor que queremos que valga N. El programa lee este valor cuando despues de teclearlo pulsamos
la tecla intro y lo asigna a la variable N.
C bucle2.f 16 Oct 97 { 1}
C Serie 1/I con un bucle y numero { 2}
C de terminos variables. { 3}
COPIE bucle1.f a bucle2.f utilizando la ins- C=================================== { 4}
PRINT * , Numero de terminos: { 5}
truccion siguiente: READ * , N { 6}
cp bucle1.f bucle2.f R = 1.0 { 7}
EDITE bucle2.f y MODIFIQUELO de acuer- { 8}
DO I = 2, N { 9}
do con la figura correspondiente a bucle2.f. R = R + (1.0/I) {10}
COMPILE Y EJECUTE el programa bucle2. ENDDO {11}
{12}
Observe la diferencia con respecto a bucle1. PRINT * , Terminos: ,N, {13}
+ Serie: ,R {14}
STOP {15}
END {16}
10 Introduccion a la Programacion

ATENCION: el caracter + o cualquier otro situado en la columna 6 indica que dicha lnea es continuacion
de la lnea anterior (ver Fig. 7), por lo tanto, en el ejemplo anterior, las lneas 13 y 14 equivalen a una sola
instruccion:

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

A continuacion, ELIMINE la instruccion correspondiente al print*, Numero ... (lnea 5) y vuelva a


compilar 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 que
valores 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 asignacionesq


 
aritmeticas:
a) AREA = 2P Rsen b) ARC = 2 y 2 + 4X
2
3

c) S = cos4 x
x d) G = 21 log 1senx
1+senx
x 2
e x cos x/2+
e) Z = f) B =
2
x21a2 2a2 2 3
8

3( x a ) 2x
g) Y = (2) 1/2 x+1 x
x e

[C] De los siguientes nombre, cuales son validos como variables enteras, cuales como variables reales y cuales no
son validos como variables?. Siempre suponiendo que no hay ninguna instrucci o n de especificacion previa y con-
siderando la norma del FORTRAN 77.
H BETA ALPHA324 I IT* LARGA F(3)21 CHI COS
I 12G X+2 42G A*B GAMMA IBM360 COBOL AI F1.4

[C] La secuencia de Fibonacci (Leonardo de Pisa 1202) nos dara el crecimiento de pares de conejos sobre
sucesivos perodos de tiempo suponiendo que ningu n conejo muere. Los dos primeros terminos de la
serie de Fibonacci son ambos un uno. Los restantes terminos de la serie se calculan sumando los dos
terminos precedentes. Escriba un programa que lea un valor entero (NMAX) y que calcule y escriba los
primeros NMAX terminos de la serie de Fibonacci.
[C] Escriba un programa en FORTRAN para calcular
1 2 + 3 4 + 5 6 + ... 1000
Dpto. Qumica Fsica Aplicada, UAM 11

SEGUNDA
2. SESION

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 instrucci o n IF que podemos traducir como el si con-
dicional. Si una determinada condicio n es cierta, entonces, ejecuta la instruccio n (o conjunto de instrucciones).
Si no (else) es cierta, entonces hace otra cosa.
En la Fig. 10 se muestran tres formas de
utilizar esta instruccion. La expresion logica o
condicion es una comparacion de cuyo resul-
tado determina, el programa, si realiza o no las
instrucciones correspondientes. En el progra-
ma if1.f se utiliza la primera forma de la ins-
truccion IF para evitar un error al hacer la raz
cuadrada de un numero negativo, estudie este
programa (ver Tabla 2) y despues comparelo
con los programas if2.f e if3.f, que emplean la
segunda y tercera forma de la instruccio n IF,
respectivamente.

Figura 10: Tres posibilidades de la instruccio n IF.


EDITE, COMPILE y EJECUTE los tres programas. Cuando ejecute los programas, el ordenador se
quedara esperando a que introduzca los valores de A y B para leerlos, ya que es esta la primera instrucci o n de
los 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 97


C Instruccion IF C Instruccion IF C Instruccion IF
C====================== C ========================= C ========================
READ * , A, B READ * , A, B READ * , A, B
C = A - B C = A - B C = A - B
IF(C.LE.0.0) C = -1.0 * C IF(C.LT.0.0) THEN IF(C.GT.0.0) THEN
D = SQRT(C) C = -1.0 * C D = SQRT(C)
PRINT * , A, B, C, D PRINT * , N. complejo PRINT * , A, B, C, D
STOP ENDIF ELSE
END 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
STOP
END

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
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 e l dos numeros separados por varios
espacios en blanco; guarde el fichero y ejecute las instrucciones siguientes:
./if1.exe <ifdatos.dat
./if2.exe <ifdatos.dat
./if3.exe <ifdatos.dat
Observa que cuando utilizamos el simbolo < los datos que nos piden los programas y que antes teniamos
que introducir con el teclado ahora los lee del fichero ifdatos.dat. Tambien podemos escribir el resultado en
un fichero; ejecute la instruccion:
./if3.exe <ifdatos.dat >ifsalida.sal
y edite el fichero ifsalida.sal para ver el resultado.
Tenga cuidado de no confundir los smbolos < y > pues si se equivoca puede borrar el fichero de
datos. Los datos editados en el fichero de datos tiene que estar en la misma posici o n (separados por espacios
y/o en diferentes lneas) que cuando los tecleamos en la pantalla. No tenemos que incluir comentarios en
estos ficheros salvo que el programa fortran lea dichos comentarios. En la sesi o n siguiente utilizaremos con
frecuencia 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 instrucci o n GOTO y las etiquetas.
El GOTO (Fig. 11) significa vete a ..., en este caso vete a 10 y el 10 situado delante de la instrucci o n
PRINT es una etiqueta.
Observe que las etiquetas tienen que ir siempre entre C num1.f 17 Oct 97
las columnas 1 y 5 (ver Fig. 7). Este programa en C Escribe numeros enteros del 1 al 100
C =====================================
realidad es un modo alternativo de hacer un bucle N = 1
pero sin la instruccion DO. 10 PRINT * , N
N = N + 1
IF(N .LE. 100) GOTO 10
EDITE, COMPILE Y EJECUTE el STOP
programa num1.f. END

Figura 11: Instruccion GOTO.


Dpto. Qumica Fsica Aplicada, UAM 13

2.3. Ejercicio 1: Ecuacion de segundo grado

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

Queremos resolvemos una ecuacio n de segundo grado:


a x2 + b x + c = 0
La solucion (las races) de esta ecuacion se obtienen resolviendo la ecuacio n siguiente:

b b2 4ac
x =
2a
Al resolver esta ecuacion podemos encontrarnos con algunos problemas. El primer problema se da cuando
a = 0. En este caso no podemos emplear la ecuacio n anterior pues al dividir por cero el programa nos dara un
error. Evidentemente, en este caso, la ecuacio n a resolver sera
c
bx + c = 0 ; x =
b
Para simplificar hemos supuesto que a y b no valen ambos cero a la vez. El segundo problema es el c a lculo
de la raz. Si su argumento (b2 - 4ac) es negativo la raz no tiene solucion (dentro de los numeros reales) y el
programa nos dara 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 en
el 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 ecuacio n de segundo grado. Ayudese en el diagrama de flujo y
las instrucciones dadas anteriormente. Utilice el programa para calcular las races de las siguientes
ecuaciones particulares.
OPCIONAL: Incluir en el programa el caso en el que la soluci o n 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
2
1,0x + 2,0x + 1,5 = 0 ; Sol : 1 + 0,707i y 1 0,707i
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 el
correspondiente por defecto).

a) M = 9 b) DO K = 1, 4
J = 1 J = 0
2 CONTINUE DO N = 1, 5
J = J + 1 J = J + N
M = M / J ENDDO
IF (M.GT.0) GOTO 2 ENDDO
PRINT * , J PRINT * , J

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

[P] La media geometrica de N numeros positivos es la n-esima raz 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 pregunte
por los numeros positivos y calcule su media geometrica. El programa debe leer nu meros hasta que el
usuario introduzca un numero negativo.

[P] El examen del espectro del a tomo hidrogeno muestra la existencia de series de lineas espectrales, las
frecuencias de las dos primeras series se calculan con las ecuaciones,
  2 
2
Serie de Lyman : f = c R 11 n1 ; n = 2, 3, 4, ... (ultravioleta)
 
1 2 1 2
 
Serie de Balmer : f = c R 2 n ; n = 3, 4, 5, ... (visible)

donde c es la velocidad de la luz (3.0108 m/s) y R es la constante de Rydberg (1.0967758107 m1 ).


Escribe un programa FORTRAN para generar las primeras frecuencias de estas dos series.
[P] Escriba un programa FORTRAN para calcular el
maximo comun divisor (MCD) de dos numeros
enteros (M y N) utilizando el algoritmo y dia-
grama de flujo de la figura y de acuerdo con las
siguientes 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 el
MCD.

c) Si el resto (R) no es cero damos a M el valor


de N y a N el valor de R y repetimos las
etapas b) y c).
Dpto. Qumica Fsica Aplicada, UAM 15

TERCERA
3. SESION

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 de
datos en forma de vector o matriz en FORTRAN se definen variables dimensionadas. En el programa dim1.f
lo primero que hacemos es definir o asignar (instruccio n DIMENSION) dos variables X y Y que tienen un
maximo de 10 elemento cada una.
C dim1.f 17 Oct 97
C Autor: .....ps}}
Antes de usar este tipo de variable dimensionada, es ne- C Suma los valores de X y de Y
cesario definirlas al comienzo del programa para reser- C =============================
DIMENSION X(10), Y(10)
var espacio en la memoria del ordenador. El programa READ * , N
lee los valores de X y de Y y los guarda en los vectores
X(I) e Y(I) (instruccion READ). Despues suma todos DO I=1,N
READ * , X(I), Y(I)
los X y todos los Y. Le falta escribir los resultados. ENDDO

EDITE, COMPILE Y EJECUTE el progra- SX = 0.0


SY = 0.0

ma dim1.f. ANADA las instrucciones nece- DO I=1,N
sarias para obtener la salida de resultados. SX = SX + X(I)
SY = SY + Y(I)
Estudie con detenimiento el programa, si ENDDO
no entiende algo pregunte a su profesor.
STOP
END

3.2. Ejercicio 2: Ajuste de una recta por mnimos cuadrados

Para ajustar una serie de puntos X e Y a una


recta (y=a+bx) por mnimos cuadrados utilizare-
mos las ecuaciones siguientes. Primero definimos
SX , SY , SXX y SXY como:
n
X n
X
SX = xi ; SY = yi
i=1 i=1
n
X n
X
SXX = x2i ; SXY = x i yi
i=1 i=1

Con estas definiciones, el corte en ordenadas


(a) y la pendiente (b) de la recta (y = a + bx) Figura 13: Tabla de datos X e Y, representacio n grafica y recta
vienen dados por: ajusta por mnimos cuadrados.

SY b S X SX SY n SXY
a = ; b =
n SX SX n SXX
La desviacion cuadratica media del ajuste se define como:
sP sP
n )2 n 2
(y
i=1 i y i i=1 (yi (a + bxi ))
= =
n 2 n 2
r n
SD2 X
= ; con SD2 = (yi (a + bxi ))2
n 2
i=1
16 Introduccion a la Programacion

Figura 14: Un ajuste de mnimos cuadrados se basa en minimizar la suma del cuadrado de la diferencias entre los puntos
que usamos en el ajuste (yi ) y los puntos de la recta ajustada (yi ).

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


r
SXX
r
n
a = ; b =
n SXX SX SX n SXX SX SX

El coeficiente de correlacion se puede calcular con la expresio n siguiente:


n
SX SY n SXY X
r =  1/2 ; SY Y = yi2
2
(SX n SXX )(SY2 n SY Y ) i=1

[P] Utilizando las ecuaciones anteriores haga un programa que lea N puntos X e Y y ajuste una
recta por mnimos cuadrados.
En la Fig. 13 se dan los resultados para este ejemplo. Las incertidumbres de la pendiente y del
corte en ordenadas correspondientes a la u ltima cifra significativa se dan entre parentesis.

De modo similar se pueden definir matrices, por ejemplo con la instrucci o n


DIMENSION 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 lmite de esta introduccion. Para su estudio le
remitimos 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 de
modo que utilice los datos del fichero.

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

[P] Escribe un programa que intercambie las filas 5 y 8 en una matriz de 10x10 leda de un fichero. Escribe
la matriz resultante. Haz lo mismo pero intercambiando las columnas 3 y 7.
Dpto. Qumica Fsica Aplicada, UAM 17


4. CUARTA SESION

4.1. Subprogramas

La realizacion de programas complejos se suele ha-


cer dividiendo el programa en trozos cada uno de los
cuales realiza una tarea definida. Estos trozos es lo que
llamaremos subprogramas. A veces hay un conjunto de
instrucciones que se repiten en un mismo programa. Si
programamos estas instrucciones en un subprograma, el
programa principal u nicamente tiene que llamar a di-
cho subprograma sin repetir las instrucciones. En reali-
dad, las funciones intrnsecas que hemos visto anterior-
mente son subprogramas realizados por el fabricante del
compilador.
La programacion con subprogramas facilita el tra-
bajo del programador dando lugar a una programaci o n
mas estructurada. En FORTRAN hay tres tipos princi- Figura 15: Subprogramas y funciones.
pales de subprogramas:
1. Subrutina (SUBROUTINE). Cuando la tarea a realizar modifica varias variables aunque tambi e n se puede
usar cuando modifica una sola variable o ninguna.

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

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

Estos subprogramas realizan tareas in-


dependientes y pueden compartir valores
(argumentos) con el programa que les lla-
ma.
Como puedes ver en los ejemplos que
mostramos a continuacion, el subprograma
va despues del programa principal, aunque
puede ir antes e incluso en un fichero apar-
te pero nunca puede ir intercalado entre
las instrucciones del programa principal (MAIN
en ingles).
En el caso de la subrutina, se las llama
con la instruccion CALL seguida del nom-
bre de la subrutina y en entre parentesis se Figura 16: Estructura de un subprograma y de un programa.
escriben 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 intrnsecas (observa las di-
ferencias entre suma1.f y suma2.f). Cuando se efectu a la llamada a un subprograma, el programa principal
cede el control al subprograma, este realizar su tarea y al final devuelve el control al programa principal en la
instruccion siguiente al CALL. Las variables modificadas en los subprogramas y que estan compartidas con
el programa principal quedan tambien modificadas en el programa principal. Hasta ahora hemos hablado de
18 Introduccion a la Programacion

C suma1.f 17 Oct 97 C suma2.f 17 Oct 97 C media1.f 17 Oct 97


C Subrutina suma 2 numeros C Funcion suma 2 numeros C Calcula la media de los
C========================= C======================== C datos de un vector
C 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 * , N
CALL SUMA(A,C,D) D = SUMA(A,C) DO I=1,N
PRINT * , A,C,D PRINT * , A,C,D READ * , V(I)
STOP STOP ENDDO
END END C Llamo a la subrutina MEDIA
C ======================== C======================== CALL MEDIA (V,N,RMEDIA)
C Subrutina SUMA: C FUNCION SUMA: PRINT * , RMEDIA
C R3 = R1 + R2 C SUMA = R1 + R2 STOP
C ======================== 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 vector
END END C M es el numero de
C elementos del vector
C RM es la media de los
C elementos
C ==========================
SUBROUTINE MEDIA(Z,M,RM)
DIMENSION Z(100)
SUM = 0.0
DO I=1,M
SUM = SUM + Z(I)
ENDDO
RM = SUM / M
RETURN
END

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 entre
parentesis los argumentos (ver Fig. 16). Los argumentos tienen que ser los mismos en la llamada del programa
principal 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 a
la 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 subprograma
que llamo a la subrutina).

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

Hay otra forma de compartir argumentos entre el programa principal y los subprogramas y viceversa, es la
instruccion COMMON. La declaracion COMMON situa las variables en una posicion de memoria especial a
la que tienen acceso las subrutina que contengan el mismo COMMON. Cada COMMON suele llevar asociado
un 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 posici o n de memoria
a la que pueden acceder las subrutina que contengan el COMMON/NOTAS/ ...
Un ejemplo de black COMMON sera:
COMMON ARRAY(225,2), VEC(7), RR
Dpto. Qumica Fsica Aplicada, UAM 19

4.2. Ejercicio 3: Integracion numerica

El valor de una integral definida


Z b
f (x)dx
a

viene dado por el a rea limitado por la curva y=f(x)


y el eje de abcisas (x) entre x=a y x=b (Fig. 17).
Una estimacion del a rea se puede realizar di-
vidiendo la superficie total en pequen as porciones
y sumado el a rea de cada porcion (Fig. 18). En el
metodo trapezoidal, la superficie de cada porcio n
se aproxima a un trapecio y por lo tanto su a rea Figura 17: Representacion grafica de la integral de una funcion.
viene dado por la ecuacion

h
Ai = [f (xi ) + f (xi1 )]
2
Sumando el a rea de todas las porciones o trapecios,
en este caso para un ejemplo con N (no de trape-
cios) igual a 6, tenemos:
h h
IT = 2 [f (a) + f (x1 )] + 2 [f (x1 ) + f (x2 )]
h h
+ 2 [f (x2 ) + f (x3 )] + 2 [f (x3 ) + f (x4 )]
h h
+ 2 [f (x4 ) + f (x5 )] + 2 [f (x5 ) + f (b)]

obtenemos la ecuacion que nos da la integral aproxi-


Figura 18: Integral o a rea como suma del a rea de los trapecios mada:

n1
" #
b
h
Z
(1)
X
IT = f (x) dx = f (a) + 2,0 f (xi ) + f (b)
a 2
i=1

[P] Escriba un programa FORTRAN para integrar numericamente por el metodo de los trapecios. Aplicar
el programa para calcular la integral siguiente:
Z 2
IT = (6x5 7) dx
0

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 funcio n (ver punto 6).

4. Calcular la parte correspondiente al sumatorio. SU M = i=1 f (xi ) con xi = a + ih.


Pn1

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

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


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 m e todo iterativo
de Newton, el cual se define por
f (xn )
xn+1 = xn 0 (2)
f (xn )
Donde f(xn ) es la derivada de la funcion en xn . Escribe un programa que resuelva la iteracio n arriba indi-
cada. f y f debes programarlas como funciones (FUNCTION) separadas. Aplica el programa a resolver
una 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 a ngulo (en grados) utilizando la aproximacio n
iterativa siguiente:
X3 X5 X7
SEN O(X) = X + + ...
3! 5! 7!
donde X en la ecuacion anterior esta en radianes. Calcula el seno de 140o con 5, 10 y 15 terminos de
la serie anterior. (Por supuesto no se puede utilizar las funci o n intrnseca SIN del FORTRAN, aunque si
quieres 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 formula
es: N ! = 2N N N exp(N ) . Escribe un programa que use la formula de Stirling para calcular el
factorial desde N igual a 1 hasta 20. Comprueba la precisi o n del resultado comparando con el factorial
calculado al modo tradicional.

[C] Escribir un programa para calcular la raz cuadrada de un numero x utilizando la siguiente formula:
1 x 
b= +a
2 a
donde b es una aproximacion mejor que a a la raz cuadrada de x. La primera aproximacio n se debe
tomar como (1/2)x y el procedimiento se debe repetir hasta que la diferencia entre a y b sea menor de
106 .

También podría gustarte