PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N
.c

O W
w
.d o
c u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Introdu¸˜o ao Fortran 90/95 ca

Apostila preparada para a disciplina de Modelos Computacionais da F´ ısica I, ministrada para o Curso de Licenciatura em F´ ısica do Departamento de F´ ısica, Instituto de F´ ısica e Matem´tica, Funda¸˜o Universidade a ca Federal de Pelotas, Pelotas - RS.

In´ ıcio: Janeiro de 2005.

Vers˜o: 24 de fevereiro de 2009 a

o

m

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N
.c

O W
w
.d o
c u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

o

m

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N
.c

O W
w
.d o
c u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Sum´rio a
Referˆncias Bibliogr´ficas e a 1 Introdu¸˜o ca 1.1 As origens da Linguagem Fortran . . . . . . . . . . 1.2 O padr˜o Fortran 90 . . . . . . . . . . . . . . . . . a 1.2.1 Recursos novos do Fortran 90 . . . . . . . . 1.2.2 Recursos em obsolescˆncia do Fortran 90 . e 1.2.3 Recursos removidos do Fortran 90 . . . . . 1.3 Uma revis˜o menor: Fortran 95 . . . . . . . . . . . a 1.3.1 Recursos novos do Fortran 95 . . . . . . . . 1.3.2 Recursos em obsolescˆncia do Fortran 95 . e 1.3.3 Recursos removidos do Fortran 95 . . . . . 1.4 O Fortran no S´culo XXI: Fortran 2003 . . . . . . e 1.4.1 Recursos novos do Fortran 2003 . . . . . . . 1.4.2 Recursos em obsolescˆncia do Fortran 2003 e 1.4.3 Recursos removidos do Fortran 2003 . . . . 1.5 O novo padr˜o: Fortran 2008 . . . . . . . . . . . . a 1.5.1 Recursos novos do Fortran 2008 . . . . . . . 1.6 Coment´rios sobre a bibliografia . . . . . . . . . . a 1.7 Agradecimentos . . . . . . . . . . . . . . . . . . . . 2 Formato do C´digo-Fonte o 2.1 Formato do programa-fonte . . 2.2 Nomes em Fortran 90/95 . . . 2.3 Entrada e sa´ padr˜es . . . . ıda o 2.4 Conjunto de caracteres aceitos v 1 1 2 3 3 4 4 4 5 5 6 6 6 7 7 7 8 8 9 9 11 11 12 13 13 14 14 15 15 17 17 17 17 18 18 19 21 22 22 22 23 23

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Tipos de Vari´veis a 3.1 Declara¸˜o de tipo de vari´vel . . . . . . . . . . ca a 3.2 Vari´veis do tipo INTEGER . . . . . . . . . . . . a 3.3 Vari´veis do tipo REAL . . . . . . . . . . . . . . a 3.4 Vari´veis do tipo COMPLEX . . . . . . . . . . . . a 3.5 Vari´veis do tipo CHARACTER . . . . . . . . . . . a 3.6 Vari´veis do tipo LOGICAL . . . . . . . . . . . . a 3.7 O conceito de esp´cie (kind) . . . . . . . . . . . e 3.7.1 Fortran 77 . . . . . . . . . . . . . . . . . 3.7.2 Fortran 90/95 . . . . . . . . . . . . . . . 3.7.2.1 Compilador Intel® Fortran 3.7.2.2 Compilador gfortran . . . . . 3.7.2.3 Compilador F . . . . . . . . . . 3.7.2.4 Literais de diferentes esp´cies . e 3.7.3 Fun¸˜es intr´ co ınsecas associadas ` esp´cie a e 3.7.3.1 KIND(X) . . . . . . . . . . . . 3.7.3.2 SELECTED_REAL_KIND(P,R) . . 3.7.3.3 SELECTED_INT_KIND(R) . . . . 3.8 Tipos derivados . . . . . . . . . . . . . . . . . . i

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

o

m

w
w

w
w

. . . 4. .6 Construtores de matrizes . . .2 Fun¸˜es de compara¸˜o l´xica . . . . . . . 5.1 A fun¸˜o intr´ ca ınseca RESHAPE. . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . . . . . .d o c u -tr a c k 4 Express˜es e Atribui¸˜es Escalares o co 4. . . . . . . . . .4 Atribui¸˜es de matrizes e sub-matrizes . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . .1 R´tulos (statement labels) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . . . . . . . . . . .8. . . a 6. . . . . . . . .6. . . . . . . . . . . . . . . . . . . . . . . . . .1 Regras b´sicas . . . .2 Fun¸˜es elementais que n˜o convertem . . 7. .3. . . . 6. . . . . . . . .1.4. . . . . . . . . . . . . . . . . . . . . . . . .2 Construto IF . .1 Categorias de rotinas intr´ ınsecas . . .6. . .2 Tripleto de subscritos . . . . . . . . . . . . . . . . . . . . co e 7. .10. .2 A ordem dos elementos de matrizes . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . . . . co e 4. . . . . . . . . . . . . . . . . . . . .2. . . . . . . .1 Subscritos simples . . . . . . . . . . . . . . . . . . .5 Matrizes de tamanho zero . . . . . . . . . . . . . . . . .4 Convers˜o l´gica . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Se¸˜es de matrizes . . . . . . . . . . . . . . . . . . . . .1. . . . . .10. . . . . . . . . . . . . . .4. . . . . . . . . . co a 7. .2 Express˜es e atribui¸˜es envolvendo matrizes . . .2 Instru¸˜o EXIT . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . 6. . . .3 Construto CASE . . . . . .3 Vetores de subscritos . . . . . . . 5. . . . . . . . . . .6. . . . . . . . . . . .1 Comando WHERE . . . . . . . . .6 Express˜es e atribui¸˜es de caracteres escalares o co 5 Comandos e Construtos de Controle de Fluxo 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . 5. . . . . . . . .3 Fun¸˜es elementais para manipula¸˜es de strings co co 7. . . . . . . . . . . . . . c 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a o Autor: Rudi Gaelzer – IFM/UFPel . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Comando e construto IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co ca e 7. . . . . . . . .1 Construto DO ilimitado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Impresso: 24 de fevereiro de 2009 o m ii ´ SUMARIO k lic lic k to bu y N O W ! w w w w . . . . . . . . . . . . . . . . . . . . . . . o co 6. . . . . . . . . . ıdo 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Processamento de Matrizes 6. . . . . . . . . . . . . . .c . . . . . . . . . . . . .8. o co o 4. . . . . . . . . . . . . . . . .6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .d o c u -tr a c k . . . . . . . . . . . . . . . . .4. .3 Comando GO TO computado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Terminologia e especifica¸˜es de matrizes . . . . co 7. . . . . .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Construto DO . . . . co 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Atribui¸˜es num´ricas escalares . . . . . . . . . . . 5. . . . . . . . . . . . . . . . . . . . . o 7.6. . . . . . . . .1 Comando IF . . . .10 Comando e construto FORALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Instru¸˜o CYCLE . . . . . . . . . . . . . . . . . . . .2 Construto FORALL . . . . . . co a 7. . . . . . . . . . . . . . . . .8 Comando e construto WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Fun¸˜es elementais matem´ticas . . .4 Comando IF aritm´tico . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Express˜es num´ricas escalares . . 27 27 28 29 30 30 32 35 35 35 36 36 36 37 37 38 38 38 39 41 43 43 44 47 47 51 53 54 54 54 55 55 57 58 58 59 59 59 60 61 64 64 64 67 67 67 68 68 68 69 69 70 70 70 71 71 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 La¸os DO rotulados . . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Fun¸˜es elementais l´gicas e de caracteres . . . . . . . . . . . . . . .c w o . . . . . . . . .5 Comandos ASSIGN e GO TO atribu´ . . 6. . . . . . . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . e 5. . . . 5. . . . . .9 Matrizes aloc´veis . . . . . .5 Express˜es e atribui¸˜es l´gicas escalares . . . . . . . . . . . . . co 6. . . . . . . . . . . . . . . . 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Comandos obsoletos do Fortran 77 . .2 Comando GO TO incondicional . . . . 5. . . . . . ca 5. . . . . . . . . . . . . . . 5. . . . co o 7. . . . . . . . . . . . . . . . . .2 Declara¸˜o e atributo INTRINSIC . . . . . 7 Rotinas Intr´ ınsecas 7. . . . . . . . . . . . . . . . . . . . . . . . . . a 4. . .1. ca 7. . . . . . . . . . . . . .1 Convers˜es caractere-inteiro .4 Operadores relacionais . . . . . . . . o e 4. . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . . .1. . . o 5. . . . . . . . . . . . . . .4. . .2. . . . . . . . . . . . . . . . . . . . . .3 Fun¸˜es inquisidoras de qualquer tipo . . . . . . . .7 Rotinas intr´ ınsecas elementais aplic´veis a matrizes a 6. . 5. . . . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . . ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Comando FORALL . .4 Fun¸˜es elementais num´ricas .1 Fun¸˜es elementais que podem converter . . . . . . . . . .2 Construto WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 6.1. . . . . . . . . . . . . . . . . . . . . . . . . . . 6. . . . . . . . . . . . . . . . . . . . . . . co 6. . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .17 Fun¸˜es n˜o-elementais para manipula¸˜o de strings . . 8. .10 7. . . co a ca 7. .15 7. . . . . 81 . . . . . . . .5 Atributo e declara¸˜o INTENT . . . . . . .13. . . . . . . . . . . . . . . . . . . . .2. . . . . 7. . . . . . . . . . . co c˜ Fun¸˜es transformacionais que reduzem matrizes . . . . . . . . . . . . .1 Status de aloca¸˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .c 7. . . . . . . .1. . . . . . . . . . . 88 . . co e 7. . . . . . .6 Transposta de uma matriz . . . . . . . . . . . . . Fun¸˜es de constru¸˜o e manipula¸˜o de matrizes . . .17. . .1 Matrizes como argumentos em Fortran 77 . . . . . . . . . . . . . ca 7. .4 Comando RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Fun¸˜o transformacional para duplica¸˜o . . . . .d o c u -tr a c k . . . . co 7. .8. . . . . 7. . . 85 . . . . . . . . . 8. . . . . . . . 83 . . . . . . . . . . . . . . . . . .1 Rel´gio de tempo real . .8. . . . . . . .2 sub-programas . . . . . . . . . . . . . . . . . . 86 . . . . . . . . . . . . . . . co 7. . .9 7. .12. . . . . . . . 8.9. . . . . . . . . .2. . . . . 7. . . . . . .14. . . .3 Alterando a forma de uma matriz . 8. . . . . . .2.2. . . . . . ´ 7. . . . . . . . . . . . . .9. . . . . . .2. . . . . 83 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12. . 8. .14. .2. . . . . . . . .2 Rotinas internas . . . . . . . . . . . . . . . . . . . . . . . .11. . .3 N´meros aleat´rios . . . . . . . . . 7.1 Unidades de programa . . . . . . . . . . . . . .12 sub-programas como argumentos de rotinas . . . . . . . . . . . . o 7. . 8. . . . . . co 7. . . . . . . . . . . . . . . . . . . . . . . 8. . . . . . . . . . . . . . . . . . 71 71 71 72 72 72 73 73 73 74 74 75 75 75 75 75 76 76 76 76 76 77 77 77 77 78 78 78 78 78 79 79 79 79 8 Sub-Programas e M´dulos o 8. . . . . co 8. . . . . . . . . . . .2 Fun¸˜es elementais . . . . . . . . . . . . . . . . . . . . . . . . .2 Limites. . . . . . . . . . . . . . . . . . . . .17. . .17. a 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Fun¸˜es num´ricas inquisidoras .1. . . . . . 99 .12 7. .11 7. .14. . . . . . .2. . . . . . . . .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . . . . . . . . . . . . . . . . . . . .1 Caso de argumento unico . 8. . . . . . . . .14. . . . . . . . . . . . . . . . . . . . . . . .1 Fun¸˜o inquisidora para manipula¸˜o de strings . . . . . . . . . . . . . . . . 8. . . . . . . . .14 Recursividade e rotinas recursivas . . . . . . . . .2 Tempo da CPU . . . . . . . . . . . . . .7. . . . . . . . . . . . . . . . . . . . . . .9. . . . . .4 Fun¸˜es transformacionais para valores de esp´cie (kind) co e Rotinas de manipula¸˜o de bits . . . . . . . . . . . . . . . .6 Rotinas externas e bibliotecas . . . . . . . . . . . . . ca ca 7. . . . . . . . . . . . . . . co co e 7. . . . . . . . . . . co 7. . . . . . . . 8. . 94 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co ca e Fun¸˜o transformacional para dissocia¸˜o de ponteiro . 88 . . . . .d o c u -tr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Rotinas externas . . . . . . . . . . . .2 Argumento opcional DIM . . . . 83 . . . . . . . . . . . . . . . . . . . .1 Modelos para dados inteiros e reais . . . . . . . . . .1 Programa principal . . . . . . ack c w o . . . . . . . . . . .11 Matrizes como argumentos de rotinas . . . Fun¸˜es transformacionais para localiza¸˜o geom´trica . . . . . . . . . . . . . . . . . . . . .2 Agrupando e desagrupando matrizes . . . 8. . . . 105 Impresso: 24 de fevereiro de 2009 o m ´ SUMARIO iii k lic lic k to bu y N O W ! w w w w . . . . . . . . .11. . . . . . . . . . . . . . . . . . . . . 8. . . . . . . . . . . . . . . . . . . . . . . . . . 86 . . . . . . u o . . . . .14. . . . . . . . . . . co ca ca 7. .8. . . . . . . . . 8. . . . . . . . . . . . . .8 Argumentos com palavras-chave . . . . . . . . . . . . . . . . . . . . . . . . . . Fun¸˜es inquisidoras de matrizes . . . . . . . . . 8. . . . . . . . . . . . .2.2 Fun¸˜es transformacionais para manipula¸˜o de strings co ca Fun¸˜es inquisidoras e de manipula¸˜es num´ricas . . . .15 Atributo e declara¸˜o SAVE . . . . . . . . . . . . . . . . . . . . ca 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 7.1. .2. . . . . . . . . forma e tamanho . . . . . . . . .9 Argumentos opcionais . .2. . . . . . . .13 Fun¸˜es de valor matricial . . . . . . . . . . . . . . ca 7. . . . . . . . . . . . . . . . . 93 . . . . . . . 81 . . . . . . . . . . . . . . ca Autor: Rudi Gaelzer – IFM/UFPel . . . . . . . . .3 Argumentos de sub-programas . . . . . .7. . . . . . . . . . . . . .5 Fun¸˜es de deslocamento matricial .3 M´dulos . . 100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Tipos derivados como argumentos de rotinas . . . . . . . . . . . . . . . . ca ca Subrotinas intr´ ınsecas n˜o-elementais . . . . . . .3 Fun¸˜es elementais que manipulam quantidades reais . . . . . . ca ca 7. . . . . 94 . .8. . . . . . . . . . . . . . . . . . . . . . o 8. . . . . . 7. . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . 8. . . . . . . .1 Fun¸˜o elemental MERGE . . . 85 . . . . . . . .2. . . .14. . . . .16 7. . . .1 Fun¸˜es e subrotinas . . ca 7. . . . . . . . . . . . . . . . . . . . . . . . . . .7 Interfaces impl´ ıcitas e expl´ ıcitas . . . . . . ca 8. . . . . . . . . . .3 Argumento opcional MASK . . . . .12. . . . . . . . 83 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Matrizes como argumentos em Fortran 90/95 8. . . . . . . . . . . . . 96 . . . . .7 7. . . 103 . . . . . .13. . . . . . . . . . . . . . . . . . . . . . .14 7. . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fun¸˜o de transferˆncia . . . 94 . . . . . . . . . 81 . . . co 8. . .2. . . . . . . . . 8. .2. . . . . . . . . . . . . . . . . . . . . .8 7. . . . . . . . . . . . . . . . .3 Subrotina elemental .2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 . . . . . . . . . . . co 7. . . . . . . . . . . . . .1 Fun¸˜o inquisidora . . .2. . . . . . . . . . . . . . ca e Fun¸˜es de multiplica¸ao vetorial ou matricial . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .10 Comando INQUIRE . . . . .1 Ambito dos r´tulos . . . . . . ca 9. . . . . . . . . . . . . . . . . . . . . . . . . . . .4 8. . . . . . . 9. . . . . .3. . . . . .4 Descritores de edi¸˜o de strings . . . . . . . . ca 9. . . . . . .17 Rotinas elementais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Comando REWIND . . . . . . . . . . . . . . . . .3 Comando ENDFILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . .8 Descritores de edi¸˜o . . . . . . 9. . . ca 9. . . . . . . . . . . . 9. . . . . . . . . . . .5 Comando READ . . . . . . . . . . . . . 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Comandos PRINT e WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 9. . . . . . . . . . . . . . . . . . .3 Unidades l´gicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 8. . . . . . . . 9. . . . . . . . . . . . 9. . . . . . . . . . . . . . . . . .3 Atributos e declara¸˜es PUBLIC e PRIVATE . . . . . . . . . . . . . . . . . . . 8. . M´dulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . .c w o . . .1 Dados globais . . .11. . . . . . . . ca 9. . ˆ 8. . . . . . . . . . . . . . . . . .1 Comando BACKSPACE . . . . . . . . . . . . . . . . . . . . . . . . .2 Ambito dos nomes . . . .7 Comando FORMAT e especificador FMT= .9 Comando CLOSE . .2 Descritores de edi¸˜o de dados . . . . . . . . . . . . . . . . . . . . .4 Interfaces e rotinas gen´ricas . . . . . . . . . . . . . . . . . . . . . . . . . .2 Declara¸˜o NAMELIST . . . . . . .3. . . . . . . . . .3. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m iv ´ SUMARIO k lic lic k to bu y N O W ! w w w w .3 8. . . . . . . . . . . . . . . . . . . . . o 8. . . . . . . . . . . . . . . . . . . e 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 Fun¸˜es de efeito lateral e rotinas puras . . 106 108 109 110 113 115 116 120 120 120 121 123 123 127 131 131 134 135 136 137 137 138 141 147 148 148 151 151 151 151 9 Comandos de Entrada/Sa´ de Dados ıda 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . .8. . . . . . . . . . .11. . . . . . . . . . . . . . . . . . . . . .c 8. . . . . . . .8. . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11. . . . . . o ˆ 8. . ca 9. .2 Rotinas de m´dulos . . . . . . . . . . . . . . .8. . . . . . . . . . . . . . . . . . . . .2.d o c u -tr a c k . . . . . . . . .1 Comandos de Entrada/Sa´ ıda: introdu¸˜o r´pida ca a 9. . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . .1 Contadores de repeti¸˜o .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . . . . . . . . . . . . . . . . . . . .5 Estendendo rotinas intr´ ınsecas via blocos de interface gen´ricos e ˆ Ambito (Scope) . . . . . . . .4 Comando OPEN . . . . . . . . .d o c u -tr a c k . . . . . . . . . . . . . . . . . . . . . . . . o 8. . . . . . . . . . 9. . . . . . . . . . . . . . . . . . . . 9. . . . . . . .3 Descritores de controle de edi¸˜o . . . ca 9. . . . . . . . . . . . . . . . . . . . .11 Outros comandos de posicionamento . . . . . . . .8. . . . co 8. . . . . . .

. [4] PAGE. Fortran 90 Course Notes.intel. Acesso em: 01 jun. A Conversion Course for Fortran 77 Programmers. [3] METCALF. 2001.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . 1996.d o c u -tr a c k ! w o . [2] MARSHALL. MICHAEL. F. [5] RAMSDEN. NOLAND. New York : Oxford University Press.uk/HPC/HTMLFrontPageF90. 2005. Acesso em: 01 jun. A..ac. tran/john reid new 2003. PETTIPHER. 345 + xv pp. The New Features of Fortran 2003.com/software/products/compilers/flin/docs/manuals. LIN. C. http://www. S.pdf. Acesso em: 01 jun.html.uk/kis/support/cit/for- v o m w w w w .ac. Fortran 90. http://www. M. 2004.d o c u -tr a c k . S.pdf.uk/ cgp/prof77. Leicester. G. 2005. CLIVE G. JOHN. REID.uk/hpctec/courses/Fortran90/F90course. http://www..html..c O W w .ac. JOHN. M.star. [6] REID.kcl.htm. 2005. Acesso em: 03 Jun. J. BROOKE.hpctec.ac. 1995. http://www. A. 2006.le. http://www. Professional Programer’s Guide to Fortran77.c Referˆncias Bibliogr´ficas e a [1] Intel® Fortran Compiler for Linux. Acesso em: 01 jun.liv. 2005. Fortran 90/95 Explained.mcc. 1996.

c w o .d o c u -tr a c k .c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m vi ˆ ´ REFERENCIAS BIBLIOGRAFICAS k lic lic k to bu y N O W ! w w w w .d o c u -tr a c k .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .

Inevitavelmente. ca a computadores se tornaram acess´ ıveis a qualquer cientista ou engenheiro disposto a devotar um pequeno esfor¸o c na aquisi¸˜o de um conhecimento b´sico em Fortran. embora esta forma de programa¸˜o possibilitasse um uso a ca otimizado dos recursos da CPU.c O W w . ou em outro qualquer. Com o tempo. registradores. engenharia. a Associa¸˜o Americana de Padr˜es (American Standards o ca o Association). era uma subconjunto comum de v´rios dialetos. mas que gerasse um c´digo num´rico quase t˜o eficiente quanto a linguagem Assembler. liderados por John Backus. ap´s quatro anos de trabalho. Durante o co os anos 50 ficou claro que esta forma de programa¸˜o era de todo inconveniente. ca 1.1 As origens da Linguagem Fortran Programa¸˜o no per´ ca ıodo inicial do uso de computadores para a solu¸˜o de problemas em f´ ca ısica. c´digos mnemˆo ca e o o o nicos foram introduzidos. posteriormente Instituto Americano Nacional de Padr˜es (American National Standards Institute. os quais levaram a problemas quando havia necessidade de se trocar programas entre diferentes computadores. a tarefa da programa¸˜o n˜o estava mais restrita a um ca a ca a corpus pequeno de programadores especialistas.. Assim. com somente o uma pequena perda de eficiˆncia no processamento. assim concentrando-se mais na solu¸˜o do problema em quest˜o. Programaa a e dores necessitavam de um conhecimento detalhado das instru¸˜es. matem´tica e outras ´reas da ciˆncia era um processo complexo e tedioso ao extremo. O dialeto de Fortran otimizado para processadores fabricados pela IBM. Seu objetivo era produzir uma linguagem que fosse simples de ser entendida e usada.” John Backus Esta apostila destina-se ao aprendizado da Linguagem de Programa¸˜o Fortran 95. engenharia e matem´tica. de tal forma que cada dialeto poderia a 1 Do inglˆs: Central Processing Unit.d o c u -tr a c k . dialetos da linguagem foram desenvolvidos. em 1966.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . no programa que se encarrega de traduzir o c´digo-fonte em Fortran para c´digo Assembler e o o ou octal. uma vez que todo cuidado era dedicado na constru¸˜o do e ca compilador. no m´ ca ınimo. Mais importante ainda. ca o e o Estes c´digos eram traduzidos em instru¸˜es para a CPU por programas conhecidos como Assemblers. endere¸os de mem´ria e outros co c o constituintes da Unidade Central de Processamento (CPU1 ) do computador para o qual eles escreviam o c´digo. uma a vez que satisfazia uma necessidade premente dos cientistas. denominada FORTRAN (significando FORmula TRANslation). o O C´digo-Fonte era escrito em um nota¸˜o num´rica denominada c´digo octal. Mas o Fortran foi um passo revolucion´rio tamb´m porque o programadores foram aliviados da tarefa tediosa a e de usar Assembler. por exemplo. devido ao tempo necess´rio para se escrever e testar um programa. qu´ ımica. o ou ANSI) originou o primeiro padr˜o para uma linguagem de programa¸˜o.d o c u -tr a c k ! w o . desenvolvessem uma das primeiras chamadas linguagem de alto-n´ ıvel. agora conhecido como Fortran a ca 66. Estas dificuldades motivaram que um time de programadores da IBM. uma forma de programa¸˜o conhecida como c´digo num´rico ou c´digo Assembler. O Fortran disseminou-se rapidamente. Essencialmente. principalmente nas ´reas da f´ a ısica.. Desde o in´ o e a ıcio.c Cap´ ıtulo 1 Introdu¸˜o ca ”I don’t know what the technical characteristics of the standard language for scientific and engineering computation in the year 2000 will be. Isto permitiu que programas fossem escritos mais rapidamente que antes. isto ´. o Fortran era t˜o simples de ser usado que era poss´ programar f´rmulas matem´ticas quase como se estas fossem escritas a ıvel o a de forma simb´lica. e 1 o m w w w w . geralmente gerava erro quando se tentava rodar o mesmo programa em um processador Burroughs. but I know it will be called Fortran.

uma linguagem que permanecia pr´xima (e ca o o explorava) o hardware dispon´ ıvel.2 O padr˜o Fortran 90 a Ap´s trinta anos de existˆncia. com muitos programas em uso freq¨ente. ca Ada. o Fortran 90 ´ muito mais um desenvolvimento da linguagem. havia a necessidade de fornecer uma alternativa ` perigosa associa¸˜o de armazenagem a ca de dados. Para levar a cabo mais uma moderniza¸˜o da linguagem. o c´digo fonte permitia espa¸os em branco na sua sintaxe. a a 1. Com base nestas. e agora como Fortran a 90. O per´ o ıodo de transi¸˜o entre o Fortran 66 e o Fortran 77 foi muito mais longo que deveria. Era. Estes eram ca ca u e programas que eram capazes de ler o c´digo fonte de algum dialeto bem definido de Fortran e gerar um segundo o arquivo com o texto no padr˜o. tais como a falta de constru¸˜es ca e co estruturadas de programa¸˜o. o comitˆ t´cca e e nico X3J3. o c´digo gerado era muitas vezes de uma dificuldade proibitiva para a leitura direta. A prolifera¸˜o de dialetos permaneceu um problema mesmo ap´s a publica¸˜o do padr˜o Fortran 66. de forma distinta dos padr˜es pr´vios. t´cnicas e de engenharia. Para proteger o investimento em Fortran 77. a possibilidade dos programadores controlarem a aloca¸˜o da e co ca armazenagem de dados de uma forma simples. podendo ser compilados em diferentes e a computadores. ack c w o . preparou um novo padr˜o. que se estendeu at´ meados da d´cada de 80. Pascal. uma vez que o padr˜o n˜o as incluiu na sua sintaxe. foram adotadas em seu lugar. os quais resultaram quase inteiramente de um esfor¸o o e c de padronizar pr´ticas existentes. combinada com a existˆncia de falhas evidentes na linguagem. onde elas se mostraram mais adequadas para um tipo particular de aplica¸˜o. diversas extens˜es n˜o o o a foram mais permitidas. de abolir a rigidez agora desnecess´ria do formato fixo de fonte. Eventualmente. e e atrav´s das declara¸˜es COMMON e EQUIVALENCE. devido aos ca atrasos na elabora¸˜o de novas vers˜es dos compiladores e os dois padr˜es coexistiram durante um intervalo de ca o o tempo consider´vel. mas que eram ignorados pelo padr˜o. em a a ca diversos compiladores. na qual s˜o a e a introduzidos recursos que s˜o novos em Fortran.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . todo o padr˜o anterior foi mantido como um ca a subconjunto do Fortran 90. Na mesma linha. o X3J3 podia usar os ´bvios benef´ o ıcios de conceitos tais como ocultamento de dados. Este recurso provia a a uma maneira de estender o Fortran. A segunda foi a implementa¸˜o. portanto. C e C++. mas baseados em experiˆncias em outras linguagens. que a comunidade eso o a tivesse completamente satisfeita com a linguagem. Organiza¸˜o Internacional de Padr˜es) ISO/IEC JTC1/SC22/WG5 (doravante conheca o cido como WG5). ao mesmo tempo retendo a sua portabilidade. havia a necessidade de moderniza¸˜o. alguns o u com centenas de milhares ou milh˜es de linhas de c´digo. Quais eram as justificativas para continuar com o processo de revis˜o do padr˜o da linguagem Fortran? Al´m a a e de padronizar extens˜es comerciais. Diferentes compiladores implementavam estes recursos de formas distintas. um recurso que era necess´rio nos prim´rdios da computa¸˜o. em resposta aos desenvolvimentos nos o ca conceitos de linguagens de programa¸˜o que eram explorados em outras linguagens tais como APL. uma vez que o Fortran 77 permitia este c´digo antigo por compatibilidade. de recursos que eram essenciais para programas de grande escala. A superioridade do Fortran ca sempre esteve na ´rea de aplica¸˜es num´ricas. o que n˜o impediu o uso de programas escritos em Fortran a a a 66. Fortran n˜o mais era a unica linguagem de programa¸˜o dispon´ o e a ´ ca ıvel para os programadores. novas linguagens foram desenvolvidas e. Ela tamb´m introduziu.2. em 1978. a Esta situa¸˜o. Ao longo do tempo. Algol. por exemplo. contudo. os fabricantes de compiladores a e e passaram a liber´-los somente com o novo padr˜o. O problema era que embora os programas gerados com o uso de um pr´-processador fossem port´veis. mesmo que estas declara¸˜es sejam agora consideradas potencialmente c o co perigosas e o seu uso desencorajado. A comunidade de usu´rios e a do Fortran realizou um investimento gigantesco em c´digos. Contudo. a o ca quando havia pouco espa¸o de mem´ria. n˜o um subconjunto comum de dialetos existentes. cient´ a co e ıficas. bem como de aumentar a seguran¸a a c na programa¸˜o.d o c u -tr . o qual ent˜o era apresentado ao compilador nesta forma. Isto n˜o significava. Aqueles usu´rios que desejavam escrever programas port´veis a a a a deveriam evitar as extens˜es e restringir-se ao padr˜o. Finalmente. C e C++. inicialmente conhecido como Fortran 8x. mas sim um novo dialeto por a si s´.d o c u -tr a c k . ao inv´s de ser um conjunto de conceitos abstratos. Contudo. resultaram na introdu¸˜o de um grande n´mero de pr´-processadores. A ca o ca a primeira dificuldade foi que muitos compiladores n˜o aderiram ao padr˜o.c ser reconhecido como uma extens˜o do padr˜o. V´rios programadores passaram a migrar seus c´digos para a o linguagens tais como Pascal. Os recursos a e novos mais significativos s˜o a habilidade de manipular matrizes usando uma nota¸˜o concisa mais poderosa e a a ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 2 1. O padr˜o Fortran 90 a k lic lic k to bu y N O W ! w w w w . o Estas dificuldades foram parcialmente removidas pela publica¸˜o de um novo padr˜o. Ele inclu´ diversos novos recursos que eram baseados em extens˜es comerciais ou pr´ıa o e processadores e era. conhecido ca a como Fortran 77. al´m de sua facilidade de aprendizagem combinada com a c e um enfoque em execu¸˜o eficiente de c´digo. trabalhando como o corpo de desenvolvimento do comitˆ da ISO (International e Standards Organization. aprovado pela ANSI. o a O Fortran trouxe consigo v´rios outros avan¸os. o c liberando o programador da tarefa de escrever c´digo em colunas rigidamente definidas e permitindo que o corpo o do programa fosse escrito da forma desejada e visualmente mais atrativa.

adequado para usar em um terminal. a ca o a 1. ˆ Recursos avan¸ados para computa¸˜o num´rica usando um conjunto de fun¸˜es inquisidoras num´ricas.d o c u -tr a c k . ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m Cap´ ıtulo 1. Isto implica. ca a a a ˆ Melhoramentos nos recursos de entrada/sa´ de dados. ca A primeira lista cont´m os recursos removidos (deleted features).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . na pr´tica. O primeiro destes recursos leva a uma simplifica¸˜o na escrita de muitos problemas matem´ticos e tamb´m torna o Fortran uma linguagem mais ca a e eficiente em supercomputadores. ˆ Novas estruturas de controle. ack c w o . permitindo o suporte a inteiros curtos. que para a a o Fortran ´ de cerca de cinco anos. mais de duas precis˜es para vari´veis reais e complexas e vari´veis l´gicas agrupadas. definidos pelo programador. O Fortran 77 continua sendo suportado como um subconjunto durante um per´ ıodo de adapta¸˜o. ˆ Opera¸˜es de matrizes. ıda ˆ V´rios novos subprogramas intr´ a ınsecos. se a unica a¸˜o e ca e ´ ca adotada pelo X3J3 fosse de adicionar novos recursos. matrizes aloc´veis e ponteiros). tais como SELECT CASE e uma nova forma para os la¸os DO. ˆ Exigˆncia que o compilador detecte o uso de constru¸˜es que n˜o se conformam com a linguagem ou que e co a estejam em obsolescˆncia. ca Os procedimentos de trabalho adotados pelo comitˆ X3J3 estabelecem um per´ e ıodo de aviso pr´vio antes que e qualquer recurso existente seja removido da linguagem. co ˆ Facilidades na defini¸˜o de coletˆneas denominadas m´dulos. e e tornando-se obsoletos). O segundo possibilita aos programadores a express˜o de seus problemas em a termos de tipos de dados que reproduzem exatamente os conceitos utilizados nas sua elabora¸˜es. A solu¸˜o finalmente adotada pelo comitˆ foi de publicar como uma apˆndice ca e e ao padr˜o um conjunto de duas listas mostrando quais os ´ a ıtens que foram removidos e quais s˜o os candidatos a para uma eventual remo¸˜o.c habilidade de definir e manipular tipos de dados definidos pelo programador.2. estes novos recursos contidos em Fortran 90 ir˜o assegurar que o padr˜o continue a ser bem a a sucedido e usado por um longo tempo. co ˆ Ponteiros.2. co 1. A necessidade de remo¸˜o de alguns recursos ´ evidente. sendo assim candidatos e a ` remo¸˜o na pr´xima revis˜o da linguagem. e ˆ desvio para uma declara¸˜o END IF a partir de um ponto fora de seu bloco. uteis para defini¸˜es globais de dados e para ca a o ´ co bibliotecas de subprogramas. um ciclo de revis˜o. c ˆ A habilidade de escrever subprogramas internos e subprogramas recursivos e de chamar subprogramas com argumentos opcionais. ˆ Aloca¸˜o dinˆmica de dados (matrizes autom´ticas.d o c u -tr . c ca e co e ˆ Parametriza¸˜o dos tipos intr´ ca ınsecos. com muitos ´ ıtens redundantes e sobrepostos. Introdu¸˜o ca 3 k lic lic k to bu y N O W ! w w w w . conjuntos de caracteres muito grandes. a linguagem se tornaria grotescamente ampla.1 Recursos novos do Fortran 90 Um resumo dos novos recursos ´ dado a seguir: e ˆ O Fortran 90 possui uma maneira para rotular alguns recursos antigos como em obsolescˆncia (isto ´. os quais s˜o considerados obsoletos e redundantes.2 Recursos em obsolescˆncia do Fortran 90 e Os recursos em obsolescˆncia do Fortran 90 s˜o: e a ˆ IF aritm´tico. e ˆ Um novo formato de fonte. o a a o ˆ Tipos de dados derivados. compostos por estruturas de dados arbitr´rias e de a opera¸˜es sobre estas estruturas. Todos juntos. A segunda lista cont´m os recursos em e e obsolescˆncia (obsolescent features).

que teve a sua vers˜o inicial a a lan¸ada no pr´prio ano de 1995. seguida por uma revis˜o de maior escala para o in´ dos anos 2000. tendo como linguagem de base o Fortran 90. os recursos do HPF constituem a as novidades mais importantes do Fortran 95. ou HPFF). O primeiro foi a continuidade na opera¸˜o dos dois comitˆs de regulaa ca e menta¸˜o do padr˜o da linguagem: o X3J3 e o WG5. mas que s˜o reconhecidas por um compilador HPF. havia a necessidade de incorporar a sintaxe nova desenvolvida pelo HPFF no novo padr˜o da linguagem. tornou-se a a necess´ria tamb´m a inclus˜o de elementos adicionais na sintaxe. 12. notou-se uma s´rie de erros e detalhes obscuros que demandavam c e repara¸˜es. 2. Esta vers˜o do a Fortran ficou conhecida como o Fortran de Alta Performance (High Performance Fortran. ˆ descritor de edi¸˜o H. As outras mudan¸as consistem em corre¸˜es. Todas estas mudan¸as foram inclu´ co c ıdas no novo padr˜o Fortran 95. ACM Fortran Forum. Contudo.3. declarados em obsolescˆncia no Fortran 90. Em rela¸˜o ao Fortran 90. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 4 1.2 c o O Fortran 95 ´ compat´ com o Fortran 90. o segundo desenvolvimento foi a cria¸˜o do F´rum Fortran ca a ca o de Alta Performance (High Performance Fortran Forum. ` A medida que os comitˆs X3J3 e WG5 trabalhavam. e a ıcio Esta revis˜o menor passou a ser denominada Fortran 95.3 90. este comunicavam-se regularmente com o HPFF. bem como finaliza¸˜o por uma declara¸˜o ou comando distintos ca ca ca de um CONTINUE ou de um END DO. June 1995. Uma revis˜o menor: Fortran 95 a k lic lic k to bu y N O W ! w w w w . ca c u -tr a c k . ˆ declara¸˜o ASSIGN e comando GO TO atribu´ ca ıdo. que s˜o vistas e o a a pelo Fortran 90 como coment´rios. A vers˜o final do HPF consiste em um conjunto de instru¸˜es a a co que cont´m o Fortran 90 como subconjunto. os comitˆs concordaram na estrat´gia de definir uma revis˜o menor no co e e a Fortran 90 para meados da d´cada de 90. As principais extens˜es est˜o na forma de diretivas. Commitee Draft.1 Recursos novos do Fortran 95 Os novos recursos do Fortran 95 est˜o discutidos ao longo desta apostila.4. dois significativos desenvolvimentos posteriores refeca a rentes ` linguagem Fortran ocorreram. Era e evidente que. esta lista permaneceu vazia para o Fortran e 1. v. Estas se tornaram prementes quando os novos compiladores de Fortran 90 co a foram lan¸ados no mercado e utilizados. para evitar o surgimento de dialetos divergentes de Fortran. n.3. ou HPF). Logo no inicio de suas delibera¸˜es. ˆ RETURN alternativo.c 1. a a o ˆ finaliza¸˜o compartilhada de blocos DO. De fato. exceto por uma pequena altera¸˜o na fun¸˜o intr´ e ıvel ca ca ınseca SIGN (se¸˜o 7.d o ˆ vari´veis reais e de dupla precis˜o nas express˜es de controle de um comando DO. clarifica¸˜es e c co co interpreta¸˜es do novo padr˜o. ˆ especificadores FORMAT atribu´ ıdos.d o c u -tr .2.3 Uma revis˜o menor: Fortran 95 a Seguindo a publica¸˜o do padr˜o Fortran 90 em 1991. uma vez que nem todos os recursos desejados a e a puderam ser acomodados simplesmente na forma de diretivas. ˆ comando PAUSE. a O HPFF teve como objetivo a defini¸˜o de um conjunto de extens˜es ao Fortran tais que permitissem a ca o constru¸˜o de c´digos port´veis quando se fizesse uso de computadores paralelos para a solu¸˜o de problemas ca o a ca envolvendo grandes conjuntos de dados que podem ser representados por matrizes regulares. May 1995. foram a ca introduzidos os seguintes recursos: ˆ Concordˆncia aprimorada com o padr˜o de aritm´tica de ponto flutuante bin´ria da IEEE (IEEE 754 ou a a e a IEC 559-1989).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . n˜o o Fortran 77. Recursos removidos do Fortran 90 Uma vez que Fortran 90 cont´m o Fortran 77 como subconjunto. 1.2) e a elimina¸˜o de recursos t´ ca ca ıpicos do Fortran 77. Os e detalhes do Fortran 95 foram finalizados em novembro de 1995 e o novo padr˜o ISO foi finalmente publicado a em outubro de 1996. ack c w o . 2 Fortran 95.

3 Recursos removidos do Fortran 95 Cinco recursos foram removidos do padr˜o da linguagem Fortran 95 e. co ˆ Extens˜o assumida de caracteres quando estas s˜o resultados de fun¸˜es.3. pouco ou nada foram e comentados ao longo desta Apostila. ca ˆ Rotinas (procedures) elementais (se¸˜o 8.4.17. co ˆ Subrotina intr´ ınseca CPU_TIME (se¸˜o 7. ˆ Desvio para uma declara¸˜o END IF a partir de um ponto fora do bloco.16). co co ˆ Fun¸˜es transformacionais (7. Introdu¸˜o ca 5 k lic lic k to bu y N O W ! w w w w .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .1 e 7. ca ˆ Extens˜es do construto WHERE (p´gina 60). a a ˆ Descritores de edi¸˜o com largura de campo m´ ca ınimo. c e ˆ Declara¸˜o ASSIGN e comando GO TO atribu´ e uso de um inteiro atribu´ por ASSIGN em uma declara¸˜o ca ıdo ıdo ca FORMAT.17). ca a ˆ Declara¸˜es DATA entre comandos execut´veis.2 Recursos em obsolescˆncia do Fortran 95 e Os recursos abaixo entraram na lista em obsolescˆncia do Fortran 95 e.2). ˆ Especifica¸˜o gen´rica na cl´usula END INTERFACE. ca ˆ Comando PAUSE. ˆ Formato fixo de fonte. portanto. ˆ Declara¸˜o de vari´vel de caractere na forma CHARACTER*.4. a a co 1.2.d o c u -tr . portanto.16). co a ˆ Fun¸˜es definidas em uma linha (statement functions).10). co ˆ Inicializa¸˜o de ponteiro e a fun¸˜o NULL (se¸˜o 7. ˆ Descritor de edi¸˜o H.3. ca ˆ Coment´rio na entrada de uma lista NAMELIST (p´gina 130). ˆ Comando GO TO computado. a ˆ ´ Indices de la¸os DO do tipo real (qualquer esp´cie). n˜o ser˜o mais aceitos por a a a compiladores que respeitam o padr˜o Fortran 95. ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m Cap´ ıtulo 1. o a ˆ Fun¸˜es especificadoras. ca e a c u -tr a c k .15). ack c w o .2).d o ˆ Rotinas (procedures) puras (se¸˜o 8.c 1. ca ca ca ˆ Inicializa¸˜o de componentes de tipo derivado (p´gina 25). FLOOR e SIGN (se¸˜es 7. ca a ˆ Fun¸˜es elementares CEILING.2. ca a a a ˆ Comando e construto FORALL (se¸˜o 6. ca ˆ Dealoca¸˜o autom´tica de matrizes aloc´veis (p´gina 63).

dkuug.d o c u -tr a c k . aperfei¸oamentos em ponteiros. o comando FLUSH.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a qual oferece uma ca maneira efetiva de separar a programa¸˜o de um c´digo grande e complexo em tarefas independentes e que ca o permite a constru¸˜o de novo c´digo baseado em rotinas j´ existentes e uma capacidade expandida de interface ca o a com a linguagem C.c O Fortran 2003 ´ novamente uma revis˜o grande do padr˜o anterior: Fortran 95. Os crit´rios para a e e inclus˜o nesta lista continuam sendo: recursos redundantes e para os quais m´todos melhores estavam dispon´ a e ıveis no Fortran 95. necess´ria para que os programadores em Fortran possam acessar rotinas escritas em C e a para que programadores de C possam acessar rotinas escritas em Fortran. e ˆ END DO compartilhado por dois ou mais la¸os e t´rmino de um la¸o em uma cl´usula distinta de END DO c e c a ou CONTINUE. especifica¸˜o expl´ a a ca ıcita de tipo em construtores de matrizes e declara¸˜es de aloca¸˜o. conco e a trole especificado pelo usu´rio para o arredondamento em declara¸˜es FORMAT.dk/jtc1/sc22/open/n3661. argumentos mudos aloc ca a c´veis. opera¸˜es de transferˆncia especificadas pelo usu´rio para tipos derivados. O Fortran no S´culo XXI: Fortran 2003 e k lic lic k to bu y N O W ! w w w w .2 Recursos em obsolescˆncia do Fortran 2003 e Nesta lista permanecem ´ ıtens que j´ estavam na lista de obsolescˆncia do Fortran 95. embora at´ a a a e o presente momento nenhum compilador apresenta suporte completo do novo padr˜o. polimorfismo ca a c (polymorphism). express˜es co ca c o de inicializa¸˜o estendidas e rotinas intr´ ca ınsecas aperfei¸oadas. c ˆ Suporte para programa¸˜o orientada a objeto: extens˜o de tipo e heran¸a (inheritance). constantes nomeadas para a co unidades pr´-conectadas.1 Recursos novos do Fortran 2003 Os principais recursos introduzidos pelo padr˜o s˜o: a a ˆ Aprimoramentos dos tipos derivados: tipos derivados parametrizados. anteriormente co a e a conhecido como padr˜o IEEE 754. regulariza¸˜o de palavras-chave e acesso a mensagens de erro. controle melhorado de acessibilidade. As grandes novidades a introduzidas foram: um direcionamento ainda maior para programa¸˜o orientada a objeto. construtores de estrutura aperfei¸oados e finalizadores. a ˆ Interoperabilidade com a linguagem de programa¸˜o C. limitando-se a list´-los. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 6 1. ca a ˆ Aperfei¸oamentos na manipula¸˜o de dados: componentes aloc´veis de estruturas.4. a 1. A lista dos ´ ıtens em obsolescˆncia do Fortran 2003 ´: e e ˆ IF aritm´tico. ca ˆ Suporte aperfei¸oado para internacionaliza¸˜o: acesso ao conjunto de caracteres de 4 bytes ISO 10646 c ca and escolha de v´ ırgula ou ponto como separador de parte inteira e parte decimal em opera¸˜es de E/S co num´ricas formatadas. parˆmetros de tipo deferidos (deferred type parameters). acesso de fluxo (stream access).4 O Fortran no S´culo XXI: Fortran 2003 e .4. ˆ RETURN alternativo. ack c w o 1. co 3 Ver o draft em: http://www. Esta Apostila n˜o ir´ abordar os novos recursos introduzidos pelo Fortran 2003. c ˆ Aperfei¸oamentos em opera¸˜es de Entrada/Sa´ (E/S) de dados: transferˆncia ass´ c co ıda e ıncrona.4. e ˆ Integra¸˜o aperfei¸oada com o sistema operacional hospedeiro: acesso a argumentos de linha de comando. atributo VOLATILE. e ca ˆ Ponteiros de rotinas (procedure pointers).pdf. ˆ Suporte para as exce¸˜es do padr˜o de aritm´tica bin´ria de ponto flutuante ISO/IEC 559. a a a 1.d o c u -tr . A vers˜o curta (draft) do e a a a novo padr˜o foi divulgada em finais de 20033 e tornou-se desde ent˜o o novo padr˜o da linguagem. ˆ Fun¸˜es definidas em uma linha (statement functions). ˆ Comando GO TO computado. aloca¸˜o dinˆmica de tipo e rotinas (procedures) ligadas a tipo. ca c vari´veis de ambiente e mensagens de erro do processador.

c ˆ Interoperabilidade de ponteiros. por consenso. co a ˆ Formato fixo da fonte. ca ˆ Rotinas intr´ ınsecas estendidas. j´ a a a est´ em fase de conclus˜o as discuss˜es a respeito do padr˜o futuro: Fortran 2008.d o ˆ Declara¸˜es DATA entre comandos execut´veis. co a ˆ Fun¸˜es de caractere de extens˜o assumida. objetos aloc´veis. ˆ Forma CHARACTER* da declara¸˜o CHARACTER. A vers˜o curta (draft) do a a o a a novo padr˜o deve ser divulgada ao final do ano de 2008. originalmente denominados objetos sem tipo (TYPELESS).3 Recursos removidos do Fortran 2003 Um recurso ´ removido do novo padr˜o se este for considerado redundante e praticamente sem uso pela e a comunidade. mas a u alguns dos ´ ıtens que ir˜o compor o novo padr˜o. ca ˆ Ponteiro aloc´vel em resolu¸˜o gen´rica a ca e ˆ Rotina interna como argumento real ˆ Inicializa¸˜o de ponteiros com alvos distintos de NULL(). divulgada no draft..PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . devido a novos recursos muito mais uteis na constru¸˜o do c´digo. ˆ Opera¸˜o de E/S recursivas a distintas unidades. repete os recursos removidos do Fortran 95. a a a 1. ca ˆ . ca c u -tr a c k . est˜o listados a seguir. matrizes de forma assumida e argumentos opcionais. a O Fortran 2008. Os detalhes completos dos novos recursos ainda n˜o foram plenamente divulgados para o p´blico em geral.1 Recursos novos do Fortran 2008 Com base em material de divulga¸˜o obtido na World Wide Web. nenhum outro recurso foi removido.4. 1. ˆ La¸os DO concorrentes (DO CONCURRENT). embora pelo procedimento adotado pelos comitˆs X3J3/WG5 devesse ser uma revis˜o menor e a do Fortran 2003. os seguintes recursos ser˜o inclu´ ca a ıdos: ˆ Co-matrizes (co-arrays). tais como as co-matrizes (co-arrays). a ˆ Execu¸˜o de programas externos. ack c w o .5 O novo padr˜o: Fortran 2008 a Embora ainda n˜o exista nenhum compilador que suporte completamente o padr˜o atual. o ˆ Atributo CONTIGUOUS. Introdu¸˜o ca 7 k lic lic k to bu y N O W ! w w w w . Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m Cap´ ıtulo 1.c 1. Portanto.d o c u -tr . ˆ Macros inteligentes (no lugar de m´dulos parametrizados). ´ ca o A lista de recursos removidos no Fortran 2003.5. Fortran 2003. ˆ BITS.. pode vir a apresentar algumas novidades substanciais.

ˆ A principal fonte de informa¸˜o sobre o padr˜o do Fortran 90/95 foi o amplo livro de Michael Metcalf e ca a John Reid: Fortran 90/95 Explained [3]. utilizei freq¨entemente o livro de Clive Page: Professional Programer’s Guide to Fortran u 77 [4]. ˆ Informa¸˜es divulgadas sobre o Fortran 2003 foram obtidas do livreto de John Reid [6].6 Coment´rios sobre a bibliografia a . oferecido pela Universia dade de Manchester [5].d o c u -tr a c k . a qual foi substitu´ pelo co a ıda Fortran 90/95.7 Agradecimentos Durante o desenvolvimento e divulga¸˜o desta apostila. e ˆ Para informa¸˜es a respeito do padr˜o existente na linguagem Fortran 77.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . fiz uso de um n´mero restrito de publica¸˜es. ˆ O manual de referˆncia ` Linguagem Fortran 90/95 que acompanha o compilador intel tamb´m foi freq¨ene a e u temente consultado [1].d o c u -tr . co 1.6. ˆ O curso virtual de Fortran 90 oferecido pela Universidade de Liverpool [2]. ack c w o 1. e o u Gostaria de agradecer publicamente as contribui¸˜es das seguintes pessoas: Leandro Tezani. co Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 8 1. Coment´rios sobre a bibliografia a k lic lic k to bu y N O W ! w w w w . algumas das quais s˜o de livre u co a acesso atrav´s da internet. diversas pessoas contribuiram com o seu aprimoraca mento ao apontar erros e inconsistˆncias e ao oferecer sugest˜es quanto a sua estrutura e conte´do.c Para escrever esta apostila. ˆ O curso virtual de Fortran 90 para programadores que j´ conhecem o Fortran 77.

Neste caso cada caractere em branco ser´ avaliado na composi¸˜o final do string.” em uma linha. ainda. a possibilidade de incluir o caractere “C” ou “c” na coluna 1. o a ca Mais de uma instru¸˜o pode ser colocada na mesma linha. agora denominado o formato fixo e o novo formato livre. Fortran 77: O formato fixo foi utilizado pelo Fortran desde a primeira vers˜o at´ o Fortran 77. o Coluna 6: caractere de continua¸˜o de linha. Esta ´ a transcri¸˜o realizada e ca pelo compilador do programa-fonte fornecido pelo programador para uma linguagem de baixo n´ ıvel.1 Formato do programa-fonte Em Fortran h´ trˆs formatos b´sicos de arquivos que s˜o utilizados: a e a a Programa-Fonte. M´ltiplos “. que eram a unica op¸˜o para entrar com o co o ´ ca c´digo fonte. o que instrui o compilador a ignorar a tudo que segue neste linha. ´ necess´ria ainda passar-se pela fase do linking (tradu¸˜o livre: linkagem). O separador de linhas padr˜o ´ o ponto-e-v´ ca a e ırgula “. Trata-se do programa e/ou dos subprogramas escritos pelo programador. usando algum tipo de editor de texto. Esta ´ a forma encontrada para se colocar coment´rios dentro do c´digo fonte. o qual consiste em um programa especial que agrupa os programas objetos de forma ca a criar um arquivo final.c O W w . a e 9 o m w w w w . Este formato a e foi determinado pelas restri¸˜es impostas pelos cart˜es perfurados. a a Nesta se¸˜o ser´ apresentada a estrutura b´sica de um programa-fonte em Fortran 90/95. o programa execut´vel.”. onde os programas objetos s˜o criados. Al´m disso. O programa-objeto n˜o pode ainda ser o a a executado.d o c u -tr a c k . os o o e e caracteres em branco s˜o irrelevantes em qualquer lugar do c´digo. Programa-Objeto. a 2. a a o Fortran 90/95: No formato livre n˜o h´ uma coluna espec´ a a ıfica para iniciar o programa.d o c u -tr a c k ! w o . o agente de compia o ca a la¸˜o aciona o linker. ca Colunas 7-72: c´digo fonte. A estrutura do formato fixo ´ a seguinte: o e Colunas 1-5: r´tulos (labels) para desvio de processamento do programa. Trata-se do programa-fonte compilado pelo compilador. Desta u a forma. o qual pode ser ent˜o executado pelo programador. com ou sem brancos. o H´. de acordo com as regras definidas pela linguagem de programa¸˜o de alto n´ ca ıvel. Pode-se come¸ar a c escrever o c´digo a partir da coluna 1 e a linha de c´digo pode se estender at´ a coluna 132. s˜o considerados como um separador simples. e a ca Programa execut´vel. exceto quanto estiverem sendo utilizados a o entre ap´strofes. ca a a O Fortran 90/95 suporta duas formas de c´digo-fonte: o formato antigo do Fortran 77. como Assembler ou outro c´digo diretamente interpret´vel pela CPU.c Cap´ ıtulo 2 Formato do C´digo-Fonte o Neste cap´ ıtulo estuda-se. Ap´s a fase de compila¸˜o. a seguinte linha de c´digo ´ interpretada como 3 linhas em seq¨ˆncia1 : o e ue 1 Este recurso n˜o ´ aceito pelo compilador em uso. um formato b´sico para o programa-fonte em Fortran 90/95 e os tipos a de vari´veis e suas caracter´ a ısticas b´sicas. inicialmente.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N .

a declara¸˜o ca PROGRAM primeiro ´ sempre a primeira instru¸˜o de um programa.0*A) & & Para entrar com coment´rios em qualquer ponto do c´digo-fonte. vˆm os comandos execut´veis. como no programa primeiro. isto ´.d o c u -tr . a a a e a pelo menos.d o c u -tr a c k . Desta forma.0*A) tamb´m pode ser escrita usando o “&”: e X = (-Y + ROOT_OF_DISCRIMINANT) /(2. ack c w o . a instru¸˜o implicit none. s˜o definidas as vari´veis a ser usadas pelo e co a a a programa. 2 Para o compilador empregado neste curso. o usu´rio deve digitar o ponto de exclama¸˜o a o a ca “!” em qualquer coluna de uma linha. Formato do programa-fonte k lic lic k to bu y N O W ! w w w w . o programa ´ encerrado com a instru¸˜o e ca end program primeiro Os recursos utilizados no programa primeiro ser˜o explicados com mais detalhes neste e nos pr´ximos cap´ a o ıtulos da apostila. Caso n˜o seja necess´rio declarar vari´veis. s˜o permitidas at´ 39 linhas e ca a e adicionais de c´digo.B ! Soluciona a equa¸~o linear. Neste ponto. e ca o Em seguida vˆm as declara¸~es de vari´veis. B = 0.c A = 0. Exemplo: a X = Y/A . a seguinte linha de c´digo: o o X = (-Y + ROOT_OF_DISCRIMINANT)/(2. o a Como primeiro exemplo de programa em Fortran 90/95. ´ obrigat´rio. Ela serve para identificar o c´digo ao compilador. ca O programa “Alˆ Mam˜e”. ele indica que a linha com instru¸˜es imedie ca e co atamente posterior ´ continua¸˜o da linha onde o “&” foi digitado. No caso do programa primeiro. o qual ´ a chamada sa´ ue a o a e ıda padr˜o.1. ”Alˆ Mam˜e” o a end program p r i m e i r o A forma mais simples de um programa em Fortran 90/95 ´ a seguinte: e PROGRAM <nome_do_programa> <declara¸~es de vari´veis> co a <comandos execut´veis> a END PROGRAM <nome_do_programa> Comparando com o exemplo do programa primeiro. Como exemplo. considere o seguinte c´digo-fonte: o program p r i m e i r o i m p l i c i t none print * . ´ recomend´vel2 incluir. o unico o a e a ´ comando execut´vel empregado foi a print *. C = 0 O caractere ampersand “&” ´ a marca de continua¸˜o. Esta instrui o compilador a exigir que todas as vari´veis usadas pelo ca a programa tenham o seu tipo explicitamente definido.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . e o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 10 2. Ap´s declaradas as vari´veis. a Finalmente. Todo o restante da linha ser´ desprezado pelo compilador. “Al^ Mam~e” o a o qual tem como conseq¨ˆncia a impress˜o do texto “Alˆ Mam˜e” na tela do monitor.

E importante salientar que a instru¸˜o implicit none deve ser sempre a ca a segunda linha de um programa. Os nomes destas entidades devem consistir em caracteres alfanum´ricos.2 Nomes em Fortran 90/95 c u -tr a c k . sub-programa ou m´dulo. ack c w o . H´ dois comandos de sa´ padr˜o de dados: a ıda e a ıda a PRINT *. cujo valor ser´ lido pelo computador.*) [’<mensagem>’[. O usu´rio deve entrar a a a a a com os valores das vari´veis separando-as por v´ a ırgulas. m´dulos. O dispositivo padr˜o de sa´ de dados ´ a tela do monitor. a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m Cap´ ıtulo 2. tais como programas. aparecendo antes do restante das declara¸˜es de o co vari´veis. a e e ıda o O dispositivo padr˜o de entrada de dados ´ o teclado.c Um programa em Fortran 90/95 faz referˆncia a muitas entidades distintas. Os caracteres alfanum´ricos v´lidos s˜o: e a a ˆ Letras (a . Formato do C´digo-Fonte o 11 k lic lic k to bu y N O W ! w w w w . ˆ O caractere underscore “ ”. ˆ Numerais (0 . subproe gramas. a a ´ e ent˜o impresso na tela do monitor. e a e 2. Uma descri¸˜o ca ıda ca mais completa destes recursos ser´ realizada no cap´ a ıtulo 9 na p´gina 123. a Esta se¸˜o apresentou somente um uso muito simples dos recursos de Entrada/Sa´ de dados. Os seguintes exemplos s˜o v´lidos: ´ ca e a a A A_COISA X1 MASSA Q123 TEMPO_DE_VOO j´ estes exemplos n˜o s˜o v´lidos: a a a a 1A (come¸a com numeral) c A COISA (espa¸o em branco) c $SINAL (cont´m caractere n˜o alfanum´rico). A maneira mais direta de definir valores de e ıda vari´veis ou de exibir os valores destas ´ atrav´s dos dispositivos de entrada/sa´ padr˜es. A . ent˜o. [’<mensagem>’[. a end program l e v a l o r No programa acima. a print * .d o c u -tr . a partir do teclado.]][<lista de vari´veis>] a WRITE(*. O comando de leitura para o programa ler os valores a e das vari´veis ´: a e READ *. de 1 o a e a 31 caracteres. foi declarada a vari´vel real a. ”Valor l i d o : ” . a a imprimir o valor desta na tela do monitor: program l e v a l o r i m p l i c i t none real : : a print * . <lista de vari´veis> a READ(*.d o 2.3 Entrada e sa´ padr˜es ıda o O Fortran 90 possui trˆs comandos de entrada/sa´ de dados.]][<lista de vari´veis>] a O programa a seguir instrui o computador a ler o valor de uma vari´vel real a partir do teclado e. etc. A unica restri¸˜o ´ que o primeiro caractere seja uma letra. ”I n f o r m e o v a l o r de a : ” read * .Z).z.*) <lista de vari´veis> a onde lista de vari´veis s˜o as vari´veis que dever˜o receber seus valores via teclado.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .9). vari´veis.

ack c w o . o underscore “ ” e o conjunto de caracteres especiais apresentados na tabela 2. $ : Nome/Fun¸˜o ca Igual Soma Subtra¸˜o ca Multiplica¸˜o ca Divis˜o a Parˆnteses esquerdo e Parˆnteses direito e V´ ırgula Ponto decimal Cifr˜o a Dois pontos Caractere ! “ % & .1: Caracteres especiais do Fortran 90/95 Caractere = + * / ( ) .1.c Tabela 2. ? ** ’ < > Nome/Fun¸˜o ca Espa¸o em branco c Exclama¸˜o ca Aspas Porcentagem E comercial (ampersand) Ponto e v´ ırgula Ponto de interroga¸˜o ca Potˆncia e Ap´strofe o Menor que Maior que 2.4.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . denominados de tokens.d o c u -tr a c k . a c u u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de fevereiro de 2009 o m 12 2.d o c u -tr . Conjunto de caracteres aceitos k lic lic k to bu y N O W ! w w w w . s˜o os caracteres alfanum´ricos.4 Conjunto de caracteres aceitos No Fortran 90/95. n˜o existem diferen¸as entre letras mai´sculas e min´ sculas. os 10 d´ a a e ıgitos ar´bicos. Dentro da sintaxe da a linguagem. . os elementos b´sicos.

<par^metro de esp´cie> especifica a esp´cie da vari´vel. os quais possuem o seu tipo impl´ a a ıcito. reais e complexos (em a e e inglˆs INTEGER.d o c u -tr a c k ! w o . Estas s˜o os chamados tipos derivados ou estruturas. baseados nos tipos intr´ a ınsecos. e o 13 o m w w w w . CHARACTER e LOGICAL. cada um dos cinco tipos intr´ ınsecos possui um valor inteiro n˜o negativo denominado a parˆmetro de esp´cie do tipo (em inglˆs. REAL e COMPLEX) e dois tipos n˜o num´ricos. terminando por definir os tipos derivados.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . e co co co o Em Fortran 90/95. e Um outro avan¸o do Fortran 90 sobre o predecessor Fortran 77 consiste na habilidade em definir novos c tipos de vari´veis. ´ uma boa praxe de programa¸˜o1 iniciar o setor de declara¸˜es de a e ca co vari´veis com a declara¸˜o a ca IMPLICIT NONE a qual impede a possibilidade de haver nomes de vari´veis n˜o definidos. <lista de a a e e a atributos> ´ um dos seguintes: e PARAMETER PUBLIC PRIVATE POINTER TARGET ALLOCATABLE e cada entidade ´ e <nome do objeto> [(lista de extens~es)] [*char-len] [= express~o de inicializa¸~o] o a ca ou 1 Para DIMENSION(<lista de extens~es>) o INTENT(<inout>) OPTIONAL SAVE EXTERNAL INTRINSIC o compilador usado. kind type parameter ). caracteres e l´gicos (em inglˆs CHARACTER e e a e o e LOGICAL).d o c u -tr a c k . permitindo gerar objetos de complexidade crescente. O primeiro grupo de vari´veis ´ utilizado em opera¸˜es matem´ticas e ´ o mais utilizado. Neste cap´ ıtulo.1 Declara¸˜o de tipo de vari´vel ca a Como j´ foi colocado anteriormente.c Cap´ ıtulo 3 Tipos de Vari´veis a Em Fortran. vamos inicialmente definir o uso b´sicos dos tipos intr´ a ınsecos de vari´veis. seguindo pela a defini¸˜o das esp´cies de vari´veis mais comuns. uma pr´tica corriqueira em Fortran 77.c O W w . ´ obrigat´rio. h´ cinco tipos intr´ a ınsecos de vari´veis: trˆs tipos num´ricos. ca e a 3. A norma padr˜o da linguagem determina que a e e a qualquer processador deve suportar pelo menos duas esp´cies para os tipos REAL e COMPLEX e pelo menos uma e esp´cie para os tipos INTEGER. inteiros. O segundo a e co a e grupo ´ utilizado para opera¸˜es que envolvem manipula¸˜es de texto ou opera¸˜es l´gicas. os quais a consistem em combina¸˜es de partes compostas por tipos intr´ co ınsecos e/ou por outros tipos derivados.<lista de atributos>] :: a e <lista de entidades> onde <tipo> especifica o tipo de vari´vel. a A forma geral de uma declara¸˜o de tipo de vari´veis ´: ca a e <tipo>[([KIND=]<par^metro de esp´cie>)][.

89312. ack c w o . A parte 4. e Um ou ambos das partes 1. As declara¸oes b´sicas do tipo real s˜o: c˜ a a Fortran 77: REAL <lista de vari´veis> a Fortran 90/95: REAL :: <lista de vari´veis> a Impresso: 23 de abril de 2008 Autor: Rudi Gaelzer – IFM/UFPel o m 14 3. Vari´veis do tipo INTEGER a k lic lic k to bu y N O W ! w w w w . v a i g e r a r um e r r o de e x e c u ¸ ˜ o no programa .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . uma parte inteira. e 3. seguindo a regra de nomes v´lidos definida no cap´ e a a ıtulo 2. devem estar presentes. uma parte fracion´ria e a 4. um expoente. um ponto decimal.1 1E-1 (representando 10−1 ou 0. c u -tr a c k .) a que o processador suporta. ”Valor l i d o : ” . read * . ou est´ ausente ou consiste na letra E a seguida por um inteiro com ou sem sinal.3 Vari´veis do tipo REAL a O tipo de vari´vel real ´ composto de quatro partes. com ou sem sinal. Exemplos de literais reais s˜o: a -10.c 3. tamb´m com ou sem sinal. 2. 6 × 10−11 ) 1.6E-11 (representando −10. com uma precis˜o de cerca de 7 (sete) d´ a u a ıgitos decimais. c ca ! a b o r t a n d o o mesmo . u Programa exemplo: program i n t e i r o i m p l i c i t none integer : : x ! O v a l o r d i g i t a d o n˜ o pode c o n t e r ponto ( . exemplos de n´meros inteiros v´lidos.2 Vari´veis do tipo INTEGER a Este tipo de vari´vel armazena apenas a parte inteira de um n´mero. devem estar presentes. em particular o <par^metro de esp´cie> e <lista de atributos> ser˜o estudados ao longo a e a do desenvolvimento desta apostila. uma vez que estes valores dependem do tipo de processador em uso. -0. a u u a tamb´m denominados literais s˜o: e a 123. Os objetos restantes. assim dispostas: a e 1. As declara¸oes b´sicas de vari´veis de tipo inteiro s˜o: c˜ a a a Fortran 77: INTEGER <lista de vari´veis> a Fortran 90/95: INTEGER :: <lista de vari´veis> a O tipo de dados inteiro possui valores que pertencem ao conjunto dos n´meros inteiros. Valores comuns s˜o: intervalo de n´meros entre 10−38 a 10+38 .d o c u -tr . e 4. Um ou ambos das partes 2.1) 3. x end program i n t e i r o 3. 5.141592653 Os literais reais s˜o representa¸oes do conjunto dos n´meros reais e o padr˜o da linguagem n˜o especifica a c˜ u a a o intervalo de valores aceitos para o tipo real e nem o n´mero de d´ u ıgitos significativos na parte fracion´ria (3. ) Caso i s t o a ! acon te¸ a . 3. x print * .d o <nome da fun¸~o> [*char-len] ca onde <nome do objeto> ´ o nome da vari´vel.2.

c 3. se for realizado o produto de dois n´meros complexos (x1. 5 e −2. um literal complexo deve ser escrito: e a u (<parte real>. ’ Valor de b : ’ . a print * . end program va r com ple xa <lista de vari´veis> a 3.99E-2) (representando 1 + 0. um espa¸o em branco ´ diferente de dois ou mais.3. ”O v a l o r de c : ” . O mesmo acontecendo com as a outras opera¸˜es alg´bricas. b= 1 0 .. ’ Valor de a : ’ read * . x ´ a u u e u e parte real e y ´ a parte imagin´ria do n´mero complexo z..d o c u -tr . a e print * . exceto os caracteres de controle tais como o return. a print * . ’ Valor de a : ’ .4.2) (representando 1 + 3.x1*y2 + x2*y1). ”Valor de b : ” ! O v a l o r de b d e v e s e r e n t r a d o como um l i t e r a l complexo .d o Programa exemplo: program v a r r e a l i m p l i c i t none r e a l : : a . Os literais complexos representam e √ n´meros contidos no conjunto dos n´meros complexos. Assim. b c= a * b print * .4 Vari´veis do tipo COMPLEX a O Fortran. Tipos de Vari´veis a 15 k lic lic k to bu y N O W ! w w w w . os quais s˜o ou e a inteiros ou reais.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . como uma linguagem destinada para c´lculos cient´ a ıficos ou em engenharia.y2).7) Uma outra grande vantagem do Fortran ´ que toda a ´lgebra de n´meros complexos j´ est´ implementada e a u a a a n´ ıvel de compilador. a e print * . ack c w o . −5) . separados por v´ ırgula “.” e contidos entre parˆnteses “(“ “)”. Qualquer caractere a a a ca que possa ser representado pelo processador ´ aceito.. Os e ap´strofes ou aspas servem como delimitadores dos literais de caractere e n˜o s˜o considerados parte integrante o a a do conjunto. isto ´. 5 ) read * .y1) e (x2. 2 . ! Exemplo : ( − 1 . o u resultado ser´ o literal complexo dado por (x1*x2 . 5 . b .y1*y2. tem a vantagem de possuir um terceiro tipo intr´ ınseco: complexo. b end program v a r r e a l c u -tr a c k .0.-3.<parte imagin´ria>) a Exemplos de literais complexos s˜o: a (1.5 Vari´veis do tipo CHARACTER a O tipo padr˜o consiste em um conjunto de caracteres contidos em um par de ap´strofes ou aspas. onde i = −1. c ! V e r i f i q u e o r e s u l t a d o no p a p e l . 99 × 10−2 i) (1. Ao contr´rio das normas usuais. c ! V a r i ´ v e l a ´ i n i c i a l i z a d a a (5 . 5 e−2 ! V a r i ´ v e l b ´ i n i c i a l i z a d a a 1 0 . Assim. co e As declara¸˜es b´sicas do tipo complexo s˜o: co a a Fortran 77: COMPLEX <lista de vari´veis> a Fortran 90/95: COMPLEX :: Programa exemplo: program va r c omp le xa i m p l i c i t none complex : : a= (5 . 2i) (1. n´meros do tipo z = x + iy. −5). Os a o caracteres n˜o est˜o restritos ao conjunto de caracteres padr˜o definidos na se¸˜o 2. a c e Exemplos de literais de caractere: Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3. Este tipo ´ concebido como um par de literais.

este ca e u ser´ truncado. a 4. [<nome 2>*<comp. a a 5. a a 2. 2>. o processador ir´ preencher o espa¸o restante a a c a ` direita com espa¸os em branco. Cada linha deve ser encerrada com o caractere “&” e n˜o pode ser seguida por coment´rio. incluindo brancos. fazem parte do literal. c Programa exemplo: program l e c a r a c t e r e i m p l i c i t none character ( len =10) : : s t r r e a d print * .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Todas as vari´veis definidas por a a esta declara¸˜o tˆm o mesmo n´mero de caracteres. Todo o restante. an^nimo e frio. ”Texto l i d o : ” ..] Fortran 90/95: character(len=<comprimento>) :: <lista de vari´veis> a onde <comprimento> indica a quantidade de caracteres contidos nas vari´veis. s t r r e a d print * . ”Entre com t e x t o ” : read ’ ( a ) ’ .c Fortran 77: character*<comprimento> <lista de vari´veis> a ou character <nome 1>*<comp. Quaisquer brancos seguindo um & em final de linha ou precedendo o mesmo caractere em in´ de linha ıcio n˜o s˜o partes do literal. vivida em v~o. Cada linha de continua¸˜o deve ser precedida tamb´m pelo caractere “&”.d o c u -tr . quanto do meu passado & Foi s´ a vida mentida o & De um futuro imaginado! & & Aqui ` beira do rio a & Sossego sem ter raz~o. s t r r e a d end program l e c a r a c t e r e ´ E importante mencionar aqui a regra particular para o formato de fonte dos literais de caractere que s˜o a escritos em mais de uma linha: 1. . o & A vida. se for informado um literal menor que o declarado. Como exemplo temos: car_longo = ’O tempo que eu hei sonhado & Quantos anos foi de vida! & Ah.. 1>. Este par “&&” n˜o faz parte do literal. ca e 3. ack c w o ’bom Dia’ ’bomDia’ ’BRASIL’ “Fortran 90” As declara¸oes mais utilizadas para o tipo caractere s˜o: c˜ a . a & Este seu correr vazio & Figura.5.d o c u -tr a c k .’ a Autor: Rudi Gaelzer – IFM/UFPel & & & & & & & & & & & Impresso: 23 de abril de 2008 o m 16 3. Vari´veis do tipo CHARACTER a k lic lic k to bu y N O W ! w w w w . Se for informado um literal maior que <comprimento>.

Tipos de Vari´veis a 17 k lic lic k to bu y N O W ! w w w w . Contudo. a a e Por exigˆncia do padr˜o. a ˆ vari´veis reais de precis˜o estendida (ou qu´drupla): real*16 <lista de vari´veis>.2 Fortran 90/95 Em Fortran 90/95. ⇒Falso.6 Vari´veis do tipo LOGICAL a . gfortran e o compilador F.7. CHARACTER e LOGICAL possui associado um valor inteiro n˜o negativo denominado parˆmetro de esp´cie do tipo (kind type parameter). a a a a ˆ vari´veis complexas de precis˜o dupla: complex*16 <lista de vari´veis>. ack c w o 3. isto ´. ser˜o considea e a rados os compiladores Intel® Fortran Compiler for linux (vers˜o 9. possibilitando assim a portabilidade do c´digo. um processador deve suportar. todos a gratuitos. ” a e end i f end program l o g i c o <lista de vari´veis> a 3.d o c u -tr . e Os valores da esp´cie s˜o dependentes do processador e/ou do compilador empregado. Uma vari´vel l´gica s´ pode assumir dois valores. duas esp´cies para os tipos REAL e COMPLEX e e uma esp´cie para os tipos INTEGER. ⇒ Verdadeiro ˆ . no m´ e a ınimo. ”A v a r i ´ v e l ´ v e r d a d e i r a . CHARACTER e LOGICAL.d o c u -tr a c k . c o a 3. ´ poss´ e a co e ıvel definir extens˜es a o um determinado tipo. INTEGER. a a o e possibilidade deste rodar em diferentes arquiteturas usando uma precis˜o m´ a ınima especificada pelo programador. As declara¸oes do tipo l´gico s˜o: c˜ o a Fortran 77: logical <lista de vari´veis> a Fortran 90/95: logical :: Programa exemplo: program l o g i c o i m p l i c i t none l o g i c a l : : a= . i f ( a ) then print * .1). Para demonstrar como diferentes compiladores implementam e usam o parˆmetro de esp´cie. cada um dos cinco tipos intr´ ınsecos.c O tipo l´gico define vari´veis l´gicas.1 Fortran 77 Em Fortran 77 as extens˜es mais comuns e as correspondentes declara¸˜es s˜o: o co a ˆ vari´veis reais de precis˜o dupla: real*8 <lista de vari´veis> ou double precision <lista de vaa a a ri´veis>.7 O conceito de esp´cie (kind) e Em Fortran.6. a a a As diferen¸as entre estas extens˜es e os correspondentes tipos originais ser˜o ilustradas a seguir.FALSE. COMPLEX. REAL. o a o a o o A representa¸˜o dos dois estado poss´ ca ıveis de uma vari´vel l´gica s˜o: a o a ˆ . al´m dos 5 tipos de vari´veis definidos nas se¸˜es 3. cujas declara¸˜es dependem da vers˜o do Fortran utilizada e do processador no qual o co a programa ser´ executado.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a 3. verdadeiro e falso.7. h´ fun¸˜es e a a co intr´ ınsecas fornecidas pelo compilador que verificam as precis˜es suportadas pelo processador e que podem o ser usadas para definir o valor do parˆmetro KIND.TRUE. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3.2 a 3. t r u e .

Tipo Caractere. ca a a e O mesmo exemplo tamb´m ilustra o uso da fun¸˜o impl´ e ca ıcita SQRT(X): R_SIMPLES= SQRT(2. o a a e o Declara¸˜o: LOGICAL([KIND=]<n>) [::] <lista de vari´veis> ca a Sendo <n> igual a 1.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a a e Declara¸˜o: REAL([KIND=]<n>) [::] <lista de vari´veis> ca a Sendo <n> igual a 4. e c o o espa¸o ocupado est´ descrito na tabela 3. a a e Declara¸˜o: INTEGER([KIND=]<n>) [::] <lista de vari´veis> ca a Sendo <n> das esp´cies 1. Em caso contr´rio. a esp´cie ser´ o inteiro padr˜o: INTEa a e a e a a GER(KIND=4). 4 ou 8.c Tabela 3. a esp´cie ser´ o real a e a e a padr˜o: REAL(KIND= 4). H´ 03 parˆmetros de esp´cie para o tipo real.1.1: Tabela de armazenamento de vari´veis para o compilador Intel® Fortran.7. juntamente com as respectivas declara¸˜es de tipo e esp´cie: co e Tipo Inteiro. Atualmente. H´ somente uma esp´cie do tipo caractere. 4 ou 8. O conceito de esp´cie (kind) e k lic lic k to bu y N O W ! w w w w .7. as vari´veis na <lista e a e e a de vari´veis> ser˜o da esp´cie escolhida.1 Armazenamento (bytes) 1=8 bits 2 4 8 4 8 16 Tipo e Esp´cie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=16) Armazenamento (bytes) 1 2 4 8 8 16 32 Compilador Intel® Fortran O compilador Intel® Fortran oferece os seguintes tipos intr´ ınsecos. j´ foi definido que o valor do parˆmetro DP ´ igual a 2.7. O c co e a mesmo programa tamb´m indica o uso de alguns atributos na declara¸˜o de vari´veis. a e Declara¸˜o: CHARACTER([KIND=1]. Na mesma declara¸˜o. H´ 03 parˆmetros de esp´cie para o tipo complexo. a Tipo e Esp´cie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) REAL(KIND=4) REAL(KIND=8) REAL(KIND=16) 3. n˜o podem ser alteradas no programa por nenhuma atribui¸˜o de vari´veis (ver cap´ a e a ca a ıtulo ??). H´ 04 parˆmetros de esp´cie para o tipo l´gico. a Tipo L´gico. Para o compilador Intel® Fortran. Se o parˆmetro de esp´cie ´ explicitado.1 a seguir ilustra do uso e as diferen¸as de algumas op¸˜es de esp´cies de tipos de vari´veis.2 inicialmente desenvolvido como alternativa ao compilador e f95 distribu´ pelas vers˜es comerciais do Unix. Caso o parˆmetro de esp´cie n˜o seja especificado. o gfortran ´ parte integrante da plataforma de ıdo o e 2 Funda¸˜o ca Gnu is Not Unix. ack c w o . isto ´. 8 ou 16.d o c u -tr a c k . a declara¸˜o INTEGER :: <lista de vari´veis> equivale a INTEGER(KIND=4) ca a :: <lista de vari´veis>. ou seja. a Tipo Complexo. 2. 2. a esp´cie ser´ o complexo a e a e a padr˜o: COMPLEX(KIND= 4). a a 3.0 e atribuiu o resultado ` vari´vel R_SIMPLES. a a e Declara¸˜o: COMPLEX([KIND=]<n>) [::] <lista de vari´veis> ca a Sendo <n> igual a 4. 8 ou 16. H´ 04 parˆmetros de esp´cie para o tipo inteiro.2 Compilador gfortran Gfortran ´ o compilador Fortran 95 da GNU. PARAMETER :: DP= 2 O atributo PARAMETER indica que as vari´veis declaradas nesta senten¸a devem se comportar como constantes a c matem´ticas.0) a qual calculou a raiz quadrada da constante 2. Caso o parˆmetro de esp´cie n˜o seja explicitado. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 18 3. c a O programa 3. tais como na declara¸˜o e ca a ca INTEGER. a Tipo Real.2.[LEN=]<comprimento>) [::] ca <lista de vari´veis> a Cada esp´cie distinta ocupa um determinado espa¸o de mem´ria na CPU.d o c u -tr .2.

print * . o qual pode. o qual traduz o c´digo-fonte para assembler.2. o modo padr˜o de opera¸˜o. a c˜ Tipo e Esp´cie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) INTEGER(KIND=16)3 REAL(KIND=4) REAL(KIND=8) REAL(KIND=10) Armazenamento (bytes) 1=8 bits 2 4 8 16 4 8 10 Tipo e Esp´cie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) LOGICAL(KIND=16) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=10) Armazenamento (bytes) 1 2 4 8 16 8 16 20 desenvolvimento de software GCC (GNU Compiler Collection). parameter : : dp= 8 .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .d o c u -tr a c k .1: Testa distintas esp´cies suportadas pelo compilador Intel® Fortran. entre outros. e program t e s t a k i n d i n t e l i m p l i c i t none integer . 0 ) ! Precis˜o simples a r d u p l a= s q r t ( 2 . O comando gfortran consiste simplesmente em um script que invoca o programa f951. tamb´m denominado seq¨encial. tais como a fam´ de processadores Intel® Core— 2.c Programa 3. por´m.3 Compilador F Como exemplo do uso do parˆmetro de esp´cie. ca 2.3 ilustra os valores suportados pelo compilador a e F. os parˆmetros de esp´cie s˜o determinados de forma semelhante ao compilador Intel® a e a Fortran. conforme fornecidos pelo guia do usu´rio4 .pdf.fortran. qp= 16 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s ˜ e s .1.2. o qual deve ser especificado no momento da compila¸˜o com a chave ca ca -kind=byte: alunos|fulano>F -kind=byte <nome programa>.2: Tabela de armazenamento de vari´veis para o compilador gfortran da funda¸ao GNU. H´ duas possibilidades para os n´meros da esp´cie: a a u e 1. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3. e 3. a e e a O programa testa_kind_gfortran a seguir (programa 3. Java. r d u p l a print * .d o c u -tr . As esp´cies suportadas pelo gfortran s˜o descritas na tabela 3. a tabela 3.7. r quad ! end program t e s t a k i n d i n t e l Tabela 3. ack c w o . discutido na se¸˜o 3.2) ilustra o uso e as diferen¸as entre as diversas c esp´cies de tipos de dados no compilador gfortran.2.7. No gfortran. ılia F Compiler and Tools http://www. o r s i m p l e s= s q r t ( 2 . 0 dp ) ! P r e c i s ˜ o d u p l a a r quad= s q r t ( 2 . tais como Fortran 95. ser especificado explia ca e u e citamente no momento da compila¸˜o com a chave -kind=sequential. ou seja.f90 -o <nome programa> 3 Em 4 The plataformas de 64 bits. r s i m p l e s print * . a a ! ! Imprime r e s u l t a d o s na t e l a . 0 qp ) ! P r e c i s ˜ o q u ´ d r u p l a ou e s t e n d i d a .com/imagine1/ftools. que ´ composta por compiladores de diversas e linguagens distintas. C/C++. Tipos de Vari´veis a 19 k lic lic k to bu y N O W ! w w w w . invocando o em seguida o linkador e as bibliotecas comuns do pacote GCC. o esquema de numera¸˜o bytes. Ada. o parˆmetro indica o n´mero de bytes necess´rios para armazenar ca a u a cada vari´vel da respectiva esp´cie de tipo.

parameter : : i 1= 1 . c quad ! end program t e s t a k i n d g f o r t r a n Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 20 3. 0 qp ) ! P r e c i s a o e s t e n d i d a ! ! C a l c u l a a r a i z quadrada de ( 2 . ’ E s p e c i e s R e a i s e Complexas : ’ print * . ’ E s p e c i e s I n t e i r a s : ’ print * . 0 qp . 0 qp ) ) ! print * . r s i m p l e s print * . v i 8 print * . r quad print * . vi1 . r d u p l a print * . i 2= 2 . 0 dp . 0 dp ) ) c quad= s q r t ( ( 2 . ack c w o . 0 . v i 1 6 ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o r e a l .d o c u -tr . parameter : : dp= 8 . 0 ) ) c d u p l a= s q r t ( ( 2 .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .2: Testa distintas esp´cies suportadas pelo compilador gfortran . vi2 . 0 dp ) ! P r e c i s a o d u p l a r quad= huge ( 1 . c d u p l a print * . i 8= 8 . c s i m p l e s= s q r t ( ( 2 . O conceito de esp´cie (kind) e k lic lic k to bu y N O W ! w w w w . v i 4 print * . i 1 6= 16 integer . print * . e program t e s t a k i n d g f o r t r a n i m p l i c i t none integer . i 4= 4 . 2 . 0 ) ! Precisao simples r d u p l a= huge ( 1 . r s i m p l e s= huge ( 1 . 2 . 2 ) em d i v e r s a s p r e c i s o e s . 2 . qp= 10 integer ( kind= i 1 ) : : v i 1 integer ( kind= i 2 ) : : v i 2 integer ( kind= i 4 ) : : v i 4 integer ( kind= i 8 ) : : v i 8 integer ( kind= i 1 6 ) : : v i 1 6 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a complex ( kind= qp ) : : c quad ! ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o i n t e i r o .c Programa 3.d o c u -tr a c k . c s i m p l e s print * . v i 1= huge ( 1 i 1 ) v i 2= huge ( 1 i 2 ) v i 4= huge ( 1 i 4 ) v i 8= huge ( 1 i 8 ) v i 1 6= huge ( 1 i 1 6 ) print * .7.

o r s i m p l e s= s q r t ( 2 . a a a a o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3. s˜o especificadas por: e a [<s>]<nnn. 0 ) ! Precis˜o dupla a ! ! N´ meros co mp l ex o s : p a r t e r e a l : r a i z de 2 .4 Literais de diferentes esp´cies e Para disting¨ir as esp´cies dos literais (ou constantes) dentre diferentes n´meros fornecidos ao compilador. ack c w o . 4 ou 8. ilustra do uso e as diferen¸as de algumas op¸˜es de esp´cies de c co e tipos de vari´veis. 0 ) ) c d u p l a= cmplx ( s q r t ( 2 . 0 ) ! Precis˜o simples a r d u p l a= s q r t ( 2 . print * .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . programa testa_kind_F. obrigat´rio se negativo.2.> ´ um conjunto de e o e d´ ıgitos (0 a 9). 1 byte por caractere O exemplo a seguir. ıcio a e a e 2.7.>[_<k>] onde: <s> ´ um sinal (+ ou −).. r d u p l a print * . incluindo a esp´cie. _<k> ´ um dos parˆmetros de esp´cie do tipo: 1. e a Tipo Real Real Real5 Complex Complex Complex Logical Logical Logical Logical Integer Integer Integer Integer Character N´ mero do Kind u (Sequencial) ¨ 1 2 3 1 2 3 1 2 3 4 1 2 3 4 1 N´ mero do Kind u (Byte) 4 8 16 4 8 16 1 2 4 8 1 2 4 8 1 Descri¸˜o ca Real precis˜o simples (padr˜o) a a Real precis˜o dupla a Real precis˜o qu´drupla a a Complexo precis˜o simples (padr˜o) a a Complexo precis˜o dupla a Complexo precis˜o qu´drupla a a L´gico 1 byte o L´gico 2 bytes o L´gico 4 bytes (padr˜o) o a L´gico 8 bytes o Inteiro 1 byte Inteiro 2 bytes Inteiro 4 bytes (padr˜o) a Inteiro 8 bytes Caractere. quaisquer zeros no in´ s˜o ignorados. sendo <k> o parˆmetro da esp´cie do tipo: a e Literais inteiros. u a c s i m p l e s= cmplx ( s q r t ( 2 .d o c u -tr . u e u utiliza-se o sufixo _<k>.. 0 ) .. a program t e s t a k i n d F i m p l i c i t none integer . opcional se positivo.3: Valores de esp´cies (kind) de tipos de vari´veis suportados pelo compilador F.d o c u -tr a c k . P arte i m a g i n ´ r i a : r a i z de 3 .. parameter : : dp= 2 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s ˜ e s . 0 ) ) ! ! Imprime r e s u l t a d o s na t e l a . s q r t ( 3 . r s i m p l e s print * . Constante inteiras. s q r t ( 3 . <nnn. 0 ) . ca e a 5 Vari´veis a reais e complexas de precis˜o qu´drupla n˜o s˜o suportadas por todas as vers˜es do compilador F.c Tabela 3. esta op¸˜o explicita a esp´cie do tipo ` qual o literal pertence. Tipos de Vari´veis a 21 k lic lic k to bu y N O W ! w w w w . c s i m p l e s print * . c d u p l a ! end program t e s t a k i n d F 3.

Usualmente retorna a esp´cie do tipo real de precis~o dupla. os ca e requerimentos especificados por P e R. dependendo se possuem ou n˜o parte a a exponencial. e Literais complexos. o valor retornado ´ e e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 22 3.d o Literais reais.0_8: para indicar tipo real.3 Fun¸oes intr´ c˜ ınsecas associadas ` esp´cie a e Embora as declara¸˜es de esp´cie do tipo possam variar para diferentes compiladores. isto ´.7. e a e c u -tr a c k . e a (Depende do processador). Retorna a esp´cie padr~o do tipo real.[_<k>] . i print * . a e 3.3. parameter : : dp= 2 real : : y r e a l ( kind= dp ) : : x ! i= kind ( x ) ! i= 2 j= kind ( y ) ! Depende do s i s t e m a ( j =1 para c o m p i l a d o r F ) . 2.3. Fornece a esp´cie padr~o de caractere. j end program t e s f u n k i n d Outros exemplos: KIND(0) KIND(0.R) A fun¸˜o intr´ ca ınseca SELECTED_REAL_KIND(P. a 3.[_<k>] onde <k> ´ um dos parˆmetros de esp´cie do tipo: 1. a A fun¸˜o SELECTED_REAL_KIND(P. ack c w o . esp´cie 8. e a (Sempre igual a 1). j integer . Se mais de uma esp´cie satisfaz estes requerimentos. a qual tem como argumento uma vari´vel ou constante de qualquer tipo a intr´ ınseco. Constantes reais s˜o especificadas de diferentes maneiras. e a (Dependente do processador). e a (Pode n~o ser aceito por todos compiladores). A regra b´sica para a especifica¸˜o de um literal complexo j´ foi definida na se¸˜o 3. em cada uma das partes real e imagin´ria do literal complexo.TRUE.7. Uma constante l´gica pode tomar uma das seguintes formas: o o . e a program t e s f u n k i n d i m p l i c i t none integer : : i .0_8.1 KIND(X) A fun¸˜o intr´ ca ınseca KIND(X). o padr˜o da linguagem co e a estabelece um conjunto de fun¸˜es intr´ co ınsecas que facilitam a determina¸˜o e a declara¸˜o destas esp´cies de ca ca e uma forma totalmente port´vel. a ca a ca Para explicitar a esp´cie do tipo ` qual o literal pertence. 8 ou 16. Por exemplo: a e 2. esp´cie 8.5345_8): para indicar tipo complexo.2 SELECTED_REAL_KIND(P.R) tem dois argumentos opcionais: P e R.c 3. A vari´vel P especifica a a precis˜o m´ a ınima (n´mero de d´ u ıgitos decimais) requerida e R especifica o intervalo de varia¸˜o m´ ca ınimo da parte exponencial da vari´vel. retorna o valor inteiro que identifica a esp´cie da vari´vel X.7.R) retorna o valor da esp´cie que satisfaz.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . onde <k> ´ um dos e a e parˆmetros de esp´cie do tipo: 4.0D0) ! ! ! ! ! ! ! ! ! ! Retorna a esp´cie padr~o do tipo inteiro. e a o (Depende do processador).FALSE. 4 ou 8. O conceito de esp´cie (kind) e k lic lic k to bu y N O W ! w w w w . deve-se incluir o sufixo _<k>.3. ou excede minimamente.) KIND(’A’) KIND(0.0) KIND(. e Literais l´gicos. independente de compilador e/ou arquitetura.7. 8 ou 16.d o c u -tr . print * . Retorna a esp´cie padr~o do tipo l´gico. A regra b´sica para a especifica¸˜o de um literal real j´ foi definida na se¸˜o 3. Para a ca a ca explicitar a esp´cie do tipo real ` qual o literal pertence. deve-se incluir o sufixo _<k>.3. Por exemplo.FALSE. onde <k> ´ um dos e a e parˆmetros de esp´cie do tipo: 4.4. a e a Por exemplo: (1.

A forma geral da declara¸˜o de um tipo derivado ´: ca e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3. Por exemplo. PARAMETER :: I8= SELECTED_INT_KIND(8) INTEGER(KIND= I8) :: IA. garante uma completa portabilidade ao proc˜ ca e grama. O exemplo a seguir ilustra o uso desta fun¸˜o intr´ ca ınseca e outros recursos. se dispon´ pelo processador.8 Tipos derivados Uma das maiores vantagens do Fortran 90/95 sobre seus antecessores est´ na disponibilidade ao programador a de definir seus pr´prios tipos de vari´veis. ack c w o .0E201_I10 iria gerar uma mensagem de erro no momento da compila¸˜o. Estas s˜o os chamados tipos derivados. 0 e 1 0 i 1 0 d= 1 . o valor -3 ´ retornado. c˜ ´ u SELECTED_INT_KIND(r) retorna o valor da esp´cie que representa. usada em conjunto com a declara¸˜o de esp´cie. IC As vari´veis inteiras IA.c A fun¸˜o intr´ ca ınseca SELECTED_INT_KIND(R) ´ usada de maneira similar ` fun¸˜o SELECTED_REAL_KIND.3. e Esta fun¸ao. ıvel 3. Tipos de Vari´veis a 23 k lic lic k to bu y N O W ! w w w w . se ca o intervalo da exponencial n˜o for dispon´ a ıvel.3 SELECTED_INT_KIND(R) c u -tr a c k . valores inteiros no intervalo −10r r a +10 . Um outro recurso dispon´ ´ a possibilidade de especificar constantes de a ıvel e uma determinada esp´cie. Assim. o valor -1 ´ retornado.d o c u -tr . o valor retornado ´ aquele com o menor intervalo no e e expoente r. 2 0 0 ) integer . parameter : : dp= 16 r e a l ( kind= i 1 0 ) : : a . e O exemplo a seguir mostra a declara¸˜o de um inteiro de uma maneira independente do sistema: ca INTEGER. Al´m disso. porque a parte exponencial excedeu o intervalo ca definido (200). deve-se notar que a defini¸˜o da esp´cie a e e ca e I10 e a declara¸˜o das vari´veis A. program t e s s e l e c t e d integer . parameter : : i 1 0= s e l e c t e d r e a l k i n d ( 1 0 . Se mais de uma esp´cie satisfaz o requerimento. c r e a l ( kind= dp ) : : d print * . a fun¸ao tem um unico argumento R.3). 0 e201 dp print * . no m´ e ınimo. a atribui¸˜o a e e ca D= 1.7. a fun¸˜o retorna o valor -1. B e C como sendo desta esp´cie limita o intervalo de varia¸˜o da parte ca a e ca exponencial. e a ca Agora. 3.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Se a precis˜o requerida n˜o for dispon´ a a a ıvel. a print * . como na atribui¸˜o e ca A= 2. d end program t e s s e l e c t e d Pode-se ver que a precis˜o requerida na vari´vel I10 ´ dispon´ na esp´cie correspondente ` precis˜o dupla de a a e ıvel e a a uma vari´vel real (ver tabela 3. se a vari´vel D tivesse sido declarada tamb´m da esp´cie I10. tamb´m freq¨entemente o a a e u denominados de estruturas. IB. 0 i 1 0 ) c= 3 . o qual especifica o intervalo de n´meros inteiros requerido. IB e IC podem ter valores entre −108 a +108 no m´ a ınimo. i 1 0 a= 2 . a fun¸˜o retorna -2 e se nenhum dos requerimentos for dispon´ ca ıvel.0_I10 A constante A foi explicitamente especificada como pertencente ` esp´cie I10 seguindo-se o valor num´rico com a e e um underscore e com o parˆmetro de esp´cie do tipo (I10).d o aquele com a menor precis˜o decimal. desde que o processador tenha dispon´ ıveis os recursos solicitados. 0 i 1 0 b= s q r t ( 5 . c print * . b . b print * . Se o intervalo n˜o for dispon´ a ıvel.

Em seguida.0. 0 . Tipos derivados k lic lic k to bu y N O W ! w w w w . A seguir. y .0. 0 a p i c e%y= 1 .1. e declarou-se duas vari´veis como sendo do tipo PONTO: CENTRO e APICE. a p i c e ! a p i c e%x= 0 .8. 0 . ack c w o .0 e CENTRO%Z= 0.0.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . representando os valores das coordenadas x.0.0. J´ a vari´vel CENTRO teve os a a valores de suas componentes definidos pelo construtor de estrutura: CENTRO= PONTO(0. Finalmente. composto por trˆs componentes reais x. definiu-se o tipo derivado PONTO. <atributos >] ::] <lista de componentes > onde aqui o <tipo> pode ser um tipo de vari´vel intr´ a ınseca ou outro tipo derivado. E a a poss´ ıvel construirem-se estruturas progressivamente mais complicadas definindo-se novos tipos derivados que englobam aqueles previamente definidos. y e z do ponto no espa¸o ıdo e c cartesiano: program d e f t i p o d e r i m p l i c i t none type : : ponto real : : x .d o c u -tr . z end type ponto ! type ( ponto ) : : c e n t r o .0) ou seja.0 ! DIAGONAL_PRINCIPAL%P2= PONTO(1. mandou-se imprimir na tela o valor das vari´veis. Por exemplo. cada componente da vari´vel de tipo derivado pode ser ca a referenciada individualmente por meio do caractere seletor de componente.c o m 24 3. c e n t r o ! end program d e f t i p o d e r No exemplo acima.0. “%”. CENTRO%X= 0. Estruturas definidas desta forma podem ser interessantes quando o programador quer classificar determinados ´ objetos caracterizados por parˆmetros e/ou qualificadores representados por vari´veis de diferentes tipos.0.P2 END TYPE RETA TYPE (RETA) :: DIAGONAL_PRINCIPAL ! DIAGONAL_PRINCIPAL%P1%X= 0.0.d o TYPE [[.0.0) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 c u -tr a c k . a a Como foi mostrado na atribui¸˜o APICE%X= 0. 0 c e n t r o = ponto ( 0 . TYPE :: RETA TYPE (PONTO) :: P1. atribuiu-se os valores para a estas vari´veis. A declara¸˜o de uma lista ca de vari´veis do tipo derivado <nome do tipo> ´ feita atrav´s da linha: a e e TYPE (<nome do tipo >) [::] <lista de nomes> Para tentar-se entender o uso de uma vari´vel de tipo derivado. 0 .<acesso> ] ::] <nome do tipo > [PRIVATE] <declara¸~es de componentes > co END TYPE [<nome do tipo >] onde cada <declara¸˜o de componentes> tem a forma ca <tipo >[[. a p i c e print * . o qual ser´ a a constru´ a partir de trˆs valores reais. 0 . CENTRO%Y= 0. vamos definir um novo tipo: PONTO.0 DIAGONAL_PRINCIPAL%P1%Z= 0.0 DIAGONAL_PRINCIPAL%P1%Y= 0. 0 ) ! print * . y e z. 0 a p i c e%z= 0 .1.

por sua vez s˜o ternas de n´meros do tipo (x. notas parciais N1. N2 e N3 e m´dia final MF.d o c u -tr . N2 . caracterizado por NOME.3).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . O exemplo a seguir.d o Aqui foi definido o tipo RETA no espa¸o cartesiano. com um sinal de igual seguido da express˜o de inicializa¸˜o. Assim. Note o uso de dois seletores de componente para definir o valor da coordenada x do ponto P1 da DIAGONAL_PRINCIPAL. DIMENSION(100) :: MATRIZ os sub-objetos tais como MATRIZ(3)%VALOR ter˜o automaticamente o valor 2. ’ c o d i g o : ’ read * .0 e a seguinte opera¸˜o. z). 0 print * . d i s c e n t e%c o d i g o . (ver se¸˜o 7. a unica inicializa¸˜o admitida ´ o s´ ´ ca e ımbolo de atribui¸˜o de um ponteiro (=>). d i s c e n t e%n2 . ’ ’ print *. ca a Uma inicializa¸˜o n˜o deve necessariamente se aplicar a todos os componentes de um tipo derivado. mf end type a l u n o type ( a l u n o ) : : d i s c e n t e ! print * . ’ ( ’ . ’ Notas : N1 . que usa a ca uma fun¸˜o intr´ ca ınseca ASSOCIATED(MATRIX(3)%NEXT) vai retornar o valor . e e e ! Dados a c e r c a de a l u n o s usando t i p o d e r i v a d o . a qual ´ totalmente caracterizada por dois pontos. program a l u n o s i m p l i c i t none type : : a l u n o character ( len= 2 0 ) : : nome integer : : c o d i g o r e a l : : n1 . as inicializa¸˜es associadas a componentes s˜o co co a reconhecidas em todos os n´ ıveis.0 INTEGER INDEX TYPE(ENTRY). a inicializa¸˜o ´ feita de forma usual. n3 . por outro lado. d i s c e n t e%n3 d i s c e n t e%mf= ( d i s c e n t e%n1 + d i s c e n t e%n2 + d i s c e n t e%n3 ) / 3 . ca Se as declara¸˜es de tipos derivados estiverem aninhadas. CODIGO de matr´ ıcula. o uso do construtor de estrutura para definir a posi¸˜o do ponto ca P2. ’Nome : ’ read ’ ( a ) ’ . P1 e P2. d i s c e n t e%nome . O valor deve ıvel ser especificado quando o componente ´ declarado como parte da defini¸˜o do tipo. Definiu-se ent˜o a vari´vel DIAGONAL_PRINCIPAL a u a a como sendo do tipo RETA e definiu-se os valores dos dois pontos no espa¸o P1 e P2 que caracterizam a diagonal c principal. tornou-se poss´ inicializar os valores dos componentes dos tipos derivados. c e os quais.16). POINTER :: NEXT => NULL() END TYPE ENTRY Dada uma declara¸˜o de matriz tal como ca TYPE(ENTRY). Em ambos os casos os caracteres :: s˜o exigidos.’−−−−−−−−−−−> ’ . O programa lˆ as notas e calcula e imprime a m´dia final do aluno. ca seguida pela fun¸˜o intr´ ca ınseca NULL() (se¸˜o 7. y. Tipos de Vari´veis a 25 k lic lic k to bu y N O W ! w w w w . d i s c e n t e%c o d i g o print * . ’ Media f i n a l : ’ . ’ ) <−−−−−−−−−−−’ print * . como componente da diagonal principal. ack c w o . d i s c e n t e%mf end program a l u n o s c u -tr a c k . ca e a ca Se o componente for um ponteiro. Se o componente n˜o for e ca a um ponteiro. define o tipo ALUNO. d i s c e n t e%nome i f ( d i s c e n t e%nome == ’ ’ ) e xi t print * . d i s c e n t e%n1 .FALSE. N3 : ’ read * .c Em Fortran 95. Um ca a exemplo v´lido seria: a TYPE :: ENTRY REAL :: VALOR= 2. Note. n2 . TYPE :: NODO INTEGER CONTA TYPE(ENTRY) ELEMENTO END TYPE NODO TYPE(NODO) N Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 3.

HUGE(0). DIMENSION(100) :: MATRIZ= ENTRY(HUGE(0.d o c u -tr .c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 26 3. c˜ ca e c u -tr a c k .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .0. NULL()) em cuja situa¸ao a inicializa¸˜o inicial ´ ignorada. a Os componentes do tipo derivado continuam podendo ser inicializados em declara¸˜es de vari´veis do tipo.d o ocasiona que o componente N%ELEMENTO%VALOR ter´ automaticamente o valor 2. co a tais como TYPE(ENTRY).8. Tipos derivados k lic lic k to bu y N O W ! w w w w .0). ack c w o .

e tamb´m se as express˜es s˜o escalares ou matriciais. Se uma express˜o ou sub-express˜o n˜o ´ contida em parˆnteses. vari´veis ou fun¸˜es e uma express˜o. combinados de tal forma que estes a e seguem as regras de sintaxe. Cada operando deve ter valor definido e o a ´ resultados da express˜o deve ser matematicamente definido.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . por exemplo. ou sub-express˜o. equivalentes: 27 o m w w w w . l´gicas. parˆnteses podem ser usados a a a e para indicar qual sub-express˜o deve ser desenvolvida primeiramente. o programa descreve as opera¸˜es que devem ser executadas pelo computador. ou seja.c Cap´ ıtulo 4 Express˜es e Atribui¸˜es Escalares o co Em uma express˜o. a qual ´ uma express˜o que resultar´ no mesmo valor. com a exce¸˜o do operador “**” (ver se¸˜o 4. exceto por erros de arredondamento a e a a num´rico.d o c u -tr a c k .1 Regras b´sicas a Uma express˜o em Fortran 90/95 ´ formada de operandos e operadores. Na express˜o a a operando operador (operando operador operando) a sub-express˜o entre parˆnteses ser´ desenvolvida primeiro e o resultado usado como um operando para o a e a primeiro operador. ´ permitido ao processador desenvolver uma a a a e e e express˜o equivalente.d o c u -tr a c k ! w o . por si a co a mesma. tamb´m pode ser usada como operando. caracteres ou de tipo o co a a a e o derivado. quando ent˜o a express˜o completa ser´ desenvolvida usando a norma padr˜o. o a 4. As duas opera¸˜es a seguir s˜o.c O W w . O a co resultado desta express˜o pode ent˜o ser atribu´ a uma vari´vel. da a a a a esquerda para a direita. antes de outra. dependendo se as vari´veis em quest˜o s˜o num´ricas. e Uma express˜o simples envolvendo um operador unit´rio ou mon´dico tem a seguinte forma: a a a operador operando um exemplo sendo -Y J´ uma express˜o simples envolvendo um operador bin´rio (ou di´dico) tem a forma: a a a a operando operador operando um exemplo sendo X + Y Uma express˜o mais complicada seria a operando operador operando operador operando onde operando consecutivos s˜o separados por um unico operador. Os operandos podem ser constantes. H´ diferentes conjuntos de regras para a a ıdo a a express˜es e atribui¸˜es. Caso seja e ca ca necess´rio desenvolver parte de uma express˜o.2). em princ´ e co a ıpio. divis˜o por zero n˜o ´ permitido. e o a Cada um dos conjunto de regras para express˜es escalares ser´ agora discutido. a a a e A sintaxe do Fortran estabelece que as partes de express˜es sem parˆnteses sejam desenvolvidas da esquerda o e para a direita para operadores de igual precedˆncia.

1: Operadores num´ricos escalares e Operador ** * / + - Opera¸˜o ca Potencia¸˜o ca Multiplica¸˜o ca Divis˜o a Adi¸˜o ca Subtra¸˜o ca A/B/C ou A/(B*C) Poss´ ıveis diferen¸as nos resultados das opera¸˜es acima consistem em diferentes erros de arredondamento e/ou c co tempo de processamento. real e complexo.d o c u -tr a c k .1. caso o processador consiga multiplicar mais rapidamente que dividir.2 Express˜es num´ricas escalares o e Uma express˜o num´rica ´ aquela cujos operandos s˜o um dos trˆs tipos num´ricos: inteiro. as opera¸˜es matem´ticas a seguir: co a x−y deve ser digitada: X**(-Y).d o c u -tr . ca c˜ e e Na ausˆncia de parˆnteses ou dentro destes.c Tabela 4. como se escreve em uma express˜o matem´tica. sendo sempre necess´rio o uso do operador e a ca a “*”. no m´ ınimo. Como j´ foi mencionado na se¸˜o 4. em ordem de precedˆncia. Portanto. ack c w o . vari´veis ou fun¸˜es.1.1. a ca a e a ˆ Os parˆnteses devem indicar os agrupamentos. Se dois operadores seguem-se imediatamente. a sintaxe pro´ que um operador ´ ca ıvel e e a ıbe bin´rio siga outro operador. os quais tˆm a mesma precedˆncia entre si. a a 4. Na tabela 4. ˆ De acordo com a tabela 4. como em operando operador operador operando a unica interpreta¸˜o poss´ ´ que o segundo operador ´ mon´dico. por sua vez.1 apresenta os operadores. o n´mero de parˆnteses ` esquerda deve sempre ser igual ao n´mero de parˆnteses ` direita. como em ca ca a -VELOCIDADE ˆ Uma vez que n˜o ´ permitido na nota¸˜o matem´tica ordin´ria. O operador de potencia¸˜o “**” ´ o de maior precedˆncia.2. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 28 4. Express˜es num´ricas escalares o e k lic lic k to bu y N O W ! w w w w . um operador bin´rio tamb´m n˜o pode seguir outro operador. Os parˆne a a e teses indicam que as opera¸˜es dentro deles devem ser executadas prioritariamente: co 3 (a+b) (x + y)2 + w2 deve ser digitada: (A+B)*((X+Y)**2 + W**2)**3 ou (A+B)*(((X+Y)**2 + W**2)**3) ˆ Os parˆnteses n˜o podem ser usados para indicar multiplica¸˜o. que n˜o a afetam: a e a X + Y ´ equivalente a ((X) + Y) ou equivalente a ((X + Y)) e Contudo. seguindo o a e ca a co seguinte conjunto de regras: ˆ Os operadores de subtra¸˜o “-” e de adi¸˜o “+” podem ser usados como operadores unit´rios. Estes operadores e s˜o conhecidos como operadores num´ricos intr´ a e ınsecos. a opera¸˜o matem´tica 2x2 + y ca a pode ser expressa de. uma subtra¸˜o ou adi¸˜o unit´ria n˜o a e ca a a ca ca a a pode seguir imediatamente ap´s outro operador. os operadores de e ca e e multiplica¸˜o “*” e divis˜o “/” tˆm a mesma precedˆncia entre si e possuem precedˆncia sobre os operadores de ca a e e e adi¸˜o “+” e subtra¸ao “-”. e o seu respectivo significado. no caso de sub-express˜es. co co Uma express˜o num´rica especifica uma computa¸˜o usando constantes. antes de adi¸˜es ou subtra¸˜es.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . x(−y) deve ser digitada : X*(-Y). u e a u e a ˆ Nenhum operador pode ser deixado impl´ ıcito: 5*T ou T*5: correto 5T. a e e a e e A tabela 4. Qualquer express˜o pode ser envolvida por parˆnteses exteriores. o e a e Por exemplo. seguidos das exponencia¸˜es que ser˜o realizadas antes de multiplica¸˜es ou divis˜es e e a co co a co o estas. a opera¸˜o com a maior precedˆncia e e o ca e ´ o c´lculo das fun¸˜es. Quando isto ´ necess´rio. a qual fornece o ordenamento dos operadores. 5(T) ou T5: incorreto. deve-se fazer uso de parˆnteses. duas maneiras equivalentes: 2*X**2 + Y ou 2*(X**2) + Y ou ainda (2*(x**2)) + Y. somente um operador unit´rio. as linhas horizontais confinam os operadores de igual precedˆncia e a ordem de precedˆncia e e ´ dada de cima para baixo.

no case de um valor complexo ser elevado a ca a ´ ca uma potˆncia tamb´m complexa. A REAL(A. -.2: Tipos de resultados de A .3.KIND(A) B Tipo de resultado I R C R R C C C C Tabela 4.op.op.c Tabela 4.KIND(B)) A A CMPLX(A. Express˜es e Atribui¸˜es Escalares o co 29 k lic lic k to bu y N O W ! w w w w . enquanto que o valor de 2**(-3) ´ 0.d o c u -tr a c k .KIND(B) A A A Valor de B usado na . ˆ Para dados inteiros. onde . Por isto.0. Esta ´ uma express˜o de modo misto. ack c w o .0. e Este fato deve sempre ser levado em conta quando divis˜es de inteiros est˜o sendo realizadas.3 Atribui¸˜es num´ricas escalares co e <vari´vel> = <express~o> a a A forma geral de uma atribui¸˜o num´rica escalar ´ ca e e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 4.3: Tipos de resultados de A**B.0.KIND(B)) CMPLX(A. para o tipo mais forte. e e ˆ A regra padr˜o do Fortran 90 tamb´m permite que uma express˜o num´rica contenha operandos num´ricos a e a e e de diferentes tipos ou esp´cies. o resultado de e 6/3 ´ 2 e 8/3 ´ 2 e -8/3 ´ -2. ou coagido. co e ˆ Com rela¸˜o ` ultima opera¸˜o mencionada na tabela 4.2 e 4. B. ca e As tabelas 4. inicialmente a e e e a I sendo convertido a real antes que a multiplica¸˜o seja efetuada e o resultado da mesma ´ do tipo real. ab = exp(b(log |a| + e e a e i arg a)). com −π < arg a < π. se A ´ real e I ´ inteiro. 4. B B B REAL(B.0. A express˜o a A**B**C ´ v´lida e ´ desenvolvida da direita para a esquerda como e a e A**(B**C).d o c u -tr . para o valor inteiro a a e cuja magnitude ´ igual o logo inferior que a magnitude do valor exato. A REAL(A. Assim. o o a valor de 2**3 ´ 8. isto ´.KIND(B)) A A CMPLX(A.KIND(B) A A A Valor de B usado na . Por exemplo.KIND(A) CMPLX(B. Tipo de A I I I R R R C C C Tipo de B I R C I R C I R C Valor de A usado na . a express˜o A*I tem.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ´ +.0. e Tipo de A I I I R R R C C C Tipo de B I R C I R C I R C Valor de A usado na . isto ´. o resultado de qualquer divis˜o ser´ truncado para zero.op.3 ilustram os resultados de diferentes opera¸˜es num´ricas escalares. B B B B B B B CMPLX(B.op. Exceto quando elevando um valor e e a real ou complexo a uma potˆncia inteira. o objeto do tipo mais fraco (ou mais simples) de vari´vel dos e a dois tipos envolvidos em uma express˜o ser´ convertido.KIND(A) B Tipo de resultado I R C R R C C C C ˆ A exce¸˜o ` regra esquerda-para-direita para operadores de igual precedˆncia ocorre para a potencia¸˜o ca a e ca “**”. * ou /. o resultado corresponder´ ao valor principal.KIND(B)) CMPLX(A.0. O resultado a a ser´ tamb´m do tipo mais forte.KIND(A) B B CMPLX(B.op.0.op.

Fortran 77: somente a forma apresentada na coluna 2 ´ v´lida. por´m.KIND(<vari´vel>) a a REAL(<express~o.3 A= (4. no exemplo. No terceiro exemplo acima. Se os comprimentos diferem.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Da mesma forma. c u -tr a c k . a ca como as express˜es envolvem dois tipos distintos. Se <express~o> a e a e a e a e a n˜o ´ do mesmo tipo ou esp´cie da <vari´vel>. e .01935. respectivamente. as esp´cies devem ser as mesmas e as as letras (ou n´meros ou caracteres c˜ e u especiais) s˜o comparados da esquerda para a direita at´ que uma diferen¸a seja encontrada ou ambos os a e c caracteres sejam idˆnticos. atribuindo uma express˜o a a real a uma vari´vel real de uma esp´cie com precis˜o menor tamb´m causar´ perda de precis˜o. em ordem decrescente de precedˆncia. s˜o desenvolvidas antes da compara¸˜o com os operadores relacionais.c s˜o. O resultado de uma compara¸˜o deste tipo tem como resultado um dos dois valores l´gicos poss´ ca o ıveis em um ´lgebra booleana: .4: Convers˜o num´rica para o comando de atribui¸ao <vari´vel> = <express~o>. a forma apresentada na coluna 3 ´ a mais e a e e moderna e recomend´vel.TRUE.EQ. a 4. a e a e a a a atribui¸˜o de uma express˜o complexa a uma vari´vel n˜o complexa resultar´. Na coluna 1 da tabela.J CHAR1 == ’Z’ ! ! ! ! express~o a express~o a express~o a express~o a relacional relacional relacional relacional inteira real de modo misto de caractere Os operadores num´ricos tˆm precedˆncia sobre os operadores relacionais.2. ! A do tipo real.12372) ! I do tipo inteiro. 2.5 Express˜es e atribui¸˜es l´gicas escalares o co o Constantes. a sua forma escrita com caracteres e especiais.NE. Por exemplo. exceto se o resultado for exatamente inteiro. A e B do tipo real o a e CHAR1 do tipo caractere padr˜o: a I . na coluna 3. cada express˜o ´ desenvolvida separadamente e ent˜o ambas o a e a s˜o convertidas ao tipo e esp´cie da soma dos resultados de cada express˜o. s˜o: o e a Tabela 4. vari´veis e fun¸˜es l´gicas podem aparecer como operandos em express˜es l´gicas. sendo I e J do tipo inteiro. na ca a o e coluna 2 a sua forma escrita com caracteres alfanum´ricos e. antes a e a que a compara¸ao seja feita. KIND(<vari´vel>) a a CMPLX(<express~o>. e . Exemplos de express˜es relacionais s˜o dadas abaixo.d o onde <vari´vel> ´ uma vari´vel num´rica escalar e <express~o> ´ uma express˜o num´rica.FALSE. a vari´vel mais curta ´ suposta preenchida por brancos e a e a ` direita.5 apresenta os operadores relacionais escalares. Assim. ent˜o a atribui¸˜o ir´ resultar a a a a ca a em perda de precis˜o.d o c u -tr .LT. de acordo com a tabela 4. a e c˜ a a Tipo de <vari´vel> a I R C Autor: Rudi Gaelzer – IFM/UFPel Valor atribu´ ıdo INT(<express~o>.01935.4. a Se uma ou ambas as express˜es forem complexas.KIND(<vari´vel>) a a Impresso: 24 de abril de 2008 o m 30 4.4 Operadores relacionais A tabela 4. o resultado de (I .4. utilizados em opera¸˜es que envolvem a compaco ra¸˜o entre duas vari´veis ou express˜es. Portanto.) s˜o o a dispon´ ıveis. ca Deve-se notar que se o tipo da <vari´vel> for inteiro mas a <express~o> n˜o. Os operadores a co o o o l´gicos. a primeira ser´ convertida ao tipo e esp´cie da ultima antes a e e a a e ´ que a atribui¸˜o seja realizada. somente os operadores == e /= (ou . Similarmente. os valores de I e A ap´s as atribui¸˜es a o co I= 7. e este tipo de teste ´ de crucial importˆncia no controle do fluxo do a e a programa. ´ apresentado o significado do operador. 0 A < B A + B > I . sendo a outra considerada obsoleta. de acordo com as regras dadas na tabela 4.J) ser´ convertido a real. 7 e 4. na perda da parte imagin´ria. as express˜es num´ricas. Operadores relacionais k lic lic k to bu y N O W ! w w w w . caso e e e o e existam. e a Fortran 90/95: qualquer uma das duas formas ´ v´lida. 4. ack c w o . c˜ a Para compara¸oes de caracteres. no m´ ca a a a a ınimo.

K . .d o c u -tr .NEQV.EQ. tal como no exemplo abaixo: a o FLAG= (. ..LT.6 – 4.NOT. (nega¸˜o l´gica) ca o Operadores bin´rios: a .NOT.AND. K . ´ usado como operador unit´rio. .NEQV. E l´gico) ca o o .OR.EQV. Express˜es e Atribui¸˜es Escalares o co 31 k lic lic k to bu y N O W ! w w w w .LE.TRUE.7: Tabela-Verdade .GE.NOT. por exemplo. POLE Tabela 4. . Na terceira express˜o. .AND. L) .FALSE.NOT. K I .AND.8: Tabela-Verdade .OR.OR.OR. J J .8. J seja desenvolvida primeiro.NOT. A T F .c Tabela 4.NOT.5: Operadores relacionais em Fortran 90/95 Significado Maior que Menor que Igual a Maior ou igual Menor ou igual Diferente de Operador unit´rio: a .OR.AND. .TRUE. L . .TRUE. B T F F F A T T F F B T F T F A . J . pode ser inferido a o a o facilmente atrav´s da consulta `s Tabelas-Verdade 4. OU l´gico) a o o .J. (uni˜o l´gica.FALSE. A F T A T T F F B T F T F A . Tabela 4. e a Uma vari´vel l´gica pode ter um valor pr´-determinado por uma atribui¸˜o no corpo de comandos do a o e ca programa: FLAG= . e o resultado combinado com a I. ack c w o . (equivalˆncia l´gica) e o . ou . as regras de precedˆncia a e a a e implicam em que a sub-express˜o L . as duas sub-express˜es .NOT..GT. J O resultado de uma express˜o l´gica envolvendo duas vari´veis l´gicas A e B.AND. B T T T F Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 4.NOT. I Na primeira express˜o o . a e o Forma obsoleta .NOT.6: Tabela-Verdade .AND. ou no corpo de declara¸˜es de vari´veis: co a LOGICAL :: FLAG= .. a e ca a O resultado de qualquer express˜o l´gica ´ . Na ultima express˜o.AND. L ser˜o desenvolvidas e comparadas ´ a o a para testar n˜o-equivalˆncia.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .L ent˜o as seguintes express˜es l´gicas s˜o v´lidas: a o o a a . (n˜o-equivalˆncia l´gica).K.EQV. BANNER= .NOT.d o c u -tr a c k .NOT. Tabela 4.AND. (intersec¸˜o l´gica.NE.OR. L) . J e .NOT. Forma moderna > < == >= <= /= Dada ent˜o uma declara¸˜o de vari´veis l´gicas do tipo a ca a o LOGICAL :: I. o resultado da compara¸˜o ser´ combinado com I. K . . J (. e este valor pode ent˜o ser atribu´ a uma a o e a ıdo vari´vel l´gica.

& &Sirvam nossas fa¸anhas.d o c u -tr . o qual tem o o e c˜ efeito de combinar dois operandos de caracteres em um unico caractere resultante. . IF((B**2 < 10.AND.6.c 4. (A > 0.FALSE.0 onde os operadores relacionais tˆm precedˆncia sobre os operadores l´gicos.AND. mesmo que se queira a o isolar somente um caractere da vari´vel. ina ı justa guerra. Contudo. X= 2. IF((A < B) .) a ’ Pode-se isolar qualquer parte da vari´vel HINO usando-se a nota¸˜o de substring a ca HINO(I:J) onde I e J s˜o vari´veis inteiras.Y > 0. Consideremos a seguinte declara¸˜o da vari´vel de caractere HINO.0))THEN . o precursor da liberdade. e Uma outra opera¸˜o poss´ com vari´veis de caracteres ´ a extra¸˜o de “peda¸os” (substrings) das vari´veis.. . escrita como ’AB’//’CD’ ´ a constante ’ABCD’. o uso mais freq¨ente de e e o u express˜es que envolvem operadores num´ricos. nesta ´mpia. ca Os resultados de diversas express˜es relacionais podem ser combinados em uma express˜o l´gica.6 Express˜es e atribui¸˜es de caracteres escalares o co O unico operador intr´ ´ ınseco para express˜es de caracteres ´ o operador de concatena¸ao “//”.0. Por exemplo. Alguns exemplos de substrings da vari´vel HINO s˜o: a a a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 32 4. Os dois a a pontos “:” s˜o usados para separar os dois ´ a ındices da substring e s˜o sempre obrigat´rios. ack c w o . o resultado.OR. a qual tem o comprimento igual a 236 ca a caracteres e cujo valor ´ atribu´ no momento da declara¸˜o: e ıdo ca CHARACTER(LEN=236):: HINO = ’Qual aurora precursora. relacionais e l´gicos ocorre em testes destinados a determinar o o e o fluxo do programa. . ou atribui¸˜o. X < 0. todos os operando e resultados foram do tipo l´gico. J´ no segundo exemplo. B= 1. . a Substrings de caracteres.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . as quais localizam explicitamente os caracteres de I a J em HINO.0) . de moc delo ` toda Terra (. como no caso: ca REAL :: A. e o a c u -tr a c k .OR. B. & &Foi o 20 de setembro. Y > 1. .0 . ca ıvel a e ca c a os quais consistem em um determinado grupo de caracteres contidos na vari´vel. como no caso do comando IF.5. Nenhum outro tipo de vari´vel pode o a participar de uma opera¸˜o l´gica intr´ ca o ınseca. Express˜es e atribui¸˜es de caracteres escalares o co k lic lic k to bu y N O W ! w w w w . e os comandos ap´s o THEN ser˜o executados. do farol da divindade. & &Mostremos valor.. const^ncia.TRUE. (X .d o Nos exemplos acima. . seguida de o a o atribui¸˜o. o resultado da concatena¸˜o das constantes de caractere ’AB’ o ca e ’CD’. de extens˜o igual ` soma das ´ a a extens˜es dos operandos originais. . e co ´ . levando em conta a hierarquia das precedˆncias nas diferentes opera¸˜es. COND= A > B . e os comandos contidos ap´s a cl´usula THEN n˜o ser˜o executados.0))THEN . Y= 5. o resultado e o a a a a ´ .0 .0. . Y LOGICAL :: COND . No primeiro teste IF acima. X. exemplificado abaixo e que ser´ discutido em mais detalhes a no cap´ ıtulo 5: REAL :: A= 0.

Por exemplo. esta ser´ preenchida completaa a a mente e o restante do valor ser´ truncado: a PARTE2= HINO(:22) ! Resulta em PARTE2= ’Qual auror’ Finalmente. inclusive com os operadores > e <. Neste caso. HINO = ’Qual aurora precursora. do farol da divindade..PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Se o resultado da express˜o no lado direito for menor que o tamanho da vari´vel. se e e o valor superior ´ omitido. H´ valores padr˜o para os ´ a a ındices das substrings. c Se letras min´sculas s˜o dispon´ u a ıveis. ack c w o . ser˜o sempre os valores antigos ca a os usados no lado direito da express˜o.) c a ’ Os lados esquerdo e direito de uma atribui¸˜o podem ser sobrepor. n˜o se trata de testar qual caractere ´ ´ a e maior ou menor que outro. a PARTE2(3:5) = PARTE2(1:3) resulta em PARTE2= ’QuQuaauror’. e Pode-se tamb´m fazer concatena¸˜es com substrings: e co HINO(6:11)//HINO(69:79) gera a constante ’aurora de setembro’ TROCADILHO= HINO(153:157)//’s’//HINO(191:199) atribui ` TROCADILHO o valor ’´mpias fa¸aa ı c nhas’. ˆ Espa¸o em branco precede A e Z precede 0. que precede Z. Express˜es e Atribui¸˜es Escalares o co 33 k lic lic k to bu y N O W ! w w w w .c As constantes de caracteres resultantes das substrings podem ser ent˜o atribu´ a ıdas a outras vari´veis de caraca teres. Compara¸˜es e uso de operadores relacionais com vari´veis/constantes de caracteres s˜o poss´ co a a ıveis entre caracteres unicos. precede Y. que precede 9. nesta ´mpia. const^ncia. ue ca O Fortran 90/95 determina que a seq¨ˆncia de intercala¸˜o para qualquer arquitetura deve satisfazer as ue ca seguintes condi¸˜es: co ˆ A precede (´ menor) que B.d o HINO(6:11) HINO(60:79) HINO(140:140) !Correspondente a ’aurora’ !Correspondente a ’Foi o 20 de setembro’ !Correspondente a ’^’ a c u -tr a c k . o valor 1 ´ assumido.d o c u -tr .. e ˆ 0 precede 1. ´ poss´ substituir parte de uma vari´vel de caractere atrav´s usando-se uma substring da mesma e ıvel a e em uma atribui¸˜o: ca HINO(50:113)= ’AAAAAAAAAAARRRRRRRRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHH!!!!!$%#$%%&%#%$#’ de tal forma que resulta. e a e HINO(:50) ´ equivalente a HINO(1:50) e HINO(100:) ´ equivalente a HINO(100:236)..1 a qual ordena o armazenamento destes caracteres pelo sistema. injusta guerra. precede 8. o valor ´ atribu´ ` vari´vel a a e ıdo a a come¸ando-se pela esquerda e o espa¸o restante ´ preenchido por brancos: c c e CHARACTER(LEN= 10) :: PARTE1. Neste caso.. Em um sistema computacional. ou branco precede 0 e 9 precede A.. & a ı &Sirvam nossas fa¸anhas. que precede C . PARTE2 PARTE1= HINO(178:183) ! Resulta em PARTE1= ’Sirvam ’ Ao passo que se o resultado da express˜o foi maior que o tamanho da vari´vel. de modelo ` toda Terra (. Assim. ent˜o a 1 Collating sequence. caracteres possuem uma propriedade denominada seq¨ˆncia de intercala¸˜o.. Se o ´ ındice inferior ´ omitido. que precede 2 . AAAAAAAAAAA& &RRRRRRRRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHH!!!!!$%#$%%&%#%$# & &Mostremos valor. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 4. um valor correspondente ao comprimento da vari´vel ´ assumido.

Fortran 90/95 fornece acesso tamb´m ` seq¨ˆncia de intercala¸˜o original da tabela ASCII2 atrav´s de fun¸˜es e a ue ca e co intr´ ınsecas (se¸˜o 7. estes n˜o geram caracteres que podem ser impressos. que precede c.9: Tabela de c´digos ASCII de 7 bits. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 34 4.d o c u -tr a c k .. o Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F Char NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US (null) (start of heading) (start of text) (end of text) (end of transmission) (enquiry) (acknowledge) (bell) (backspace) (horizontal tab) (line feed. C´digos ASCII representam textos em computadores.d o c u -tr . / 0 1 2 3 4 5 6 7 8 9 : . ack c w o . block) (cancel) (end of medium) (substitute) (escape) (file separator) (group separator) (record separator) (unit separator) Dec 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 Hex 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F Char Space ! “ # $ % & ’ ( ) * + .. . J´ a ca e a a os caracteres restantes (32 – 126) comp˜e-se de caracteres alfanum´ricos mais caracteres especiais. baseado no alfabeto inglˆs.9 mostra os caracteres ca o ASCII originais. juntamente com os seus identificadores nos sistemas num´ricos decimal.6.6. que precede z. equipamentos e o de comunica¸˜o e outros dispositivos eletrˆnicos que trabalham com texto. destinados ` comunica¸˜o com perif´ricos. precede y.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Os primeiros 32 (0 – 31) caracteres mais o caractere 127 s˜o caracteres o a de controle. new line) (vertical tab) (form feed. < = > ? Dec 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 Hex 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F Char @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ˆ Dec 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Hex 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F Char ‘ a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ˜ DEL ˆ a precede b. e De acordo com estas regras. n˜o h´ regra que estabele¸a que os n´meros devem preceder ou n˜o as letras.1).c Tabela 4. . nem tampouco h´ regra a a c u a a de precedˆncia para caracteres especiais. ASCII consiste em uma padroniza¸˜o para um encodeamento de caracteres3 de 7 bits ca ca (originalmente). c Assim. A tabela 4. ou branco precede 0 e 9 precede a. encoding. ˆ Espa¸o em branco precede a e z precede 0. new page) (carriage return) (shift out) (shift in) (data link escape) (device control 1) (device control 2) (device control 3) (device control 4) (negative acknowledge) (synchronous idle) (end of trans. hexadecimal e octal. as express˜es relacionais o ’A’ < ’B’ ’0’ < ’1’ fornecem ambas o resultado T (true). o e 2 American 3 Character Standard Code for Information Interchange (ASCII). e bem como o c´digo html correspondente. Express˜es e atribui¸˜es de caracteres escalares o co k lic lic k to bu y N O W ! w w w w .

esta seq¨ˆncia simples de comandos ´. por si s´. O final de um la¸o DO ´ especificado por um r´tulo determinado no in´ do mesmo la¸o. o bloco deve conter o construto interno por inteiro. Ao inv´s. podemos querer somar o e 1000 elementos de uma matriz. pelo comando GO TO. para alguns compiladores. dependendo se um valor calculado ´ positivo ou negativo. o qual ´ um construto (uma constru¸˜o ou estrutura) que e e ca come¸a com uma palavra-chave inicial. podemos desejar seguir um de dois poss´ c˜ ıveis caminhos em uma se¸˜o de ca c´digo. inserido entre as colunas 1 e 5 de um programa ou o u sub-programa em Fortran 77 escrito. Execu¸˜o de um bloco a ca sempre inicia com o seu primeiro comando execut´vel.1. 5. Podemos querer e ca ´ ca e a passar o controle de uma parte do programa a outra ou ainda parar completamente o processamento. Por exemplo.d o c u -tr a c k ! w o . recursos s˜o dispon´ o a ıveis em Fortran que possibilitam o controle do fluxo l´gico atrav´s o e dos comandos no programa. embora tais casos sejam raros. Construtos execut´veis podem ser aninhados (em inglˆs.1 Comandos obsoletos do Fortran 77 Os comandos descritos nesta se¸˜o fazem parte do padr˜o do Fortran 77 mas que s˜o considerados obsoletos ca a a no Fortran 90/95. por exemplo. A raz˜o para este status de obsoleto ´ porque estes comandos a e facilmente geram dificuldades e d˜o margem a confus˜o durante a leitura do programa. H´ trˆs raz˜es para se usar um r´tulo: a e o o 1. de 1 a 99999.1 R´tulos (statement labels) o Um r´tulo consiste em um n´mero inteiro. Neste caso. c e o ıcio c 2. Para este prop´sito. Qualquer comando execut´vel pode possuir um r´tulo afixado. Este r´tulo enfatiza o ponto do c´digo onde ele o o se encontra. escrever 1000 adi¸˜es e atribui¸˜es ´ uma tarefa claramente tediosa e n˜o muito co co e a eficiente. O seu uso em um programa escrito nas ultimas vers˜es da linguagem ´ fortemente desen´ o e corajado e. um bloco pode conter um outro a e e construto execut´vel. inadequada para a co ue e o formula¸ao do problema. isto ´. Isto ´ realizado. a a 5. nested ). seguidos daqueles que somente existem no Fortran 90/95. de tal forma que o fluxo do c´digo pode a o o ser transferido ao mesmo.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . proibido. portanto. e 35 o m w w w w . Os recursos contidos em Fortran 90 correspondem aos que agora s˜o geralmente a reconhecidos como os mais apropriados para uma linguagem de programa¸˜o moderna. e 3. no formato fixo. Um bloco pode ser vazio. a habilidade de realizar uma itera¸˜o sobre uma unica adi¸˜o ´ necess´ria. contudo. pois esta ´ a maneira como os comandos READ e WRITE o e fazem referˆncia ao mesmo. a qual ´ executada passo-a-passo. Como outro exemplo.c Cap´ ıtulo 5 Comandos e Construtos de Controle de Fluxo Nos cap´ ıtulos anteriores foi descrito como comandos de atribui¸˜o devem ser escritos e como estes podem ca ser ordenados um ap´s o outro para formar uma seq¨ˆncia de c´digo. Todo comando FORMAT deve possuir um r´tulo. Na o ue o e maior parte das computa¸˜es. a Os primeiros comandos de controle de fluxo a ser mencionados ser˜o aqueles que foram definidos no Fortran a 77 quanto no Fortran 90/95. Cada seq¨ˆncia de comandos entre as palavras-chave ´ chamada de ue e um bloco. pode ter palavras-chave intermedi´rias e que termina com uma palavrac a chave final que identifique a palavra inicial.d o c u -tr a c k . Sua forma geral ´ a de ca e um construto de bloco (do inglˆs block construct).c O W w .

ent~o os soma. ca a e real ou real de precis˜o dupla. Contudo. Sua forma geral ´: e GO TO <r´tulo> o Um exemplo de aplica¸˜o deste comando pode ser visto acima. . embora dois dos r´tulos possam ser ca e o iguais.1.] <express~o inteira> o o o a A <express~o inteira> ´ desenvolvida. entretanto. Tais programas s˜o usualmente dif´ a ıceis de ser compreendidos e corrigidos..1. A <express~o aritm´tica> pode ser inteira. END= 9999) VALOR 200 FORMAT(F20. O controle do fluxo ´ transferido ao comando afixado ao <r´tulo 1> se o valor a e o for negativo. O mesmo a o ue r´tulo pode estar presente mais de uma vez na lista.d o Exemplo: c (F77) L^ n´meros de um arquivo de entrada at´ que ele termine.3 Comando GO TO computado O comando GO TO computado ´ uma alternativa para um bloco IF para as situa¸˜es em que um n´mero e co u grande de op¸oes devem ser consideradas e elas podem ser selecionadas por uma express˜o de valores inteiros. ack c w o . <r´tulo 2>.2 Comando GO TO incondicional O comando GO TO incondicional simplesmente transfere o fluxo do c´digo para um comando rotulado em o algum outro ponto do programa.0) SOMA= SOMA + VALOR GO TO 100 9999 CONTINUE WRITE(UNIT= *.4 Comando IF aritm´tico e A forma geral do comando IF aritm´tico ´: e e IF (<express~o aritm´tica>) <r´tulo 1>. 5. SOMA e O comando CONTINUE significa. ao <r´tulo 2> se for zero e ao <r´tulo 3> se for positivo.d o c u -tr . isto ´. devido co a ıvel a a falta de alternativas de estruturas de controle. c˜ a A forma geral do comando ´: e GO TO (<r´tulo 1>. FMT=*)’SOMA dos valores ´:’.. “continue”.c 5. uma vez que se suas ramifica¸˜es forem usadas sem cuidado.1. FMT= 200. o o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 36 5. o controle ´ transferido ao comando afixado ao <r´tulo 2> e o e e o assim por diante. ele apenas instrui o programa a continuar a e partir daquele ponto. o O GO TO computado sofre das mesmas desvantagens que o GO TO incondicional. a e o o comando n˜o tem efeito e o fluxo do programa continua com o pr´ximo comando em seq¨ˆncia. literalmente. ou outro. c O uso do GO TO incondicional torna poss´ escrever-se programas com uma estrutura bastante indiscipliıvel nada.1.<r´tulo 2>. Bons programadores usam este comando raras vezes ou nunca.<r´tulo 3> a e o o o Este comando geralmente fornece uma ramifica¸˜o com trˆs possibilidades. o programa se torna ileg´ de t˜o complexo. co ıvel a 5.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . se o resultado ´ 2 (dois). ´ permitido transferir o fluxo com o c e comando GO TO.0 100 READ(UNIT= IN. para fora de um bloco IF ou la¸o DO. no Fortran 77 em algumas situa¸˜es n˜o era poss´ evit´-lo. Comandos obsoletos do Fortran 77 k lic lic k to bu y N O W ! w w w w . Se o resultado da express˜o ´ menor que um ou maior que N (havendo N r´tulos na lista). o controle ´ transferido ao comando a e e e afixado ao <r´tulo 1>. o que o torna uma ramifica¸˜o de duas possibilidades.. c u -tr a c k . <r´tulo N>)[. A unica exce¸˜o para seu uso ´ a proibi¸˜o ca ´ ca e ca de transferir o fluxo para dentro de um bloco IF ou la¸o DO. se o seu resultado ´ 1 (um). e u e a SUMA= 0.

Ele deve estar afixado a um comando execut´vel em alguma linha posterior do programa ou sub-programa. cuja fun¸˜o foi exemplificada na se¸˜o e a ca ca 5. As formas gerais destes comandos s˜o: a ASSIGN <r´tulo> TO <vari´vel inteira> o a GO TO <vari´vel inteira> [. mas isto significa que o u co e conte´do do la¸o n˜o ser´ executado e o controle do fluxo ´ transferido ao primeiro comando ap´s o r´tulo. uma vez para cada a valor de uma vari´vel denominada vari´vel de controle do la¸o (loop-control variable).1. a vari´vel n˜o mais possui um valor aritm´tico. atuando assim como um subrotina interna.1. c a A regra permite que este comando seja qualquer comando execut´vel.0 DO 15.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . <limite>. O n´mero de itera¸˜es a a c u co depende dos parˆmetros do comando DO no cabe¸alho do la¸o. o tamanho do passo ´ implicitamente igual a um. a vari´vel somente pode ser usada em um comando GO o o e a a TO atribu´ ıdo. c Exemplo de la¸os DO encadeados. o seu valor ´ a a e assumido igual a um. a c c A primeira vers˜o de um bloco ou la¸o DO cont´m um r´tulo que indica o ultimo comando do la¸o. ela deve ser uma vari´vel escalar (n˜o um c a a elemento de matriz) e pode ser dos tipos inteiro.d o c u -tr . o n´mero de itera¸˜es ´ e ı u co e zero. por exemplo). <passo> o a ı DO <r´tulo> [. a Os valores de <in´cio>.] [(<r´tulo>. <limite> e <passo> podem ser express˜es tamb´m dos tipos inteiro. <limite> o a ı Na segunda forma. SOMA= 0. exceto outro comando de controle (como a o IF. Um n´mero nulo de itera¸˜es ´ permitido.d o c u -tr a c k .1. NY) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 5.] <vari´vel> = <in´cio>.. O <r´tulo> marca o ultimo comando do e o ´ la¸o.<r´tulo>)] a o o o Um GO TO atribu´ pode ser usado para fornecer uma liga¸˜o para e a partir de uma se¸˜o de um programa ıdo ca ca ou sub-programa..N SOMA= SOMA + X(I)**2 15 CONTINUE ------------------------------C Inicializa as componentes da matriz FIELD iguais a zero.] <vari´vel> = <in´cio>. uma vez que este ´ determinado antes do in´ da primeira itera¸˜o..5 Comandos ASSIGN e GO TO atribu´ ıdo . real ou dupla precis˜o.6 La¸os DO rotulados c O comando DO controla um bloco de comandos os quais s˜o executados repetidas vezes. O comando ASSIGN atribui o valor de um r´tulo a uma a o vari´vel inteira. Nota-se que se o valor de limite ´ menor que in´cio. u co a e e ıcio ca A vari´vel de controle do la¸o pode ser usada em express˜es mas um novo valor n˜o pode ser atribu´ a ela a c o a ıdo dentro do la¸o. mas ´ recomend´vel que se use o comando CONTINUE. exceto no case de passo ser negativo. limite ou passo.<r´tulo>. O n´mero de itera¸˜es a ser realizadas ´ calculado antes do in´ da primeira itera¸˜o e u co e ıcio ca ´ dado pela f´rmula: e o itera¸~es = MAX(0. a vari´vel somente pode ser usada em um comando READ ou e a WRITE. este n˜o pode ser zero. real ou ı o e precis˜o dupla.in´cio + passo)/passo)) co ı onde a fun¸˜o impl´ ca ıcita INT toma a parte inteira do argumento por truncagem e a fun¸˜o MAX toma o maior ca valor dos seus dois argumentos. mas se torna o pr´prio a e a a e o r´tulo. a Comandos dentro do la¸o podem alterar o valor das express˜es usadas para o in´cio. A <vari´vel> ´ a vari´vel de controle do la¸o ou ´ a e a c ındice do la¸o. especialmente se o tamanho do passo a c a for maior que um e/ou do tipo real com valor fracion´rio. Se o r´tulo ´ afixado a um comando execut´vel.1. c REAL FIELD(NX. se ´ afixado a um comando FORMAT. 5.c Estes dois comandos s˜o normalmente usados juntos. I= 1. Comandos e Construtos de Controle de Fluxo 37 k lic lic k to bu y N O W ! w w w w .. c Dois exemplos de aplica¸˜es de la¸os DO rotulados: co c c Soma dos quadrados dos N primeiros elementos da matriz X. Se o valor do <passo> estiver presente.INT((limite . se for omitido. A forma a c e o ´ c geral do cabe¸alho de um la¸o DO rotulado pode ter uma das duas formas seguintes: c c DO <r´tulo> [. c o ı mas o n´mero de itera¸˜es n˜o ´ alterado. ack c w o 5. Quando isto ´ realizado. A u c a a e o o vari´vel de controle do la¸o n˜o necessariamente assume o valor limite.

P < Q . denotado pela declara¸˜o END IF <nome>. O construto IF pode ter um <nome>.d o 40 50 DO 50.2 Comando e construto IF O comando IF fornece um mecanismo para controle de desvio de fluxo. o valor de uma express˜o l´gica escalar ´ testado e um unico comando ´ executado se e a o e ´ e somente se o seu valor for verdadeiro.” e “END IF SWAP” ser˜o executadas somente se X < Y. H´ trˆs formas usuais para ca ca a e um construto IF.AND.J)= T(J. ca ue dependendo de uma condi¸˜o ou de um outro bloco. A segunda forma usada para o construto IF ´ a seguinte: e [<nome>:] IF (<express~o relacional e/ou l´gica>) THEN a o <bloco 1> ELSE [<nome>] <bloco 2> END IF [<nome>] Na qual o <bloco 1> ´ executado se o resultado da <express~o relacional e/ou l´gica> for verdadeira. dependendo de um teste l´gico. R <= 1. dependendo de uma condi¸˜o. Comando e construto IF k lic lic k to bu y N O W ! w w w w .2. como por exemplo IF. IY)= 0.d o c u -tr . IY= 1. um bloco) seja realizada. o a o qual deve ser um nome v´lido em Fortran 90/95. Como exemplo.c 5. e a o caso contr´rio. mas se for definido no cabe¸alho do a e c construto..0 CONTINUE CONTINUE c u -tr a c k .0 IF(COND . IX= 1. A forma mais simples tem a seguinte estrutura geral: [<nome>:] IF (<express~o relacional e/ou l´gica>) THEN a o <bloco> END IF [<nome>] onde <bloco> denota uma seq¨ˆncia de linhas de comandos execut´veis.NX FIELD(IX. dependendo de outra condi¸˜o. A forma geral ´: e IF (<express~o relacional e/ou l´gica>) <comando execut´vel> a o a O <comando execut´vel> ´ qualquer. O <nome> ´ opcional. ack c w o . Um exemplo de aplica¸˜o desta forma intermedi´ria seria: o ca a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 38 5. Temos os seguintes exemca plos: IF (FLAG) GO TO 6 IF(X-Y > 0.0) S(I. sendo o ultimo uma forma geral do primeiro. O bloco ´ executado somente se o ue a e resultado da <express~o relacional e/ou l´gica> for verdadeiro.I) 5..2. Este construto permite que dois conjuntos distintos de instru¸˜es a a co sejam executados. END IF.0) X= 0.OR.2 Construto IF Um construto IF permite que a execu¸˜o de uma seq¨ˆncia de comandos (ou seja. outro comando IF ou uma declara¸˜o END. Pode-se e a incluir outro construto IF ou outra estrutura de controle de fluxo no bloco de um construto IF. ELSE. e ca temos: SWAP: IF (X < Y) THEN TEMP= X X= Y Y= TEMP END IF SWAP As trˆs linhas de texto entre “SWAP: IF . ELSE IF. exceto aqueles que marcam o in´ a e ıcio ou o final de um bloco. H´ ca a duas formas: o comando IF e o construto IF.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ele deve ser tamb´m empregado no final.NY DO 40.1 Comando IF No comando IF. o <bloco 2> ser´ executado.2. ´ 5.

0 Y= 0. Novamente. sen˜o (ou seja. ack c w o .0 END IF ELSE IF (K < 0) THEN Z= 1. A forma geral ´: e [<nome>:] IF (<express~o relacional e/ou l´gica>) THEN a o <bloco> [ELSE IF (<express~o relacional e/ou l´gica>) THEN [<nome>] a o <bloco>] . O exemplo a seguir ilustra o encadeamento de construtos IF. mas neste caso ´ recomend´vel adotar nomes para os construtos. j´ utilizando o construto DO.0 ELSE X= 1.0 ELSE Z= 0. exceto se houver uma instru¸˜o ELSE final. enquanto que os outros s˜o solenemente ignorados.. [CASE DEFAULT <bloco>] END SELECT [<nome>] Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 5. que abarca quaisquer possibilidades n˜o satisfeitas e ca a nos testes realizados no construto. mas se for adotado no cabe¸alho do construto. a IF (I < 0) THEN IF (J < 0) THEN X= 0.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Os testes s˜o realizados um ap´s o outro at´ que um deles a o e seja satisfeito. ent˜o deve ser mencionado em todas as e c a circunstˆncias ilustradas acima.1) faz uso de construtos IF para implementar o c´lculo do fatorial a de um n´mero natural. Caso nenhuma condi¸˜o seja satisfeita.. em cujo caso o bloco associado ´ executado.0 Y= 1. ent˜o X= -Y.d o c u -tr .. A principal diferen¸a entre este construto e um bloco IF est´ no fato de somente uma express˜o ser c a a calculada para decidir o fluxo e esta pode ter uma s´rie de resultados pr´-definidos. Comandos e Construtos de Controle de Fluxo 39 k lic lic k to bu y N O W ! w w w w . u co ca o <nome> ´ opcional. cada um a ca e dos quais possui um bloco de comandos associado.4. a a ca a A terceira e final vers˜o usa a instru¸˜o ELSE IF para realizar uma s´rie de testes independentes. Estruturas ainda a mais complicadas s˜o poss´ a ıveis. X >= Y) a a¸˜o ser´ Y= -Y. o controle do fluxo ´ transferido para a instru¸˜o END IF. abordado na se¸˜o 5.0 END IF O programa-exemplo a seguir (programa 5. [ELSE [<nome>] <bloco>] END IF [<nome>] Pode haver qualquer n´mero (inclusive zero) de instru¸˜es ELSE IF e zero ou uma instru¸˜o ELSE.d o IF (X < Y) THEN X= -Y ELSE Y= -Y END IF c u -tr a c k ..3 Construto CASE Fortran 90/95 fornece uma outra alternativa para selecionar uma de diversas op¸˜es: trata-se do construto co CASE. nenhum o e ca ca bloco ´ executado. u a ca 5. se o resultado de X < Y for verdadeiro. A forma geral do construto e e CASE ´: e [<nome>:] SELECT CASE (<express~o>) a [CASE (<seletor>) [<nome>] <bloco>] . como forma e a de facilitar a leitura e compreens˜o do programa. e a Ap´s.c Neste exemplo.

Caso um deles esteja ausente. ” f a t ( ” . J´ a declara¸˜o o ca a ca CASE DEFAULT ´ equivalente a uma lista de todos os valores poss´ e ıveis de <express~o> que n˜o foram inclu´ a a ıdos nos outros seletores do construto. j ! print * . ”)= ” . tal como a e CASE (1. nenhum dos blocos ´ a a e executado e o controle do fluxo passa ao primeiro comando ap´s a declara¸˜o END SELECT. l´gico ou de caractere e o valor especificado por a o cada <seletor> deve ser do mesmo tipo. u i m p l i c i t none integer : : i . 1 ! NUMERO ´ do tipo inteiro.d o c u -tr a c k . todos do mesmo tipo que e a <express~o>. 10:17. A forma mais simples do a e a o e <seletor> ´ uma constante entre parˆnteses. somente pode haver um CASE DEFAULT em um dado construto CASE. A forma geral do <seletor> ´ uma lista de valores e de intervalos n˜o sobrepostos. No caso de vari´veis de caracteres. 2. ”Entre com v a l o r : ” read * . ou maior ou igual a <inf>. significa que o bloco de a comandos pertencente a esta declara¸˜o CASE ´ selecionado cada vez que a <express~o> calcula um valor que ca e a ´ menor ou igual a <sup>. f a t end i f end program i f f a t A <express~o> deve ser escalar e pode ser dos tipos inteiro. program i f f a t ! C a l c u l a o f a t o r i a l de um n´ mero n a t u r a l . 1 else f a t= 1 do j= 1 . e ! Todos os valores de NUMERO menores que 0.3. um intervalo pode ser especificado separando os limites inferior e o superior por dois pontos “: “ CASE (<inf> : <sup>) Um dos limites pode estar ausente. ” f a t ( ” . ”)= ” .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ack c w o . i f a t= f a t * j end do print * . i . f a t . os comprimentos podem diferir. a mas n˜o a esp´cie. mas n˜o ambos. como na declara¸˜o e e ca CASE (1) Para express˜es inteiras ou de caracteres. 23) Caso o valor calculado pela <express~o> n˜o pertencer a nenhuma lista dos seletores.d o c u -tr . i i f ( i < 0 ) then print * . ” a e ı e l s e i f ( i == 0 ) then print * . respectivamente. Portanto. 0 ! Todos os valores de NUMERO > 0. 7.1: Programa que utiliza os construtos IF e DO.c Programa 5. O exemplo a seguir ilustra o uso desta declara¸˜o: ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 40 5. ”N˜o ´ p o s s´ v e l c a l c u l a r o f a t o r i a l . i . Nos casos de vari´veis inteiras ou l´gicas. Um exemplo ´ mostrado abaixo: e e SELECT CASE CASE (:-1) N_SINAL= CASE (0) N_SINAL= CASE (1:) N_SINAL= END SELECT (NUMERO) -1 ! Somente NUMERO= 0. entre parˆnteses. a esp´cie pode diferir. Construto CASE k lic lic k to bu y N O W ! w w w w .

’R’:) CH_TYPE= . ’D’. Comandos e Construtos de Controle de Fluxo 41 k lic lic k to bu y N O W ! w w w w . ” I g u a l a z e r o . ” ´ case ( ”0 ” : ”9 ”) ! S e l e c i o n a n´ meros . Impresso: 23 de abril de 2008 Autor: Rudi Gaelzer – IFM/UFPel o m Cap´ ıtulo 5. e todos os outros caracteres a alfab´ticos indicam vari´veis reais. e CASE (’C’.d o c u -tr . END SELECT c u -tr a c k . ’R’ e todos os caracteres ap´s o ultimo indicam nomes de vari´veis o ´ a do tipo de caractere. ’D’. ”P a l a v r a i n i c i a com l e t r a s m a i u s c u l a . dependendo ou n˜o c e a e co a de algum parˆmetro que ´ atualizado em cada in´ da s´rie. print * . c ´ print * . ”Entre com o nome ( 5 c a r a c t e r e s ) : ” read ”( a5 ) ” . ”Menor que z e r o . ”P a l a v r a i n i c i a com C a r a c t e r e s e s p e c i a i s ! ! ! ” end s e l e c t end program c a s e s t r i n g J´ o programa abaixo. embora esta tenha um comprimento igual a 5.d o SELECT CASE (CH) ! CH ´ do tipo de caractere. ”Entre com a ( i n t e i r o ) : ” read * . a s e l e c t case ( a ) case (: −1) print * . ack c w o . u print * . ”Maior que z e r o .c No exemplo acima.4 Construto DO Um la¸o DO ´ usado quando for necess´rio calcular uma s´rie de opera¸˜es semelhantes. ” ´ case ( ”A” : ”Z ”) ! S e l e c i o n a nome que come¸ a com l e t r a s m a i u s c u l a s . e a O programa-exemplo abaixo mostra o uso deste construto. CASE (’I’:’N’) INT_TYPE= . os caracteres ’C’. a program c a s e s t r i n g i m p l i c i t none character ( len= 5 ) : : nome print * .TRUE.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Note que os seletores de caso somente testam o primeiro caractere da vari´vel NOME. testa o sinal de n´meros inteiros: a u program t e s t a c a s e i m p l i c i t none integer : : a print * .TRUE.TRUE. ”P a l a v r a i n i c i a com n´ meros ! ! ! ” u case default ! Outros t i p o s de c a r a c t e r e s . c ´ print * . CASE DEFAULT REAL_TYPE= . ” end s e l e c t end program t e s t a c a s e 5. ” case ( 1 : ) print * . Por exemplo. para somar o valor de um polinˆmio a e ıcio e o de grau N em um dado ponto x: N P (x) = a0 + a1 x + a2 x2 + · · · + aN xN = i=0 ai xi . Os caracteres ’I’ e ’N’ indicam vari´veis do tipo inteiro. ”P a l a v r a i n i c i a com L e t r a m i n u s c ul a . ” case ( 0 ) print * . nome s e l e c t case ( nome ) case ( ”a ” : ”z ”) ! S e l e c i o n a nome que come¸ a com l e t r a s m i n u s c u l a s .

Para este tipo de opera¸˜es repetidas. N FAT= FAT*I END DO Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 42 5.A0. <express~o 3>]] a a a a <bloco> END DO [<nome>] onde <vari´vel> ´ uma vari´vel inteira e as trˆs express˜es contidas no cabe¸alho do construto devem ser do a e a e o c mesmo tipo. POL= :: POL. o que significa.. temos um outro exemplo que ilustra o funcionamento do la¸o DO: c FAT= 1 DO I= 2. se o passo <express~o 3> for omitido. O a a e ıcio co programa abaixo (programa 5..<express~o 1> + <express~o 3>)/<express~o 3>. da <vari´vel> (n˜o necessariamente deve ser o ultimo valor a a a a ´ assumido pela vari´vel). como aconteceria se fosse a e co tentado implementar a soma do polinˆmio atrav´s das seguintes express˜es: o e o REAL POL= POL= POL= . Novamente..2) exemplifica este fato: Abaixo. o n´mero de itera¸˜es e o passo a ser c co u co realmente tomado n˜o s˜o modificados. 11. ca c a a Isto pode acontecer. o incremento pode ser negativo. Entretanto. da vari´vel em cada nova itera¸˜o. a a a a Novamente.A2.c Esta forma do la¸o DO n˜o usa r´tulos. Como no caso e e de um la¸o DO rotulado. que os comandos do bloco somente a ser˜o executados se M <= J + 4.. triangulariza¸˜o.6. END DO Como no caso do DO rotulado.. por exemplo. END DO Como pode-se ver.. <express~o 2> [.A1. na pr´tica..PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ´ conveniente usar-se um la¸o ca co e c DO para implement´-las. cada uma das express˜es indica: c o <express~o 1>: o valor inicial da <vari´vel>. ou limite. inclusive o passo das itera¸˜es. caso alguma das express˜es envolvam o uso de vari´veis. como o co u a a co produto de matrizes.4... a a ca Este construto tamb´m ´ aceito no Fortran 77.d o Outro tipo de opera¸˜es freq¨entemente necess´rias s˜o aquelas que envolvem opera¸˜es matriciais. exceto pela possibilidade de se definir um <nome>. ou incremento. etc. se o resultado do primeiro argumento da fun¸˜o MAX acima for negativo.1. ack c w o . 2 . O exemplo a seguir ilustra um bloco DO onde a vari´vel I somente assume a a valores ´ ımpares: DO I= 1. ao inv´s de escrever o mesmo bloco de opera¸˜es N vezes. O exemplo abaixo ilustra a a o uso de express˜es no cabe¸alho do construto: o c DO I= J + 4.d o c u -tr . o n´mero de itera¸˜es ´ definido antes de se executar o primeiro comando do <bloco> c u co e e ´ dado pelo resultado da conta e MAX((<express~o 2> . -K**2 . uma vez que foram pr´-determinados antes do in´ das itera¸˜es. M. como a forma definida na se¸˜o 5. a <express~o 3>: o passo. se <express~o 2> for menor que <express~o 1> e o passo <express~o 3> a a a for positivo.. o la¸o n˜o ser´ executado. a a <express~o 2>: o valor m´ximo. Construto DO k lic lic k to bu y N O W ! w w w w . estas podem ser moo a dificadas no bloco do la¸o.0). A forma geral de um construto c a o ca DO ´ a seguinte: e [<nome>:] DO [<vari´vel> = <express~o 1>. este ser´ igual a 1. No cabe¸alho acima.AN A0 POL + A1*X POL + A2*X**2 POL + AN*X**N c u -tr a c k .

Desta forma. o n´mero de itera¸˜es ser´ u co a MAX(N-2+1. a seguinte instru¸˜o ´ poss´ ca e ıvel: [<nome>:] DO <bloco> END DO [<nome>] Neste caso. A forma geral desta instru¸˜o ´: ca e EXIT [<nome>] onde o <nome> ´ opcional. Caso N < 2. j ! Bloco sem m o d i f i c a ¸ ˜ o de p a s s o .1 Construto DO ilimitado Como caso particular de um construto DO. ca j= 1 do i= 1 . ! M o d i f i c a o p a s s o de um l a ¸ o DO d e n t r o do b l o c o . END DO Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 5. a a a vari´vel I ser´ incrementada e o bloco executado at´ que I= N + 1. por exemplo. Comandos e Construtos de Controle de Fluxo 43 k lic lic k to bu y N O W ! w w w w . temos: DO .0) = MAX(N-1. o conjunto de comandos contidos no <bloco> ser˜o realizados sem limite de n´mero de itera¸˜es. Isto ocorre. i . o ca e ca 5. ack c w o . Execu¸˜o de um ıda ca EXIT transfere controle ao primeiro comando execut´vel ap´s o END DO [<nome>] correspondente. mas o seu uso n˜o est´ restrito a este c a a caso particular. mas deve ser usado caso ele exista e. Caso N >= 2. a Temos os seguintes casos particulares e instru¸˜es poss´ co ıveis para um construto DO. I= I + 1 IF(I == J) EXIT . j i f ( i > 5 ) j= 3 print * . por exemplo.d o c u -tr a c k . podendo ser usada em um construto DO geral.2 Instru¸˜o EXIT ca Esta instru¸˜o permite a sa´ ca ıda. no caso de construtos encadeados. i end do ! Bloco com m o d i f i c a ¸ ˜ o do p a s s o . ca do i= 1 . descrita a seguir. de um la¸o sem limite. esta ´ usada para calcular um novo valor para a vari´vel FAT.. sendo este o ultimo valor de I e o controle a a e ´ ´ transferido para o pr´ximo comando ap´s a declara¸˜o END DO. o valor do fatorial de N. c program mod passo i m p l i c i t none integer : : i .4. a u co exceto se algum teste ´ inclu´ dentro do bloco o que possibilita um desvio de fluxo para a primeira instru¸˜o e ıdo ca ap´s o END DO. o la¸o n˜o ser´ executado..c Programa 5. 1 0 . em seguida a vari´vel I ser´ incrementada e e a a a por 1 e o novo valor I= 3 ser´ usado novamente para calcular o novo valor da vari´vel FAT. Uma instru¸˜o que realiza este tipo de desvio ´ a instru¸˜o EXIT. O exemplo ilustrado acima retornar´.d o c u -tr .4. na e o o ca a vari´vel FAT.. e o resultado ser´ FAT= 1.2: Exemplo de uso do construto DO.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .0). j end do end program mod passo Neste exemplo. o valor inicial da vari´vel inteira c a a a a I ´ 2. neste caso. a o Como exemplo. 10 print * . ele serve para denotar de qual e construto a sa´ deve ser feita. 5..

s u p e r i o r ) : ” read * . high temp ! ! La¸ o s o b r e os l i m i t e s de t e m p e r a t u r a . ”g r a u s F . ” end do end do r e a d l o o p ! Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 44 5. ” E s c a l a de t e m p e r a t u r a s (C/F ) : ” read ”( a ) ” . s c a l e /= ”F”) then print * . ca program d o c y c l e i m p l i c i t none integer : : i n d e x= 1 do i n d e x= i n d e x + 1 i f ( i n d e x == 2 0 ) cycle i f ( i n d e x == 3 0 ) e xi t print * . ”g r a u s C correspondem a ” .4.c A forma geral desta instru¸˜o ´: ca e CYCLE [<nome>] a qual transfere controle ` declara¸˜o END DO do construto correspondente sem haver a execu¸˜o dos comandos a ca ca posteriores ` instru¸˜o. incrementando-se a ca co a o valor de <vari´vel> (caso exista) pelo passo dado pela <express~o 3>. 0 + 3 2 . and .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . i n d e x ı end do end program d o c y c l e O programa abaixo ilustra o uso de alguns dos construtos discutidos neste cap´ ıtulo.d o c u -tr . e print * . f a r e n h e i t . i f ( s c a l e /= ”C” . Assim. f a r e n h e i t ! r e a d l o o p : do ! Lˆ e s c a l a e l i m i t e s . s c a l e ! Confere v a l i d a d e dos dados . ” L i m i t e s ( temp .3 Instru¸˜o CYCLE ca . O programa a seguir ilustra o uso a a desta instru¸˜o. i n f e r i o r . high temp ! E s c o l h e f ´ r m u l a de c o n v e r s ˜ o o a s e l e c t case ( s c a l e ) case ( ”C”) c e l s i u s= temp f a r e n h e i t= 9 * c e l s i u s / 5 . temp . low temp . estas s˜o continuadas. 0 end s e l e c t ! Imprime t a b e l a print * . Construto DO k lic lic k to bu y N O W ! w w w w . se outras itera¸˜es deve ser realizadas. c e l s i u s . 0 case ( ”F”) f a r e n h e i t= temp c e l s i u s= 5 * ( f a r e n h e i t − 3 2 ) / 9 . ! Imprime uma t a b e l a de c o n v e r s ˜ o das e s c a l a s C e l s i u s e F a h r e n h e i t a ! e n t r e l i m i t e s de t e m p e r a t u r a e s p e c i f i c a d o s .4. ack c w o 5.d o c u -tr a c k . program conv temp i m p l i c i t none character ( len= 1 ) : : s c a l e integer : : low temp . ” E s c a l a n˜ o v ´ l i d a ! ” a a e xit r e a d l o o p end i f print * . c do temp= low temp . high temp . temp real : : c e l s i u s . ”Valor do ´ n d i c e : ” .

c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 5.d o c u -tr .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ca print * .d o ! Finaliza¸˜o . ack c w o . ” a end program conv temp c u -tr a c k . ” F i n a l dos dados v ´ l i d o s . Comandos e Construtos de Controle de Fluxo 45 k lic lic k to bu y N O W ! w w w w .

4.d o c u -tr a c k .d o c u -tr . ack c w o . Construto DO k lic lic k to bu y N O W ! w w w w .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 46 5.

cada um relacionado com uma e dimens˜o da matriz. esp´cie e parˆmetros do tipo. ´ cada um destes sendo uma vari´vel de caractere de comprimento 25. a a Estes e outros recursos ser˜o abordados neste e nos pr´ximos cap´ a o ıtulos. inclusive no Fortran 77. A forma das declara¸˜es de matrizes em Fortran 77 s˜o aceitas no Fortran 90/95. Todas as matrizes neste exemplo tˆm seus ´ e ındices iniciando em 1. R_POINTS(1).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . todos do mesmo tipo.50) CHARACTER COLUMN(5)*25. exceto pela matriz R_POINTS. Ou seja. atrav´s do fornecimento de um limite inferior e e e um limite superior.. sendo NMAX a o linhas e 50 colunas. ou com se¸˜es da mesma. a qual inicia em 0: R_POINTS(0).MAT_I(50) REAL R_POINTS(0:50). sem que seja necess´rio definir um nome para cada vari´vel. ´ co a e e recomend´vel2 que estas sejam declaradas na forma de atributos de tipos de vari´veis. fazendo-se uso dos subscritos da matriz. sem ser necess´rio o uso de la¸os DO.A DIMENSION A(NMAX. exceto quando um intervalo distinto de valores ´ especificado.. o 47 o m w w w w . J´ o vetor ROW possui 10 componentes. COLUMN(5). de vari´veis do a tipo intr´ ınseco ou outras estruturas. As dimens˜es de uma matriz podem ser especificadas usando-se tanto o atributo DIMENSION a o quanto a declara¸˜o DIMENSION. R_POINTS(50).c Cap´ ıtulo 6 Processamento de Matrizes A defini¸˜o e o processamento de matrizes e vetores sempre foi um recurso presente em todas as linguagens de ca programa¸ao. ROW(10)*30 No ultimo exemplo acima. por´m.. a a 1 Nome 2 E. ca Os ´ ındices de cada subscrito da matriz s˜o constantes ou vari´veis inteiras e. Por exemplo. eles come¸am em a a ca c 1. Uma e a outra defini¸˜o equivalente seria: uma matriz ´ um grupo de posi¸˜es na mem´ria do computador as quais s˜o ca e co o a acessadas por interm´dio de um unico nome. COLUMN(1). este vetor possui 51 componentes. Este tipo de objeto ´ util e ´ e´ quando for necess´rio se fazer referˆncia a um n´mero grande. o vetor COLUMN possui 5 componentes. 6. ... Uma matriz pode ser declarada tanto na declara¸˜o de tipo intr´ ca ınseco ou com o uso da declara¸˜o ca DIMENSION: INTEGER NMAX INTEGER POINTS(NMAX). a a O Fortran 77/90/95 permite que uma matriz tenha at´ sete subscritos. Novas fun¸˜es intr´ co a c co ınsecas agora atuam de forma fundamental (ou elemental ) em matrizes e fun¸˜es podem retornar valores na forma de matrizes. Uma novidade importante introduzida no Fortran 90/95 ´ a capacidade c˜ e estendida de processamento das mesmas. usualmente para uma matriz de uma dimens˜o. c˜ Fortran 77. obrigat´rio. . Fortran 90/95.. COLUMN(2).c O W w . a no caso do compilador F.d o c u -tr a c k ! w o . matrizes de forma assumida e matrizes dinˆmicas. Agora ´ poss´ e ıvel trabalhar diretamente com a matriz completa. A declara¸ao de matrizes difere ligeiramente entre o Fortran 77 e o Fortran 90/95. por´m a princ´ a e u e ıpio desconhecido. a a cada um sendo uma vari´vel de caractere de comprimento 30. Uma matriz e consiste de um conjunto retangular de elementos.d o c u -tr a c k . A matriz real A possui 2 dimens˜es.1 Terminologia e especifica¸˜es de matrizes co Uma matriz ou vetor 1 ´ um outro tipo de objeto composto suportado pelo Fortran 77/90/95. Tamb´m est˜o co e a dispon´ ıveis as possibilidades de matrizes aloc´veis. por conven¸˜o.

e Por exemplo.7/) e C ´ um escalar. c u -tr a c k . Terminologia e especifica¸˜es de matrizes co k lic lic k to bu y N O W ! w w w w . um escalar tem posto 0. A <lista de extens~es> fornece as dimens˜es da matriz atrav´s de: o o e ˆ constantes inteiras. A extens˜o (extent) de uma matriz se refere a uma dimens˜o em particular e ´ o n´mero de a a a e u componentes naquela dimens˜o. em cujo caso denomina-se matriz nula. c˜ ˆ Tamanho 56. a Forma. Duas matrizes s˜o ditas serem conform´veis se elas tˆm a mesma forma. DIMENSION(10) :: ROW Antes de prosseguir.0:8) :: D INTEGER :: C A matriz A possui: ˆ posto 2. DIMENSION(5:54) :: X CHARACTER(LEN= 25). ser´ introduzida a terminologia usada com rela¸˜o a matrizes.6. DIMENSION(<lista de extens~es>)] [. um e u o vetor tem posto 1 e uma matriz tem posto maior ou igual a 2. o a ˆ somente o caractere “:” para indicar que a matriz ´ aloc´vel ou de forma assumida. Extens˜o. < outros atributos>] ::] o <lista de nomes> Entretanto. DIMENSION(-3:4. ˆ express˜es inteiras usando vari´veis mudas (dummy) ou constantes.2:8) :: B REAL. DIMENSION(<lista de extens~es>) [. onde os s´ ımbolos “(/” e “/)” s˜o os construtores de matrizes. o ˆ forma (/8. ˆ extens˜es 8 e 7. Todas as matrizes s˜o conform´veis a a e a a com um escalar. a forma recomend´vel da declara¸˜o (e exigida por certos compiladores. Contudo.7/). uma vez que o escalar ´ expandido em uma matriz com a mesma forma. ack c w o . e a Os <outros atributos> podem ser quaisquer da seguinte lista: Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 48 6.d o c u -tr . DIMENSION(5) :: COLUMN CHARACTER(LEN= 30). DIMENSION(8. DIMENSION(50) :: W REAL. as seguintes matrizes: REAL.c Al´m disso.9/). uma vez que a forma de B tamb´m ´ (/8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . uma vez que esta ultima tem forma (/8. a e a ´ A forma geral da declara¸˜o de uma ou mais matrizes ´ com se segue: ca e <tipo>[[. eles definem ou a e inicializam os valores de um vetor ou matriz. Assim. O tamanho (size) de um matriz ´ o n´mero total de elementos que comp˜e a matriz. como o F e o ELF90) ´ a ca e a seguinte: <tipo>. Este n´mero e u o u pode ser zero. <outros atributos>] :: <lista de nomes> o Onde <tipo> pode ser um tipo intr´ ınseco de vari´vel ou de tipo derivado (desde que a defini¸˜o do tipo derivado a ca esteja acess´ ıvel). A ´ conform´vel com B e C. O posto (rank ) de uma matriz ´ o n´mero de dimens˜es da mesma. DIMENSION(8. e e a e e e A n˜o ´ conform´vel com D. A forma (shape) de uma matriz ´ um vetor cujos componentes s˜o a extens˜o de cada dimens˜o da e a a a matriz. isto ´.7) :: A REAL. Tamanho.1.d o REAL. Estes construtores de matrizes ser˜o descritos com mais a detalhes na se¸ao 6. a ca Posto.

alguns dos quais ca s˜o novos no Fortran 90/95 e ser˜o abordados adiante.B 4. DIMENSION(10) :: V Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. Se a vari´vel T ´ do tipo TRIPLETO.d o c u -tr . declara-se um vetor cujos elementos s˜o TRIPLETOs de diversas fun¸˜es a co distintas: TYPE(TRIPLETO). ca Um tipo derivado pode conter um ou mais componentes que s˜o matrizes: a TYPE :: TRIPLETO REAL :: U REAL. suas 3 derivadas parciais de primeira ordem ca a e suas 9 derivadas parciais de segunda ordem.3) :: D2U END TYPE TRIPLETO TYPE(TRIPLETO) :: T Este exemplo serve para declarar. IB= (/(I. ALLOCATABLE :: A. A capacidade de se misturar matrizes com defini¸˜es de tipos derivados co possibilita a constru¸˜o de objetos de complexidade crescente. Os atributos em vermelho: POINTER e TARGET consistem em recursos avan¸ados do Fortran 90/95 que ser˜o discutidos em c a separado. a a 1. co ca e REAL. um tipo de vari´vel denominado TRIPLETO.:). ack c w o .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Alguns exemplos ilustram estas possibilidades. Processamento de Matrizes 49 k lic lic k to bu y N O W ! w w w w .:. Declara¸ao das matrizes de forma assumida de trˆs dimens˜es A e B. A forma das matrizes ser´ definida c˜ a a o a a posteriori por um comando ALLOCATE: REAL. em uma unica estrutura. No exemplo abaixo.2. DIMENSION(:. Aqui. Os a seguintes exemplos mostram a forma da declara¸˜o de diversos tipos diferentes de matrizes.3)/) 2. Finalmente.c Os atributos contidos na lista acima ser˜o abordados ao longo deste e dos pr´ximos cap´ a o ıtulos.B Matrizes de tipos derivados. T%U ´ um escalar real. ou aloc´veis. DIMENSION(SIZE(LOGA)) :: LOGB 3. mas a e e T%DU e T%D2U s˜o matrizes do tipo real. A forma das matrizes ser´ assumida a c˜ e o a partir das informa¸˜es transferidas pela rotina que aciona o sub-programa onde esta declara¸˜o ´ feita. a ´ E poss´ ıvel agora realizar-se combina¸˜es entre matrizes e o tipo derivado TRIPLETO para obter-se objetos co mais complexos. DIMENSION(:. DIMENSION(3) :: DU REAL.:) :: A. Inicializa¸ao de vetores contendo 3 elementos: c˜ INTEGER :: I INTEGER.d o PARAMETER ALLOCATABLE INTENT(INOUT) OPTIONAL SAVE EXTERNAL INTRINSIC PUBLIC PRIVATE POINTER TARGET c u -tr a c k .3/). LOGA ´ uma matriz qualquer (“muda” ou “dummy”) e SIZE ´ c˜ a e e uma fun¸˜o intr´ ca ınseca que retorna um escalar inteiro correspondente ao tamanho do seu argumento: LOGICAL. DIMENSION(3) :: IA= (/1. de duas dimens˜es A e B. cujos ´ a componentes correspondem ao valor de uma fun¸˜o de 3 vari´veis. Declara¸ao da matriz autom´tica LOGB. Declara¸ao das matrizes dinˆmicas. segue a <lista de nomes> v´lidos no Fortran. DIMENSION(3. I=1. onde os nomes s˜o atribu´ a a ıdos `s matrizes.

descrito na se¸˜o 3.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ack c w o . parameter : : dp= 2 integer : : i real . N3 : ” read * . dimension ( 5 ) : : d i s c ! do i= 1 . n2 . print * . d i s c ( i )%nome . ”Raiz quadrada dos 10 p r i m e i r o s i n t e i r o s . vd end program e x 1 a r r a y O segundo programa-exemplo. Terminologia e especifica¸˜es de matrizes co k lic lic k to bu y N O W ! w w w w . n3 . 1 0 vr ( i )= s q r t ( r e a l ( i ) ) vd ( i )= s q r t ( r e a l ( i ) ) end do print * . ” M´dia f i n a l : ” . d i s c ( i )%n2 . n d i s c print * . a seguir.1. ”Notas : N1 .d o Assim. o ca ! Dados a c e r c a de a l u n o s usando t i p o d e r i v a d o . est´ baseado no programa alunos. ” ” print * . em p r e c i s ˜ o s i m p l e s : ” a print * . ”) <−−−−−−−−−−−” print * . d i s c ( i )%n3 d i s c ( i )%mf= ( d i s c ( i )%n1 + d i s c ( i )%n2 + d i s c ( i )%n3 ) / 3 . d i s c ( i )% c o d i g o print * . program e x 1 a r r a y i m p l i c i t none integer . program a l u n o s v e t i m p l i c i t none integer : : i . a referˆncia ao objeto V(2)%U fornece o valor da fun¸˜o correspondente ao segundo elemento do vetor e ca V. d i s c ( i )%nome print * . dimension ( 1 0 ) : : vd ! do i= 1 . d e f i n e v a l o r e s aos e l e m e n t o s do mesmo e imprime ! e s t e s v a l o r e s na t e l a . 0 end do do i= 1 . ” ( ” .c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 50 6. em p r e c i s ˜ o dupla : ” a print * . e assim por diante. ”Raiz quadrada dos 10 p r i m e i r o s i n t e i r o s . j´ a referˆncia V(5)%D2U(1.1) fornece o valor da derivada segunda em rela¸˜o ` primeira vari´vel da fun¸˜o a e ca a a ca correspondente ao elemento 5 do vetor V. n d i s c= 5 ! Mude e s t e v a l o r . ”Nome : ” read ”( a ) ” . ” c ´ d i g o : ” o read * . ser´ a ca a criado um vetor para armazenar os dados de um n´mero fixo de alunos e os resultados somente ser˜o impressos u a ap´s a aquisi¸˜o de todos os dados. d i s c ( i )%n1 . O primeiro programa a seguir exemplifica um uso simples de matrizes: ! D e c l a r a um v e t o r . d i s c ( i )%c o d i g o .8. d i s c ( i )%mf e end do end program a l u n o s v e t c u -tr a c k .d o c u -tr . ” ” print * . c a s o s e j a maior . Agora. dimension ( 1 0 ) : : vr r e a l ( kind= dp ) . type : : a l u n o character ( len= 2 0 ) : : nome integer : : c o d i g o r e a l : : n1 . n d i s c print * . ”−−−−−−−−−−−> ” . N2 . vr ! Imprime t o d o s os componentes do v e t o r . mf end type a l u n o type ( a l u n o ) .

ainda mais ca ca o importante. se a co existirem) e todos os operadores num´ricos definidos para opera¸˜es entre escalares tamb´m s˜o definidos para e co e a opera¸˜es entre matrizes. essencialmente. Ao inv´s. Com o desenvolvimento dos processadores e das arquiteturas de computadores. 869 897 . acelerando substancialmente a eficiˆncia do a e processamento. ´ a sua habilidade de realizar opera¸˜es envolvendo e co a matriz na sua totalidade. tais processos podiam ser extremamente dispendiosos do ponto de vista do tempo necess´rio para a realiza¸˜o de todas as opera¸˜es desejadas. a express˜o do lado direito ´ desenvolvida antes da atribui¸˜o do resultado da express˜o a e ca a a ` matriz A. o que. entraram em linha. ent˜o este ´ distribu´ em uma matriz conform´vel com o outro operando. recentemente. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. possibilitando o tratamento de uma matriz como um objeto unico. e a em um processo que freq¨entemente envolvia o uso de diversos la¸os DO encadeados. o resultado de adicionar 5 a A ´: e A+5= 348 566 + 555 555 = 8 9 13 10 11 11 . processamento paralelo. As e ıdo normas definidas pelo comitˆ X3J3 para o padr˜o da linguagem Fortran 90/95 sup˜e que compiladores usados e a o em sistemas distribu´ ıdos devem se encarregar de distribuir automaticamente os processos num´ricos envolvidos e nas express˜es com matrizes de forma equilibrada entre os diversos processadores que comp˜e a arquitetura. Quando a opera¸˜o envolvia u c ca matrizes grandes. ou seja. ack c w o 6. no m´ ´ ınimo. Da mesma forma como acontece com express˜es e atribui¸˜es escalares. os quais fazem uso da id´ia de processamento distribu´ ou. a cargo do compilador e n˜o do programador. cada elemento da matriz deveria ser envolvido na express˜o separadamente. elas devem todas ter a mesma forma. a tarefa de implantar a paraleliza¸˜o do co ca c´digo num´rico fica. o c´digo tornava-se gradualmente mais u e o complexo para ser lido e interpretado.d o c u -tr . Uma outra vantagem deste o e a enfoque consiste na manuten¸˜o da portabilidade dos c´digos num´ricos. com 100 × 100 elementos ou mais. e ca como no caso do exemplo acima. Uma outra vantagem. Se um dos operando ´ um escalar. em outras palavras. B= 521 331 . A o o evidente vantagem nesta estrat´gia consiste no fato de que as mesmas opera¸˜es num´ricas s˜o realizadas de e co e a forma simultˆnea em diversos componentes distintos das matrizes. facilita enormemente a constru¸˜o. Al´m disso. ´ necess´rio que as matrizes consideradas e a sejam conform´veis. Esta distribui¸˜o de um escalar em uma matriz conform´vel ´ util no momento da inicializa¸˜o dos elementos ca a e´ ca de uma matriz. leitura e interpreta¸˜o do c´digo. h´ medida que o n´mero de opera¸˜es envolvidas aumentava. em uma linha de programa¸˜o como o co ca a seguir. Com a filosofia das opera¸˜es sobre matrizes inteiras. sejam A e B duas matrizes 2 × 3: A= o resultado da adi¸˜o de A por B ´: ca e A+B= o resultado da multiplica¸˜o ´: ca e A*B = e o resultado da divis˜o ´: a e A/B = 15 8 8 15 18 6 3/5 2 8 5/3 2 6 .d o c u -tr a c k . introduzido no Fortran 90. Este ordenamento ´ importante quando uma matriz aparece em ambos os lados de uma atribui¸˜o. pois os elementos da(s) a ca co matriz(es) deveriam ser manipulado de forma seq¨encial. co Por exemplo.c Com o Fortran 77 n˜o ´ poss´ desenvolver express˜es envolvendo o conjunto de todos os elemento de uma a e ıvel o matriz simultaneamente. 348 566 . ca o e Para que as opera¸˜es envolvendo matrizes inteiras sejam poss´ co ıveis. e a e ıdo a Assim. Opera¸˜es entre duas matrizes conform´veis a co a s˜o realizadas na base do elemento por elemento (distribuindo as opera¸˜es entre os diversos processadores.2 Express˜es e atribui¸˜es envolvendo matrizes o co . sistemas compostos por mais de um processador. resulta deste novo modo de encarar matrizes.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . A= A + B sendo A e B matrizes. Processamento de Matrizes 51 k lic lic k to bu y N O W ! w w w w . a u co Um desenvolvimento novo.

ack c w o .5).5) REAL VAL_MAX .. B. A= A/3. elemento a elemento.1 + B(I)*SQRT(C(I)) para todos os valores de I co Solu¸˜o Fortran 77. A.K) CONTINUE CONTINUE CONTINUE Impresso: 23 de abril de 2008 VAL_MAX= DO 30 K= DO 20 DO 10 20 30 Autor: Rudi Gaelzer – IFM/UFPel o m 52 6. Solu¸˜o Fortran 77.GT. Considere uma matriz tri-dimensional. C .I)= A(J.J.K) .AND.0 CONTINUE DO 20 I= 1.J. presente no Fortran 90/95 mas ausente no Fortran 77. Encontre o maior valor menor que 1000 nesta matriz. e atribua o resultado a uma terceira matriz. 0. 5 C(J. 20 A(I)= A(I)/3. B(20). & (A(I..0))VAL_MAX= A(I.. VAL_MAX) . C= A + B 3. Nestes c´digos ser˜o tamb´m apresentadas algumas fun¸˜es intr´ o a e co ınsecas do Fortran 90/95 que operam em matrizes. DO 20 I= 1. todos do mesmo comprimento.1 + B*SQRT(C) Note como o c´digo ficou mais reduzido e f´cil de ser lido. 20 Solu¸˜o Fortran 90/95.d o c u -tr . podem ser contempladas atrav´s da compara¸˜o de alguns exemplos de c´digos em Fortran 77 e Fortran e ca o 90/95. 5 IF((A(I.I) CONTINUE CONTINUE 10 20 Solu¸˜o Fortran 90/95.5) ...5) :: A. Considere trˆs vetores. ca REAL A(20). C(5.1 + B(I)*SQRT(C(I)) CONTINUE c u -tr a c k . Solu¸˜o Fortran 77. B.5.I) + B(J. ca REAL A(5. C(20) . Considere trˆs matrizes bi-dimensionais com a mesma forma.. ca REAL. DIMENSION(5. B(5.. DO 10 I= 1. ca REAL.c 10 . 1000. 5 DO 10 J= 1.LT..2. 5 J= 1. a fun¸˜o intr´ o a e ca ınseca SQRT opera sobre cada elemento do vetor C.0.. C . 2. Express˜es e atribui¸˜es envolvendo matrizes o co k lic lic k to bu y N O W ! w w w w ... Al´m disso. 20 A(I)= 0.. B e C. Multiplique duas matrizes entre si. 5 10 I= 1. ca REAL A(5. 1.J.d o As vantagens do processamento de matrizes inteiras. elemento e a elemento. Inicialize todos os elementos de A a zero e e realize as atribui¸˜es A(I)= A(I)/3.0 1.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .5). DIMENSION(20) :: A= 0.K) .

ACUM= 0. uma express˜o l´gica envolvendo a(s) matriz(es). a SUM .. COUNT . 5 DO 10 I= 1.retorna o valor m´ximo de uma matriz. Os ultimos dois exemplos fizeram uso das seguintes fun¸˜es intr´ ´ co ınsecas: MAXVAL .retorna a soma de todos os elementos de uma matriz.ACUM INTEGER CONTA .0)THEN ACUM= ACUM + A(I. VAL_MAX= MAXVAL(A.retorna o n´mero de elementos da matriz que satisfazem a m´scara.5. 3000. ca REAL A(5.GT. Encontre o valor m´dio maior que 3000 na matriz A do exemplo anterior. DIMENSION(5. DIMENSION(5.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w ..0))/COUNT(MASK=(A>3000.K) . a ca 4.MASK=(A>3000. a e a o Em MASK=(A<1000.5..0)) c u -tr a c k .) estabelece uma m´scara...0).c Note que no Fortran 90.5) :: A REAL :: MEDIA .5) :: A REAL :: VAL_MAX . conseguiu-se fazer em uma linha o que necessitou de 8 linhas no Fortran 77. MASK=(A<1000.0)) Agora. A fun¸˜o intr´ ca ınseca MAXVAL devolve o valor m´ximo entre os elementos de uma matriz.d o Solu¸˜o Fortran 90/95.3 Se¸oes de matrizes c˜ Uma sub-matriz. a e ıvel e co ca Se¸˜es de matrizes podem ser extra´ co ıdas usando-se um dos seguintes artif´ ıcios: ˆ Um subscrito simples. ca REAL.K) CONTA= CONTA + 1 END IF CONTINUE CONTINUE CONTINUE MEDIA= ACUM/REAL(CONTA) 10 20 30 Solu¸˜o Fortran 90/95. ca REAL.J.. 5 IF(A(I. O argumento a opcional MASK=(.d o c u -tr .5) REAL MEDIA. ˆ Um tripleto de subscritos. a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. Processamento de Matrizes 53 k lic lic k to bu y N O W ! w w w w . ˆ Um vetor de subscritos. MEDIA= SUM(A. u a 6. tamb´m chamada se¸˜o de matriz.0 DO 30 K= 1. ack c w o . Uma se¸˜o de matriz pode ser acessada e operada da mesma forma que ca a matriz completa.J. 5 DO 20 J= 1. somente aqueles elementos de A que satisfazem a condi¸˜o de ser menores que 1000 ca s˜o levados em considera¸˜o. pode ser acessada atrav´s da especifica¸˜o de um intere ca e ca valo de valores de subscritos da matriz. e Solu¸˜o Fortran 77. Estes recursos ser˜o descritos a seguir.5.. isto ´. mas n˜o ´ poss´ fazer-se referˆncia direta a elementos individuais ou a subse¸˜es da se¸˜o.. conseguiu-se realizar em uma linha de c´digo em Fortran 90 o que necessitou de 12 linhas em o Fortran 77.

se¸˜o de linha da matriz. se o <passo> for omitido. 2) = X.2.3.7 /) REAL. a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 54 6. 3. Elemento simples. 3.d o c u -tr . denominada ´ RA.3). DIMENSION(3) :: IV= (/ 1. DIMENSION(6) :: RA= (/ 1.3.   00000   0 X 0 0 0   RA =  0 0 0 0 0  =⇒RA(2:2. no exemplo ser´ utilizada a matriz 5×5 denominada a RA. forma: (/5/).3.3.     0 0 X 0 0 00X00   0XXX0 0 0 0 0 0   RA =  0 X X X 0  =⇒RA(1::2. ent˜o o limite ausente ´ assumido como o limite a e inferior da correspondente dimens˜o da matriz da qual a se¸˜o est´ sendo extra´ a ca a ıda. se¸˜es de linhas com passo 2.0. forma: (/3.2. Cada elemento desta express˜o e a e a deve ser definido com valores que se encontrem dentro dos limites dos subscritos da matriz-m˜e. Se¸˜es de matrizes co k lic lic k to bu y N O W ! w w w w . a Os exemplos a seguir ilustram v´rias se¸˜es de matrizes usando-se tripletos. Novamente.3:5). 5 /) ! Express~o inteira de posto 1.d o c u -tr a c k . 1. ack c w o 6. ´ dado a seguir: e REAL. 3.3/). Ent˜o o elemento X pode ser selecionado atrav´s de RA(2. sendo esta forma geral v´lida para todas as dimens˜es e a o definidas para a matriz: [<limite inferior>] : [<limite superior>] : [<passo>] Se um dos limites.   0 0 0 0 0 00000 6.3 Vetores de subscritos Um vetor de subscritos ´ uma express˜o inteira de posto 1. inferior ou superior (ou ambos) for omitido. forma: (/3/). DIMENSION(3) :: RB INTEGER. 3. Os elementos das matrizes a co marcados por X denotam a se¸˜o a ser extra´ ca ıda.2:2) = X. denominado IV. 11.c Um subscrito simples seleciona um unico elemento da matriz. ent˜o assume-se <passo>=1.     0 0 0 0 0 00000   00000   0 0 0 0 0   RA =  0 0 X X X  =⇒RA(3. escalar. Os elementos a de um vetor de subscritos podem estar em qualquer ordem.2:4).2 Tripleto de subscritos A forma de um tripleto de subscritos ´ a seguinte.2): a e   00000 0 X 0 0 0   RA =  0 0 0 0 0  =⇒ RA(2. forma: (/1/). um vetor. coluna inteira. ca     0 0 0 0 0  00000   00X00   0 0 X 0 0   RA =  0 0 X 0 0  =⇒RA(:. co   0 0 0 0 0 0XXX0 6.4.1 Subscritos simples .0.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . isto ´. Considere a seguinte matriz 5 × 5. Um exemplo ilustrando o uso de um vetor de subscritos.

. o c´digo abaixo resolve um sistema linear de equa¸˜es que j´ est˜o na forma triangular: o co a a DO I= 1. Por exemplo.. co ! Resulta: ! RA(1)= 1.2.5) :: RA..B REAL.5/).5:10) + B(1:8. ou !RB= (/ 1.3:4)= RB(1::2.3)= RB(1.. C= A(2:9.3) + RC(3.1 ilustra como as duas sub-matrizes s˜o conform´veis neste caso e o resultado da soma das duas a a se¸˜es ser´ atribu´ ` matriz C. RB. podem esco e tar tanto no lado esquerdo quanto do lado direito de uma atribui¸˜o) desde que todos os operandos sejam ca conform´veis (p´gina 48). o e Por exemplo. 3. Uma matriz ´ nula quando o limite inferior ca o co e de uma ou mais de suas dimens˜es ´ maior que o limite superior.0.6 ! Os elementos 2. RA(3:5. Um vetor de subscritos pode tamb´m estar do lado esquerdo de uma atribui¸˜o: e ca IV= (/ 1..1) !RA(3.1) !RA(5. RA(5)= 5.c 6. 5.6/).3)= RB(3. e ! Resulta: !RB= (/ RA(1).0 /).4 Atribui¸˜es de matrizes e sub-matrizes co Tanto matrizes inteiras quanto se¸˜es de matrizes podem ser usadas como operandos (isto ´.1)= RB(:. RC INTEGER :: ID . RA(3). co a ıdo a O programa-exemplo 6. 3. 3 e 5 de RA. ca a REAL. a qual possui a mesma forma.2/): !RA(3.3:5:2) + RC(1:3. 5 /) RA(IV)= (/ 1.I)*X(I) END DO Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. DIMENSION(5..3) + RC(1. .d o c u -tr . 3. a c u -tr a c k ..1:2) !Forma (/3. A figura 6.4.d o RB= RA(IV) ! IV ´ o vetor de subscritos. ack c w o .20) :: A. Processamento de Matrizes 55 k lic lic k to bu y N O W ! w w w w . 1.15:20) !Forma (/8. . DIMENSION(8. N X(I)= B(I)/A(I. RA(5) /).2) + RC(:3) !Forma (/5/).5) + RC(1.3)= RB(5.2) !etc.I) B(I+1:N)= B(I+1.2..5 Matrizes de tamanho zero Matrizes de tamanho zero. a a REAL.1) !RA(4.4)= RB(1. e´ e o que pode simplificar a programa¸˜o do c´digo em certas situa¸˜es..3) + RC(2. ou matrizes nulas tamb´m s˜o permitidas em Fortran 90/95. .A(I+1:N.6) :: C . RA(3)= 3.1 mostra algumas opera¸˜es e atribui¸˜es b´sicas de matrizes: co co a 6. torna a opera¸˜o com sub-matrizes conform´veis mais clara.. A no¸˜o de uma e a ca matriz nula ´ util quando se quer contar com a possibilidade de existˆncia de uma matriz sem nenhum elemento.1) + RB(:. Um outro exemplo. acompanhado de figura.6 /) !Atribui¸~es dos elementos 1. 4 e 6 de RA n~o foram definidos. RA= RB + RC*ID !Forma (/5.2. N) .4.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . RA(:. DIMENSION(10.

a a ca As matrizes nulas seguem as mesmas regras de opera¸˜o e atribui¸˜o que as matrizes usuais. 1 : 3 : 2 ) print * . ( ( b ( i .20) + = B(1. as formas podem ser (/2.15) B(10.15) B(1.N) se tornam nulas. uma matriz ´ sempre conform´vel com um escalar.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . por´m elas ainda ca ca e devem ser conform´veis com as matrizes restantes. Neste caso. ack c w o .5) A(9.20) c u -tr a c k . seria necess´ria a inclus˜o de linhas adicionais de programa¸˜o. Se esta possibilidade n˜o a existisse. j ! do i= 1 . duas matrizes nulas podem ter o mesmo posto a mas formas distintas.0/) e (/0. ”Matriz A: ” print ” ( 3 ( f 1 2 .d o A(1.5. i= 1 .1) B(20. 3 ) Print * . j= 1 .1: A soma de duas se¸oes de matrizes conform´veis. 5 ) ) ” . dimension ( 2 . 2 ) : : b integer : : i . j ) . 5 ) ) ” . as sub-matrizes B(N+1:N) e A(N+1:N. 2 ) . 3 ) : : a real . Por exemplo. c˜ a Quando I assume o valor N.10) A(1. i= 1 . assim a atribui¸˜o e a ca Programa 6. Matrizes de tamanho zero k lic lic k to bu y N O W ! w w w w . 2 ) end program t e s t a a t r m a t r Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 56 6. o c˜ program t e s t a a t r m a t r i m p l i c i t none real .c A(9. a a a Contudo. 3 a ( i .20) Resultado 8x6 A(10. dimension ( 3 . ”Matriz B : ” print ” ( 2 ( f 1 2 .1: Express˜es e atribui¸oes envolvendo matrizes.1) A(2. 3 do j= 1 .1) B(8. j= 1 . j ) .d o c u -tr .10) A(20. j )= s i n ( r e a l ( i ) ) + c o s ( r e a l ( j ) ) end do end do b= a ( 1 : 2 .5) A(2.1) B(1.20) Figura 6. 3 ) .2/). ( ( a ( i . estas matrizes n˜o s˜o conform´veis.

5 /) Um construtor de matrizes pode tamb´m ser criado usando-se tripletos de subscritos: e (/ A(I. A(3.0/REAL(I). COS(REAL(J)) /) ou ainda um comando DO impl´ ıcito no construtor. 3. <exp2>.6) /) ! Resulta: (/ 1. 3+J). I= 1. 5 /) como pode ser um conjunto de express˜es num´ricas: o e A= (/ I+J. 1. por exemplo. como foi exemplificado na p´gina 49. <exp1> + <exp3>. 6 /) (/ 7. como acontece no construto DO a ıda (se¸˜o 5. 2.3) /) ! Resulta: (/ 1. A(I. como no exemplo IV= (/ 1. (i.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . 0) sendo a <vari´vel> substitu´ por <exp1>.3. 2. A(1. A(5. 1. 3.I+3).I+3). I= 1. <vari´vel>= <exp1>. Tamb´m ´ poss´ encadear-se DO’s impl´ ca e e ıvel ıcitos. . 4.4).0.0.d o c u -tr . 2*J. J= 1. 1. 3.0/3. A(1:5:2.0/5.4). [<exp3>]) a onde <vari´vel> ´ uma vari´vel escalar inteira e <exp1>.6) /) ! Resulta: (/ 1.2). 2*I. alguns exemplos s˜o apresentados: a (/ (i. 9 /) (/ (1. 1. 1.d o <matriz nula>= <escalar> ´ sempre v´lida. 4. i= 1. <exp2>.<exp1> + <exp3>)/<exp3>. Estes construtores servem. 3. 5. J= 1.I+3) /) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6.0/2. 3. J= 1. 3 /) (/ ((I+J.3).0 /) ! DO’s impl´citos encadeados: ı (/ ((I.4). 4. como foi abordado na a ca se¸˜o 6. 2. J**2..2) /) ! Resulta: (/ 2.c 6. 1. Outro a exemplo de uso dos construtores de matrizes est´ na defini¸˜o de um vetor de subscritos. 2+J. 9 /) ! Resulta: (/ 7.3.3). 3. A(I.0. Processamento de Matrizes 57 k lic lic k to bu y N O W ! w w w w . cuja forma geral ´ a seguinte: e (<lista de valores do construtor>. para inicializar os elementos de um vetor.0/4. 4.3). I**2. 3. I= 1.I+3) /) ! Resulta: (/ A(I. 1. 1.2) /) ! = (/ ((1+J.0.0/6. <exp2> e <exp3> s˜o express˜es escalares inteiras. A a e a a o interpreta¸ao dada a este DO impl´ c˜ ıcito ´ que a <lista de valores dos construtor> ´ escrita um n´mero de e e u vezes igual a MAX((<exp2> . i= 1. ca A forma geral de um construtor de matrizes ´ a seguinte: e (/ <lista de valores do construtor> /) onde <lista de valores do construtor> pode ser tanto uma lista de constantes.. A seguir. ack c w o .0/1.. 2.6 Construtores de matrizes Um construtor de matrizes cria um vetor (matriz de posto 1) contendo valores constantes. 2.0. e a c u -tr a c k . SIN(REAL(I)).2:4).

A figura 6. 3 ) . a qual ´ a maneira como a maioria dos compiladores de Fortran armazena os e elementos de matrizes em espa¸os cont´ c ıguos de mem´ria.2) B(4.2) B(5. j= 1 . 2 ) .4) B(5.1 seguiu a denominada ca ca ordem dos elementos de matriz.c B(1. 3 ) Print * .2 /) ) de onde resulta  23 RA =  3 4  45  Usando a fun¸˜o RESHAPE.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .6.3) B(2. SHAPE= (/ 2.2) B(1.2) /). DIMENSION(3.2) :: RA RA= RESHAPE( SOURCE= (/ ((I+J. & shape= ( / 3 .1) B(3. j ) .d o c u -tr a c k . 3 ) .2 A ordem dos elementos de matrizes A maneira como a fun¸˜o RESHAPE organizou os elementos das matrizes na se¸˜o 6. o programa-exemplo da p´gina 55 apresenta uma forma mais concisa: ca a program t e s t a a t r m a t r i m p l i c i t none real . 2 linhas e 3 colunas. 1 : 3 : 2 ) print * . 2 ) end program t e s t a a t r m a t r 6.6.d o c u -tr . 3 ) / ) .1 A fun¸˜o intr´ ca ınseca RESHAPE. j ) .3) B(1. 6. 5 ) ) ” . I= 1.3). Por exemplo.1) B(4. i= 1 . Uma matriz de posto maior que um pode ser constru´ a partir de um construtor de matrizes atrav´s do ıda e uso da fun¸˜o intr´ ca ınseca RESHAPE.2) B(3. 4. 3 /). SHAPE= (/ 3. ”Matriz B : ” print ” ( 2 ( f 1 2 . dimension ( 3 . j ! a= r e s h a p e ( s o u r c e= ( / ( ( s i n ( r e a l ( i ))+ c o s ( r e a l ( j ) ) .4) Figura 6.6. j= 1 . ”Matriz A: ” print ” ( 3 ( f 1 2 . j= 1 .3) B(3.4) B(3. RESHAPE( SOURCE= (/ 1. o ordenamento ´ realizado da mesma maneira.1) B(2. ack c w o .1) B(1. dada a o e matriz Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 58 6. 3 /) ) gera a matriz de posto 2: 135 246 a qual ´ uma matriz de forma (/ 2.3) B(4.4). isto ´. dimension ( 2 .1) B(5. 5. 3 / ) ) b= a ( 1 : 2 . i= 1 . 5 ) ) ” . 2. Este ordenamento ´ obtido variando-se primeiramente o e as dimens˜es iniciais de uma matriz.4) B(2.4) B(4. 3 ) : : a real . i= 1 . 3. Assim. J= 1. Construtores de matrizes k lic lic k to bu y N O W ! w w w w . 6 /).2 ilustra este procedimento com a matriz B(5.4).6. Um outro exemplo seria: e e REAL. ( ( a ( i . em uma matriz com 2 dimens˜es isto ´ obtido variando-se inicialmente as o o e linhas e depois as colunas.3) B(5. 2 ) : : b integer : : i .1) B(2.2: O ordenamento dos elementos da matriz B(5. Em uma matriz com mais de 2 dimens˜es. ( ( b ( i .

isto ´.. ser usadas como argumentos de rotinas a intr´ ınsecas.2.0..-15.0.1. →.1.-1. Calcule a exponencial de todos os argumentos da matriz A.→ G(5. 0:1. DIMENSION(10) :: CH INTEGER :: COMP ..1) G(-10. estas devem ser conform´veis. A forma geral do comando ´ e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6.-1. a ıdo COMPLEX.-1. DIMENSION(-10:5. B . por co e a co exemplo. deixando os demais inalterados.0.1) G(-10.2) → → → c u -tr a c k .2.0) A= 1.2.1.-1.10) :: A.1.→ G(5.-1..1.2.-1. ent˜o.1.d o REAL. c a A seguir. WHERE (A > 0.-1.10) :: A . B= EXP(A) 3. Matrizes podem. -1:0.. DIMENSION(10. -20:1.. somente para aqueles elementos que s˜o positivos.1) →.d o c u -tr .1. ´ mais r´pido escrever-se um c´digo que processa matrizes seguindo o ordenamento co e a o dos elementos..-5:15.1.2.0.-20. novamente.2.1.1.1) → . o resultado ser´ atribu´ a B. → G(-9. 2) :: G o ordenamento segue a ordem: G(-10.0.1.1) → G(-9.0.1. 2. Contudo. B ..0. 2. ack c w o .-20. ´ desej´vel realizar-se opera¸˜es somente para alguns elementos de uma matriz. e a REAL.-19.. A lista completa destas rotinas pode ser obtida no cap´ ıtulo ??.1) → . da mesma forma que escalares. Este tipo de recurso n˜o existem no Fortran 77.0.1.2. Novamente.1.8 Comando e construto WHERE Em muitas situa¸˜es. a 6.1) → G(-8. 6.8.1.-19.1) → G(-8. 1.-19.→ G(5. a a ıdo a qual ´ conform´vel com A.1.1.1.1.1) →. alguns exemplos de rotinas intr´ ınsecas elementais.0. As opera¸˜es a co definidas na rotina intr´ ınseca ser˜o aplicadas a cada elemento da matriz separadamente.. DIMENSION(5. DIMENSION(10.0/A o qual fornece a rec´ ıproca (inversa) de todos os elementos positivos de A. B= SQRT(A) 2.-20...1. Um exemplo simples ´: e REAL.1.0.→ G(5.1) →.0.1 Comando WHERE O comando WHERE fornece esta possibilidade.0.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .1. 25:125) :: A.1. rotinas e que se aplicam a cada elemento de uma matriz. COMP= LEN_TRIM(CH) 6..2) → G(-8.-19.-1. O resultado ser´ atribu´ ` matriz B.1.. Processamento de Matrizes 59 k lic lic k to bu y N O W ! w w w w .c Em muitas situa¸˜es. Encontre o comprimento da string (vari´vel de caractere) excluindo brancos no final da vari´vel para todos a a os elementos da matriz LC.1.. Calcule as ra´ ızes quadradas de todos os elementos da matriz A.2) → G(-9.1.1.. As fun¸˜es intr´ co ınsecas do Fortran 90/95 que manipulam matrizes inteiras foram concebidas de forma a levar em conta este fato..-1.0.-1.-18.1.1) G(-10. a caso mais de uma matriz apare¸a no argumento da rotina..7 Rotinas intr´ ınsecas elementais aplic´veis a matrizes a O Fortran 90/95 permite a existˆncia de rotinas (fun¸˜es ou subrotinas) intr´ e co ınsecas elementais.-20. CHARACTER(LEN= 80)...0.2.

8. Se o teste l´gico aplicada a um determinado elemento da matriz co o resulta verdadeiro. o a a c u -tr a c k . a c˜ e Existe tamb´m uma forma mais geral do construto WHERE que permite a execu¸˜o de atribui¸˜es a elementos e ca co de matrizes que n˜o satisfazem o teste l´gico no cabe¸alho: a o c WHERE (<express~o l´gica matriz>) a o <opera¸~es atribui¸~es matrizes 1> co co ELSEWHERE <opera¸~es atribui¸~es matrizes 2> co co END WHERE O bloco <opera¸~es atribui¸~es matrizes 1> ´ executado novamente sob o controle da m´scara definida co co e a na <express~o l´gica matriz> e somente elementos que satisfazem esta m´scara s˜o afetados. as condi¸oes l´gicas de todas as m´scaras devem ter a mesma forma.AND.NOT. a neste caso. novas atribui¸˜es s˜o realizadas sobre elementos que n˜o satisfazem o teste a o e co a a l´gico definido no cabe¸alho.0 ELSEWHERE RAINING= . PRESSURE. A express˜o l´gica ´ a o a a o e desenvolvida inicialmente e ent˜o somente aqueles elementos da <vari´vel matriz> que satisfazem o teste a a l´gico s˜o operados pela <express~o matriz>. .TRUE. O seguinte exemplo ilustra c˜ o a este recurso: ATRIB1: WHERE (<cond 1>) <corpo 1> !Mascarado por <cond 1> ELSEWHERE (<cond 2>) ATRIB1 <corpo 2> !Masc.2 Construto WHERE Uma unica express˜o l´gica de matriz pode ser usada para determinar uma seq¨ˆncia de opera¸˜es e atri´ a o ue co bui¸˜es em matrizes.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . INC_PRESSURE. ent˜o a atribui¸ao definida no corpo do construto ´ realizada.AND. END WHERE Neste exemplo. Comando e construto WHERE k lic lic k to bu y N O W ! w w w w . Os restantes permanecem inalterados. isto ´.0) PRESSURE= PRESSURE + INC_PRESSURE TEMP= TEMP + 5. ca Um recurso ausente no Fortran90 mas incorporado no Fortran95 ´ o mascaramento na instru¸˜o ELSEWHERE. O programa-exemplo 6. isto ´. no m´u co a ximo. ack c w o . <cond 4> ELSEWHERE ATRIB2 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 60 6. todas com a mesma forma. .NOT. o c Um exemplo simples do construto WHERE ´: e WHERE (PRESSURE <= 1. Em seguida. do teste l´gico determinado no cabe¸alho do construto.d o WHERE (<express~o l´gica matriz>) <vari´vel matriz>= <express~o matriz> a o a a A <express~o l´gica matriz> deve ter a mesma forma que a <vari´vel matriz>. a qual deve ser a ultima. e ca juntamente com a possibilidade de conter qualquer n´mero de instru¸˜es ELSEWHERE mascaradas mas. A sintaxe deste construto ´: co e WHERE (<express~o l´gica matriz>) a o <opera¸~es atribui¸~es matrizes> co co END WHERE Inicialmente. embora n˜o a a do mesmo tipo. Adicionalmente. uma instru¸˜o ELSEWHERE sem m´scara. <cond 1> .AND. TEMP e RAINING s˜o todas matrizes com a mesma forma. <exco co a a press~o l´gica matriz>. Todas as express˜es l´gicas que definem ca a ´ o o as m´scaras devem ter a mesma forma.8.2 mostra outra aplica¸˜o do construto WHERE.c 6.d o c u -tr . por <cond 2> . <cond 1> ATRIB2: WHERE (<cond 4>) <corpo 4> !Masc.NOT. a <express~o l´gica matriz> ´ desenvolvida e ent˜o cada atribui¸˜o de matriz ´ executada sob a o e a ca e o controle da m´scara. a o a a as <opera¸~es atribui¸~es matrizes 2> s˜o executadas sob o controle da m´scara definida por . os construtos WHERE podem ser encadeados e nomeados. por <cond 2> . que ´ aplicado a cada a e o c e elemento das matrizes envolvidas nas opera¸˜es.

.d o c u -tr a c k . : ) print * . <cond 1> .NOT.NOT. : ) print * . ! . <cond 4> <cond 3> . Al´m disso. ! . o Uma matriz aloc´vel ´ declarada na linha de declara¸˜o de tipo de vari´vel com o atributo ALLOCATABLE. END WHERE ATRIB1 <cond 2> .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . pois a forma e o tamanho das matrizes podem ser decididos durante o o processamento do c´digo.AND.. dimension ( 3 . 3 ) . . por .. shape= ( / 3 . isto ´.NOT. quando n˜o mais necess´rias.2: Exemplo do construto WHERE.:). ”Matriz A o r i g i n a l : ” print * . 0 ) a= s q r t ( a ) elsewhere a= a ** 2 end where print * .AND. ack c w o . um para cada dimens˜o da matriz.NOT. a ( 2 .. Por exemplo.9 Matrizes aloc´veis a Uma novidade importante introduzida no Fortran 90/95 ´ a habilidade de se declarar vari´veis dinˆmicas. <cond 1> . : ) end program t e s t a w h e r e <corpo 5> !Masc. Usando matrizes aloc´veis. a matriz de duas dimens˜es A ´ declarada como aloc´vel atrav´s da declara¸˜o: a o e a e ca REAL. Este recurso oferece um uso de mem´ria a a o muito mais eficiente que o Fortran 77.d o c u -tr . posteriormente. Processamento de Matrizes 61 k lic lic k to bu y N O W ! w w w w . ! ..AND. ALLOCATABLE :: A Esta forma de declara¸˜o n˜o aloca espa¸o de mem´ria imediatamente ` matriz. <cond 3> 6.NOT. matrizes dinˆmicas. <cond 1> . correntemente n˜o co ca e e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. O recurso de matrizes autom´ticas permite que matrizes locais em uma fun¸˜o o a a ca ou subrotina tenham forma e tamanho diferentes cada vez que a rotina ´ invocada. a ( 1 ..NOT. Matrizes autom´ticas s˜o e a a discutidas no cap´ ıtulo ??. ”Matriz A m o d i f i c a d a : ” print * . a ( 1 . : ) print * . a a a ambos os tipos sendo matrizes dinˆmicas. . a ( 3 . O status da matriz nesta situa¸˜o ´ not currently allocated. a e ca a O posto da matriz deve tamb´m ser declarado com a inclus˜o dos s´ e a ımbolos de dois pontos “:”. ELSEWHERE (<cond 3>) ATRIB1 <corpo 3> !Masc. j= 1 . END WHERE ATRIB2 .. program t e s t a w h e r e i m p l i c i t none real . Fortran 90 fornece tanto matrizes aloc´veis quanto matrizes autom´ticas. e a a em particular. a ( 3 .AND. ELSEWHERE ATRIB1 <corpo 6> !Masc. ´ poss´ a a e ıvel alocar e de-alocar espa¸o de c mem´ria conforme necess´rio. por . por . j ! a= r e s h a p e ( s o u r c e= ( / ( ( s i n ( r e a l ( i+j ) ) . liberadas. ca a o e o c´digo torna-se muito mais robusto.NOT.AND. 3 ) / ) .c Programa 6. a ( 2 . DIMENSION(:. 3 / ) ) print * . 3 ) : : a integer : : i . <cond 2> . i= 1 . : ) ! where ( a >= 0 .AND. o qual oferecia somente aloca¸˜o est´tica (fixa) de mem´ria. Matrizes aloc´veis permitem que grandes fra¸˜es da mem´ria do computador sejam usadas somente quando a co o requerido e. <cond 2> . como acontece com as declaraca a c o a ¸˜es usuais de matrizes. . : ) print * ..

. logo antes da matriz c o e ca ser utilizada. B(2*N). READ*. A seguir s˜o dados dois exemplos de uso deste comando: ca a ALLOCATE (A(0:N. ack c w o . o comando fica c o DEALLOCATE (A) Tanto os comandos ALLOCATE e DEALLOCATE possuem o especificador opcional STAT. para liberar o espa¸o na mem´ria reservado para a matriz A. ser liberado com o comando DEc a ALLOCATE.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . mais tarde. ALLOCATABLE :: A INTEGER :: STATUS . END IF . Se STAT= est´ presente no comando. o programa ´ a e abortado. ALLOCATABLE :: C INTEGER :: N ..d o c u -tr . Este comando especifica os limites da matriz. STAT= <status>]) onde <status> ´ uma vari´vel inteira escalar. STAT= <status>]) DEALLOCATE (<lista de objetos alocados> [.TAM2). ´ poss´ alocar-se ou de-alocar-se mais de uma matriz simultaneamente. usando-se o comando ALLOCATE. TAM2 ALLOCATE (A(TAM1. Um breve exemplo do uso destes comandos seria: REAL. Matrizes aloc´veis a k lic lic k to bu y N O W ! w w w w . Neste caso. ALLOCATABLE :: A.M)) Como se pode ver. a forma geral do comando ´: c˜ ca e ALLOCATE (<lista de objetos alocados> [... seguindo as mesmas regras definidas na se¸˜o 6. esta estrat´gia confere uma flexibilidade grande na defini¸˜o de matrizes ao programador. Se o especificador STAT= n˜o estiver presente e ocorra um erro no processo. B.M)) ou usando express˜es inteiras: o ALLOCATE (A(0:N+1. o qual retorna o status do comando de aloca¸ao ou de-aloca¸˜o.9.1. Por exemplo. Finalmente. DIMENSION (:.2*N)) B(:N)= A B(N+1:)= SQRT(A) DO I= 1. <status> recebe o valor e a a zero se o procedimento do comando ALLOCATE/DEALLOCATE foi bem sucedido ou um valor positivo se houve um erro no processo.. DEALLOCATE (A) .c o m 62 6. como indica a e ıvel <lista de objetos alocados>.:)= B END DO DEALLOCATE (A.. DIMENSION(:... Este comando requer somente nome da matriz previamente alocada. ! Comandos de processamento de erro. DIMENSION(:). Espa¸o de mem´ria ´ dinamicamente alocado durante a execu¸˜o do programa. ALLOCATE (A(N). digamos tam1 e tam2 e ent˜o declarar uma matriz a a a com tam1 × tam2 elementos: INTEGER :: TAM1. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 c u -tr a c k . C) Matrizes aloc´veis tornam poss´ o requerimento freq¨ente de declarar uma matriz tendo um n´mero vari´vel a ıvel u u a de elementos.:). Por exemplo.d o alocada.. STAT= STATUS) IF (STATUS > 0)THEN . TAM2 REAL.:). pode ser necess´rio ler vari´veis. B REAL. TAM1. e ca O espa¸o alocado ` matriz com o comando ALLOCATE pode. ! Uso da matriz A. C(N.N C(I..

Assim. j ) . uma matriz aloc´vel possui um status de aloca¸˜o. n+1) . ´ E poss´ verificar se uma matriz est´ ou n˜o correntemente alocada usando-se a fun¸˜o intr´ ıvel a a ca ınseca ALLOCATED. n ) . h´ trˆs restri¸˜es no uso de matrizes aloc´veis: a e co a 1. ca Finalmente. i= 1 . ”Valor i n i c i a l de B : ” print ” ( 2 ( i 2 ) ) ” . j= 1 .d o c u -tr . O que ocorria era que em subseq¨entes chamadas desta rotina a matriz com o status u undefined n˜o mais podia ser utilizada. a ocorre um erro. j= 1 . portanto. n allocate (b(n . Contudo. ( ( b ( i . ”Segundo v a l o r de n : ” . O resultado de uma fun¸˜o n˜o pode ser uma matriz aloc´vel (embora possa ser uma matriz). Esta ´ uma fun¸˜o l´gica com um argumento. ( ( b ( i . o qual deve ser o nome de uma matriz aloc´vel. n a l l o c a t e ( b ( n+1.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Matrizes aloc´veis n˜o podem ser usadas na defini¸˜o de um tipo derivado (esta restri¸˜o foi retirada no a a ca ca Fortran2003. dimension ( : . Usando-se e ca o a esta fun¸ao. caso contr´rio. ”Segundo v a l o r de B : ” print ” ( 3 ( i 2 ) ) ” . No Fortran 95. j ) . n )) b= n print * . o uso do especificador STAT= permite se tome providˆncias caso n˜o seja poss´ alocar a e a ıvel matriz. o seu status retorna e a not currently allocated. i= 1 . Processamento de Matrizes 63 k lic lic k to bu y N O W ! w w w w . mas ainda n˜o alocada. uma vez que ela ´ de-alocada. ser alocadas e a a de-alocadas dentro da mesma unidade de programa (ver cap´ ıtulo ??). ” T e r c e i r o v a l o r de B : ” print ” ( 5 ( i 2 ) ) ” . : ) . poss´ ca ıvel no Fortran 90 mas n˜o no Fortran 95. n ) deallocate ( b ) n= n + 1 print * . O programa-exemplo a seguir ilustra o uso de matrizes aloc´veis. n ) . ” T e r c e i r o v a l o r de n : ” . a Como foi mencionado anteriormente. o comando ALLOCATE somente pode ser usado em matrizes n˜o correntemente a alocadas. ALLOCATED(A)) ALLOCATE (A(5. ack c w o . j . o qual ocorria a e quando uma matriz era alocada dentro de uma rotina e n˜o era de-alocada antes de retornar ao programa a que chamou a rotina.n+1)) b= n + 1 print * . n )) b= n print * .d o No exemplo acima. Quando a matriz a ca ´ declarada. j ) . por alguma raz˜o. j= 1 . o seu status ´ unallocated ou not currently allocated. ”Valor i n i c i a l de n : ” . a program t e s t a a l o c i m p l i c i t none integer . ca a a 3.NOT. Quando a matriz e a e aparece no comando ALLOCATE.c Um terceiro status de aloca¸˜o. comandos como os seguintes s˜o poss´ c˜ a ıveis: IF (ALLOCATED(A)) DEALLOCATE (A) ou IF (. Matrizes aloc´veis n˜o podem ser argumentos mudos de uma rotina e devem.20)) c u -tr a c k . todas as matrizes aloc´veis definidas em rotinas s˜o a a a automaticamente colocadas no status unallocated quando da sa´ da rotina. n+1) end program t e s t a a l o c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. ´ o undefined. a l l o c a t a b l e : : b integer : : i . ( ( b ( i . n ) deallocate ( b ) n= n + 1 print * . o seu status passa a allocated . i= 1 . 2. n allocate (b(n . um boa pr´tica de ıda a programa¸˜o consiste em sempre de-alocar todas as matrizes alocadas dentro de uma rotina. n= 2 ! print * . ao passo que o comando DEALLOCATE somente pode ser usado em matrizes alocadas.

PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . foram incorporados do padr˜o do Fortran95.10. O comando FORALL pode ser visto como uma atribui¸˜o de ca matrizes expressa com a ajuda de ´ ındices. Por e co exemplo. por´m que sejam c e automaticamente paraleliz´veis.d o c u -tr a c k .10. 2:N-1) B(2:N-1. J+1) + A(I-1. a 6. em rela¸˜o ca c ca ao Fortran90. a ca 6.d o c u -tr . Neste exemplo em particular.] [. 1:N-2) + A(2:N-1.c Quando um construto DO como o seguinte: DO I= 1. mas o uso do FORALL possibilita a paraleliza¸˜o do programa execut´vel. A id´ia ´ oferecer a ca e e ao programador uma estrutura que possibilite os mesmos recursos obtidos com la¸os DO. 3:N) & + A(1:N-2.0/Y) porque. dadas as seguintes opera¸˜es com sub-matrizes: co A(2:N-1.10 Comando e construto FORALL . J) B(I. deve-se notar que as atribui¸˜es n˜o co a poderiam ser representadas de maneira simples atrav´s de uma atribui¸˜o de matrizes inteiras. o processador deve realizar cada itera¸˜o sucessiva em ordem. 2:N-1) tamb´m podem ser implementadas com o uso do construto FORALL: e FORALL (I= 2:N-1. e ıvel a A forma geral do comando FORALL ´ a seguinte: e FORALL (<´ndice>= <menor>:<maior>[:<passo>] [. <passo> e <express~o escalar l´gica> s˜o as mesmas co ı a o a impostas ao construto FORALL e ser˜o explicadas na descri¸˜o da forma geral do mesmo. ack c w o 6.2 Construto FORALL O construto FORALL tamb´m existe.J)= A(I. Posteriormente. quando o programa estiver rodando em uma plataforma paralela.0/Y(I.J)= A(I. tal como A= X.I)= 1. Em segundo lugar.J) /= 0. alguns avan¸os realizados pelo HPF.I)= X(I) a qual especifica que as atribui¸˜es individuais sejam realizadas em qualquer ordem.1 Comando FORALL As instru¸˜es do exemplo acima s˜o implementadas atrav´s de um comando FORALL da seguinte maneira: co a e FORALL (I= 1:N) A(I. 2:N-1)= A(2:N-1. e ca porque as matrizes A e X n˜o tˆm a mesma forma. J) + A(I+1.0 n˜o est´ presente na opera¸˜o de matriz ca a a a a ca inteira. J= 1:N.I)= X(I) END DO !A tem posto 2 e X tem posto 1. N A(I.J) END FORALL Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 64 6. somente ´ poss´ introduzir esta m´scara com o uso do FORALL. a matriz X tˆm elementos transpostos ca e em rela¸˜o ` matriz Y. o qual consiste em uma vers˜o do Fortran90 ca a destinada a sistemas de computa¸˜o paralela. J= 2:N-1) A(I.<´ndice>= <meı ı nor>:<maior>[:<passo>]] & [.J-1) + A(I. com uma atribui¸˜o ap´s a outra. <maior>. Outros exemplos do comando s˜o: a e a FORALL (I= 1:N.10. 2:N-1) + A(3:N.J) /= 0.J) O primeiro exemplo poderia ser implementado com o uso da fun¸˜o intr´ ca ınseca RESHAPE. Ele permite que diversas atribui¸˜es sejam executadas em ordem. 2:N-1)= A(2:N-1. J´ o segundo exemplo n˜o poderia ser implementado com ca a a a opera¸˜o de matriz inteira (tal como X= 1. entre eles. <menor>.J)= I + J FORALL (I= 1:N.0) X(J. Y(I. Este problema ca o foi enfocado com a constru¸˜o do HPF (High Performance Fortran). Comando e construto FORALL k lic lic k to bu y N O W ! w w w w . a instru¸˜o FORALL. ´ executado. <express~o escalar l´gica>]) <opera¸~es atribui¸~es matrizes> a o co co as condi¸˜es impostas a <´ndice>. co caso o programa rode em uma plataforma paralela. em primeiro lugar. e ca ca o Isto representa um impedimento severo na otimiza¸˜o do c´digo em uma plataforma paralelizada. a m´scara Y(I.. inclusive simultaneamente.. J= 1:M) A(I.

3 (programa tesforall) ilustra uma aplica¸˜o simples do construto FORALL.16).I) END FORALL END FORALL atribui a transposta do triˆngulo inferior de A ao triˆngulo superior de A. Usualmente. tamb´m em qualquer ordem. co a e Construtos FORALL podem ser encadeados. a a 3O que ´ denominado de ˆmbito (scope). Processamento de Matrizes 65 k lic lic k to bu y N O W ! w w w w . Uma vez tendo as express˜es inteiras sido desenvolvidas. N˜o ocorre erro na atribui¸˜o.J)= A(J. Rotinas ca ıvel e externas podem ser acessadas de dentro do <corpo> ou de dentro do cabe¸alho do construto (na m´scara. A seq¨ˆncia ue FORALL (I= 1:N-1) FORALL (J= I+1:N) A(I.3). e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 6. coo co mandos ou construtos WHERE e outros comandos ou construtos FORALL.3 O <´ndice> n˜o pode ser redefinido dentro do construto. A sintaxe mais geral do construto FORALL ´: e [<nome>:] FORALL (<´ndice>= <menor>:<maior>[:<passo>]. A vers˜o com o FORALL ´ melhor leg´ o a e ıvel e pode ser executado em qualquer ordem. <express~o l´gica escalar>]) a o <corpo> END FORALL [<nome>] onde <´ndice> ´ uma vari´vel inteira escalar.. se presente. <maior> ı a o e <passo> devem ser express˜es escalares inteiras e formar uma seq¨ˆncia de valores como para uma se¸˜o de o ue ca matriz (se¸˜o 6.TRUE. Cada comando no corpo de um construto WHERE ´ executado em seq¨ˆncia. ca os elementos das linhas de B s˜o definidos como as rec´ a ıprocas dos correspondentes elementos de A multiplicados pelo respectivo ´ ındice. s˜o ativados em cada comando no <corpo> do construto.2. mas podem fazer referˆncia c e a um ´ ındice de um FORALL mais externo. Aqueles para os quais o resultado ´ . seguindo a opera¸˜o completa.:) == 0) A(I. uma vez que as atribui¸˜es s˜o inicialmente armazenadas em espa¸o a co a c tempor´rio e somente no final s˜o transferidas aos componentes da matriz A. ´ desenvolvida para cada combina¸˜o dos valores dos ´ o e ca ındices. o sub-objeto (sub-matriz. outras vari´veis podem ter o mesmo nome do <´ndice> mas est˜o separadas e n˜o s˜o acess´ a ı a a a ıveis de dentro do FORALL.] & ı [. por c a exemplo). a qual permanece v´lida somente dentro do <corpo> do construto.:)= I/A(I. <´ndice>= <menor>:<maior>[:<passo>]] [. a <express~o o a l´gica escalar>. a a Um construto FORALL pode conter um comando ou construto WHERE. eles n˜o podem fazer referˆncia a um ´ ca a e ındice no mesmo cabe¸alho. cada elemento nulo de A ´ substitu´ pelo valor do ´ e ıdo ındice das linhas e.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ı e a a ou seja. Pode-se notar aqui que o comando FORALL n˜o acarreta em erro.4 (programa tesforall2) calcula a transposta de uma matriz.d o c u -tr . Todas as rotinas invocadas dentro desta estrutura devem ser puras (se¸˜o 8.. como parte da identifica¸˜o do sub-objeto. tal como o GO TO. Por exemplo.c Aqui.:)= I B(I. porque inicialmente as express˜es s˜o desenvolvidas. e a O <corpo> consiste em um ou mais dos seguintes: express˜es e atribui¸˜es de elementos de matrizes.d o Neste exemplo. cada elemento de A ´ igualado ` soma dos quatro vizinhos mais pr´ximos e ´ feita ent˜o uma e a o e a c´pia em B. em a ca o a qualquer ordem. ack c w o . Nenhum dos comandos no <corpo> pode a ca conter uma ramifica¸˜o ou ser acess´ atrav´s de algum comando de desvio de fluxo. por exemplo) no lado esquerdo de uma atribui¸˜o no <corpo> far´ referˆncia a cada <´ndice> dos construtos ca a e ı nos quais ele est´ imerso. seus resultados guardados em local de armazenagem tempor´ria na mem´ria e s´ no final as a o o atribui¸˜es s˜o feitas. ca O programa-exemplo 6. & ı [. e ue FORALL (I= 1:N) WHERE (A(I. inclusive simultaneamente.:) END FORALL c u -tr a c k . enquanto ca que o programa 6. As express˜es <menor>.

: ) f o r a l l ( i= 1 : 3 . b end program t e s f o r a l l Programa 6.3: Exemplo simples do construto FORALL. 3 ) : : a integer : : i . j )= a ( j .d o c u -tr a c k . : ) print * . dimension ( 3 0 ) : : a . b integer : : n ! f o r a l l ( n =1:30) a ( n)= n b ( n)= a(30−n+1) end f o r a l l print * .c Programa 6. a print * . 3 / ) ) print * . : ) print * .10. dimension ( 3 . j a= r e s h a p e ( s o u r c e= ( / ( i . ’ Vetor a : ’ print * . ’ ’ print * . ”Tr a ns p ost a de A: ” print * . j= 1 : 3 ) a ( i . a ( 1 . i= 1 . a ( 2 . ”Matriz A: ” print * .d o c u -tr . i ) print * . program t e s f o r a l l 2 i m p l i c i t none integer . : ) end program t e s f o r a l l 2 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 66 6. ’ Vetor b : ’ print * . ack c w o . : ) print * . a ( 3 . program t e s f o r a l l i m p l i c i t none integer . shape= ( / 3 .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Comando e construto FORALL k lic lic k to bu y N O W ! w w w w . a ( 3 .4: Calcula a transposta de uma matriz utilizando o comando FORALL. : ) print * . a ( 1 . a ( 2 . 9 ) / ) .

7. No caso de uma fun¸˜o elemental. cada elemento da matriz resultante. a a As rotinas intr´ ınsecas ser˜o descritas posteriormente com base nesta categoriza¸˜o.d o c u -tr a c k .d o c u -tr a c k ! w o . S˜o especificadas para argumentos escalares. Rotinas n˜o-elementais. a a al´m das oferecidas pelo padr˜o da linguagem.c Cap´ ıtulo 7 Rotinas Intr´ ınsecas Em uma linguagem de programa¸˜o destinada a aplica¸˜es cient´ ca co ıficas h´ uma exigˆncia ´bvia para que as a e o fun¸˜es matem´ticas mais requisitadas sejam oferecidas como parte da pr´pria linguagem.c O W w . Elas usualmente tˆm co a co a a e argumentos matriciais e o resultado tamb´m ´ uma matriz cujos elementos dependem dos elementos dos e e argumentos. Retornam propriedades dos seus argumentos principais que n˜o dependem dos seus co a valores. No padr˜o do Fortran90/95 h´ mais de cem rotinas intr´ a a ınsecas ao todo. Al´m disso. caso exista. Ao longo deste cap´ ıtulo. e a Fun¸˜es inquisidoras. e Fun¸˜es transformacionais. A a co distin¸˜o entre estas duas classes de rotinas ser´ discutida com mais detalhes no cap´ ca a ıtulo 8. sendo o c´digo que as implementa otimizado para levar em co o conta todos os recursos de hardware dispon´ ıveis. Elas se dividem em grupos distintos. o pre¸o a pagar ´ a falta de portabilidade de programas e a c e que usam rotinas fora do grupo-padr˜o. somente do seu tipo e/ou esp´cie. ao inv´s de terem co a o e de ser todas implementadas pelo programador. cada ca argumento com intento IN ou INOUT deve ser uma matriz e cada elemento resultante ser´ obtido como se a a subrotina tivesse sido aplicada a cada elemento da matriz que ´ passada como argumento ` subrotina. S˜o fun¸˜es que n˜o s˜o nem elementais nem inquisidoras. mas podem tamb´m ser aplicadas a maa e trizes conform´veis.1 Categorias de rotinas intr´ ınsecas H´ quatro categorias de rotinas intr´ a ınsecas: Rotinas elementais. e espera-se que estas fun¸˜es tenham sido altamente otimizadas e testadas. a ca 7.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . porque uma unica chamada ` rotina deve causar um n´mero grande de ´ a u opera¸˜es individuais sendo feitas simultaneamente. Al´m disso. a ca ser´ obtido como se a fun¸˜o tivesse sido aplicada a cada elemento individual da matriz que foi usada a ca como argumento desta fun¸˜o. rotinas extras somente poder˜o ser oferecidas ao usu´rio a e a a atrav´s de m´dulos (cap´ e o ıtulo 8). contudo. as rotinas intr´ ınsecas ser˜o naturalmente divididas em fun¸˜es e subrotinas. Rotinas que n˜o se enquadram em nenhum dos tipos acima. No caso de uma subrotina elemental com um argumento matricial.2 Declara¸˜o e atributo INTRINSIC ca Um nome pode ser especificado como o nome de uma rotina intr´ ınseca com a declara¸˜o INTRINSIC. os quais ser˜o descritos em certo detalhe. co A eficiˆncia das rotinas intr´ e ınsecas quando estas manipulam matrizes em computadores vetoriais ou paralelos deve ser particularmente marcante. ao serem fornecidas como parte do compilador. Certos compiladores em particular poder˜o oferecer ainda mais rotinas. o qual ca possui a forma geral: INTRINSIC <lista de nomes intr´nsecos> ı 67 o m w w w w .

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

onde <lista de nomes intr´nsecos> ´ uma lista de nomes de rotinas intr´ ı e ınsecas. O uso desta declara¸˜o ´ ca e recomendado quando se quer enfatizar ao compilador que certos nomes s˜o destinados a rotinas intr´ a ınsecas. Isto pode ser util quando o programador est´ estendendo a defini¸˜o de uma rotina intr´ ´ a ca ınseca, em um procedimento denominado sobrecarga de operador (operator overloading), o qual faz uso de interfaces gen´ricas (generic e interfaces). Para mais detalhes nestes recursos avan¸ados, ver Metcalf & Reid (1996) [3]. Alternativamente, c uma ou mais fun¸˜es intr´ co ınsecas podem ser declaradas com o atributo INTRINSIC, no lugar da declara¸˜o. ca O atributo ou declara¸˜o INTRINSIC s˜o excludentes em rela¸˜o ao atributo ou declara¸˜o EXTERNAL (se¸˜o ca a ca ca ca 8.2.12).

c u -tr a c k

.c

7.3

Fun¸oes inquisidoras de qualquer tipo c˜

As seguintes s˜o fun¸˜es inquisidoras, com argumentos que podem ser de qualquer tipo: a co ASSOCIATED(POINTER[,TARGET]). Quanto TARGET est´ ausente, a fun¸˜o retorna o valor .TRUE. se o ponteiro a ca (pointer) est´ associado com um alvo (target) e retorna o valor .FALSE. em caso contr´rio. O status de a a associa¸˜o de ponteiro de POINTER n˜o deve ser indefinido. Se TARGET estiver presente, este deve ter o ca a mesmo tipo, esp´cie e posto de POINTER. O valor da fun¸˜o ´ .TRUE. se POINTER estiver associado a e ca e TARGET ou .FALSE. em caso contr´rio. No caso de matrizes, .TRUE. ´ obtido somente se as formas s˜o a e a idˆnticas e elementos de matriz correspondentes, na ordem de elementos de matriz, est˜o associadas umas e a com as outras. Se o comprimento do caractere ou tamanho da matriz s˜o iguais a zero, .FALSO. ´ obtido. a e Um limite diferente, como no caso de ASSOCIATED(P,A) seguindo a atribui¸˜o de ponteiro P => A(:) ca quando LBOUND(A)= 0, ´ insuficiente para causar um resultado .FALSE.. TARGET pode ser tamb´m um e e ponteiro, em cujo caso seu alvo ´ comparado com o alvo de POINTER; o status de associa¸˜o de ponteiro e ca de TARGET n˜o deve ser indefinido e se ou POINTER ou TARGET est˜o dissociados, o resultado ´ .FALSE. a a e PRESENT(A). Pode ser chamada em um sub-programa que possui um argumento mudo opcional A (ver se¸˜o ca 8.2.9) ou acesse este argumento mudo a partir de seu hospedeiro. A fun¸˜o retorna o valor .TRUE. se o ca argumento est´ presente na chamada do sub-programa ou .FALSE. em caso contr´rio. Se um argumento a a mudo opcional ´ usado como um argumento real na chamada de outra rotina, ele ´ considerado tamb´m e e e ausente pela rotina chamada. KIND(X). Tem o argumento X de qualquer tipo e esp´cie e o seu resultado tem o tipo inteiro padr˜o e de valor e a igual ao valor do parˆmetro de esp´cie de X. a e

7.4

Fun¸oes elementais num´ricas c˜ e

H´ 17 fun¸˜es elementais destinadas ` realiza¸˜o de opera¸˜es num´ricas simples, muitas das quais realizam a co a ca co e convers˜o de tipo de vari´veis para alguns ou todos os argumentos. a a

7.4.1

Fun¸oes elementais que podem converter c˜

Se o especificador KIND estiver presente nas fun¸˜es elementais seguintes, este deve ser uma express˜o inteira co a e fornecer um parˆmetro de esp´cie de tipo que seja suportado pelo processador. a e ABS(A). Retorna o valor absoluto de um argumento dos tipos inteiro, real ou complexo. O resultado ´ do tipo e inteiro se A for inteiro e ´ real nos demais casos. O resultado ´ da mesma esp´cie que A. e e e AIMAG(Z). Retorna a parte imagin´ria do valor complexo Z. O tipo do resultado ´ real e a esp´cie ´ a mesma a e e e que Z. AINT(A[,KIND]). Trunca um valor real A em sentido ao zero para produzir um valor real cujos valores decimais s˜o iguais a zero. Se o argumento KIND estiver presente, o resultado ´ da esp´cie dada por este; caso a e e contr´rio, retorna o resultado na esp´cie padr˜o do tipo real. a e a ANINT(A[,KIND]). Retorna um real cujo valor ´ o n´mero completo (sem parte fracion´ria) mais pr´ximo de e u a o A. Se KIND estiver presente, o resultado ´ do tipo real da esp´cie definida; caso contr´rio, o resultado ser´ e e a a real da esp´cie padr˜o. e a CEILING(A). Retorna o menor inteiro maior ou igual ao seu argumento real. Se KIND estiver presente, o resultado ser´ do tipo inteiro com a esp´cie definida pelo parˆmetro; caso contr´rio, o resultado ser´ inteiro da esp´cie a e a a a e padr˜o. a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008

o

m

68

7.3. Fun¸˜es inquisidoras de qualquer tipo co

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

CMPLX(X[,Y][,KIND]). Converte X ou (X,Y) ao tipo complexo com a esp´cie definida pelo argumento KIND, e caso presente, ou na esp´cie padr˜o do tipo complexo em caso contr´rio. Se Y for ausente, X pode ser dos e a a tipos inteiro, real ou complexo. Se Y estiver presente, tanto X quanto Y devem ser dos tipos inteiro ou real. FLOOR(A[,KIND]). Retorna o maior inteiro menor ou igual a seu argumento real A. Se KIND estiver presente, o resultado ´ do tipo inteiro da esp´cie definida; caso contr´rio, o resultado ´ inteiro da esp´cie padr˜o. e e a e e a INT(A[,KIND]). Converte ao tipo inteiro da esp´cie padr˜o ou dada pelo argumento KIND. O argumento A pode e a ser:
ˆ inteiro, em cujo caso INT(A)= A; ˆ real, em cujo caso o valor ´ truncado em sentido ao zero, ou e ˆ complexo, em cujo caso somente a parte real ´ considerada e esta ´ truncada em sentido ao zero. e e

c u -tr a c k

.c

NINT(A[,KIND]). Retorna o valor inteiro mais pr´ximo do real A. Se KIND estiver presente, o resultado ´ do o e tipo inteiro da esp´cie definida; caso contr´rio, o resultado ser´ inteiro da esp´cie padr˜o. e a a e a REAL(A[,KIND]). Converte ao tipo real da esp´cie dada pelo argumento KIND. O argumento A pode ser dos e tipos inteiro, real ou complexo. Se A for complexo, a parte imagin´ria ´ ignorada. Se o argumento KIND a e estiver ausente, o resultado ser´ da esp´cie padr˜o do tipo real se A for inteiro ou real e da mesma esp´cie a e a e de A se este for complexo.

7.4.2

Fun¸oes elementais que n˜o convertem c˜ a

As seguintes s˜o fun¸˜es elementais cujos resultados s˜o do tipo e da esp´cie iguais aos do primeiro ou unico a co a e ´ argumento. Para aquelas que possuem mais de um argumento, todos devem ser do mesmo tipo e esp´cie. e CONJG(Z). Retorna o conjugado do valor complexo Z. DIM(X,Y). Retorna MAX(X-Y,0) para argumentos que s˜o ambos inteiros ou ambos reais. a MAX(A1,A2[,A3,...]). Retorna o m´ximo (maior valor) entre dois ou mais valores inteiros ou reais. a MIN(A1,A2[,A3,...]). Retorna o m´ ınimo (menor valor) entre dois ou mais valores inteiros ou reais. MOD(A,P). Retorna o restante de A m´dulo P, ou seja, A-INT(A/P)*P. Se P=0, o resultado depende do proceso sador. A e P devem ambos ser inteiros ou ambos reais. MODULO(A,P). Retorna A m´dulo P quando A e P s˜o ambos inteiros ou ambos reais; isto ´, A-FLOOR(A/P)*P no o a e caso real ou A-FLOOR(A÷P)*P no caso inteiro, onde ÷ representa divis˜o matem´tica ordin´ria. Se P=0, o a a a resultado depende do processador. SIGN(A,B). Retorna o valor absoluto de A vezes o sinal de B. A e B devem ser ambos inteiros ou ambos reais. Se B= 0 e ´ inteiro, seu sinal ´ assumido positivo. Se o processador n˜o tem a capacidade de disting¨ir e e a u entre zeros reais positivos ou negativos ent˜o, para B= 0.0 o sinal ´ assumido positivo. a e

7.5

Fun¸oes elementais matem´ticas c˜ a

As seguintes s˜o fun¸˜es elementais que calculam o conjunto imagem de fun¸˜es matem´ticas elementares. a co co a O tipo e esp´cie do resultado s˜o iguais aos do primeiro argumento, o qual, usualmente, ´ o unico. e a e ´ ACOS(X). Retorna a fun¸˜o arco cosseno (ou cos−1 ) para valores reais do argumento X (|X| ≤ 1). O resultado ´ ca e obtido em radianos no intervalo 0 ≤ ACOS(X) ≤ π. ASIN(X). Retorna a fun¸˜o arco seno (ou sin−1 ) para valores reais do argumento X (|X| ≤ 1). O resultado ´ ca e obtido em radianos no intervalo −π/2 ≤ ASIN(X) ≤ π/2. ATAN(X). Retorna a fun¸˜o arco tangente (ou tan−1 ) para valores reais do argumento X (−∞ < X < ∞). O ca resultado ´ obtido em radianos no intervalo −π/2 ≤ ATAN(X) ≤ π/2. e ATAN2(Y,X). Retorna a fun¸˜o arco tangente (ou tan−1 ) para pares de argumentos reais, X e Y, ambos do mesmo ca tipo e esp´cie. O resultado ´ o valor principal do argumento do n´mero complexo (X,Y), expresso em e e u radianos no intervalo −π < ATAN2(Y, X) ≤ π. Os valores de X e Y n˜o devem ser simultaneamente nulos. a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008

o

m

Cap´ ıtulo 7. Rotinas Intr´ ınsecas

69

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

COS(X). Retorna o valor da fun¸˜o cosseno para um argumento dos tipos real ou complexo. A unidade do ca argumento X ´ suposta ser radianos. e COSH(X). Retorna o valor da fun¸˜o cosseno hiperb´lico para um argumento X real. ca o EXP(X). Retorna o valor da fun¸˜o exponencial para um argumento X real ou complexo. ca LOG(X). Retorna o valor da fun¸˜o logaritmo natural para um argumento X real ou complexo. No caso real, X ca deve ser positivo. No caso complexo, X n˜o pode ser nulo e a parte imagin´ria do resultado (Zi ) est´ no a a a intervalo −π < Zi ≤ π. LOG10(X). Retorna o valor da fun¸ao logaritmo de base 10 para um argumento X real e positivo. c˜ SIN(X). Retorna o valor da fun¸˜o seno para um argumento dos tipos real ou complexo. A unidade do argumento ca X ´ suposta ser radianos. e SINH(X). Retorna o valor da fun¸˜o seno hiperb´lico para um argumento X real. ca o SQRT(X). Retorna o valor da fun¸˜o raiz quadrada para um argumento X real ou complexo. No caso real, X ca n˜o pode ser negativo. No caso complexo, o resultado consiste na raiz principal, ou seja, a parte real do a resultado ´ positiva ou nula. Quando a parte real do resultado for nula, a parte imagin´ria ´ positiva ou e a e nula. TAN(X). Retorna o valor da fun¸˜o tangente para um argumento X real. A unidade do argumento ´ suposta ser ca e radianos. TANH(X). Retorna o valor da fun¸˜o tangente hiperb´lica para um argumento X real. ca o

c u -tr a c k

.c

7.6
7.6.1

Fun¸oes elementais l´gicas e de caracteres c˜ o
Convers˜es caractere-inteiro o

As seguintes s˜o fun¸˜es elementais para converter um unico caractere em um inteiro e vice-versa. a co ´ ACHAR(I). O resultado ´ do tipo de caractere padr˜o de comprimento um e retorna o caractere que est´ na e a a posi¸˜o especificada pelo valor inteiro I na tabela ASCII de caracteres (tabela 4.9). I deve estar no ca intervalo 0 ≤ I ≤ 127; caso contr´rio, o resultado depende do processador. a CHAR(I[,KIND]). O resultado ´ do tipo caractere de comprimento um. A esp´cie ´ dada pelo argumento e e e opcional KIND, se presente ou, em caso contr´rio, ser´ a esp´cie padr˜o. A fun¸˜o retorna o caractere na a a e a ca posi¸˜o I (tipo inteiro) da seq¨ˆncia de caracteres interna do processador associada com o parˆmetro de ca ue a esp´cie relevante. I deve estar no intervalo 0 ≤ I ≤ n − 1, onde n ´ o n´mero de caracteres na seq¨ˆncia e e u ue interna do processador. IACHAR(C). O resultado ´ do tipo inteiro padr˜o e retorna a posi¸˜o do caractere C na tabela ASCII. Se C n˜o e a ca a est´ na tabela, o resultado depende do processador. a ICHAR(C). O resultado ´ do tipo inteiro padr˜o e retorna a posi¸˜o do caractere C na seq¨ˆncia interna do e a ca ue processador associada com a esp´cie de C. e

7.6.2

Fun¸oes de compara¸˜o l´xica c˜ ca e

As seguintes fun¸oes elementais aceitam strings de caracteres da esp´cie padr˜o, realizam uma compara¸˜o c˜ e a ca l´xica baseada na tabela ASCII e retornam um resultado l´gico da esp´cie padr˜o. Se as strings tiverem e o e a comprimentos distintos, a mais curta ´ complementada com espa¸os em branco. e c LGE(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A segue STRING_B na seq¨ˆncia estabelecida pela ue tabela ASCII, ou a iguala. O resultado ´ .FALSE. em caso contr´rio. e a LGT(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A segue STRING_B na seq¨ˆncia estabelecida pela ue tabela ASCII. O resultado ´ .FALSE. em caso contr´rio. e a LLE(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A precede STRING_B na seq¨ˆncia estabelecida ue pela tabela ASCII, ou a iguala. O resultado ´ .FALSE. em caso contr´rio. e a LLT(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A precede STRING_B na seq¨ˆncia estabelecida ue pela tabela ASCII. O resultado ´ .FALSE. em caso contr´rio. e a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008

o

m

70

7.6. Fun¸˜es elementais l´gicas e de caracteres co o

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

TRUE.FALSE. a posi¸˜o mais ` esquerda deste caractere ´ retornada. quando dois est˜o presentes. a posi¸˜o inicial da primeira das substrings o a a ca ´ retornada. ca a e VERIFY(STRING.BACK]).SET[.. c SCAN(STRING. Forma a string que consiste na concatena¸˜o de NCOPIES c´pias de STRING. e ADJUSTL(STRING). Se BACK (vari´vel a a l´gica) est´ ausente. u ıcio INDEX(STRING.1 Fun¸oes n˜o-elementais para manipula¸˜o de strings c˜ a ca Fun¸˜o inquisidora para manipula¸˜o de strings ca ca LEN(STRING). Retorna um valor inteiro padr˜o correspondente ` posi¸˜o de um caractere de a a ca STRING que esteja em SET. o qual consiste na posi¸˜o inicial a ca de SUBSTRING como uma substring de STRING. Se a vari´vel l´gica BACK est´ ausente. Se BACK est´ presente ca a e a com valor .KIND]). e e a a 7. ca a e 7. Rotinas Intr´ ınsecas 71 k lic lic k to bu y N O W ! w w w w . e a TRIM(STRING). Os argumentos STRING.c As seguintes s˜o fun¸˜es elementais que manipulam strings.NCOPIES). ou zero se n˜o houver tal caractere.7. ack c w o 7.. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 7.FALSE. SUBSTRING e SET s˜o a co a sempre do tipo de caractere e. Se BACK est´ presente com valor e e a . Se a vari´vel l´gica BACK est´ ausente. Retorna o valor l´gico idˆntico ao valor de L.. a posi¸˜o mais ` direita deste caractere ´ retornada. ambos devem ser da mesma esp´cie. Retorna um valor do tipo inteiro padr˜o. Ajusta uma string ` direita. O valor de STRING n˜o precisa estar definido. ca e o LOGICAL(L[.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . STRING deve c a ser escalar. A esp´cie do resultado ´ definida pelo o e e e argumento opcional KIND.BACK]).. O resultado ´ a e e da mesma esp´cie de STRING.6.7 7.. a 7. a posi¸˜o inicial da ultima das substrings ´ retornada. o valor 1 ´ retornado se SUBSTRING tem comprimento zero.TRUE.BACK]). Se BACK est´ presente ca a e a com valor .. Retorna o valor inteiro padr˜o 0 se cada caractere em STRING aparece em SET. Ou seja. REPEAT(STRING. remove os espa¸os em branco no in´ da string e a c ıcio coloca o mesmo n´mero de brancos no final da string.2 Fun¸oes transformacionais para manipula¸˜o de strings c˜ ca Existem duas fun¸˜es que n˜o s˜o elementais porque o comprimento do resultado depende do valor de um co a a argumento. remove os espa¸os em branco no final da string e a c coloca o mesmo n´mero de brancos no in´ da string.6. ou ca a a o a presente com valor . Retorna STRING com todos os espa¸os em branco no final da vari´vel removidos. LEN_TRIM(STRING). ou a a o a presente com valor . ignorando a espa¸os em branco no final do argumento.4 Convers˜o l´gica a o A fun¸˜o elemental a seguir converte de uma esp´cie do tipo l´gico em outra.d o c u -tr a c k . a posi¸˜o mais ` direita de tal caractere ´ retornada.3 Fun¸oes elementais para manipula¸oes de strings c˜ c˜ . a posi¸˜o mais ` esquerda de tal caractere ´ retornada. o valor LEN(STRING)+1 ´ retornado se ca ´ e e SUBSTRING tem comprimento zero. Trata-se de uma fun¸˜o inquisidora que retorna um valor inteiro padr˜o escalar que corresponde ca a ao n´mero de caracteres em STRING se esta ´ escalar ou de um elemento de STRING se a mesma ´ uma u e e matriz. a ou a posi¸˜o de um caractere de STRING que n˜o esteja em SET.FALSE.SUBSTRING[. Retorna um valor inteiro padr˜o correspondente ao comprimento de STRING. Ou seja. Ajusta uma string ` esquerda. ou se est´ presente com o valor . ou zero se tal substring n˜o existe.TRUE. caso esteja presente.7. u ADJUSTR(STRING).d o c u -tr . onde ca o NCOPIES ´ do tipo inteiro e seu valor n˜o deve ser negativo. ou ´ da esp´cie padr˜o em caso contr´rio. Ambos argumentos devem ser escalares.SET[.

8. u a 7. Para X real ou inteiro. retorna um inteiro padr˜o que cont´m a precis˜o decimal equivaa e a lente no modelo que representa n´meros reais da mesma esp´cie de X.d o c u -tr a c k . MAXEXPONENT(X). real ou complexo. exceto f1 . onde k ´ 1 se b ´ uma potˆncia inteira de 10 ou 0 em outro caso. MINEXPONENT(X).8. Para X real ou inteiro. onde huge e tiny s˜o. O valor da fun¸˜o ´ INT((p − u e ca e 1)) ∗ LOG10(b))+k. (7. O ca ´ valor per se do argumento n˜o precisa ser definido. retorna o inteiro padr˜o que ´ a base no modelo que inclui X. o expoente m´ a ınimo no modelo que inclui X. Para X real. Para X real. O resultado possui a o mesmo tipo e esp´cie de X. Ou seja. PRECISION(X). retorna o inteiro padr˜o cujo valor ´ o n´mero de d´ a e u ıgitos significantes no modelo que inclui X. e ´ um inteiro no intervalo emin ≤ e ≤ emax e cada fk ´ um a e e inteiro no intervalo 0 ≤ fk < b. o maior e o menor n´meros positivos nos modelos. −LOG10(tiny))) para X real. O valor ´ e e 1 − b−p bemax para X real ou para X inteiro.8. somente o seu tipo e esp´cie. ou seja. desde que todos os n´meros sejam represent´veis. e a Os valores de todos os parˆmetros nestes modelos s˜o escolhidos para o processador de tal forma que o a a modelo melhor se ajuste ao hardware. e EPSILON(X). Para X real ou complexo. a u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 rq − 1 o m 72 7. a co Cada fun¸˜o tem um unico argumento que pode ser escalar ou matricial e todas retornam um valor escalar. r ´ um inteiro maior que um (usualmente 2) e cada valor de wk ´ um e e e inteiro no intervalo 0 ≤ wk < r.d o c u -tr . retorna p para X real ou q para X inteiro. Para X real. Para X real ou inteiro. Para X inteiro. isto ´. O valor da fun¸˜o u e ca ´ INT(LOG10(huge)) para X inteiro e e INT(MIN(LOG10(huge). p e b s˜o inteiros maiores que um. retorna o maior valor represent´vel no modelo que inclui X. que ´ n˜o nulo.2 Fun¸oes num´ricas inquisidoras c˜ e H´ nove fun¸˜es inquisidoras que retornam valores para os modelos de dados associados com seus argumentos. retorna um resultado real com o mesmo tipo de X e que ´ quase indisting¨´ do valor e uıvel 1. u e Para cada esp´cie do tipo inteiro. a e DIGITS(X). Fun¸˜es inquisidoras e de manipula¸˜es num´ricas co co e k lic lic k to bu y N O W ! w w w w .1 Fun¸oes inquisidoras e de manipula¸˜es num´ricas c˜ co e Modelos para dados inteiros e reais . o modelo ´: e e q i=s× k=1 wk × rk−1 . ca HUGE(X). retorna a e e b para X real ou r para X inteiro.2) onde s = ±1.0 no modelo que inclui X.1) onde s = ±1.8 7. e e e RADIX(X). a fun¸˜o calcula b1−p . RANGE(X). retorna o inteiro padr˜o que cont´m o intervalo de expoentes a e decimais nos modelos representando n´meros reais ou inteiro da mesma esp´cie de X. q ´ um inteiro positivo. Para cada esp´cie do tipo real. respectivamente. retorna o inteiro padr˜o emin .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Isto ´. (7. ou seja. o expoente m´ximo no modelo que inclui a a X. o modelo ´: e e x=0 e x = s × be × k=1 p fk × b−k . ack c w o 7. retorna o inteiro padr˜o emax .c As fun¸˜es inquisidoras e de manipula¸˜es num´ricas s˜o definidas em termos de modelos de representa¸˜o co co e a ca de n´meros inteiro e reais para cada esp´cie suportada pelo processador.

e SET_EXPONENT(X.d o c u -tr . Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 7.I). Se mais de uma esp´cie for dispon´ e ıvel. Tanto P quanto R s˜o e a e a inteiros escalares. Retorna uma quantidade real da mesma esp´cie que X cujo valor ´ o espa¸amento absoluto do e e c modelo de n´meros pr´ximos a X. a fun¸˜o retorna Xb1−e . e SELECTED_REAL_KIND([P][. o resultado ´ -1. a fun¸˜o retorna |Xb−e | bp .8. Retorna o inteiro padr˜o cujo valor ´ a parte de expoente e de X quando representado como um a e n´mero de modelo. e e c u -tr a c k .I). Se mais de uma esp´cie for dispon´ e ıvel. Retorna uma quantidade real da mesma esp´cie que X e cujo valor ´ o n´mero distinto mais e e u pr´ximo de X no sentido dado pelo sinal da quantidade real S. Retorna o inteiro escalar padr˜o que ´ o valor do parˆmetro da esp´cie para a e a e um dado do tipo real com precis˜o decimal (conforme retornada pela fun¸˜o PRECISION) no m´ a ca ınimo igual a P e intervalo de expoente decimal (conforme retornado pela fun¸˜o RANGE) no m´ ca ınimo igual a R. u e e FRACTION(X). a ca e e ca SPACING(X).8.4 Fun¸oes transformacionais para valores de esp´cie (kind) c˜ e H´ duas fun¸˜es que retornam o menor valor do parˆmetro de esp´cie que ir´ satisfazer um dado requerimento a co a e a num´rico. Retorna uma quantidade real da mesma esp´cie que X cuja parte fracion´ria ´ a parte e a e fracion´ria da representa¸˜o de X e cuja parte exponencial ´ I.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Retorna uma quantidade real da mesma esp´cie que X cujo valor ´ XbI .d o TINY(X). O resultado ´ be−p se X ´ n˜o nulo e este resultado est´ dentro do u o e e a a intervalo de n´meros represent´veis. -3: se ambos n˜o forem dispon´ a ıveis. Se nenhuma esp´cie ´ dispon´ e e ıvel. onde b ´ a base do modelo e e e para X e I ´ do tipo inteiro. -2: se um intervalo de expoente grande o suficiente n˜o for dispon´ a ıvel. Se X=0. a esp´cie com a menor precis˜o decimal ´ escolhida. ack c w o .c 7.S). por´m s˜o classificadas como transformacionais.3. u e ca NEAREST(X. a fun¸˜o retorna Xb−e . o resultado tamb´m ´ nulo. Se n˜o houver esp´cie dispon´ a e ıvel. Retorna uma quantidade real da mesma esp´cie que X e cujo valor ´ a parte fracion´ria de X e e a quando representado como um n´mero de modelo. o resultado ´: e -1: se a precis˜o requerida n˜o for dispon´ a a ıvel. EXPONENT(X). u a a ca 7. O valor de S n˜o pode ser nulo.R]). isto ´. isto ´. u bemin −1 no modelo que inclui X. Rotinas Intr´ ınsecas 73 k lic lic k to bu y N O W ! w w w w . o a RRSPACING(X). As fun¸˜es tˆm argumentos e resultados escalares. pelo menos um destes deve estar presente. isto ´. Retorna uma quantidade real da mesma esp´cie que X cujo valor ´ a rec´ e e ıproca do espa¸amento c relativo dos n´meros de modelo pr´ximos a X. retorna o menor n´mero positivo. u o e ca SCALE(X. c˜ a ca SELECTED_INT_KIND(R).7. Para X real. a fun¸˜o retorna TINY(X). Retorna o inteiro escalar padr˜o que ´ o valor do parˆmetro da esp´cie para um dado a e a e do tipo inteiro capaz de representar todos os valor inteiros n no intervalo −10R < n < 10R . a esp´cie com menor intervalo exponencial ´ e e escolhida. Caso contr´rio. onde R ´ e um inteiro escalar. e co e e a Estas fun¸oes j´ foram discutidas na se¸˜o 3. O resultado ´ do mesmo tipo e esp´cie de X.3 Fun¸oes elementais que manipulam quantidades reais c˜ H´ sete fun¸˜es elementais cujo primeiro ou unico argumento ´ do tipo real e que retorna valores relacionados a co ´ e aos componentes dos modelos de valores associados ao valor do argumento.

Retorna o n´mero de bits no modelo para bits dentro de um inteiro da mesma esp´cie que I. se o bit POS do inteiro I tem valor 1 e retorna o e a . ca IAND(I.J). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que os bits s˜o deslocados a SHIFT posi¸˜es para a esquerda (-ISHIFT desloca para a direita se SHIFT for positivo). As rotinas s˜o baseadas em um modelo no qual um valor inteiro ´ representado por s bits wk . e a IOR(I. de acordo com a tabelao verdade I 1100 J 1010 I AND(I. J) 1 1 1 0 I e J devem ser do mesmo tipo.FALSE. em uma seq¨ˆncia da direita para a esquerda. o resultado tamb´m ser´ do mesmo tipo.9. Retorna um inteiro do mesmo tipo que I e valor igual aos LEN bits de I iniciando no bit POS ajustado ` direita e com todos os outros bits iguais a 0. POS e LEN devem ser inteiros positivos tais a que POS + LEN ≤ BIT SIZE(I). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que o bit POS ´ levado a e 1. 1.9 Rotinas de manipula¸˜o de bits ca . s − 1. de acordo com a o tabela-verdade I 1100 J 1010 I EOR(I. k=0 Este modelo ´ v´lido somente no contexto destas rotinas intr´ e a ınsecas e ´ idˆntico ao modelo de n´meros inteiros e e u (7.J).9. .J). Zeros s˜o inseridos co a a partir da extremidade oposta. . IEOR(I. O u e resultado ´ um inteiro escalar da mesma esp´cie que I. Retorna o OU l´gico exclusivo de todos os bits de I e correspondentes bits em J. Retorna o valor l´gico da esp´cie padr˜o . de acordo com a o tabela-verdade I 1100 J 1010 I IOR(I.1) quando r ´ uma potˆncia inteira de 2 e ws−1 = 0. e a ISHFT(I.POS).LEN).d o c u -tr . J) 0 1 1 0 I e J devem ser do mesmo tipo. IBITS(I. e e 7. e e 7. SHIFT deve ser um inteiro com valor que satisfaz a inegualdade |SHIFT| ≤ BIT SIZE(I).c H´ onze rotinas para manipular bits contidos em quantidades inteiras.SHIFT).2 Fun¸oes elementais c˜ BTEST(I. ack c w o 7.d o c u -tr a c k . quando a a apropriado. Rotinas de manipula¸˜o de bits ca k lic lic k to bu y N O W ! w w w w . . POS deve ser um inteiro com valor no intervalo 0 ≤ POS < BIT SIZE(I).POS).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . POS deve ser um inteiro com valor no intervalo 0 ≤ POS < BIT SIZE(I). J) 1 0 0 0 I e J devem ser do mesmo tipo.POS). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que o bit POS ´ levado a e 0. mas quando ws−1 = 1 os modelos diferem. . Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 74 7. Retorna o l´gico AND de todos os bits em I e bits correspondentes em J.POS. o resultado tamb´m ser´ do mesmo tipo. Estas rotinas s˜o elementais.9. IBSET(I. em outra situa¸˜o.TRUE. o resultado tamb´m ser´ do mesmo tipo. com a e k = 0.1 Fun¸˜o inquisidora ca BIT_SIZE(I). e a IBCLR(I. baseada no valor n˜o-negativo ue a s−1 wk × 2k . POS deve ser um inteiro com valor no intervalo 0 ≤ POS < BIT SIZE(I). Retorna o OU l´gico inclusivo de todos os bits de I e correspondentes bits em J.

trˆs casos s˜o ca e e a poss´ ıveis: 1. c˜ ca ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 7. Elas possuem dois a co co argumentos que s˜o ambos de um tipo num´rico (inteiro.LEN. Rotinas Intr´ ınsecas 75 k lic lic k to bu y N O W ! w w w w . O resultado tem forma (/n/) e o elemento i tem o valor dado por SUM(MATRIZ_A(I. por exemplo. entre dois e e co ca escalares.SHIFT[.. a fun¸˜o retorna SUM(CONJG(VETOR_A)*VETOR_B). O resultado tem forma (/k/) e o elemento j tem o valor dado por SUM(MATRI_A*MATRIZ_B(:. Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que os SIZE bits mais ` direita (ou todos os bits se SIZE for ausente) s˜o deslocados de forma circular SHIFT posi¸˜es a a co para a esquerda (-ISHIFT desloca para a direita se SHIFT for positivo). NOT(I).m/) e MATRIZ_B tem forma (/m. Requer dois argumentos. o resultado ´ de posto 1 e tamanho SIZE.10 Fun¸˜o de transferˆncia ca e A fun¸˜o de transferˆncia permite que dados de um tipo sejam transferidos a outro tipo sem que a repreca e senta¸˜o f´ ca ısica dos mesmos seja alterada. MATRIZ_A tem forma (/n. O a e o resultado ´ do mesmo tipo e esp´cie como seria resultante das opera¸˜es de multiplica¸˜o ou . iniciando na posi¸˜o TOPOS. MATRIZ_A tem forma (/n.SIZE]). Os outros bits de TO permanecem inalterados. o resultado cont´m e a e SOURCE como sua parte inicial e o resto ´ indefinido. FROMPOS+LEN ≤ BIT_SIZE(FROM). de acordo com a tabela-verdade o I 01 NOT(I) 1 0 c u -tr a c k . e ca os outros tipos s˜o obtidos atrav´s de transferˆncias de e para este tipo. ca FROMPOS.J)). Para argumentos l´gicos. a se SIZE estiver ausente. VETOR_B). Retorna o complemento l´gico de todos os bits em I.SIZE]). s˜o definidas na se¸˜o 7.FROMPOS.k/).1 abaixo. co co a ca DOT_PRODUCT(VETOR_A. a fun¸˜o retorna ca e o ca ANY(VETOR_A .k/).11 Fun¸˜es de multiplica¸˜o vetorial ou matricial co ca H´ duas fun¸˜es transformacionais que realizam multiplica¸˜es vetorial ou matricial. Se e a representa¸˜o f´ ca ısica do resultado ´ t˜o ou mais longa que o tamanho de SOURCE.MOLD[. SHIFT deve ser um inteiro com valor que n˜o excede o valor de SIZE ou BIT_SIZE(I). ambos de posto 1 e do mesmo tamanho.:)*MATRIZ_B). TOPOS ≥ 0 e TOPOS+LEN ≤ BIT_SIZE(TO).c 7. Se VETOR_A ´ dos tipos inteiro ou real.d o c u -tr . TO ´ um inteiro com intent INOUT. o sistema pode ser escrito para uma dado tipo. As fun¸˜es SUM e ANY.MATRIZ_B). Realiza a multiplica¸˜o escalar. 2. ao se escrever um sistema de ca ´ armazenamento e recupera¸˜o de dados.TOPOS). a e e TRANSFER(SOURCE.9.12.TO. Quando SIZE estiver ausente. LEN e TOPOS s˜o todos inteiros com intent IN e devem ter valores que satisfazem as inegualdades: a LEN ≥ 0. usadas nas defini¸˜es abaixo.AND. FROM. Zeros s˜o inseridos a partir da a extremidade oposta. o resultado ´ a parte inicial de e e SOURCE. Como o posto do resultado depende se SIZE ´ ou n˜o especificado. FROMPOS ≥ 0. ele deve ser da mesma esp´cie que FROM. inteiro. as formas s˜o as mesmas que para argumentos num´ricos e os valores s˜o detero a e a minados pela substitui¸ao da fun¸˜o SUM e do operador “*” pela fun¸˜o ANY e pelo operador .k/) e o elemento (i. j) tem o valor dado por SUM(MATRIZ_A(I. a fun¸˜o retorna SUM(VETOR_A*VETOR_B). real ou complexo) ou ambas do tipo l´gico. MATRIZ_A tem forma (/m/) e MATRIZ_B tem forma (/m. O resultado tem forma (/n. se VETOR_A ´ do tipo come ca e plexo.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .d o ISHFTC(I.:)*MATRIZ_B(:. A mesma vari´vel pode ser e e a especificada para FROM e TO. 7. Para argumentos num´ricos.J)). em outros casos. ack c w o . 3.3 Subrotina elemental MVBITS(FROM. o argumento em si n˜o pode e a a ser um argumento opcional. Copia a seq¨ˆncia de bits em FROM que inicia na posi¸˜o FROMPOS e tem ue ca comprimento LEN para TO. 7.AND.VETOR_B).m/) e MATRIZ_B tem forma (/m/). Quando SIZE estiver presente. e se VETOR_A ´ do tipo l´gico. por exemplo. MATMUL(MATRIZ_A. Esta fun¸˜o pode ser util. e o resultado ´ escalar se MOLD for escalar e ´ de posto 1 e tamanho suficiente para armazenar toda a SOURCE e e se MOLD for uma matriz.AND. Retorna um valor do tipo e esp´cie de MOLD.

a c˜ co 7. MAXVAL(ARRAY).13.2 Argumento opcional DIM Todas as fun¸˜es acima tˆm um segundo argumento opcional DIM. ´ retornado.1 Status de aloca¸˜o ca ALLOCATED(ARRAY). tamanho e status de aloca¸˜o de uma matriz de a co ca qualquer tipo. 7. Uma vez que o resultado depende somente nas propriedades da matriz. tais como somar seus elementos. ack c w o 7. exceto COUNT tem o resultado do mesmo tipo e esp´cie que o argumento. co e o Se esta matriz estiver presente.J)). Retorna o valor m´ ınimo dentre os elementos da matriz ARRAY. ela deve ter a mesma forma que o primeiro argumento e a opera¸˜o ´ aplicada ca e aos elementos do primeiro argumento correspondentes aos elementos verdadeiros de MASK.d o c u -tr a c k .TRUE.FALSE. MINVAL.c H´ sete fun¸oes transformacionais que executam opera¸˜es em matrizes.d o c u -tr . se algum dos elementos da matriz l´gica MASK for verdadeiro e o valor o . Retorna a soma de todos os elementos de uma matriz inteira. SUM(A. Retorna o valor inteiro padr˜o igual ao n´mero de elementos da matriz MASK que tˆm o valor a u e . Retorna. Retorna o valor .12. O argumento MASK afeta somente o valor da fun¸˜o ca e n˜o afeta o desenvolvimento de argumentos que s˜o express˜es matriciais. a opera¸˜o ´ aplicada a todas as se¸˜es de posto 1 que varrem atrav´s da dimens˜o a ca e co e a DIM para produzir uma matriz de posto reduzido por um e extens˜es iguais `s extens˜es nas outras dimens˜es. A fun¸˜o retorna ca o valor 0 se ARRAY for nula. Se os status da aloca¸˜o ´ indefinido. 7.12 Fun¸˜es transformacionais que reduzem matrizes co .:. Todas. a fun¸˜o retorna o valor positivo de maior magnitude suportado pelo processador.12. real ou complexa.1 Caso de argumento unico ´ Nas suas formas mais simples. Retorna o produto de todos os elementos de uma matriz inteira. a qual pode ser inteira ou real. a Se ARRAY for nula. uma matriz l´gica MASK.FALSE. o qual ´ um inteiro escalar. estas fun¸˜es tˆm um unico argumento matricial e o resultado ´ um valor co e ´ e escalar. o valor . quando a matriz aloc´vel ARRAY est´ correntemente alocada. a a o 7. se todos os elementos da matriz l´gica MASK forem verdadeiros ou se MASK o for nula.TRUE.13 Fun¸˜es inquisidoras de matrizes co H´ cinco fun¸˜es que inquirem sobre os limites.6/) e e e o seu elemento (i. a fun¸˜o retorna o valor negativo de maior magnitude suportado pelo processador. j) tem o valor dado por SUM(A(I.3 Argumento opcional MASK As fun¸˜es MAXVAL. SUM(A.DIM=2) ´ uma matriz real de forma (/4. a qual pode ser inteira ou real. retorna o valor .12.TRUE. o a o o Por exemplo. COUNT(MASK). na a a outra situa¸ao.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . o valor .12. Fun¸˜es transformacionais que reduzem matrizes co k lic lic k to bu y N O W ! w w w w . o valor desta n˜o a necessita ser definido. Retorna o valor m´ximo dentre os elementos da matriz ARRAY. ca PRODUCT(ARRAY).5.. Se ARRAY for nula. Se este co e e argumento est´ presente. o resultado tamb´m ´ c˜ e ca e e e indefinido. MASK= A>0) soma todos os elementos positivos da matriz A. Por exemplo. Retorna o valor .6/). e ALL(MASK). se todos os elementos forem falsos ou se a matriz for nula. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 76 7. 7. forma. real ou complexa. ca MINVAL(ARRAY). PRODUCT e SUM tˆm um terceiro argumento opcional.TRUE. a ANY(MASK). se A ´ uma matriz real de forma (/4. SUM(ARRAY). caso contr´rio.FALSE. A fun¸˜o ca retorna o valor 1 se ARRAY for nula.

Se VECTOR ´ presente.DIM]).DIM]). este a e deve ser um vetor do mesmo tipo e esp´cie de ARRAY e tamanho no m´ e ınimo igual ao n´mero t de elementos u selecionados. este deve ser um inteiro escalar e o resultado ´ um escalar e e inteiro padr˜o com o valor do limite inferior na dimens˜o DIM. em cujo caso. Retorna um escalar inteiro padr˜o igual ao tamanho da matriz ARRAY ou a extens˜o ao a a longo da dimens˜o DIM.d o c u -tr a c k . Trata-se de uma fun¸˜o elemental. todos os outros s˜o iguais aos e e a correspondentes elementos de FIELD se este for uma matriz ou igual a FIELD se este for um escalar.TRUE. Como o posto do resultado depende da a a presen¸a de DIM. Os o ca ca elementos s˜o tomados na ordem dos elementos das matrizes. Similar a LBOUND exceto que retorna limites superiores. um argumento mudo opcional. O tamanho de SHAPE deve ser constante e seus elementos n˜o podem e a ser negativos.c As fun¸˜es a seguir inquirem sobre as propriedades de uma matriz. neste caso. SIZE(ARRAY[. 7. a e a o LBOUND(ARRAY[. esta co a deve estar alocada. c ca a SHAPE(SOURCE).14. forma e tamanho . ack c w o 7. retorna uma matriz inteira padr˜o de posto um. com a poss´ perca ıvel muta¸˜o dos ´ ca ındices. a UNPACK(VECTOR. o tamanho do resultado n˜o deve exceder o tamanho a de SOURCE. s˜o os elementos de SOURCE. retorna um vetor contendo os elementos de ARRAY e correspondentes aos valores verdadeiros de MASK na ordem dos elementos das matrizes.2). a 7. todos os elementos s˜o selecionados. Retorna uma matriz do tipo e esp´cie de VECTOR e da forma de MASK. se t < n.VECTOR]). 7. Rotinas Intr´ ınsecas 77 k lic lic k to bu y N O W ! w w w w . ele deve estar associado a um alvo (target).FIELD). MASK deve ser do tipo l´gico. a qual cont´m e a e os limites inferiores. Quando DIM ´ presente. MASK deve e ser uma matriz l´gica e VECTOR deve ser um vetor de tamanho no m´ o ınimo igual ao n´mero de elementos u verdadeiros de MASK. Se ORDER estiver presente. na ordem dos elementos da matriz. este deve ser um vetor inteiro com um valor que ´ uma e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 7. a PACK(ARRAY. elementos i do resultado para i > t s˜o os elementos correspondentes de VECTOR.DIM]).MASK). arranjados na ordem de elementos de matrizes (se¸˜o 6. Quando VECTOR ´ ausente.MASK[.SHAPE[.FSOURCE.14. a co 7.6. Quando DIM ´ ausente.MASK. FIELD deve ser do mesmo tipo e esp´cie de VECTOR e deve ou ser escalar ou ter e a mesma forma que MASK. caso este argumento esteja presente.2 Agrupando e desagrupando matrizes A fun¸˜o transformacional PACK agrupa dentro de um vetor aqueles elemento de uma matriz que s˜o seleca a cionados por uma matriz l´gica conforme e a fun¸˜o transformacional UNPACK executa a opera¸˜o reversa. tem tamanho igual ao tamanho n do VECTOR.ORDER]). Uma se¸˜o ca de matriz ou uma express˜o matricial ´ assumida ter limite inferior 1 e limite superior igual `s extens˜es. No caso de uma matriz aloc´vel. o resultado tem tamanho zero.13. os elementos da matriz resultante. RESHAPE(SOURCE. seguidos por c´pias de PAD.14. MASK pode ser um escalar de valor . ´ o i -´simo elemento de VECTOR. TSOURCE pode ter qualquer tipo e FSOURCE ca deve ser do mesmo tipo e esp´cie. Retorna um vetor inteiro padr˜o contendo a forma da matriz ou escalar SOURCE. O elemento do resultado correspondendo ao i-´simo elemento verdadeiro de e MASK. esta deve ser uma matriz do mesmo tipo e esp´cie de SOURCE.d o c u -tr .14 Fun¸˜es de constru¸˜o e manipula¸˜o de matrizes co ca ca H´ oito fun¸˜es que constroem ou manipulam matrizes de qualquer tipo. No caso de a um escalar.1 Fun¸˜o elemental MERGE ca MERGE(TSOURCE.3 Alterando a forma de uma matriz A fun¸˜o transformacional RESHAPE permite que a forma de uma matriz seja alterada.2 Limites. Retorna uma matriz com forma dada pelo vetor inteiro SHAPE e tipo e esp´cie iguais aos da matriz SOURCE. tamb´m na ordem de ca a o e elementos de matrizes. Se ORDER estiver ausente. Se PAD est´ presente. o argumento da fun¸˜o n˜o pode ser.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a UBOUND(ARRAY[.PAD][.. No caso de um ponteiro (pointer). por sua vez. O resultado. O resultado ´ TSOURCE se MASK ´ verdadeiro e o e e ou FSOURCE no contr´rio. Se PAD a e estiver ausente ou for uma matriz de tamanho zero.

TRUE.SHIFT[. . o primeiro na ordem de elementos de matriz ´ assumido. n). Se houver mais de um elemento com o mesmo valor m´ ınimo. DIM e NCOPIES s˜o inteiros escalares. . 2. e a 7.k ). esta deve ter a forma de ARRAY com a dimens˜o DIM omitida. SHIFT oferece a um valor distinto para cada deslocamento. . Retorna uma matriz do mesmo tipo.. correspondem aos elementos de SOURCE e PAD na ordem de elementos de matriz. sn ) do resultado. . .DIM]).MASK]). c u -tr a c k . 2. .. . . . Retorna um vetor inteiro padr˜o de tamanho igual a ao posto de ARRAY. os elementos R(s1 . Se DIM for omitido.2).1).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .15.1.. sn ). R(1.MASK]) ou MAXLOC(ARRAY[. Seu valor ´ a seq¨ˆncia de subscritos de um elemento de valor m´ximo (dentre aqueles e ue a correspondentes aos elementos de valor . . s˜o aqueles de SOURCE na ordem de elementos de matriz a seguidos por c´pias de PAD. . .1. esp´cie e forma de ARRAY. como se todos os o limites inferiores de ARRAY fossem iguais a 1.j ) do resultado ´ igual a MATRIX(i. . deve ser do mesmo tipo e o esp´cie de ARRAY. m-1 e o elemento m ´ ARRAY(1). Fun¸˜es transformacionais para localiza¸˜o geom´trica co ca e k lic lic k to bu y N O W ! w w w w . como se todos os o limites inferiores de ARRAY fossem iguais a 1. . ele pode ser um escalar e prover todos os valores necess´rios ou pode ser uma matriz e a cuja forma ´ a de ARRAY com dimens˜o DIM omitida e prover um valor separado para cada deslocamento. Elemento e (i. . . rn+1 ) com subscrito DIM omitido (ou a pr´pria SOURCE se esta for um escalar). . .14. caso esta exista).1. R(2. o seu valor ser´ assumido igual a 1. ... rn+1 ) do resultado ´ SOURCE(s1 . desta forma. real e complexo.. se ORDER tem o valor o e (/3.0) c´pias de SOURCE e o elemento (r1 . .DIM.14. da matriz l´gica MASK. Retorna uma matriz do mesmo tipo e esp´cie da matriz de posto dois MATRIX.DIM]). Por exemplo. Seu valor ´ a seq¨ˆncia de subscritos de um elemento de valor m´ e ue ınimo (dentre aqueles correspondentes aos elementos de valor . exceto que um deslocamento final ´ execue tado e valores de borda s˜o inseridos nas lacunas assim criadas.5 Fun¸˜es de deslocamento matricial co CSHIFT(ARRAY.2). este ´ e e um escalar inteiro padr˜o que indica a dimens˜o ao longo da qual o valor m´ximo deve ser procurado. e o 7.1. ca ca TRANSPOSE(MATRIX).1. ack c w o .d o permuta¸ao de (1.SHIFT[. O resultado cont´m a e MAX(NCOPIES. SHIFT ´ do tipo inteiro e deve ser um escalar a e se ARRAY tiver posto um. .MASK]).. sn ) ´ (r1 .. . tamb´m na ordem de elementos de matriz.c 7. caso esta exista). Se houver mais de um elemento com o mesmo valor m´ximo. R(1.DIM[.1). . a o primeiro na ordem de elementos de matriz ´ assumido. e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 78 7.. sordem(n) ).15 Fun¸˜es transformacionais para localiza¸˜o geom´trica co ca e H´ duas fun¸˜es transformacionais que localizam as posi¸˜es dos valores m´ximos e m´ a co co a ınimos de uma matriz inteira ou real. quando o elemento i do resultado ´ ARRAY(i + 1). os elementos R(1. . tomados na ordem dos ´ c˜ ındices para a matriz tendo elementos R(sordem(1) . Caso o argumento DIM esteja presente.6 Transposta de uma matriz A fun¸˜o TRANSPOSE executa a transposi¸˜o matricial para qualquer matriz de posto dois. ´ e EOSHIFT(ARRAY. e 7. O sentido do deslocamento depende do a sinal de SHIFT e pode ser determinado a partir do caso com SHIFT= 1 e ARRAY de posto um e tamanho m. .j ). .TRUE.1. R(2.MASK]) ou MAXLOC(ARRAY[. da matriz l´gica MASK. MAXLOC(ARRAY. Se BOUNDARY estiver presente.NCOPIES). Retorna uma matriz do tipo e esp´cie de SOURCE e de posto acrescido por e um. e no caso l´gico e brancos no caso de caracteres. o resultado ´ obtido deslocando-se toda se¸˜o vetorial que se e e ca estende ao longo da dimens˜o DIM de forma circular SHIFT vezes. BOUNDARY pode ser omitida quando ARRAY a tiver tipo intr´ ınsecos.BOUNDARY][. . O a a a compilador pode disting¨ir sem aux´ caso o segundo argumento seja DIM ou MASK pelo fato de que o tipo u ılio de vari´vel ´ distinto. E idˆntica a CSHIFT. Se SHIFT e e for uma matriz. DIM ´ um escalar e e inteiro.DIM[. Retorna um vetor inteiro padr˜o de tamanho igual a ao posto de ARRAY.4 Fun¸˜o transformacional para duplica¸˜o ca ca SPREAD(SOURCE.FALSE. Se SHIFT ´ escalar. i= 1. onde o e (s1 .. a e MINLOC(ARRAY.2/).14. em cujo caso o valor zero ´ inserido para os casos inteiro. . .d o c u -tr .. SOURCE pode ser escalar ou matriz.

este ´ zerado. de Coordinated Universal Time. Retorna um pointer dissociado.17. CALL DATE_AND_TIME([DATE][. respectivamente. Retorna o seguinte: COUNT ´ uma vari´vel escalar inteira padr˜o que cont´m o valor. o e a o Todos os argumentos tˆm inten¸˜o OUT (se¸˜o 8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .9). Rotinas Intr´ ınsecas 79 k lic lic k to bu y N O W ! w w w w . o mˆs do ano. ou -HUGE(0) caso n˜o haja rel´gio. Por exemplo. caso n˜o haja rel´gio): a o DATE ´ uma vari´vel escalar de caractere da esp´cie padr˜o que cont´m a data na forma ccyymmdd.c Em Fortran95.d o c u -tr a c k . s˜o aqueles do objeto com o qual o ponteiro est´ associado. ou zero caso n˜o haja rel´gio. ca a ıvel NULL([MOLDE]). O tipo.sss. correspondendo ao sinal. inclusive de indefinido. ack c w o 7. ou Greenwich Mean Time) na forma Shhmm. tamb´m conhecido como e Tempo M´dio de Greenwich. a a a a 7. a co e 7. na pr´xima contagem de tempo. h´ uma subrotina intr´ a ınseca n˜o-elemental que retorna o tempo do processador. a hora local de Bras´ corresponde a UTC= -0300. ou e a a e a zero caso n˜o haja rel´gio. Valores padronizados s˜o retornados em sistemas sem rel´gio. CALL SYSTEM_CLOCK([COUNT][. Na primeira o a o chamada da subrotina. esp´cie e posto do resultado s˜o aqueles de e a MOLDE se ele est´ presente. COUNT_RATE ´ uma vari´vel escalar inteira padr˜o que cont´m o n´mero de contagens por segundo do e a a e u rel´gio. respectivamente. o dia e a e ue e do mˆs.5). ZONE ´ uma vari´vel escalar de caractere padr˜o que ´ fixada como a diferen¸a entre o tempo local e e a a e c o Tempo Coordenado Universal (UTC. e a e a e correspondendo ao s´culo. a o 7.COUNT_RATE][. a diferen¸a temporal em minutos com rela¸˜o ao UTC.2. a fun¸˜o NULL est´ dispon´ para fornecer status de dissociado a ponteiros. ılia VALUES ´ um vetor inteiro padr˜o que cont´m a seguinte seq¨ˆncia de valores: o ano.2. h´ uma subrotina que acessa o rel´gio e ca ca a o interno do processador.8 e e co 8.1 Rel´gio de tempo real o H´ duas subrotinas que retornam informa¸˜o acerca do rel´gio de tempo real. a primeiro ´ baseada no a ca o e padr˜o ISO 8601 (Representa¸˜o de datas e tempos). Retorna os seguintes valores (com valores-padr˜o a nulos ou -HUGE(0). dependente do processador.16 Fun¸˜o transformacional para dissocia¸˜o de ponteiro ca ca . e horas e minutos. Adicionalmente. segundos e milisegundos. mˆs e dia. o processador pode fixar um valor inicial igual a zero. a CALL CPU_TIME(TIME).17.TIME][. minutos. as quais foram escolhidas ser subrotinas no lugar de fun¸˜es a co devido ` necessidade destas retornarem diversas informa¸˜es atrav´s de seus argumentos.17 Subrotinas intr´ ınsecas n˜o-elementais a H´ cinco subrotinas intr´ a ınsecas n˜o elementais. conforme apropriado.2 Tempo da CPU Em Fortran95. e e TIME ´ uma vari´vel escalar de caractere padr˜o que cont´m o tempo na forma hhmmss. O argumento MOLDE ´ um ponteiro de qualquer tipo e que e pode ter qualquer status. em caso contr´rio. ano. que correse a a e pondem ao valor corrente do rel´gio do processador. o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m Cap´ ıtulo 7.d o c u -tr . o a o COUNT_MAX ´ uma vari´vel escalar inteira padr˜o que cont´m o valor m´ximo que COUNT pode assumir. ou um valor negativo (dependente de processador) caso n˜o a haja rel´gio. Assume-se que exista um rel´gio b´sico no sistema que a ca o a ´ incrementado por um para cada contagem de tempo at´ que um valor m´ximo COUNT_MAX ´ alcan¸ado e da´ e e a e c ı.2. respectivamente. Acesso a qualquer argumento opcional pode ser realizado atrav´s do uso das palavras-chave (se¸˜es 8. correspondendo e a a e a horas. Retorna o seguinte: TIME ´ uma vari´vel real escalar padr˜o ` qual ´ atribu´ uma aproxima¸˜o (dependente de processador) e a a a e ıda ca do tempo do processador em segundos. e c ca os segundos do minuto e os milisegundos do segundo. a hora do dia.ZONE][. os minutos da hora.COUNT_MAX]).VALUES]).

N˜o mais de um argumento pode a ser especificado.c Uma seq¨ˆncia de n´meros pseudo-aleat´rios ´ gerada a partir de uma semente que ´ fornecida como um ue u o e e vetor de n´meros inteiros. A subrotina RANDOM_NUMBER retorna os n´meros pseudo-aleat´rios e a subrotina u u o RANDOM_SEED permite que uma inquiri¸˜o seja feita a respeito do tamanho ou valor do vetor-semente e. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 24 de abril de 2008 o m 80 7. caso nenhum argumento seja fornecido.3 N´ meros aleat´rios u o .17.GET]). SIZE tem inten¸˜o OUT e ´ um inteiro escalar padr˜o que o processador fixa com o tamanho n do vetorca e a semente. ack c w o 7.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . PUT tem inten¸˜o IN e ´ um vetor inteiro padr˜o de tamanho n que ´ usado pelo processador para fixar ca e a e uma nova semente.17. As subrotinas fornecem uma interface a uma seq¨ˆncia que depende do processador. ue CALL RANDOM_NUMBER(COLHE) Retorna um n´mero pseudo-aleat´rio a partir da distribui¸˜o uniforme de n´u o ca u meros no intervalo 0 ≤ x < 1 ou um vetor destes n´meros. a semente ´ fixada a um valor dependente do e processador.d o c u -tr . Tem os argumentos abaixo. ca a redefinir o mesmo. Um processador pode fixar o mesmo valor de semente para mais de um valor de PUT. GET tem inten¸˜o OUT e ´ um vetor inteiro padr˜o de tamanho n que o processador fixa como o valor atual ca e a da semente.PUT][. Subrotinas intr´ ınsecas n˜o-elementais a k lic lic k to bu y N O W ! w w w w . CALL RANDOM_SEED([SIZE][.d o c u -tr a c k . pode ser um escalar u ca ou vetor e deve ser do tipo real. ent˜o. COLHE tem inten¸˜o OUT.

c O W w . 8. Em Fortran h´ dois tipos de estruturas que se encaixam nesta a a categoria: subrotinas e fun¸˜es (externas ou extr´ co ınsecas). no caso do Fortran 90/95. co Um exemplo desta situa¸˜o seria a defini¸˜o de uma fun¸˜o extr´ ca ca ca ınseca. ˆ Rotinas externas. escritas. idealmente. Em Fortran 90/95. Um diagrama ilustrativo das trˆs unidades de programas existentes no Fortran 90/95 pode ser e visto na figura 8. um c´digo execut´vel ´ criado a partir de um e somente o a e um programa principal.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . em pontos distintos do programa. compiladas e testadas individualmente. ca e 8. Neste caso. a co Neste cap´ ıtulo (e nos posteriores). ˆ Rotinas externas. o a este pode invocar sub-programas.1 Programa principal Todo c´digo execut´vel deve ser composto a partir de um. pode ser necess´rio o e a que um determinado conjunto de instru¸˜es seja realizado repetidas vezes. por´m n˜o podem ser testadas e a e a isoladamente. Em Fortran 77. o Cada uma destas unidades de programas ser˜o discutidas nas se¸˜es seguintes. ou seja. as quais tˆm estrutura semelhante `s rotinas externas. Outros textos podem vir a tratar estes dois e co termos como representando entidades ligeiramente distintas.1 Unidades de programa Tanto em Fortran 77 quanto em Fortran 90/95. o ´ e Com a introdu¸˜o do Fortran 90/95. programa principal. Contudo. trˆs unidades distintas de programa: e ˆ Programa principal. Opcionalmente. os termos rotina (procedure) e sub-programa ser˜o usados alternadamente a para indicar de forma gen´rica tanto subrotinas quanto fun¸˜es. ´ poss´ escrever um programa completo em Fortran em um unico e ıvel ´ arquivo. ˆ M´dulos.1. sendo posteriormente inclu´ ıdas no programa principal para gerar um arquivo execut´vel. existem. Um programa principal possui a seguinte forma: 81 o m w w w w .d o c u -tr a c k . pode usar tamb´m e m´dulos. quaisquer uma destas trˆs unidades de programas podem tamb´m ca e e invocar rotinas internas. Uma descri¸˜o mais completa das unidades de programas ´ dada a seguir. e Cada uma das unidades de programa corresponde a um conjunto completo e consistente de tarefas que podem ser. A unica unidade de programa que deve necessariamente existir sempre ´ o programa principal. havia somente dois tipos de unidades de programas distintas: ˆ Programa principal.1. ao todo. e somente um. se o c´digo ´ suficientemente complexo. ou como uma unidade simples. n˜o contida no conjunto de a fun¸˜es intr´ co ınsecas discutidas no cap´ ıtulo ??. ´ melhor quebrar o programa em unidades distintas.c Cap´ ıtulo 8 Sub-Programas e M´dulos o Como foi visto nos cap´ ıtulos anteriores.d o c u -tr a c k ! w o . o qual pode invocar rotinas externas e.

a O comando END pode ser rotulado e ser ent˜o atingido por um desvio de execu¸˜o. atrav´s de uma instru¸˜o GO TO. as quais podem possuir tamb´m rotinas internas..1 O unico campo n˜o opcional na estrutura ca e e e ´ a de um programa. e o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 82 8. quando da execu¸˜o do c´digo. ´ a instru¸˜o END.. a a a A declara¸˜o CONTAINS indica a presen¸a de um ou mais sub-programas internos.d o Programa Principal c u -tr a c k . Unidades de programa k lic lic k to bu y N O W ! w w w w . ´ obrigat´rio. o controle passa por sobre c˜ e ca os sub-programas internos ao comando END e o programa p´ra. e e [PROGRAM <nome do programa> [<declara¸~es de vari´veis>] co a [<comandos execut´veis>] a [CONTAINS <sub-programas internos> END [PROGRAM [<nome do programa>]] A declara¸˜o PROGRAM ´ opcional. este estilo de programa¸˜o ´ t´ c˜ e ca e ıpico do Fortran 77. ca o Nos cap´ ıtulos anteriores.2. o qual ca e e pode ser rotulado. pode ser parte de um comando ou construto IF e ´ um comando que pode aparecer no e programa principal ou em um sub-programa.1: As trˆs unidades de programa. a e a O comando STOP. 1 No caso do compilador F.. Outra forma de interromper a execu¸˜o do programa ´ atrav´s do comando STOP. Se a execu¸˜o do ultimo comando anterior a CONTAINS n˜o provoca um desvio de ca ca ´ a percurso na execu¸ao do programa. a a maiores detalhes n˜o s˜o necess´rios aqui.. 100 END PROGRAM em cuja situa¸ao o programa tamb´m termina. como no exemplo a ca .c Modulo Rotina Externa Rotina de Modulo Rotina Interna Figura 8.d o c u -tr . j´ foram dados v´rios exemplos da estrutura do programa principal e. a qual possui dois prop´sitos: indicar ca a e ca o ao compilador que o programa chegou ao fim e.1. portanto. ack c w o . por exemplo. GO TO 100 . Estes ser˜o descritos em ca c a mais detalhes na se¸˜o 8. provoca a parada do mesmo. por´m o seu uso ´ recomendado.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . na defini¸˜o do padr˜o da linguagem. mas n˜o ´ recomendado pelo padr˜o do Fortran 90/95.2. Contudo.

Como j´ foi mencionado. ´ o m´dulo. blocos de interface.2) e rotinas internas. Trata-se de uma maneira e o de se agrupar dados globais.2 sub-programas sub-programas podem ser subrotinas ou fun¸˜es.3. J´ uma subrotina pode executar uma tarefa mais complexa e retornar diversos valores atrav´s de a a e seus argumentos. esta pr´tica n˜o ´ recomendada. ack c w o . a o a ca 8. A seguir. prevenindo-se assim o altera¸˜o acidental dos dados.1. ıvel a a e 8. tarefas que podem ser delimitadas co a por um n´mero finito de opera¸˜es e que devem ser realizadas repetidas vezes durante a execu¸˜o de um programa u co ca devem ser escritas como sub-programas. os sub-programas apresentam uma forma semelhante a de um programa ca principal.1 Fun¸oes e subrotinas c˜ Exceto pela declara¸˜o inicial. separados do arquivo do programa principal.2 Rotinas externas Rotinas externas s˜o chamadas de dentro de um programa principal ou de outra unidade. ´ recomendado o uso da forma completa do comando END. e Uma discuss˜o mais extensa acerca dos m´dulos em Fortran 90/95 ser´ feita na se¸˜o 8. ca Um m´dulo tem a seguinte forma: o MODULE <nome m´dulo> o <declara¸~es de vari´veis> co a [CONTAINS <rotinas de m´dulo> o END [MODULE [<nome m´dulo>]] o Assim como para END PROGRAM.c 8. Uma fun¸˜o retorna um unico valor. a c˜ Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. estas rotinas podem ser compiladas conjuntamente ca a com o programa principal ou em separado.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . e esta usualmente n˜o ca ´ a altera os valores de seus argumentos2 . que se trata de uma constante de caractere ou uma string de at´ 5 d´ e ıgitos. Nesta ultima situa¸˜o.16. o qual pode ser um escalar ou uma matriz. estes podem ser disting¨idos por um c´digo de a u o acesso. Isto originar´ uma mensagem a na sa´ padr˜o indicando o ponto onde a execu¸˜o foi terminada. exclusivo no Fortran 90/95.d o Caso haja v´rios comandos STOP em uma mesma unidade.2. uma fun¸˜o em Fortran age como uma fun¸˜o em an´lise ca ca a matem´tica. usualmente com o a intuito de executar uma tarefa bem definida dentro dos objetivos cumpridos pelo programa completo. STOP 12345 Programa interrompido. grupos NAMELIST co (se¸˜o 9. Sub-Programas e M´dulos o 83 k lic lic k to bu y N O W ! w w w w .d o c u -tr . Rotinas externas s˜o escritas em arquivos distintos. a Durante o processo de cria¸˜o do programa execut´vel. Um sub-programa pode ser uma subrotina: [PURE] [ELEMENTAL] [RECURSIVE] SUBROUTINE <nome subrotina> [(<lista argumentos mudos>)] [<declara¸~es de vari´veis>] co a [<comandos execut´veis>] a 2 Situa¸˜es co onde este requisito pode ser relaxado e como estabelecer salvaguardas s˜o discutidas na se¸ao 8. Embora co e a seja poss´ colocar-se mais de uma rotina externa no mesmo arquivo.3 M´dulos o O terceiro tipo de unidade de programa. o que permite que o funcionamento interno do m´dulo possa ser alterado sem a necessidade de alterar o programa que o usa. Tudo associado com uma determinada tarefa pode ser coletado dentro de um ca m´dulo e acessado quando necess´rio. os programas objetos criados durante com´ ca pila¸˜es pr´vias das rotinas externas s˜o linkados junto com o programa objeto do programa principal. os quais podem ser modificados ao longo da computa¸˜o da subrotina. ca 8. tipos derivados e suas opera¸˜es associadas. dois exemplos deste caso: ıda a ca STOP ’Dados incompletos.2.1.’ c u -tr a c k . Aquelas partes que s˜o restritas ao funcionamento interno da tarefa e n˜o o a a a s˜o do interesse direto do programador podem ser feitas “invis´ a ıveis” a este. Neste sentido.

d o c u -tr . mais de um valor em cada chamada. relacionados com as declara¸˜es de tipo e a e a co esp´cie de vari´veis.x2) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 c u -tr a c k . ser chamada atrav´s da instru¸˜o CALL. dada a fun¸˜o BESSELJ(n. o estas ser˜o obtidas atrav´s da chamada: a e CALL BASCARA(A0.A1. ack c w o . x1 e x2.x). ao inv´s de a e interromper a execu¸ao do programa. ´ poss´ usar-se a ca e ıvel uma fun¸˜o como argumento da subrotina: ca CALL BASCARA(A0.2. a Uma fun¸˜o ´ ativada ou chamada de forma semelhante como se usa uma fun¸˜o em an´lise matem´tica. Uma fun¸˜o ca pode tamb´m fazer o papel de um operando em uma express˜o: e a y= BESSELJ(n.3 e posteriores.x). em princ´ e ıpio.c o m 84 8.x) + 2*BESSELJ(n. concordar com o tipo e esp´cie do resultado de BESe SELJ(n. Uma subrotina. os seguintes atributos podem ser usados: e a INTENT([IN][OUT][INOUT]) OPTIONAL SAVE EXTERNAL INTRINSIC POINTER TARGET A declara¸˜o CONTAINS cumpre exatamente o mesmo papel cumprido dentro do programa principal. Por exemplo.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . n˜o pode ser a operada como uma fun¸˜o em an´lise matem´tica mas deve. Contudo.A2. a qual calcula Jn (x).X2) onde os argumentos da subrotina ser˜o discutidos na se¸˜o 8. caso isto n˜o ocorra. Al´m dos atributos j´ vistos. em geral. Esta fun¸˜o pode ser chamada para atribuir seu valor a uma vari´vel escalar ou a um ca a elemento de matriz: y= BESSELJ(n. ser˜o apresentados alguns dos atributos usualmente empregados no campo de <declara¸~es de a co vari´veis> de um sub-programa. a co Por enquanto.d o [CONTAINS <sub-programas internos>] END [SUBROUTINE [<nome subrotina>]] ou pode ser uma fun¸˜o: ca [PURE] [ELEMENTAL] [<tipo>] [RECURSIVE] FUNCTION <nome fun¸~o> & ca (<lista argumentos mudos>)[RESULT (<nome resultado>)] [<declara¸~es de vari´veis>] co a [<comandos execut´veis>] a [CONTAINS <sub-programas internos>] END [FUNCTION [<nome fun¸~o>]] ca Os diversos constituintes das formas gerais apresentadas acima ser˜o discutidos em detalhes nas se¸˜es seguintes. O efeito ca do comando END em um sub-programa consiste em retornar o controle ` unidade que o chamou.x) sendo que o tipo e esp´cie de y devem. ca a a e ca Supondo que exista a subrotina BASCARA. ca e ca a a Por exemplo.2. valem as regras de convers˜o definidas no cap´ a a ıtulo 4.X1.x**2) ou ainda servir de argumento para uma outra rotina.A1. a qual calcula as ra´ ızes de um polinˆmio de segundo grau. o valor da fun¸˜o de Bessel do primeiro tipo ca ca de ordem n no ponto x. devido ao fato de esta retornar.x). Aqui tamb´m recomenda-se o uso da forma completa do comando para c˜ e deixar claro ao compilador e ao programador qual parte do programa est´ sendo terminada. dos atributos DIMENSION e ALLOCATABLE.BESSELJ(n. sub-programas k lic lic k to bu y N O W ! w w w w .x1. isto sim.

Uma rotina interna automaticamente tem acesso a todas as entidades do hospedeiro.d o c u -tr . Os argumentos de um sub-programa s˜o muitas e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. a print * . Cabe aqui uma men¸˜o a respeito da diferen¸a entre uma rotina interna e uma rotina de m´dulo. por sua vez. em um m´dulo. c a l c a r a i z ( x ) print * . express˜es a o escalares ou matriciais e at´ mesmo os nomes de outras rotinas.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .d o c u -tr a c k .c J´ foi observado nas se¸˜es anteriores que rotinas internas podem ser definidas dentro de quaisquer unidades a co de programa. tornando-se assim uma vari´vel declarada tamb´m dentro do ˆmbito da fun¸˜o a e a ca calc_a_raiz: program r o t i n t i m p l i c i t none real : : x . tais como vari´veis. ”Entre com o v a l o r de x : ” read * . Contudo. Uma rotina interna possui a seguinte estrutura: [RECURSIVE] SUBROUTINE <nome subrotina> [(<lista argumentos mudos>)] [<declara¸~es de vari´veis>] co a [<comandos execut´veis>] a END SUBROUTINE [<nome subrotina>]] ou [<tipo>] [RECURSIVE] FUNCTION <nome fun¸~o> (<lista argumentos mudos>) & ca [RESULT (<nome resultado>)] [<declara¸~es de vari´veis>] co a [<comandos execut´veis>] a END FUNCTION [<nome fun¸~o>]] ca Nota-se agora que as declara¸˜es FUNCTION e SUBROUTINE agora s˜o obrigat´rias no comando END. Esta ca c o ultima tamb´m ´ inclu´ depois da palavra-chave CONTAINS.2 Rotinas internas .2. ack c w o 8. ”O r e s u l t a d o de a + s q r t (1+ x * * 2 ) ´ : ” e print * . mas pode conter rotinas internas ´ e e ıda o a ela. Uma deterco a o minada unidade de programa pode conter qualquer n´mero de rotinas internas. n˜o u e a podem conter outras rotinas internas. Note que a vari´vel a ´ declaca e a e rada no programa principal. constantes. intent ( in ) : : y c a l c a r a i z= a + s q r t ( y ) return end function c a l c a r a i z end program r o t i n t No restante deste cap´ ıtulo. uma determinada rotina interna e n˜o possui acesso `s entidades de outra rotina interna. 0 + x * * 2 ) CONTAINS function c a l c a r a i z ( y ) real :: calc a raiz real . Estes consistem em uma lista de vari´veis escalares ou matriciais. a ! print * . c a l c a r a i z ( 1 . a a Um exemplo simples do uso de uma fun¸˜o interna ´ apresentado a seguir. a a externos e a rotinas de m´dulos. por´m estas. x print * . ”Entre com o v a l o r de a : ” read * .3 Argumentos de sub-programas Argumentos de sub-programas fornecem um meio alternativo para que duas unidades de programa compartilhem os mesmos dados. ser˜o descritas v´rias propriedades que se aplicam a sub-programas internos.2. ”O r e s u l t a d o de a + s q r t ( x ) ´ : ” e print * . Sub-Programas e M´dulos o 85 k lic lic k to bu y N O W ! w w w w . e a possuem tamb´m a habilidade de chamar as outras rotinas deste. o 8.

PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . C. Por isto. possibilitando que estes sejam usados em diferentes programas (ver se¸˜o 8.6). Y. vari´veis mudas ca a co a somente podem ser declaradas com INTENT(IN). ack c w o . os nomes n˜o necessitam ser os e a mesmos.d o c u -tr .2. o RETURN pode ser rotulado. Sempre que poss´ ıvel. O ponto importante ´ que sub-programas podem ser escritos de forma independente uns dos a e outros. Uma e a ca terceira possibilidade seria a existˆncia de uma vari´vel cujo valor ´ inicialmente transferido para dentro da e a e subrotina. sendo este a e e ent˜o definido durante a execu¸˜o da mesma e finalmente transferido ` unidade que chamou a rotina. o meio recomendado de se retornar controle a a partir de um sub-programa consiste na utiliza¸˜o do comando RETURN. modificado por esta e. Como alternativa ao uso do atributo INTENT(INOUT). esta vari´vel deveria a a ser declarada com a inten¸˜o INTENT(INOUT).x print*. a1 e a2 foram utilizadas para transferir ` a a subrotina informa¸˜o acerca dos coeficientes do polinˆmio de 2º grau. 8. Neste caso. alteraria este valor. bibliotecas de sub-programas podem ser constru´ e ıdos. calc_a_raiz(x) print*. Z) REAL :: A. B. calc_a_raiz(a + x**2) . pode fazer parte de um construto como o IF e ´ um comando execut´vel. ca Se uma vari´vel muda ´ especificada com atributo INTENT(IN). ao contr´rio do END. Estes devem coincidir com os argumentos transferidos a a partir da unidade que chama a rotina em tipo. o seu valor ´ indefinido na chamada da rotina. Z INTENT(IN) :: A.2. a a ´ E recomendado que a inten¸˜o de todas as vari´veis mudas seja declarada. O RETURN n˜o pode aparecer entre os comandos execut´veis do programa e a a a principal. a c u -tr a c k . a e a seja atrav´s de atribui¸˜o de valor a partir de uma express˜o. Y.c 8. a qual tem a a e ca forma geral: INTENT(<inout>) [::] <lista nomes argumentos mudos> Por exemplo.. ca O programa-exemplo bascara1. o novo valor pode ser devolvido ` unidade que chamou a rotina.. Contudo. Se a vari´vel ´ especificada com INTENT(OUT).1) as vari´veis mudas a0. Por outro lado. Exemplos o e o a semelhantes a este ser˜o usados para ilustrar o uso de rotinas em outras unidades de programa. o valor pode ser alterado e. poder-se-ia realizar duas chamadas da fun¸˜o calc_a_raiz: ca . B. a subrotina devolveu ao programa os valores das ra´ ca ızes reais (caso existam) atrav´s das vari´veis mudas r1 e r2. estes nomes foram declarados ca o ter a inten¸˜o INTENT(IN).4 Comando RETURN No padr˜o da linguagem. ´ recomendado que o nome do argumento transferido ao sub-programa seja igual ao nome e da vari´vel muda. por sua vez.2. Em fun¸˜es.. C Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 86 8.d o vezes denominados vari´veis mudas (dummy variables). a ca a Se a vari´vel ´ especificada com INTENT(INOUT). ent˜o transferido para fora da subrotina. atrav´s da declara¸˜o INTENT(INOUT). o seu valor n˜o pode ser alterado pela rotina. read*. o qual pode surgir em mais de um ponto ca da rotina.5 Atributo e declara¸˜o INTENT ca No programa bascara1. (programa 8. que n˜o sejam sub-programas mudos. a Como no caso dos comandos STOP e END. um sub-programa pode ser encerrado pelo comando END. SUBROUTINE SOLVE(A. X. A associa¸˜o das vari´veis mudas com os argumentos verdadeiros ocorrem somente quando a rotina ca a ´ chamada. Com base no mesmo exemplo.. de forma ingˆnua. o c´lculo das ra´ a e a ızes de um polinˆmio de segundo grau atrav´s da F´rmula de B´scara usando uma subrotina interna. apresentado na p´gina 87.2. esp´cie e forma. X. as quais foram declaradas ter a inten¸˜o INTENT(OUT). ou atrav´s de sua transferˆncia para uma outra e ca a e e rotina que. como se pode ver no exemplo acima. esta tem o seu valor inicial transferido na chamada da a e rotina. implementa. Contudo. Desta forma. pode-se declarar a inten¸˜o de nomes de argumentos ca mudos de rotinas. a. sub-programas k lic lic k to bu y N O W ! w w w w . ent˜o. C. sendo o controle do fluxo a retornado ` unidade que chamou este sub-programa. B.

c ) . r 2 ) ! V a r i a v e i s mudas : real . intent ( in ) : : c0 . 0 ) then t e s t a d i s c= . r a i z e s r e a i s ) return d i s c= a1 * a1 − 4 * a0 * a2 r 1= 0. t r u e . intent ( in ) : : a0 . c1 . a2 l o g i c a l . x1 . a1 . not . a1 . c1 . intent ( out ) : : r1 . ”x1=” . Sub-Programas e M´dulos o 87 k lic lic k to bu y N O W ! w w w w . r1 . r a i z e s r e a i s . ” end i f end do CONTAINS subroutine b a s c a r a ( a2 . c c a l l b a s c a r a ( a . ! do print * .d o c u -tr . ”As r a i z e s ( r e a i s ) s a o : ” print * . ”onde a * x ** 2 + b * x + c . a . a0 ) i f ( .c Programa 8. program b a s c a r a 1 i m p l i c i t none logical : : controle real : : a . ack c w o . else t e s t a d i s c= . r 2 ! Variaveis l o ca is : real : : d i s c ! r a i z e s r e a i s= t e s t a d i s c ( a2 .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . x2 ! R a i z e s r e a i s . x2 ) i f ( c o n t r o l e ) then print * . a0 . ”x2=” . b . b . ” print * . c o n t r o l e .1: Exemplo de emprego de rotinas internas. f a l s e . b . ”As r a i z e s s a o complexas .5 * ( − a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a ! function t e s t a d i s c ( c2 . intent ( out ) : : r a i z e s r e a i s real . a1 . c0 ) logical : : testa disc ! V a r i a v e i s mudas : real . end i f return end function t e s t a d i s c end program b a s c a r a 1 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. c . ” read * .d o c u -tr a c k . x2 exit else print * . ”Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a . Tente novamente .5 * ( − a1 − s q r t ( d i s c ) ) / a2 r 2= 0. c2 i f ( c1 * c1 − 4 * c0 * c2 >= 0 . x1 print * . b . c r e a l : : x1 .

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

INTENT(OUT) :: X, Y, Z ...

c u -tr a c k

.c

8.2.6

Rotinas externas e bibliotecas

Em muitas situa¸˜es, uma determinada rotina ´ escrita com o intuito de ser utilizada em diversas aplica¸˜es co e co distintas. Um exemplo seria uma rotina gen´rica que calcula a integral de uma fun¸˜o qualquer entre dois pontos e ca reais. Nesta situa¸ao, ´ mais interessante manter a rotina como uma entidade distinta do programa principal, c˜ e para que esta possa ser utilizada por outras unidades de programas. Por isto, uma ou mais rotinas podem ser escritas em um arquivo em separado, constituindo uma unidade de programa pr´pria, j´ mencionada na se¸˜o 8.1.2. Esta unidade pode ent˜o ser compilada em separado, o a ca a quando ser´ ent˜o gerado o programa-objeto correspondente a esta parte do c´digo. Este programa-objeto a a o ´ ent˜o acessado pelo programa linkador para gerar o programa execut´vel, ligando a(s) rotina(s) contida(s) e a a nesta unidade com as outras unidades que fazem referˆncia `(s) mesma(s). O procedimento para realizar esta e a linkagem ´ realizado, usualmente, de duas maneiras distintas: e 1. O(s) programa-objeto(s) ´(s˜o) linkado(s) diretamente com as demais unidades de programa. Neste caso, e a o compilador e o linkador identificam a existˆncia do programa-objeto pela sua extens˜o, fornecida na e a linha de comando que demanda a cria¸˜o do c´digo execut´vel. A extens˜o de um programa-objeto ´ ca o a a e usualmente *.o em sistemas operacionais Linux/Unix ou *.obj em sistemas DOS/Windows. 2. O programa-objeto rec´m criado ´ armazenado, inicialmente, em uma biblioteca de programas-objeto e e criados anteriormente. Ent˜o, no momento de se gerar o c´digo execut´vel a partir de um programa-fonte, a o a o linkador ´ instru´ com o nome e o endere¸o da biblioteca que cont´m o(s) programa-objeto(s) da(s) e ıdo c e rotina(s) chamadas pelo programa principal e/ou por outras unidades de programas. O linkador procura nesta biblioteca pelos nomes das rotinas invocadas e incorpora o c´digo destas (e somente destas) ao o programa execut´vel. a Com base nesta filosofia, o programa bascara1, apresentado na p´gina 8.1, pode ser ent˜o desmembrado em a a trˆs arquivos distintos, dois contendo a subrotina bascara e a fun¸˜o testa_disc e um contendo o programa e ca principal bascara2, apresentados na p´gina 89. Note o uso do atributo EXTERNAL para indicar que o nome a TESTA_DISC consiste em uma fun¸˜o externa do tipo l´gico. ca o

8.2.7

Interfaces impl´ ıcitas e expl´ ıcitas

No exemplo apresentado na p´gina 89, o nome testa_disc ´ identificado como pertencente a uma fun¸˜o a e ca l´gica pelo atributo EXTERNAL: o ... LOGICAL, EXTERNAL :: TESTA_DISC ... Caso esta declara¸ao n˜o fosse realizada, o compilador iria gerar uma mensagem de erro indicando que este c˜ a nome n˜o foi declarado. a Uma outra maneira de declarar um nome como pertencente a uma fun¸˜o externa ´ usando a declara¸˜o ca e ca EXTERNAL, em vez do atributo. Esta ´ a forma utilizada no Fortran 77. Desta maneira, o mesmo resultado seria e obtido atrav´s das seguintes linhas: e ... LOGICAL :: TESTA_DISC EXTERNAL :: TESTA_DISC ... A unica diferen¸a entre o exemplo acima e o mesmo tipo de declara¸˜o em um programa Fortran 77 consiste na ´ c ca ausˆncia dos (::) no ultimo caso. e ´ Em ambas as op¸˜es anteriores, somente ´ fornecido ao compilador o nome da fun¸˜o. Nenhum controle existe co e ca sobre os argumentos da fun¸˜o testa_disc e da subrotina bascara. Por isto, seria poss´ o programa bascara2 ca ıvel chamar a subrotina bascara tentando transferir vari´veis complexas, por exemplo, quando os argumentos mudos a da subrotina esperam vari´veis reais. Esta falta de controle, n˜o somente quanto ao tipo e esp´cie das vari´veis a a e a transferidas a rotinas externas, mas tamb´m quanto ao n´mero e a ordem dos argumentos, ´ inerente ao Fortran e u e
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008

o

m

88

8.2. sub-programas

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

! Chamada p e l a s u b r o t i n a b a s c a r a para t e s t a r s e r a´ z e s s˜ o r e a i s . ı a ! function t e s t a d i s c ( c2 , c1 , c0 ) i m p l i c i t none logical : : testa disc ! V a r i ´ v e i s mudas : a real , intent ( in ) : : c0 , c1 , c2 i f ( c1 * c1 − 4 * c0 * c2 >= 0 . 0 ) then t e s t a d i s c= . t r u e . else t e s t a d i s c= . f a l s e . end i f return end function t e s t a d i s c ! C a l c u l a as r a´ z e s r e a i s , c a s o ex ist a m , de um p o l i n ˆ n i o de grau 2 . ı o ! Usa f u n ¸ ˜ o t e s t a d i s c . ca ! subroutine b a s c a r a ( a2 , a1 , a0 , r a i z e s r e a i s , r1 , r 2 ) i m p l i c i t none ! V a r i ´ v e i s mudas : a real , intent ( in ) : : a0 , a1 , a2 l o g i c a l , intent ( out ) : : r a i z e s r e a i s real , intent ( out ) : : r1 , r 2 ! Fun¸ ˜ o e x t e r n a : ca l o g i c a l , external : : t e s t a d i s c ! Vari´veis l o ca i s : a real : : d i s c ! r a i z e s r e a i s= t e s t a d i s c ( a2 , a1 , a0 ) i f ( . not . r a i z e s r e a i s ) return d i s c= a1 * a1 − 4 * a0 * a2 r 1= 0.5 * ( − a1 − s q r t ( d i s c ) ) / a2 r 2= 0.5 * ( − a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a ! C a l c u l a as r a´ z e s r e a i s de um p o l i n ˆ m i o de grau 2 . ı o program b a s c a r a 2 i m p l i c i t none logical : : controle real : : a , b , c r e a l : : x1 , x2 ! R a´z e s r e a i s . ı ! do print * , ”Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a , b , c ) , ” print * , ”onde a * x ** 2 + b * x + c . ” read * , a , b , c c a l l b a s c a r a ( a , b , c , c o n t r o l e , x1 , x2 ) i f ( c o n t r o l e ) then print * , ”As r a´ z e s ( r e a i s ) s ˜ o : ” ı a print * , ”x1=” , x1 print * , ”x2=” , x2 exit else print * , ”As r a´ z e s s ˜ o complexas . Tente novamente . ” ı a end i f end do end program b a s c a r a 2
Autor: Rudi Gaelzer – IFM/UFPel

c u -tr a c k

.c

Impresso: 23 de abril de 2008

o

m

Cap´ ıtulo 8. Sub-Programas e M´dulos o

89

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

77; nenhum mecanismo de controle existe para auxiliar o compilador e o linkador na tarefa de determinar a coerˆncia entre as diferentes unidades de programas. e Para gerar chamadas a sub-programas de forma correta, o compilador necessita conhecer certos detalhes destes sub-programas, como os seus nomes e o n´mero, tipo e esp´cie dos argumentos. Em Fortran 90/95, esta u e tarefa ´ desempenhada pelos blocos de interface. e No caso de rotinas intr´ ınsecas, sub-programas internos e m´dulos, esta informa¸˜o ´ sempre conhecida pelo o ca e compilador; por isso, diz-se que as interfaces s˜o expl´ a ıcitas. Contudo, quando o compilador chama uma rotina externa, esta informa¸˜o n˜o ´ conhecida de antem˜o e da´ a interface ´ dita impl´ ca a e a ı e ıcita. Um bloco de interface, ent˜o, fornece a informa¸˜o necess´ria ao compilador. A forma geral de um bloco de interface ´: a ca a e INTERFACE <corpo interface> END INTERFACE Nesta forma, este bloco de interface n˜o pode ser nomeado. Assim, a interface deixa de ser impl´ a ıcita e se torna expl´ ıcita. O <corpo interface> consiste das declara¸˜es FUNCTION ou SUBROUTINE, declara¸˜es dos tipos e esp´cies co co e dos argumentos dos sub-programas e do comando END FUNCTION ou END SUBROUTINE. Em outras palavras, consiste, normalmente, em uma c´pia exata do sub-programa sem seus comandos execut´veis ou rotinas internas, o a cujas interfaces sempre s˜o expl´ a ıcitas. Por exemplo, INTERFACE FUNCTION FUNC(X) REAL :: FUNC REAL, INTENT(IN) :: X END FUNCTION FUNC END INTERFACE Neste exemplo, o bloco fornece ao compilador a interface da fun¸˜o FUNC. ca Existe uma certa flexibilidade na defini¸˜o de um bloco de interfaces. Os nomes (mas n˜o os tipos e esp´cies) ca a e das vari´veis podem ser distintos dos nomes mudos definidos na rotina ou usados na chamada da mesma e outras a especifica¸˜es podem ser inclu´ co ıdas, como por exemplo para uma vari´vel local ` rotina. Contudo, rotinas internas a a e comandos DATA ou FORMAT n˜o podem ser inclu´ a ıdos. Um bloco de interfaces pode conter as interfaces de mais de um sub-programa externo e este bloco pode ser colocado na unidade de programa que chama as rotinas externas ou atrav´s do uso de m´dulos, como ser´ e o a discutido na se¸˜o 8.3. Em qualquer unidade de programa, o bloco de interfaces ´ sempre colocado ap´s as ca e o declara¸˜es de vari´veis mudas ou de vari´veis locais. co a a Em certas situa¸oes, ´ necess´rio fornecer a uma rotina externa o nome de outra rotina externa como um de c˜ e a seus argumentos. Isto pode ser realizado de duas maneiras: 1. Usando o atributo ou declara¸˜o EXTERNAL, como foi realizado na subrotina bascara, na p´gina 8.2.6. ca a 2. Com o uso de um bloco de interface. Neste caso, a interface indicar´ ao compilador que um determinado a nome consiste, na verdade, no nome de um outro sub-programa. As situa¸˜es onde isto pode ocorrer s˜o discutidas na se¸˜o 8.2.12 co a ca Como exemplo do uso de interfaces expl´ ıcitas ser´ apresentado o programa bascara3, o qual chama novaa mente as rotinas bascara e testa_disc. Este programa est´ listado nas p´ginas 91 e 92. a a

c u -tr a c k

.c

8.2.8

Argumentos com palavras-chave

Argumentos com palavras-chave (keyword arguments) s˜o um recurso j´ utilizado em comandos de Entraa a da/Sa´ (E/S) no Fortran 77: ıda READ(UNIT= 5, FMT= 101, END= 9000) X,Y,Z onde UNIT, FMT e END s˜o as palavras-chave. Elas indicam, respectivamente, o n´mero da unidade de acesso a u para leitura, o r´tulo do comando de formato e o r´tulo para onde o controle de fluxo deve ser desviado quando o o se atingir o ponto final de entrada dos dados. Em Fortran 90/95, argumentos com palavras-chave podem ser utilizados n˜o somente em comandos de E/S, a mas tamb´m em rotinas. Quando uma rotina tem diversos argumentos, palavras-chave s˜o um excelente recurso e a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008

o

m

90

8.2. sub-programas

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

c0 ) logical : : testa disc real . end i f return end function t e s t a d i s c ! C a l c u l a as r a´ z e s r e a i s . a0 .d o c u -tr a c k . not .c ! Chamada p e l a s u b r o t i n a b a s c a r a para t e s t a r s e r a´ z e s s˜ o r e a i s . c1 . Sub-Programas e M´dulos o 91 k lic lic k to bu y N O W ! w w w w . de um p o l i n ˆ n i o de grau 2 . else t e s t a d i s c= . t r u e . c0 ) i m p l i c i t none logical : : testa disc ! V a r i ´ v e i s mudas : a real . ı o ! Usa f u n ¸ ˜ o t e s t a d i s c .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . r a i z e s r e a i s .d o c u -tr . c2 end function t e s t a d i s c END INTERFACE ! r a i z e s r e a i s= t e s t a d i s c ( a2 . a2 l o g i c a l . 0 ) then t e s t a d i s c= . r 2 ! Vari´veis l o ca i s : a real : : d i s c INTERFACE function t e s t a d i s c ( c2 . r a i z e s r e a i s ) return d i s c= a1 * a1 − 4 * a0 * a2 r 1= 0. c1 . intent ( in ) : : c0 . a0 ) i f ( . intent ( in ) : : c0 . intent ( in ) : : a0 . a1 . intent ( out ) : : r a i z e s r e a i s real . c1 . r1 . ı a ! function t e s t a d i s c ( c2 . f a l s e . ca ! subroutine b a s c a r a ( a2 . a1 . c a s o ex ist a m . ack c w o . r 2 ) i m p l i c i t none ! V a r i ´ v e i s mudas : a real . c2 i f ( c1 * c1 − 4 * c0 * c2 >= 0 . intent ( out ) : : r1 . a1 .5 * ( − a1 − s q r t ( d i s c ) ) / a2 r 2= 0.5 * ( − a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. c1 .

intent ( out ) : : r a i z e s r e a i s real . intent ( out ) : : r1 . r 2 end subroutine b a s c a r a END INTERFACE ! do print * . c . 1.0) C= AREA(0. ı o program b a s c a r a 3 i m p l i c i t none logical : : controle real : : a . TOL= 1. c c a l l b a s c a r a ( a . x1 print * . FINAL= 100. ”x2=” . x1 . sub-programas k lic lic k to bu y N O W ! w w w w .0E-5. Tente novamente . TOL= 1. c ) . se uma palavra-chave ´ utilizada. r 2 ) real . todos os argumentos restantes tamb´m devem ser transferidos atrav´s de e e e palavras-chave. ”onde a * x ** 2 + b * x + c . b .d o ! C a l c u l a as r a´ z e s r e a i s de um p o l i n ˆ m i o de grau 2 . ´ necess´rio conhecer os nomes dos argumentos mudos definidos no e a campo de declara¸oes da rotina. dada a seguinte fun¸˜o interna: ca . b . ı INTERFACE subroutine b a s c a r a ( a2 . b . a2 l o g i c a l . x2 e xit else print * . a1 .d o c u -tr . ” ı a end i f end do end program b a s c a r a 3 c u -tr a c k . ” print * . c r e a l : : x1 . C e D s˜o vari´veis declaradas previamente como reais. ”x1=” ...0. a seguinte chamada n˜o ´ v´lida: u a e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 92 8. FINAL. a1 . TOL) REAL :: AREA REAL. FINAL= 100. a0 . desde que a interface seja obedecida. a . Depois que uma palavraa a chave ´ utilizada pela primeira vez. ack c w o . intent ( in ) : : a0 . ”As r a´ z e s ( r e a i s ) s ˜ o : ” ı a print * . FINAL= VALOR) onde A. A grande vantagem no uso de palavras-chave est´ em que n˜o ´ necess´rio a a a e a lembrar a ordem dos argumentos.c para evitar confus˜o entre os mesmos. b . uma vari´vel ou uma express˜o.0) VALOR= 100. r a i z e s r e a i s . ”As r a´ z e s s ˜ o complexas . Al´m disso.2. o valor atribu´ ao argumento mudo pode ser uma a ca e ıdo constante. r1 .0. FINAL. INTENT(IN) :: INICIO. c˜ Por exemplo. END FUNCTION AREA esta pode ser chamada por quaisquer uma das trˆs seguintes atribui¸˜es: e co A= AREA(0. c o n t r o l e . esta ca e n˜o necessita estar na ordem da defini¸˜o.0E-5) B= AREA(INICIO= 0. TOL . TOL= ERRO. Contudo. ”Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a . ” read * .0 ERRO= 1.0E-5..0E-5 D= AREA(0..PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .0. Todos os argumentos antes da primeira palavraa a chave devem estar ordenados na ordem definida pela fun¸˜o. x2 ) i f ( c o n t r o l e ) then print * . CONTAINS FUNCTION AREA(INICIO. Contudo. Conseq¨entemente.0. 100. B. x2 ! R a´z e s r e a i s .0.

TOL . FINAL.0E-2) AREA(0. CONTAINS FUNCTION AREA(INICIO. a interface j´ ´ expl´ o ae ıcita. END FUNCTION AREA a qual agora tem as seguintes chamadas v´lidas. depois que o primeiro argumento ´ transferido via uma palavra-chave. e um bloco de interface deve ser fornecido em algum momento. na fun¸˜o AREA acima.. a interface do sub-programa deve ser expl´ ıcita caso palavraschave sejam utilizadas. Estes argumentos opcionais podem ser declarados pelo atributo e OPTIONAL na declara¸˜o do tipo de vari´veis. se a rotina ´ externa e possui algum argumento opcional. Contudo se externa ela o fosse.. TOL= 1. A rotina necessita de algum mecanismo para detectar se um argumento opcional foi transferido na sua chamada. Este n˜o ´ o caso da fun¸˜o AREA..0E-5. obrigat´rios ou e e o opcionais. TOL= 1. nem todos os argumentos de um sub-programa necessitam ser transferidos durante co uma chamada do mesmo.d o c u -tr . No caso de rotinas externas. 100. para que esta possa tomar a medida adequada no caso de presen¸a ou de ausˆncia..3). ack c w o .0.d o C= AREA(0. uma vez que a e a a ela foi declarada com INTENT(IN). a e a ca Uma vez que o compilador n˜o ser´ capaz de realizar as associa¸˜es apropriadas exceto se este conhecer as a a co palavras-chave (nomes dos argumentos mudos). FINAL. Por exemplo. ou na ordem posicional ou na lista de palavras-chave. No caso de rotinas internas ou rotinas de m´dulo. 100. OPTIONAL :: INICIO. uma vez que a e ca ela ´ interna. a seguinte defini¸˜o pode ser feita: ca ca .8. faz-se necess´rio o uso de um bloco de interfaces.0. FINAL= 100. 1. TOL) REAL :: AREA REAL.0. REAL :: TTOL . Como no caso dos argumento com palavras-chave. a lista de palavras-chave pode aparecer em qualquer ordem.0 sem haver a informa¸˜o da palavra-chave. TOL= 1. INTENT(IN).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .2. todos os restantes.c O exemplo acima n˜o ´ v´lido porque tentou-se transferir o valor 100.. a Da mesma forma como na se¸˜o 8.0) ! N~o ´ v´lido.0) AREA(0. dever-se-ia declarar o seguinte bloco de interface: e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. J´ um argumento a opcional pode aparecer.0. Um argumento obrigat´rio (que n˜o ´ declarado opcional) deve aparecer exatamente uma vez na lista de o a e argumentos da chamada de uma rotina. pode ser necess´rio ca ca a verificar a existˆncia da vari´vel TOL para definir a tolerˆncia do c´lculo ou usar um valor padr˜o caso ela n˜o e a a a a a tenha sido transferida: . Sub-Programas e M´dulos o 93 k lic lic k to bu y N O W ! w w w w .0E-2) onde se fez uso tanto da associa¸˜o posicional para os valores dos argumentos. IF(PRESENT(TOL))THEN TTOL= TOL ELSE TTOL= 1. entre outras: a A= B= C= D= AREA(0. a e a c u -tr a c k ... ao passo que a vari´vel TOL n˜o.0E-3 END IF . a 8. no m´ximo uma vez..9 Argumentos opcionais Em algumas situa¸˜es. Este mecanismo ´ c e e fornecido pela fun¸˜o intr´ ca ınseca PRESENT (se¸˜o 7. A vari´vel TTOL ´ utilizada aqui porque ela pode ser redefinida.0. poca r´m.. devem ser transferidos da mesma forma. quanto da associa¸˜o via o uso ca ca de palavras-chave.0E-2) AREA(INICIO= 0.2. ca a Mantendo o exemplo da fun¸˜o AREA acima.. Um argumento que n˜o necessita ser transferido em todas as chamadas poss´ a ıveis de um sub-programa ´ denominado opcional.0. ou na lista posicional de argumentos ou na lista de palavras-chave.

2. REAL X(100). por´m inflex´ e ıvel. ˆ um elemento de matriz. B. Por exemplo: a ca a SUBROUTINE PROD(X. FINAL. FMT=*) A. C) WRITE(UNIT=*. C resultando no vetor Z do mesmo tamanho. Z(100) DO 10. Se um argumento mudo de uma rotina ´ uma matriz.B CALL PROD(A. A primeira forma transfere a matriz inteira.c 8.1 Matrizes como argumentos em Fortran 77 O Fortran 77 j´ possu´ diversos recursos para realizar a transferˆncia de matrizes entre sub-programas. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 94 8. com 100 elementos cada. OPTIONAL :: INICIO. a segunda forma. entretanto. TOL END FUNCTION AREA END INTERFACE c u -tr a c k . INTENT(IN).2. A aloca¸˜o dinˆmica.2. Se as matrizes usadas como argumentos reais ser˜o todas do mesmo a tamanho. a qual transfere somente uma se¸˜o que inicia no ca elemento especificado.100 Z(I)= X(I)*Y(I) 15 CONTINUE END Esta subrotina pode ser chamada por um programa semelhante a este: PROGRAM CHAMA_PROD REAL A(100). a ıa e Estes recursos foram posteriormente estendidos com a defini¸˜o do novo padr˜o com o Fortran 90/95. ´ parcial. A rotina ´ interna ` unidade de programa na qual o tipo derivado ´ definido. ´ descrita em mais detalhes a seguir. ack c w o . e a e 2.11. ent˜o as matrizes mudas na rotina podem usar limites fixos (aloca¸˜o est´tica). e 8. a o Fortran 77 introduziu dois mecanismos que possibilitaram uma aloca¸˜o dinˆmica no tamanho de matrizes ca a usadas como argumentos mudos de sub-programas. FINAL. porque n˜o permite o uso de matrizes de qualquer outro tamanho.d o c u -tr . Estes mecanismos s˜o as matrizes ajust´veis e as matrizes a a de tamanho assumido. Isto pode ser obtido de duas maneiras: 1. Para possibilitar uma flexibilidade maior. I= 1. B(100).2. sub-programas k lic lic k to bu y N O W ! w w w w .10 Tipos derivados como argumentos de rotinas Argumentos de rotinas podem ser do tipo derivado se este est´ definido em somente uma unica unidade de a ´ programa. Y. e o e 8. C(100) READ(UNIT=*. porque as matrizes reais transferidas aos ca a e sub-programas deveriam ter seu tamanho definido por aloca¸˜o est´tica em algum ponto dentro das unidades ca a de programas que chamavam as rotinas. FMT=*)C END Este uso de matrizes como argumentos mudos de sub-programas ´ perfeitamente leg´ e ıtimo. O tipo derivado ´ definido em um m´dulo o qual ´ acessado pela rotina. ca a O uso mais simples e comum de argumentos mudos matriciais consiste em tornar dispon´ ıvel o conte´do u completo de uma matriz em uma rotina. Y(100). TOL) REAL :: AREA REAL.11 Matrizes como argumentos de rotinas Um outro recurso importante em Fortran ´ a capacidade de usar matrizes como argumentos mudos de e sub-programas. Z) C Calcula o produto dos vetores X e Y.d o INTERFACE FUNCTION AREA(INICIO.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ent˜o o argumento real pode ser: e a ˆ o nome da matriz (sem subscritos).

declarada como tendo tamanho desconhecido. os limites das dimens˜es das matrizes mudas pode ser express˜es inteiras envolvendo o o n˜o somente constantes mas tamb´m vari´veis inteiras transferidas ` rotina ou na lista de argumentos ou atrav´s a e a a e de um bloco COMMON. END Esta subrotina pode ser invocada pela seguinte linha no programa principal ou em outra unidade de programa: CALL PROD(100. ANGULO) REAL TABELA(*) N= MAX(1. efetivamente. porque o e compilador n˜o tem nenhuma informa¸˜o a respeito do limite superior da matriz. ca e Isto ´ tudo que a fun¸˜o necessita saber para acessar os elementos apropriados N e N + 1. NINT(SIN(ANGULO)*500. Neste caso. todas as outras dimens˜es devem ter seus limites definidos pelas regras usuais ou serem o definidos na forma de matrizes ajust´veis. C) as matrizes A. A. mas neste caso e a a matriz ´. K2. e Estas matrizes tamb´m somente s˜o permitidas como argumentos mudos de sub-programas. as express˜es inteiras que definem os limites em cada dimens˜o das matrizes o a mudas s˜o inclu´ a ıdas nas declara¸˜es destas dentro da rotina. a O recurso das matrizes ajust´veis pode ser estendido de forma trivial para cobrir o caso de matrizes multia dimensionais. I= 1. Y. K1.. usando vari´veis inteiras que s˜o transferidas junto co a a com as matrizes nos argumentos da rotina ou atrav´s do uso de um bloco COMMON (ver se¸˜o 8. Por exemplo: e REAL FUNCTION SOMADOIS(TABELA. L1.3. TRACO) DOUBLE PRECISION MAP(K1:L1.d o c u -tr . a ca Uma matriz de tamanho assumido somente pode ter o limite superior de sua ultima dimens˜o especificado ´ a por um asterisco. o Matrizes de tamanho assumido Podem haver circunstˆncias onde seja impratic´vel o uso tanto de matrizes fixas quanto de matrizes ajust´veis a a a como argumentos mudos de um sub-programa. L2. SUBROUTINE MULTI(MAP. se necess´rio. NPTS . O mecanismo de matrizes ajust´veis pode ser usado para matrizes de qualquer tipo. Uma matriz ajust´vel a a tamb´m pode ser transferida a uma outra rotina como um argumento real com. e ca ca ´ responsabilidade do programador assegurar que o valor do ANGULO nunca ir´ resultar em um subscrito fora e a do intervalo correto.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .c Consiste na generaliza¸˜o dos argumentos matriciais de uma rotina para permitir o uso de matrizes de ca qualquer tamanho. Y(NPTS). com limites inferior e superior distintos. ack c w o . O exemplo e ca a seguir mostra como isto ´ realizado: e SUBROUTINE PROD(NPTS. conforme j´ foi mencionado. Ao executar a fun¸˜o. A circunstˆncia mais freq¨ente ocorre quando o tamanho real da a u matriz ´ desconhecido quando a rotina ´ inicialmente chamada. a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. uma matriz de tamanho assumido e e ´ a alternativa existente em Fortran 77. B e C devem ter o seu tamanho alocado de forma est´tica nesta ou em alguma outra unidade de a programa anterior. a fun¸˜o somente sabe que a matriz TABELA ´ unidimensional. B.1).0)) SOMADOIS= TABELA(N) + TABELA(N+1) END Neste caso. Z(NPTS) DO 15. Por exemplo. K2:L2) REAL TRACO(L1-K1+1) Como o exemplo mostra.. com um limite inferior igual a um. Este ´ sempre um problema quando se usa matrizes de tamanho assumido. Z) REAL X(NPTS). X.d o Matrizes ajust´veis a c u -tr a c k . Sub-Programas e M´dulos o 95 k lic lic k to bu y N O W ! w w w w . os limites das e a dimens˜es sendo passados de forma concomitante. Neste caso.

no m´ ınimo.NFATIA)) . Por exemplo: PROGRAM CONFUS REAL X(-1:50). Contudo. cada dimens˜o tem a sintaxe: e ca a [<lim inferior>]: isto ´.d o Se¸˜es de matrizes co As regras do Fortran requerem que as extens˜es de uma matriz.15)ser escrita na sa´ padr˜o. FMT=*)X. porque esta ´ a ordem dos elementos de matrizes em Fortran (ver e se¸˜o 6.2. Se <lim inferior> ´ omitido..9.2). ca a No Fortran 90/95. os quais n˜o s˜o argumentos da rotina.2 Matrizes como argumentos em Fortran 90/95 c u -tr a c k . mas o seu uso ´ desaconselhado no Fortran 90/95). como j´ foi visto na se¸˜o 6. Isto ocorre ca ıda a atrav´s da varia¸ao dos ´ e c˜ ındices das linhas.FMT=*)MATRIZ END O resultado deste programa ser´ escrever na sa´ padr˜o inicialmente os elementos X(-1) a X(48). ca O uso de um elemento de matriz como argumento real. iguais `s respectivas extens˜es da matriz muda declarada na rotina.d o c u -tr .11. uma vez a ıda a que este ultimo coresponde ` posi¸˜o na mem´ria de MATRIZ(50). a aloca¸˜o do tamanho das matrizes pode ser realizada de a ca ca maneira inteiramente dinˆmica. usada como argumento real de uma rotina. Entretanto. as quais generalizam as a matrizes de tamanho assumido do Fortran 77 e os objetos autom´ticos. Deve-se notar que ´ a forma da matriz que ´ transferida. a se¸˜o da matriz dos elementos D(1. o programa escreve Y(10) a ´ a ca o Y(59). Esta subrotina ir´ funcionar de forma semelhante na se¸˜o de uma matriz bi-dimensional: a ca PROGRAM DOIS_D REAL D(100. agora uma matriz muda pode assumir a forma (n˜o somente o a tamanho) da matriz real usada no argumento da rotina. as formas dos argumentos reais a e mudos ainda devem concordar. o valor e e padr˜o ´ 1. a c o Para fazer uso deste novo recurso. portanto. o Matrizes de forma assumida Novamente como no caso de matrizes ajust´veis ou de tamanho assumido. Neste exemplo. os recursos para uso de matrizes como argumentos mudos ca a de sub-programas foi ampliado em rela¸˜o aos mecanismos j´ existentes no Fortran 77. Por exemplo: a e e e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 96 8. Em seguida. Y(10:1000) READ(UNIT=*. no caso mais geral. NFATIA= 15 CALL SAIDA(D(1. deve ser evitada.2. a matriz real a o pode ter extens˜es maiores e as regras permitem tamb´m uma discordˆncia entre os limites inferior e superior o e a das matrizes real e muda.. sendo o espa¸o na mem´ria da CPU alocado em tempo real de processamento.c Com a defini¸˜o do novo padr˜o Fortran 90/95.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .6.. Y CALL SAIDA(X) CALL SAIDA(Y) END C SUBROUTINE SAIDA(MATRIZ) REAL MATRIZ(50) WRITE(UNIT=*.20) . Quando a forma ´ declarada com a especifica¸˜o DIMENSION. Tal matriz muda ´ denominada matriz de forma e assumida. n˜o os seus limites.15) a D(50. a a a mas tem suas extens˜es definidas pelas matrizes mudas desta. a 8. ack c w o . o sejam.. ´ uma express˜o e a e a inteira que pode depender dos outros argumentos da rotina ou de vari´veis globais definidas em m´dulos (ou a o em blocos COMMON. sub-programas k lic lic k to bu y N O W ! w w w w . o Fortran 90/95 definiu dois novos mecanismos para a defini¸˜o de matrizes ca mudas vari´veis como argumentos de sub-programas: as matrizes de forma assumida. pode-se definir o limite inferior da dimens˜o onde <lim inferior>. quando o argumento mudo da rotina ´ uma matriz e completa consiste uma pr´tica que facilmente incorre em erro e.

A matriz real pode ter sido declarada.. programa 8. Sub-Programas e M´dulos o 97 k lic lic k to bu y N O W ! w w w w . INTENT(INOUT) :: DA Neste caso. Um exemplo simples ´ a matriz TEMP na subrotina abaixo. B REAL. . A(10.d o c u -tr . DIMENSION(0:10..0:).21). ack c w o . ca TEMP= A A= B B= TEMP RETURN END SUBROUTINE TROCA Matrizes como a TEMP. . relacionado com vari´veis de caracteres.:). intent ( out ) ! max a= maxval ( r a ) r c= 0 . e Para se definir matrizes de forma assumida.J) .. A correspondˆncia entre os elementos da e matriz real A e a matriz muda DA ´: A(0. DIMENSION(SIZE(A)) :: TEMP !A fun¸~o SIZE fornece o tamanho de TEMP. .d o PROGRAM TESTA_MATRIZ IMPLICIT NONE REAL. seguida do programa que a a chama. max a ) i m p l i c i t none real . A(I.J)↔DA(I+1. ´ necess´rio que a interface seja expl´ e a ıcita na unidade que chama a rotina.1) .J+1) . rb : : rc : : max a Objetos autom´ticos a Uma rotina com argumentos mudos que s˜o matrizes cujos tamanhos variam de uma chamada a outra pode a tamb´m precisar de matrizes locais (n˜o mudas) cujos tamanhos variem ao sabor dos tamanhos das matrizes e a mudas. destinada a trocar os elementos entre duas e matrizes: SUBROUTINE TROCA(A. CONTAINS SUBROUTINE SUB_MATRIZ(DA) REAL. 5 * rb return end subroutine sub : : ra . rb . Como exemplo. : ) . 0:20) :: A . . DIMENSION(:). END SUBROUTINE SUB_MATRIZ END PROGRAM TESTA_MATRIZ c u -tr a c k . intent ( out ) real .2. INTENT(INOUT) :: DA . na unidade que chama a rotina ou em outra unidade anterior. A(I. DIMENSION(:.20)↔DA(11. A(10. .. CALL SUB_MATRIZ(A) . Estes s˜o objetos de dados cujas declara¸˜es dependem do valor a a a co de express˜es n˜o-constantes e que n˜o s˜o argumentos mudos de rotinas. intent ( in ) real . rc . a correspondˆncia seria a desejada: A(0.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .20).. .0)↔DA(1. : ) . considere a seguinte rotina externa. DIMENSION(0:. dimension ( : . cujas extens˜es variam da maneira apresentada s˜o chamadas matrizes autom´ticas e o a a s˜o exemplos de objetos autom´ticos de dados.B) IMPLICIT NONE REAL. e Para que houvesse a mesma correspondˆncia entre os elemento de A e DA. . surge atrav´s do comprimento vari´vel a a e a de um caractere: Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8.20)↔DA(10.J)↔DA(I. dimension ( : . seria necess´rio declarar esta ultima e a ´ como: REAL. como uma matriz aloc´vel. .c A subrotina SUB_MATRIZ declara a matriz de forma assumida DA.0)↔DA(0.0) . listado na p´gina 98: a subroutine sub ( ra . INTENT(INOUT) :: A. o a a a Um outro objeto autom´tico..

”A m a t r i z a : ” do i= 0 . sub-programas k lic lic k to bu y N O W ! w w w w . : ) end do end program p r o g s u b SUBROUTINE EXEMPLO(PALAVRA1) IMPLICIT NONE CHARACTER(LEN= *) :: PALAVRA1 CHARACTER(LEN= LEN(PALAVRA1)) :: PALAVRA2 .2. intent ( out ) : : max a end subroutine sub END INTERFACE ! a= r e s h a p e ( s o u r c e =(/( c o s ( r e a l ( i ) ) . a interface deve ca a ser expl´ ıcita. como no programa-exemplo loren abaixo. ack c w o .d o c u -tr . 5 ) :: c real : : valor max integer : : i INTERFACE subroutine sub ( ra .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . : ) .d o c u -tr a c k . program p r o g s u b i m p l i c i t none real . ”” print * . Se este objeto consiste em uma fun¸˜o de caractere de tamanho vari´vel. 9 print * . ”A m a t r i z c : ” do i= 1 . A defini¸˜o dos limites das dimens˜es de um objeto autom´tico pode ser realizada tamb´m de argumentos ca o a e mudos ou de vari´veis definidas por associa¸˜o por uso ou por associa¸˜o ao hospedeiro.. ”” print * . : ) . dimension ( 5 . rb . rc . : 5 ) . dimension ( : . valor max ) print * .2: Exemplifica o uso de matrizes de forma assumida. rb real . intent ( out ) : : r c real . Associa¸˜o por uso a ca ca ca program l o r e n i m p l i c i t none character ( len= * ) . dimension ( : . i= 1 . 1 0 / ) ) c a l l sub ( a . c . 1 0 0 ) / ) . 5 print * . intent ( in ) : : a character ( len= 2 * len ( a )+2) : : dobro dobro= a // ” ” // a return end function dobro end program l o r e n Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 98 8. ” o print * .. c ( i . shape= ( / 1 0 . ”O maior v a l o r em a : ” . max a ) real . como um exemplo.c Programa 8. a ( 0 : 4 . : ) end do print * . intent ( in ) : : ra . dimension ( 0 : 9 . parameter : : a= ”S´ um pequeno exemplo . dobro ( a ) CONTAINS function dobro ( a ) character ( len= * ) . 1 0 ) : : a real . a ( i . valor max print * .

”Matriz a : ” do i= 1 . s i z e ( a . n print * . r e s ) real . m. dimension ( : . 2 ) ) : : temp ! M a t r i z a u t o m ´ t i c a a ! temp= s i n ( a ) r e s= minval ( a+temp ) return end subroutine sub mat program m a t r i z a u t i m p l i c i t none real . n . : ) end do c a l l sub mat ( a . r e s ) i m p l i c i t none real . a fun¸˜o MINIMO calcula o ca m´ ınimo (menor valor) da fun¸˜o FUNC em um intervalo: ca FUNCTION MINIMO(A. Sub-Programas e M´dulos o 99 k lic lic k to bu y N O W ! w w w w . a ( i . dimension ( : . a l l o c a t a b l e : : a real : : res integer : : n .2.m) ) a= r e s h a p e ( s o u r c e =(/( tan ( r e a l ( i ) ) . Assim. i INTERFACE subroutine sub mat ( a . B. r e s e end program m a t r i z a u t c u -tr a c k .12 sub-programas como argumentos de rotinas At´ este ponto.m/ ) ) print * . intent ( in ) : : a ! M a t r i z de forma assumida real . a matriz n˜o pode ser inicializada na sua declara¸˜o. : ) . ca ca ca Al´m disso. de forma assumida e autom´ticas: a a subroutine sub mat ( a . a a o ca a Caso n˜o haja mem´ria suficiente. i= 1 .2. FUNC) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. dimension ( s i z e ( a . r e s ) print * .c 8. ”Entre com dim e ns ˜ e s da m a t r i z : ” o read * .m a l l o c a t e ( a ( n . a a Matrizes autom´ticas s˜o automaticamente criadas (alocadas) na entrada da rotina e automaticamente a a dealocadas na sa´ ıda. intent ( out ) : : r e s real . Desta forma. ” ” print * . ack c w o . : ) .d o ocorre quando vari´veis globais p´blicas declaradas no corpo de um m´dulo s˜o disponibilizadas ` rotina atrav´s a u o a a e da instru¸˜o USE. shape= ( / n . n *m) / ) . 2 ) ) : : temp end subroutine sub mat END INTERFACE print * . Um exemplo e a de situa¸ao onde ´ necess´rio mencionar o nome de uma rotina como argumento de outra ´ quando a segunda c˜ e a e executa a integra¸˜o num´rica da primeira.15) ou NAMELIST. 1 ) . os argumentos de uma rotina forma supostos ser vari´veis ou express˜es. 1 ) . s i z e ( a . o programa ´ interrompido. dimension ( : . e a ca O seguinte programa-exemplo usa matrizes aloc´veis.d o c u -tr . enquanto que associa¸˜o ao hospedeiro ocorre quando vari´veis declaradas em uma unidade ca ca a de programa s˜o disponibilizadas `s suas rotinas internas. a Note que n˜o h´ mecanismo para verificar a disponibilidade de mem´ria para a cria¸˜o de matrizes autom´ticas. Contudo. ca e e ıvel e e que integra qualquer fun¸˜o que satisfa¸a a interface imposta a ela. ca c Um exemplo de uso do nome de uma rotina como argumento ocorre abaixo.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . o tamanho das matrizes autom´ticas pode variar em diferentes chamadas da rotina. ”O menor v a l o r de a + s i n ( a ) ´ : ” . : ) . uma e a o outra possibilidade ´ um ou mais argumentos sendo nomes de outras rotinas que ser˜o invocadas. dimension ( s i z e ( a . ou possuir o atributo SAVE na sua declara¸˜o. ´ poss´ escrever-se um integrador num´rico gen´rico. intent ( in ) : : a real . uma matriz autom´tica n˜o pode a o e e a a aparecer em uma declara¸˜o SAVE (se¸˜o 8. Al´m disso. intent ( out ) : : r e s real .

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

! Calcula o m´nimo de FUNC no intervalo [A,B]. ı REAL :: MINIMO REAL, INTENT(IN) :: A, B INTERFACE FUNCTION FUNC(X) REAL :: FUNC REAL, INTENT(IN) :: X END FUNCTION FUNC END INTERFACE REAL :: F,X ... F= FUNC(X) !Invoca¸~o da fun¸~o. ca ca ... END FUNCTION MINIMO Note o uso de um bloco de interface para indicar ao compilador que o nome FUNC corresponde a uma fun¸˜o ca definida pelo usu´rio. a Em Fortran 77, como n˜o havia o recurso de blocos de interface, a indica¸˜o que o nome FUNC corresponde a a ca uma fun¸˜o externa ´ realizada atrav´s da declara¸˜o EXTERNAL. Assim, no exemplo acima, no lugar da interface ca e e ca apareceria: ... REAL FUNC EXTERNAL FUNC ... para indicar a fun¸˜o externa. A mesma alternativa continua v´lida em Fortran 90/95, onde, al´m da declara¸˜o, ca a e ca pode-se usar tamb´m a palavra-chave EXTERNAL como atributo de um nome. Contudo, como j´ foi mencionado e a na se¸˜o 8.2.7, o simples uso da declara¸˜o ou atributo EXTERNAL n˜o possibilita o controle nos argumentos ca ca a desta fun¸˜o, ao contr´rio do que ocorre quando a interface ´ expl´ ca a e ıcita. Um exemplo de programa que chama a fun¸˜o MINIMO seria o seguinte: ca PROGRAM MIN IMPLICIT NONE REAL :: MENOR INTERFACE FUNCTION FUN(X) REAL :: FUN REAL, INTENT(IN) :: X END FUNCTION FUN END INTERFACE ... MENOR= MINIMO(1.0, 2.0, FUN) ... END PROGRAM MIN O uso de um bloco de interface n˜o ´ necess´rio se a interface de FUN for expl´ a e a ıcita, como no caso de uma rotina de m´dulo. o No exemplo acima, a fun¸˜o FUN n˜o pode ser interna, porque estas n˜o s˜o admitidas quando os seus nomes ca a a a s˜o usados como argumentos de outras rotinas. Ou seja, somente rotinas externas ou de m´dulos s˜o aceitas a o a quando os seus nomes s˜o transferidos a outras rotinas como argumentos. a O programa-exemplo das p´ginas 101 e 102 descreve uma subrotina que gera uma matriz de pontos a partir a de uma fun¸˜o fornecida pelo programador. ca

c u -tr a c k

.c

8.2.13

Fun¸˜es de valor matricial co

Fun¸˜es, al´m de fornecer os resultados usuais na forma de valores dos tipos intr´ co e ınsecos inteiro, real, complexo, l´gico e de caractere, podem tamb´m fornecer como resultado valores de tipo derivado, matrizes e ponteio e co ros. No caso de fun¸˜es de valor matricial, o tamanho do resultado pode ser determinado de forma semelhante a ` maneira como matrizes autom´ticas s˜o declaradas. a a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008

o

m

100

8.2. sub-programas

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

! Usa s u b r o t i n a p l o t a e chama a f u n ¸ ˜ o e x t e r n a Meu F . ca ! program t e s p l o t a i m p l i c i t none integer : : pts , j real : : yi , y f real , dimension ( : , : ) , a l l o c a t a b l e : : xy INTERFACE subroutine p l o t a ( f , xi , xf , npt , p l o t ) integer , intent ( in ) : : npt real , intent ( in ) : : xi , x f real , dimension ( 2 , npt ) , intent ( out ) : : p l o t INTERFACE function f ( x ) real : : f real , intent ( in ) : : x end function f END INTERFACE end subroutine p l o t a ! function Meu F ( y ) r e a l : : Meu F real , intent ( in ) : : y end function Meu F END INTERFACE ! print * , ”Entre com o n´ mero de p o n t o s : ” u read * , p t s print * , ”Entre com o s l i m i t e s i n f e r i o r e s u p e r i o r : ” read * , yi , y f a l l o c a t e ( xy ( 2 , p t s ) ) ! c a l l p l o t a ( Meu F , yi , yf , pts , xy ) ! do j= 1 , p t s print * , xy ( : , j ) end do end program t e s p l o t a ! Fun¸ ˜ o sen ( exp ( x ) ) . ca function Meu F ( x ) r e a l : : Meu F real , intent ( in ) : : x ! Meu F= s i n ( exp ( x ) ) return end function Meu F

Autor: Rudi Gaelzer – IFM/UFPel

Impresso: 23 de abril de 2008

o

m

Cap´ ıtulo 8. Sub-Programas e M´dulos o

101
w
w

k

lic

lic

k

to

bu

y

N

O W

!

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

! Gera uma m a t r i z de p o n t o s de uma f u n ¸ ˜ o q u a l q u e r d e s t i n a d a ` p l o t a g e m ca a ! do g r ´ f i c o d e s t a f u n ¸ ˜ o . a ca ! Parˆ metros : a ! f : Fun¸ ˜ o e x t e r n a a s e r p l o t a d a . ca ! x i : Ponto i n i c i a l ( e n t r a d a ) . ! x f : Ponto f i n a l ( e n t r a d a ) . ! npt : N´mero de p o n t o s a s e r g e r a d o s ( e n t r a d a ) u ! p l o t : m a t r i z de forma (/ npt , 2 /) contendo as a b c i s s a s e ordenadas dos ! p o n t o s ( s a´d a ) . ı ! subroutine p l o t a ( f , xi , xf , npt , p l o t ) i m p l i c i t none integer , intent ( in ) : : npt real , intent ( in ) : : xi , x f real , dimension ( 2 , npt ) , intent ( out ) : : p l o t INTERFACE function f ( x ) real : : f real , intent ( in ) : : x end function f END INTERFACE ! Vari´veis l o ca i s : a integer : : i real : : passo , x ! p a s s o= ( x f − x i ) / r e a l ( npt − 1 ) x= x i do i= 1 , npt p l o t ( 1 , i )= x p l o t ( 2 , i )= f ( x ) x= x + p a s s o end do return end subroutine p l o t a

c u -tr a c k

.c

Considere o seguinte exemplo de uma fun¸˜o de valor matricial: ca PROGRAM TES_VAL_MAT IMPLICIT NONE INTEGER, PARAMETER :: M= 6 INTEGER, DIMENSION(M,M) :: IM1, IM2 ... IM2= FUN_VAL_MAT(IM1,1) !Chama fun¸~o matricial. ca ... CONTAINS FUNCTION FUN_VAL_MAT(IMA, SCAL) INTEGER, DIMENSION(:,:), INTENT(IN) :: IMA INTEGER, INTENT(IN) :: SCAL INTEGER, DIMENSION(SIZE(IMA,1),SIZE(IMA,2)) :: FUN_VAL_MAT FUN_VAL_MAT= IMA*SCAL END FUNCTION FUN_VAL_MAT END PROGRAM TES_VAL_MAT Neste exemplo, o limites das dimens˜es de FUN_VAL_MAT s˜o herdadas do argumento verdadeiro transferido ` o a a fun¸˜o e usadas para determinar o tamanho da matriz resultante. ca Para que o compilador conhe¸a a forma da matriz resultante, a interface de uma fun¸˜o de valor matricial c ca deve ser expl´ ıcita em todas as unidades onde esta fun¸˜o ´ invocada. ca e
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008

o

m

102

8.2. sub-programas

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

o qual ´ o nome de uma rotina a e externa. o uso incorreto da mesma pode provocar uma perda na eficiˆncia da computa¸˜o do e ca c´digo.edu/~ajm138/fortranexamples. SUB1) END PROGRAM MAIN ------------------------------------------SUBROUTINE SUB1(X.psu. recursividade direta n˜o ´ permitida. o texto de Clive Page [4. invoca¸˜o direta ou indireta) co e ca exibe recursividade. Qualquer tentativa de for¸ar uma rotina a chamar a a e c si pr´pria resultar´ em erro de compila¸˜o. vai estar na verdade invocando a si pr´pria. Sub-Programas e M´dulos o 103 w w k lic lic k to bu y N O W ! w w . sejam as rotinas A e B. X EXTERNAL SUB1 COMMON /GLOBALS/ N X= 0 PRINT*. X = 5 o que demonstra que ´ poss´ simular-se recursividade mesmo em Fortran 77. Recursividade indireta: A invoca B. Por exemplo. e ıvel Fortran 90/95 Em Fortran 90/95. N)THEN X= X + 1 PRINT*. se o valor de N for definido igual a 5. 3 Ver.c Recursividade ocorre quando rotinas chamam a si mesma.2. SUBMUDO) INTEGER N.*) N CALL SUB1(X. recursividade ´ suportada como um recurso expl´ e ıcito da linguagem. Contudo. Embora recursividade seja uma t´cnica bonita e sucinta para implementar uma grande e variedade de problemas. X EXTERNAL SUBMUDO COMMON /GLOBALS/ N IF(X . o Fortran 77 Em Fortran 77. SUBMUDO) END IF RETURN END SUBROUTINE SUB1 Como a subrotina SUB1 n˜o sabe que ao invocar o argumento mudo SUBMUDO. ack c w o 8. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. Em grande parte dos textos. Recursividade pode ocorrer de duas formas: Recursividade direta: A invoca A diretamente.LT. Qualquer cadeia de invoca¸˜es de rotinas com um componente circular (isto ´. Por exemplo. 4 Referˆncia: e por exemplo. ca Fortran Examples http://www. a qual invoca A.14 Recursividade e rotinas recursivas .d o c u -tr . o compilador n˜o ir´ gerar mensagem de erro e o c´digo o a a o ir´ funcionar em grande parte das plataformas. X CALL SUBMUDO(X. o resultado a ser´ a X = 1 X = 2 . se¸˜o 4. recursividade pode ser simulada em Fortran 77 quando uma rotina chama a e a e ıvel si pr´pria usando n˜o o seu nome real mas atrav´s de um argumento mudo. consultada em 07/06/2005. por outro lado...3]. ’X=’.esm.d o c u -tr a c k . afirma-se que recursividade indireta o a ca tamb´m n˜o ´ poss´ 3 . como no exemplo abaixo:4 o a e PROGRAM MAIN INTEGER N.html. seja de forma direta ou indireta.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ’Entre n´mero de repeti¸~es:’ u co READ(*.

Este conjunto consiste de todos os objetos definidos no campo de declara¸˜es e ıda co da rotina ou declarados implicitamente. INTENT(INOUT) :: N_FAT IF(N == 0)THEN N_FAT= 1 ELSE CALL FAT(N . em algumas situa¸˜es. N ! = N (N − 1)! c u -tr a c k . INTENT(IN) :: N IF(N == 0)THEN N_FAT= 1 ELSE N_FAT= N*FAT(N-1) END IF RETURN END FUNCTION FAT ---------------------------------------------RECURSIVE SUBROUTINE FAT(N. o c´lculo do fatorial ´ implementado tanto na forma de uma fun¸˜o quanto na forma de uma subrotina a e ca recursivas: RECURSIVE FUNCTION FAT(N) RESULT (N_FAT) IMPLICIT NONE INTEGER :: N_FAT !Define tamb´m o tipo de FAT. exceto aqueles com atributos DATA ou SAVE (ver se¸˜o 8. uma e e rotina chama outra a qual.d o Recursividade direta.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a qual especifica ca e o nome de uma vari´vel ` qual o valor do resultado do desenvolvimento da fun¸˜o deve ser atribu´ a a ca ıdo. Um exemplo de fun¸˜o que implementaria integra¸˜o unidimensional ´ dado a seguir. e INTEGER. ou RECURSIVE FUNCTION . Para fins de eficiˆncia na execu¸˜o do c´digo.d o c u -tr .3: o e a ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 104 8. por sua vez. sub-programas k lic lic k to bu y N O W ! w w w w ..15).. INTENT(IN) :: N INTEGER.. um conjunto novo de objetos de dados locais ´ criado. sup˜e-se que o se queira realizar uma integra¸˜o num´rica bi-dimensional quando se disp˜e somente de um c´digo que executa ca e o o integra¸˜o unidimensional. Uma rotina tamb´m pode ser invocada por recursividade indireta.2. A implementa¸˜o ´ realizada a partir das seguintes propriedades do fatorial: ca e 0! = 1. o qual e e ´ eliminado na sa´ da rotina. a chamada de uma fun¸˜o recursiva deste a co ca tipo ´ indisting¨´ de uma referˆncia a matrizes. o qual ´ uma unidade de programa que ser´ discutido na se¸˜o 8. A declara¸˜o de uma fun¸˜o recursiva ´ realizada com uma sintaxe um pouco distinta da at´ ent˜o abordada: ca ca e e a uma fun¸˜o explicitamente declarada recursiva deve conter tamb´m a palavra-chave RESULT. pois isso implicaria em perda de eficiˆncia no c´digo.2.. isto ´. ca ca ca e O exemplo usa um m´dulo. em lugar do nome da fun¸ao propriamente dito. Para ilustrar a utilidade deste recurso. rotinas recursivas devem ser explicitae ca o mente declaradas usando-se a palavra-chave RECURSIVE SUBROUTINE .c A seguir. e uıvel e O exemplo tradicional do uso de rotinas recursivas consiste na implementa¸˜o do c´lculo do fatorial de um ca a inteiro positivo. invoca a primeira. o nome da palavra-chave deve ser e o usado tanto na declara¸˜o do tipo e esp´cie do resultado da fun¸˜o quanto para atribui¸˜o de resultados e em ca e ca ca express˜es escalares ou matriciais. N_FAT) IMPLICIT NONE INTEGER. De fato. Fun¸˜es ca co de valor matricial recursivas s˜o permitidas e. c˜ A palavra-chave RESULT ´ necess´ria. N_FAT) N_FAT= N*N_FAT END IF RETURN END SUBROUTINE FAT Recursividade indireta. o e co a Cada vez que uma rotina recursiva ´ invocada. uma vez que n˜o ´ poss´ usar-se o nome da fun¸˜o para retornar e a a e ıvel ca o resultado. Esta palavra-chave pode tamb´m ser usada para fun¸˜es n˜o recursivas. ack c w o .1.

PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .15 Atributo e declara¸˜o SAVE ca A declara¸˜o ou o atributo SAVE s˜o utilizados quando se deseja manter o valor de uma vari´vel local em um ca a a sub-programa ap´s a sa´ o ıda. LIMITES) ! Integra F(x) de LIMITES(1) a LIMITES(2). o valor anterior desta vari´vel est´ acess´ quando o sub-programa a a ıvel ´ invocado novamente. SAVE :: A INTEGER :: CONTA= 0 !Inicializa o contador. Sub-Programas e M´dulos o 105 w w k lic lic k to bu y N O W ! w w . INTENT(IN) :: XVAL F= <express~o envolvendo XVAL e YVAL> a RETURN END FUNCTION F END MODULE FUNC -----------------------------------------FUNCTION FY(Y) ! Integra em X. INTENT(IN) :: LIMITES INTERFACE FUNCTION F(X) REAL :: F REAL. que ´ somada ao valor do argumento. INTENT(IN) :: X REAL...d o FUNCTION INTEGRA(F. e a Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8.c Com base nestas trˆs unidades de programa. CONTA= CONTA + 1 IF(CONTA == 1)THEN Autor: Rudi Gaelzer – IFM/UFPel Mant´m o valor da vari´vel. DIMENSION(2).2. e Como exemplo. DIMENSION(2) :: LIMX.d o c u -tr . y) atrav´s da chamada: e AREA= INTEGRA(FY.. INTENT(IN) :: X END FUNCTION F END INTERFACE . a subrotina abaixo cont´m as vari´veis locais CONTA. USE FUNC REAL :: FY REAL. LIMY CONTAINS FUNCTION F(XVAL) REAL :: F REAL. implicit none REAL. ack c w o . e a e SUBROUTINE CONTA_SOMA(X) IMPICIT NONE REAL. INTEGRA= <implementa¸~o integra¸~o num´rica> ca ca e RETURN END FUNCTION INTEGRA -------------------------------------------MODULE FUNC IMPLICIT NONE REAL :: YVAL REAL. LIMX) RETURN END FUNCTION FY c u -tr a c k . LIMY) 8. para um valor fixo de Y. um programa pode calcular a integral sobre o retˆngulo no plano e a (x.. a qual conta o n´mero de chamadas da e a u subrotina e ´ inicializada a zero e a vari´vel A. . Desta forma. INTENT(IN) :: Y YVAL= Y FY= INTEGRA(F.

Desta forma.2. as vari´veis que tˆm o seu valor inicializado no momento da declara¸˜o automaticamente adquirem a e ca o atributo SAVE. a atribui¸˜o ıvel ca RES= FUN1(A. Exemplos de fun¸˜es de efeito lateral s˜o dados a seguir: a co a FUNCTION FUN1(A. no exemplo acima. sub-programas k lic lic k to bu y N O W ! w w w w . o valor de RES seria diferente caso FUN1 fosse calculada antes de FUN2 do que seria a caso a ordem de c´lculo fosse invertida. INTENT(INOUT) :: A REAL. ou ambas.c 8. a O comando ou atributo SAVE podem aparecer no campo de declara¸˜es de um programa principal.C Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 106 8.C) + FUN2(A. tanto a vari´vel A quanto CONTA tˆm o seu valor mantido quando a subrotina ´ abandonada. a vari´vel A.d o c u -tr . INTENT(IN) :: B. De acordo com o padr˜o da ca a linguagem. INTENT(IN) :: B. foi mencionado que fun¸˜es normalmente n˜o alteram o valor de seus argumentos. Alternativamente ao uso do atributo. Isto a e e ´ garantido porque a vari´vel A ´ declarada com o atributo SAVE.B.2. em cujo caso nenhuma outra vari´vel pode ser declarada com o atributo SAVE. alterassem o valor de um ou mais argumentos. REAL :: A SAVE :: A . a ordem de execu¸˜o desta ca express˜o seria importante. ack c w o . ca co a em certas situa¸˜es esta a¸˜o ´ permitida.0 ELSE A= A + X END IF . Entretanto.. O uso pr´tico deste recurso est´ restrito `s outras unidades de programa. seja este operando uma vari´vel ou um argumento de uma outra fun¸˜o.B.C A= A*A FUN1= A/B RETURN END FUNCTION FUN1 ----------------------------------FUNCTION FUN2(A.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .C) onde ou FUN1 ou FUN2.16 Fun¸˜es de efeito lateral e rotinas puras co Na se¸˜o 8.B. pode-se declarar uma lista de nomes de vari´veis com a mesma proa priedade atrav´s da declara¸˜o SAVE.. o padr˜o da linguagem estabelece uma proibi¸˜o no uso de fun¸˜es ca o a ca co de efeito lateral quando o uso de tal fun¸˜o em uma express˜o altera o valor de um outro operando na mesma ca a express˜o. J´ a vari´vel CONTA n˜o precisa ser declarada e a e a a a com o mesmo atributo porque ela tem o seu valor inicializado na declara¸˜o. co Para auxiliar na otimiza¸˜o do c´digo. mas neste co caso o seu efeito ´ nulo. podia ser declarada atrav´s e ca a e das linhas: ..2. A forma geral desta declara¸˜o ´: ca e SAVE [[::] <lista nomes vari´veis>] a onde uma declara¸˜o SAVE sem a subseq¨ente <lista nomes vari´veis> equivale ` mesma declara¸˜o aplicada ca u a a ca a todos os nomes da rotina.. RETURN END SUBROUTINE CONTA_SOMA Neste exemplo. Caso este tipo de fun¸˜o a a ca ca fosse poss´ neste caso.C) INTEGER :: FUN1 REAL.C) INTEGER :: FUN2 REAL. e a a a c u -tr a c k .. INTENT(INOUT) :: A REAL. Fun¸˜es que alteram o valor de seus argumentos s˜o denominadas co ca e co a fun¸˜es de efeito lateral (side-effect functions)..d o A= 0.B.

ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. Isto possibilita que os compiladores executem as a e opera¸˜es na ordem que otimiza a execu¸˜o do c´digo. Em termos pr´ticos. a e Para assegurar que estes requerimentos sejam cumpridos e que o compilador possa facilmente verificar o seu cumprimento.. a rotina pode ser usada em outros contextos sejam o uso de um bloco de interface ou com uma interface que n˜o a caracterize como pura. ca ca ˆ qualquer rotina interna de uma rotina pura tamb´m deve ser pura. o valor de RES ´ totalmente dependente na ordem co e de execu¸˜o da express˜o. A sua existˆncia tamb´m oferece a possibilidade de se fazer chamadas a subrotinas de e e dentro de fun¸˜es puras.d o c u -tr . esta n˜o altera os seus argumentos mudos. ca e e O atributo PURE ´ dado automaticamente a qualquer rotina que seja definida com o atributo ELEMENTAL e (se¸˜o 8..2. este efeito lateral ´ proibido neste caso. --------------------------PURE FUNCTION .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . podem ser chamadas livremente de dentro a de qualquer rotina pura. portanto. uma subrotina pura pode ter argumentos mudos com inten¸˜es OUT ou INOUT e a co co ou atributo POINTER. efetivamente ca ca anulando o efeito desejado pela defini¸˜o deste recurso. Sub-Programas e M´dulos o 107 w w k lic lic k to bu y N O W ! w w . ca o ˆ a rotina n˜o possui nenhuma vari´vel local com o atributo SAVE. o programador pode assegurar ao compilador que uma determinada rotina ca (n˜o somente fun¸˜es) n˜o possui efeitos laterais ao incluir a palavra-chave PURE ` declara¸˜o SUBROUTINE ou a co a a ca FUNCTION: PURE SUBROUTINE . a subrotina intr´ ınseca elemental MVBITS (se¸˜o 7. e ˆ uma vari´vel que ´ acessada por associa¸˜o ao hospedeiro ou por uso ou ´ um argumento mudo de inten¸˜o a e ca e ca IN n˜o pode ser o alvo de uma atribui¸˜o de ponteiro. Isto permite que rotinas em a bibliotecas sejam escritas como puras sem que elas sejam obrigatoriamente usadas como tal. exceto se este seja uma rotina ou um co ponteiro. a co ˆ a rotina n˜o cont´m um comando STOP.9. Todas as fun¸˜es intr´ co ınsecas (cap´ ıtulo 7) s˜o puras e. e ca a ˆ a rotina n˜o altera nenhuma parte de uma vari´vel acessada por associa¸˜o ao hospedeiro (rotina interna) a a ca ou associa¸˜o por uso (m´dulos). co Uma rotina externa ou muda que seja usada como rotina pura deve possuir uma interface expl´ ıcita que a caracterize inequivocamente como tal.c Nota-se que ambas as fun¸˜es alteram o valor de A. esta palavra-chave assegura ao compilador que: a ˆ se a rotina ´ uma fun¸˜o..3) tamb´m ´ pura. co Esta ultima regra assegura que um ponteiro local n˜o pode causar um efeito lateral. ao contr´rio de fun¸˜es. a a Por´m. se a vari´vel ´ do tipo derivado com uma componente a ca a e de ponteiro. e a inten¸˜o deve sempre ser IN no caso de uma fun¸˜o.10). portanto. acarretaria co ca em um impedimento severo na otimiza¸˜o da execu¸˜o do comando em um processador paralelo. ca Para controlar esta situa¸˜o. ca a Como o padr˜o da linguagem n˜o estabelece uma ordem para a execu¸˜o das opera¸˜es e desenvolvimentos a a ca co em uma express˜o. ˆ as inten¸˜es de um argumento mudo qualquer devem ser declaradas. as seguintes regras adicionais s˜o impostas: a ˆ qualquer argumento mudo que seja o nome de uma rotina e qualquer rotina invocada devem tamb´m ser e puras e ter a interface expl´ ıcita.. co ca o O uso de fun¸˜es de efeito lateral em comandos ou construtos FORALL (se¸˜o 6.17).d o A= 2*A FUN2= A/C RETURN END FUNCTION FUN2 c u -tr a c k . Contudo. ack c w o . por exemplo. ela n˜o pode estar no lado direito de uma atribui¸˜o e ela n˜o pode estar associada como o a ca a argumento real de um argumento mudo que seja um ponteiro ou que tenha inten¸˜es OUT ou INOUT. a a ˆ a rotina n˜o executa opera¸˜es em um arquivo externo. Adicionalmente. ´ a A principal raz˜o para se permitir subrotinas puras est´ na possibilidade de seu uso em construtos FORALL.

Isto ´ exigido para que o compilador possa determinar o mecanismo de chamada que e acomode os elementos de matriz de forma mais eficiente. No caso de uma subrotina elemental. a Uma rotina externa elemental deve possuir uma interface expl´ ıcita que sempre a caracterize de forma inequ´ ıvoca como elemental. Nota-se que os argumentos mudos s˜o escritos como escalares. a Uma rotina elemental deve satisfazer todos os requisitos de uma rotina pura.2. INTENT(IN) :: A. que sejam conform´veis).2. Isto contrasta com o caso de uma rotina pura. mas a especifica¸˜o ELEMENTAL possibilita o uso de matrizes conform´veis a ca a como argumentos reais. Uma rotina elemental criada pelo programador deve ter um dos seguintes cabe¸alhos: c ELEMENTAL SUBROUTINE . ela j´ possui autoa maticamente o atributo PURE. INTENT(IN) :: N CHARACTER(LEN= N) :: BRANCO BRANCO= ’ ’ RETURN END FUNCTION BRANCO esta fun¸˜o deve ser chamada com argumento real escalar.d o c u -tr a c k . ELEMENTAL SUBROUTINE TROCA(A. como no exemplo a ELEMENTAL FUNCTION BRANCO(N) IMPLICIT NONE INTEGER. sub-programas k lic lic k to bu y N O W ! w w w w . SUP END TYPE INTERVALO pode-se definir a seguinte fun¸˜o elemental: ca ELEMENTAL FUNCTION SOMA_INTERVALOS(A. Neste caso. entre um limite inferior e um limite superior.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . desde que os argumentos matriciais tenham todos a mesma forma (isto ´. Um exemplo ´ fornecido abaixo.. INTENT(INOUT) :: A. a forma do resultado ´ a e a ca e forma dos argumentos matriciais. O Fortran 95 estende este conceito a rotinas n˜o-intr´ a ınsecas.B) INTRINSIC NONE TYPE(INTERVALO) :: SOMA_INTERVALOS TYPE(INTERVALO). de fato. a e ca especificando o tamanho ou outra propriedade de alguma vari´vel. Dado o tipo derivado INTERVALO: e TYPE :: INTERVALO REAL :: INF.d o c u -tr .c Na se¸˜o 6. B REAL :: TEMP Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 108 8..B) IMPLICIT NONE REAL. Para uma fun¸˜o.17 Rotinas elementais . uma vez que um argumento real matricial resultaria ca em uma matriz cujos elementos seriam caracteres de comprimentos vari´veis.7 j´ foi introduzida a no¸˜o de rotinas intr´ ca a ca ınsecas elementais. No exemplo abaixo. as opera¸˜es de soma dos intervalos s˜o realizadas componente a componente co a das matrizes A e B da maneira mais eficiente poss´ ıvel. todos os argumentos mudos e resultados de fun¸˜o devem ser ca vari´veis escalares sem o atributo POINTER. Uma rotina n˜o pode ser ao mesmo tempo elemental e recursiva.. -------------------------ELEMENTAL FUNCTION . ack c w o 8. as quais s˜o rotinas com argumentos a mudos escalares que podem ser invocadas com argumentos reais matriciais. todos os argumentos com inten¸˜es e co OUT ou INOUT devem ser matrizes. B SOMA_INTERVALOS%INF= A%INF + B%INF SOMA_INTERVALOS%SUP= A%SUP + B%SUP RETURN END FUNCTION SOMA_INTERVALOS a qual soma dois intervalos de valores. Se o valor de um argumento mudo ´ usado em uma declara¸˜o. Adicionalmente.. onde a interface nem sempre necessita caracterizar a rotina como pura. se algum argumento real ´ matriz.

a a A forma geral de um m´dulo ´: o e MODULE <nome m´dulo> o <declara¸~es vari´veis> co a <comandos execut´veis> a [CONTAINS <rotinas de m´dulo>] o END [MODULE [<nome m´dulo>]] o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. Um m´dulo pode ser usado para definir um nome gen´rico para um conjunto de rotinas. M´dulos devem ser empregados no lugar das declara¸˜es COMMON e INCLUDE. Vari´veis. Sub-Programas e M´dulos o 109 w w k lic lic k to bu y N O W ! w w . Acesso controlado a objetos. a 8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ack c w o . a a o a a e ca co rotinas e operadores sobrecarregados tais que. Interfaces gen´ricas podem ser usadas ca e tamb´m para estender a funcionalidade de rotinas intr´ e ınsecas. mais lentamente.d o TEMP= A A= B B= TEMP RETURN END SUBROUTINE TROCA c u -tr a c k .* / **) ou para definir novos tipos de operadores. de tal forma que estes mantˆm seu valor em diferentes unidades que a e usam o mesmo m´dulo. Esta estrat´gia ´ mais vantajosa que usar uma o e e rotina externa porque em um m´dulo a interface das rotinas internas ´ sempre expl´ o e ıcita. pois espera-se que a vers˜o elemental de uma rotina rode. Rotinas podem ser definidas internamente em um m´dulo. Este recurso ´ freq¨entemente o e u utilizado para impedir que um usu´rio possa alterar o valor de um objeto de ˆmbito puramente interno a a ao m´dulo. ´ poss´ especificar co o e ıvel que um determinado objeto seja vis´ ıvel somente no interior do m´dulo.d o c u -tr . Finalmente. Se dados globais s˜o necess´rios. e o e com interfaces distintas. sendo estas tornadas aceso o s´ ıveis a qualquer unidade de programa que USE o m´dulo. rotinas e declara¸˜es de operadores podem ter a sua visibilidade a co controlada por declara¸˜es ou atributos de acesso dentro de um m´dulo. quando agregados a uma unidade de programa. em a a e a geral. Um m´dulo pode ser usado tamb´m para redefinir a opera¸˜o executada pelos o e ca operadores intr´ ınsecos da linguagem (= + . Se a referˆncia a uma rotina gen´rica (se¸˜o 8. a segunda vers˜o ´ invocada. uma vez que o a mecanismo de distribuir o valor da vari´vel escalar por uma matriz conform´vel com o outro argumento n˜o a a a pode ser aplicado aqui. Um m´dulo de extens˜o semˆntica ´ uma cole¸˜o de defini¸˜es de tipos derivados. o Blocos de interfaces. ca o co comuns no Fortran 77. a Rotinas de m´dulos.c chamar esta subrotina com um argumento escalar e um matricial est´ obviamente errado. Um m´dulo ´ um recurso muito poderoso para transferir dados entre sub-programas e o o e para organizar a arquitetura global de um programa grande e complexo. Os recursos que podem ser inclu´ e ca ıdos em um m´dulo s˜o os seguintes: o a Declara¸˜o de objetos globais. Extens˜o semˆntica. por exemplo para transferir valores entre rotinas. A funcionalidade de um m´dulo pode ser explorada por qualquer unidade de programa que deseja fazer uso o (atrav´s de uma instru¸˜o USE) dos recursos disponibilizados por este.3 M´dulos o Uma das novidades mais importantes introduzidas pelo Fortran 90 ´ um novo tipo de unidade de programa e denominada m´dulo. permitem que o usu´rio use esta funcionalidade estendida como se fizesse parte da linguagem padr˜o. Desta forma. Sobrecarga de operadores. uma rotina elemental n˜o pode ser usada como um argumento real de outra rotina. mas que executem todas a mesma fun¸˜o. Objetos em um m´dulo podem ser o e o inicializados com valores est´ticos.4) ´ consistente tanto com uma rotina elemental quanto com e e ca e uma n˜o-elemental. Isto pode e a realizado em conjunto com a cl´usula ONLY. a a ent˜o estes s˜o s˜o tornados vis´ a a a ıveis sempre que o m´dulo ´ usado. Na maior parte das situa¸˜es ´ vantajoso congregar todos os blocos de interfaces em co e um ou poucos m´dulos e ent˜o usar o m´dulo sempre que uma interface expl´ o a o ıcita ´ necess´ria. o Interfaces gen´ricas.3.

o programa e c o a pode realizar a integra¸˜o usando o mesmo bloco common: ca PROGRAM INTEGRA REAL*8 G.. Neste ca a a momento.B): SUBROUTINE INTEG(F.d o c u -tr a c k . faz-se ca a necess´rio transferir informa¸˜o entre estas rotinas ou entre rotinas que usam as bibliotecas de maneira n˜o a ca a prevista na lista de argumentos. RES= <resultado> END SUBROUTINE INTEG Caso o programador queira integrar a fun¸˜o g(x) = cos(αx) no intervalo [0. RES.0D0. B. Fortran 77 A maneira mais usada no Fortran 77 para compartilhar dados globais ´ atrav´s de blocos common. 1]. Entretanto. as quais s˜o definidas com um conjunto restrito de argumentos. ack c w o 8..c Em Fortran. INT EXTERNAL G COMMON /VAR/ A . a qual realiza a integra¸˜o num´rica unidimensional de uma fun¸˜o ca e ca F(x) qualquer.*) A C CALL INTEG(G.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . muitas vezes. A maneira mais usual de se realizar este compartilhamento ´ atrav´s da lista de argumentos de uma rotina.0D0. PRINT*. Contudo. no intervalo (A. por´m n˜o h´ necessidade de ele aparecer ca e a a na subrotina INTEG.3. END PROGRAM INTEGRA Note que o bloco VAR aparece tanto no programa quanto na fun¸˜o. Esta necessidade j´ era corriqueira e a e a no Fortran 77. ’Entre com o valor de alfa:’ READ(*. M´dulos o k lic lic k to bu y N O W ! w w w w . Muitas vezes. TEMP= F(X) .d o c u -tr . em muitas situa¸˜es ´ necess´rio que alguns a a co e a objetos tenham o seu valor compartilhado entre diferentes unidades de programa. ele n˜o poder´ informar ao ca a a integrador o valor de α na lista de argumentos da subrotina INTEG. A forma geral de um bloco common ´: e COMMON /<nome common>/ <lista vari´veis> a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 110 8. TEMP EXTERNAL F .1.0. Por exemplo. seja a subrotina INTEG.. facilmente surge e e uma situa¸˜o onde uma vari´vel n˜o pode ser compartilhada como argumento de um sub-programa.. ALFA COMMON /VAR/ ALFA G= COS(ALFA*X) RETURN END FUNCTION G onde VAR ´ o nome que identifica o espa¸o de mem´ria onde o valor de ALFA ser´ armazenado. Assim..1 Dados globais .RES) REAL*8 A.INT) C .A.. com o uso de rotinas de bibliotecas de aplica¸˜o generalizada. A. ´ necess´ria uma outra estrat´gia para se definir dados globais.B..3. Um e e bloco common ´ uma lista de vari´veis armazenadas em uma ´rea da mem´ria do computador que ´ identificada e a a o e atrav´s de um nome e que pode ser acessada diretamente em mais de uma unidade de programa. F. vari´veis s˜o usualmente entidades locais. A solu¸˜o est´ no uso de um bloco common: ca a REAL*8 FUNCTION G(X) REAL*8 X.. e A necessidade de se criar um bloco common surge.

. A defini¸˜o o e ca dos nomes. se¸˜es de matrizes ou matrizes completas. natureza e tipo. por´m um m´dulo n˜o pode usar a si pr´prio. Assim. seja de co o o e o a o forma direta ou indireta.c O uso de um m´dulo fornece um mecanismo centralizado de defini¸˜o de objetos globais. caso contr´rio. co a A grande desvantagem desta forma descentralizada de definir-se dados globais est´ no fato de que em todas a as unidades de programa que utilizam um dado bloco common. ordem. elementos de matrizes. tal como uma declara¸˜o ca a a ca de vari´veis.. A declara¸˜o USE pode evitar este problema ao permitir a especifica¸˜o ca ca de um nome local distinto daquele definido no m´dulo.J*S + K*C . o ca suponha que se queira ter acesso `s vari´veis inteiras I. ele dever´ buscar em todas unidades restantes que fazem a a referˆncia ao mesmo bloco e realizar a mesma altera¸˜o. ca e a a o c FUNCTION. composto por u o um n´mero grande de unidades que usam o mesmo bloco common. S => B .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . USE GLOBAIS. K REAL :: A. SUBROUTINE ou MODULE) e antes de qualquer outra instru¸˜o n˜o execut´vel. C END MODULE GLOBAIS Estas vari´veis se tornam acess´ a ıveis a outras unidades de programa (inclusive outros m´dulos) atrav´s da o e instru¸˜o USE. Fortran 90/95 c u -tr a c k . Caso o programador esteja desenvolvendo um c´digo complexo. tipos e esp´cies das vari´veis ´ realizada em uma unica unidade de programa. E f´cil perceber que este controle torna-se sucessivamente mais dif´ ` medida que a complexidade do programa aumenta. co ´ ´ somente se utiliza o nome da matriz. o m´dulo GLOBAIS pode ser usado da seguinte forma: o FUNCTION USA_MOD(X) USE GLOBAIS IMPLICIT NONE REAL :: USA_MOD REAL. mesmo que o programa compile e linke e ca a sem erro. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8.d o onde <nome common> ´ qualquer nome v´lido em Fortran e <lista vari´veis> ´ uma lista de vari´veis que e a a e a podem ser escalares. ack c w o . . USA_MOD= I*R . estabelecendo assim um controle centralizado sobre os objetos. o seu uso n˜o ´ recomendado. R => A. J. o e Por exemplo... a qual ´ simplesmente e a e ´ e usada por outras.J*B + K*C . isto ´: ca e USE GLOBAIS A instru¸˜o USE ´ n˜o execut´vel e deve ser inserida logo ap´s o cabe¸alho da unidade de programa (PROGRAM. e ele sinta a necessidade de alterar de alguma u forma a lista de vari´veis em uma determinada unidade. Por exemplo. B e C em diferentes unidades a a a a de programa. Um m´dulo pode usar outros m´dulos. Sub-Programas e M´dulos o 111 w w k lic lic k to bu y N O W ! w w .X . as vari´veis listadas nele devem concordar em a n´mero. B. pela raz˜o a e a e a exposta acima. Uma unidade de programa pode invocar um n´mero arbitr´rio de m´dulos usando uma s´rie de a u a o e instru¸˜es USE. Um m´dulo que permitira o compartilhamento destas vari´veis ´ o seguinte: o a e MODULE GLOBAIS IMPLICIT NONE INTEGER :: I.d o c u -tr . Neste ultimo caso. E claro que a informa¸˜o acerca da natureza e tipo das vari´veis listadas ca a no bloco common deve ser fornecida por declara¸˜es adequadas de vari´veis. por´m.X RETURN END FUNCTION USA_MOD O vantagem de um m´dulo sobre um bloco COMMON para compartilhar objetos globais ´ evidente. O uso de vari´veis de um m´dulo pode causar problemas se o mesmo nome ´ usado para diferentes vari´veis a o e a em partes diferentes de um programa... por´m que ainda permita o acesso aos dados globais. ´ quase certo que as vari´veis ser˜o compartilhadas de forma incoerente entre as diferentes unidade de e a a ´ a programa e este acabe gerando resultados incorretos. J e K e `s vari´veis reais A. INTENT(IN) :: X USA_MOD= I*A . ıcil a Os blocos common s˜o ainda aceitos em Fortran 90/95.

P R M T R : : I4B = SELECTED INT KIND ( 9 ) A A EE INTEGER. P R M T R : : TWOPI= A A EE 6 .. 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9 7 1 7 dp REAL(DP) . parameter : : qp= s e l e c t e d r e a l k i n d ( 2 * precision ( 1 . 0 .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . P R M T R : : I2B = SELECTED INT KIND ( 4 ) A A EE INTEGER. 4 4 6 1 7 0 2 1 7 3 e−4 dp ! E l e c t r o n −p r o t o n mass r a t i o . Este recurso n˜o ´ exatamente igual ao uso dos atributos PUBLIC ou PRIVATE (se¸˜o 8. Os s´ ´ a ımbolos “=>“ promovem a liga¸˜o do nome local com o nome no m´dulo. 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 0 4 8 8 0 1 6 8 8 7 2 4 2 0 9 6 9 8 0 7 8 5 6 9 6 7 s p A A EE ! ! Fundamental p h y s i c a l c o n s t a n t s .. 5 7 0 7 9 6 3 2 6 7 9 4 8 9 6 6 1 9 2 3 1 3 2 1 6 9 1 6 3 9 7 5 1 4 4 2 0 9 8 5 8 dp REAL(DP) .. r e a l ( dp ) . uma vez o a e ca que ele atua somente na unidade que acessa o m´dulo. parameter : : rmemp= 5 . M´dulos o k lic lic k to bu y N O W ! w w w w . P R M T R : : PID2= A A EE 1 . html r e a l ( dp ) . C . parameter : : r t p i= 1 . por´m com o nome R. 0 ) integer . 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 0 4 8 8 0 1 6 8 8 7 2 4 2 0 9 6 9 8 0 7 8 5 6 9 6 7 dp r e a l ( dp ) . 0 dp ) . 0 dp . a Existe tamb´m uma forma da declara¸˜o USE que limita o acesso somente a certos objetos dentro de um e ca m´dulo. ack c w o ..d o c u -tr . 0 dp ) ) complex ( kind= dp ) . seguido de dois pontos “:” e uma <lista only>: USE <nome m´dulo>. o b t a i n e d from NIST : ! h t t p : / / p h y s i c s . definidas no m´dulo. parameter : : rmpme= 1 8 3 6 . 5 7 0 7 9 6 3 2 6 7 9 4 8 9 6 6 1 9 2 3 1 3 2 1 6 9 1 6 3 9 7 5 1 4 4 2 0 9 8 5 8 s p A A EE REAL(SP ) .. 1 . 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2 8 7 4 7 1 3 5 2 6 6 2 4 9 7 7 5 7 2 5 dp REAL(SP ) . para tornar somente a vari´vel A acess´ a ıvel. e o ! M D L esp const O UE ! INTEGER. 1 5 2 6 7 2 6 1 dp ! Protron−e l e c t r o n mass r a t i o . Os dois ultimos recursos podem ser tamb´m combinados: ´ e . ONLY: A. parameter : : e u l e r e= 2 . e n˜o sobre o m´dulo em geral. P R M T R : : SQRT2 S= 1 . 2 8 3 1 8 5 3 0 7 1 7 9 5 8 6 4 7 6 9 2 5 2 8 6 7 6 6 5 5 9 0 0 5 7 6 8 3 9 4 3 4 dp r e a l ( dp ) . P R M T R : : TWOPI s= 6 . Por conseguinte. parameter : : sp= kind ( 1 . 7 7 2 4 5 3 8 5 0 9 0 5 5 1 6 0 2 7 2 9 8 1 6 7 4 8 3 3 4 1 1 4 5 1 8 2 7 9 7 5 5 dp REAL(DP) . END M D L e s p c o n s t O UE Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 112 8. z i= ( 0 . parameter : : dp= s e l e c t e d r e a l k i n d ( 2 * precision ( 1 . deve-se notar que que um USE com o c˜ o qualificador ONLY n˜o cancela uma declara¸˜o USE menos restritiva. USE GLOBAIS.. Tudo se passa como se R fosse o apelido de A e S o apelido de B ca o nesta unidade de programa. 7 7 2 4 5 3 8 5 0 9 0 5 5 1 6 0 2 7 2 9 8 1 6 7 4 8 3 3 4 1 1 4 5 1 8 2 7 9 7 5 5 s p REAL(SP ) .c ! *** Module E s p c o n s t *** ! D e f i n e e s p ´ c i e s de t i p o p a d r ˜ e s e c o n s t a n t e s u n i v e r s a i s . parameter : : r t p i s= 1 .3). n i s t . P R M T R : : PI= A A EE 3 .d o Aqui. e e pode-se usar tanto o nome verdadeiro de uma vari´vel quanto o nome de um ponteiro que aponta a ela. 0 dp .3. P R M T R : : SQRT2= A A EE 1 . a ca Um uso freq¨ente de m´dulos para armazenar dados globais consiste em defini¸˜es de parˆmetros de esp´cie u o co a e de tipo. gov / cuu / C o n s t a n t s / i n d e x . ONLY: <lista only> o Por exemplo para tornar somente as vari´veis A e C do m´dulo GLOBAIS acess´ a o ıveis em uma dada unidade de programa. caso estes nomes a a o ultimos sejam usados para diferentes vari´veis na mesma unidade de programa. os nomes R e S s˜o usado para acessar as vari´veis globais A e B. parameter : : z1= ( 1 .. P R M T R : : I1B = SELECTED INT KIND ( 2 ) A A EE integer . constantes universais matem´ticas e/ou f´ a ısicas e outros objetos est´ticos. P R M T R : : PID2 S= 1 . 2 8 3 1 8 5 3 0 7 1 7 9 5 8 6 4 7 6 9 2 5 2 8 6 7 6 6 5 5 9 0 0 5 7 6 8 3 9 4 3 4 s p A A EE r e a l ( sp ) . como no exemplo abaixo: a c u -tr a c k . O recurso requer o uso o a o do qualificador ONLY.3. a declara¸˜o fica: ca . neste caso. 0 dp ) REAL(DP) .. Os ponteiros em Fortran 90/95 tamb´m atuam como apelidos. 0 s p ) ) integer . USE GLOBAIS.14159265358979323846264338327950288419717 sp REAL(SP ) . por´m. ONLY: R => A . Uma unidade de programa pode ter mais e de uma declara¸ao USE referindo-se ao mesmo m´dulo. P R M T R : : PI S= A A EE 3.

”Entre com o v a l o r de x : ” read * . Sub-Programas e M´dulos o 113 w w k lic lic k to bu y N O W ! w w .3. por associa¸ao ao hospedeiro. s e n ( ) print * . ca Uma rotina de m´dulo pode invocar outras rotinas de m´dulo contidas no mesmo m´dulo. Estas podem ser o a o tanto subrotinas quanto fun¸˜es e ter a mesma forma de rotinas internas definidas dentro de outras unidades co de programa. o 8.3: Ilustra uso de m´dulo para armazenar dados globais.d o c u -tr . Por exemplo.d o c u -tr a c k . O n´mero de rotinas de m´dulo ´ arbitr´rio. 1 4 1 5 9 2 6 5 3 6 real . ”s e n ( p i * x)= ” . ” l n ( e * x)= ” . exceto que uma rotina de m´dulo pode o conter. As vari´veis o o o a declaradas no m´dulo antes da palavra-chave CONTAINS s˜o diretamente acess´ o a ıveis a todas as rotinas deste. vari´veis declaradas localmente em um determinado sub-programa de c˜ a m´dulo s˜o opacas aos outros sub-programas. o Por outro lado. Caso o m´dulo invoque outro m´dulo com uma instru¸˜o USE o a o o ca antes da palavra-chave CONTAINS. ilustra o uso de um m´dulo para armazenar dados globais. o M D L modu1 O UE i m p l i c i t none real .2 Rotinas de m´dulos o Rotinas podem ser definidas em m´dulos e estas s˜o denominadas rotinas de m´dulos. parameter : : p i= 3 .3). estes objetos tamb´m se tornam acess´ e ıveis a todas as rotinas de m´dulo. por sua vez. Contudo.f90 (programa 8. x print * . Contudo. uma determinada rotina de m´dulo pode usar localmente outro m´dulo (n˜o o hospedeiro). a CONTAINS Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . 7 1 8 2 8 1 8 2 8 END M D L modu1 O UE ! ***************************************** program mod1 use modu1 i m p l i c i t none real : : x do print * . o seguinte m´dulo ´ v´lido: o e a MODULE INTEG IMPLICIT NONE REAL :: ALFA ! Vari´vel global. o o a em cuja situa¸˜o os objetos somente s˜o acess´ ca a ıveis localmente. ack c w o .c Programa 8. uma rotina de m´dulo possui todas o as propriedades de rotinas internas em outras unidades de programa. l n ( ) end do CONTAINS function se n ( ) real : : sen s e n= s i n ( p i * x ) return end function s e n ! function l n ( ) real : : ln l n= l o g ( e u l e r e * x ) return end function l n end program mod1 O programa-exemplo mod1. parameter : : e u l e r e= 2 . u o e a Rotinas de m´dulo podem ser chamadas usando o comando CALL usual ou fazendo referˆncia ao nome de o e uma fun¸˜o. rotinas internas a ela. estas somente s˜o acess´ ca a ıveis a unidades de programa que fazem uso do m´dulo atrav´s o e da instru¸˜o USE. Em suma.

PZ= ADPONTO(PX. onde as informa¸˜es contidas no m´dulo. e o Rotinas de m´dulo pode ser uteis por diversas raz˜es. um m´dulo que define a estrutura de um o ´ o o conjunto particular de dados pode tamb´m incluir rotinas especiais.d o c u -tr . PZ . resultando que as interfaces das rotinas de m´dulo s˜o automaticamente expl´ o a ıcitas tamb´m para a unidade de programa que o invoca.Q) TYPE(POINT) :: ADPONTOS TYPE(POINT).obj) associado. um m´dulo pode ser usado para “adicionar” vari´veis de tipo derivado: o a MODULE MOD_PONTO IMPLICIT NONE TYPE :: PONTO REAL :: X. necess´rias para operar com estes dados. os compiladores automaticamente geram um novo tipo de o arquivo.3. Por exemplo. INTENT(IN) :: X FF= EXP(-ALFA*X*X) FF= FF*X2(X) RETURN CONTAINS FUNCTION X2(Y) REAL :: X2 REAL.mod. Y END TYPE PONTO CONTAINS FUNCTION ADPONTOS(P.mod. Quando uma outra unidade de programa faz referˆncia a este m´dulo.c o m 114 8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .. bastando guardar o a e a arquivo *.o ou *. cria-se um mecanismo para verificar se as vari´veis e as co a interfaces est˜o sendo corretamente utilizadas pela unidade que chama o m´dulo. END PROGRAM P_PONTO Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 c u -tr a c k . INTENT(IN) :: P..PY) . s˜o armazenadas. todas os objetos p´blicos nele contidos se o u tornam acess´ ıveis a esta. Desta forma. geralmente com a extens˜o *.d o FUNCTION FF(X) REAL :: FF REAL. um m´dulo ´ considerado a unidade ideal para e o e armazenar grupos de sub-programas criados para desempenhar uma determinada tarefa. Q ADPONTOS%X= P%X + Q%X ADPONTOS%Y= P%Y + Q%Y RETURN END FUNCTION ADPONTOS END MODULE MOD_PONTO Neste caso. o programa principal usa este m´dulo: o PROGRAM P_PONTO USE MOD_PONTO IMPLICIT NONE TYPE(POINT) :: PX. Ao se compilar um arquivo contendo um m´dulo. PY.. Quando o m´dulo n˜o define a o o a um rotina interna. e a ou um m´dulo pode ser usado para conter uma biblioteca de rotinas relacionadas entre si. M´dulos o k lic lic k to bu y N O W ! w w w w . juntamente com os objetos globais associados a estes sub-programas. INTENT(IN) :: Y X2= Y**2 RETURN END FUNCTION X2 END FUNCTION FF END MODULE INTEG A outra grande diferen¸a est´ no fato de que as interfaces das rotinas de m´dulo s˜o expl´ c a o a ıcitas no ˆmbito deste. o compilador a e o busca estas informa¸˜es no arquivo . Portanto. a Todavia. mas somente o arquivo de m´dulo.mod . o Como exemplo. n˜o ´ necess´rio guardar o arquivo objeto (*. ack c w o . muitos compiladores oferecem uma chave extra de compila¸˜o atrav´s da qual a ca e nenhum arquivo objeto ´ criado.. Por esta raz˜o. quando uma outra unidade de programa usa o m´dulo. tais como vari´veis globais e a co o a interfaces.

dentro do ˆmbito do m´dulo M_PONTO. de tal forma que o processo de adi¸˜o de duas vari´veis do a o ca a tipo PONTO automaticamente iria chamar a fun¸˜o ADPONTO.d o c u -tr . PRIVATE :: U. este recurso n˜o ser´ discutido aqui. o M D L modu2 O UE i m p l i c i t none real . por´m usando rotinas de m´dulo. V. 7 1 8 2 8 1 8 2 8 real : : x CONTAINS function se n ( ) real : : sen s e n= s i n ( p i * x ) return end function s e n ! function l n ( ) real : : ln l n= l o g ( e u l e r e * x ) return end function l n END M D L modu2 O UE ! ***************************************** program mod2 use modu2 i m p l i c i t none do print * . ao inv´s do programa chamar esta ca e fun¸˜o.c Programa 8. Por exemplo.3. o a c Este controle ´ exercido atrav´s dos atributos ou declara¸˜es PUBLIC ou PRIVATE. s e n ( ) print * . parameter : : e u l e r e= 2 . e e o 8.f90. c ca ca por exemplo. Y e Z s˜o acess´ a a ıveis ` unidade de programa que acessa este a m´dulo. ack c w o . W Dentro deste conjunto de vari´veis.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Z INTEGER. ”s e n ( p i * x)= ” .3 Atributos e declara¸oes PUBLIC e PRIVATE c˜ Usualmente.d o c u -tr a c k . a a O programa-exemplo mod2. somente X. x print * . bastaria realizar a opera¸˜o: ca ca PZ= PX + PY Entretanto. todas as entidades em um m´dulo est˜o dispon´ o a ıveis para qualquer unidade de programa que chame este m´dulo com a instru¸˜o USE. 1 4 1 5 9 2 6 5 3 6 real . Sub-Programas e M´dulos o 115 w w k lic lic k to bu y N O W ! w w . Y. PUBLIC :: X. Desta forma.4: Ilustra o uso de rotinas de m´dulo. o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8.f90 (programa 8. em certas situa¸˜es ´ recomend´vel proibir o uso de certas o ca co e a entidades (objetos globais e/ou rotinas) contidas no m´dulo para for¸ar o usu´rio a invocar as rotinas de m´dulo o c a o que realmente deveriam ser acess´ ıveis a este.4) ´ igual ao mod1. l n ( ) end do end program mod2 O recurso avan¸ado de sobrecarga de operador (operator overloading) permite redefinir a opera¸˜o de adi¸˜o (+). abaixo temos e e co a declara¸˜es de vari´veis com dois atributos distintos: co a REAL. Contudo. parameter : : p i= 3 . ”Entre com o v a l o r de x : ” read * . ou para permitir flexibilidade no aperfei¸oamento das entidades c contidas no m´dulo sem haver a necessidade de informar o usu´rio a respeito destes aperfei¸oamentos. ” l n ( e * x)= ” .

Embora ca e e possam ser declaradas em quaisquer unidades de programa.3.d o c u -tr . isto ´. a declara¸˜o o ca MODULE PROCEDURE <lista nomes rotinas> ´ inclu´ no bloco de interface para nomear as rotinas de m´dulo que s˜o referidas atrav´s do nome gen´rico. e e Como um m´dulo ´ a unidade de programa ideal para armazenar todas estas rotinas espec´ o e ıficas relacionadas entre si e como as interfaces das rotinas de m´dulo s˜o sempre expl´ o a ıcitas. o Uma rotina gen´rica ´ definido usando-se um bloco interfaces e um nome gen´rico ´ usado para todas as e e e e rotinas definidas dentro deste bloco de interfaces. O uso do <nome gen´rico> no final do bloco somente ´ permitido a partir do Fortran 95. ao passo que a declara¸˜o a ca PRIVATE altera o acesso padr˜o. elas podem ser rotinas externas. V. que se referem a um dado conjunto de tipos de vari´veis..d o Outra maneira de se estabelecer o controle de acesso ´ atrav´s de declara¸˜es. as quais listam os nomes dos e e co objetos que s˜o p´blicos ou privados: a u PUBLIC :: X. PRIVATE PUBLIC <lista acesso> . M´dulos o k lic lic k to bu y N O W ! w w w w . podendo ser acessadas somente dentro do ˆmbito do m´dulo. Y. W A forma geral da declara¸˜o ´: ca e PUBLIC [[::] <lista acesso>] PRIVATE [[::] <lista acesso>] Caso nenhum controle ´ estabelecido em um m´dulo. a a o c u -tr a c k . a declara¸˜o geral ´: ca e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 116 8. estas rotinas gen´ricas s˜o. Desta forma. Neste caso.. uma seq¨ˆncia de declara¸˜es como as abaixo: a ue co . e Se uma declara¸˜o PUBLIC ou PRIVATE n˜o possui uma lista de entidades. e a a e e As rotinas per se podem se encontrar em outras unidades.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . etc. Assim. enquanto e ´ e que a a¸˜o que realmente ´ executada quando este nome ´ usado depende do tipo de seus argumentos. e que s˜o acessadas atrav´s do <nome gen´rico>. em geral.3. seja atrav´s de um atributo ou de uma declara¸˜o. esta confirma ou altera o acesso ca a padr˜o.c 8.. s˜o os blocos das interfaces das rotinas espec´ ı a ıficas. Assim. por exemplo. a declara¸˜o a ca PUBLIC confirma o acesso padr˜o... a forma geral ´: e INTERFACE <nome gen´rico> e <bloco interface rotina espec´fica 1> ı <bloco interface rotina espec´fica 2> ı . END INTERFACE <nome gen´rico> e onde <bloco interface rotina espec´fica 1>. rotinas gen´ricas s˜o usualmente definidas em e a m´dulos. confere aos nomes na <lista acesso> o atributo PUBLIC enquanto que todas as entidades restantes no m´dulo o s˜o privadas. Z PRIVATE :: U.4 Interfaces e rotinas gen´ricas e Outro recurso poderoso introduzido pelo Fortran 90 ´ a habilidade do programador definir suas pr´prias e o rotinas gen´ricas. de tal forma que um unico nome ´ suficiente para invocar uma determinada rotina. ack c w o . e a definidas dentro de m´dulos. e ıda o a e e Assim.. todas e o e ca as entidades tˆm o atributo PUBLIC.

ambas as regras s˜o necess´rias para descartar a possibilidade de invoca¸˜o amb´ a a ca ıgua por uso de palavras-chave. esp´cie e posto particulares que a outra o e ou 2. e e c u -tr a c k .I) REAL :: FXI REAL. INTENT(IN) :: I . INTENT(IN) :: X INTEGER.. tamb´m listado na p´gina 119. Neste caso. FIX END INTERFACE F CONTAINS FUNCTION FXI(X. a o e e bastando que elas sejam acess´ ıveis por associa¸˜o de uso. l´gico e do tipo derivado ponto. ou esteja presente com um tipo e/ou esp´cie distinta ou com posto distinto. e Para o caso (2). Na primeira vez.f90. o m´dulo estar´ estendendo o intervalo de aplica¸˜o de uma rotina intr´ o a ca ınseca. a a Posteriormente. As regras s˜o que: a 1.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . que ao menos uma delas tenha um argumento mudo obrigat´rio tal que o (a) corresponda por posi¸˜o na lista de argumentos a um argumento mudo que n˜o esteja presente na ca a outra.2. o qual ´ definido no mesmo m´dulo. o nome gen´rico definido em um m´dulo pode ser o mesmo de outro nome e o gen´rico acess´ ao m´dulo.17.d o INTERFACE <nome gen´rico> e [<blocos interfaces>] [MODULE PROCEDURE <lista nomes rotinas>] ! Em Fortran 95 blocos de interfaces e declara¸~es MODULE PROCEDURE co ! podem aparecer em qualquer ordem. o m´dulo ser´ utilizado para o e a co o a trocar o valor de duas vari´veis escalares do tipo ponto. e a Uma declara¸˜o MODULE PROCEDURE somente ´ permitida se um <nome gen´rico> ´ fornecido. como o a no programa usa_gt_mat. na se¸˜o 8.. na forma de uma subrotina elemental.f90 na p´gina 119. Quaisquer duas rotinas n˜o-intr´ e a ınsecas associadas ao mesmo nome gen´rico devem ter argumentos que diferem de tal forma que qualquer invoca¸˜o ´ feita de forma e ca e inequ´ ıvoca. como no programa usa gentroca. Como exemplo onde haver´ ambig¨idade. ser´ utilizada novamente a subrotina TROCA. a qual e a foi definida primeiramente na p´gina 97 e depois. o mesmo m´dulo ser´ utilizado para trocar os elementos de duas matrizes inteiras. Sub-Programas e M´dulos o 117 w w k lic lic k to bu y N O W ! w w . ca Para demonstrar o poderio de uma interface gen´rica. INTEN(IN) :: X Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. Em e conjunto com esta propriedade. Por´m. ca e e e e o nome gen´rico pode ser igual ao nome de uma das rotinas declaradas na <lista nomes rotinas>. uma delas tenha mais argumentos obrigat´rios mudos de um tipo.X) REAL :: FIX REAL. O a ca m´dulo gentroca na p´gina 118 define o nome gen´rico de uma s´rie de subrotinas elementais TROCA associadas o a e e a vari´veis dos tipos real. ack c w o . a o e o Este m´dulo ´ utilizado ent˜o em duas situa¸˜es distintas. e e (b) corresponda por nome a um argumento mudo que n˜o esteja presente na outra.c Deve-se notar que todos os nomes na <lista nomes rotinas> devem ser de rotinas de m´dulo acess´ o ıveis. END FUNCTION FXI ! FUNCTION FIX(I. incluindo a a e co as intr´ ınsecas quando uma rotina intr´ ınseca ´ estendida. inteiro. As rotinas `s quais s˜o dadas um certo nome gen´rico devem ser todas ou subrotinas ou fun¸˜es. END INTERFACE [<nome gen´rico>] e ! Somente em Fortran 95 o nome gen´rico ´ aceito aqui. o exemplo abaixo: a u !Exemplo de defini¸~o amb´gua de nome gen´rico ca ı e INTERFACE F MODULE PROCEDURE FXI. portanto. inclusive no caso onde o nome gen´rico corresponde ao de uma rotina intr´ e ıvel o e ınseca.d o c u -tr . ou presente com tipo a e/ou esp´cie diferente ou com posto diferente. elas n˜o necessariamente devem estar definidas no mesmo m´dulo onde a interface gen´rica ´ estabelecida.

ack c w o .d o c u -tr . M´dulos o k lic lic k to bu y N O W ! w w w w .c ! D e f i n e nome g e n ´ r i c o para t r o c a de duas v a r i ´ v e i s q u a i s q u e r . e a M D L gentroca O UE i m p l i c i t none type : : ponto real : : x . intent ( inout ) : : a . intent ( inout ) : : a . b l o g i c a l : : temp temp= a a= b b= temp end subroutine t r o c a l o g END M D L g e n t r o c a O UE Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 118 8.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . b r e a l : : temp temp= a a= b b= temp end subroutine t r o c a r e a l ! e l e m e n t a l subroutine t r o c a i n t ( a . intent ( inout ) : : a . y end type ponto ! INTERFACE t r o c a M D L PROCEDURE t r o c a p o n t o .d o c u -tr a c k . b ) l o g i c a l . b type ( ponto ) : : temp temp= a a= b b= temp end subroutine t r o c a p o n t o ! e l e m e n t a l subroutine t r o c a r e a l ( a . t r o c a l o g O UE END INTERFACE t r o c a ! CONTAINS e l e m e n t a l subroutine t r o c a p o n t o ( a . intent ( inout ) : : a . b ) integer .3. b integer : : temp temp= a a= b b= temp end subroutine t r o c a i n t ! e l e m e n t a l subroutine t r o c a l o g ( a . b ) type ( ponto ) . b ) real . t r o c a r e a l . t r o c a i n t .

:) . b ( i . 0 . ’ V a l o r e s o r i g i n a i s : ’ do i= 1 . enquanto que o padr˜o da linguagem somente considera argumentos reais (se¸˜o ??): a ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8. 8. ” ”. c call troca (b . 2 / ) ) . 2 ) / ) . j= 3 . 2 print * . b . c ) print * .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Uma rotina intr´ a ınseca redefinida substitui uma rotina intr´ ınseca espec´ ıfica existente. dimension ( 2 . print * . shape= ( / 2 . 0 ) .c(i end do call troca (b . ca Quando um nome gen´rico ´ igual ao nome gen´rico de uma rotina intr´ e e e ınseca e o nome ´ declarado com o e atributo ou declara¸˜o INTRINSIC (ou aparece em um contexto intr´ ca ınseco). 2 ) . INTENT(IN) :: I . 2 print * . 4 ) . : ) . 4 ) / ) . por exemplo.3. Uma rotina ine tr´ ınseca estendida suplementa as rotinas intr´ ınsecas espec´ ıficas j´ existentes. a chamada ao nome gen´rico F ser´ n˜o-amb´ e a a ıgua no caso de argumentos posicionais: A= F(INT. c= r e s h a p e ( s o u r c e= ( / ( ( i+j . uma rotina intr´ a ınseca pode ser estendida ou tamb´m redefinida.d o c u -tr . c ) print * . 2 ) : : b . a interface gen´rica estende a rotina e gen´rica intr´ e ınseca. b= r e s h a p e ( s o u r c e= ( / ( ( i+j . c= ponto ( 1 . 0 ) print * . Como exemplo. para interfaces n˜o previstas pelo padr˜o da linguagem (extens˜o) e/ou subsca a a a tituir o processo de c´lculo do valor da fun¸˜o por um c´digo distinto daquele implementado no compilador a ca o (substitui¸˜o). j= 1 . 1 . 0 ..:) INTEGER. ” ”. o m´dulo EXT_SINH abaixo estende o c´lculo da fun¸˜o seno hiperb´lico para um argumento o a ca o escalar complexo. shape= ( / 2 . END FUNCTION FIX Neste caso. : ) . 2 / ) ) i= 3 . b . b ( i . esta ultima ´ sempre ´ e invocada. ’ V a l o r e s o r i g i n a i s : ’ print * . Quando um nome gen´rico ´ igual ao nome gen´rico de uma rotina intr´ e e e ınseca e este nome n˜o possui o atributo a INTRINSIC (nem possui este atributo pelo contexto). Desta forma ´ poss´ e ıvel ampliar um determinado c´lculo a de uma fun¸˜o. 0 .c(i end do end program u s a g t m a t c i= 1 . ’ Novos v a l o r e s : ’ print * . Sub-Programas e M´dulos o 119 w w k lic lic k to bu y N O W ! w w .c program u s a g t m a t use g e n t r o c a integer .VAR) por´m ser´ amb´ e a ıgua para chamada usando palavras-chave: A= F(I= INT..5 Estendendo rotinas intr´ ınsecas via blocos de interface gen´ricos e Como j´ foi mencionado. X= VAR) Se uma invoca¸˜o gen´rica ´ amb´ ca e e ıgua entre uma rotina intr´ ınseca e uma n˜o-intr´ a ınseca. a rotina gen´rica redefine a rotina gen´rica intr´ e e ınseca.d o program u s a g e n t r o c a use g e n t r o c a type ( ponto ) : : b= ponto ( 1 . c end program u s a g e n t r o c a c u -tr a c k . ack c w o . ’ Novos v a l o r e s : ’ do i= 1 .

em diversos lugares.Y X= REAL(Z) Y= AIMAG(Z) SINH_C= CMPLX(SINH(X)*COS(Y). tem seu conjunto independente de r´tulos. excluindo quaisquer defini¸˜es de tipo derivado e blocos de co interfaces contidos dentro deste. e e O ˆmbito de um nome declarado em uma rotina interna ´ somente a pr´pria rotina.COSH(X)*SIN(Y)) RETURN END FUNCTION SINH_C END MODULE EXT_SINH c u -tr a c k . 8. excluindo quaisquer sub-programas a o e internos que eles contenham. O ˆmbito do nome de um sub-programa interno e do n´mero e tipos dos seus argumentos a u estende-se por toda a unidade de programa que o cont´m. e Considerando a defini¸˜o de unidade de ˆmbito acima. O ˆmbito de um nome declarado em um m´dulo estende-se a todos os sub-programas a o internos. o ˆmbito de um certo nome de vari´vel. u Assim.d o c u -tr . que n˜o se sobrep˜e. inclusive por todos os outros sub-programas internos.4. ca a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 120 ˆ 8. INTENT(IN) :: Z REAL :: X. e O ˆmbito de um nome declarado em um m´dulo estende-se a todas as unidades de programa que usam este a o m´dulo. ca ˆ o corpo de um bloco de interfaces de rotinas. exceto no caso em que a entidade em quest˜o tenha o atributo PRIVATE.d o MODULE EXT_SINH IMPLICIT NONE INTRINSIC :: SINH ! INTERFACE SINH MODULE PROCEDURE SINH_C END INTERFACE SINH ! CONTAINS FUNCTION SINH_C(Z) COMPLEX :: SINH_C COMPLEX. o ˆmbito de um r´tulo ´ um programa principal ou sub-programa. o mesmo r´tulo pode ser usado em um programa principal e em seus sub-programas internos sem o ambig¨idade. excluindo aqueles onde o nome ´ redeclarado.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu C m C w . O ˆmbito de um nome declarado em um programa principal ou rotina externa a estende-se a todos os sub-programas que eles contˆm. a a 8.c 8.1 ˆ Ambito dos r´tulos o Toda unidade de programa ou sub-programa. blocos de interfaces e co rotinas internas contidas dentro desta unidade. ack c w o . u Uma unidade de ˆmbito ´ qualquer um dos seguintes: a e ˆ uma defini¸˜o de tipo derivado. interno ou externo. ou ˆ uma unidade de programa ou sub-programa. Ambito (Scope) to k lic lic k to bu y N O W ! w w w w . o Portanto. excluindo defini¸˜es de tipo derivado.4. onde o nome o e a a o deste objeto pode ser usado sem ambig¨idade. exceto quando o nome ´ redeclarado no sub-programa.4. ou ´ renomeada na unidade de o a e programa que usa o m´dulo ou quando a instru¸˜o USE apresenta o qualificador ONLY e a entidade em quest˜o n˜o o ca a a esteja na <lista only>. e n˜o os outros suba e o a programas internos. O ˆmbito de a a a a um objeto nomeado ou de um r´tulo ´ o conjunto de unidades de ˆmbito.2 ˆ Ambito dos nomes O ˆmbito de um nome declarado em uma unidade de programa estende-se do cabe¸alho da unidade de a c programa ao seu comando END.4 ˆ Ambito (Scope) J´ foi mencionado neste texto. O r´tulo pode ser usado sem ambig¨idade em qualquer ponto entre os comandos o u execut´veis de seu ˆmbito.

. mesmo que elas tenham o a a mesmo nome e propriedades. o qual n˜o possui o atributo PRIVATE. e ˆ O ˆmbito de um nome declarado em uma rotina interna ´ esta rotina interna. e ˆ Os nomes de unidades de programas s˜o globais.. O ˆmbito de um nome declarado em uma unidade de programa estende-se do ca a cabe¸alho da unidade de programa ao comando END.. Sub-Programas e M´dulos o 121 w w k lic lic k to bu y N O W ! w w . CONTAINS SUBROUTINE AMBITO2 TYPE :: AMBITO3 . c u -tr a c k .. o Nota-se que ambos os tipos de associa¸˜o n˜o se estende a quaisquer rotinas externas que possam ser invocadas ca a e n˜o incluem quaisquer rotinas internas onde o nome ´ redeclarado. a e Este conjunto de regras resume a defini¸˜o de ˆmbito de um nome.) . END INTERFACE .. assim..d o c u -tr .. END FUNCTION AMBITO5 END SUBROUTINE AMBITO2 END MODULO AMBITO1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito 1 1 1 2 3 3 3 2 4 2 2 2 5 5 5 2 1 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m Cap´ ıtulo 8..c ˆ Dentro de uma unidade de ˆmbito. O ˆmbito de um nome declarado em um m´dulo. CONTAINS FUNCTION AMBITO5(... ack c w o .d o ˆ Entidades declaradas em diferentes unidades de ˆmbito s˜o sempre distintas.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a e Um exemplo contendo 5 unidades de ˆmbito ´ ilustrado a seguir: a e MODULE AMBITO1 . cada nome deve ser distinto dos outros e distinto a de quaisquer entidades locais na unidade de programa. c Associa¸˜o por uso... cada entidade nomeada deve possuir um nome distinto. END TYPE AMBITO3 INTERFACE . ˆ O ˆmbito do nome de uma rotina interna estende-se somente por toda a unidade de programa que a a cont´m. ca a Nomes de entidades s˜o acess´ a ıveis por associa¸ao ao hospedeiro ou associa¸˜o por uso quando: c˜ ca Associa¸˜o ao hospedeiro. com a exce¸˜o a ca de nomes gen´ricos de rotinas. ca a o a estende-se a qualquer unidade de programa que usa o m´dulo.

4.d o c u -tr a c k .d o c u -tr . Ambito (Scope) to k lic lic k to bu y N O W ! w w w w .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu C m C w . ack c w o .c Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008 o m 122 ˆ 8.

na tela. adicionalmente. ser˜o abordados os processos de a E/S em arquivos de dados.11) abordam o assunto de uma forma bem mais abrangente. em arquivos residentes no disco r´ ıgido do computador ou em outra m´ ıdia ` qual o mesmo tem acesso. recursos de multimeios. este co ıda cap´ ıtulo ir´ apresentar apenas um conjunto de instru¸˜es que implementam um processo b´sico de E/S. Com este intuito. co 9. os resultados naturalmente precisam ser impressos. plotters. o acesso de E/S a arquivos ser´ brevemente discutido na forma de tarefas atribu´ c˜ a ıdas ao programador. os quais n˜o podem ser todos armazenados na mem´ria de acesso aleat´rio (RAM) do a o o computador. recursos de formata¸˜o a ca que instruem a maneira como os dados s˜o lidos ou escritos. por a exemplo.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . mostrados graficamente ou salvos para uso posterior.c Cap´ ıtulo 9 Comandos de Entrada/Sa´ de Dados ıda O Fortran 90/95 possui um conjunto rico de instru¸˜es de entrada/sa´ (E/S) de dados. a co a Muitos programas necessitam de dados iniciais para o seu processamento. Os mais utilizados s˜o: a ˆ OPEN ˆ READ ˆ WRITE ˆ PRINT ˆ CLOSE ˆ REWIND ˆ BACKSPACE estes comandos est˜o todos embutidos dentro da linguagem a qual possui. sobre onde. estejam conectados a um programa para leitura e/ou escrita.3 – 9. Fortran 90/95 permite que diversos outros objetos.3 na p´gina 11 j´ foram apresentadas a entrada (teclado) e a sa´ (tela do monitor) padr˜es do ca a a ıda o Fortran. ao passo que as ca e ca a se¸˜es posteriores (9. Depois que os c´lculos estiverem a completos.1 Comandos de Entrada/Sa´ ıda: introdu¸˜o r´pida ca a Na se¸˜o 2. Usado desta forma. por ser este o uso mais freq¨ente deste recurso.1 cont´m esta introdu¸˜o r´pida. O programador possui controle muito restrito. programas gr´ficos. Neste cap´ ıtulo. ´ interessante que se fa¸a inicialmente uma introdu¸˜o a e c ca simples ao assunto. o programador est´ limitado ao teclado para o fornecimento a de parˆmetros ao programa. para posteriormente u entrar-se em maiores detalhes. o resultado deve ser apresentado e sobre o n´mero de casas decimais que deve ser u utilizado para representar o valor. Adicionalmente. Nesta situa¸˜o tamb´m se usam os comandos de E/S da linguagem. Entretanto.c O W w . 123 o m w w w w . a Um uso mais desej´vel dos recursos de E/S do Fortran consiste na habilidade de ler e gravar dados. Durante a execu¸˜o de um programa.d o c u -tr a c k . por e exemplo. como arquivos de dados. ca e O Fortran 90/95 possui muitos comandos de E/S.d o c u -tr a c k ! w o . a Devido ` variedade de usos dos comandos de E/S. a Nesta se¸ao. algumas vezes h´ uma quantidade grande de dados produzidos por ca a uma parte do programa. etc. Outros tipos de usos incluem sa´ u ıda direta de dados em impressoras. Adicionalmente. o recurso ´ demasiado limitado. abordando os usos mais freq¨entes dos processos com arquivos externos. a se¸˜o 9. todos os exemplos abordados executaram opera¸˜es de E/S de dados com teclado (entrada) e co e terminal (sa´ ıda). a At´ este ponto.

9 ) ” . 5 . 0 dp b= s q r t ( 2 .1414214 9 caracteres F12.9: -3. com um total de a 7 algarismos alfanum´ricos.31416 E +01 a = 0.141592654 ******* ********* 0. b . c a= 1 . a .14286 b = 1.5: 0.7 ıda ca a determina a adi¸˜o de B e F11. f 1 1 . Comandos de Entrada/Sa´ ıda: introdu¸˜o r´pida ca a k lic lic k to bu y N O W ! w w w w . e11 . 3 x . os quais tˆm os seguintes significados: ca e ˆ Os descritores 1X.5 indica que a vari´vel deve ser impressa no formato de ponto flutuante. c a= 1 . ıda ˆ Os descritores F e E s˜o descritores de edi¸˜o de dados e eles se aplicam ao dados na lista de vari´veis (A.141592654 12 caracteres em detalhes na se¸˜o 9.7 na p´gina 136. por´m de maneiras mais organizadas: e program F o u t f o r m a t a d o i m p l i c i t none integer . b . 5 . na sa´ 1. A formata¸˜o dos dados de sa´ ´ determinada pela seq¨ˆncia de descritores ca ıda e ue de edi¸˜o (X. conforme determinada pelo especificador FMT=. f 9 . F7.4142136 c = 3. Exemplos de n´meros de ponto flutuante v´lidos s˜o: a a u a a 5 d´ ıgitos 7 d´ ıgitos 9 d´ ıgitos F7. 1 x . f 1 1 .c program F out i m p l i c i t none integer . b . 1 x .14159265358979 Observa-se que h´ um n´mero grande de espa¸os em branco antes e entre os valores dos resultados e todos a u c s˜o apresentados com o n´mero total de d´ a u ıgitos represent´veis para uma vari´vel real de dupla precis˜o. a .14286 1. b .41421356237310 3. b . 3 0 0 ) r e a l ( dp ) : : a . contando o ponto decimal e o sinal (se houver).1. f 9 . 0 dp ) c= 4 * atan ( 1 . a a a O programa a seguir apresenta os mesmos resultados.7: -. a . c end program F o u t f o r m a t a d o Agora.d o c u -tr a c k . 7 . B a ca a e C) na mesma ordem em que aparecem. 0 dp b= s q r t ( 2 . ’ b= ’ .142857142857143 1. a . parameter : : dp= SELECTED REAL KIND( 1 5 . 0 dp ) c= 4 * atan ( 1 . 9 ) ” . f 9 .4142136 3.1 o qual n˜o ´ obrigat´rio se o formato dos dados aparecer como segundo a e o elemento de um comando de E/S. 0 dp ) print ”( f 7 .141592654 Nos trˆs resultados. 0 dp / 7 . 7 . ou seja. ca a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 124 9. c print ” ( ’ a= ’ . c print ”( f 7 . F9. 5 ) ” . c end program F out Os resultados deste programa s˜o apresentados da seguinte maneira na tela do monitor: a 0.14286 7 caracteres 1 Discutido F9. o segundo argumento dos comandos WRITE indica a formata¸˜o na sa´ e ca ıda. 0 dp / 7 . F e E). Sa´ formatada na tela do monitor ıda Considera-se inicialmente o seguinte programa que realiza sa´ no formato livre na tela: ıda . b .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . f 7 . 1 x . ’ c= ’ . destinando 5 d´ e ıgitos para a parte fracion´ria da vari´vel A. 2 e 3) devem ser c deixados na sa´ dos dados. ca ca ˆ O descritor F7. 1 x . 2X e 3X indicam quantos espa¸os em branco (respectivamente 1.9 determina a edi¸˜o de C. ack c w o Tarefa 1. parameter : : dp= SELECTED REAL KIND( 1 5 . 0 dp ) print * . os resultados s˜o: a 0. 3 0 0 ) r e a l ( dp ) : : a . 9 .d o c u -tr . 2 x . 7 .5 determina a edi¸˜o da vari´vel A.

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

ˆ O descritor E11.5, que aparece na sa´ 2 determinando o formato de sa´ da vari´vel C, indica a sa´ ıda ıda a ıda na forma de ponto flutuante com parte exponencial. O resultado impresso (0.31416E+01) possui uma extens˜o total de 11 algarismos alfanum´ricos, contando o ponto decimal, o sinal (se houver), o s´ a e ımbolo da parte exponencial (E), o sinal da parte exponencial (+) e o seu valor, com duas casas decimais (01). Restam, ent˜o, somente 5 d´ a ıgitos para a parte fracion´ria. Caso a extens˜o total do descritor, descontado a a o n´mero de d´ u ıgitos na parte fracion´ria, n˜o for suficiente para imprimir a parte exponencial e mais o a a sinal, ocorre um estouro de campo, indicado pelos asteriscos nos resultados das vari´veis A e B. Exemplos a v´lidos de n´meros no formato exponencial s˜o: a u a
5 d´ ıgitos 6 d´ ıgitos

c u -tr a c k

.c

E11.5: 0.31416 E+01
11 caracteres

E13.6: -4. 430949 E-12
13 caracteres

ˆ Finalmente, as constantes de caractere ’A= ’, ’B= ’ e ’C= ’ que aparecem na formata¸˜o da sa´ 3 s˜o ca ıda a impressas ipsis literis na sa´ padr˜o e na mesma ordem em que aparecem, relativamente a si pr´prias e ıda a o a `s vari´veis. a

Uma exposi¸˜o completa de todos os descritores ´ realizada na se¸˜o 9.8 na p´gina 137. ca e ca a

Tarefa 2. Entrada formatada a partir do teclado
Entrada formatada a partir do teclado n˜o ´ uma tarefa muito pr´tica, pois uma instru¸˜o do tipo a e a ca READ(*,FMT=’(1X,F7.5,5X,F9.6,3X,F11.8)’)A, B, C iria requerer a digita¸˜o dos valores das vari´veis exatamente nas posi¸˜es assinaladas e com as extens˜es e ca a co o partes fracion´rias exatamente como determinadas pelos descritores. Por exemplo, se A= 2.6, B= -3.1 e C= a 10.8, seria necess´rio digitar a 2.60000 -3.100000 10.80000000

para preencher todos os d´ ıgitos e espa¸os determinados pelos descritores de formata¸˜o. c ca

Tarefa 3. Sa´ de dados em um arquivo ıda
Da mesma maneira que um programa-fonte ´ gravado em um arquivo situado no disco r´ e ıgido do computador, ´ poss´ gravar dados em arquivos a partir de um programa ou, de forma alternativa, ler dados contidos em e ıvel arquivos situados no disco. Para possibilitar acesso de E/S em um arquivo ´ necess´rio que o programador: e a
ˆ Identifique o nome do arquivo, fornecendo o caminho completo, caso o arquivo resida em um diret´rio o (pasta) distinto do programa execut´vel. a ˆ Informe ao sistema sobre o tipo de acesso e uso que ser´ feito do arquivo. a

´ ˆ Associe instru¸˜es individuais de leitura ou grava¸˜o com o arquivo em uso. E poss´ existir mais de um co ca ıvel arquivo simultaneamente acess´ para E/S, al´m das interfaces j´ utilizadas (teclado e monitor). ıvel e a
ˆ Quando as opera¸˜es de E/S estiverem conclu´ co ıdas, ´ necess´rio instruir ao sistema n˜o ´ mais necess´rio e a a e a acessar o(s) arquivo(s).

O programa exemplo a seguir grava informa¸˜es formatadas ao arquivo EX1.DAT. A extens˜o .DAT simplesmente co a identifica o arquivo como sendo de dados. Se o arquivo n˜o existir, este ´ criado e tornado acess´ a e ıvel; se ele existe, ent˜o os dados previamente contidos nele podem ser substitu´ a ıdos por novos. program Arq Sai i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 * atan ( 1 . 0 dp )
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008

o

m

Cap´ ıtulo 9. Comandos de Entrada/Sa´ de Dados ıda

125
w
w

k

lic

lic

k

to

bu

y

N

O W

!

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

open ( 1 0 , f i l e=”ex1 . dat ”) write ( 1 0 , fmt=”( f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ”) a , b , c close (10) end program Arq Sa i Alterando os valores das vari´veis A, B e C, altera-se os valores gravados no arquivo EX1.DAT. a Os comandos-chave neste exemplo s˜o: a OPEN(10, FILE="EX1.DAT"). O comando OPEN habilita acesso ao arquivo EX1.DAT para o sistema. O arquivo est´ situado no mesmo diret´rio que o programa e este ser´ criado caso n˜o exista previamente, sendo a o a a poss´ ent˜o a grava¸˜o no mesmo, ou, caso ele j´ exista, ter´ acesso de leitura e/ou escrita. ıvel a ca a a O n´mero 11 indica a unidade l´gica que ser´ acessada. Doravante, o arquivo EX1.DAT ser´ sempre u o a a identificado pelo programa atrav´s deste n´mero. e u O modo como o acesso ao arquivo ´ feito pode ser alterado de diversas maneiras. A se¸˜o 9.4 descreve e ca todos os especificadores poss´ ıveis do comando OPEN. WRITE(10, FMT="(F7.5,1X,F9.7,1X,F11.9)") A, B, C. Este comando ´ aqui utilizado no lugar de PRINT e para realizar um processo de escrita formatada no arquivo associado ` unidade l´gica 10. A formata¸˜o a o ca ´ fornecida pela lista de descritores de formata¸˜o que seguem a palavra-chave FMT=. O papel destes e ca descritores j´ foi esclarecido. a O comando essencialmente grava os valores das vari´veis A, B e C de maneira formatada no arquivo a associado ` unidade 10. a CLOSE(10). Finalmente, este comando informa ao computador que n˜o ser´ mais necess´rio acessar o arquivo a a a associado ` unidade l´gica 10 e que tal associa¸˜o deve ser interrompida. a o ca

c u -tr a c k

.c

Tarefa 4. Leitura/escrita de dados em arquivos. Vers˜o 1: n´ mero conhecido de a u linhas
O programa a seguir lˆ os dados gravados no arquivo EX1.DAT, criado a partir do programa ARQ_SAI, e usa e estes dados para definir valores de outros, os quais ser˜o gravados no arquivo EX2.DAT. a program A r q S a i 2 i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c ! Dados de e n t r a d a . r e a l ( dp ) : : d , e , f ! Dados de s a i d a . open ( 1 0 , f i l e=”ex1 . dat ” , status=” o l d ”) open ( 1 1 , f i l e=”ex2 . dat ” , status=”new ”) read ( 1 0 , fmt=”( f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ”) a , b , c print * , ”Os v a l o r e s l i d o s foram : ” print * , ”a= ” , a print * , ”b= ” , b print * , ”c= ” , c d= a + b + c e= b ** 2 + c o s ( c ) f= s q r t ( a ** 2 + b ** 3 + c * * 5 ) write ( 1 1 , fmt=” ( 3 ( e11 . 5 , 1 x ) ) ”) d , e , f end program A r q S a i 2 No programa ARQ_SAI_2 aparecem as seguintes instru¸˜es que ainda n˜o foram discutidas: co a STATUS="OLD/NEW". Estas cl´usulas, que aparecem nos comandos OPEN, indicam o status exigido para o arquivo a a ser acessado. STATUS="OLD" indica que o arquivo deve existir no momento de acesso. Caso isto n˜o a aconte¸a, ocorre uma mensagem de erro e o programa ´ interrompido. STATUS="NEW" indica que o arquivo c e n˜o deve existir previamente e, ent˜o, deve ser criado. Novamente, se estas condi¸˜es n˜o se cumprirem, a a co a o programa p´ra. a
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008

o

m

126

9.1. Comandos de Entrada/Sa´ ıda: introdu¸˜o r´pida ca a

k

lic

lic

k

to

bu

y

N

O W

!

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

READ(10, FMT="(F7.5,1X,F9.7,1X,F11.9)") A, B, C. Observa-se aqui o uso de uma entrada formatada com o comando READ. A formata¸˜o das vari´veis A, B e C j´ foi discutida. Deve-se enfatizar novamente que ca a a a formata¸˜o especificada pelo FMT= deve possibilitar a leitura correta dos dados no arquivo associado ` ca a unidade l´gica 10. o WRITE(11, FMT="(3(E11.5,1X))") D, E, F. O aspecto ainda n˜o abordado neste comando WRITE ´ o uso do a e contador de repeti¸˜o 3, o qual indica que as vari´veis D, E e F devem ser gravado no arquivo associado ` ca a a unidade 11 com a formata¸˜o dada por "E11.5,1X" repetido 3 vezes consecutivas. ca

c u -tr a c k

.c

Finalmente, deve-se mencionar que os comandos CLOSE(10) e CLOSE(11) n˜o foram utilizados. Isto ´ permitido, a e uma vez que, neste caso, a associa¸˜o das unidades l´gicas aos arquivos ser´ interrompida com o final da execu¸˜o ca o a ca do programa. Contudo, em certas situa¸˜es ´ necess´rio associar uma unidade l´gica previamente empregada a co e a o um outro arquivo, o que neste caso obriga o programador a fazer uso do comando CLOSE. Modifica¸˜es posteriores no programa necessitar˜o tamb´m a elimina¸˜o do arquivo EX2.DAT, devido ` co a e ca a cl´usula STATUS="NEW". a

Tarefa 5. Leitura/escrita de dados em arquivos. Vers˜o 2: n´ mero desconhecido a u de linhas
Quando o n´mero de linhas no arquivo de entrada n˜o ´ previamente conhecido, ´ necess´rio um procedimento u a e e a diferente daquele adotado na Tarefa 4. O programa 9.1 ilustra dois poss´ ıveis m´todos a ser adotados, os quais e utilizam as op¸˜es IOSTAT ou END do comando READ (se¸˜o 9.5). Em ambos, aloca-se inicialmente uma matriz co ca tempor´ria com o posto adequado e com um n´mero tal de elementos que seja sempre maior ou igual ao a u n´mero m´ximo de linhas que podem estar contidas no arquivo de entrada. Ap´s a leitura dos dados na matriz u a o tempor´ria, o n´mero de linhas no arquivo tornou-se conhecido e aloca-se, ent˜o, uma matriz definitiva com o a u a n´mero correto de elementos. O segundo exemplo faz uso de um r´tulo (se¸˜o 5.1.1), que embora n˜o seja um u o ca a procedimento recomendado em Fortran 90/95, ´ completamente equivalente ao primeiro exemplo. e Existem maneiras mais inteligentes de realizar esta tarefa, sem que seja necess´rio definir-se uma matriz a tempor´ria. Por´m, estas maneiras envolvem o uso de ponteiros e listas encadeadas (linked lists) os quais a e constituem recursos mais avan¸ados e que n˜o foram ainda abordados nesta apostila. c a Os exemplos abordados nas Tarefas 1 — 5 constituem um conjunto pequeno, por´m freq¨ente, de usos dos e u comando de E/S. A descri¸˜o completa destes recursos pode ser obtida nas se¸˜es 9.3—9.11 posteriores. ca co

9.2

Declara¸˜o NAMELIST ca

Em certas situa¸˜es, quando h´ por exemplo um n´mero grande de parˆmetros sendo transferidos em proco a u a cessos de E/S, pode ser util definir-se uma lista rotulada de valores destinados ` transferˆncia. O Fortran 90 ´ a e introduziu, com este fim, a declara¸˜o NAMELIST, que define um ou mais grupos de vari´veis referenciadas com o ca a mesmo nome. Esta declara¸˜o ´ empregada em conjunto com opera¸˜es de E/S executadas por comandos READ ca e co e WRITE. A forma geral da declara¸˜o, que pode aparecer em qualquer unidade de programa, ´: ca e NAMELIST /<nome-grupo-namelist>/ <lista-nomes-vari´veis> & a [[,] /<nome-grupo-namelist>/ <lista-nomes-vari´veis> [,] ...] a Como se pode notar, ´ poss´ definir-se mais de um grupo NAMELIST na mesma declara¸˜o. O primeiro campo e ıvel ca substitu´ ıvel: <nome-grupo-namelist> , ´ o nome do grupo para uso subseq¨ente nos comandos de E/S. A e u <lista-nomes-vari´veis> , como o nome indica, lista os nomes das vari´veis que comp˜e o grupo. N˜o podem a a o a constar desta lista nomes de matrizes mudas de forma assumida, ou objetos autom´ticos, vari´veis de caractere a a de extens˜o vari´vel, matrizes aloc´veis, pointers, ou ser um componente de qualquer profundidade de uma a a a estrutura que seja um ponteiro ou que seja inacess´ ıvel. Um exemplo v´lido de <lista-nomes-vari´veis> ´: a a e REAL :: TV, CARPETE REAL, DIMENSION(10) :: CADEIRAS ... NAMELIST /ITENS_DOMESTICOS/ CARPETE, TV, CADEIRAS Outro exemplo v´lido: a NAMELIST /LISTA1/ A, B, C /LISTA2/ X, Y, Z
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008

o

m

Cap´ ıtulo 9. Comandos de Entrada/Sa´ de Dados ıda

127
w
w

k

lic

lic

k

to

bu

y

N

O W

!

w
w

3 . : npt1 ) write ( * . npt1 . npt2 +1) npt2= npt2 + 1 end do 100 continue ! Linha i d e n t i f i c a d a com o r o t u l o 1 0 0 . ’ ( a ) ’ ) c h a r ! Metodo 2 : usando opcao END. fmt=” ( ’ Matriz 1 l i d a : ’ . i= 1 . i o s t a t= c o n t r o l e ) temp1 ( 1 . i= 1 . status =’ old ’ ) do read ( 1 0 . ack c w o .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . / . close (10) a l l o c a t e ( m a t r i z 2 ( 2 . i ) . npt1 ) ) m a t r i z 1= temp1 ( : .d o c u -tr . : npt2 ) print ’ ( ”Matriz 2 l i d a : ” . : ) . npt1 +1) i f ( c o n t r o l e < 0 ) exit ! F i n a l de a r q u i v o d e t e c t a d o . i 4 . * . ( m a t r i z 1 ( : . npt1 +1) . & ”Matriz 1 : ” . 3x . * . end= 1 0 0 ) temp2 ( 1 . m a t r i z 2 a l l o c a t e ( temp1 ( 2 . Usando a opcao END. npt1 ) deallocate ( temp2 ) ! L i b e r a e s p a c o de memoria ocupado por ! temp2 . npt1= 0 . ”Matriz 2 : ” . parameter : : dp= SELECTED REAL KIND( 1 5 . Usando a opcao IOSTAT . temp2 ( 2 . 3 . open ( 1 0 . a ) ’ .c Programa 9. status =’ old ’ ) do read ( 1 0 . a l l o c a t a b l e : : temp1 . dimension ( : . ”O numero t o t a l de l i n h a s l i d a s e ’ ’ : ” .2. npt1= npt1 + 1 end do close (10) a l l o c a t e ( m a t r i z 1 ( 2 .1: Programa que ilustra leitura de arquivo com n´mero desconhecido de linhas. ’ P r e s s i o n e ENTER/R T R para c o n t i n u a r . dat ’ . Declara¸˜o NAMELIST ca k lic lic k to bu y N O W ! w w w w . ! A l e i t u r a do a r q u i v o e r e a l i z a d a de 2 maneiras d i s t i n t a s : ! 1 . 1 x ) ) ’ . matriz1 . print ’ ( / . 3 0 0 ) integer : : c o n t r o l e . npt2 end program A r q S a i 3 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 128 9. i ) . usando ! matrizes temporarias . dat ’ . print ’ ( / . ! Metodo 1 : usando opcao IOSTAT . temp1 ( 2 . open ( 1 0 . i 4 ) ’ .d o c u -tr a c k . ! Estima um l i m i t e s u p e r i o r no numero ! de l i n h a s . i . / ) ”) print ’ ( 2 ( e10 . 1 0 0 0 ) . u ! **************************** PROGRAMA ARQ SAI 3 ****************************** ! Le um a r q u i v o de dados com um numero c o n h e c i d o de e l e m e n t o s por l i n h a . ! ! Autor : Rudi G a e l z e r ! Data : Maio /2008 ! program A r q S a i 3 i m p l i c i t none integer . temp2 . ! O programa e n t a o imprime na t e l a os dados e o numero de l i n h a s l i d o . npt2 +1) . ’ EU N read ( * . f i l e =’ ex3 . ! mas com um numero d e s c o n h e c i d o de l i n h a s no formato l i v r e . 1 0 0 0 ) ) ! Aloca m a t r i z e s t e m p o r a r i a s . npt2= 0 character ( len= 1 ) : : c h a r r e a l ( kind=dp ) . temp2 ( 2 . f i l e =’ ex3 . ( m a t r i z 2 ( : . / ) ’ print ’ ( 2 ( e10 . ! 2 . npt1 ) deallocate ( temp1 ) ! L i b e r a e s p a c o de memoria ocupado por ! temp1 . 1 x ) ) ’ . npt2 ) ) m a t r i z 2= temp2 ( : .

6. E poss´ e ca ıvel tamb´m definir-se o valor de e um elemento isolado ou de uma se¸˜o de matriz. (0. A lista de nomes e valores de um determinado grupo ´ e sempre encerrada com o caractere / inserido fora de uma constante de caractere. concedido atrav´s das declara¸˜es PUBLIC u e co ou PRIVATE. NO_DE_OVOS= 12 / Nota-se no registro acima que a ordem de atribui¸˜o de valores aos nomes n˜o deve ser a mesma da declara¸˜o ca a ca NAMELIST. Neste caso. I INTEGER. C NAMELIST /LISTA/ D. sendo cada nome seguido por sinais de igual e.d o c u -tr a c k .d o c u -tr . ao serem empregados em conjunto com um namelist. ou ser uma declara¸˜o ca ca ca de tipo impl´ ıcito que regule o tipo e esp´cie das vari´veis que iniciam com aquele caractere explicitado na e a declara¸˜o. podendo ser precedido ou seguido por espa¸os em branco. a vari´vel QUILOS_DE_ARROZ n˜o tem seu valor atribu´ no registro. nenhum membro seu pode ser declarado com o u atributo privado ou possuir componentes privados. na mesma ordem da declara¸˜o da <lista-nomes-vari´veis> . Assim. ca co NAMELIST /LISTA/ A. vindo ent˜o a lista dos nomes das vari´veis. o registro sempre ir´ iniciar com o caractere &. Um exemplo de sa´ u e ıda de um namelist ´: e INTEGER :: NUMERO. sem parˆmetros de esp´cie de tipo a e Na grava¸˜o (sa´ ca ıda) do registro. sem espa¸o. LISTA WRITE(6. Esta nota¸˜o a ca ca tamb´m ´ v´lida em registros de entrada. a a ent˜o pelo valor da vari´vel. mas sim o nome do grupo NAMELIST como segundo a parˆmetro posicional ou com o especificador NML= contendo o nome do grupo.9) /) NAMELIST /SAI/ NUMERO.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . I= 1. Contudo. Constantes de caractere a a c devem ser sempre delimitadas em registros de entrada. NML=SAI) o qual produz o seguinte registro no arquivo associado ` unidade l´gica 6: a o &SAI NUMERO=1 . ou qualquer sub-objeto. com os nomes ca a explicitamente escritos em letras mai´sculas. ca Um grupo namelist pode possuir o atributo p´blico ou privado. Os comandos READ e WRITE. pelo <nomea c grupo-namelist>.c ´ equivalente a uma unica declara¸˜o NAMELIST com os 6 nomes de vari´veis listados na mesma ordem acima. LITROS_DE_LEITE. a descrito na se¸˜o 6. precea didos por & e o nome do grupo. E. e e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. a Um exemplo de registro de entrada ´: e INTEGER :: NO_DE_OVOS. QUILOS_DE_ARROZ NAMELIST /FOME/ NO_DE_OVOS. se o grupo possuir o atributo p´blico. e ´ ca a Al´m disso. tal como um tripleto de subscritos.2. O registro ´ finalizado com o caractere /. e e Se o tipo. Al´m disso. esta declara¸˜o deve constar antes da declara¸˜o NAMELIST. n˜o possuem uma lista a expl´ ıcita de vari´veis ou constantes a ser transferidas. DIMENSION(10) :: LISTA= (/ 14. a lista de valores deve tamb´m seguir a ordem e ca a e ´ o tipo e esp´cie dos componentes constantes da declara¸˜o do tipo. Para se executar uma opera¸˜o de E/S em algum registro (como um arquivo. B. Comandos de Entrada/Sa´ de Dados ıda 129 w w k lic lic k to bu y N O W ! w w . sem alterar os valores dos demais ca elementos. Quando isso e a a ıdo acontece com uma ou mais vari´veis da lista o valor destas permanece inalterado. usando um designador de sub-objeto. por exemplo) que contenha ca um ou mais grupos namelist. Se a vari´vel for de tipo derivado. a Os valores de uma matriz podem ser atribu´ ıdos atrav´s do nome da mesma seguida por = e a lista de e constantes que ser˜o atribu´ a ıdos aos elementos da matriz de acordo com o ordenamento padr˜o da linguagem. LITROS_DE_LEITE. parˆmetro de tipo ou forma de uma vari´vel de um grupo ´ especificado em uma declara¸˜o na a a e ca mesma unidade de programa . seguido. QUILOS_DE_ARROZ READ(5. F . um objeto de um grupo NAMELIST pode tamb´m pertencer a outros grupos. 9*0 / Nota-se que os 9 elementos 0 do vetor LISTA s˜o registrados usando-se a nota¸˜o compacta 9*0. no lugar do especificador FMT=. ack c w o ´ E poss´ tamb´m continuar a mesma <lista-nomes-vari´veis> de um dado grupo em mais de uma declaıvel e a ra¸˜o contidas no campo de declara¸˜es da unidade de programa. todos os componentes do grupo s˜o escritos no arquivo especificado. LISTA=14. NML=FOME) O associado exemplo de registro (arquivo) de entrada ´: e &FOME LITROS_DE_LEITE= 5. os elementos do tripleto devem todos ser constantes inteiras escalares.

como j´ foi mencionado. 2 . Se o objeto ´ do tipo caractere e o valor tiver uma extens˜o menor u a e a que a declarada. ack c w o . nml= s a i ) print ’ ( / a ) ’ . 1 0 i 3 ) ’ . ” l i s t a 2 : ” . m e l e c t r o n . e n t ” . ” l i s t a 1 : ” . f i l e= ”Dados . ” L i s t a / c t e s / l i d a : ” write ( * . ” L i s t a / s a i / l i d a : ” write ( * . espa¸os em branco preenchem o restante do campo. l i s t a i n t 2 real . 5 . A lista de valores n˜o pode ter um n´mero excedente de ´ ca a u ıtens. x ) ) ’ . a l e a t o r i o s : ” . mas ela pode conter um n´mero inferior. v e t t e s print ’ ( / . nml= s a i ) read ( 1 0 . program Testa NAMELIST i m p l i c i t none integer . nomes de objetos e nomes de componentes s˜o interpretados sem considerar o a caso de capitaliza¸˜o. m e l e c t r o n .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . O coment´rio ´ introduzido. 1 0 i 3 ) ’ . a l e a t l i s t a i n t 1= l i s t a i n t 2 ** 2 l i s t a i n t 2= a l e a t * l i s t a i n t 2 write ( 1 1 .c &fome l i t r o s d e l e i t e= 10 . c vacuum logical : : tes character ( len= 1 0 ) : : nome namelist / fome / nome . l i s t a i n t 1 print ’ ( / . pi . l i s t a i n t 2 ! A l t e r a a l g u n s v a l o r e s e g r a v a as l i s t a s no a r q u i v o . nml= s a i ) write ( 1 1 . q u i l o s d e a r r o z namelist / s a i / numero . ”Para c o n f i r m a r : ” print ’ ( ”Vetor v e t t e s : ” . n o d e o v o s . c vacuum ! open ( 1 0 . 1 0 ( f 7 . l i t r o s d e l e i t e .d o c u -tr .2. status= ” o l d ”) open ( 1 1 . como ´ costumeiro a partir do caractere !. l i s t a i n t 1 . v e t t e s namelist / c t e s / t e s .ent que pode ser fornecido ao programa Testa_NAMELIST ´ o e seguinte: c u -tr a c k . l i t r o s d e l e i t e . Declara¸˜o NAMELIST ca k lic lic k to bu y N O W ! w w w w . coment´rios podem ser inclu´ a ıdos no registro de entrada em seguida a um nome a uma v´ ırgula que separa os nomes. n o d e o v o s= 2 4 . nml= c t e s ) ! Mostra na t e l a os v a l o r e s l i d o s . ” L i s t a de No . print ’ ( a ) ’ . nml= c t e s ) print ’ ( / a ) ’ . Se ocorrer uma m´ltipla atribui¸˜o de ca a u ca um mesmo objeto. dimension ( 1 0 ) : : a l e a t . v e t t e s= 1 . nml= fome ) ! V e r i f i q u e Dados . d a t . a e e O programa Testa_NAMELIST abaixo ilustra praticamente todos os recursos discutidos nesta se¸˜o a respeito ca de listas NAMELIST.d o Todos os nomes de grupos. parameter : : dp= SELECTED REAL KIND( 1 5 . f i l e= ”Dados . q u i l o s d e a r r o z= 1 2 . nml= fome ) print ’ ( / a ) ’ . o ultimo valor ´ assumido. integer . e e u l e r .5) n˜o podem constar no registro de entrada de um NAMELIST. 3 0 0 ) integer : : n o d e o v o s . e e u l e r . 1 0 ( f 4 . / . ´ e Por fim. ” L i s t a / fome / l i d a : ” write ( * . nml= fome ) read ( 1 0 . x ) ) ’ . l i s t a i n t 2 . Matrizes ou objetos de tamanho zero c (se¸˜o 6. end program Testa NAMELIST Um exemplo de arquivo de entrada Dados. dimension ( 1 0 ) : : l i s t a i n t 1 . 0 r e a l ( dp ) : : pi . c a l l random number ( a l e a t ) print ’ ( / . dat ”) read ( 1 0 . numero ! Note que q u i l o s d e a r r o z f o i i n i c i a l i z a d o . nome= ”Rancho ” / Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 130 9. nml= c t e s ) write ( 1 1 .

! E l e c t r o n r e s t mass ( g ) . ! Euler ’ s number . PI= 3. Cada linha ´ acessada por um n´mero. 4 * 8 . 9 9 7 9 2 4 5 8 e10 ! Speed o f l i g h t i n vacuum (cm/ s ) . Forma de acesso a um arquivo: direto ou seq¨encial. 9 . Cada unidade l´gica a u o possui muitas propriedades.4 Comando OPEN O comando OPEN ´ usado para conectar um dado arquivo a uma unidade l´gica. Contudo. usualmente: e a Uso Mensagens de erro Entrada padr˜o a Sa´ padr˜o ıda a Designa¸˜o ca stderr stdin stdout N´ mero da unidade l´gica u o 0 5 6 Sempre que poss´ ıvel. 1 0 9 3 8 2 1 5 e −28 . escrita ca ou ambas. Alguns arquivos pode ser acessados por ambos u os m´todos. 7 . dependendo do compilador. Estas compreendem leitura. neste caso. 3 * 5 . 8 . J´ outras m´ a ıdias permite acesso somente seq¨encial. 4 . uma mensagem de erro ´ gerada.14159265358979323846264338327950288419717 . Especifica o tipo de a¸˜o que pode ser executada sobre o arquivo. m e l e c t r o n= 9 . 9.0 / &c t e s t e s= . o que geralmente depende do processador e dos sistema operacional em uso.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . isto depende de conhecimento pr´vio a respeito dos n´meros-padr˜o das unidades l´gicas para e u a o E/S. a A sintaxe do comando ´: e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. a a e STATUS.d o c u -tr . Por exemplo. a e ACTION. O nome do arquivo conectado ` unidade. Estes s˜o: velho (old). n˜o ´ permitida escrita sobre um arquivo aberto somente para leitura. O n´mero m´ximo de arquivos que podem ser abertos simultaneamente para E/S tamb´m ´ especificado pelo u a e e manual do compilador. 1 0 . ´ recomendado evitar-se o uso de unidade pr´-conectadas.3 Unidades l´gicas o Em Fortran. como ´ o caso de uma fita magn´tica.d o c u -tr a c k . Se um arquivo ´ aberto para um tipo de a¸˜o e outro tipo ´ tentado. Estabelece o status de um arquivo. 2 . como ´ o caso de arquivos em discos remov´ e e ıveis ou discos r´ ıgidos. novo (new) substitui¸˜o (replace). u e e ´ Sequencial. at´ o seu final. FILE. Para sistemas linux. n˜o ´ necess´rio usar-se o comando e a e a OPEN. entre a ca outros. Os processos de leitura/escrita principiam no in´ do arquivo e seguem. denominado n´mero de grava¸˜o (record number) o qual e u u ca deve ser especificado no comando de leitura/escrita. / 9. O nome ´ especificado pelo comando OPEN. ack c w o . e e u l e r= 2 . 3 . Este n´mero a o u u deve ser positivo e est´ freq¨entemente limitado entre 1 e 100. o que torna o programa mais e e port´vel. um arquivo est´ conectado a uma unidade l´gica denotada por um n´mero inteiro.c &s a i numero= 5 0 . ıcio ¨ linha a linha. e ACCESS. Por exemplo. Freq¨entemente ´ poss´ e o u e ıvel pr´-conectar um arquivo antes que o programa comece a rodar. l i s t a i n t 2= 3 * 1 . Caso um arquivo tente ser acessado com um status incorreto. t r u e . as unidades pr´-conectadas s˜o. uma mensagem de erro e ca e ser´ gerada. . 6 . v e t t e s (4:8)= 5*2. 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2 8 7 4 7 1 3 5 2 6 6 2 4 9 7 7 5 7 2 5 . E o acesso usual. Comandos de Entrada/Sa´ de Dados ıda 131 w w k lic lic k to bu y N O W ! w w . c vacuum= 2 . l i s t a i n t 1= 1 . e Direto. 5 .

Se este especificador ´ omitido e a unidade n˜o ´ conectada a uma arquivo. linha a linha. ıda ’UNKNOWN’– Status do arquivo desconhecido. O status e a pode ser um dos seguintes: ’OLD’– Arquivo deve existir. formada por um conjunto de palavras-chave. ’NEW’– Arquivo n˜o deve existir. Se o especificador ´ omitido. ca e o Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 132 9. onde <rl> ´ uma express˜o inteira cujo valor deve ser positivo. Em ambos os casos. Comando OPEN k lic lic k to bu y N O W ! w w w w . e a ˆ Para arquivo de acesso direto. O especificador “FILE=” deve estar presente se ’NEW’ ou ’REPLACE’ s˜o especificados ou se ’OLD’ ´ a e especificado e a unidade n˜o est´ conectada. onde <fln> ´ uma express˜o de caractere que fornece o nome do arquivo. Neste caso. todas as entidades s˜o escalares e todos a a os caracteres s˜o da esp´cie padr˜o. A partir deste momento. a e a o a exceto no caso do especificador “FILE=”. onde <r´tulo-erro> ´ o r´tulo de um comando na mesma unidade de ˆmbito.<op-list>]) c u -tr a c k . a op¸˜o especifica o tamanho dos registros e ´ obrigat´rio. todos os brancos precedentes s˜o ignorados e. a RECL= <rl>. O arquivo ser´ criado pelo comando OPEN. ela pode aparecer em qualquer posi¸˜o no campo de argumentos do comando OPEN. ele a ca a a ser´ criado com o m´todo de acesso apropriado. este valor deve ser uma op¸˜o v´lida. ele ser´ criado com um a ca a a a conjunto de forma que incluem o forma especificada. e a Para um arquivo que j´ exista. ’SEQUENTIAL’– O arquivo ´ escrito/lido seq¨encialmente. Se o arquivo j´ existe. Em express˜es de caractere. Registros individuais podem ser especificados e atualizados sem alterar o restante do arquivo. caso o arquivo esteja em um diret´rio distinto do o diret´rio de trabalho. ele ser´ criado.d o c u -tr . onde <fm> ´ uma express˜o de caracteres que fornece os valores ’FORMATTED’ ou ’UNFORMATTED’. o o e a e especificador “STATUS=” deve ser especificado com o valor SCRATCH e o arquivo conectado ` unidade ir´ a a depender do sistema.c onde <int-exp> ´ uma express˜o escalar inteira que especifica o n´mero da unidade l´gica externa e <ope a u o list> ´ uma lista de especificadores opcional. ’REPLACE’– Se o arquivo n˜o existe. inclusive com o caminho. u ’UNFORMATTED’– Para conex˜o de acesso direto. este ser´ eliminado e um novo a a a a arquivo ´ criado com o mesmo nome. a a ACCESS= <acc>. O nome deve coincidir e a exatamente com o arquivo. Nos especificadores. onde <ios> ´ uma vari´vel inteira padr˜o que ´ fixada a zero se o comando executou corretae a a e mente e a um valor positivo em caso contr´rio. e a determinando se o arquivo deve ser conectado para E/S formatada ou n˜o formatada. e e a ’SCRATCH’– O arquivo ´ tempor´rio e ser´ deletado quando este for fechado com o comando CLOSE ou na e a a sa´ da unidade de programa. onde <status> ´ uma express˜o de caracteres que fornece o status do arquivo. o status ´ ent˜o alterado para ’OLD’. quaisquer letras mai´sculas s˜o convertidas `s correspondentes letras u a a min´sculas. o u ca tamanho do registro deve ser especificado por “RECL=”. o a a seu status se torna ’OLD’. depende do sistema. onde <acc> ´ uma express˜o de caracteres que fornece o valor ’SEQUENTIAL’ ou ’DIRECT’. Se o especificador ´ omitido. ack c w o .4. e u FORM= <fm>. Este ´ o valor padr˜o do especificador. a ERR= <r´tulo-erro>. Os especificadores s˜o: u a FILE= <fln>. Se a palavra-chave e “UNIT=” for inclu´ ıda. Um ca especificador n˜o pode aparecer mais de uma vez. a ca STATUS= <status>. o valor ’SEQUENTIAL’ ´ a e e e assumido. IOSTAT= <ios>. Se o arquivo ainda n˜o existe. e a caso este seja omitido.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Se o arquivo ainda n˜o existe. Para um arquivo a que j´ exista. o valor deve ser uma op¸˜o v´lida. os valores-padr˜o s˜o: e a a ’FORMATTED’– Para acesso seq¨encial. O significado das especifica¸˜es ´: co e ’DIRECT’– O arquivo consiste em registros acessados por um n´mero de identifica¸˜o.d o OPEN([UNIT=] <int-exp> [. para o o o e o a qual o controle do fluxo ser´ transferido caso ocorra algum erro na execu¸˜o do comando OPEN.

onde <del> ´ uma express˜o de caracteres que fornece os valores ’APOSTROPHE’. ca e a a ca Se o especificador ´ omitido. a op¸˜o especifica o tamanho m´ximo de um registro. co Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. os comandos WRITE. o valor padr˜o ´ ’NULL’. ’REWIND’ ou e a ’APPEND’. e ACTION= <act>. ele ´ interpretado a e como zero.10) pode ser usado para encontrar o tamanho de uma lista de E/S. O especificador somente pode aparecer em arquivos formatados. ca a ’NO’– Neste caso. PAD= <pad>. Se o arquivo ainda n˜o existe. Para um arquivo que j´ existe mas que n˜o est´ conectado. n˜o h´ restri¸˜o. o tamanho depende do sistema. e u e a e Um arquivo novo ´ sempre posicionado no seu in´ e ıcio. a c u -tr a c k . e ’APPEND’– O arquivo ´ posicionado logo ap´s o registro de final de arquivo. Este especificador determina o padr˜o para a interpreta¸˜o de brancos em a ca campos de entrada num´ricos. exceto na presen¸a de um especificador ADVANCE= ’NO’ e ca c uma das especifica¸˜es “EOR=” ou “IOSTAT=”. o valor padr˜o ´ ’ASIS’. onde <act> ´ uma express˜o de caracteres que fornece os valores ’READ’. mas o comando INQUIRE (se¸˜o a ca 9. a Se o especificados ´ omitido. Al´m disso. e ca ’REWIND’– O arquivo ´ posicionado no seu ponto inicial. e ca ca ser´ duplicado onde ele aparecer dentro de tal constante de caractere. A conex˜o e a a deve ser com E/S formatada. onde <bl> ´ uma express˜o de caracteres que fornece os valores ’NULL’ ou ’ZERO’. o tamanho do registro de entrada deve ser n˜o menor que aquele especificado pela lista a de entrada e pela formata¸˜o associada. ele ´ criado com um conjunto permitido de tamanhos de registros a e que incluem o valor especificado. PRINT e ENDFILE n˜o devem ser usados ca e a para esta conex˜o. o tamanho ´ o n´mero de caracteres para registros que contenham e u somente caracteres-padr˜o. o efeito da especifica¸˜o ’ASIS’ no posicionaa a a ca mento do arquivo ´ indeterminado. caracteres fora do padr˜o a e a ser˜o precedidos por valores da esp´cie. a ’WRITE’– Se esta especifica¸˜o ´ escolhida. ’QUOTE’ ou e a ’NONE’. Comandos de Entrada/Sa´ de Dados ıda 133 w w k lic lic k to bu y N O W ! w w . ca e a ’READWRITE’– Se esta especifica¸˜o ´ escolhida. para um arquivo que j´ exista. Em qualquer situa¸˜o. e a ’YES’– Um registro de entrada formatado ser´ considerado preenchido por brancos sempre que uma lista a de entrada e a formata¸˜o associada especificarem mais dados que aqueles que s˜o lidos no registro. Para um arquivo que j´ existe e que j´ est´ conectado: a a a ’ASIS’– O arquivo ´ aberto sem alterar a posi¸˜o corrente de leitura/escrita no seu interior. exceto que se o campo for completamente em branco. ’READ’– Se esta especifica¸˜o ´ escolhida. o comando READ n˜o pode ser usado. possibilitando a inclus˜o de e o a dados novos. o caractere correspondente ser´ usado para a a delimitar constantes de caractere escritos com formata¸˜o de lista ou com o uso da declara¸˜o NAMELIST. onde <pos> ´ uma express˜o de caracteres que fornece os valores ’ASIS’. e ´ opcional com um u ca a e valor padr˜o que depende do processador. A especifica¸˜o ’NONE’ ´ o valor padr˜o se este especificador for a ca ca e a omitido. o valor especificado deve ser permitido para o ca a arquivo. O m´todo de acesso deve ser seq¨encial e se o especificador ´ omitido. a – Para arquivos n˜o formatados. BLANK= <bl>. ’ZERO’– Os brancos s˜o interpretados como zeros. ’WRITE’ ou ’READe a WRITE’. onde <pad> ´ uma express˜o de caracteres que fornece os valores ’YES’ ou ’NO’. Nenhum caractere delimitador ser´ usado e nenhuma duplica¸˜o a e a ca ser´ feita se a especifica¸˜o for ’NONE’. Se ’APOSTROPHE’ ou ’QUOTE’ s˜o especificados.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . e a e POSITION= <pos>.c – Para arquivos formatados. o valor padr˜o depende do processador. e a DELIM= <del>.d o c u -tr . e ’NULL’– Os brancos s˜o ignorados.d o ˆ Para arquivo seq¨encial. ack c w o .

a palavra-chave ´ opcional. ERR= 10. FILE= ’SAIDA. ´ conectado ao n´mero de unidade l´gica 17. a palavra-chave ´ ca e opcional. & ACCESS= ’SEQUENTIAL’. o comando foi utilizado para leitura e e na entrada padr˜o. ACTION= ’WRITE’) Neste exemplo.DAT’. END= <end-label>. FILE= ’ENTRADA. ACCESS= ’DIRECT’. a a OPEN(14. RECL=IEXP.<lista>] e com o n´mero de unidade fica: u READ([UNIT=]<u>. onde <ios> ´ uma vari´vel inteira padr˜o que armazena o status do processo de leitura.DAT ´ aberto para escrita. Para caracteres n˜o padronizados. Sem o n´mero de unidade a o u l´gica o comando fica: o READ <format> [.DAT ´ aberto somente para leitura na unidade 14. NML= <grp>]) <lista> Os argumentos do comando s˜o os seguintes: a UNIT= <u>.DAT’. ERR= <err-label>][. um arquivo SAIDA. ADVANCE= <mode>] & [. [FMT=] <format>[. onde <format> ´ uma string de caracteres formatadores. O arquivo ´ diretamente acessado e e e deve ser um arquivo previamente existente. e <ios> > 0. ca e ERR= <err-label>. o caractere de a e e a branco que preenche o espa¸o restante depende do processador. Comando READ k lic lic k to bu y N O W ! w w w w . END= <end-label>] & [. quando ocorre um erro na execu¸˜o do comando. ack c w o . O r´tulo 10 deve pertencer a um o comando execut´vel v´lido. ca e FMT= <format>. STATUS= ’REPLACE’. EOR= <eor-label>][. quando o comando ´ executado sem erros. Esta op¸˜o somente existe no comando READ com acesso seq¨encial.d o O valor padr˜o se o especificador ´ omitido ´ ’YES’. e ca u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 134 9. SIZE= <size>][. ´ um r´tulo v´lido para onde o controle de fluxo ´ transferido quando ocorre um erro de e o a e leitura. ERR= 10.5.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . ca <ios> < 0. o e e u o arquivo ´ acessado linha a linha e ele j´ existe mas deve ser substitu´ e a ıdo. que usualmente ´ o teclado: a e READ*. o arquivo ENTRADA. IOSTAT= <ios>] & [. onde <u> ´ um n´mero de unidade l´gica v´lido ou “*” para a entrada padr˜o.d o c u -tr . quando uma condi¸˜o de final de registro ´ detectada em entrada sem avan¸o ou quando uma ca e c condi¸˜o de final de arquivo ´ detectada. c A seguir. a e a e Este comando ser´ agora generalizado para uma forma com ou sem unidade l´gica. Caso esta especifie u o a a ca¸˜o seja o primeiro argumento do comando. IOSTAT= <ios>. <lista> onde o asterisco “*” indica a entrada padr˜o e <lista> ´ a lista de vari´veis cujo valor ´ lido do teclado. Caso esta especifica¸˜o seja o segundo argumento do comando. 9. Os e a a valores poss´ ıveis s˜o: a <ios> = 0. STATUS= ’OLD’. ACTION= ’READ’) & c u -tr a c k . um r´tulo v´lido em Fortran ou “*” e o a para formato livre. At´ agora.5 Comando READ Este ´ o comando que executa a leitura formatada de dados. temos um exemplo do uso deste comando: OPEN(17. ´ um r´tulo v´lido para onde o controle de fluxo ´ transferido se uma condi¸˜o de final de e o a e ca arquivo ´ encontrada. REC= <int-exp>][.c Aqui.

<lista>] J´ a sintaxe mais geral do comando ´: a e WRITE([UNIT=]<u>. Caso esta especifica¸˜o e u o a ıda a ca seja o primeiro argumento do comando. Outro exemplo: a a READ(*. u c Estes 3 n´meros ser˜o atribu´ u a ıdos `s vari´veis A. os especificadores END e NML e o formato livre “*” n˜o a podem ser tamb´m usados. a e a Dado o seguinte exemplo: READ(14.7. e ca O nome <grp> n˜o ´ uma constante de caracteres e sim um nome v´lido em Fortran.d o c u -tr . O registro a deve ser composto por 3 n´meros reais designados pelos descritores F10. Se c˜ a e e e c ca a entrada sem avan¸o ´ usada. NML= <grp>. leitura com avan¸o. O comando lˆ uma constante de caractere porque o descritor a a e no formato ´ “A”. isto ´. ent˜o o arquivo deve estar conectado para acesso seq¨encial e o formato c e a u deve ser expl´ ıcito. onde <int-exp> ´ uma express˜o inteira escalar cujo valor ´ o n´mero de ´ e a e u ındice do registro lido durante acesso direto. NML= <grp>]) <lista> Os especificadores deste comando executam. na sua maioria. isto ´ a cada leitura o arquivo ´ avan¸ado em uma posi¸˜o. a palavra-chave ´ opcional. generalizado para sa´ formatada fica. e Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9.6 Comandos PRINT e WRITE Em compara¸˜o com o comando READ. REC=IEXP) A. com exce¸˜o dos seguintes. At´ agora. ERR= <err-label>][. o cursor na tela do monitor ir´ permanecer na e c a e a mesma linha h´ medida que a string STR ser´ lida. com exce¸˜o do ca ca especificador SIZE. A op¸˜o ’NO’ especifica que cada comando ca READ inicia um novo registro na mesma posi¸˜o. A op¸ao padr˜o ´ ’YES’. REC= <int-exp>. implementa entrada de dados sem avan¸o (nonca e c advancing I/O). os quais especificam fun¸˜es ligeiramente distintas: ca co UNIT= <u>. <lista> O mesmo comando. B. ADVANCE= ’NO’. ıda PRINT <format> [. SIZE= NCH) STR especifica que a leitura ´ sem avan¸o na unidade padr˜o. Em uma situa¸˜o normal. que usualmente ´ a e ıda a e tela do monitor: PRINT*.d o EOR= <eor-label>.7. Esta op¸˜o somente existe no comando READ com acesso seq¨encial e formatado e e ca u somente se a especifica¸˜o ADVANCE= ’NO’ tamb´m estiver presente. e SIZE= <size>. Comandos de Entrada/Sa´ de Dados ıda 135 w w k lic lic k to bu y N O W ! w w . Se REC estiver presente. a qual guarda o n´mero de caracteres lidos. B e C. e a a u Este especificador somente existe no comando READ e somente se a especifica¸˜o ADVANCE= ’NO’ tamb´m ca e estiver presente. [FMT=] <format>[. FMT= ’(3(F10. separados por um espa¸o em branco. ´ um r´tulo v´lido para onde o controle de fluxo ´ transferido se uma condi¸˜o de final de e o a e ca registro ´ encontrada. ADVANCE= <mode>] & [. foi usada somente forma do comando PRINT para a sa´ padr˜o de dados. onde <mode> possui dois valores: ’YES’ ou ’NO’.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . o cursor seria posicionado no in´ da e ca e c ıcio pr´xima linha na tela. ca e 9. onde <size> ´ uma vari´vel escalar inteira padr˜o. as mesmas fun¸˜es executadas pelos especificadores co do comando READ. IOSTAT= <ios>] & [. ca e c u -tr a c k . o comando WRITE suporta os mesmos argumentos.c ADVANCE= <mode>. ack c w o . C este comando especifica que o registro identificado pela vari´vel inteira IEXP seja lido na unidade 14. onde <grp> ´ o nome de um grupo NAMELIST previamente definido em uma declara¸˜o NAMELIST. isto ´. EOR= 12.1X))’. A vari´vel NCH guarda o comprimento da string e o r´tulo 12 indica o ponto onde o o a o programa deve se encaminhar se uma condi¸˜o de final de registro ´ encontrada. onde <u> ´ um n´mero de unidade l´gica v´lido ou “*” para a sa´ padr˜o. ’(A)’. REC= <int-exp>][. isto ´.

isto ´.7. mark2 . REC= <int-exp>. ADVANCE= ’NO’) ’Entrada: ’ Como a especifica¸˜o de escrita sem avan¸o foi escolhida.4 – 9. isto ´ a cada escrita. A op¸˜o ’NO’ especifica que cada comando ca WRITE inicia um novo registro na mesma posi¸˜o. ca <ios> < 0. A op¸˜o padr˜o ´ ’YES’.dat. Se REC estiver presente.F T= * ) name. o cursor passaria ao in´ da linha seguinte na tela.d o IOSTAT= <ios>. onde <mode> possui dois valores: ’YES’ ou ’NO’. FMT= ’(I4)’. ISTAT ´ uma vari´vel inteira que indica o status do e a processo de escrita. O programa ent˜o lˆ o nome de um estudante. WRITE(17. ADVANCE= <mode>.6. e <ios> > 0. na mesma linha do nome.c P O R M Notas RGA IMPLICIT N N O E C A A T R(LEN=20) : : name H R CE REAL : : mark1 . onde <ios> ´ uma vari´vel inteira padr˜o que armazena o status do processo de escrita. a e Considere o seguinte exemplo. onde <int-exp> ´ uma express˜o inteira escalar cujo valor ´ o n´mero de ´ e a e u ındice do registro a ser escrito durante acesso direto. o programa a seguir abre co um novo arquivo seq¨encial chamado notas. mark1 . IOSTAT= ISTAT.d o c u -tr . O processo de leitura e escrita ´ repetido ıda a e at´ que um estudante com o nome ’Fim’ ´ introduzido. mark3 IF (name == ’ Fim ’ )EXIT WRITE(UNIT=4. ERR= 10) IVAL aqui. mark1 . mark2 .FILE=’NOTAS. quando o comando ´ executado sem erros. em caso de erro. Outro exemplo seria: WRITE(*.F T= * ) name. quando ocorre um erro na execu¸˜o do comando. as notas e a m´dia final a a e em NOTAS.’(A)’. 0 M END DO CLOSE(UNIT=4) END P O R M Notas RGA 9. e e c u -tr a c k . finalmente. IVAL ´ a vari´vel cujo valor ´ escrito na e o e a e unidade 17. ou uma constante de caracteres que indica o formato ou um r´tulo que indica a linha onde se encontra um comando o FORMAT. o arquivo ´ avan¸ado em uma posi¸˜o. mark3 . quando uma condi¸˜o de final de registro ´ detectada em escrita sem avan¸o ou quando uma ca e c condi¸˜o de final de arquivo ´ detectada. mark3 OPEN (UNIT=4. ( mark1 + mark2 + mark3 ) / 3 . seguido por 3 u a e notas.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . mark2 . ´ um r´tulo v´lido para onde o controle de fluxo ´ transferido quando ocorre um erro de e o a e escrita. Em circunstˆncias normais. Como exemplo do uso dos comandos de E/S apresentados nas se¸˜es 9. Comando FORMAT e especificador FMT= k lic lic k to bu y N O W ! w w w w . ent˜o o arquivo deve estar conectado para acesso seq¨encial e o formato deve ıda c e a u ser expl´ ıcito. Os e a a valores poss´ ıveis s˜o: a <ios> = 0. o cursor ir´ permanecer na mesma linha que a string ca c a ’Entrada: ’. escrevendo.7 Comando FORMAT e especificador FMT= O especificador FMT= em um comando READ ou WRITE pode conter ou o s´ ımbolo de formato livre “*”. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 136 9. ’(I4)’ descreve format de dado inteiro com 4 d´ ıgitos. ca e ERR= <err-label>. * ) name. mark2 . ( mark1 + mark2 + mark3 ) / 3 . Se ca a e e e c ca a sa´ sem avan¸o ´ usada. mark3 . os especificadores END e NML e o formato livre “*” n˜o podem ser tamb´m usados.DAT’ ) DO READ( * .DAT e no monitor (sa´ padr˜o). mark1 . o fluxo ´ transferido ao r´tulo 10. as quais s˜o introduzidas pelo teclado (entrada padr˜o). Nota-se tamb´m a ıcio e o descritor de formato de constante de caracteres expl´ ıcito. Dado o seguinte exemplo. ack c w o . implementa sa´ de dados sem avan¸o (nonca e ıda c advancing I/O). 0 M WRITE(UNIT= * .

d o WRITE(17. etc) ou arquivo interno para as diferentes representa¸˜es de tipos de vari´veis suportados pela linguagem. Estes co ca a editores fornecem uma especifica¸˜o precisa sobre como os valores devem ser convertidos em uma string escrita ca em um dispositivo externo (monitor. B 10 FORMAT(’Valores: ’. J. e ca o ca 9. :.*)X.2I4.F8.2.3 a qual indica 10 constantes reais com 12 posi¸˜es ao todo e com precis˜o de 3 casas decimais cada. 2 objetos inteiros de 4 d´ c ıgitos em espa¸os entre c eles (2I4).2)’.8.F8. TR. S. finalmente.2(F15. L. ’c’.1 Contadores de repeti¸˜o ca Os descritores de edi¸˜o de dados podem ser precedidos por um contador de repeti¸˜o: uma constante inteira ca ca positiva (sem sinal). (I(J).F8.6. ca e Estes descritores ser˜o discutidos em mais detalhes a seguir. Um contador ca ca de repeti¸˜o tamb´m pode ser aplicado a um grupo de descritores de edi¸˜o. um espa¸o em branco (1X) a constante de caractere ’nome ’ e. somente a barra “/” pode ter um contador de repeti¸˜o associado. aberto em um exemplo anterior. SS. BN.F8. abordados na pr´xima se¸˜o.2))’. E. (I(J). J= 1.A7)’)I. X. alguns descritores de edi¸˜o j´ foram mencionados. F. etc). FMT= ’(2X. G. TL. descritores de edi¸˜o aparecem em uma lista separados por v´ co ca ırgulas e somente no caso em que a lista de E/S for vazia ou contiver somente matrizes de tamanho zero que os descritores podem estar totalmente ausentes. delimitado por parˆnteses: ca e ca e PRINT ’(4(I5. ca Descritores de controle: T.8 Descritores de edi¸˜o ca Nos exemplos apresentados nas se¸˜es anteriores. O.I5. a c O formato de E/S de dados ´ definido fazendo-se uso dos descritores de edi¸˜o. a 9. no exemplo: WRITE(*. B. J= 1.2X)) O comando WRITE acima usa o formato especificado no r´tulo 10 para escrever na sa´ padr˜o os valores das o ıda a vari´veis A e B. os descritores de edi¸˜o s˜o u u ca a interpretados de forma independente com rela¸˜o ao caso.DAT usando formato livre e atribuindo os valores `s vari´veis e a a X e Y.F8. Em um processador que suporta tanto caracteres mai´sculos quanto min´sculos.DAT. ES. J e STR de e a acordo com o formato especificado: “2 espa¸os em branco (2X).6). ack c w o . A. ca Descritores de edi¸˜o dividem-se em trˆs classes: ca e Descritores de edi¸˜o de dados: I.4) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. as trˆs vari´veis I. co Outro exemplo: READ(14. como no exemplo 10F12.”nome ”.I5.1X.2. D.I5. ou convertido de uma string em um dispositivo de entrada de dados (teclado. 7 caracteres de um c objeto de caracteres (A7)”. As vari´veis a ser realmente escritas s˜o tomadas da lista de E/S ap´s a lista de a a o especifica¸˜es do comando. CD-RW. A(J). co a Com algumas exce¸˜es. /. EN. Y Este comando lˆ dos valores do arquivo ENTRADA. etc) ou em um arquivo interno (disco r´ ıgido.c este comando escreve no arquivo SAIDA. Z. A(J). Comandos de Entrada/Sa´ de Dados ıda 137 w w k lic lic k to bu y N O W ! w w .2. SP.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Dos co a descritores de edi¸˜o restantes. Descritores de edi¸˜o de strings: H.FMT= 10)A. Finalmente.d o c u -tr . seguido por 2 espa¸os em branco (2X)”. STR c u -tr a c k . fita. P. “c” (onde c ´ uma constante de caractere).4) o que ´ equivalente a escrever: e PRINT ’(I5. impressora. BZ. O formato de sa´ pode ser descrito como: “2 instˆncias de: um objeto real com 15 colunas ao a ıda a todo com uma precis˜o de 6 casas decimais (F15.

4) o que equivale a escrever I(1).A(J).I(J+1). o Formato dos descritores de edi¸˜o de dados.2))’.<d>[E<e>] onde os campos <r>. a e a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 138 9. A tabela 9. ca Um descritor de edi¸˜o de dados pode assumir uma das seguintes formas em uma lista de formata¸˜o de ca ca E/S: [<r>]<c><w> [<r>]<c><w>.<m> [<r>]<c><w>.1: Descritores de edi¸˜o que convertem os tipos intr´ ca ınsecos. um novo registro ir´ come¸ar e a especifica¸˜o ca ca a c ca de formato ser´ repetida at´ que todos os elementos forem cobertos. J=1. Isto acontece. A(3) Contadores de repeti¸˜o como estes podem ser encadeados: ca PRINT ’(2(2I5. I(3). por´m <w> n˜o pode ser nulo. G. e <c> ´ um dos descritores: I. A(J).2) Pode-se ver que esta nota¸˜o possibilita compactar a formata¸˜o de E/S de dados. e <w> ´ o n´mero total de d´ e u ıgitos no campo (ou a largura do campo). A. e ca ele ´ assumido igual a 1.d o c u -tr . com exce¸˜o do descritor G. I(2).8. <w>. Se <r> for omitido. D. EN.1 apresenta uma descri¸˜o das ca convers˜es.2F8. ca ca Se uma especifica¸˜o de formato ´ usada com uma lista de E/S que cont´m mais elementos que o n´mero de ca e e u descritores de formata¸˜o. A(3).A(J+1). que pode converter qualquer tipo intr´ ca ınseco. B. (I(J).PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . O.2 Descritores de edi¸˜o de dados ca Cada tipo intr´ ınseco de vari´veis em Fortran ´ convertido por um conjunto espec´ a e ıfico de descritores.<d> [<r>]<c><w>. ES. no comando a e abaixo: PRINT ’(10I8)’.4. F.d o c u -tr a c k . Parˆmetros de a esp´cie de tipo n˜o podem ser especificados. 100) 9. I(3).8. por exemplo. J= 1. Descritores de edi¸˜o ca k lic lic k to bu y N O W ! w w w w . Se <w> for omitido.c Tabela 9. A(2). O significado dos campos ´ o seguinte: e a e <r> ´ o contador de repeti¸˜o. J= 1. (I(J). Descritor A B D E EN ES F G I L O Z Tipo de dados convertidos Caractere Inteiro de/para base bin´ria a Real Real com expoente Real com nota¸˜o de engenharia ca Real com nota¸˜o cient´ ca ıfica Real de ponto flutuante (sem expoente) Todos os tipo intr´ ınsecos Inteiro L´gico o Inteiro de/para base octal Inteiro de/para base hexadecimal Note tamb´m o la¸o DO implicado (implied-Do list) e c (I(J). incluindo os contadores de repeti¸˜o. L. ack c w o . A(1). <d> e <e> devem ser todos constantes inteiras positivas (sem sinal). Z. ´ assumido um valor e padr˜o que pode variar com o sistema. O seu valor pode variar entre 1 e 2147483647 (2**31 .1).

mas arredondamento pode ocorrer devido ` representa¸˜o finita de um n´mero pelo a a ca u computador. E<w>. u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9.<m>] e Z<w>[. I<w>. Valores negativos s˜o sempre e c a a a escritos com o sinal de menos.<m>]. o campo ´ preenchido por <w> asteriscos.<m> ´ interpretado exatamente da mesma forma que I<w>. Na entrada. G<w>. D<w>.<d>.<d>[E<e>] O campo <d> deve ser especificado com os descritores F. octal e u e a e hexadecimal. Comandos de Entrada/Sa´ de Dados ıda 139 w w k lic lic k to bu y N O W ! w w . onde o expoente sempre tem sinal e o indicador de expoente “E” ´ e omitido: -14. Z<w>[.<m>]. Para todos os descritores num´ricos. D<w>.<m>]) u Na sua forma b´sica. u e Inteiros tamb´m podem ser convertidos pelos descritores B<w>[. a string -14629ser´ lida pelo descritor F7.<d>[E<e>]. ca e Por exemplo. caso necess´rio.<d>.14629. D e G mesmo se <d> for zero. ca e Na sa´ os n´meros s˜o geralmente escritos deslocados para a direita no espa¸o de campo especificado por ıda u a c <w>. Espa¸os em branco ` esquerda s˜o u e c a a ignorados.<m>]. os <d> d´ u ıgitos mais ` direita ser˜o tomados como a parte fracioa a n´rio do n´mero. H´ outras duas formas de entrada de n´meros aceit´veis pelo descritor F<w>. O valor <m> pode ser zero.629E-2 ou sua forma variante. se o campo de escrita for muito estreito para conter o n´mero completo.<d>: a u a 1. F<w>. Neste caso. a string anterior ser´ convertida a a ao n´mero 0. como o n´mero u a ca u 14. Neste caso. G<w>. isto ´ feito preenchendo de espa¸os em branco ` esquerda. Para uma constante de caractere. a u a 2.629-2. Todos e os d´ ıgitos s˜o usados. Sob o controle do descritor F9. a qual envolve uma parte exponencial (se¸˜o 3. e u de acordo com a descri¸˜o fornecida. mesmo que alguns deles tenham que ser zeros. G<w>. gera um n´mero real de ponto flutuante.<d>. ack c w o . <e> ´ o n´mero de d´ e u ıgitos no expoente. G<w>. B<w>[.<d>[E<e>] F<w>. N´ meros reais (F<w>.1. Z<w>[. Estes s˜o e a similares ao descritor I. Trata-se da forma I<w>.<d>[E<e>]. O<w>[. O<w>[. ES<w>. E. Os descritores de edi¸˜o de dados tˆm as seguintes formas espec´ ca e ıficas: Tipo de dado Inteiro Real e Complexo L´gico o Caractere Descritores de dado I<w>[.<m>].29.<d>[E<e>].<d>[E<e>]. N´mero sem ponto decimal.3729.<m>].<d>. e ca E identifica um campo de expoente. ca Para impress˜o. onde <m> indica o n´mero m´ u ınimo de d´ ıgitos a ser impressos. c u -tr a c k .3729 com o descritor F8. respectivamente.<m>. o valor de <d> ´ ignorado.c <d> ´ o n´mero de d´ e u ıgitos ` direita do ponto decimal (os d´ a ıgitos significativos). Neste caso. O intervalo de <e> inicia em 1 mas o valor final depende do sistema. o campo <d> ser´ novamente ignorado e o n´mero na forma exponencial a u ser´ escrita na forma de ponto flutuante. O<w>[. uma forma alternativa deste descritor permite que o n´mero de d´ a u ıgitos a ser impressos sejam especificados exatamente.d o <m> ´ o n´mero m´ e u ınimo de d´ ıgitos que devem aparecer no campo (incluindo zeros precedentes). N´mero real na forma padr˜o.3 causa a transferˆncia do valor 9. I<w>. a leitura da string 9. independente do tamanho da e e e constante.<d>[E<e>] A[<w>]. o campo <w> ´ opcional.<d>[E<e>]. em cuja situa¸˜o o campo ser´ preenchido por brancos se o a ca a n´mero impresso for 0.<d>) u A forma b´sica. o valor -99 escrito sob o controle de I5 ir´ ser aparecer como -99. e c a N´ meros inteiros (I<w>[.3 aparecer´ como 099. o inteiro ser´ lido ou escrito no campo de largura <w> ajustado ` direita. o valor 99 impresso sob o controle de I5. Por exemplo.<m>].<d>[E<e>] L<w>.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a a a Representando um espa¸o em branco por . Na entrada de dados. O n´mero de d´ u ıgitos significativos ´ afetado se um fator de escala e ´ especificado para o descritor de edi¸˜o. O ponto decimal conta como uma a u posi¸˜o no campo. se a string possui um ponto decimal. O ponto decimal tamb´m ´ exigido. por´m destinados a representar o n´mero inteiro nos sistemas num´ricos bin´rio.d o c u -tr . Se o campo ´ todo composto por espa¸os em branco. E<w>.<m>]. O intervalo permitido para <m> inicia em 0 mas o valor final depende do sistema. O intervalo de <d> inicia em 0 mas o valor final depende do sistema. EN<w>.2 como -146. B<w>[. Na entrada os n´meros tamb´m deveriam ser lidos a partir da direita.<m>]. c a com o sinal contando como uma posi¸˜o no campo.<m>]. EN<w>.3).<d>[E<e>]. ES<w>. o registro ser´ lido como zero.

Assim.70E-03 a u a ou 21. o na entrada consiste de brancos opcionais. E<w>. O descritor de edi¸˜o ES implementa a nota¸˜o cient´ ca ca ıfica. Por exemplo.1234E + 24 ou . o ponto decimal. o descritor L7 permite que as strings . e O descritor de edi¸˜o EN implementa a nota¸˜o de engenharia. u u Os dois descritores n˜o necessitam ser idˆnticos. Assim.1234E + 1235. u Na segunda forma do descritor.1 seria convertido a 0. Ele atua de forma semelhante ao descritor E.8. o n´mero 1. E<w>.70-003. Por outro lado. temos os seguintes resultados no processo de escrita: Descritor A A11 A8 Registro escrito TEMPORARIO TEMPORARIO TEMPORAR c u -tr a c k . ack c w o . dada a palavra TEMPORARIO.<d>E<e> e ´ uma maneira mais apropriada de ca e transferir n´meros abaixo de 0.1. ca ca exceto que na sa´ o expoente decimal ´ m´ltiplo de 3.). este ´ escrito com os caracteres e e mais ` esquerda. o sinal (se for negativo). (note o ponto).d o c u -tr . O descritor de edi¸˜o E possui duas formas. um dos caracteres T ou F ir´ aparecer na posi¸˜o mais ` direita do campo. Esta forma ´ obrigat´ria para n´meros cujos expoentes tˆm valor absoluto maior que 999. a parte inteira ´ maior ou igual a 1 e menor que 1000 ıda e u e e o fator de escala n˜o tem efeito. usando-se o campo <w> pode-se determinar o tamanho desejado da string lida ou escrita. as seguintes formas ser˜o geradas: a a Descritor A A11 A8 Autor: Rudi Gaelzer – IFM/UFPel Registro lido TEMPORARIO TEMPORARIO TEMPORAR Impresso: 27 de maio de 2008 o m 140 9. Assim. E<w>.0 ir´ a a aparecer como 11. a ca a Vari´veis de caracteres A[<w>] a Valores de caracteres podem ser editados usando o descritor A com ou sem o campo <w>.<d>. seguido por T ou F.3 ir´ aparecer escrito como 10.01 ou acima de 1000. Na sa´ com o a e a ıda descritor E<w>.234 × 101234 . EN<w>.1. Os dois descritores podem ser separados por uma constante de caracteres e descritores de controle de edi¸˜o.<d>. al´m dos d´ e ıgitos. sob o controle do descritor F8. os valores s˜o arredondados seguindo as regras normais de aritm´tica.<d>[E<e>]. Assim. o n´mero 0.<d>[E<e>]. medido em termos do n´mero de caracteres de qualquer esp´cie.934 e sob o controle de F4. a u a N´ meros complexos (F<w>. a letra E (caso poss´ ıvel). e .17E-02 ou 2.8. uma string de caractere contendo a parte inteira com valor absoluto menor que um e quatro caracteres que consistem ou no E seguido por um sinal e dois d´ ıgitos ou de um sinal seguido por trˆs d´ e ıgitos. apareceria *********. caso se tentasse imprimir o n´mero anterior com o descritor F9. Note u o que agora o valor de <w> deve ser grande o suficiente para acomodar.FALSE. u A forma contendo a letra E n˜o ´ usada se a magnitude do expoente exceder 99.1234 − 149. com o descritor E12. quando o campo do descritor ´ menor que o tamanho real do registro. E10. ES<w>.c Ou seja.4 ir´ imprimir a e a o n´mero 1. Assim. sejam lidas com o seu significado correto. a Na sa´ de dados. este caractere pode ser seguido por caracteres adicionais.234 × 10−150 como . convertido pelo descritor E10.4E4 ´ transferido como a string .<d> e E<w>.TRUE. opcionalmente seguidos por um ponto decimal. o campo <e> determina o n´mero de d´ u ıgitos no expoente.4.0217 transferido sob EN9. u As regras para estes descritores na entrada de dados s˜o idˆnticas `s do descritor F<w>. Descritores de edi¸˜o ca k lic lic k to bu y N O W ! w w w w . o n´mero e o u e u 1.1E+03.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .4 vai gerar a string .2 ser´ convertido a 21.<d>[E<e>].234 × 1023 . Na sa´ ıda. este define um campo de tamanho <w> o qual.<d>) u N´meros complexos podem ser editados sob o controle de pares dos mesmos descritores de n´meros reais. Sem o campo. D<w>.2 ser´ convertido a 2. Assim. O valor complexo (0.<d>E<e>. em caso de leitura da mesma string.d o Estas propriedades aplicam-se ` entrada de dados.1 . Opcionalmente.<d>. Por exemplo. o valor ıda a e 10. Ele atua de forma semelhante ao descritor E. u e Por outro lado.100. ca Valores l´gicos (L<w>) o Valores l´gicos podem ser editados usando o descritor L<w>. Alguns processadores p˜e um zero antes do ponto decimal. o sinal do expoente e o expoente. o n´mero 0.1234 + 024. Assim.9336. convertido sob o controle de a e F6. exceto que na sa´ o valor absoluto da parte inteira ´ maior ou igual a 1 e menor que 10 e o fator de escala ıda e n˜o tem efeito.17E-002. a largura do campo de entrada ou sa´ ´ determinado pelo tamanho real do ´ ıda e ıtem na lista de E/S.0217 transferido sob ES9.

<d>[E<e>]. Isto n˜o denota um a campo de tamanho nulo. como em I0 ou F0.1 − 0. Este recurso existe para que o programador n˜o precise se preocupar se o tamanho de um campo ´ a a e suficiente para conter o dado.A)’)TEXTO Edi¸˜o de tamanho m´ ca ınimo de campo c u -tr a c k . em cuja situa¸˜o o uso padr˜o destes descritores iria gerar uma sa´ composta ca a ıda somente por asteriscos. ca Tipos derivados Valores de tipos derivados s˜o editados pela seq¨ˆncia apropriada de descritores de edi¸˜o correspondentes a ue ca aos tipos intr´ ınsecos dos componentes do tipo derivado. ack c w o . pode ser transe a a e ferida a um arquivo de sa´ inserindo-a na especifica¸˜o de formato. Como exemplo. ca e e a ıda quando a magnitude (n) do valor est´ no intervalo a 0. sem um parˆmetro de esp´cie especificado. O e Z podem especificar um tamanho de campo igual a zero. os descritores ıvel c a I.8. Descritores de edi¸˜o de string de caracteres n˜o podem ser usados em ca a entrada de dados.5 ou zero quando <d>= 0. B. Esta forma ´ util para escrever valores cujas magnitudes n˜o a e´ a s˜o bem conhecidas previamente e quando a convers˜o do descritor F ´ prefer´ ` do descritor E. Quando usado para os tipos real ou complexo. exceto que na sa´ de dados.c Para possibilitar que os registros de sa´ contenham o m´ ıda ınimo poss´ de espa¸o n˜o usado. l´gico e de caracteres. mas um campo com o tamanho m´ ınimo necess´rio para conter o valor de sa´ em a ıda quest˜o. Comandos de Entrada/Sa´ de Dados ıda 141 w w k lic lic k to bu y N O W ! w w .3. o ca u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. este descritor ´ o unico que pode ser usado para transmitir outros tipos de caracteres.d o c u -tr . F. como no exemplo: ıda ca PRINT”(’Este ´ um exemplo!’)” e O qual vai gerar o registro de sa´ ıda: Este ´ um exemplo e cada vez que o comando seja executado. o Descritor geral G<w>.5 × 10−<d>−1 ≤ n < 10<d> − 0. a a e ıvel a Quando o descritor G ´ usado para os tipos inteiro. s˜o convertidas como com o descritor F. e e ´ distintos dos caracteres padr˜es. seguidos pelo mesmo n´mero de brancos que a u o descritor E teria reservado ` parte exponencial.<d>[E<e>] O descritor de edi¸˜o geral pode ser usado para qualquer tipo intr´ ca ınseco de dados. Al´m disso. TYPE :: STRING INTEGER :: COMP CHARACTER(LEN= 20) :: PALAVRA END TYPE STRING TYPE(STRING) :: TEXTO READ(*. ele segue as regras dos respectivos e o descritores de edi¸˜o . ’(I2.3 Descritores de controle de edi¸˜o ca Um descritor de controle de edi¸˜o age de duas formas: determinando como texto ´ organizado ou afetando ca e as convers˜es realizadas por descritores de edi¸˜o de dados subseq¨entes.d o Todos os caracteres transferidos sob o controle de um descritor A ou A<w> tˆm a esp´cie do ´ e e ıtem na lista de E/S. 9. Descritor de edi¸˜o de string de caracteres ca Uma constante de caracteres da esp´cie padr˜o. a sua a¸˜o ´ idˆntica ` do descritor E<w>.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .

Na sa´ ıda. Exemplos. dois pontos (:) e a barra (/). <n>X S. BN. SS. O intervalo de <n> inicia em 1 at´ ca a e e um valor que depende do sistema. Este n´mero n˜o pode ser uma vari´vel. o descritor posiciona o registro externo a ser lido na posi¸˜o de caractere especificada por <n>. A unica exce¸˜o ´ a barra (/). estes descritores n˜o executam a convers˜o e transferˆncia de caracteres propriamente dita. a qual pode ´ ca e tamb´m ser precedida por um contador de repeti¸˜o. / c u -tr a c k . e Edi¸˜o T ca O descritor T especifica uma posi¸˜o de caractere em um registro de E/S. BZ <k>P :. Ele toma a seguinte forma: ca T<n> onde <n> ´ uma constante positiva que indica a posi¸˜o de caractere do registro.. Suponha que um arquivo possua um registro contendo o valor ABC leitura seja executado: CHARACTER(LEN= 3) :: VALOR1. Na entrada. SP. Se caracteres s˜o transferidos a posi¸˜es na posi¸˜o especificada por um a a co ca destes descritores. ack c w o . TR<n>.A3. ca Na sa´ ıda.c O descritor P ´ uma exce¸˜o ` sintaxe geral dos descritores.8. ca Descritores de controle de edi¸˜o tamb´m podem ser agrupados em parˆnteses e precedidos por um contador ca e e de repeti¸˜o do grupo. TL.d o c u -tr . Em processadores Intel de 32 bits. TL<n>. BZ. Descritores de edi¸˜o ca k lic lic k to bu y N O W ! w w w w . SS BN. ca Edi¸˜o posicional ca Os descritores T. por exemplo. o maior valor ´ <n>= e 2**15 . deve ser uma constante e u co u a a inteira positiva sem especifica¸˜o de parˆmetro de esp´cie de tipo. VALOR2 . Ele ´ precedido por um fator de escala (<k>). P. TL. ou ap´s esta. e ca Os descritores de controle possuem a seguintes formas espec´ ıficas quanto `s suas fun¸˜es: a co Tipo de controle Posicional Sinal Interpreta¸˜o de brancos ca Fator de escala Miscelˆneo a Descritores de controle T<n>. posi¸˜es saltadas e que n˜o eram previamente preenchidas por brancos passam o co a a ser preenchidas.T1. S.1. X. VALOR2 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 XYZe o seguinte comando de o m 142 9. TR. e o <n> ´ um n´mero de posi¸˜es de caracteres. descritores de controle de edi¸˜o n˜o s˜o repet´ ca a a ıveis. TR e X especificam a posi¸˜o onde o pr´ximo caractere ´ transferido de ou para um ca o e registro. al´m a a e e de n˜o afetarem o tamanho do registro.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . Em geral. O resultado ´ como se o registro por completo estava inicialmente preenchido por brancos.A3)’)VALOR1.d o Formato dos descritores de controle de edi¸˜o ca Um descritor de controle de edi¸˜o pode assumir uma das seguintes formas em uma lista de formata¸˜o de ca ca E/S: <c> <c><n> <n><c> onde: <c> ´ um dos seguintes c´digos de formato: T. READ(11.’(T7. SP. relativa ao limite ` esquerda e ca a do tabulador. o descritor indica que a transferˆncia de dados inicia na <n>-´sima posi¸˜o de caractere do registro e e ca externo. em e ca a e vez de um especificador de posi¸˜o..

Se e e ca a <n> ´ maior ou igual ` posi¸ao corrente. e e ca a Edi¸˜o X ca O descritor X especifica uma posi¸˜o de caractere ` direita da posi¸˜o corrente no registro de E/S.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .T21.T21. a Suponha agora que o seguinte comando seja executado: PRINT 25 25 FORMAT(T51. e a c˜ o e Exemplo.’COLUNA 1’. Comandos de Entrada/Sa´ de Dados ıda 143 w w k lic lic k to bu y N O W ! w w . ack c w o .d o Os valores lidos ser˜o VALOR1= ’XYZ’ e VALOR2= ’ABC’. O ca a ca descritor toma a seguinte forma: TR<n> onde <n> ´ uma constante inteira positiva indicando a <n>-´sima posi¸˜o ` direita do caractere corrente.’COLUNA 2’.TL20. a ca ca de formato. Este ca a ca descritor ´ equivalente ao descritor TR. O ca a ca descritor toma a seguinte forma: TL<n> onde <n> ´ uma constante inteira positiva indicando a <n>-´sima posi¸˜o ` esquerda do caractere corrente. Este ´ o comportamento padr˜o na sa´ de dados.d o c u -tr . No exemplo anterior.’COLUNA 1’) a seguinte linha ´ impressa na tela do monitor (ou na sa´ padr˜o): e ıda a 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | | COLUNA 1 COLUNA 2 c u -tr a c k . temos: PRINT 25 25 FORMAT(T51.’COLUNA 3’) o que gera na tela: 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | | | COLUNA 3 COLUNA 1 COLUNA 2 Edi¸˜o TR ca O descritor TR especifica uma posi¸˜o de caractere ` direita da posi¸˜o corrente no registro de E/S. Isto ocorreu porque o primeiro caractere do registro impresso foi reservado como um caractere de controle.c Deve-se notar que as constantes de caractere foram impressas iniciando nas colunas 20 e 50 e n˜o nas colunas 21 a e 51. o pr´ximo caractere acessado ´ o primeiro caractere do registro.’COLUNA 2’. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. e a ıda Edi¸˜o TL ca O descritor TL especifica uma posi¸˜o de caractere ` esquerda da posi¸˜o corrente no registro de E/S. O descritor X toma a seguinte forma: e <n>X onde <n> ´ uma constante inteira positiva indicando a <n>-´sima posi¸˜o ` direita do caractere corrente. Na e e ca a sa´ este descritor n˜o gera a grava¸˜o de nenhum caractere quando ele se encontra no final de uma especifica¸˜o ıda.

PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . e u O descritor toma a forma simples S Interpreta¸˜o de brancos ca Os descritores BN e BZ controlam a interpreta¸˜o de brancos posteriores embebidos dentro de campos de ca entrada num´ricos. ack c w o . Edi¸˜o BN ca O descritor BN for¸a o processador a ignorar todos os brancos posteriores embebidos em campos de entrada c num´ricos. e a e ca ıda Dentro de uma especifica¸˜o de formato. Estes descritores n˜o tˆm efeito durante a execu¸˜o de comandos de entrada de dados. EN. D e G at´ que outro descritor de edi¸˜o de brancos seja inclu´ na u e ca ıdo formata¸˜o. O descritor toma a forma simples SS Edi¸˜o S ca O descritor S retorna o status do sinal de mais como opcional para todos os campos num´ricos subseq¨entes.8. O descritor toma a forma simples: e BN Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 c u -tr a c k . um descritor de edi¸˜o de sinal afeta todos os descritores de dados ca ca subseq¨entes I.d o Edi¸˜o de sinal ca Os descritores S. e a e ca Dentro de uma especifica¸˜o de formato.d o c u -tr . ca Os descritores de edi¸˜o de brancos sobrep˜e-se ao efeito do especificador BLANK durante a execu¸˜o de um ca o ca comando de entrada de dados. B. E. Um campo todo composto de brancos ´ tratado como zero. EN. O. D e G at´ que outro descritor de edi¸˜o de sinal seja inclu´ na formata¸˜o. E.c o m 144 9. um descritor de edi¸˜o de brancos afeta todos os descritores de ca ca dados subseq¨entes I. ES. ca a e Edi¸˜o BZ ca O descritor BZ for¸a o processador a interpretar todos os brancos posteriores embebidos em campos de c entrada num´ricos como zeros. F. Descritores de edi¸˜o ca k lic lic k to bu y N O W ! w w w w . u e ca ıdo ca Edi¸˜o SP ca O descritor SP for¸a o processador a produzir um sinal de mais em qualquer posi¸˜o subseq¨ente onde ele c ca u seria opcional. Z. Estes descritores n˜o tˆm efeito durante a execu¸˜o de comandos de sa´ de dados. ES. F. SP e SS controlam a sa´ do sinal de mais (+) opcional dentro de campos de sa´ ıda ıda num´ricos. O descritor toma a forma simples SP Edi¸˜o SS ca O descritor SS for¸a o processador a suprimir um sinal de mais em qualquer posi¸˜o subseq¨ente onde ele c ca u seria opcional. O descritor toma a forma simples: e BN O campo de entrada ´ tratado como se todos os brancos tivessem sido removidos e o restante do campo ´ escrito e e na posi¸˜o mais ` direita.

cont´m e um expoente expl´ ıcito. o efeito do fator de escala depende em que tipo de edi¸˜o ca real est´ associada com o mesmo.1) Note que se o fator de escala precede imediatamente o descritor real associado. Para redefinir a escala a zero.F6. um fator de escala positivo move o ponto decimal para a esquerda e um fator negativo move o ponto decimal para direita. Comandos de Entrada/Sa´ de Dados ıda 145 w w k lic lic k to bu y N O W ! w w . e Na sa´ ıda. todos os seguintes formatos tˆm o mesmo efeito: e (3P. o fator de escala n˜o tem efeito se a magnitude do dado a ser impresso est´ dentro do ca a a intervalo efetivo do descritor. D.614E2 37.701E+02 -2. ˆ Para edi¸˜o G. co a A seguinte tabela apresenta alguns exemplos do uso do especificador <k>P na entrada de dados: Formato 3PE10. alterando a magnitude do dado.c O descritor P especifica um fator de escala. o fator de escala n˜o tem efeito.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .03E+04 O exemplo a seguir tamb´m usa edi¸˜o P: e ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. e e u co para a esquerda ou para a direita. o qual move a posi¸˜o do ponto decimal em valores reais e das ca duas partes de valores complexos. Por exemplo.4 37614.614 Valor interno . o valor interno do dado lido na lista de a E/S ´ igual ao campo externo multiplicado por 10−<k> .3.d o Edi¸˜o de fator de escala P ca c u -tr a c k .5 -3PE10. o valor externo iguala o valor interno da lista de E/S multiplicado por 10<k> . alguns exemplos de sa´ de dados usando o descritor P: ıda Formato 1PE12. e Na entrada. ack c w o . um fator de escala 2P multiplica um valor e de entrada por 0. ˆ Para edi¸˜es EN e ES. a v´ ırgula ´ opcional.037614 3761.I6.E8.139 Valor interno -2. o campo decimal externo da lista de E/S ´ multiplicado por 10<k> e <k> ´ subtra´ do co e e ıdo expoente. Um fator de escala positivo diminui o expoente. mas n˜o necessariamente ca a deve preceder o descritor propriamente dito. <k> deve ser menor que <d>+2 sen˜o a ocorrer´ um erro no processo de convers˜o de sa´ a a ıda. EN.3. Para fator de escala positivo.1) (I6. Por exemplo. o valor do fator de escala ´ zero. Quando um campo de entrada. Se a magnitude estiver fora do intervalo efetivo do descritor. que o ponto decimal deve se mover (o fator de escala). E.3PF6. e No in´ de um comando de E/S formatado. Se um descritor de escala ´ ıcio e e especificado. o qual afeta todos os descritores de edi¸˜o de dados reais subseq¨entes e ca u at´ que outro descritor de escala ocorra. Neste caso. ES ou G. alterando a ca magnitude do dado. como segue: a ˆ Para edi¸˜o F.0 O fator de escala deve preceder o primeiro descritor de edi¸˜o real associado com ele. O descritor toma a forma <k>P onde <k> ´ uma constante inteira com sinal (o sinal ´ opcional. ˆ Para edi¸˜es E e D. um fator de escala positivo move o ponto decimal para a direita e um fator de escala negativo move o ponto decimal para a esquerda.139 -270.01. o fator de escala n˜o tem efeito. um fator de escala negativo aumenta o expoente.139 -270. movendo o ponto decimal duas posi¸˜es ` esquerda. deve-se obrigatoriamente especificar 0P.1) (I6. movendo o ponto decimal duas posi¸˜es ` direita. usando os descritores F. Nos outros casos.2 Campo de entrada -270.3 1PE12. o fator de escala ´ fixado. edi¸˜o E ´ ca e usada e o fator de escala tem o mesmo efeito como neste caso.d o c u -tr . se positiva) especificando o n´mero de posi¸˜es.2 -1PE12.5 3PE10.614 37.5 Campo de entrada 37.E8.F6.E8.3P. co a A seguir. Um fator de escala -2P multiplica o co a valor de entrada por 100.3.70E+02 -0. O intervalo de valores de <k> ´ de -128 a 127.

13 1 FORMAT(’ I=’. iniciadores ou finalizadores de registros.F8. o valor m´ximo ´ <r>= 2**15-1.00 2500.I2. A primeira barra termina o registro corrente.00 2500.d o REAL.2.8. F8. 3 PRINT 2. ca A forma que o descritor toma ´: e [<r>]/ onde <r> ´ um contador de repeti¸˜o.I2) as seguintes linhas aparecem na sa´ ıda: I= 3 J= K=13 Se houver ´ ıtens de E/S restantes. porque o parˆnteses inicial e final da especifica¸˜o e ca de formato s˜o. como segue: ˆ Quando n barras consecutivas aparecem entre dois descritores de edi¸˜o. o descritor tem a a¸˜o de iniciar uma nova linha. Por exemplo.T51.1 registros brancos s˜o gerados na sa´ a ıda. dado a seguinte formata¸˜o de sa´ ca ıda: WRITE(6.2) resultando os seguintes valores gravados na unidade 6: 25.’Linha Cabe¸alho’//T51.c Edi¸˜o com barra (/) ca O descritor / termina a transferˆncia de dados para o registro corrente e inicia a transferˆncia de dados para e e um registro novo. Em e ca e processadores intel de 32 bits. respectivamente a Por exemplo.d o c u -tr . o descritor : n˜o tem efeito.I2) 2 FORMAT(’ K=’. A segunda barra termina o primeiro pulo ou registro em branco e assim por diante. ˆ Quando n barras consecutivas aparecem no in´ ou final de uma especifica¸˜o de formato. Em um arquivo ou na tela.00 2500. Descritores de edi¸˜o ca k lic lic k to bu y N O W ! w w w w .0 WRITE(6.00 c u -tr a c k . n .00 2500. ack c w o . supondo os seguintes comandos: PRINT 1.2. DIMENSION(6) :: A= 25.’ J=’. por si mesmos. a e M´ltiplas barras for¸am o sistema a pular registros de entrada ou a gerar registros brancos na sa´ u c ıda.:.I2.00 2500.2PF8.10) A 10 FORMAT(’ ’.’ L=’.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 146 9. O intervalo de <r> inicia em 1 at´ um valor que depende do sistema.’Sublinha Cabe¸alho’//) c c ir´ gerar os seguintes registros no arquivo: a 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | Linha Cabe¸alho c <linha em branco> Sublinha Cabe¸alho c <linha em branco> <linha em branco> Edi¸˜o com dois pontos (:) ca O descritor : termina o controle de formato se n˜o houver mais ´ a ıtens na lista de E/S. n registros s˜o ıcio ca a pulados ou n registros em branco s˜o gerados na sa´ a ıda.99) 99 FORMAT(’1’.1 registros s˜o pulados na ca a entrada ou n .

1 0 0 ) 100 F R A T24 . Silva 45 1. IOSTAT stat ) name.4 Descritores de edi¸˜o de strings ca . i 8 ) ’ . Comandos de Entrada/Sa´ de Dados ıda 147 w w k lic lic k to bu y N O W ! w w . 1 x . T32.80 33233454 J.dat possui a seguinte formata¸˜o: ca Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9.dat. ca Um descritor de edi¸˜o de strings n˜o pode ser precedido por um contador de repeti¸˜o.T23 . No.d o c u -tr . a Para incluir um ap´strofe (’) em uma constante de caractere que ´ delimitada por ap´strofes. 1 x .’/’. 3 0 0 ) 300 F R A O M T(T4.’/’. altura (em metros e cent´ ımetros) e n´mero de telefone (inteiro de 8 d´ u ıgitos). ack c w o 9. ’ Idade ’ .PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . F4 . ’ Nome ’ . 2 . ıda Ele vem em duas formas: ˆ ’<string>’ ˆ “<string>” onde <string> ´ uma constante de caracteres. No . T17 . C. I 8 ) END DO END P O R M P e s s o a i s d a d o s RGA sendo que o arquivo pessoal.d o c u -tr a c k . sem especifica¸˜o de esp´cie. o ca 50 FORMAT(’Today”s date is: ’. para incluir aspas (“) em uma constante de caractere que ´ delimitada por aspas. t e l n o 400 F R A O M T(A. f 4 . deve-se e colocar duas aspas consecutivas na formata¸˜o. ’ ) WRITE( * .’−−−−’. -------------------P. eles podem ca a ca fazer parte de um grupo contido entre parˆnteses.T17.i2) Da mesma forma.4 – 9. h e i g h t .i2.8. A. o qual. I3 . Estes descritores s˜o: ca ıda a ˆ Constantes de caracteres ˆ Descritor de edi¸˜o H (eliminado no Fortran95). h e i g h t . T23 . dat ’ ) WRITE( * .c Descritores de edi¸˜o de strings controlam a sa´ das constantes de string. T32 . ’ ( metros ) ’ . P O R M Pessoais dados RGA IMPLICIT N N O E C A A T R(LEN=15) : : name H R CE INTEGER : : age . e e ca Edi¸˜o de constantes de caracteres ca O descritor de constante de caracteres provoca a sa´ de uma constante de string em um registro externo. 2 0 0 ) 200 F R A O M T(T4 .dat e os imprime no monitor no formato: Altura Nome Idade (metros) Tel. t e l n o IF ( stat <0) EXIT ! Testa f i n a l de a r q u i v o WRITE( * . i 3 . stat REAL : : h e i g h t OPEN(UNIT=8. O seu comprimento ´ o n´mero de e ca e e u caracteres entre os delimitadores. contudo. FILE=’ p e s s o a l . ´ precedido por um contador de repeti¸˜o. ’ Altura ’ ) O M T( WRITE( * . idade (inteiro de 3 e e d´ ıgitos). ’ −−−−−− ’ . 1 x . 2 . Por exemplo. O programa lˆ estes dados e contidos em pessoal.8.’−−−−−’. deve-se colocar o e o duas ap´strofes consecutivas (”) na formata¸˜o. T32 . por sua vez.75 34931458 etc. ’ Tel . Pedra 47 1. T25 . o qual cont´m registros dos nomes de pessoas (at´ 15 caracteres).’−−−−−−−−’) DO READ( 8 . dois delimitadores consecutivos s˜o contados como um caractere.i2. 4 0 0 ) name. ca Como exemplo do uso dos comandos de E/S apresentados nas se¸˜es 9. age . t e l n o . & M = age . o programa a seguir abre co o arquivo pessoal. T18 . F T= ’( a15 .

Usando uma variante deste comando. No final da execu¸˜o de um programa. Por exemplo. O comando CLOSE pode aparecer em qualquer ponto no programa e se ´ executado para uma unidade n˜o existente ou desconectada. Se o especificador for omitido. Outra variante do comando permite inquirir-se a respeito do tamanho de uma lista de sa´ quando usada para escrever um registro n˜o formatado. SEQUENTIAL=<seq>][. as primeiras duas variantes s˜o descritas juntas. o ca Se o valor ´ ’DELETE’. A fun¸˜o do especificador STATUS= ´ de determinar o que acontecer´ com o arquivo uma vez desconectado. Suas formas s˜o: ca a a INQUIRE({[UNIT=]<u>|FILE=<arq>}[. FMT=’(T4. todas as unidades conectadas s˜o fechadas. 300 e 400 poderiam ser e o igualmente substitu´ ıdos pelo especificador FMT=. e a nada acontece. IOSTAT=<ios>][. o arquivo n˜o mais existir´ ap´s a execu¸˜o do comando. As trˆs variantes do comando s˜o conhecidas como INQUIRE por arquivo. 8 0 33233454 047 1 . ACTION=<act>] & [.’(metros)’.’Idade’. seja por um comando OPEN ou seja por alguma a¸˜o sobre um arquivo pr´ca ca e conectado que o faz existir. OPENED=<open>][. NAME=<nam>][. DELIM=<del>][.4). RECL=<rec>] & [. <ios> e <err-label> tˆm os mesmos significados descritos para o comando OPEN (se¸˜o 9.c P . NAMED=<nmd>] & [. FORM=<frm>][. as linhas WRITE(*. S i l v a J . Novae ca mente. ERR= <err-label>][.”(metros)”. ack c w o . a e a e Em qualquer caso. em cujo caso o valor padr˜o ´ ’DELETE’.T32. EXIST=<ex>][. a unidade fica livre para ser conectada novamente a um arquivo. por exemplo.T17. um arquivo que existe continuar´ e a existindo ap´s a execu¸˜o do comando CLOSE. n˜o faz sentido inquirir-se a respeito da forma a a a de acesso que est´ sendo usada para este arquivo. Como exemplo: CLOSE(2. e pode ser posteriormente conectado novamente a uma unidade. A.’Tel. DIRECT=<dir>] & [. exceto se o arquivo tem o status ’SCRATCH’. ERR=<err-label>] & [. No.d o c u -tr a c k .T17. de qualquer forma. Se esta inquiri¸˜o ´ feita. se um arquivo n˜o est´ conectado a uma unidade. WRITE=<wr>][. C. Sua forma ´: o e e onde <u>. PAD=<pad>]) Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m 148 9. FORMATTED=<fmt>][.”Tel.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .T23. ´ poss´ ca e ıvel inquirir a respeito do status e atributos de um arquivo usando o comando INQUIRE. STATUS=’DELETE’) 9. Se o valor ´ ’KEEP’. ıda a Alguns atributos que podem ser determinados pelo uso do comando INQUIRE s˜o dependentes de outros. 7 5 34931458 Cabe ressaltar tamb´m que os comandos FORMAT utilizados nos r´tulos 100. READWRITE=<rw>][.T32. a qual ´ uma express˜o escalar de caracteres da esp´cie padr˜o. NEXTREC=<nr>][. Na descri¸˜o feita a seguir. ignorando qualquer branco posterior. mas o especificador de unidade deve ser o primeiro ser for usada a forma posicional. e a a o ca o valor padr˜o ´ ’KEEP’. se o n´mero de unidade existe para o sistema em quest˜o.”)’) 9. como se um comando ca a CLOSE sem o especificador STATUS= fosse aplicado a cada unidade conectada. NUMBER=<num>][. IOSTAT=<ios>][. BLANK=<bl>][.200) 200 FORMAT(T4. ACCESS=<acc>][.10 Comando INQUIRE O status de um arquivo pode ser definido pelo sistema operacional antes da execu¸˜o do programa ou pelo ca programa durante a sua execu¸˜o. quais os atributos do arquivo.”Nome”. ca e a O valor de <status>. Em qualquer momento. a Por exemplo. 200. em caso u a u a afirmativo. UNFORMATTED=<unf>][. Comando CLOSE k lic lic k to bu y N O W ! w w w w . ´ poss´ e ıvel determinar-se o status de uma unidade. IOSTAT=IOS. POSITION=<pos>][. No. INQUIRE por unidade e INQUIRE e a por lista de sa´ ıda.’) s˜o equivalentes a a WRITE(*.9.d o c u -tr . durante a execu¸˜o do programa. Pedra 045 1 . se o n´mero est´ conectado a um arquivo e. o especificador a ca e relevante fica indefinido.9 Comando CLOSE CLOSE([UNIT=]<u>[.”Idade”.’Nome’. ERR=99.T23. READ=<rd>][. STATUS=<status>]) O prop´sito do comando CLOSE ´ desconectar um arquivo de uma unidade. especificadores em palavras-chaves podem aparecer em qualquer ordem. pode ser um dos valores e a e a ’KEEP’ ou ’DELETE’.

Dependendo do sistema. <nr> resulta ca e indefinido. ack c w o . Neste ultimo caso. Um especificador n˜o pode aparecer mais de uma vez na lista de especificadores opcionais. <nr>= 1. ou o tamanho m´ximo do registro permitido para um arquivo a conectado para acesso seq¨encial. ´ atribu´ se o arquivo (ou unidade) e a o e ıdo estiver conectado a uma unidade (ou arquivo) e . Em um sistema Unix/Linux. onde <acc> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos um dos valores ’SEQUENTIAL’ ou ’DIRECT’ dependendo do m´todo de acesso para um arquivo que est´ conectado e ’UNDEFINED’ se n˜o e a a houver conex˜o. o INQUIRE pode ser usado para determinar o valor real de um arquivo antes u deste ser conectado. exceto co no caso de NAME= s˜o mai´sculos. ´ atribu´ se o arquivo (ou unidade) existir e e a o e ıdo . em caso contr´rio.FALSE. ou ’UNDEFINED’ se e n˜o houver conex˜o. <rec> resulta indefinido.4). <arq> ´ uma express˜o escalar de ´ e a caracteres cujo valor. A interpreta¸˜o de <arq> depende do sistema. Se o arquivo n˜o estiver a conectado para acesso direto ou se a posi¸˜o ´ indeterminada devido a um erro anterior. a NEXTREC= <nr>. ’NO’ ou ’UNKNOWN’.TRUE. UNFORMATTED= <unf>. ignorando quaisquer brancos posteriores. Os especificadores. tem o mesmo significado descrito no comando OPEN (se¸˜o 9. onde <nmd> ´ uma vari´vel l´gica ` qual o valor .TRUE. ´ atribu´ se o arquivo tem um nome ou e a o a e ıdo . fornece o nome do arquivo envolvido. ACCESS= <acc>. em caso contr´rio. NAME= <nam>.c OPENED= <open>. dependendo se o arquivo puder ser aberto para acesso formatado ou n˜o formatado. onde <fmt> e <unf> s˜o vari´veis de caracteres `s quais s˜o atribu´ a a a a ıdos os valores ’YES’. em caso contr´rio.d o c u -tr . DIRECT= <dir>. a a FORMATTED= <fmt>. onde <ex> ´ uma vari´vel l´gica. a FORM= <frm>.TRUE. ou -1 se nenhuma unidade estiver conectada ao arquivo. O valor . onde <open> ´ uma vari´vel l´gica. Se n˜o houver a a a conex˜o. onde <frm> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos um dos valores ’FORMATTED’ ou ’UNFORMATTED’. ’NO’ ou ’UNKNOWN’. a a ıdo a a Este valor n˜o ´ necessariamente o mesmo que ´ dado no especificador FILE=. o nome depende do ca caso. tem o mesmo significado descrito no comando OPEN (se¸˜o 9. O valor . em qualquer situa¸˜o ´ um nome v´lido para uso em um comando ca e a OPEN subseq¨ente. dependendo na forma para a qual o arquivo ´ realmente conectado. Contudo. se usado. cujos valores s˜o todos escalares e da esp´cie padr˜o s˜o: a u a e a a IOSTAT= <ios>. onde <seq> e <dir> s˜o vari´veis de caracteres `s quais s˜o atribu´ a a a a ıdos os valores ’YES’. ca ca ERR= <err-label>. o nome depende do caso. mais um.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . a respectivamente. Assim.d o onde os especificadores entre chaves ({}) s˜o excludentes. ca EXIST= <ex>. este ser´ atribu´ ` vari´vel de caracteres <nam>. Comandos de Entrada/Sa´ de Dados ıda 149 w w k lic lic k to bu y N O W ! w w . incluindo o caminho. A vari´vel <ios> ´ a unica ca a e ´ definida se uma condi¸˜o de erro ocorre durante a execu¸˜o do INQUIRE. a SEQUENTIAL= <seq>. onde <rec> ´ uma vari´vel inteira ` qual ´ atribu´ o valor do tamanho do registro de um e a a e ıdo arquivo conectado para acesso direto. Todas as atria bui¸˜es de valores aos especificadores seguem as regras usuais e todos os valores do tipo de caracteres. ou se isto n˜o pode ser determinado. NAMED= <nmd>. a NUMBER= <num>. Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. Se o arquivo tem um nome. O comprimento ´ o n´mero de caracteres para registros formatados u e u contendo somente caracteres do tipo padr˜o e dependente do sistema em caso contr´rio. respectivamente. u ou se isto n˜o pode ser determinado. a c u -tr a c k .FALSE.4). o primeiro deve ser usado no caso de INQUIRE por a unidade e o segundo no caso de INQUIRE por arquivo. onde <num> ´ uma vari´vel inteira ` qual ´ atribu´ o n´mero da unidade conectada ao e a a e ıdo u arquivo. a RECL= <rec>. mas pode ser a e e qualificado de alguma forma. dependendo se o arquivo puder ser aberto para acesso direto ou seq¨encial. Se nenhum registro foi ainda lido ou escrito.FALSE. onde <nr> ´ uma vari´vel inteira ` qual ´ atribu´ o valor do n´mero do ultimo registro lido e a a e ıdo u ´ ou escrito.

Comando INQUIRE k lic lic k to bu y N O W ! w w w w . ’NO’ ou ’UNKNOWN’. o valor ´ ’NO’. NEXTREC= NR) Ap´s execu¸˜o bem sucedida dos comandos OPEN e INQUIRE. ACC. dependendo se os brancos em campos num´ricos devem ser por padr˜o interpretados como campos de e a nulos ou de zeros. ou se o arquivo n˜o estiver conectado para E/S formatada. onde <act> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’READ’. ou ser usado como o valor do comprimento a ser determinado ao especificador RECL=. A terceira variante do comando INQUIRE. Se n˜o houver a a conex˜o. as vari´veis ter˜o os seguintes valores: o ca a a EX= . conforme especificado no correspondente comando OPEN. ’NO’ ou ’UNKNOWN’. onde <pos> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’REWIND’. FILE= ’Cidades’. n˜o permitidas ou indeterminadas para o a a arquivo. Um exemplo de uso do comando INQUIRE ´ dado abaixo: e LOGICAL :: EX. onde <del> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’QUOTE’. ERR= 99. ou est´ associada com um. ou ’UNDEFINED’ se ou n˜o houver conex˜o ou se a conex˜o n˜o for a a a a para E/S formatada. ’APPEND’ ou ’ASIS’.. ack c w o .d o BLANK= <bl>. o valor a a a ´ ’UNDEFINED’. o valor ´ ’UNDEFINED’.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w . onde <bl> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’NULL’ ou ’ZERO’. por exemplo. IOSTAT= IOS. uma lista de sa´ ´ muito grande para o tamanho do registro dado pelo especificador RECL= ıda e de um comando OPEN. & SEQUENTIAL= SEQ. caso assim especificado pelo correspondente comando OPEN (ou pelo valor padr˜o). OP CHARACTER(LEN= 11) :: NAM. NAM= ’Cidades ’ ACC= ’DIRECT ’ SEQ= ’NO ’ FRM= ’UNFORMATTED’ IREC= 100 NR= 1 Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 c u -tr a c k . RECL= 100) INQUIRE(2. respectivamente. OP= .TRUE. ’NO’ ou ’UNKNOWN’. onde <wr> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’YES’.d o c u -tr . ca ACTION= <act>. onde <pad> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’YES’. n˜o permitida ou indeterminada para o arquivo. POSITION= <pos>. e a READWRITE= <rw>. Se n˜o houver conex˜o ou se o arquivo est´ conectado para acesso direto. ERR= 99. a a e Uma vari´vel que ´ a especifica¸˜o em um comando INQUIRE. o valor ´ ’UNDEFINED’. RECL= IREC. a a e PAD= <pad>. & ACCESS= ’DIRECT’. dependendo se escrita ´ permitida.TRUE. a a a e READ= <rd>. se o arquivo n˜o foi reposicionado a desde que foi aberto. ’WRITE’ ou ’READWRITE’. EXIST= EX. ACCESS= ACC. conforme a conex˜o. OPEN(2. DELIM= <del>.. OPENED= OP. FRM INTEGER :: IREC. NR . onde <rw> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’YES’. STATUS= ’NEW’. conforme especificado pelo correspondente comando OPEN (ou pelo valor padr˜o). INQUIRE por lista de E/S. n˜o deve aparecer em a e ca a a outra especificador no mesmo comando. onde <rd> ´ uma vari´vel de caracteres ` qual s˜o atribu´ e a a a ıdos os valores ’YES’. dependendo se leitura e escrita s˜o permitidas. n˜o permitida ou indeterminada para o arquivo. Se o arquivo foi reposicionado desde que a conex˜o foi estabelecida. o valor depende e a do processador (mas n˜o deve ser ’REWIND’ ou ’APPEND’ exceto se estes corresponderem ` verdadeira a a posi¸˜o). e a WRITE= <wr>. em caso contr´rio. Se n˜o houver conex˜o. tem a forma: INQUIRE(IOLENGTH=<comp>) <lista-sa´da> ı onde <comp> ´ uma vari´vel inteira escalar padr˜o que ´ usada para determinar o comprimento de uma <listae a a e sa´da> n˜o formatada em unidades que dependem do processador. NAME= NAM. dependendo se leitura ´ permitida. Esta vari´vel pode ser usada para estabelecer ı a a se. ’APOSTROPHE’ ou ’NONE’. SEQ.10. FORM= FRM.c o m 150 9.

e ca A a¸ao deste comando ´ posicionar o arquivo antes do registro corrente. ou verificar por leitura o a ´ ultimo registro escrito. ack c w o 9. o comando REWIND: o REWIND([UNIT=]<u>[. ERR=<err-label>]) onde todos os argumentos tˆm o mesmo significado que nos comandos anteriores.11 Outros comandos de posicionamento . este resulta posicionado antes deste registro. o qual ´ assim identificado pelo computador.11. mas ´ poss´ retroceder com os comandos BACKSPACE ou REWIND. IOSTAT=<ios>][. a Antes da transferˆncia de dados. deve ser manipulado usado a especifica¸˜o END=<end-label> do comando READ sen˜o a execu¸˜o ca a ca do programa ir´ normalmente terminar.d o c u -tr a c k . o ultimo e a ´ registro escrito deve ser substitu´ por um novo. pode ser necess´rio reler o ultimo registro. cujo n´mero de unidade ´ especificado pela express˜o escalar u e a inteira <u>.5). Comandos de Entrada/Sa´ de Dados ıda 151 w w k lic lic k to bu y N O W ! w w . Novamente. os demais especificadores opcionais tˆm o mesmo significado que no comando READ. 9. o ultimo registro deve ser sobrescrito.11. o que permite a ocorrˆncia de outras e ıvel e transferˆncias de dados.c Outros comandos que exercem fun¸˜es de controle no arquivo.d o c u -tr . 9. em adi¸˜o ` entrada e sa´ de dados. u e denominado registro de final de arquivo. IOSTAT=<ios>][. nada ocorre.11. um arquivo n˜o pode estar posicionado ap´s o registro de final de are a o quivo. Se o comando for tentado c˜ e quando o registro estiver no in´ do arquivo. se lido subseq¨entemente por e a o u um programa. e O arquivo ´ ent˜o posicionado ap´s o registro de final de arquivo. Para estes prop´sitos. Se o arquivo tamb´m pode ser conectado para acesso direto. por um novo comando OPEN na mesma unidade ou por encerramento normal do programa. Se o arquivo estiver posicionado ap´s um registro ıcio o de final de arquivo. o qual tem a sintaxe ´ o BACKSPACE([UNIT=]<u>[. usando o comando a e ıvel ENDFILE: ENDFILE([UNIT=]<u>[.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to C m C w .1 Comando BACKSPACE Pode acontecer em um programa que uma s´rie de registros sejam escritos e que. O mesmo ocorre caso o arquivo n˜o exista. quando o arquivo ´ ca ca e fechado por um comando CLOSE. Este registro. nada ocorre. somente os registros al´m do registro de final e e de arquivo s˜o considerados como escritos e somente estes podem ser lidos em uma conex˜o de acesso direto a a subseq¨ente. a 9. N˜o ´ poss´ a e ıvel solicitar BACKSPACE em um arquivo que n˜o exista. e Um registro de final de arquivo ´ automaticamente escrito sempre quando ou uma opera¸˜o de retrocesso e ca parcial ou completo segue um opera¸˜o de escrita como a opera¸˜o seguinte na unidade. Com este prop´sito. ERR=<err-label>]) onde <u> ´ uma express˜o inteira escalar padr˜o que designa o n´mero da unidade e os outros especificadores e a a u opcionais tˆm o mesmo significado que no comando READ (se¸˜o 9. e Se o arquivo j´ estiver no seu in´ a ıcio. ´ poss´ escrever-se um registro de final de arquivo explicitamente. se houver.3 Comando ENDFILE O final de um arquivo conectado para acesso seq¨encial ´ normalmente marcado por um registro especial. durante a leitura dos registros. nem sobre um registro escrito por um a comando NAMELIST. uma opera¸˜o ca ca similar pode ser realizada sobre um arquivo completo. u Autor: Rudi Gaelzer – IFM/UFPel Impresso: 27 de maio de 2008 o m Cap´ ıtulo 9. Uma serie de comandos BACKSPACE resultar´ no retrocesso no n´mero correspondente de a u registros. De forma ıdo e ´ similar. por alguma raz˜o. re-escritura ou verifica¸˜o por leitura de um registro. IOSTAT=<ios>][ERR=<err-label>]) pode ser usado para reposicionar um arquivo. s˜o co ca a ıda a fornecidos abaixo. Fortran fornece o comando BACKSPACE. e Quando necess´rio. isto ´.2 Comando REWIND De forma semelhante a uma releitura.

119 e INTRINSIC. 88 Gen´ricas. 83 Argumentos. 47 Tipos derivados. 94 Opcionais. 105 ca WHERE. 97 a Construtores de. op¸˜o. rotina intr´ ınseca. 51 o co Format assumida. 115 ca PUBLIC. 64 INTENT. 58. 113 o Valor matricial. 116. 100 SAVE. 110 Rotinas de. 119 e Matrizes Ajust´veis. 90 Subprogramas como argumentos. 103 Rotinas de m´dulos. 57 Express˜es e atribui¸˜es. 115 c˜ ınseca. rotina intr´ ınseca.d o c u -tr a c k . atributo e declara¸˜o. 113 Rotinas gen´ricas. 100 ca FORALL. 96 Se¸˜es de. 95 Terminologia. 120 R´tulos. 77 RETURN. atributo e declara¸ao. 106 Recursivas. 99 Tipos derivados.c ´ Indice Remissivo ˆ Ambito Nomes. 86 Rotinas. 49 ONLY. atributo e declara¸˜o. 93 Palavras-Chave. 120 o COUNT. 76 EXTERNAL. 116. 109. 112 ca PRIVATE. 80 RESHAPE. 59 o m w w w w . rotina intr´ ınseca. 53 co Tamanho assumido. 94 Elementais. 88 Gen´ricas. 86 ca Interfaces. 116 e 151 Internas.d o c u -tr a c k ! w o . 70 Puras. comando. 85 Matrizes. comando e construto. atributo e declara¸˜o. 109 o Dados globais.c O W w . comando e construto. 80 RANDOM NUMBER. atributo e declara¸˜o. 67 ca M´dulos. atributo e declara¸˜o.PD PD F- XC h a n g e Vi e w F- XC h a n g e Vi e w er er ! O W N y bu to k lic C m C lic k to bu y N . 108 Externas. 85 Intr´ ınsecas SINH. 95 a Aloc´veis. rotina intr´ RANDOM SEED. 61 a Autom´ticas.

Sign up to vote on this title
UsefulNot useful