Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso de Fortran PDF
Curso de Fortran PDF
PROGRAMACIN EN FORTRAN
0.1 Q U ES F O R T R A N ? ................................................................... 11
0.2 CAMBIOS EN LOS DIFERENTES ESTNDARES 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 DECLARACIN 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 intrnsecos en Fortran ................................ 19
Tabla 1.3: Operadores aritmticos Fortran ......................................... 24
Tabla 1.4: Reglas de precedencia de operadores aritmticos ................ 25
Tabla 1.5: Ejemplo de reglas de precedencia de operadores aritmticos 25
Tabla 1.6: Orden de precedencia de los tipos Fortran .......................... 26
Tabla 1.7: Aritmtica con tipos mezclados ......................................... 26
Tabla 2.1: Operadores lgicos relacionales Fortran ............................ 35
Tabla 2.2: Ejemplos de expresiones lgicas relacionales ..................... 36
Tabla 2.3: Operadores lgicos combinacionales Fortran 90/95 ............. 37
Tabla 2.4: Tabla de verdad de los operadores lgicos combinacionales. 37
Tabla 2.5: Orden de precedencia de operadores lgicos
combinacionales Fortran ............................................................ 37
Tabla 2.6: Orden de precedencia de operadores Fortran ...................... 38
Tabla 7.1: Smbolos 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 cientfico ......... 161
Tabla 7.9: Formatos de lectura de reales en formato cientfico ........... 161
Tabla 7.10: Formatos de escritura de datos lgicos ............................ 162
Tabla 7.11: Formatos de lectura de datos lgicos .............................. 162
Tabla 7.12: Formatos de escritura de caracteres ................................ 163
Tabla 7.13: Formatos de lectura de caracteres ................................... 163
10
0 INTRODUCCIN
0.1 Qu es Fortran?
Fortran es el primer lenguaje de programacin de alto nivel creado
en el ao 1957 por obra de un equipo de cientficos de IBM dirigido
por John Backus.
Por aquel entonces, slo los cientficos e ingenieros utilizaban los
computadores para resolver problemas numricos. Por tanto, la
facilidad de aprendizaje del lenguaje equivala a que la notacin
fuese un reflejo de la notacin matemtica. No en vano, Fortran
deriva de las palabras inglesas FORmula TRANslation.
Desde su creacin en la dcada de los aos 50 en IBM, ha sido y es
ampliamente utilizado, habiendo pasado por un proceso de
evolucin que ha dado lugar a distintas versiones que, por
convencin, se identifican por los dos ltimos dgitos del ao en
que se propuso el estndar correspondiente. Las distintas versiones
son:
Fortran 66 publicada por ANSI 1 X3.9-1966.
Fortran 77 publicada por ANSI X3.9-1978 y ISO 2/IEC
1539:1980.
Fortran 90 titulado Programming Language "Fortran"
Extended (ANSI X3.198-1992 and ISO/IEC 1539:1991).
Fortran 95 titulado Information technology - Programming
languages - Fortran - Part 1: Base language (ISO/IEC 1539:
1997).
Fortran 2003 titulado Information technology - Programming
languages - Fortran - Part 1: Base language. (ISO/IEC 1539:
2004).
Por supuesto, todas las versiones incluyen a las anteriores. As,
cualquier programa escrito en Fortran 66, Fortran 77 o Fortran 90,
compila, sin problemas, en un compilador Fortran 95.
Debemos remarcar, no obstante, que en general los compiladores de
Fortran que proporcionan las distintas casas de hardware y/o
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
Introduccin
12
Introduccin
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 cd igo For tr an co mp ilado
s ep ar ada me n te. Se e s tud iarn 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 ejecucin.
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 propsitos de documentacin 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 ejecucin de un programa, y
opcionalmente, imprime un mensaje en la salida estndar de
errores.
STOP [n]
n es una constante carcter o un entero de hasta 5 dgitos.
STOP termina la ejecucin de un programa Fortran, antes de que
ste llegue al final de dicho programa. STOP tambin manda un
mensaje a la salida estndar de errores si se ha especificado algo
despus de l (dgitos 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 automticamente
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 ningn otro punto de parada
intermedio, el uso de esta sentencia est desaconsejado.
16
Tipos de datos y los primeros pasos: leer, calcular, escribir
CDIGO DESCRIPCIN
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
LGICO LOGICAL 4
.FALSE.
CHARACTER
CONJUNTO DE
[{(len=n caract de
CARCTER 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, dgitos o caracteres de subrayado _.
Por ejemplo, identificadores vlidos son:
Masa, MASA, Velocidad_de_la_luz, Sueldo_del_ultimo_mes,
X007.
Y no vlidos:
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 simblico de un dato. Por tanto,
ese dato podr ser identificado, definido y referenciado a travs 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 DESCRIPCIN
OPERADORES BINARIOS
+ SUMA
- RESTA
* MULTIPLICACIN
/ DIVISIN
** 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 expresin contiene dos o ms operadores de la misma
precedencia se siguen las siguientes reglas:
Cuando existen parntesis anidados se evalan desde el ms
interno hasta el ms externo. Es conveniente usar tantos
parntesis como sean necesarios en una expresin para
hacerla ms clara y fcil de comprender.
Las operaciones de potencia se evalan de derecha a
izquierda.
Multiplicacin/divisin y suma/resta se evalan 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 expresin 4 para tres nmeros
reales x, y, z ledos 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 expresin para un ngulo x en radianes
ledo 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
OPERACIN RESULTADO
3<=i .TRUE.
j**2-1>=0 .TRUE.
i==j .FALSE.
i/=10 .TRUE.
ANA<PEPE .TRUE.
36
Estructuras de control condicionales
Tabla 2 .4: Tabla de verdad de los o pe rado r es lg icos com b ina c ionale s
OPERADOR(ES) PRECEDENCIA
( ) MAYOR
.NOT.
.AND.
.OR.
T a b la 2 . 5 : O rd en d e p r e c ed en c ia d e o p e ra d o r e s lg i cos c o mb i n a c ion a l es
Fo rt ran
Si una expresin lgica contiene dos o ms operadores de la misma
precedencia se siguen las siguientes reglas:
Cuando existen parntesis anidados se evalan desde el ms
interno hasta el ms externo.
37
Estructuras de control condicionales
OPERACIN PRIORIDAD
OPERADORES ARITMTICOS
** 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 slo una) sea
ejecutado si y slo si el valor de una expresin lgica es cierta. Si
la expresin lgica es falsa se salta ese bloque de sentencias y se
ejecuta la primera sentencia ejecutable por debajo de END IF.
IF (expresin lgica) THEN
bloque de sentencias
END IF
ENDIF marca la terminacin de la sentencia bloque IF.
El bloque de sentencias suele dentarse por dos o ms espacios para
facilitar la lectura del bloque IF, aunque no es obligatorio hacerlo.
La estructura del bloque IF puede ser ms complicada. A veces, se
quiere ejecutar un bloque de sentencias si una expresin lgica es
cierta y diferentes bloques de sentencias si otras condiciones son
ciertas. Por ejemplo:
IF (expresin lgica 1) THEN
bloque de sentencias 1
ELSE IF (expresin lgica 2) THEN
bloque de sentencias 2]
ELSE
bloque de sentencias 3
END IF
Si la expresin lgica 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 expresin lgica 1 es falsa se salta el bloque de sentencias 1,
se evala la expresin lgica 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 lgicas son falsas, el programa ejecuta el
bloque de sentencias 3.
En general, un bloque IF puede contener opcionalmente cualquier
nmero de subbloques ELSE IF (0, 1, 2, 3,), pero slo puede
contener un subbloque ELSE.
La sintaxis general de un bloque IF es:
IF (expresin lgica 1) THEN
bloque de sentencias 1
[ELSE IF (expresin lgica 2) THEN
bloque de sentencias 2]
39
Estructuras de control condicionales
[ELSE
bloque de sentencias n]
END IF
La expresin lgica de una clusula es evaluada slo si las
expresiones lgicas de todas las clusulas precedentes han sido
falsas. Cuando la prueba de una expresin lgica 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 clusula ELSE, puede ocurrir que
ninguna de las expresiones lgicas sean ciertas y que, por lo tanto,
no se ejecute ninguno de los bloques de sentencias dados.
[ELSE [nombre]
bloque de sentencias n]
END IF [nombre]
nombre es cualquier identificador vlido.
Es recomendable usar nombres en los bloque IF largos y
complicados. Por un lado, el programador estructura mejor los
programas y, por otro, el compilador encuentra errores en su cdigo
de forma ms precisa.
Adems, los bloques IF pueden estar anidados. Dos bloques IF se
dice que estn anidados cuando uno de ellos se encuentra dentro de
otro. En este caso, cada uno de los bloques IF requerir su propia
sentencia ENDIF.
[nombre_externo:] IF (expresin lgica 1) THEN
bloque de sentencias 1
[nombre_interno:]IF (expresin lgica 2) THEN
bloque de sentencias 2
END IF [nombre_interno]
END IF [nombre_externo]
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 lgico
La sentencia IF lgica es el caso particular ms simple del bloque
IF. La sentencia IF lgica evala una expresin lgica y ejecuta
una sentencia si dicha expresin es cierta.
IF (expresin lgica) sentencia
sentencia es cualquier sentencia ejecutable excepto DO, END,
bloque IF u otra sentencia IF lgica.
Si el valor de la expresin lgica 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 fro
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 ecuacin 3-1, se obtiene que sentencia se ejecuta 3
veces, para los valores de i: 5, 3, y 1. A continuacin, 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
cuntas 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 nmero entre 0 y 10, ambos lmites
incluidos. El usuario puede equivocarse, en cuyo caso el
programa le dar tantas posibilidades como necesite
(indefinidas veces) hasta conseguir que el nmero
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 nmero de elementos de la lista y el nmero de listas es
conocido a priori, Cmo cambia el cdigo 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 Introduccin
En computacin 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 parmetros:
Rango: es su nmero de dimensiones. As, un escalar posee
rango cero, un vector rango uno, una matriz rango dos, etc.
Extensin: 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 extensin de su dimensin primera (filas) es 5 y
la de su dimensin segunda (columnas) es 3.
Tamao: es el total de elementos que tiene, es decir, el
producto de sus extensiones. En el ejemplo anterior, el
tamao de una matriz de 5 filas x 3 columnas es 15.
Perfil: es la combinacin del rango y la extensin del array
en cada dimensin. Por tanto, dos arrays tienen el mismo
perfil si tienen el mismo rango y la misma extensin en cada
una de sus dimensiones.
75
Array s
76
Array s
77
Array s
v1 = (/ 1, 2, 3, 4, 5/)
v2 = (/ (i, i= 10, 6, -1) /)
mat1 = RESHAPE ( (/ 1, 2, 3, 4, 5, 6/) , (/2,3/) )
Tambin se pueden inicializar arrays usando bucles DO iterativos.
Por ejemplo, sean las declaraciones de arrays:
INTEGER :: i,j,k=0
INTEGER, DIMENSION (5) :: v1,v2
INTEGER, DIMENSION (2,3) :: mat1
DO i=1,5
v1(i)=i
END DO
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
Tambin es posible inicializar todos los elementos de un array a un
valor nico con una simple sentencia de asignacin.
Ejemplo:
INTEGER, DIMENSION (100) :: v1
INTEGER, DIMENSION (2,3) :: mat
v1=0
mat=0
DO i=1,TM
WRITE (*,*) DAME ELEMENTO,i,DE v1 Y v2
READ (*,*) v1(i),v2(i)
END DO
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.
Tambin se puede leer un array usando bucles DO implcitos. La
sintaxis general de lectura con un bucle implcito es:
READ (*,*) (arg1[, arg2] , ndice = inicio, fin [, paso])
arg1 y los dems argumentos, si los hay, son los argumentos que se
van a leer.
El ndice del bucle y los parmetros del mismo funcionan
exactamente igual que en el caso de los bucles DO iterativos
estudiados en la seccin 3.2.
Ejemplos:
INTEGER, DIMENSION (5) :: w
INTEGER, DIMENSION (0:3,2) :: m
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 lnea 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
[ELSEWHERE [nombre]
bloque n de sentencia(s) de asignacin de arrays]
END WHERE [nombre]
Expresin mscara es un array lgico del mismo perfil que los
arrays manipulados en las sentencias de asignacin de arrays de los
bloques.
Puede haber cualquier nmero de clusulas ELSEWHERE con
mscara y, a lo sumo, una clusula ELSEWHERE.
Su funcionamiento es el siguiente:
Se aplica la operacin o conjunto de operaciones del bloque
1 a todos los elementos del array para los cuales la expresin
mscara 1 es cierta.
Se aplica la operacin o conjunto de operaciones del bloque
2 a todos los elementos del array para los cuales la expresin
mscara 1 es falsa y la expresin mscara 2 es cierta.
Se repite el razonamiento anterior para todas las clusulas
ELSEWHERE con mscara que haya.
Finalmente, se aplica la operacin o conjunto de operaciones
del bloque n a todos los elementos del array para los cuales
todas las expresiones mscara anteriores han sido falsas.
Ejemplo. Calcular la raz cuadrada de los elementos positivos de un
array. Poner un cero en el resto de los elementos.
REAL, DIMENSION (5,4) :: mati,matf
WHERE (mati>0)
matf=SQRT(mati)
ELSEWHERE
matf=0
END WHERE
La expresin mscara mati>0 produce un array lgico cuyos elementos
son cierto cuando los elementos correspondientes de mati son
positivos y falso cuando los elementos correspondientes de mati son
negativos o cero.
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 cin 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 funcin.
107
Procedimientos
5.2 Funciones
Hay dos tipos de funciones:
Intrnsecas : todas aquellas funciones que suministra el
propio lenguaje (ya comentadas en el captulo 1).
definidas por el propio programador o subprogramas
funcin : procedimientos que permiten responder a
necesidades particulares del usuario, no proporcionadas por
las funciones intrnsecas.
Las funciones definidas por el programador se usan igual que las
funciones intrnsecas, pueden formar parte de expresiones, y por lo
tanto, pueden aparecer en todos aquellos lugares donde se puede
usar una expresin. Su resultado es un valor numrico, lgico,
cadena de caracteres o array.
La estructura general de un procedimiento funcin es:
Cabecera de funcin
Seccin de especificaciones
Seccin de ejecucin
Terminacin de la funcin
A continuacin, se explica en detalle la estructura anterior.
La sintaxis general de la cabecera de funcin 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
funcin.
TIPO es cualquier tipo Fortran vlido relativo a
nombre_funcion. Si no aparece TIPO en la cabecera de la
funcin, se debe especificar en la seccin de
especificaciones.
nombre_funcion es cualquier identificador Fortran vlido.
Lista de argumentos formales es una lista (puede ser vaca)
de constantes, variables, arrays o expresiones, separados por
comas. Se emplean para pasar informacin 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 clcu 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 ms generales que las funciones, aunque
comparten casi todas sus caractersticas. Pueden retornar ms de un
valor, o no retornar nada en absoluto. Reciben los valores de
entrada y devuelven los valores de salida a travs de su lista de
argumentos.
La estructura general de una subrutina es idntica a la de una
funcin:
111
Procedimientos
Cabecera de subrutina
Seccin de especificaciones
Seccin ejecutable
Terminacin 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 terminacin de subrutina es:
END SUBROUTINE [nombre_subrutina]
La seccin de especificaciones incluye la declaracin de los tipos
de los argumentos formales con su atributo INTENT
correspondiente a su intencin 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 ejecucin de la llamada ocurre de la siguiente manera:
Se evalan los argumentos actuales que son expresiones.
Se asocian los argumentos actuales con sus correspondientes
argumentos formales. El paso de los argumentos se realiza
por direccin.
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 ningn valor a travs de su
nombre, sino que son los argumentos los encargados de
realizar las transferencias de resultados.
Debe haber concordancia en el nmero, 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 vlidas desde un programa principal son:
112
Proced imien tos
PROGRAM principal
INTEGER :: g,m,s
REAL:: n,gd
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 nmero 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 ledo por teclado. Usar una funcin 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 FUNCIN 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 nmeros naturales y use una funcin lgica
para saber si ambos son cuadrones pares o no. A saber: dos
nmeros 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 in 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 intrnsecas lxicas 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 lxicas utilizan siempre el cdigo ASCII como base para
realizar las comparaciones, los operadores relacionales pueden
utilizar este cdigo o cualquier otro, segn el computador.
La comparacin entre cadenas se realiza de la siguiente manera:
Se comparan las dos cadenas carcter a carcter, comenzando
por el primer carcter (el que se encuentra ms a la
izquierda) y continuando hasta que se encuentra un carcter
distinto o hasta que finaliza la cadena.
Si se encuentran caracteres distintos, el operando que
contiene el carcter menor 8, ser considerado el operando
menor. Por tanto, el orden de los operandos viene marcado
por el primer carcter que difiere entre ambos operandos.
Si se alcanza el final de uno de los operandos y no hay
caracteres distintos, la ordenacin de las cadenas se har en
funcin de sus longitudes. As, si ambas cadenas tienen la
misma longitud, las cadenas son iguales, mientras que si las
cadenas tienen longitudes diferentes, la comparacin
contina como si la cadena ms corta estuviera rellena de
blancos hasta la longitud de la cadena ms larga.
Ejemplo. Sean las declaraciones:
CHARACTER (len=15):: pal1,pal2
8
Un car cter es me nor qu e o tro si la po sicin qu e o cupa el p r imero en el cd 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=Begoa
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 LMNOPQR 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 carcter especifica formatos de N y M
156
Formatos y Archivos
SMBOLO SIGNIFICADO
c nmero de columna
m mnimo n de dgitos
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 smbolos 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 cientfico.
Si un nmero se quiere leer/escribir en formato cientfico con d
cifras decimales, la anchura de campo mnima w d+8, pues tal
nmero se representa 1.ddddESee y requiere como mnimo un
carcter para representar el signo (slo si es negativo), otro para la
parte entera del nmero, el punto decimal, los dos caracteres ES, el
signo del exponente y los dos dgitos del mismo.
La diferencia entre el formato exponencial y el cientfico para un
valor real dado con una anchura de campo dada es que en el
formato cientfico se representa una cifra significativa ms 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 tf ico
161
Formatos y archivos
L5 .FALSE. F
L4 .TRUE. T
L1 .TRUE. T
L2 .FALSE. F
L5 T .TRUE.
L2 F1 .FALSE.
L4 XT 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 LEDO
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
168
Formatos y Archivos
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
BIBLIOGRAFA
181