Você está na página 1de 62

Introduo ao Fortran 90

CENAPAD-SP

2
NDICE
INTRODUO
1-HISTRIA
2-FORTRAN 77
3-FORTRAN 90

_______

04
05
06

ELEMENTOS DO FORTRAN 90
4-EXEMPLO DE PROGRAMA
5-RECOMENDAES DE CODIFICAO
6-CARACTERSTICAS DE CODIFICAO
7-REGRAS DE CODIFICAO
8-COMPILAO NO AMBIENTE CENAPAD-SP
9-EXERCCIO 1-Compilao e Execuo
10-EXERCCIO 2- Reestruturao de programa
11-ESTRUTURA DE PROGRAMAS
_____________
12-TIPOS DE DADOS
13-CONSTANTES
14-TIPO IMPLCITO
15-DECLARAO NUMRICA E LGICA
16 - DECLARAO CARACTERE
17-DECLARAO DE CONSTANTES
18-INICIALIZAO DE VARIVEIS
19-EXERCCIO 3 - Declarao de Variveis
20-EXPRESSES
21-Operador de ATRIBUIO
22-Operadores NUMRICOS
23-Precedncia de Operadores
24-Operadores RELACIONAIS
25-Operadores LGICOS
26-Operador CARACTERE
27-EXERCCIO 4 B Expresses

_____

07
08
09
10
11
______________________12
13
___
_______14
_______14
_______15
_______15
_______16
_______16
_______17
_______17
_______18
_______19
_______19
_______20
_______20
_______21
_______21
_______22
_______23

CONSTRUES DE CONTROLE DE EXECUO


28-COMANDOS DE CONTROLE DE FLUXO
29-Comando IF
30-Comando IF...THEN...END IF
31-Comando IF...THEN...ELSE...END IF
32-Comando IF...THEN...ELSEIF...END IF
33-Comando IF...THEN...ELSEIF...END IF Identificado
34-EXERCCIO 5 - Comando IF
35-Comando DOB EXIT-END DO ALOOP@ Condicional
36-Comando DOB CYCLE-EXIT-END DO ALOOP@ Cclico Condicional
37-ALOOPs@ Identificados
38-Comando DO-WHILE
39-Comando DO iterativo
40-Comando SELECT-CASE
41-DIVISO POR INTEIROS
42-EXERCCIO 6 B SELECT CAS E
43-PROCEDIMENTOS INTRNSICOS

_______24
_______25
_______26
_______27
_______28
_______29
30
_______31
_______31
_______32
_______32
_______32
_______33
_______33
_______34
_______35

3
NDICE
44-Funes de CONVERSO
45-Funes MATEMTICAS
46-Funes NUMRICAS
47-Funes CARACTERES
48-EXERCCIO 7 B Funes Matemticas
49-Comando PRINT
50-Comando READ

35
36
36
36
37
38
38

MATRIZES
51-DEFINIO DE MATRIZES
52-DECLARAO DE MATRIZES
53-SNTAXE DE MATRIZES
54-SECES DE MATRIZES
55-IMPRESSO E LEITURA DE MATRIZES
56-FUNES DE MATRIZES
57-ALOCAO DE MATRIZES
58-EXERCCIO 8 B DEFINIO DE MATRIZES
59-EXERCCIO 9 B FUNES DE MATRIZES
60-EXERCCIO 10 B USO DE MATRIZES

39
40
41
41
42
43
44
45
46
46

SECES PRINCIPAIS DE PROGRAMAS


61-SECES DE UM PROGRAMA FORTRAN
62-PROGRAMA PRINCIPAL
63-PROCEDIMENTOS
64-Procedimentos: SUBROUTINE
65-Procedimentos: FUNCTION
66-EXERCCIO 11 B SUBROTINA
67-EXERCCIO 12 B FUNO
68-EXERCCIO 13 B PROCEDIMENTOS
69-SECO DE PROGRAMA: MODULE
70-EXERCCIO 14 B DEFINIO DE UM MDULO
71-EXERCCIO 15 B USO DE UM MDULO

47
48
49
49
50
51
51
52
53
54
54

ENTRADA E SADA
72-ENTRADA / SADA
73-Comando OPEN
74-Comando READ
75-Comando WRITE
76-Comando FORMAT/FMT=
77-Descritores de Formatos
78-Outros comandos de I/O
79-Comando DATA
80-EXERCICIOS 15 B I/O
81-EXERCICIOS 16 B FORMATAO
82-REFERNCIAS

55
56
57
58
59
59
59
60
61
61
62

1-HISTRIA

IBM Mathematical FORmula TRANslation System;

Elaborado especificamente para aplicaes cientficas;

Primeiro compilador considerado High- Level Idealizado por John Backus 1957;

Primeiro Padro Comercivel em 1972: Fortran 66;


Houve diversas verses de compiladores, similares ao Fortran, durante a dcada de
60, o que forou a necessidade de se padronizar o software.

Atualizado em 1980 Fortran 77;


Verso amplamente divulgada e ut ilizada no mundo inteiro pelas reas cientficas.

Atualizado em 1991 ~ 12 anos Fortran 90;


O planejamento para a atualizao do Fortran iniciou-se no incio da dcada de 80,
mas seu desenvolvimento levou muito tempo devido ao compromisso de manter o
Fortran como uma das linguagens cientficas mais eficientes, superior ao PASCAL,
ADA e ALGOL. Os recursos existentes no Fortran 90 se equiparam aos existentes
no C (Alocao dinmica de memria, apontadores e orientao ao objeto).

High Performance Fortran HPF Fortran 90 para ambientes com memria distribuda;

Atualmente Fortran 95;

Padronizado por ANSI X3 e ISO/IEC JTC1/SC22/WG5

2-FORTRAN 77

O Fortran77 est muito obsoleto em relao s linguagens atuais e aos recursos existentes

Formato fixo:
Linhas da posio 7 a 72;
Somente letras maisculas;
Nomes at 6 caracteres.

Impossibilidade de representar operaes paralelas intrnsecas;


uma situao crtica, pois o Fortran considerado como uma linguagem de alta
performance, no entanto, at o padro 77 no existia nenhuma instruo que permitisse o
paralelismo, como compartilhamento de endereos de memria.

No possvel a alocao de memria dinmica;


No Fortran77, o programador obrigado a declarar vetores com o maior tamanho
possvel para reservar memria durante a compilao.

No possui representao numrica portvel;


A preciso de campos numricos variava de uma mquina para outra, tornando o cdigo
no portvel.

No possui definio de tipo de dado pelo programador;


No possvel criar novos formatos a partir dos existentes.

No possui recurso explcita;


No possvel chamar uma funo dentro de outra funo.

3-FORTRAN 90

Formato livre:
132 caracteres por linha;
Maisculas e minsculas;
Nomes at 31 caracteres.

Definio de ARRAYS paralelos;


Novos recursos na definio de um ARRAY permitem a distribuio de vetores por
entre vrios processos que compartilham um ambiente de memria compartilhada.

Alocao de memria dinmica e apontadores;

Definio de tipo de dados (Comando KIND);

Recursividade

Alm dos recursos descritos acima, vrios outros, melhoraram o Fortran tornando-o mais
atual aos recursos existente em outras linguagens de programao :

Controle de estruturas :
o DO...ENDDO
o DO...WHILE
o SELECT CASE

Substituio de comandos:
o COMMON blocks MODULE
o EQUIVALENCE TRANSFER

Novos comandos:
o IMPLICIT NONE

4-EXEMPLO DE PROGRAMA

MODULE Triangle_Operations
IMPLICIT NONE
CONTAINS
FUNCTION Area(x,y,z)
REAL :: Area ! function type
REAL, INTENT( IN ) :: x, y, z
REAL :: theta, height
theta = ACOS((x**2+y**2-z**2)/(2.0*x*y))
height = x*SIN(theta); Area = 0.5*y*height
END FUNCTION Area
END MODULE Triangle_Operations

PROGRAM Triangle
USE Triangle_Operations
IMPLICIT NONE
REAL :: a, b, c, Area
PRINT *, 'Welcome, please enter the&
lengths of the 3 sides.'
READ *, a, b, c
PRINT *, 'Triangle''s area: ', Area(a,b,c)
END PROGRAM Triangle

5-RECOMENDAES DE CODIFICAO

Sempre utilize o comando IMPLICT NONE;

Comandos, funes intrnsecas e as definidas pelo programador, em maisculas;


OBS: No obrigatrio! Apenas uma recomendao.

Variveis e constantes em minsculas;


OBS: No obrigatrio! Apenas uma recomendao.

Cada comando deve ser colocado por linha;

Codifique com recuos;

Acrescente comentrios s linhas.

6-CARACTERSTICAS DE CODIFICAO

132 caracteres por linha;

Alfanumrico: a- z, A- Z, 0-9, _

&

Smbolos aritmticos:

Caractere de incio de comentrio;

Caractere de continuao de linha;

Caractere de separao de comandos;

+ Adio
- Subtrao
* Multiplicao
/ Diviso
** Expoente

10

7-REGRAS DE CODIFICAO

Brancos no so permitidos:

Palavras-chave
INTEGER :: nome1 Certo
INT EGER :: nome1 Errado

Nomes
REAL :: valor_total Certo
REAL :: valor total Errado

Brancos so permitidos:

Entre palavras-chave

Entre nomes e palavras-chave


INTEGER FUNCTION val(x)
INTEGERFUNCTION val(x)
INTEGER FUNCTIONval(x)

Nomes de variveis e rotinas:

Podem ter at 31 caracteres

Devem comear com letra


REAL :: a1 Certo
REAL :: 1a Errado

Podem continuar com letras, dgitos ou _


CHARACTER :: atoz
Certo
CHARACTER :: a-z
Errado
CHARACTER :: a_zCerto

Certo
Errado
Errado

11

8-COMPILAO NO AMBIENTE CENAPAD-SP

Ambiente IBM/AIX

Fortran77: xlf, f77, fort77, g77

extenso: .f , .F

Fortran90: xlf90, f90

extenso: .f , .f90

Fortran95: xlf95

extenso: .f , .f95

Na verdade o compilador um s (xlf) , mas com vrios scripts de execuo que


possuem as opes de como o compilador deve ser executado, como:

Fortran77 e 90: ifort

extenso: .f , .F , .f90

Opes bsicas de compilao:


-o
-O, -O1, -O2, -O3
-c
-g
-L<path>
-l<biblioteca>
-q32
-q64

Padro de Fortran
Sufixo dos programas
Tipo de formatao

Ambiente INTEL/Linux

qlanglvl=
qsuffix=
qfree=yes/no

Nome do executvel (Default: a.out);


Otimizao do cdigo;
No gera executvel;
Gera informaes para depurao;
Localizao da biblioteca para linkedio;
Nome da biblioteca;
Cdigo para 32bits (somente para AIX);
Cdigo para 64bits (somente para AIX);

Exemplos de compilaes:
xlf prog1.f -o prog
xlf90 cofigo.f -o teste -O3
xlf90 cena.f -c -L/usr/lib - lscalapack
ifort salto.f -o salto -O3 -L/home/kusel - lbib1
ifort parceiro.f -o par -g -O

12

9-EXERCCIO 1- Compilao e Execuo


1 Caminhe para o diretrio ~/curso/fortran/ex1.Utilizando um editor de texto, edite o
programa abaixo e salve-o com o nome quadsol.f
cd ~/curso/fortran/ex1
<editor> quadsol.f

OBS: Pode ser o editor pico, emacs ou vi

PROGRAM QES
IMPLICIT NONE
INTEGER :: a, b, c, D
REAL :: Part_Real, Part_imag
PRINT*, ''Entre com os valores de a, b, c''
READ*, a, b, c
IF (a /= 0) THEN
D = b*b - 4*a*c
IF (D == 0) THEN
PRINT*, ''Raiz '', -b/(2.0*a)
ELSE IF (D > 0) THEN
PRINT*, ''Raizes so '',(-b+SQRT(REAL(D)))/(2.0*a),&
''e '',
(-b-SQRT(REAL(D)))/(2.0*a)
ELSE
Part_Real = -b/(2.0*a)
Part_Imag = (SQRT(REAL(-D))/(2.0*a))
PRINT*, ''1a. Raiz'', Prat_Real, ''+'', Part_Imag, ''i''
PRINT*, ''2a. Raiz'', Part_Real, ''-'', Part_Imag, ''i''
END IF
ELSE
PRINT*, ''No uma equao quadrtica''
END IF
END PROGRAM QES

! Calculo do discriminante
! Uma raiz
! raizes reais

! raizes complexas

! a == 0

2. Compile e execute o programa. Verifique a sua execuo para os valores abaixo:


xlf90 quadsol.f o quadsol O3
./quadsol
(a) a = 1 b = -3 c = 2; (b) a = 1 b = -2 c = 1; (c) a = 1 b = 1 c = 1; (d) a = 0 b = 2 c = 3
3. Copie quadSol.f para novoquadsol.f. :
cp quadsol.f novoquadsol.f
4. Edite esse novo arquivo e declare uma nova varivel real de nome parte2a.
5. Na seo executvel do cdigo, defina a nova varivel igual ao valor de 1/(2.0*a).
parte2a=1/(2.0*a)
6. Aonde aparecer a expresso 1/(2.0*a), substitua pela nova varivel.

13

10-EXERCCIO 2- Reestruturao de programa


1 Caminhe para o diretrio ~/curso/fortran/ex2. Reescreva o programa basic_reform.f de
uma maneira que fique mais compreensvel.

14

11-ESTRUTURA DE PROGRAMAS
O Fortran possui algumas regras bem definidas para ordem dos comandos:
1. Cabealho de definio: PROGRAM, FUNCTION, SUBROUTINE, MODULE ou
BLOCK DATA;
S pode haver um nico comando PROGRAM.
Pode haver mais de um FUNCTION, SUBROUTINE e MODULE.
S pode haver um nico BLOCK DATA

1. Comandos de Declarao:
REAL, INTEGER, IMPLICIT, PARAMETER, DATA;
2. Comandos de Execuo:
IF-ENDIF, DO-ENDDO, comando de atribuio;
4. Finalizao do programa com o comando END;

12-TIPOS DE DADOS
Todo tipo de dado possui um nome, um conjunto vlido de valores, um significado dos
valores e um conjunto de operadores.

Dado Caractere
CHARACTER :: sex
CHARACTER(LEN=12) :: nome

Dado Boolean
LOGICAL :: w

Dado Numrico
REAL :: alt
DOUBLE PRECISION :: pi
INTEGER :: id

15

13-CONSTANTES

Constante um objeto com valor fixo


12345
-6.6E-06
.FALSE.
Curso Fortran

Nmero Inteiro
Nmero Real
Valor Lgico
Caractere

Observaes:

Nmeros Reais possuem ponto decimal ou o smbolo de expoente;

Nmeros Inteiros no possuem ponto decimal e so representados por uma


seqncia de dgitos com o sinal + ou -;

S existem dois valores Lgicos : .FALSE. e .TRUE.;

Valores caracteres so delimitados por ou

14-TIPO IMPLCITO

Variveis no declaradas possuem um tipo implcito de dado:

Se a primeira letra da varivel comear por I, J, K, L, M ou N, ser definida como


Inteiro ;

Qualquer outra letra ser do tipo Real;

Tipo de dado implcito potencialmente perigoso e deve ser evitado com a declarao:
IMPLICIT NONE

Exemplo de problema ocorrido no Fortran77:


DO 30 I = 1.1000
...
30 CONTINUE

16

15-DECLARAO NUMRICA E LGICA

Com o comando IMPLICIT NONE, todas as variveis devem ser declaradas, da forma:

<tipo> [, <lista de atributos>] :: <lista de variveis> [=<valor>]

Em Fortran90 pode se definir atributos quando se declara uma varivel.

Lista de atributos

PARAMETER, DIMENSION;

::

No obrigatrio, a menos que se especifique um atributo;

Exemplos:
REAL
INTEGER
LOGICAL
REAL, DIMENSION(10,10)
INTEGER

:: x
:: i, j
:: ptr
:: y, z
:: k=4

16 - DECLARAO CARACTERE

As declaraes de caracteres so similares s declaraes numricas. Pode-se declarar


um caractere ou um conjunto de caracteres:

<tipo>[(LEN=<tamanho>)] [, <lista de atributos>] :: <lista de variveis> [=<valor>]

Exemplos:

CHARACTER(LEN=10)
:: nome
CAHARCTER
:: sexo
CHARACTER(LEN=32)
:: str
CHARACTER(LEN=10), DIMENSION(10,10)

:: vetor

17

17-DECLARAO DE CONSTANTES

Um valor constante conhecido como parmetro, pode ser definido pelos comandos de
declarao utilizando o atributo PARAMETER ou pelo prprio comando
PARAMETER;
Exemplos:
INTEGER pre

Fortran77

PARAMETER (pre=252)

Fortran77

REAL, PARAMETER

:: pi=3.14159

Fortran90

CHARACTER(LEN=*), PARAMETER :: n1=Paulo, n2=FranciscoFortran90

Valores caracteres podem assumir o seu prprio tamanho utilizando-se (LEN=*);

Recomenda-se que se utilize a forma padro do Fortran90, com atributos;

O atributo PARAMETER deve ser usado, quando se tiver certeza que a varivel s
poder assumir um nico valor.

18-INICIALIZAO DE VARIVEIS

Pode-se atribuir um valor inicial a uma varivel e alter- la no decorrer da execuo.


Exemplos:
REAL

:: x, y=1.005

INTEGER

:: i=5, j=100

CHARACTER(LEN=5) :: luz=Amber
LOGICAL

:: a=.TRUE., b=.FALSE.

REAL, PARAMETER

:: pi=3.14159

REAL

:: radius=3.5

REAL

:: circo=2*pi*radius (expresso)

OBS: Em geral, funes no podem ser utilizadas em expresses que iniciam uma
varivel, mas existe as excees.

18

19-EXERCCIO 3 - Declarao de Variveis

1 Caminhe para o diretrio ~/curso/fortran/ex3, crie um programa em fortran90


(variavel.f) que apenas declare as seguintes variveis:

Nome
Pe
Milhas
Cidade
Local
Aonde_nasceu
Seno_meio

Status
Varivel
Varivel
Varivel
Constante
Constante
Constante

Tipo
Inteiro
Real
Caractere (at 20 letras)
Caractere
Lgica
Real

Valor Inicial
Campinas
Falso
Sin(0.5)=0.47942554

19

20-EXPRESSES

Expresses so construdas com pelo menos um operador (Alguns: +, -, *, /, //, **) e


com pelo menos um operando.

Exemplos:
X+1

Expresso numrica (Adio)

campo//campo

Expresso caractere (Concatenao)

A .GT. B

Expresso lgica

O tipo de uma expresso deriva do tipo dos operandos;

Operandos podem ser: expresses, nmeros, caracteres, funes;

21-Operador de ATRIBUIO

Normalmente uma expresso utilizada em conjunto com um operador de atribuio


=, que ir definir ou atribuir um valor a um novo objeto.

Exemplos:
a=b
c = SIN(0.7)*12.7
nome = iniciais//sobrenome
logi = (a.EQ.b.OR.c.NE.d)

OBS: Os operandos a esquerda e a direita do sinal de igualdade no necessitam ser do


mesmo tipo.

20

22-Operadores NUMRICOS

Exponencial

(**)

(Avaliado da direita para esquerda)

10**2
a**b

Multiplicao (*) e Diviso (/)

(Avaliado da esquerda para direita)

10*7/4
a*b/c

Adio (+) e Subtrao (-)

(Avaliado da esquerda para direita)

7+8-3
a+b-c

OBS: Os operandos podem ser variveis, constantes, escalares ou vetores, com exceo do
expoente que, necessariamente, deve ser escalar.

23-Precedncia de Operadores

()

**

*,/

+,-

//

O que vier entre parntesis ser avaliado primeiro;


Em expresses aritmticas, com o mesmo nvel de avaliao, o que vier da
esquerda para direita ser avaliado primeiro, com exceo do expoente.

Exemplos:
(a + b)/c

diferente de

a+b/c

(a*b)/c

igual a

a*b/c

a/b*c

diferente de

a/(b*c)

x = a+b/5.0-c**d+1*e

equivale a

x=((a+(b/5.0))-(c**d))+(1*e)

21

24-Operadores RELACIONAIS

So utilizados em expresses lgicas, entre dois operandos, retornando um valor lgico


(.TRUE. ou .FALSE.) :

.GT.
.GE.
.LE.
.LT.
.NE.
.EQ.

>
>=
<=
<
/=
==

Maior que
Maior igual
Menor igual
Menor que
No igual a
Igual a

Exemplos:
a = i .GT. J
IF (i .EQ. J) c=d

25-Operadores LGICOS

So utilizados em expresses lgicas, com um ou dois operandos, retornando um valor


lgico (.TRUE. ou .FALSE.) :
.AND.
.OR.
.NOT.
.EQV.
.NEQV.

.TRUE. Se ambos os operandos forem .TRUE.


.TRUE. Se pelo menos um operando for .TRUE.
.TRUE. Se o operando for .FALSE.
.TRUE. Se os operandos possurem o mesmo valor
.TRUE. Se os operandos possurem valores diferentes

Exemplos: Se T=.TRUE. e F=.FALSE. ento


T .AND. F
T .OR. F
T .EQV. F

.FALSE.
.TRUE.
.FALSE.

F .AND. F
F .OR. F
T .NEQV. F

.FALSE.
.FALSE.
.TRUE.

22

26-Operador CARACTERE

Utilizado para efetuar a concatenao //, somente de variveis caracteres.

Exemplo :
CHARACTER(LEN=*), PARAMETER :: string=abcdefgh
string(1:1) a
string(2:4) bcd
a=string//string(3:5) abcdefghcde
b=string(1:1)//string(2:4) abcd

23

27-EXERCCIO 4 Expresses
1-Caminhe para o diretrio ~/curso/fortran/ex4. Edite o programa area_circulo.f
2-O programa est incompleto. Acrescente na linha das reticncias o que solicitado.
...Declarao de variveis...
...Expresso para clculo da rea e volume...
3-rea do crculo:

area = B r

4-Volume da esfera: volume = 4 B r


3
5-Compile e execute o programa. Verifique se ele executa corretamente para os valores de
2, 5, 10 e 1

24

28-COMANDOS DE CONTROLE DE FLUXO

Toda linguagem de programao estruturada necessita de artifcios que possibilitem a


execuo condicional de comandos. Esses comandos normalmente alteram o fluxo de
execuo de um programa.

- Comandos de execuo condicional: IF... , IF...THEN...ELSE...END IF

O comando IF analisa uma expresso que, se o resultado for verdadeiro,


executa os comando que vierem aps o THEN, se for falso, executa os comandos
que vierem aps o ELSE.

- Comandos de iterao repetitiva: DO...END DO, DO WHILE...END DO

O comando DO permite a execuo repetitiva de um bloco de comandos.

- Comandos de mltipla escolha: SELECT CASE

O comando SELECT permite a execuo de comandos baseado no valor que


uma expresso pode ter.

25

29-Comando IF

Determina a execuo de um nico comando se uma condio lgica for verdadeira:

IF (<expresso lgica>) <comando>

Exemplos:
IF (I > 17) PRINT*, I > 17

26

30-Comando IF...THEN...END IF

Determina a execuo de um bloco de comandos se uma condio lgica for verdadeira:

IF (<expresso lgica>) THEN


<bloco de comandos>
...
END IF

Exemplos:

IF (I >17) THEN
PRINT *, I >17
END IF

27

31-Comando IF...THEN...ELSE...END IF

Determina a execuo de um bloco de comandos se uma condio lgica for verdadeira


ou falsa:
IF (<expresso lgica>) THEN
<bloco de comandos>
...
[ELSE
<bloco de comandos>
...]
END IF
Exemplos:
IF (I > 17) THEN
PRINT *, I > 17
ELSE
PRINT *, I <= 17
END IF

28

32-Comando IF...THEN...ELSEIF...END IF

Determina a execuo recursiva de comandos se uma condio lgica for verdadeira ou


falsa em vrios blocos de IFs
IF (<expresso lgica>) THEN
<bloco de comando>
...
[ELSEIF (<expresso lgica>) THEN
<bloco de comandos>
...]
[ELSE
<bloco de comandos>
...]
END IF

Exemplos:
IF (I > 17) THEN
PRINT *, I > 17
ELSEIF (I == 17) THEN
PRINT *, I == 17
ELSE
PRINT*, I < 17
END IF

29

33-Comando IF...THEN...ELSEIF...END IF Identificado

Determina a execuo recursiva de comandos se uma condio lgica for verdadeira ou


falsa em vrios blocos de IFs identificados por um nome. A identificao dos IFs
simplesmente perfumaria, com a inteno de apresentar um cdigo mais limpo e claro.

<nome>:

IF (<expresso lgica>) THEN


<bloco de comando>
[ELSEIF (<expresso lgica>) THEN <nome>
<bloco de comandos>]
[ELSE <nome>
<bloco de comandos>]
END IF <nome>

Exemplos:
outa:IF (a .NE. 0) THEN
PRINT*, a no igual a 0
IF (c .NE. 0) THEN
PRINT*,a no igual a 0 e c no igual a 0
ELSE
PRINT*,a no igual a 0 mas c igual a 0
END IF

ELSEIF (a .GT. 0) THEN outa


PRINT*,a maior que 0
ELSE outa
PRINT*,a deve ser menor que 0
ENDIF outa

30
34-EXERCCIO 5 - Comando IF

1 Caminhe para o diretrio ~/cursos/fortran/ex5. Edite o programa triangulo.f

2 O programa solicita que se digite trs valores inteiros que podero formar os trs lados
de um tringulo eqiltero, issceles, escaleno, ou no formar um tringulo.

3 Detalhe muito importante para a lgica de execuo do programa :


Se trs valores formam um tringulo, ento 2 vezes o maior valor tem que ser
menor que a soma de todos os trs valores, ou seja, a seguinte expresso tem que
ser verdadeira para que um tringulo exista.
(2*MAX(lado1,lado2,lado3) < lado1+lado2+lado3)

4 Substitua as linhas com reticncias pela lgica de programao que ir determinar que
tipo de tringulo ser formado. Analise com ateno o resto do programa para perceber
como montar os comandos. Em um determinado instante, a expresso acima ser utilizada.

5 Compile e execute o programa vrias vezes com os seguintes valores:


a.
b.
c.
d.
e.
f.

(1,1,1)
(2,2,1)
(1,1,0)
(3,4,5)
(3,2,1)
(1,2,4)

31

35-Comando DOEXIT-END DO LOOP Condicional

Loop consiste de um bloco de comandos que so executados ciclicamente,


infinitamente. necessrio um mecanismo condicional para sair do loop. O bloco de
comandos que executado ciclicamente delimitado pelo comando DO...END DO e o
comando EXIT determina a sada do loop.
DO
...
IF (<expresso lgica>) EXIT
...
END DO
Exemplos:
i=0
DO
i=i+1
IF (i .GT. 100) EXIT
PRINT*, I , i
END DO
PRINT*, Fim do loop. I = , i

36-Comando DOCYCLE-EXIT-END DO LOOP Cclico Condicional

Loop cclico que possui um mecanismo condicional para sair e iniciar o loop,
novamente. O comando CYCLE determina, novamente, o incio imediato do loop.
DO
...
IF (<expresso lgica>) CYCLE
IF (<expresso lgica>) EXIT
...
END DO
Exemplos:
i=0
DO
i=i+1
IF (i >= 50 .AND. I <= 59) CYCLE
IF (i .GT. 100) EXIT
PRINT*, I , i
END DO
PRINT*, Fim do loop. I = , i

32

37-LOOPs Identificados

loops recursivos identificados.


Exemplo:
1 outa: DO
2
inna: DO
3
...
4
IF (a .GT. b) EXIT outa
5
IF (a .EQ. b) CYCLE outa
6
IF (c .GT. d) EXIT inna
7
IF (c .EQ. a) CYCLE
8
END DO inna
9 END DO outa
10 ...

! Pula para linha 10


! Pula para linha 1
! Pula para linha 9
! Pula para linha 2

38-Comando DO-WHILE

loops que condiciona a sua execuo antes de executar o bloco de comandos. Faa
enquanto. A condio testada no topo do loop.
DO WHILE (<expresso lgica>)
...
END DO
Exemplo:
DO WHILE ( salario .LE. 5000 )
salario=salario*1.05
END DO

39-Comando DO iterativo

loops que possuem um nmero fixo de ciclos.


DO <varivel>=<expresso1>, <expresso2> [,<expresso3>]
...
END DO
expresso1 Valor inicial
expresso2 Valor final
expresso3 Valor de incremento
Exemplo:
DO i1=1, 100, 2
... ! i1 ser: 1,3,5,7...
... ! 50 iteraes
END DO

33

40-Comando SELECT-CASE

Construo similar ao IF, mas muito til quando o valor analisado na expresso lgica
possuir diversos valores.
SELECT CASE (<expresso>)
CASE (<seleo>) <comando>
CASE (<seleo>) <comando>
...
CASE DEFAULT <comando>
END SELECT

A seleo pode ser uma lista de valores:

(6, 10, 100)


(10:65,67:98)
(100:)

Valores iguais a 6, 10 ou 100


Valores entre 10 e 65, inclusive ou entre 67 e 98 inclusive
Valores maior ou igual a 100

Exemplo:
SELECT CASE (I)
CASE (1)
PRINT*, I==1
CASE (2:9)
PRINT*, I>=2 and I<=9
CASE (10)
PRINT*, I>=10
CASE DEFAULT
PRINT*, I<=0
END SELECT

41-DIVISO POR INTEIROS

Ocorrem confuses em relao aos resultados quando da diviso de nmeros inteiros.


Normalmente o resultado um valor inteiro.
REAL :: a, b, c, d, e
a = 1999/1000
b = -1999/1000
c = (1999+1)/1000
d = 1999.0/1000
e = 1999/1000.0

a=1
b = -1
c=2
d = 1.999
e = 1.999

34
42-EXERCCIO 6 SELECT CASE

1 Caminhe para o diretrio ~curso/fortran/ex6. Edite o programa ingresso.f . Esse


programa determina o preo de um ingresso a partir do nmero da cadeira escolhida:

CADEIRAS
50
100 140 e 200 240
300 340
400 440

PREO
R$ 50,00
R$ 25,00
R$ 20,00
R$ 15,00

2 Substitua nas reticncias a estrutura de um SELECT CASE que determinar o preo


do ingresso.
3 Compile e execute o programa diversas vezes para verificar se est certo.
4 Altere o programa, de maneira que, fique em loop solicitando o nmero da cadeira,
at ser digitado 0 que determina o fim do programa.

35

43-PROCEDIMENTOS INTRNSECOS

Em linguagens de programao, normalmente, algumas tarefas so executadas com


muita freqncia. O Fortran90 possui internamente, em torno de, 113 procedimentos,
que so chamadas de funes intrnsecas e executadas como funes:

Matemticas: Trigonom tricas, Logaritmo (SIN e LOG)

Numricas (SUM, MAX)

Caracteres (INDEX, TRIM)

Transformao (REAL)

44-Funes de CONVERSO

Transformao de tipos de dados


REAL(i)
INT(x)
DBLE(a)
IACHAR(c)
ACHAR(i)

REAL(1)
INT(1.7)
INT(-0.9999)
IACHAR(C)
ACHAR(67)

Converte i para um aproximao de real;


Converte x para um equivalente inteiro;
Converte a para preciso dupla;
Retorna o valor de c da tabela ASCII
Identifica o valor i da tabela ASCII

1.000000
1
0
67
C

36

45-Funes MATEMTICAS

Algumas:

ACOS(x)
ATAN(x)
SIN(x)
COS(x)
COSH(x)
EXP(x)
LOG(x)
LOG10(x)
SQRT(x)

Arcocoseno
Arcotangente
Seno
Coseno
Coseno Hiperblico
ex
Logaritmo natural ou neperiano ln
Logaritmo base 10
Raiz Quadrada

46-Funes NUMRICAS

Algumas:
ABS(a)
INT(a)
MAX(a1,a2,...)
MIN(a1,a2,...)
MOD(a,p)
REAL(a)
DBLE(x)

Valor absoluto
Valor inteiro
Valor mximo
Valor mnimo
Resto da diviso a/p
Converte a para REAL
Converte x para DOUBLE PRECISION

47-Funes CARACTERES

Algumas:
ADJUSTL(str)
ADJUSTR(str)
LEN(str)
REPEAT(str,i)
TRIM(str)

Alinha pela esquerda


Alinha pela direita
Tamanho do string
Repete o string i vezes
Remove brancos a direita

37

48-EXERCCIO 7 Funes Matemticas


1 Caminhe para o diretrio ~/curso/fortran/ex7. Edite o programa PontoNoCirculo.f e
altere o que for necessrio para executar o programa corretamente. Esse programa calcula
as coordenadas x,y de um ponto no crculo, tendo como valores de entrada o raio, r e o
ngulo teta, em graus.
Lembre-se:
(radianos) = ( (graus) /180 ) *
= arctan(1) * 4
seno = y / r
coseno = x / r

38

49-Comando PRINT

Comando que direciona um dado no formatado para sada padro.


PRINT <formato> ,<imp1>,<imp2>,<imp3>, ...
*

Substit ui um formato

O comando PRINT sempre inicia uma nova linha.

Exemplo:
PROGRAM uno
IMPLICIT NONE
CHARACTER(LEN=*), PARAMETER :: &
nome_completo = Mauricio...Silva
REAL :: x, y, z
LOGICAL :: varlog
x = 1; y = 2; z = 3
varlog = (y .EQ. X)
PRINT*, nome_completo
PRINT*,X= ,x, Y = ,y, Z = ,z
PRINT*,Varivel lgica: ,varlog
END PROGRAM uno
Mauricio...Silva
X = 1.000 Y = 2.000 Z = 3.000
Varivel lgica: F

50-Comando READ

Comando que l um dado no formatado da entrada padro, o teclado.

READ <formato> ,<imp1>,<imp2>,<imp3>, ...


*

Substitui um formato

Exemplo:
READ*, nome
READ*, x, y, z
READ*,var1

39

MATRIZES
51-DEFINIO DE MATRIZES

Matrizes ou Arrays so uma coleo de dados armazenados na memria e acessados,


individualmente, de acordo com a sua posio espacial, definida pelas dimenses da
matriz.

Matriz de 1 Dimenso com 15 elementos:

Matriz de 2 dimenses 15 elementos - 5 x 3:

1,1

1,2

1,3

2,1

2,2

2,3

3,1

3,2

3,3

4,1

4,2

4,3

5,1

5,2

5,3

10

11

12

13

14

15

40

52-DECLARAO DE MATRIZES
REAL, DIMENSION(15)
REAL, DIMENSION(1:5,1:3)
REAL

:: X
:: Y,Z
:: T(5,3)

Dimenses: at 7 dimenses;

Limites: O limite inferior e superior ficam separados pelo caractere :. Caso no


exista esse caractere, o limite inferior ser sempre 1 e o limite superior, o informado
na definio da matriz. Se no for informado, ento a alocao de memria ser
dinmica, ou seja, durante a execuo do programa;

Tamanho: O nmero de elementos de uma matriz igual multiplicao dos


elementos em cada dimenso;

Organizao: O Fortran90 no especifica como as matrizes so dispostas em


memria, mas para leitura e impresso, a ordem por coluna, ser utilizada.

41

53-SNTAXE DE MATRIZES

Iniciar os elementos de uma Matriz ( / ... / )

INTEGER, DIMENSION(4) :: mat = (/2,3,4,5/)


REAL, DIMENSION(3,3) :: unida = RESHAPE((/1,0,0,0,1,0,0,0,1/),(/3,3/))

A ao se efetua em toda a Matriz:

A = 0.0
B=C+D

A ao se efetua em alguns elementos de uma Matriz:

A(1) = 0.0
B(0,0) = A(3) + C(5,1)

A ao se efetua para algumas seces de elementos de uma Matriz:

A(2:4) = 0.0
B(-1:0,0:1) = C(1:2, 2:3) + 1.0

54-SECES DE MATRIZES

[<limite1>:<limite2>][<incremento>]

A(:)
A(3:9)
A(8:3:-1)
A(m:)
A(::2)

Toda matriz
A(3) at A(9) de 1 em 1
A(8) at A(3) de 1 em 1
A(m) at limite superior
Toda matriz de 2 em 2

42

55-IMPRESSO E LEITURA DE MATRIZES

Considere A como uma matriz de duas dimenses

Impresso:
PRINT*, A
A(1,1), A(2,1), A(3,1),..., A(1,2), A(2,2), A(3,2),...

Leitura:
READ*, A
Dever informar os dados na ordem acima (ordem por colunas)

Exemplos:

PRINT*, Elemento da Matriz


PRINT*, Seco da Matriz
PRINT*, Sub-Matriz
PRINT*, Toda Matriz
PRINT*, Matriz Transposta
Elemento da Matriz
Seco da Matriz
Sub-Matriz
Toda Matriz
Matriz Transposta

=, a( 3 , 2 )
=, a( : , 1 )
=, a( :2 , :2 )
=, a
=,TRANSPOSE(a)

=6
=123
=1245
=123456789
=147248369

43

56-FUNES DE MATRIZES

REAL, DIMENSION(-10:10,23,14:28) :: A

Algumas funes permitem questionar alguns atributos de matrizes.

LBOUND(SOURCE[,DIM])

Identifica o limite inferior das dimenses de uma matriz


LBOUND(A) Resultado uma matriz com (/-10,1,14/)
LBOUND(A,1) Resultado um escalar 10

UBOUND(SOURCE[,DIM])

Identifica o limite superior das dimenses de uma matriz

SHAPE(SOURCE), RESHAPE(SOURCE,SHAPE)

Identifica qual a aparncia de uma matriz


SHAPE(A)
Resultado uma matriz (/21,23,15/)
SHAPE((/4/))
Resultado uma matriz (/1/)
RESHAPE((/1,2,3,4/),(/2,2/)) Resultado uma matriz 2 por 2

SIZE(SOURCE[,DIM])

Identifica o numero de elementos de uma dimenso da matriz


SIZE(A,1)
SIZE(A)

21
7245

44

57-ALOCAO DE MATRIZES

O Fortran90 permite a alocao dinmica de memria. Para isso ser necessrio utilizar
os comandos ALLOCATABLE, ALLOCATE, ALLOCATED e DEALLOCATE.

Na declarao das matrizes - ALLOCATABLE :

INTEGER, DIMENSION( : ), ALLOCATABLE :: idade


REAL, DIMENSION( : , : ), ALLOCATABLE :: velo

! 1D
! 2D

Alocao de memria - ALLOCATE :

READ*, isize
ALLOCATE(idade(isize), STAT=err)
IF (err /= 0) PRINT*, idade : Falhou a alocao de memria
ALLOCATE(velo(0:isize-1,10), STAT=err)
IF (err /= 0) PRINT*, velo : Falhou a alocao de memria

Liberao de memria ALLOCATED e DEALLOCATE

IF (ALLOCATED(idade)) DEALLOCATE(idade, STAT=err)

OBS: O espao de memria de uma matriz permanece alocado at ser efetuado um


DEALLOCATED ou at o fim do programa

45

58-EXERCCIO 8 DEFINIO DE MATRIZES


1 Analise as declaraes abaixo e identifique para cada uma o que solicitado:
REAL, DIMENSION(1:10) :: ONE
Quantas dimenses?

________

Limite(s) inferior(es)?

________

Limite(s) Superior(es)?

________

Tamanho da matriz?

________

REAL, DIMENSION(2,0:2) :: TWO


Quantas dimenses?

________

Limite(s) inferior(es)?

________

Limite(s) Superior(es)?

________

Tamanho da matriz?

________

INTEGER, DIMENSION(-1:1,3,2) :: THREE


Quantas dimenses?

________

Limite(s) inferior(es)?

________

Limite(s) Superior(es)?

________

Tamanho da matriz?

________

REAL, DIMENSION(0:1,3) :: FOUR


Quantas dimenses?

________

Limite(s) inferior(es)?

________

Limite(s) Superior(es)?

________

Tamanho da matriz?

________

OBS: A soluo est no diretrio ~/curso/fortran/ex8

46

59-EXERCCIO 9 FUNES DE MATRIZES


1 Dado a seguinte declarao de matriz:
INTEGER, DIMENSION(-1:1,3,2) :: A

2 Escreva um pequeno programa no diretrio ~/curso/fortran/ex9 , que possua algumas


funes de matrizes que identificam:
a.
b.
c.
d.

O nmero total de elementos em A;


A aparncia de A (Funo SHAPE);
O limite inferior da dimenso 2;
O limite superior da dimenso 3.

OBS: A soluo est no arquivo soluo.f. Tente fazer sem olhar!!!

60-EXERCCIO 10 USO DE MATRIZES


1 O salrio recebido por alguns funcionrios de uma empresa foi:
10500, 16140, 22300, 15960, 14150, 12180, 13230, 15760, 31000
e a posio hierrquica de cada funcionrio , respectivamente:
1, 2, 3, 2, 1, 1, 1, 2, 3

2 Caminhe para o diretrio ~/curso/fortran/ex10. Edite o programa MatrizSalario.f .


Codifique o que solicitado nas reticncias. Esse programa calcula o custo total que a
companhia ter com o incremento de 5%, 4% e 2% para as categorias 1, 2 e 3
respectivamente.

47

SECES PRINCIPAIS DE PROGRAMAS


61-SECES DE UM PROGRAMA FORTRAN

O Fortran90 possui duas seces principais de programa:

PROGRAM
Seco principal do programa aonde a execuo inicia e finaliza. Pode conter vrios
procedimentos.

MODULE
Seco do programa que pode conter novas declaraes e procedimentos, e que pode
ser anexado ao programa principal.

O Fortran90 possui dois tipos de procedimentos:

SUBROUTINE
Um programa com parmetros de entrada e sada que pode ser chamada de dentro do
programa principal com o comando CALL
CALL relatorio(titulo)

FUNCTION
Similar a uma SUBROUTINE, no entanto, retorna um nico valor e pode ser
executado de dentro de um coma ndo.
PRINT*, Resultado da Funo : , f(x)

48

62-PROGRAMA PRINCIPAL
PROGRAM principal
! Comandos de declarao
! Comandos executveis
CONTAINS
SUBROUTINE sub1(...)
!Comandos executveis
END SUBROUTINE sub1
! ...
FUNCTION func(...)
!Comandos executveis
END FUNCTION func
END PROGRAM principal

O comando PROGRAM opcional, assim como o nome do programa, mas uma boa
prtica sempre us- los.

O programa principal pode conter declaraes, comandos executveis e procedimentos


internos: Sub-rotinas e funes definidas pelo usurio. Esses procedimentos so
separados do resto do programa pelo comando CONTAINS.

Exemplo:

PROGRAM main
IMPLICIT NONE
REAL :: x
READ*, x
PRINT*, SQRT(x) ! Funo interna
PRINT*, Negative(x) ! Funo do usurio
CONTAINS
REAL FUNCTION Negative(a)
REAL, INTENT(IN) :: a
Negative = -a
END FUNCTION Negative
END PROGRAM Main

49

63-PROCEDIMENTOS

Internos: 113 do Fortran90

Bibliotecas:

NAG Numerical Library, 300+


BLAS Basic Linear Algebra Subroutine
IMSL
LAPACK
SCALAPACK
Uniras

64-Procedimentos: SUBROUTINE
SUBROUTINE <nome> [(<argumentos>)]
Declarao dos argumentos dummy
Declarao dos objetos
Comandos executveis
END [SUBROUTINE [<nome>]]

Para se definir uma Sub-rotina usa-se a estrutura SUBROUTINE END SUBROUTIE;

Para se usar uma Sub-rotina usa-se o comando CALL;

Uma Sub-rotina pode enxergar todas as variveis declaradas no programa principal;

Uma Sub-rotina pode incluir chamadas a outras sub-rotinas

Exemplo:
PROGRAM algo
IMPLICIT NONE
...
CALL ImprimeNum(numeros)
...
CONTAINS
SUBROUTINE ImprimeNum(num)
REAL, DIMENSION(:), INTENT(IN) :: num
PRINT*,Esses so os nmeros, num
END SUBROUTINE ImprimeNum
END PROGRAM algo

50

65-Procedimentos: FUNCTION

[<Tipo da Funo>] FUNCTION <nome> [(<argumentos>)]


Declarao dos argumentos dummy
Declarao dos objetos
Comandos executveis
Comando de atribuio do resultado
END [FUNCTION [<nome>]]

Funo funciona sobre o mesmo princpio de Sub-rotina, com a exceo que a funo
retorna um valor;

Uma funo definida usando-se a estrutura FUNCTION END FUNCTION;

Pra usar uma funo, basta cham- la pelo nome;

Funo pode ser definida na rea de declarao de variveis quando se identifica o tipo
da funo.

Exemplo:

PROGRAM algo
IMPLICIT NONE
...
PRINT*, F(a,b)
...
CONTAINS
REAL FUNCTION F(x,y)
REAL, INTENT(IN) :: x,y
F=SQRT(x*x + y*y)
END FUNTION F
END PROGRAM algo

51

66-EXERCCIO 11 B SUBROTINA
1 B Caminhe para o diretrio ~/curso/Fortran/ex11. Edite o arquivo Subrotina.f e adicione a
sub-rotina de acordo com a descrio do problema.
Esse programa possui uma rotina interna que retorna, como primeiro argumento, a soma de
dois nmeros reais.
Sub-rotina summy(arg1, arg2, arg3)
arg1
arg2
arg3

varivel com resultado


varivel com 11 nmero
varivel com 21 nmero

arg1=arg2+arg3
O programa principal dever chamar a rotina trs vezes e imprimir o resultado:
1. Nmeros: 2.6 e 3.1
2. Nmeros: 6.1 e 9.2
3. Nmeros: 0.1 e 0.555

67-EXERCCIO 12 B FUNO
1 B Caminhe para o diretrio ~/curso/Fortran/ex12. Edite o arquivo funcao.f e adicione a
funo de acordo com a descrio do problema.
Esse programa possui uma funo interna que retorna a soma de dois nmeros reais, fornecido
pelos argumentos.
Funo real summy(arg1,arg2)
Arg1
Arg2

varivel com 11 nmero


varivel com 21 nmero

summy=arg1+arg2
O programa principal dever chamar a rotina quatro vezes e imprimir o resultado:
1.
2.
3.
4.

Nmeros: 1.0 e 2.0


Nmeros: 1.0 e -1.0
Nmeros: 0.0 e 0.0
Nmeros: 1.0E54 e 9192652.0

52

68-EXERCCIO 13 B PROCEDIMENTOS

1 B Caminhe para o diretrio ~/curso/Fortran/ex13. Edite o arquivo NumeroRandomico.f e


substitua pelo comando adequado nas reticncias.

Esse programa chama uma funo que por sua vez chama a duas vezes a sub-rotina do
Fortran90, RANDOM_NUMBER(r), para obter um nmero randmico e simular um
arremesso de dados.
2-Mesmo aps substituir as reticncias pelos comandos adequados, haver erros na
compilao. Leia com ateno os provveis erros e tente corrigi- los.

53

69-Seco de programa: MODULE

MODULE uma seco de programa Fortran90, independente do programa principal,


podendo ser compilado e utilizado por diversos programas como se fosse uma subrotina externa;

Normalmente, um MODULE criado quando se percebe que o cdigo pode ser


utilizado em diversas situaes diferentes;

Define classes em orientao a objetos.

Sintaxe:
MODULE <nome>
<Comandos de declarao>
[ CONTAINS
<Definio de procedimentos>]
END [ MODULE [ <nome> ]]

Exemplo: Declara as variveis X, Y e Z como variveis reais globais.


MODULE global
REAL, SAVE :: X, Y, Z
END MODULE global

Para se utilizar um MODULE usa-se o comando USE

PROGRAM teste
USE <nome>
IMLPICIT NONE
...
END PROGRAM teste

54

70-EXERCCIO 14 B DEFINIO DE UM MDULO


1 B Caminhe para o diretrio ~/curso/Fortran/ex14. Edite o programa DefModulo.f

Esse programa cria um mdulo que possui duas definies de funes que calculam a mdia e
o desvio padro de um vetor real de tamanho indefinido. O mdulo tambm registra quantas
vezes as funes foram utilizadas.
2 B Substitua as linhas com reticncias com o comando adequado a definio de um mdulo.

3 Efetue somente a compilao do programa, para apenas gerar o objeto e o mdulo:


%xlf90 Bc DefModulo.f

71-EXERCCIO 15 B USO DE UM MDULO


1 B Caminhe para o diretrio ~/curso/Fortran/ex15. Edite o programa UsoModulo.f
2 B Substitua as linhas com reticncias com o comando adequado ao uso de um mdulo.

3 - Compile o programa apenas gerando o objeto:


%xlf90 Bc UsoModulo.f
4 B Copie o objeto e o mdulo gerado no exerccio anterior para este diretrio. Crie o
executvel Alinkando@ os dois objetos:
%xlf90 Bo Teste_modulo UsoModulo.o DefModulo.o
5 B Execute o programa com os seguintes valores de entrada:
3.0 17.0 B7.56 78.1 99.99 0.8 11.7 33.8 29.6
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 11.0 12.0 13.0 14.0

55

ENTRADA E SADA

72-ENTRADA / SADA

O Fortran90 possui uma grande variedade de opes de I/O, que permitem diferentes
tipos de arquivos se conectarem ao programa principal para leitura e gravao.

Em Fortran90, um arquivo conectado uma unidade lgica definida por um nmero.

Cada unidade pode possuir diversas propriedades:

Arquivo

Nome do arquivo conectado;

Ao

Leitura, Gravao, Leitura e Gravao;

Status

old, new, replace

Mtodo de acesso

Seqencial, Direto

56

73-Comando OPEN
OPEN([UNIT=]<inteiro>, &
FILE=<arquivo>, ERR=<rtulo>, &
STATUS=<status>, ACCESS=<mtodo>, &
ACTION=<modo>, RECL=<expresso>)

Utilizado para conectar um arquivo a uma unidade lgica e definir algumas


caractersticas de conexo.

UNIT=

Especifica um nmero de referncia ao nome do arquivo;

FILE=

Especifica (entre aspas) o nome do arquivo que ser conectado;

ERR=

Especifica uma posio lgica de controle caso haja algum erro na abertura
do arquivo;

STATUS=

Especifica (entre aspas) o status do arquivo:

>OLD=
>NEW=
>REPLACE=
>SCRATCH=
>UNKNOW=
ACCESS=

O arquivo j existe;
O arquivo no existe;
O arquivo ser sobreposto;
O arquivo temporrio e ser apagado quando fechado (CLOSE);
Desconhecido;

Especifica (entre aspas) o mtodo de acesso:

>DIRECT=
>SEQUENTIAL=
ACTION=

Especifica (entre aspas) o modo de acesso ao arquivo:

>READ=
>WRITE=
>READWRITE=
RECl=

Acesso direto a registros individuais. obrigado a usar a


opo RECL;
Acesso seqencial, linha por linha;

Somente leitura;
Somente gravao;
Leitura e gravao;

Especifica o tamanho mximo de um registro aberto para acesso direto.

Exemplo:
OPEN(17,FILE=>saida.dat=,ERR=10,STATUS=>REPLACE=,&
ACCESS=>SEQUENTIAL=,ACTION=>WRITE=)
OPEN(14,FILE=>entra.dat=,ERR=10,STATUS=>OLD=,&
RECL=exp, ACCESS=>DIRECT=,ACTION=>READ=)

57

74-Comando READ
READ([UNIT=]<inteiro>, [FMT]=<formato>,&
IOSTAT=<int -var>, ERR=<rtulo>, &
END=<rtulo>, EOR=<label>, &
ADVANCE=<modo>, REC=<expresso>,&
SIZE=<num-caracteres>) <lista de variveis>

No caso do comando de leitura, algumas caractersticas de conexo no podem ser


utilizadas juntas.

UNIT=

Especifica um nmero de referncia a unidade de leitura ( * representa a


unidade default);

FMT=

Especifica (entre aspas) o formato da leitura dos dados;

ERR=

Especifica uma posio lgica de controle caso haja algum erro de leitura;

IOSTAT=

Cdigo de retorno. Zero significa sem erros;

END=

Especifica uma posio lgica de controle caso ocorra erro de fim de


arquivo;

EOR=

Especifica uma posio lgica de controle caso ocorra erro de fim de


registro;

REC=

Especifica o nmero do registro que deve ser lido no modo de acesso direto;

ADVANCE= Especifica >YES= ou >NO=, se deve ou no iniciar a leitura em um novo


registro;
SIZE=

Retorna, para uma varivel, o nmero de caracteres lidos

Exemplo:

READ(14,FMT=>(3(F10.7,1x))=,REC=exp) a,b,c
READ(*, >(A)=, ADVANCE=>NO=,EOR=12,SIZE=nch) str

58

75-Comando WRITE
WRITE([UNIT=]<inteiro>, [FMT]=<formato>,&
IOSTAT=<int -var>, ERR=<rtulo>, &
ADVANCE=<modo>, &
REC=<expresso>) <lista de variveis>

No caso do comando de gravao, algumas caractersticas de conexo no podem ser


utilizadas juntas.

UNIT=

Especifica um nmero de referncia a unidade de gravao ( * unidade


default);

FMT=

Especifica (entre aspas) o formato de gravao dos dados;

ERR=

Especifica uma posio lgica de controle caso haja algum erro de gravao;

IOSTAT=

Cdigo de retorno. Zero significa sem erros;

REC=

Especifica o nmero do registro que deve ser lido no modo de acesso direto;

ADVANCE= Especifica >YES= ou >NO=, se deve ou no iniciar a leitura em um novo


registro;

Exemplo:
WRITE(17,FMT=>(I4)=,IOSTAT=stat, ERR=10) val
WRITE(*, >(A)=, ADVANCE=>NO=) >Amarelo=

59

76 - Comando FORMAT/FMT=

Comando que especifica o formato na qual os dados sero lidos ou gravados.

Exemplo:
WRITE(17,FMT=>(2X,I4,1X,I4,1X,==Nome:==,A7)=) i, j, str
11 -195 Nome: Felipe

WRITE(*, FMT=10) a, b
10 FORMAT(>vals=,2(F15.6,2X))

Vals

-1.051330

333356.000033

77-Descritores de Formatos
Iw

w nmero de dgitos inteiros

Fw.d

w nmero de dgitos reais e d nmero de decimais

Ew.d

w dgitos reais e d decimais em notao cientfica

Lw

w nmero de caracteres lgicos

A[w]

w numero de caracteres

nX

pula n espaos

78-Outros comandos de I/O


CLOSE

Fecha um arquivo

REWIND

Re-posiciona a leitura no primeiro registro

BACKSPACE

Volta a leitura em um registro

ENDFILE

Fora a gravao de uma marca de fim de arquivo

60

79-Comando DATA

Comando que permite iniciar uma lista de variveis.

DATA <lista1> /<dados1>/, <lista2> /<dados2>/,...<listan> /<dadosn>/

Exemplo:

INTEGER :: count, I, J
REAL :: inc, max, min
CHARACTER(LEN=5) :: luz
LOGICAL :: vermelho, azul, verde
DATA count/0/, I/5/, J/100/
DATA inc, max, min/1.0E-05, 10.0E+05, -10.0E+05/
DATA luz/=Clara=/
DATA vermelho/.TRUE./, azul, verde/.FALSE.,.FALSE./

61

80-EXERCICIOS 16 B I/O
1 - Caminhe para o diretrio ~/curso/Fortran/ex16. Edite o programa Write_io.f. Substitua
as reticncias pelo comando adequado.
Esse programa solicita dados para serem digitados e os grava em um arquivo.
2 B Compile e execute o programa, testando com os seguintes valores:
Blair
94. 97. 97. 94.
Major
2. 6. 6. 5.
Ashdown 49. 28. 77. 66.
END
0. 0. 0. 0.
3 - Edite o programa Read_io.f. Substitua as reticncias pelo comando adequado.
4 - Compile e execute o programa.

81-EXERCICIOS 17 B FORMATAO
1 B Dado o comando abaixo:
READ(*,'(F10.3,A2,L10)') A,C,L
Como ser representado o valor de A (REAL), o valor de C (CHARACTER de tamanho 2) e
o valor de L LOGICAL logical) para os seguintes valores de dados? (OBS: b significa espao
em branco.)
bbb5.34bbbNOb.TRUE.
5.34bbbbbbYbbFbbbbb
b6bbbbbb3211bbbbbbT
bbbbbbbbbbbbbbbbbbF
2 - Caminhe para o diretrio ~/curso/Fortran/ex17. Edite o programa IOFormatado.f.
Substitua as reticncias pelo comando adequado.
Esse programa gera um arquivo com linhas de cabealho e linhas de dados, sendo: NAME
(at 15 caracteres), AGE (at 3 dgitos), HEIGHT (em metros 4 posies e 2 decimais) e o
FONE ( 4 dgitos inteiros).
Height
Name
Age
(metres)
Tel. No.
-----------------Bloggs J. G.
45
1.80
3456
Clinton P. J.
47
1.75
6783

62

82-REFERNCIAS
1 B IBM XL Fortran 8.1 User=s Guide
2 B IBM XL Fortran 8.1 Language Reference
3 B INTEL Fortran 9 Language Reference
4 B The University of Liverpool B Fortran 90 Programming
Dr. A.C. Marshall

Você também pode gostar