PROGRAMACIÓN EN FORTRAN
0.1 ¿Q U É ES F O R T R A N ? ................................................................... 11
0.2 CAMBIOS EN LOS DIFERENTES ESTÁNDARES F O R T R A N .................... 12
0.3 ¿P O R QUÉ F O R T R A N ? ................................................................. 12
0.4 E L E ME N T O S DEL LENGUAJE ........................................................ 13
5
Tabla de contenidos
1.17 F U N C I O N E S I N T RÍ N S E C A S F O R T R A N ............................................. 27
6
Tabla de contenidos
4 ARRAYS ............................................................................... 75
4.1 I N T R O D U CC I Ó N ......................................................................... 75
4.2 DECLARACIÓN D E A R R A Y S .......................................................... 75
4.3 R E F E RE N CI A A L O S E L E M E N T O S D E U N A RR A Y ............................... 76
4.4 I N I CI A L I Z A C I Ó N DE ARRAYS ....................................................... 77
4.4.1 I N I CI A L I Z A C I Ó N DE ARRAYS EN SENTENCIAS DE
D E C L A R A C I Ó N D E T I P O .............................................................. 77
7
Tabla de contenidos
7.4.7 D E S C R I P T O R E S X, T D E P O S I C I Ó N H O R I Z O N T A L Y / D E
P O S I CI Ó N V E R T I C A L ................................................................ 163
8
Tabla de contenidos
9
ÍNDICE DE TABLAS
Tabla 1.1: Ejemplo de uso de STOP .................................................. 17
Tabla 1.2: Tipos de datos intrínsecos en Fortran ................................ 19
Tabla 1.3: Operadores aritméticos Fortran ......................................... 24
Tabla 1.4: Reglas de precedencia de operadores aritméticos ................ 25
Tabla 1.5: Ejemplo de reglas de precedencia de operadores aritméticos 25
Tabla 1.6: Orden de precedencia de los tipos Fortran .......................... 26
Tabla 1.7: Aritmética con tipos mezclados ......................................... 26
Tabla 2.1: Operadores lógicos relacionales Fortran ............................ 35
Tabla 2.2: Ejemplos de expresiones lógicas relacionales ..................... 36
Tabla 2.3: Operadores lógicos combinacionales Fortran 90/95 ............. 37
Tabla 2.4: Tabla de verdad de los operadores lógicos combinacionales. 37
Tabla 2.5: Orden de precedencia de operadores lógicos
combinacionales Fortran ............................................................ 37
Tabla 2.6: Orden de precedencia de operadores Fortran ...................... 38
Tabla 7.1: Símbolos usados en los descriptores de formatos ............... 157
Tabla 7.2: Formatos de escritura de enteros ...................................... 158
Tabla 7.3: Formatos de lectura de enteros ......................................... 158
Tabla 7.4: Formatos de escritura de reales ........................................ 159
Tabla 7.5: Formatos de lectura de reales ........................................... 159
Tabla 7.6: Formatos de escritura de reales en formato exponencial ..... 160
Tabla 7.7: Formatos de lectura de reales en formato exponencial ........ 160
Tabla 7.8: Formatos de escritura de reales en formato científico ......... 161
Tabla 7.9: Formatos de lectura de reales en formato científico ........... 161
Tabla 7.10: Formatos de escritura de datos lógicos ............................ 162
Tabla 7.11: Formatos de lectura de datos lógicos .............................. 162
Tabla 7.12: Formatos de escritura de caracteres ................................ 163
Tabla 7.13: Formatos de lectura de caracteres ................................... 163
10
0 INTRODUCCIÓN
1
AN SI (A me r ican Na tion a l S tand ard s In s titu te).
2
I SO ( In ternational Stand ards Organization) .
11
Introducción
12
Introducción
13
1 TIPOS DE DATOS Y LOS PRIMEROS PASOS:
LEER, CALCULAR, ESCRIBIR
3
Un a un id ad d e progr ama es un trozo de cód igo For tr an co mp ilado
s ep ar ada me n te. Se e s tud iarán en e l c ap ítu lo 5.
15
Tipos de datos y los primeros pasos: leer, calcular, escribir
1.3 PROGRAM
• La sentencia PROGRAM define el nombre del programa Fortran que
comienza la ejecución.
• Sintaxis:
[PROGRAM nombre_programa]
• Nombre_programa es el nombre del programa (y su punto de
entrada).
• El nombre en una sentencia PROGRAM se usa única y
exclusivamente con propósitos de documentación del programa.
• Si se utiliza la sentencia PROGRAM, deberá ser la primera sentencia
no comentada del programa fuente.
1.4 STOP
• La sentencia STOP detiene la ejecución de un programa, y
opcionalmente, imprime un mensaje en la salida estándar de
errores.
STOP [n]
• n es una constante carácter o un entero de hasta 5 dígitos.
• STOP termina la ejecución de un programa Fortran, antes de que
éste llegue al final de dicho programa. STOP también manda un
mensaje a la salida estándar de errores si se ha especificado algo
después de él (dígitos o cadena de caracteres).
• Un programa Fortran puede tener varias sentencias STOP (es decir,
varios puntos de parada), por ello aunque el uso de n no es
obligatorio, es conveniente, ya que nos dará una idea clara del
punto en que ha parado el programa.
• Cuando la sentencia STOP precede inmediatamente a la sentencia
END PROGRAM es opcional. El compilador genera automáticamente
un comando STOP cuando alcanza la sentencia END PROGRAM.
• Entendiendo que un buen programa Fortran debe tener un único
punto de entrada y otro de salida, sin ningún otro punto de parada
intermedio, el uso de esta sentencia está desaconsejado.
16
Tipos de datos y los primeros pasos: leer, calcular, escribir
CÓDIGO DESCRIPCIÓN
T a b la 1 .1 : E j emp lo d e uso d e S TO P
O bien:
!Programa sin nombre
........
........
END PROGRAM
17
Tipos de datos y los primeros pasos: leer, calcular, escribir
-2 3 2 - 1 =-
2147483648
ENTERO INTEGER 4
232-1-
1=2147483647
4
D ep ende del co mpu tador.
18
Tipos de datos y los primeros pasos: leer, calcular, escribir
-3.402823 10 + 3 9
-1.175495 10 - 3 9
REAL REAL 4 Y
1.175495 10 - 3 9
3.402823 10 + 3 9
IGUAL QUE
COMPLEJO COMPLEX 8
REAL
.TRUE. O
LÓGICO LOGICAL 4
.FALSE.
CHARACTER
CONJUNTO DE
[{(len=nº caract de
CARÁCTER len CARACTERES
variab)|
ASCII DE 8-BITS
(nº caract de variab)}]
19
Tipos de datos y los primeros pasos: leer, calcular, escribir
20
Tipos de datos y los primeros pasos: leer, calcular, escribir
1.10 Identificadores
• Un identificador es un nombre que se usa para denotar programas,
algunas constantes, variables y otras entidades.
• Los identificadores deben empezar con una letra y pueden tener
hasta 31 letras, dígitos o caracteres de subrayado _.
• Por ejemplo, identificadores válidos son:
• Masa, MASA, Velocidad_de_la_luz, Sueldo_del_ultimo_mes,
X007.
• Y no válidos:
• R2-D2, 34JUlio, pepe$.
1.11 Variables
• Una variable es una entidad que tiene un nombre y un tipo. Un
nombre de variable es un nombre simbólico de un dato. Por tanto,
ese dato podrá ser identificado, definido y referenciado a través de
dicha variable.
21
Tipos de datos y los primeros pasos: leer, calcular, escribir
22
Tipos de datos y los primeros pasos: leer, calcular, escribir
23
Tipos de datos y los primeros pasos: leer, calcular, escribir
OPERADOR DESCRIPCIÓN
OPERADORES BINARIOS
+ SUMA
- RESTA
* MULTIPLICACIÓN
/ DIVISIÓN
** POTENCIA
OPERADORES UNARIOS
+ SIGNO POSITIVO
- SIGNO NEGATIVO
OPERADOR(ES) PRECEDENCIA
( ) MAYOR
**
24
Tipos de datos y los primeros pasos: leer, calcular, escribir
+ , - (UNARIOS: SIGNOS)
* , /
+ , - MENOR
T a b la 1 . 4 : R eg la s d e p r e c ed en cia d e o p e ra d o r e s a r itm ét i c o s
• Si una expresión contiene dos o más operadores de la misma
precedencia se siguen las siguientes reglas:
• Cuando existen paréntesis anidados se evalúan desde el más
interno hasta el más externo. Es conveniente usar tantos
paréntesis como sean necesarios en una expresión para
hacerla más clara y fácil de comprender.
• Las operaciones de potencia se evalúan de derecha a
izquierda.
• Multiplicación/división y suma/resta se evalúan de izquierda
a derecha.
OP1=F-6.25 A*B+C+D**(E*(OP1+G))**SIN(H)
OP2=(OP1+G) A*B+C+D**(E*OP2)**SIN(H)
OP3=(E*OP2) A*B+C+D**OP3**SIN(H)
OP4=OP3**SIN(H) A*B+C+D**OP4
OP5=D**OP4 A*B+C+OP5
OP6=A*B OP6+C+OP5
OP7=OP6+C OP7+OP5
T a b la 1 . 5 : E j emp lo d e r eg la s d e pr e c ed en c ia d e o p e ra d o r e s a r itm ét i c o s
25
Tipos de datos y los primeros pasos: leer, calcular, escribir
TIPO PRECEDENCIA
COMPLEX MAYOR
REAL
INTEGER
LOGICAL MENOR
T a b la 1 . 6 : O rd en d e p r e c ed en c ia d e lo s t i p o s For t ra n
26
Tipos de datos y los primeros pasos: leer, calcular, escribir
27
Tipos de datos y los primeros pasos: leer, calcular, escribir
28
EJERCICIOS RESUELTOS
Objetivos:
29
Tipos de datos y los primeros pasos: leer, calcular, escribir
PROGRA M c ap 1_1
PROGRA M c ap 1_2
I N T E G ER : : a
R EA L : : b1, b 2 ,s ue ld o_ de l _u lt i mo _ mes
L OG IC A L : : d1 ,d 2
C O M PL E X : : e
CHARAC TER (LEN= 18) :: pal
CHARAC TER (LEN= 180) :: f rase_larga
a= - 12 3
b 1= - 2 . 98
b 2= 0 .9 E- 8
s ue l do_ del _ u lt i mo _me s= 28 50 .7 5
d 1= .t r ue .
d 2= .f a l se .
e= (2.3 ,3.7)
pal='CON STA NTE CARAC TER '
f rase_larga= '"C ONSTA NTE CARAC TER di vidida en dos lineas usando &
& e l ca racte r & a l f i na l de la pri m e ra y a l p r in c ip i o d e la s i gu ie nte "'
WR ITE ( * ,*) 'C ON STANTE EN TERA' ,a
W R IT E ( * ,*) ' C O N STA N T E S R EA L E S ( N OTAC NOR MAL Y EXPON) ' ,b1,b2
WR ITE ( * ,*) ' ID EN T IFICADOR D E VAR IABLE R EAL ( MA X. 31 letras)' ,&
s ue ld o_d e l_ u lt i mo_ m es ,' EU R O S'
30
Tipos de datos y los primeros pasos: leer, calcular, escribir
PROGRA M c ap 1_3
IM PL IC IT NON E
I N T E G ER : : l , m ,r e s u l
PR INT*,' TECLEA 2 NU MER OS ENTER OS SEPARADOS CON IN TRO'
R EA D * , l , m
r es u l= l* * m
PR INT * ,' EL R ESU LTADO ES:'
PR INT * ,r es u l
STOP
E ND PROGRA M ca p1_ 3
31
Tipos de datos y los primeros pasos: leer, calcular, escribir
z
3x 2 + 2 y −
4. Calcular el valor de la expresión 4 para tres números
reales x, y, z leídos por teclado y escribir el resultado por pantalla.
PROGRA M c ap 1_4
R EAL : : x ,y,z , r e su l
WR IT E( * ,* ) 'DA M E 3 NU MER O S R EAL E S'
R EAD ( * ,*) x , y,z
r es u l=3 *x** 2+ 2 * y- z / 4
W R IT E( * ,* ) ' E L R E SUL TA D O E S: ' , re su l
E ND PROGRA M ca p1_ 4
PROGRA M c ap 1_5
IM PL IC IT NON E
R EA L : : a ,b , c ,x1 , x2
WR IT E( * ,* ) 'DA M E A B Y C'
R EA D ( * ,*) a , b ,c
x 1=(- b+SQRT (b ** 2-4 *a *c) ) /(2 *a)
x2=(- b-SQRT(b**2-4*a*c) ) /(2*a)
W R IT E( * ,* ) ' E L R E SUL TA D O E S: ' , x1 ,x 2
E ND PROGRA M ca p1_ 5
32
Tipos de datos y los primeros pasos: leer, calcular, escribir
sen 2 ( x) + cos 2 ( x)
6. Codifica la expresión para un ángulo x en radianes
π
leído por teclado. Escribe el resultado por monitor.
PROGRA M c ap 1_6
IM PL IC IT NON E
R EA L : : x ,p ep e
R EAL, PARA METER :: pi=3.14159
WR ITE( *,*) 'DA M E EL VALOR DEL AN GULO EN RAD IAN ES'
R EAD( *,*) x
p ep e=( SIN( x)* *2+COS(x )* *2) /pi
WR ITE( *,*) ' EL RESULTADO ES' ,pepe
E ND PROGRA M ca p1_ 6
33
Tipos de datos y los primeros pasos: leer, calcular, escribir
EJERCICIOS PROPUESTOS
34
2 ESTRUCTURAS DE CONTROL
CONDICIONALES
.EQ. == IGUAL
.NE. /= DISTINTO
35
Estructuras de control condicionales
OPERACIÓN RESULTADO
3<=i .TRUE.
j**2-1>=0 .TRUE.
i==j .FALSE.
i/=10 .TRUE.
‘ANA’<’PEPE’ .TRUE.
36
Estructuras de control condicionales
Tab la 2 .3: O pe rado r es lóg icos com b ina c ionale s Fo rtra n 90 /95
Sean operando1 y operando2 A y B, respectivamente, la tabla de
verdad de los operadores lógicos combinacionales es:
Tabla 2 .4: Tabla de verdad de los o pe rado r es lóg icos com b ina c ionale s
OPERADOR(ES) PRECEDENCIA
( ) MAYOR
.NOT.
.AND.
.OR.
37
Estructuras de control condicionales
OPERACIÓN PRIORIDAD
OPERADORES ARITMÉTICOS
** 1
*, / 2
+ , - 3
.NOT. 5
.AND. 6
.OR. 7
.EQV.,.NEQV. 8
38
Estructuras de control condicionales
2.6 Bloque IF
• Permite que un bloque de sentencias (puede ser sólo una) sea
ejecutado si y sólo si el valor de una expresión lógica es cierta. Si
la expresión lógica es falsa se salta ese bloque de sentencias y se
ejecuta la primera sentencia ejecutable por debajo de END IF.
IF (expresión lógica) THEN
bloque de sentencias
END IF
• ENDIF marca la terminación de la sentencia bloque IF.
• El bloque de sentencias suele dentarse por dos o más espacios para
facilitar la lectura del bloque IF, aunque no es obligatorio hacerlo.
• La estructura del bloque IF puede ser más complicada. A veces, se
quiere ejecutar un bloque de sentencias si una expresión lógica es
cierta y diferentes bloques de sentencias si otras condiciones son
ciertas. Por ejemplo:
IF (expresión lógica 1) THEN
bloque de sentencias 1
ELSE IF (expresión lógica 2) THEN
bloque de sentencias 2]
ELSE
bloque de sentencias 3
END IF
• Si la expresión lógica 1 es cierta se ejecuta el bloque de sentencias
1 y se salta el resto de bloques hasta la primera sentencia
ejecutable por debajo de END IF.
• Si la expresión lógica 1 es falsa se salta el bloque de sentencias 1,
se evalúa la expresión lógica 2 y si es cierta se ejecuta el bloque de
sentencias 2 y se salta hasta la primera sentencia ejecutable por
debajo de END IF.
• Si ambas expresiones lógicas son falsas, el programa ejecuta el
bloque de sentencias 3.
• En general, un bloque IF puede contener opcionalmente cualquier
número de subbloques ELSE IF (0, 1, 2, 3,…), pero sólo puede
contener un subbloque ELSE.
• La sintaxis general de un bloque IF es:
IF (expresión lógica 1) THEN
bloque de sentencias 1
[ELSE IF (expresión lógica 2) THEN
bloque de sentencias 2]
39
Estructuras de control condicionales
…
[ELSE
bloque de sentencias n]
END IF
• La expresión lógica de una cláusula es evaluada sólo si las
expresiones lógicas de todas las cláusulas precedentes han sido
falsas. Cuando la prueba de una expresión lógica es cierta se
ejecuta el bloque de sentencias correspondiente y se salta a la
primera sentencia ejecutable por debajo de END IF.
• Cuando el bloque IF no incluye la cláusula ELSE, puede ocurrir que
ninguna de las expresiones lógicas sean ciertas y que, por lo tanto,
no se ejecute ninguno de los bloques de sentencias dados.
40
Estructuras de control condicionales
IF (x<0) THEN
y=SQRT(ABS(x))
z=x+1-y
ELSE
y=SQRT(x)
z=x+1-y
END IF
2.9 IF lógico
• La sentencia IF lógica es el caso particular más simple del bloque
IF. La sentencia IF lógica evalúa una expresión lógica y ejecuta
una sentencia si dicha expresión es cierta.
IF (expresión lógica) sentencia
• sentencia es cualquier sentencia ejecutable excepto DO, END,
bloque IF u otra sentencia IF lógica.
• Si el valor de la expresión lógica es .TRUE., se ejecuta la
sentencia. Si es .FALSE. se salta esa sentencia y se pasa el control
a la sentencia siguiente.
• Ej:
res=0
IF (a==b) res=a+b
res=res+10
41
Estructuras de control condicionales
42
Estructuras de control condicionales
INTEGER :: valor
parimpar: SELECT CASE (valor)
CASE (1, 3, 5, 7, 9)
WRITE (*,*) ‘el valor es impar’
CASE (2, 4, 6, 8, 10)
WRITE (*,*) ‘el valor es par’
CASE (11:)
WRITE (*,*) ‘el valor es demasiado grande’
CASE DEFAULT
WRITE (*,*) ‘el valor es negativo o cero’
END SELECT parimpar
• Visualizar un mensaje de acuerdo con el valor de la temperatura
dada.
INTEGER :: temp
friocalor: SELECT CASE (temp)
CASE (:-1)
WRITE (*,*) ‘por debajo de 0 Celsius’
CASE (0)
WRITE (*,*) ‘Está helando’
CASE (1:10)
WRITE (*,*) ‘Hace frío’
CASE (11:20)
WRITE (*,*) ‘templado’
CASE (21:)
WRITE (*,*) ‘Hace calor’
END SELECT friocalor
43
EJERCICIOS RESUELTOS
Objetivos:
45
Estructuras de control condicionales
C F
N>0
VISUALIZAR
VISUALIZAR ‘Nº NEGATIVO O CERO’
‘Nº POSITIVO’
PROGRA M c ap 2_1
R EAL : : nu m
W R IT E( * ,* ) ' D A M E U N N U MER O'
R EAD ( * ,*) n u m
IF (num > 0) THEN
W R IT E( * ,* ) ' E S P O S IT I V O '
ELSE
WR ITE( *,*)' ES NEGATIVO O CERO'
E N D IF
E ND PROGRA M ca p2_ 1
46
Estructuras de control condicionales
C F
N>0
VISUALIZAR C F
‘Nº POSITIVO’ N<0
VISUALIZA VISUALIZA
‘Nº NEG’ ‘ES EL 0’
PROGRA M c ap 2_2
R EAL : : nu m
WR ITE ( * ,*) 'DA M E UN NU MERO'
R EAD ( * ,*) n u m
IF (num > 0) THEN
W R IT E ( * , * ) ' E S P O S I T I VO '
ELSE IF (num < 0) THEN
W R IT E ( * , * ) ' E S N EG A T I VO'
ELSE
W R IT E ( * , * ) ' E S EL 0 '
E N D IF
E ND PROGRA M ca p2_ 2
47
Estructuras de control condicionales
PROGRA M c ap 2_3
IM PL IC IT NON E
R EA L : : a ,b , c ,d , r1 , r2,p r ,p i
WR IT E ( * ,*) 'DA M E A , B , C , CON A D I ST INT O D E CERO '
R EA D ( * ,*) a , b ,c
d= b* *2- 4* a* c
d isc r iminan te: IF (d == 0) TH EN
r1=-b/(2*a)
r2=r1
W R IT E ( * , * ) ' SO L U C . R EA L E S D O B L ES, R 1 = R 2 = ' , r 1 , r 2
ELSE IF (d > 0) THEN
r 1=(- b+SQR T(d )) /(2* a)
r 2=(- b- SQR T(d )) /(2* a)
W R IT E ( * , * ) ' L A S R A I C E S D E L P O L IN O M IO SON : '
WR IT E ( *,* )'R1= ' ,r1 ,' R 2=' ,r 2
ELSE
p r= - b /( 2 *a )
p i= SQ RT(AB S( d)) /(2* a)
W R IT E ( * , * ) ' SO L U C IO N E S C O M P L EJ A S'
WR ITE ( *,*)' PARTE R EAL:' ,pr
WR ITE ( *,*)' PARTE IMA G INARIA:' ,pi
END IF d isc r imina nte
E ND PROGRA M ca p2_ 3
PROGRA M c ap 2_4
IM PL IC IT NON E
R EA L : : a ,b , c ,d , r1 , r2,p r ,p i , r
48
Estructuras de control condicionales
WR ITE ( * ,*) ' IN TRODUC E A ,B ,C, CON A , B, C CUALQU IER VALOR '
R EA D ( * ,*) a , b ,c
d= b* *2- 4* a* c
e c2: IF (a /= 0) TH EN
discriminante: IF (d == 0) THEN
r1=-b/(2*a)
r2=r1
W R IT E ( * , * ) ' S O L U C . R EALES DOB LES, R1=R 2=' ,r1,r2
E L S E IF( d > 0 ) T H EN d i s c r im in a n t e
r1=(-b+ SQR T(d) )/(2*a)
r2=(-b-SQR T(d) ) /(2*a)
WR ITE ( * ,*) 'LA S RA IC ES DEL POLINOMIO SON:'
WR IT E ( * ,*) 'R1=',r 1 ,'R2= ' ,r2
ELSE discriminante
pr=-b/(2*a)
p i= SQ R T ( A B S(d ) ) /( 2 * a )
W R IT E ( * ,*) ' S O L U C ION E S C O M PL EJ A S'
W R IT E ( * ,*) ' PA R T E R EA L : ' ,p r
W R IT E ( * ,*) ' PA R T E I M A G IN A R IA: ' , p i
E N D IF d is cr i m in ante
E L S E IF ( b / = 0 ) T H EN e c 2
r= -c/b
WR IT E (* ,*) ' SOLUC ION UN ICA , R=' ,r
E L S E IF ( c / = 0 ) T H EN e c 2
WR ITE (*,*) ' ECUAC ION IMPOSIB LE'
ELSE
WR ITE (*,*) ' ECUAC ION IND ETER M INADA'
END IF ec2
E ND PROGRA M ca p2_ 4
49
Estructuras de control condicionales
PROGRA M c ap 2_5
R EAL : : no ta
WR IT E ( * ,*) 'DA M E UNA NO TA'
R EAD ( * ,*) nota
IF (nota < 0 .OR. nota > 10) THEN
WR ITE ( *,*) 'NOTA INCORR ECTA '
E L S E IF ( n o t a < 5 ) T H EN
W R IT E ( * , * ) ' SU SP EN SO '
E L S E IF ( n o t a < 7 ) T H EN
WR ITE ( *,*) 'A PROBADO'
E L S E IF ( n o t a < 9 ) T H EN
W R IT E ( * , * ) ' N O T A B L E '
E L S E IF ( n o t a < 1 0 ) T H EN
W R IT E ( * , * ) ' SO B R ES A L I EN T EE '
ELSE
WR ITE ( *,*) 'MA TR ICU LA DE HON OR'
E N D IF
E ND PROGRA M ca p2_ 5
PROGRA M c ap 2_6
R EA L : : a ,b , c
CHARAC TER (LEN= 1) :: oper
WR IT E ( * ,*) 'DA M E 2 NU MER O S '
R EAD ( * ,*) a , b
WR IT E ( * ,*) 'DA M E UNA O PERAC ION (+ , - , * , /)'
R EAD ( * ,*) o pe r
IF (oper == '+ ') TH EN
50
Estructuras de control condicionales
c= a+b
W R IT E ( * , * ) ' C = ' , c
ELSE IF (oper == '-') THEN
c= a-b
W R IT E ( * , * ) ' C = ' , c
ELSE IF ( o p er = = ' *' ) T HEN
c= a* b
W R IT E ( * , * ) ' C = ' , c
EL SE IF ( op er == ' /' .AND . b /= 0 ) TH EN
c= a/b
W R IT E ( * , * ) ' C = ' , c
E L S E IF ( o p e r = = ' /' .A N D . b = = 0 ) T H EN
W R IT E ( * , * ) ' N O S E P U ED E D IV I D IR POR C ER O '
ELSE
WR ITE ( *,*) oper,' NO ES UNA OPERACION VA LIDA'
E N D IF
E ND PROGRA M ca p2_ 6
PROGRA M c ap 2_7
R EAL : : nu m
WR ITE ( * ,*) 'DA M E UN NU MERO'
R EAD ( * ,*) n u m
IF (num >= 0 .AND. nu m <= 10) TH EN
WR IT E ( *,* ) n um,' PERT EN ECE AL IN T ER VAL O [0-1 0]'
ELSE
W R IT E ( * , * ) n u m , ' N O P ER TENE C E A L INT ER VA L O [ 0 - 1 0 ] '
E N D IF
E ND PROGRA M ca p2_ 7
51
Estructuras de control condicionales
PROGRA M c ap 2_8
INTEGER :: num
WR IT E ( * ,*) 'DA M E UNA O PC ION'
WR ITE ( * ,*) ' 1 PARA EJECU TAR BLOQU E 1'
WR ITE ( * ,*) ' 2 PARA EJECU TAR BLOQU E 2'
WR IT E ( * ,*) ' 3 PARA SAL IR '
R EAD ( * ,*) n u m
S E L ECT C A S E ( n u m)
CASE (1)
WR ITE ( * ,*) ' SE HACE BLOQU E 1'
CASE (2)
WR ITE ( * ,*) ' SE HACE BLOQU E 2'
CASE (3)
WR IT E ( * ,*) 'AD IO S'
CA S E D EFAU LT
WR IT E ( * ,*) ' O PC ION INCORR ECTA '
E N D SEL EC T
E ND PROGRA M ca p2_ 8
52
Estructuras de control condicionales
EJERCICIOS PROPUESTOS
53
3 ESTRUCTURAS DE CONTROL REPETITIVAS.
BUCLES
55
Estructuras de control repetitivas. Bucles
56
Estructuras de control repetitivas. Bucles
INTEGER :: i
DO i=5,0,-2
sentencia
END DO
Aplicando la ecuación 3-1, se obtiene que sentencia se ejecuta 3
veces, para los valores de i: 5, 3, y 1. A continuación, el control
vuelve a la sentencia DO, i toma el valor -1, pero (-1)*(-2) > 0*(-2) y
se salta a la sentencia siguiente a END DO.
• Escribir un mensaje por monitor 10 veces:
DO i=1, 10
WRITE (*,*) ‘HOLA’
END DO
En este caso, el índice del bucle se usa únicamente para indicarnos
cuántas veces se ejecuta el cuerpo.
• Sumar los pares de 2 a 10 sin leer datos.
acum=0
DO k = 2, 10,2
acum=acum+k
END DO
WRITE (*,*) acum
En este caso, el índice del bucle interviene en el cuerpo del mismo.
57
Estructuras de control repetitivas. Bucles
58
Estructuras de control repetitivas. Bucles
IF (i>10) EXIT
acum=acum+i
i=i+2
END DO
WRITE (*,*) acum
• Leer por teclado un número entre 0 y 10, ambos límites
incluidos. El usuario puede equivocarse, en cuyo caso el
programa le dará tantas posibilidades como necesite
(indefinidas veces) hasta conseguir que el número
introducido esté en el rango dado. Entonces, el programa
muestra cuantos intentos ha usado.
INTEGER :: num,cont=0
DO
WRITE (*,*)
WRITE (*,*) "Dame un numero de 0 a 10"
READ (*,*) num
cont=cont+1
IF (num>=0.AND.num<=10) EXIT
WRITE (*,*) "Has tecleado",num
WRITE (*,*) "El numero debe estar entre 0 y 10"
WRITE (*,*) "Vuelve a intentarlo"
END DO
WRITE (*,*) "*****ENHORABUENA*****"
WRITE (*,*) "lo conseguistes en",cont,"veces"
59
Estructuras de control repetitivas. Bucles
60
Estructuras de control repetitivas. Bucles
61
Estructuras de control repetitivas. Bucles
62
Estructuras de control repetitivas. Bucles
63
Estructuras de control repetitivas. Bucles
..END DO interno
…..
ELSE
…..
END IF externo
64
EJERCICIOS RESUELTOS
Objetivos:
65
Estructuras de control repetitivas. Bucles
PROGRA M c ap 3_1
IM PL IC IT NON E
INTEG ER : : i
DO i= 1 ,100
W R IT E ( * , * ) ' H O L A A T O D O S'
END DO
E ND PROGRA M ca p3_ 1
PROGRA M c ap 3_2
IM PL IC IT NON E
I N T E G ER : : s u ma= 0, i
DO i= 1 ,100
suma=suma+ i
! W R I T E ( * , * ) ' i ,s u ma ' , i , s u ma
END DO
WR ITE( *,*) ' EL RESULTADO ES' ,suma
E ND PROGRA M ca p3_ 2
66
Estructuras de control repetitivas. Bucles
PROGRA M c ap 3_3
IM PL IC IT NON E
INTEGER : : su ma p ar= 0, i
DO i= 100 ,1 0 ,-2
s u map ar=s u map ar+ i
W R IT E( * ,* ) ' i ,s u mapa r' , i ,s u map ar
END DO
WR ITE( *,*) ' EL RESULTADO ES' ,suma par
E ND PROGRA M ca p3_ 3
PROGRA M c ap 3_4
IM PL IC IT NON E
I N T E G ER : : s i g n o , i
R EAL : : p ic
p i c=0
s ign o=1
D O i= 1 ,99,2
p i c=p i c+1 . 0 / i*s i gn o
s ign o=-s ig no
END DO
W R IT E( * ,* ) ' E L R E SUL TA D O E S' , 4* p ic
E ND PROGRA M ca p3_ 4
67
Estructuras de control repetitivas. Bucles
PROGRA M c ap 3_5
I N T E GER : : c on t = 0
R EAL : : nu m,acu m=0
CHARAC TER (LEN= 2) :: seguir
DO
WR ITE( *,*) 'DAME UN NU MERO'
R EAD (* ,* ) n um
c ont= co nt+ 1
acum=acum+ num
W R IT E( * ,* ) ' O TRO N U MER O?'
W R IT E( * ,* ) ' T ECLEA SI O NO EN M A YU SC U L A S Y ENTRE
A PO STR OF E S'
R EA D ( * ,* ) s e g u i r
I F ( s e g u ir /= ' S I') EXI T
END DO
WR IT E( * ,* ) ' LA M ED IA E S:' ,a cum/c ont
E ND PROGRA M ca p3_ 5
68
Estructuras de control repetitivas. Bucles
PROGRA M c ap 3_6
IM PL IC IT NON E
I N T E GER : : c on t
R EAL : : num,acum
CHARAC TER (LEN= 2) :: seguir,mas_medias
e xt e rn o: D O
c ont= 0
a c u m= 0
interno: DO
WR ITE(*,*) 'DA M E UN NU MERO'
R EA D ( * , * ) n u m
c ont= con t+1
acum=acum+num
WRIT E(*,*) ' OTR O NU MER O?'
WR IT E(* ,*) ' TECL EA SI O NO EN MA YUSCULA S Y EN TR E
A PO STR OF E S'
R EA D ( * , * ) s e g u i r
I F ( s e g u i r /= ' S I') E X I T i nt e rn o
END DO in t ern o
WR IT E( * ,* ) 'LA M EDIA ES:' ,a cu m/co nt
WR IT E( * ,* ) 'O TRA M ED IA ?'
W R IT E( * ,* ) ' T ECLEA SI O NO EN M A YU SC U L A S Y ENTRE
A PO STR OF E S'
R EAD (* ,* ) mas _med ias
IF (mas_me d ias /= ' SI' ) EXIT e xte rn o
END DO externo
E ND PROGRA M ca p3_ 6
69
Estructuras de control repetitivas. Bucles
hacerse antes de entrar al bucle interno WHILE, para que cada vez
que se calcule otra media se vuelvan a poner a cero sus valores.
− Si el número de elementos de la lista y el número de listas es
conocido a priori, ¿Cómo cambia el código del programa? Sustituye
los bucles WHILE por dos iterativos.
PROGRA M c ap 3_7
e xt e rn o: D O
WR IT E( * ,* ) ' "DAM E EL NU M ERO D E EL EM EN TO S DE LA L ISTA "'
R EAD (* ,* ) n
pos= 0 ! IMPORTANTE, IN IC IALIZAR PARA CADA LISTA
int e rno: DO i= 1,n
WR ITE(*,*) ' IN TRODUC E NUMER O' ,i
R EA D ( * , * ) n u m
I F ( n u m > 0 ) T H EN
pos= pos+1
E N D IF
END DO in t ern o
WR ITE( *,*) 'CANTIDAD D E POSITIVOS DE LOS' ,n,' LEID OS ES:' ,pos
WR IT E( * ,* ) 'QU I ER ES S E GU IR CON OTRA L I S TA ( S /N) ?'
R EA D ( * ,* ) s e g u i r
IF (seguir /= 'S') EXIT externo
END DO externo
E ND PROGRA M ca p3_ 7
70
Estructuras de control repetitivas. Bucles
PROGRA M c ap 3_8
IM PL IC IT NON E
L O G IC A L : : p o s i t i v
R EAL : : nu m
DO
WR ITE( *,*) 'DAME UN NU MERO POSITIVO'
R EAD (* ,* ) n um
IF (num > 0) THEN
posit i v= . T RUE .
ELSE
p o s it i v= . F A L S E .
E N D IF
I F ( .N O T . p o s it i v) E X I T
END DO
W R IT E( * ,* ) n u m ,' N O E S P O S IT IV O '
E ND PROGRA M ca p3_ 8
PROGRA M c ap 3_9
IM PL IC IT NON E
71
Estructuras de control repetitivas. Bucles
INTEGER :: num,fact,i
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD ( * ,*) n u m
IF (num< 0) TH EN
W R IT E( * ,* ) ' N O E X IS T E EL F A C T O R IAL D E U N N EG A T I VO'
ELSE IF (num== 0) THEN
WR ITE( *,*) ' EL FACTOR IAL DE C ERO ES UNO'
ELSE
fact=1
interno: DO i= num,1,-1
fact=fact*i
WRIT E( *,*) 'RESULTADO PARC IA L' ,fact
END DO in t ern o
WR IT E( * ,* ) ' EL FACT OR IAL DE' , nu m ,' ES ' ,f act
E N D IF
E ND PROGRA M ca p3_ 9
72
Estructuras de control repetitivas. Bucles
EJERCICIOS PROPUESTOS
10) Programa que pida por teclado la nota de examen, mientras sea
suspenso.
73
Estructuras de control repetitivas. Bucles
74
4 ARRAYS
4.1 Introducción
• En computación es frecuente trabajar con conjuntos ordenados de
valores: listas o vectores y tablas o matrices. Para ello, existe una
estructura de datos denominada array .
• Un array está constituido por un grupo de variables o constantes,
todas del mismo tipo. Cada variable dentro del array se denomina
elemento del array.
• Un array está definido por los siguientes parámetros:
• Rango: es su número de dimensiones. Así, un escalar posee
rango cero, un vector rango uno, una matriz rango dos, etc.
• Extensión: es el total de componentes que posee en cada una
de sus dimensiones. Por ejemplo, en una matriz de 5 filas y 3
columnas, la extensión de su dimensión primera (filas) es 5 y
la de su dimensión segunda (columnas) es 3.
• Tamaño: es el total de elementos que tiene, es decir, el
producto de sus extensiones. En el ejemplo anterior, el
tamaño de una matriz de 5 filas x 3 columnas es 15.
• Perfil: es la combinación del rango y la extensión del array
en cada dimensión. Por tanto, dos arrays tienen el mismo
perfil si tienen el mismo rango y la misma extensión en cada
una de sus dimensiones.
75
Array s
76
Array s
77
Array s
78
Array s
DO i=10,6,-1
v2(11-i)=i
END DO
externo : DO j=1,3
interno :DO i=1,2
k=k+1
mat1(i,j)=k
END DO interno
END DO externo
• También es posible inicializar todos los elementos de un array a un
valor único con una simple sentencia de asignación.
• Ejemplo:
INTEGER, DIMENSION (100) :: v1
INTEGER, DIMENSION (2,3) :: mat
v1=0
mat=0
DO i=1,TMF
DO j=1,TMC
WRITE (*,*) ‘DAME ELEMENTO’,i,j,’DE mat1’
READ (*,*) mat1(i,j)
79
Array s
DO j=1,TMC
DO i=1,TMF
WRITE (*,*) ‘DAME ELEMENTO’,i,j,’DE mat1’
READ (*,*) mat1(i,j)
!lectura por columnas
END DO
END DO
• En los ejemplos anteriores, la lectura de los arrays se realiza
elemento a elemento en el orden establecido en los bucles.
• También se puede leer un array usando bucles DO implícitos. La
sintaxis general de lectura con un bucle implícito es:
READ (*,*) (arg1[, arg2] …, índice = inicio, fin [, paso])
• arg1 y los demás argumentos, si los hay, son los argumentos que se
van a leer.
• El índice del bucle y los parámetros del mismo funcionan
exactamente igual que en el caso de los bucles DO iterativos
estudiados en la sección 3.2.
• Ejemplos:
INTEGER, DIMENSION (5) :: w
INTEGER, DIMENSION (0:3,2) :: m
…
READ (*,*) ( w(i), i=5,1,-1)
READ (*,*) ( (m(i,j), i=0,3) , j=1,2) !lectura por columnas
READ (*,*) ( (m(i,j), j=1,2) , i=0,3) !lectura por filas
• En los ejemplos anteriores, la lectura de los arrays se realiza
elemento a elemento en el orden establecido en los bucles.
• También es posible leer un array escribiendo únicamente su
nombre, sin especificar su(s) índice(s). En ese caso, el compilador
asume que se va a leer todo el array, es decir, todos sus elementos
en el orden natural Fortran.
• Ejemplo:
INTEGER, DIMENSION (10) :: v
INTEGER, DIMENSION (2,3) :: mat
READ (*,*) v
80
Array s
v3=v1+v2
v4=v1*v2
WRITE (*,*) ‘v3, dos veces exponencial de v3’, v3,
2*EXP(REAL(v3))
WRITE (*,*) ‘v4, valor absoluto de v4’, v4, ABS(v4)
Se escriben v3, dos veces exponencial de v3: 0 0 0 0 0, 2, 2, 2, 2, 2 y
en otra línea v4, valor absoluto de v4: -81, -64, -49, -36, -25, 81, 64,
49, 36, 25.
81
Array s
DO i=1,5
v3(i)=v1(i)+v2(i)
v4(i)=v1(i)*v2(i)
WRITE (*,*) v3(i), 2*EXP(REAL(v3(i)))
WRITE (*,*) v4(i), ABS(v4(i))
END DO
82
Array s
83
Array s
84
Array s
85
Array s
86
Array s
87
Array s
88
EJERCICIOS RESUELTOS
Objetivos:
89
Array s
PROGRA M c ap 4_1
IM PL IC IT NON E
INTEG ER : : i
R EAL : : me d ia=0
R EA L ,D I M E N S IO N ( 5 ) : : v
D O i= 1 ,5
WR ITE( *,*) 'DAME COMPON ENTE' ,i
R EA D ( * , * ) v( i )
END DO
D O i= 1 ,5
m e d ia= me d ia+ v( i )
END DO
m e d ia= med i a /5
WR IT E( * ,* ) ' LA M ED IA E S:' , med i a
E ND PROGRA M ca p4_ 1
PROGRA M c ap 4_2
R EAL , D I MEN S ION(10 0) :: x
DO
WR IT E( * ,* ) 'DAM E EL VA LOR D E N (1 00 CO MO MAXIM O)'
R EAD( *,*) n
IF (n<=100) EXIT
WR ITE( *,*) 'COMO MUCHO 100!'
END DO
90
Array s
PROGRA M c ap 4_3
INTEGER :: x,sw itch=0,i
I N T E GER , D IM EN S ION ( 6) : : v= ( /1 7 ,3 ,2 2 ,11 ,3 3 ,19 / )
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD( *,*) x
D O i= 1 ,6
I F ( x = = v( i)) T H EN
WR ITE(*,*) ' ENC ONTRADO EN POSIC ION' ,i
sw itch=1
E N D IF
END DO
IF (sw itch == 0) TH EN
WR ITE( *,*) 'NO ENCON TRADO'
E N D IF
E ND PROGRA M ca p4_ 3
91
Array s
PROGRA M c ap 4_4
I N T E G ER : : n u m , i ,c h iva t o = 0
INTEGER ,PARAMETER :: NC=5
I N T E GER , D IM EN S ION ( N C ) : : vec= ( / 1 ,1 ,6 , 6,7 /)
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD( *,*) num
DO i= 1,NC
I F ( ve c( i) == n u m) TH EN
WR IT E(* , *) ' PR I MERA CO INC ID ENC IA E N PO S IC ION ' , i ,'D EL V E CTOR '
c hiva t o = 1
EXIT
E N D IF
END DO
IF (chiva to == 0) THEN
W R IT E( * ,* ) ' N O E X IS T E EL N U M ER O EN E L V EC T O R '
E N D IF
E ND PROGRA M ca p4_ 4
PROGRA M c ap 4_5
I N T E GER : : x , i= 0
I N T E GER ,D IM EN S ION ( 7) : : v= ( /0 , 3 ,5 ,7 , 11 ,1 1 ,23 / )
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD( *,*) x
DO
i = i+1
IF (i== 7 .OR. v( i)>=x) EXIT
END DO
I F ( x = = v(i ) ) T H EN
92
Array s
PROGRA M c ap 4_6
I N T E GER : : x , iz q=1 , de r=7 , cen
INT EGER , D IM EN SION( 7):: v= ( /-2 ,0 ,4 ,6 ,8 ,19 ,23 /)
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD( *,*) x
c en=( iz q+ d er ) / 2
W R IT E( * ,* ) ' C EN TRO', c en
DO WH ILE (x/= v( ce n).AND .izq<der)
IF (x> v(cen)) THEN
izq= cen+1
ELSE
der= cen-1
E N D IF
c en=( iz q+ d er ) / 2
WR IT E( * ,* ) 'C ENTRO ' ,ce n
END DO
IF (x== v( ce n)) THEN
WR ITE( *,*) ' ENCONTR ADO EN POSIC ION' ,cen
ELSE
WR ITE( *,*) 'NO EXISTE EL VALOR BU SCADO'
E N D IF
93
Array s
E ND PROGRA M ca p4_ 6
PROGRA M c ap 4_7
INTEGER::aux,i,j
INTEGER , PARAMETER ::NC= 6
I NT E GER , D IM EN S ION(NC) :: ve c
ve c = ( / 8 ,5 ,1 5 ,2 ,- 19 ,0 /)
c ant i da d_p ar e jas : D O i=N C - 1 ,1,- 1
p a r e ja: D O j= 1 , i
o rd en ar_ pa re ja : IF ( ve c( j ) > ve c( j+1) ) TH EN
aux= ve c(j)
ve c ( j)= ve c ( j+ 1)
ve c ( j+1 ) = a u x
E N D IF o rd en ar _pa re j a
END DO p ar e ja
END DO ca nt id ad _pa re jas
WR ITE( *,*) ' EL VEC TOR ORDENADO ES'
! $$$ $$$ DO i= 1 ,NC
! $$$ $$$ WR IT E( * ,* ) ve c ( i)
! $$$ $$$ END DO
WR IT E( * ,* ) ( ve c( i) , i= 1,NC)
E ND PROGRA M ca p4_ 7
94
Array s
PROGRA M c ap 4_8
IM PL IC IT NON E
INTEGER::i,j
I NT E GER , D IM EN S ION( 2 ,3):: ma t
W R IT E( * ,* ) ' D A M E LAS C O MPON ENT ES DE LA MATR IZ '
R EAD( *,*) mat
f ila s: DO i=1 ,2
c o lu m nas : D O j=1 ,3
W R IT E(* , * ) ' C O M PON EN T E ' , i, j , ' : ' ,ma t ( i ,j) , LOC ( mat ( i , j) )
END DO c o lu mnas
E N D D O f i la s
E ND PROGRA M ca p4_ 8
MAT
PROGRA M c ap 4_9
95
Array s
P R OGRA M c ap 4_1 0
INTEGER::x,sw ,i,j
INTEGER , PARAMETER:: N F=3,NC=5
INTEGER , D IMEN SION(N F ,NC):: mat
WR IT E( * ,* ) ' da me la mat r iz p or c o lu mnas'
R EAD( *,*) (( mat( i,j) ,i=1,N F) ,j=1,NC)
sw =0
WR ITE( *,*) 'DA M E UN NU MER O'
R EAD( *,*) x
W R IT E( * ,* ) ' LA MA TRI Z E S'
!.............................
DO i= 1,NF
W R IT E( * ,* ) ( ma t ( i , j) , j = 1 ,N C )
END DO
!............................
!WR ITE(*,*) ma t
!..............................
! f i l a s : D O i = 1 ,N F
! c o lu mnas : DO j=1 ,NC
! W R IT E(* , * ) ma t ( i , j)
96
Array s
! END DO c o lu mnas
! END DO f ilas
!.............................
f ila s: DO i=1 ,N F
c o lu mnas : DO j=1 ,NC
c o inc i d ir : IF ( x = = m a t ( i, j ) ) T H EN
sw =1
WR ITE( *,*) 'ENCON TRADO EN FILA:' ,i,'C OLU MNA:' ,j
END IF c o in c id ir
END DO c o lu mnas
E N D D O f i la s
IF (sw ==0) WR ITE( *,*) 'N O EXISTE EL VA LOR BU SCADO'
E ND PROGRA M ca p4_ 10
P R OGRA M c ap 4_1 1
INTEGER:: j,k
INTEGER , PARAMETER:: NC= 4
R EAL : : mo du
R EA L ,D I M E N S IO N ( N C ) : : v1 = - 1 ., v2 = 2 . , v3 = - 3 . , s
DO j= 1,NC
s ( j ) = v1 ( j ) + v2 ( j)+ v3 ( j)
W R IT E( * ,* ) ' C O M PON EN T E' , j , ' D EL V EC T O R SU M A : ' , s ( j)
END DO
! $$$ $$$ s=v1 + v2 + v3
! $$$ $$$ WR IT E( * ,* ) 'VECTOR SU MA:' ,s
mo du= 0
DO k=1,NC
mo du= mo du+ s(k) **2
END DO
mo du= SQRT ( mod u)
97
Array s
P R OGRA M c ap 4_1 1
INTEGER , PARAMETER:: NC= 4
R EAL : : mo du
R EA L ,D I M E N S IO N ( N C ) : : v1 = - 1 ., v2 = 2 . , v3 = - 3 . , s
s= v1 + v2 + v3
W R IT E( * ,* ) ' V ECT OR S U MA : ' ,s
modu= SQRT(SUM( s**2))
W R IT E( * ,* ) ' E L MOD U L O D EL VEC T OR SUM A E S: ' ,mo du
E ND PROGRA M ca p4_ 11
P R OGRA M c ap 4_1 2
INTEGER:: i,j
INTEGER ,PARAMETER::N= 3 ,M=4
R EAL : : mo du
R EAL,D IMEN SION(N ,M):: a
R EA L ,D I M E N S IO N ( M ) : : s
!NU M ERO D E F I LA S D E A ES Nº DE V ECTOR E S A SU MAR
!NU M ERO D E COLUMNA S D E A ES Nº D E ELEM. DE CADA VECTOR
f ila s: DO i=1 ,N
c o lu mnas : DO j=1 ,M
WR ITE(*,*) ' IN TRODUC E LA CO M PON ENTE ', i ,j , ' D E LA M A TR IZ A '
R EA D ( * ,* ) a ( i , j)
END DO c o lu mnas
98
Array s
E N D D O f i la s
DO i= 1,M
s(i)=0
END DO
c o lu mnas: DO j= 1 ,M
f i la s : D O i = 1 ,N
s(j)=s(j)+a(i,j)
END DO filas
W R IT E( * ,* ) ' C O M PON EN T E' , j , ' D EL V EC T O R SU M A : ' , s ( j)
END DO co lu mn as
s u mcu ad=0
DO k=1,M
s u mcu ad=s u mcu ad+s ( k) **2
WR ITE( *,*) ' SUMA D E CUADRADOS D E COMP. DE S ES:' ,sumcuad
END DO
mo du= SQRT (su mcua d)
W R IT E( * ,* ) ' E L MOD U L O D EL VEC T OR SUM A E S: ' ,mo du
E ND PROGRA M ca p4_ 12
P R OGRA M c ap 4_1 2
INTEGER:: j
INTEGER ,PARAMETER::N= 3 ,M=4
R EAL : : mo du
R EAL,D IMEN SION(N ,M):: a
R EA L ,D I M E N S IO N ( M ) : : s
!NU M ERO D E F I LA S D E A ES Nº DE V ECTOR E S A SU MAR
!NU M ERO D E COLUMNA S D E A ES Nº ELEM. D E CADA VECTOR
WR IT E( * ,* ) 'DA M E LA MA TR IZ POR F ILA S'
R EA D ( * ,* ) ( ( a ( i , j) , j=1 ,M ) , i= 1 ,N)
c o lu mnas: DO i= 1 ,M
s(i)=SUM(a(1:N,i))
W RIT E( *,*) ' el em en t o ' , i ,' d e l vec t o r su m a: ' , s( i)
END DO co lu mn as
modu= SQRT(SUM( s**2))
W R IT E( * ,* ) ' E L MOD U L O D EL VEC T OR SUM A E S: ' ,mo du
E ND PROGRA M ca p4_ 12
99
Array s
P R OGRA M c ap 4_1 3
INTEGER:: i,j
INTEGER ,PARAMETER::N= 3 ,M=2
R EAL ,D IMEN SION(N ,M ):: mat 1 ,mat 2 ,s uma
!***LECTURA DE LAS MATRICES, POR FILAS
f ila s: DO i=1 ,N
c olu mnas: DO j=1,M
WRIT E(*,*) 'ELEME N T O ' , i , j ,' D E M A T 1 Y M A T 2 '
R EA D ( * ,* ) mat 1 ( i, j ) , m a t 2 ( i , j)
END DO c o lu mnas
E N D D O f i la s
! ***CALCULO D E LA MATR IZ SU MA , POR FILA S
DO i= 1,N
DO j= 1,M
s u ma( i , j) = ma t 1 ( i , j) + mat 2 ( i , j)
END DO
END DO
! $$$ $$$ suma= ma t1+mat 2 !o pe ra nd o c on la s mat r ices co mp leta s
! ***VISUALIZAC ION D E LA M A T R I Z SUM A , POR F IL A S
P R INT *
W R IT E( * ,* ) ' MA TR I Z S U MA '
P R INT *
DO i= 1,N
W R IT E( * ,* ) ( s u ma ( i ,j ) , j= 1 , M )
END DO
E ND PROGRA M ca p4_ 13
P R OGRA M c ap 4_1 3
IM PL IC IT NON E
INTEGER , PARAMETER:: N F=3,NC=2,N M=2
100
Array s
101
Array s
P R OGRA M c ap 4_1 4
INTEGER:: i,j,k
INTEGER ,PARAMETER::N= 2 ,M=3,L=2
R EAL,D IMEN SION(N ,M):: mat 1
R EA L ,D I M E N S IO N ( M , L ) : : mat 2
R EAL,D IMEN SION(N ,L)::prod
m at 1= R ESHA P E(( /1 , 1,2 , 2 ,3 ,3 /) , ( /N ,M / ) )
mat 2=R ESHA P E(( /- 1,- 2,-3 ,-4 , -5 ,- 6/) ,( /M , L /))
! ** *C A LC U L O D E LA M A TR IZ PROD U C TO * * *
DO i= 1,N
DO j= 1,L
prod(i,j)=0
DO k= 1,M
prod(i,j)= prod(i,j)+ mat1(i,k)*mat2(k,j)
END DO
END DO
END DO
! $$$ $$$ pro d= mat mul( ma t1 ,mat2 ) !fu nc ion int r ins ec a tr an sfor mac iona l
!***VISUAL. DE MATRIZ PR ODUCTO,POR FILAS
W R IT E( * ,* )
WR ITE( *,*) ' MATR IZ PRODUC TO'
W R IT E( * ,* )
DO i= 1,N
W R IT E( * ,* ) ( p r o d ( i , j) , j=1 , L )
END DO
E ND PROGRA M ca p4_ 14
102
Array s
P R OGRA M c ap 4_1 5
I NT E GER , AL LOCA TAB LE , D I MEN S ION(:) :: ve c to r
I N T E G ER : : e r r o r
R EAL :: med i a
W R IT E( * ,* ) ' D A M E N U M ER O D E E L E M EN T O S D EL VEC T O R '
R EAD( *,*) num
AL LOCA TE ( ve ct or(1 :nu m) ,STAT= er ro r)
IF (error /= 0) THEN
WR IT E( * ,* ) 'NO SU FIC IENT E ESPAC IO MEM OR IA'
STOP
E N D IF
WRIT E( *,*) 'DAME EL VECTOR'
R EAD( *,*) vect or
m e d ia= SUM ( ve cto r) /R EA L ( nu m)
WR IT E( * ,* ) ' LA M ED IA E S' , me dia
D EAL LOCAT E ( ve c to r ,STA T=er r or)
IF (error /= 0) THEN
WR ITE( *,*) ' ERROR AL LIB ERAR LA MEMOR IA'
STOP
E N D IF
E ND PROGRA M ca p4_ 15
103
Array s
104
Array s
EJERCICIOS PROPUESTOS
9) Programa que lea por teclado una matriz 3x3 y muestre su matriz
traspuesta.
m = ∑ 2 ∑ ∑2 b =
n xy − x y ∑ y ∑ x − ∑ x∑ xy
2
n∑ x − (∑ x ) n ∑ x − (∑ x )
2 2
n∑ xy − ∑ x∑ y
r=
( n ∑ x − ( ∑ x ) )( n ∑ y − ( ∑ y ) )
2 2 2 2
105
Array s
11) Programa que lea por teclado una matriz M(3x3) y muestre las
matrices M+M y MxM.
⎛ 96 64 37 45 ⎞
⎜ ⎟
⎜ 39 43 98 62 ⎟
⎜ 84 76 25 57 ⎟
⎜ ⎟
⎜ 23 59 82 78 ⎟⎠
⎝
106
5 PROCEDIMIENTOS
5
Un id ad de progr ama es un a por ción de un progr ama For tr an co mp ilada
sep ar adame n te. Son un id ades de progr ama lo s programas p rin cip a le s, las
subru tinas y lo s subprogr amas función.
107
Procedimientos
5.2 Funciones
• Hay dos tipos de funciones:
• Intrínsecas : todas aquellas funciones que suministra el
propio lenguaje (ya comentadas en el capítulo 1).
• definidas por el propio programador o subprogramas
función : procedimientos que permiten responder a
necesidades particulares del usuario, no proporcionadas por
las funciones intrínsecas.
• Las funciones definidas por el programador se usan igual que las
funciones intrínsecas, pueden formar parte de expresiones, y por lo
tanto, pueden aparecer en todos aquellos lugares donde se puede
usar una expresión. Su resultado es un valor numérico, lógico,
cadena de caracteres o array.
• La estructura general de un procedimiento función es:
Cabecera de función
Sección de especificaciones
Sección de ejecución
Terminación de la función
A continuación, se explica en detalle la estructura anterior.
• La sintaxis general de la cabecera de función es la siguiente:
[TIPO] FUNCTION nombre_funcion ([ Lista de argumentos formales ])
• Es la primera sentencia no comentada del procedimiento, e
identifica esa unidad de programa como procedimiento
función.
• TIPO es cualquier tipo Fortran válido relativo a
nombre_funcion. Si no aparece TIPO en la cabecera de la
función, se debe especificar en la sección de
especificaciones.
• nombre_funcion es cualquier identificador Fortran válido.
• Lista de argumentos formales es una lista (puede ser vacía)
de constantes, variables, arrays o expresiones, separados por
comas. Se emplean para pasar información al cuerpo de la
108
Proced imien tos
6
V ar iab l es n ec es ar i as p ar a l l ev a r a c abo los cálcu lo s pr ev is to s den tro de la
f u n c ió n . S o n in a cc es ib le s f u er a d e l a mis ma .
109
Procedimientos
110
Proced imien tos
5.3 Subrutinas
• Son procedimientos más generales que las funciones, aunque
comparten casi todas sus características. Pueden retornar más de un
valor, o no retornar nada en absoluto. Reciben los valores de
entrada y devuelven los valores de salida a través de su lista de
argumentos.
• La estructura general de una subrutina es idéntica a la de una
función:
111
Procedimientos
Cabecera de subrutina
Sección de especificaciones
Sección ejecutable
Terminación de subrutina
• donde la sintaxis general de la cabecera de subrutina es:
SUBROUTINE nombre_subrutina ([Lista de argumentos formales])
• y la sintaxis general de la terminación de subrutina es:
END SUBROUTINE [nombre_subrutina]
• La sección de especificaciones incluye la declaración de los tipos
de los argumentos formales con su atributo INTENT
correspondiente a su intención de uso y la de las variables locales a
la subrutina, si las hay.
• La sintaxis general de llamada a una subrutina desde cualquier
unidad de programa es:
CALL nombre_subrutina ([lista de argumentos actuales])
• La ejecución de la llamada ocurre de la siguiente manera:
• Se evalúan los argumentos actuales que son expresiones.
• Se asocian los argumentos actuales con sus correspondientes
argumentos formales. El paso de los argumentos se realiza
por dirección.
• Se ejecuta el cuerpo de la subrutina especificada.
• Se devuelve el control a la unidad de programa que hizo la
llamada, en concreto, a la sentencia siguiente a la sentencia
CALL.
• La subrutina NO devuelve ningún valor a través de su
nombre, sino que son los argumentos los encargados de
realizar las transferencias de resultados.
• Debe haber concordancia en el número, tipo y orden de los
argumentos actuales y sus correspondientes argumentos formales, al
igual que en las funciones.
• Ejemplo. Sea la subrutina para convertir grados, minutos y
segundos a grados decimales:
SUBROUTINE convierte (grados, minutos, segundos, grads)
INTEGER, INTENT(IN) :: grados, minutos, segundos
REAL, INTENT(OUT) :: grads
grads= REAL (grados) + REAL (minutos)/60. + REAL (segundos)
/3600
END SUBROUTINE convierte
• Llamadas válidas desde un programa principal son:
112
Proced imien tos
PROGRAM principal
INTEGER :: g,m,s
REAL:: n,gd
…
CALL convierte (30, 45, 2, n) ! llamada 1
WRITE (*,*) ’30 grados, 45 minutos, 2 segundos equivalen a‘
WRITE (*,*) n,’grados decimales’
CALL convierte (g, m, s, gd) ! llamada 2
WRITE (*,*) g,’grados’, m,’minutos’, s,’segundos equivalen a‘
WRITE (*,*) gd,’grados decimales’
…
END PROGRAM principal
113
Procedimientos
114
Proced imien tos
PROGRAM principal
USE comparte_datos
IMPLICIT NONE
INTEGER :: j
WRITE(*,*) 'v1',v1
WRITE(*,*) 'v2',v2
v1=v1+v2
WRITE(*,*) 'v1',v1
CALL sub
WRITE(*,*) 'm'
DO i=1,TM
WRITE(*,*) (m(i,j),j=1,2)
END DO
END PROGRAM principal
SUBROUTINE sub
USE comparte_datos
IMPLICIT NONE
m( : , 1 ) = v1
m( : , 2 ) = v2
END SUBROUTINE sub
115
Procedimientos
116
Proced imien tos
PROGRAM principal
USE mod1
IMPLICIT NONE
INTEGER::x,y,resul
WRITE(*,*) ‘dame dos numeros’
READ(*,*) x,y
CALL sub1(x,y,resul)
WRITE(*,*) ‘la suma es’,resul
END PROGRAM principal
• Comprobar que si se declaran los argumentos actuales del tipo
REAL, el compilador encuentra el error de concordancia de tipos.
Sin embargo, si se repite el ejercicio con la subrutina sub1 como
procedimiento externo, el compilador no encuentra errores.
117
Procedimientos
IMPLICIT NONE
REAL, EXTERNAL:: f
INTEGER, INTENT(IN):: a,b
REAL, INTENT(OUT):: res
res=f(a)+b**2
END SUBROUTINE sub
118
Proced imien tos
119
Procedimientos
120
Proced imien tos
121
Procedimientos
122
EJERCICIOS RESUELTOS
Objetivos:
123
Procedimientos
PROGRA M c ap 5_1
IM PL IC IT NON E
I N T E GER : : a , b ,s u ma
W R IT E( * ,* ) ' D A M E 2 N U MER O S'
R EAD( *,*) a,b
W R IT E( * ,* ) ' LA SUMA E S ' ,s u ma(a , b)
E ND PROGRA M ca p5_ 1
⎛m⎞
2. Calcular el número combinatorio ⎜⎜ ⎟⎟ sabiendo que m debe ser
⎝n⎠
mayor o igual que n.
PROGRA M c ap 5_2
IM PL IC IT NON E
I N T E GER : : n ,m
INT EGER :: f act
R EAL : : res u l
W R IT E( * ,* ) ' D A M E 2 N U MER O S'
R EAD( *,*) m,n
124
Procedimientos
I F ( m< n) T H EN
WR IT E( * ,* ) 'NO SE PU ED E'
ELSE
resul=fact( m) /( fact(n)*f act( m-n))
W R IT E( * ,* ) ' R E SU LTA D O' , resu l
E N D IF
E ND PROGRA M ca p5_ 2
FU NCTION fact( x)
IM PL IC IT NON E
I N T E G ER , I N T EN T ( IN ) : : x
I N T E G ER : : i ,f a c t
f act=1
D O i= 1 ,x
fact=fact*i
END DO
END FUNCTION fact
n
1
3. Calcular ∑ siendo n leído por teclado. Usar una función para
i =1 i!
calcular el factorial (i!). El programa se ejecuta tantas veces como
el usuario quiera, por ejemplo, mientras se teclee la letra ‘S’.
PROGRA M c ap 5_3
IM PL IC IT NON E
CHARAC TER (LEN= 1) :: seguir
I N T E G ER : : f a c t , i , n
R EAL : : sumat or
DO
WR IT E( * ,* ) 'NUM ERO D E EL EM EN TO S DEL SU MATOR IO?'
125
Procedimientos
R EAD( *,*) n
s u mat or=0
DO i= 1,n
s u mat or =su mato r+1 ./f act( i)
END DO
WR IT E( * ,* ) ' EL R ESUL TADO ES:' ,su mat or
WR ITE( *,*) 'D ESEA CON T INUAR ( S/N) ?'
R EAD( *,*) s eg u ir
I F ( s e g u ir /= ' S' ) E XI T
END DO
E ND PROGRA M ca p5_ 3
FU NCTION fact( x)
IM PL IC IT NON E
I N T E G ER , I N T EN T ( IN ) : : x
I N T E G ER : : f a c t , i
f act=1
D O i= 1 ,x
fact=fact*i
END DO
END FUNCTION fact
PROGRA M c ap 5_4
IM PL IC IT NON E
R EAL : : me d ia
R EAL , D I MEN S ION(5 ):: ve c to r
INTEG ER : : i
D O i= 1 ,5
WR IT E( * ,* ) 'DAM E CO M PON ENT E' ,i,'D EL VEC TOR'
R EAD( *,*) ve ct or (i)
END DO
WR IT E( * ,* ) ' LA M ED IA E S:' , med i a( ve ct or,5)
126
Procedimientos
E ND PROGRA M ca p5_ 4
PROGRA M c ap 5_5
IM PL IC IT NON E
I N T E GER : : a , b ,s
W R IT E( * ,* ) ' D A M E 2 N U MER O S'
R EAD( *,*) a,b
CA LL s u ma (a ,b ,s)
W R IT E( * ,* ) ' LA SUMA E S ' ,s
E ND PROGRA M ca p5_ 5
127
Procedimientos
z=x+ y
END SUBROU T IN E suma
PROGRA M c ap 5_6
IM PL IC IT NON E
INT EGER :: a= 5 ,b= 10
WR IT E( * ,* ) 'AN T ES DEL CA MB IO '
WR IT E( * ,* )' A= ' ,a ,' B= ' , b
C A LL c a mb i a(a , b)
WR IT E( * ,* ) 'D ESPU ES D EL CAM BIO EN PR INC IPAL '
WR IT E( * ,* ) ' A= ',a ,' B= ' , b
E ND PROGRA M ca p5_ 6
SUBROU T IN E cambia( x, y)
IM PL IC IT NON E
INTEGER, INTENT(IN OUT) :: x
I N T E G ER , I N T EN T ( IN O U T ) : : y
I N T E GER : : a ux
a ux= x
x= y
y= a u x
WR ITE( *,*) 'D ESPU ES D EL CAMBIO EN SUBRU TINA'
WR IT E( * ,* ) ' X= ' , x ,' Y = ' , y
END SUBROU T IN E cambia
128
Procedimientos
PROGRA M c ap 5_7
IM PL IC IT NON E
R EAL : : res u l
R EAL , D I MEN S ION(5 ):: ve c to r
INTEGER : : i
W R IT E( * ,* ) ' D A M E V EC T OR'
R EAD( * ,*) ( ve ct or ( i) , i=1 , 5)
C A LL me dia( ve c t o r ,re su l ,5 )
WR IT E( * ,* ) ' LA M ED IA E S:' , resu l
E ND PROGRA M ca p5_ 7
SUBROU T IN E media(num,solu,d1)
IM PL IC IT NON E
INTEGER, I NT ENT ( IN) : : d 1
R EAL, D IMEN SION( d1),IN TENT(IN) :: num !perfil explicit o
R EAL, IN TENT( OUT) :: solu
R EAL : : suma
INTEGER : : i
s u ma= 0
DO i= 1,d1
s u ma=s uma+ nu m( i)
END DO
s o lu= su ma / d1
END SUBROU T IN E me dia
PROGRA M c ap 5_8
129
Procedimientos
IM PL IC IT NON E
INTEGER , PARAMETER:: TM=10
I NT E GER , D IM EN S ION( TM , TM) :: mat
I N T E GER : : f i la , co l u mn a ,p os , neg , ce ros
CA LL le er(mat ,fila,c olumna,TM)
CA LL c uen ta( ma t,f ila ,co lumna,p os ,ne g,ce ro s)
WR IT E( * ,* ) ' EL NUM ERO D E POSIT IVO S ES:' ,po s
WR IT E( * ,* ) ' EL NUM ERO D E N EGA T IVO S ES:' ,neg
W R IT E( * ,* ) ' E L N U M ERO D E C ERO S E S:' ,c er os
E ND PROGRA M ca p5_ 8
DO
WR IT E( * ,* ) '¿N º D E F ILA S? '
R EA D ( * , * ) f i l
WR ITE( *,*)'¿N º D E COLUMNAS?'
R EAD( *,*) c o l
IF (fil<=10 .AND. col<=10) EXIT
END DO
DO k=1,f il
DO j= 1,col
WRIT E(*,*) 'ELEME NTO',k ,j,'DE LA MATRIZ'
R EA D ( * ,* ) mat ( k ,j )
END DO
END DO
END SUBROU T IN E leer
130
Procedimientos
DO k=1,f il
DO j= 1,col
I F ( m a t ( k , j) < 0 ) T H EN
neg= neg+1
E L S E IF ( ma t ( k , j) = = 0 ) T H EN
cer=cer+ 1
ELSE
pos=pos+ 1
E N D IF
END DO
END DO
END SUBROU T IN E cuenta
PROGRA M c ap 5_9
IM PL IC IT NON E
I N T E GER : : s ue rt e , n2 , n , int ento
n= su ert e()
WR ITE( *,*) "SE HA GEN ERADO UN NU MERO EN TRE 1 Y 100"
WR ITE( *,*) "INTENTA AD IVINARLO"
intento=0
DO
WR ITE(*,*) 'DA M E UN NU MERO'
R EA D ( * ,* ) n 2
intento= in tento+1
I F ( n 2 = = n ) T H EN
W R IT E( * ,* ) ' A C ER T A S T ES ! '
W R IT E( * ,* ) ' H A S N EC E SIT A D O ' , int e n t o , ' INT EN T O S! '
EXIT
E N D IF
C A L L p is t a( n,n2)
131
Procedimientos
END DO
E ND PROGRA M ca p5_ 9
P R OGRA M c ap 5_1 0
IM PL IC IT NON E
R EAL : : h ,d t ,r ,a l,ar ea
WR IT E( * ,* ) 'C OEF IC IE NT E D E CON V ECC ION '
R EAD( *,*) h
WR ITE( *,*) 'D IFERENC IA D E TEMPERA TURA'
R EAD( *,*) dt
WR ITE( *,*) 'RAD IO Y ALTURA'
R EA D ( * ,*) r , a l
132
Procedimientos
WR ITE( *,*) ' PERD IDA D E CALOR: ' ,h*area( r,al) *dt
E ND PROGRA M ca p5_ 10
P R OGRA M c ap 5_1 1
IM PL IC IT NON E
INTEGER , PARAMETER:: d1=25,d2=3
R EAL : : x ,y,t , b u sca t ,d i fm
R EAL , D I MEN S ION( d1 , d2): : mat
R EAL, EXTERNAL:: media
133
Procedimientos
C A LL le ctu ra ( m at ,d 1, d 2)
WR ITE( *,*) 'DA M E UN PUNTO'
R EAD( *,*) x, y
W R IT E( * ,* ) ' T EM P ER A T U R A EN E S E PU N T O ES' ,b u s c a t ( x , y, m a t , d 1 , d 2 )
WR ITE( *,*) 'DA M E UNA TEMPERATURA'
R EAD( *,*) t
C A LL p un t o s( mat ,t , d1 , d2)
W R IT E( * ,* ) ' D E S V M A X R ES P EC T O T E M P . M ED IA ' , d if m( ma t ,me d i a ,d 1 ,d 2 )
! LA FUNCIÓN MED IA ES UN ARGU M ENTO AC TUAL
E ND PROGRA M ca p5_ 11
134
Procedimientos
135
Procedimientos
END DO
m e d ia= med i a /d 1
END FUNCTION media
136
Procedimientos
EJERCICIOS PROPUESTOS
1) Programa que pida dos números naturales y use una función lógica
para saber si ambos son cuadrones pares o no. A saber: dos
números son cuadrones pares si al sumarlos y restarlos se obtienen
cuadrados perfectos. Ejemplo: 10 y 26 son cuadrones pares pues:
10+26 =36 (cuadrado perfecto) y 26-10 = 16 (cuadrado perfecto).
137
Procedimientos
138
6 CARACTERES Y CADENAS
139
Caracteres y cadenas
7
Cada gu ión b ajo r epr esen ta un b lanco.
140
C a r a c t ere s y c ad en as
141
Caracteres y cadenas
WRITE(*,*) ACHAR(65),ACHAR(90),ACHAR(97),ACHAR(122)
!se escribe por pantalla A,Z,a,z
WRITE(*,*) LEN(pal1),LEN_TRIM(pal1)
!se escribe por pantalla 10 5
WRITE(*,*) pal1,TRIM(pal1)
!se escribe por pantalla raton_____raton
WRITE(*,*) INDEX(pal1,’a’)
!se escribe por pantalla 2
• Las funciones intrínsecas léxicas permiten comparar cadenas y son
las siguientes: LLT (Lexically Less Than), LLE (Lexically Less or
Equal than), LGT (Lexically Great Than) y LGE (Lexically Great or
Equal than). Estas funciones son equivalentes a los operadores
relaciones <, <=, > y >=, respectivamente. Ahora bien, mientras las
funciones léxicas utilizan siempre el código ASCII como base para
realizar las comparaciones, los operadores relacionales pueden
utilizar este código o cualquier otro, según el computador.
• La comparación entre cadenas se realiza de la siguiente manera:
• Se comparan las dos cadenas carácter a carácter, comenzando
por el primer carácter (el que se encuentra más a la
izquierda) y continuando hasta que se encuentra un carácter
distinto o hasta que finaliza la cadena.
• Si se encuentran caracteres distintos, el operando que
contiene el carácter menor 8, será considerado el operando
menor. Por tanto, el orden de los operandos viene marcado
por el primer carácter que difiere entre ambos operandos.
• Si se alcanza el final de uno de los operandos y no hay
caracteres distintos, la ordenación de las cadenas se hará en
función de sus longitudes. Así, si ambas cadenas tienen la
misma longitud, las cadenas son iguales, mientras que si las
cadenas tienen longitudes diferentes, la comparación
continúa como si la cadena más corta estuviera rellena de
blancos hasta la longitud de la cadena más larga.
• Ejemplo. Sean las declaraciones:
CHARACTER (len=15):: pal1,pal2
8
Un car ácter es me nor qu e o tro si la po sición qu e o cupa el p r imero en el cód igo
ASCI I es menor qu e la qu e o cupa el segundo .
142
C a r a c t ere s y c ad en as
LOGICAL:: result1,result2
pal1=’Begoña’
pal2=’Paula’
result1=pal1<pal2
result2=LLT(pal1,pal2)
El valor de result1 puede variar de procesador a procesador, pero el
valor de result2 es siempre .TRUE. en cualquier procesador.
143
EJERCICIOS RESUELTOS
Objetivos:
145
Caracteres y cadenas
PROGRA M c ap 6_1
IM PL IC IT NON E
CHARAC TER (LEN= 10) :: nom, apel
CHARAC TER (LEN= 20) :: nomc
INTEGER :: long1,long2= 0,i,conta=0
lo ng 1= le n_ tr im( no m)
WR IT E( * ,* ) ' no m,' t ien e ' ,lo ng 1 ,’c ar acte res ’
! otr o mo do de ca lc ula r la longit ud de u na ca den a
DO i= 1,LEN( nom)
I F (no m( i: i) /= ' ') TH EN
long2= lo ng2+1
E N D IF
END DO
WR IT E( * ,* )' no m,' t iene ' ,lon g2 ,’c ar acte re s’
!.............................................
W R IT E( * ,* ) ' D A M E TU A P EL L ID O '
R EA D ( * ,*) a pe l
E ND PROGRA M ca p6_ 1
146
Caracteres y cadenas
PROGRA M c ap 6_2
IM PL IC IT NON E
CHARAC TER (LEN= 27) :: abc='ABCD EFGH IJK LMNÑOPQR STUVW XYZ' ,&
a bc m= ' abcd efg h i jk l mn ño pq rst uvw x yz '
INTEGER:: i
W R IT E( * ,* ) ' N A SC I I LETRA N A SC I I LETRA'
DO i= 1 ,27
WR ITE( *,100) IACHAR( abc( i: i)) ,abc( i: i) ,IACHAR( abcm( i:i)) ,abcm( i:i)
PAUSE
END DO
1 00 FOR MA T ( 2 X , I4 ,8X , A 2 ,8 X , I 4 , 6 X ,A 2 )
E ND PROGRA M ca p6_ 2
PROGRA M c ap 6_3
IM PL IC IT NON E
147
Caracteres y cadenas
PROGRA M c ap 6_4
IM PL IC IT NON E
CHARAC TER (LEN= 20) :: nom,nom_ma yus= ' '
I N T E GER : : nu m ,n u m_ m a yu s , i
WR ITE( *,*) 'DA M E UN NOMBR E EN MINU SCU LAS'
R EAD( *,*) nom
W R IT E( * ,* ) ' E L N OMBR E T EC LEA D O E S ' ,n o m
DO i= 1,LEN_TR IM( nom)
num= IACHAR( nom( i: i))
IF (nu m >= 9 7 .AND . n u m <= 12 2) TH EN
num_ma yus= num-32
nom_ma yus( i: i)=ACHAR( num_ma yu s)
ELSE
148
Caracteres y cadenas
PROGRA M c ap 6_5
IM PL IC IT NON E
CHARAC TER (LEN= 50) :: nombre
INTEGER :: long,i= 0
WR ITE( *,*) 'DA M E UN NOMBR E'
R EA D ( * ,*) n o mb re
DO
i = i+1
IF (nombre(i: i) == ' ') EXIT
END DO
WR ITE( *,*) ' LA PALABRA TIENE' ,i- 1 ,' CARAC TER ES'
long= i-1
CA LL in ve r t ir( no mbre ,lon g)
WR ITE( *,*) ' LA PALABRA IN VERTID A ES ' ,nombre
E ND PROGRA M ca p6_ 5
149
Caracteres y cadenas
j= lo ng
c en= l on g /2
DO i= 1 ,cen
a ux= no mb re (i: i)
n o mb re( i: i)= no m bre ( j : j)
n o mb re( j: j)= aux
j = j-1
W R IT E( * ,* ) ' N O MB R E ' , no mb re
END DO
END SUBROU T IN E inve rt ir
PROGRA M c ap 6_6
IM PL IC IT NON E
CHARAC TER (LEN= 6) :: sil=' '
CHARAC TER (LEN= 30) :: pal=' '
WR ITE( *,*) ' PA LABRA'
R EAD( *,*) pal
WR ITE( *,*) ' SILABA'
R EAD( *,*) sil
W RIT E( * ,*) I NDE X(p al,T RI M ( si l ) )
E ND PROGRA M ca p6_ 6
PROGRA M c ap 6_7
IM PL IC IT NON E
150
Caracteres y cadenas
PROGRA M c ap 6_8
IM PL IC IT NON E
INTEGER:: i
CHARAC TER (LEN= 1) :: resp
151
Caracteres y cadenas
DO
WR ITE( *,*) 'DAME UN COD IGO D E PROVINC IA'
R EAD( *,*) cod
! ***BU SQU EDA EN EL ARRA Y
i=0
DO
i = i+1
I F (co d == t cod ( i) .OR . i == 1 0) E X I T
END DO
IF (cod /= tcod( i)) TH EN
W R IT E(* , * ) ' ER R OR. NO EXISTE ESE CODIGO'
ELSE
WR IT E(* , *) ' LA PRO V INC IA ES ' ,t no m( i)
E N D IF
WR ITE( *,*) 'CON TINUAR( S/N) ?'
R EAD( *,*) res p
IF (re sp /= ' S' .AND . r es p /= 's ') EXIT
END DO
E ND PROGRA M ca p6_ 8
PROGRA M c ap 6_9
IM PL IC IT NON E
INTEGER , PARAMETER::N= 3
CHARAC TER (LEN= 20), D IMENSION(N) :: nom
INTEGER:: i
CA LL le er(n o m,N)
C A LL o rd en ar ( no m ,N )
WR ITE( *,*) ' LA LISTA ORD ENADA A SC ENDENTEMENTE ES'
WR IT E( * ,* ) ( no m( i) , i=1 ,N )
152
Caracteres y cadenas
E ND PROGRA M ca p6_ 9
SUBROU T IN E ordenar(x,n)
IM PL IC IT NON E
I N T E GER , I N T EN T( IN ) : : n
CHARAC TER (LEN= *) , D IMEN SION( n) , IN TENT( IN OUT) :: x
CHARAC TER (LEN= 20)::aux
INTEGER:: i,j
DO i= n - 1, 1,- 1
DO j= 1,i
I F ( LG T( x( j) ,x( j+ 1))) TH EN
aux=x(j)
x(j)= x(j+1)
x(j+ 1)=aux
E N D IF
END DO
END DO
END SUBROU T IN E ordenar
153
Caracteres y cadenas
EJERCICIOS PROPUESTOS
154
7 FORMATOS Y ARCHIVOS
155
Formatos y archivos
string=’2I3’
WRITE (*,string) N,M !variable carácter especifica formatos de N y M
156
Formatos y Archivos
SÍMBOLO SIGNIFICADO
c número de columna
m mínimo nº de dígitos
n nº de espacios saltados
157
Formatos y archivos
I4 452 •452
I2 6234 **
I5 -52 ••-52
I4.3 3 •003
I2.0 0 ••
I4 •1•• 1
I2 -1 -1
I4 -123 -123
I3 •12 12
I2 123 12
158
Formatos y Archivos
159
Formatos y archivos
160
Formatos y Archivos
[r]ESw.d
• Los símbolos usados tienen el significado que se muestra en la
Tabla 7.1.
• Los mismos criterios que operan sobre un dato real con formato F
se aplican a ese dato real con formato científico.
• Si un número se quiere leer/escribir en formato científico con d
cifras decimales, la anchura de campo mínima w ≥ d+8, pues tal
número se representa ±1.ddddES±ee y requiere como mínimo un
carácter para representar el signo (sólo si es negativo), otro para la
parte entera del número, el punto decimal, los dos caracteres ES, el
signo del exponente y los dos dígitos del mismo.
• La diferencia entre el formato exponencial y el científico para un
valor real dado con una anchura de campo dada es que en el
formato científico se representa una cifra significativa más que en
el formato exponencial.
• Ejemplos de salida:
Tab la 7 .9: Fo r matos de lect ura de rea les e n fo rmato c ien tíf ico
161
Formatos y archivos
L5 .FALSE. ••••F
L4 .TRUE. •••T
L1 .TRUE. T
L2 .FALSE. •F
L5 •••T• .TRUE.
L2 F1 .FALSE.
L4 •X•T ERROR
162
Formatos y Archivos
VALOR LONGITUD DE LA
DESCRIPTOR SALIDA
INTERNO VARIABLE CARACTER
A ABCDEF 6 ABCDEF
A8 ABCDEF 6 ••ABCDEF
A4 ABCDEF 6 ABCD
LONGITUD DE LA
CAMPO VALOR
DESCRIPTOR VARIABL
ENTRADA LEÍDO
CARACTER
A ABCDEFGH 6 ABCDEF
A ABCDEFGH 8 ABCDEFGH
A8 ABCDEFGH 4 EFGH
A4 ABCDEFGH 6 ABCD••
163
Formatos y archivos
164
Formatos y Archivos
165
Formatos y archivos
166
Formatos y Archivos
167
Formatos y archivos
INTEGER:: error_de_escritura
…
WRITE (UNIT=16,*, IOSTAT= error_de_escritura) X,Y
WRITE (20,’3F8.3’) X,Y,Z
168
Formatos y Archivos
…
READ (15, *, IOSTAT = error_de_lectura) a,b,c
• Ejemplo de procesamiento de archivos.
PROGRAM temperaturas
! Lee una serie de temperaturas de un archivo y
! calcula el valor medio
IMPLICIT NONE
CHARACTER (LEN=20):: archivo
INTEGER:: cuenta, error_de_apertura, error_de_lectura
REAL:: temperatura, suma, media
! Abrir archivo como unidad 15
WRITE( *, *) ‘ Dame nombre del archivo:’
READ (*, *) archivo
OPEN(15, FILE= archivo, STATUS=‘OLD’, ACTION=’READ’,&
IOSTAT= error_de_apertura)
IF (error_de_apertura > 0) STOP ‘ error al abrir el archivo ‘
100 FORMAT (1X, F4.1)
cuenta=0
suma=0
DO
READ (15, 100, IOSTAT = error_de_lectura) temperatura
IF (error_de_lectura >0 ) THEN
WRITE(*,*) ‘error de lectura’
EXIT
ELSE IF (error_de_lectura <0 ) THEN
! WRITE(*,*) ‘fin del archivo’
EXIT
ELSE
suma = suma + temperatura
cuenta = cuenta + 1
ENDIF
END DO
! Calcular temperatura media
media = suma/ REAL(cuenta)
WRITE (*, *) ‘ temperatura media: ‘
169
Formatos y archivos
170
EJERCICIOS RESUELTOS
Objetivos:
171
Formatos y archivos
PROGRA M c ap 7_1
IM PL IC IT NON E
I N T E GER : : n
WR ITE( *,8) 'NU M ERO, RA IZ CUADRADA , RA IZ CUB ICA'
8 FOR MAT (1X, A)
WR IT E ( * ,10 ) (n ,SQRT (REAL( n)) ,R EAL (n) ** (1 .0 /3 .0) ,n= 1 ,10 0)
1 0 FOR MAT (1 X, I5 , 4 X, F8 .3 , 8 X, F8 .3)
E ND PROGRA M ca p7_ 1
PROGRA M c ap 7_2
IM PL IC IT NON E
INT EGER :: m=- 123 ,n=9 877 ,l= 889 ,i= 77
R EA L : : r=8 9 .12 6 , s=1 4 .53 2
CHARAC TER (LEN= 6):: pal= 'abcdef '
W R IT E( * ,1 0 0 ) ' En t e r o s ' , m ,n , l , i
1 00 F OR MA T ( 1 X /1 X ,T 10 ,A / ,1 X ,I4 , 1 X , I 4 ,1 X, I 3 , 1 X , I 1 )
WR IT E( * ,15 0) 'Rea le s' ,' se red on de a' ,r ,'s e re lle na c on ce ro s' ,r ,'n o
c ab e' ,r
1 50 FORMAT (1 X/1 X,T 10 ,A /,1 X,A ,1 X,F5 .2 /,1 X,A ,1 X,F7 .4 /,1 X,A ,1X,F 4 .2)
WR IT E( * ,25 0) 'C ara ct ere s' ,'w =6= L EN(p a l)' ,pa l,&
'w = 8. L a va r ia b le s e a j ust a a la d er ech a de l ca mp o' ,p a l ,&
'w =4. Se mu est ra n los 4 p r imero s c ara cter es de la va r ia b le' ,pal
2 50 F OR MA T ( 1 X / ,T 10 ,A / , 1X ,A ,1 X ,A / ,1 X ,A, 1 X ,A 8 / , 1 X,A ,1 X ,A4 )
172
Formatos y archivos
3 00 FOR MA T ( 1 X / ,1 X ,A / ,1 X ,4 I 5 ,2F 6 .2 ,A 7 )
E ND PROGRA M ca p7_ 2
Clase Nota
1 [8.5,10]
2 [5,8.5)
3 [0,5)
PROGRA M c ap 7_3
IM PL IC IT NON E
CHARAC TER (LEN= 18) :: nombre
R EAL : : no ta
INTEGER ::
c lase ,er ror _d e_a pe rtu ra ,er ro r_d e_ lectu ra,e rr or _d e_e sc r itu ra
O PEN (6 0 ,F IL E='c ap7 _3 in.txt' ,STA TU S='O LD' ,AC T ION= 'REA D' ,&
IO STAT=e rr o r_d e_a pe rt ura )
I F ( er ro r_ de _a per t u ra> 0 ) S TO P ' c ap 7_3 i n .tx t N O A B IER T O'
O P EN (7 0 ,F I L E='c ap7 _3 out .t xt',S TA TU S='N EW' ,AC T ION= 'WR ITE' ,&
IO STAT=e rr o r_d e_a pe rt ura )
I F ( er ro r_ de _a per t u ra> 0 ) S TO P ' c ap 7_3 out. t x t N O A B I E R T O'
WR IT E( 70 ,9 ,IOSTAT=e rr or _d e_e sc r itu ra) 'A LUMN O' ,'C LA SE'
WR IT E( 70,'( 1 X,A6,T 20,A 5)') '======','====='
IF (er ro r_ de _es cr it ura> 0) STO P ' er ro r de e sc r itu ra'
9 FOR MAT (1 X ,A 6 ,T20 ,A 5)
DO
R EAD(6 0 ,* ,IO STA T=e rr or _d e_ le ctu ra) nomb re ,not a
e xt e rn o: IF ( er ro r_ de _ lec t u ra > 0 ) TH EN
WR IT E(* ,*) ' er ro r d e lec tu ra'
EXIT
EL SE IF (e rr or _d e_ le ctu ra < 0 ) TH EN
173
Formatos y archivos
174
Formatos y archivos
PROGRA M c ap 7_4
IM PL IC IT NON E
CHARAC TER (LEN= 15), D IMENSION ( 5) :: nomb
CHARAC TER (LEN= 15)::nombm,nombp
R EAL , D I MEN S ION(5 ) :: not a
R EA L : : m ej o r ,p eo r , me d ia clas e ,m e d ia
INT EGER :: i,n ,er ro r_d e_ ape rt ur a ,e rr or _de _ lec tu ra ,s uf ic ient es ,nu m
O PEN (1 0 ,F IL E='c ap7 _4 in.txt' ,STA TU S='O LD' ,AC T ION= 'REA D' ,&
IO STAT=e rr o r_d e_a pe rt ura )
I F ( er ro r_ de _a per t u ra> 0 ) S TO P ' c ap 7_4 i n .tx t N O A B IER T O'
175
Formatos y archivos
O P EN (2 0 ,F I L E='c ap7 _4 out .t xt',S TA TU S='N EW' ,AC T ION= 'WR ITE' ,&
IO STAT=e rr o r_d e_a pe rt ura )
I F ( er ro r_ de _a per t u ra> 0 ) S TO P ' c ap 7_4 out. t x t N O A B I E R T O'
WR IT E( 20 ,'( 1 X ,A , I3 ,A)' ) 'HA Y' , nu m,' ALU MNO S CON S UF IC I ENT E '
WR IT E( 20 ,'( 1 X,A ,F4 .1 )') ' LA NO TA M ED IA D E LA CLA SE ES:' ,me d ia
W R IT E( 20 ,'( 1 X ,3A ,F 4.1) ' ) 'El p eo r a l umn o e s: ' , no m bp ,' y su n ot a
e s: ' , peo r
WR IT E( 20 ,'( 1 X,3A ,F 4.1) ') ' El mejo r a lu mn o e s: ' ,no mb m, &
' y s u no t a e s: ' , me j or
CL O SE (10)
CL O SE (20)
E ND PROGRA M ca p7_ 4
176
Formatos y archivos
c ont ad or=0
DO i= 1,n
IF (nota( i) >= 5.AND.nota( i) < 6) TH EN
c ont ad or =co nta dor +1
E N D IF
END DO
s uf ic ient es= co nta dor
END FUNCTION suf icientes
177
Formatos y archivos
EJERCICIOS PROPUESTOS
178
Formatos y archivos
179
BIBLIOGRAFÍA
181