Vous êtes sur la page 1sur 124

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1. Introduo
1.1 Formato do programa fonte
No Fortran 90 no existe uma coluna especfica para iniciar o programa. Pode-se comear
a escrever um programa a partir da coluna 1, e esta pode se extender at a coluna 132. Alm
disto, os caracteres em branco so irrelevantes em qualquer lugar do cdigo, exceto quando
estiverem sendo utilizados entre apstrofes. Neste caso cada caracter em branco, ser avaliado na
composio final do string.
Mais de um comando pode aparecer em uma linha simples. O separador de linhas padro
do Fortran 90 o ; (ponto e vrgula). Multiplos ; em uma linha, com ou sem brancos, so
considerados como um separador simples. O final de uma linha considerado um separador
tambm, mas um ; no final de uma linha no considerado um comentrio e considerado
como um separador simples.
Uma linha com um ! em qualquer parte da mesma, considerado um comentrio (
direita do !).
Exemplos:
x=1.0; y=2.3
! Se um ; for includo no final de uma linha, sem nenhum comando aps o mesmo, o ;
desconsiderado.
z=9.3;
! Consecutivos ; so considerados como um nico.
Todos os programas fontes em Fortran 90, devem iniciar com a seguinte linha:
program <nome_do_programa>
Esta linha indica que o programa principal ser iniciado. O <nome_do_programa> deve
ser substitudo pelo nome que o autor deseja para o seu cdigo. Este nome utilizado para
referncias internas no programa, sendo que o nome externo (arquivo) do programa pode ser
completamente diferente.
Para encerrar um programa, deve-se colocar a seguinte linha:
end program <nome_do_programa>

Introduo

1-1

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Esta

construo

dever

aparecer

em

todas

as

rotinas

do

programa.

<nome_do_programa> no obrigatrio. Caso seja omitido, a palavra chave program, tambm


deve ficar de fora. Abaixo, um exemplo tpico de um programa em Fortran 90:
1.
2.
3.
4.

program first
implicit none
write (*,*) Hello, world
end program first
O programa acima, quando executado, escrever apenas a mensagem Hello, world, na

tela do computador.

1.2 Entrada e sada padro


O Fortran 90 possui trs comandos de entrada/sada de dados padro. O comando de
leitura :
read (*,*) <lista_de_variveis>
Onde <lista_de_variveis>, so as variveis que devero receber seus valores via teclado.
O comando read ser apresentado em detalhes no captulo 10. A declarao de variveis ser
apresentada no captulo 2.
O comando read no aceita que sejam impressas mensagens junto com a leitura.
Quaisquer mensagens que o programador quiser, dever imprimir em separado com os comandos
print ou write.
Para a escrita, existem dois comandos:
write (*,*) <mensagem>,<lista_de_variveis>
O objetivo do comando write, escrever no dispositivo de sada padro (vdeo). Com o
comando write, possvel escrever-se mensagens ou ento o contedo de variveis declaradas
no programa. As mensagens so colocadas entre apstrofes. Exemplos de mensagens:
write (*,*) Teste do dia
write (*,*) valor da varivel
write (*,*) Matriz lida:
write (*,*) <mensagem>,<lista_de_variveis>
No comando acima, observa-se a presena de dois asteriscos:

Introduo

1-2

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


O primeiro informa ao compilador em qual dispositivo de sada padro devero ser
mandados os dados ou mensagens presentes no comando. Os comandos de entrada e sada
em arquivo sero discutdos em detalhes no captulo 10. A sada padro representada pelo
asterisco (*).
O segundo informa ao compilador se os dados a serem impressos possuem um formato
especfico ou se esto em formato livre, que representado pelo (*). Os formatos de entrada
e sada so discutidos no captulo 11.
Exemplos:
write(*,*) Teste de impresso
write(5,*) Gravando no arquivo de nmero 5, com varivel: ,var
write(*,100) x,y,z
No exemplo acima, as variveis x, y e z sero impressas conforme o formato descrito na
linha 100.
write(10,F15.10) a
No exemplo acima, a varivel a ser impressa no arquivo apontado por 10, com o
formato F15.10. Os formatos de impresso de dados sero discutidos no captulo 11.
Quando se quiser imprimir as informaes no dispositivo de sada padro (vdeo), pode-se
informar apenas o formato de sada que se quer. Exemplo:
write *,teste
write *,Valor da varivel: ,a

1.3 Declarao implicit none


Cada varivel ou constante utilizado em um programa, possui um tipo e um nome. A
declarao implicit none especifica que todas as variveis que forem utilizadas dentro do
programa devem ser declaradas. O exemplo abaixo mostra um programa em Fortran 90 que l
um valor real e o imprime:

Introduo

1-3

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1.
2.
3.
4.
5.
6.
7.

program le_valor
implicit none
real
:: a
write (*,*) Informe o valor de a:
read (*,*) a
write (*,*) Valor lido: ,a
end program le_valor
Se no fosse especificada a declarao implicit none, a varivel a assumiria o tipo real.

O Fortran nas suas verses anteriores possuia uma declarao implcita de tipos. Na faixa I-N,
todas as variveis eram inteiras e as demais, reais.
Importante salientar, a posio onde aparece a declarao implicit none. Ela dever ser
a Segunda linha de programa a ser especificada. Antes dela deve aparecer apenas a linha
indicando qual o nome do programa em Fortran 90.

1.4 Continuao de linha


No Fortran 90 o (&) usado como o smbolo de continuao de linha. Se o ltimo
caracter de uma linha for um &, o comando continuada na primeira linha que no houver
comentrio, com a colocao de um outro & no incio da linha. Os & utilizados como
smbolos de continuao no so considerados como parte do comando. Os & podem ser
utilizados, alm de continuidade de uma linha, como continuao de uma constante caracter.
Caso o & deva ser considerado como parte do texto ou string, ento deve-se repetir a sua
ocorrncia.
Exemplo 1:
nota_do_aluno = nota_um + &
& nota_2+nota_3
Exemplo 2:
! Como constante caracter:
nome_da_empresa = Joo &&
& filhos
! O resultado acima : nome_da_empresa=Joo & filhos

Introduo

1-4

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1.5 Exerccios resolvidos


1. Escrever um programa em Fortran 90, que imprime a seguinte mensagem:
Teste de programa.
1.
2.
3.
4.
5.

program second
implicit none
write(*,*) Teste de programa
stop
end program second
2. Escrever um programa que leia um valor real, e imprime a sua potncia de 2.

1.
2.
3.
4.
5.
6.
7.
8.

program pot2
implicit none
real
:: num
write(*,*) Informe um valor:
read(*,*) num
write(*,*) A potncia de dois do valor : ,2**num
stop
end program pot2

Na linha 6, observa-se a presena de dois asteriscos (*). Estes dois asteriscos


representam a potncia em Fortran 90.
3. Escrever um programa que l um valor e calcula a sua raiz quadrada:
1.
2.
3.
4.
5.
6.
7.
8.

program le_val
implicit none
real
:: valor
write(*,*) Informe um valor:
read(*,*) valor
write(*,*) A potencia de 2 de ,valor, eh: ,valor**0.5
stop
end program le_val

Na linha 6 do programa acima, observa-se que o valor est elevado a uma potncia
0.5, o que representa o clculo da raiz quadrada de um nmero. A linha 6 poderia
ser reescrita da seguinte maneira:
6. write(*,*) A potncia de 2 de ,valor,eh: ,sqrt(valor)

Onde sqrt, uma funo intrnseca que calcula a raiz quadrada de um nmero real.

Introduo

1-5

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


4. Escrever um programa que l dois valores reais, e imprime a multiplicao
entre os dois.
1. program le_dois
2. implicit none
3. real
:: a
4. real
:: b
5. write(*,*) Informe os dois valores:
6. read(*,*) a
7. read(*,*) b
8. write(*,*) A multiplicao dos dois eh: ,a*b
9. stop
10. end program le_dois

No exerccio acima, as linhas 6 e 7 podem ser comprimidas em uma linha s,


como no exemplo abaixo:
read(*,*) a,b
Neste caso, o Fortran agir de duas formas distintas: Na primeira, ele aguardar
que o usurio informe dois numeros via teclado, separados por vrgula, ou ento
dever ser informado um valor, pressionando-se a tecla <<enter>> e ento digitase o segundo valor.
Comentrios gerais: Nos programas acima, pode-se observar algumas coisas em
comum. Como visto anteriormente, todos possuem em comum as duas linhas
iniciais e as duas linhas finais, mudando apenas o nome do programa em questo.
Um outro detalhe a ser salientado diz respeito a declarao de variveis, que dever
aparecer antes de qualquer comando executvel do Fortran 90.

Introduo

1-6

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1.6 Exerccios propostos:


1. Escrever um programa que imprime a seguinte mensagem: Segunda-feira
um bom dia para o trabalho.
2. Escrever um programa que l um valor real, e imprime a metade dele.
3. Escrever um programa que l dois valores, e imprime a diferena entre os
dois.
4. Escrever um programa que l dois valores, e imprime o primeiro elevado na
raiz quadrada do segundo.
5. Escrever um programa que l dois valores, e imprime a raiz quadrada da
diviso do primeiro pelo segundo.
6. Escrever um programa que l um ngulo, e calcula o seno, o cosseno e a
tangente do mesmo. Lembrete: as funes intrnsecas so: sin, cos, tan.
Importante salientar que os ngulos so em radianos.

Introduo

1-7

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

2. Tipos de dados
2.1 Introduo
Fortran foi projetado para dar aos cientistas e pesquisadores uma forma fcil de resolver
problemas usando computadores. As declaraes de variveis, e os comandos da linguagem, no
geral, se parecem como frases em ingls.

2.2 Conjunto de caracteres


No Fortran, os elementos bsicos, ou conjunto de caracteres, so as 26 letras do alfabeto,
os 10 nmeros arbicos, o underscore _ e um conjunto de caracteres especiais apresentados na
Tabela 2-1. Dentro da sintaxe da linguagem, no existem diferenas entre letras maisculas e
minsculas. As letras, os numerais, e o underscore so conhecidos como caracteres
alfanumricos. Neste documento as palavras chaves e funes intrnsecas do fortran sero
escritas em negrito, funes ou atributos, que no necessariamente precisam aparecer, entre
colchetes [ ] e por fim, as variveis utilizadas nos exemplos e programas, sero escritas em
itlico.
Tabela 2-1 Caracteres especiais do Fortran 90
Caracter

Nome

Caracter

Nome

Igual

dois pontos

Soma

Subtrao

Exclamao

Multiplicao

Aspas

Diviso

Percent

Parnteses esquerdo

&

E comercial

Parnteses direito

ponto e vrgula

Vrgula

marca de questo

ponto decimal

**

Potncia

smbolo corrente

Apostrofe

branco

A tabela 2-2 apresenta a relao de operadores relacionais do Fortran 90. Na coluna 1, o


significado do operador, na coluna 2, sua representao com caracteres, e na coluna 3, sua
Tpos de dados

2-8

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

representao com smbolos. Qualquer uma das duas representaes vlida, com a diferena
que a de smbolos mais moderna que a com caracteres, e a representao em caracteres
considerada obsoleta.
Significado

Caracteres

Smbolos

Maior que

.GT.

>

Menor que

.LT.

<

Igual a

.EQ.

==

Maior ou igual

.GE.

>=

Menor ou igual

.LE.

<=

Diferente de

.NE.

/=

Tabela 2-2 Operadores relacionais

2.3 Os tipos intrnsecos


Os tipos de dados intrnsecos, esto divididos em duas classes. A primeira contm os trs
tipos numricos que so os mais utilizados dentro da linguagem, que so os inteiros, reais e
complexos. A segunda classe contm os tipos de dados no numricos, que so utilizados para
aplicaes tais como processamento de texto e operaes lgicas. Todos os tipos intrnsecos
aceitam os seguintes operadores numricos:
Operador

Significado

Soma

subtrao

multiplicao

diviso

**

potncia

Tabela 2-3 - Operadores numricos

2.4 Inteiro
O nome, no Fortran do tipo inteiro integer. Este tipo armazena apenas a parte inteira de
um nmero. Exemplos: 123, 8932, 5. O formato abaixo apresenta a declarao de objetos
inteiros:
Integer

:: varivel
Tpos de dados

2-9

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

O tipo de dados inteiro possui valores que representam um subconjunto dos inteiros
matemticos.
Programa exemplo:
1.
2.
3.
4.
5.
6.
7.
8.

program inteiro
implicit none
integer
:: x
! O valor a ser digitado, no poder conter ponto (.). Caso isto acontea, vai gerar um
! erro de execuo no programa, devido a entrada indevida.
read (*,*) x
write (*,*) Valor lido: ,x
end program inteiro

2.5 Real
O tipo de dado real, composto de 4 partes, assim dispostas: Uma parte inteira, com ou
sem sinal, um ponto decimal, uma parte fracionria, e um expoente tambm com ou sem sinal.
Uma das duas ou ambas partes inteira e fracionria devem estar presentes. Se a parte exponencial
estiver presente, ela vai consistir da letra E seguida de um inteiro com ou sem sinal. Um exemplo
:-10.6E-11, que significa -10.6 x 10-11 , 1, 2.9321321, 3.1415926.
A declarao do tipo real, idntica ao do tipo inteiro:
real

:: varivel

Programa exemplo:
1.
2.
3.
4.
5.
6.

program var_real
implicit none
real
:: a
a=10
write (*,*) Valor de a: ,a
end program var_real

2.6 Double precision


Uma declarao double precision define as variveis de tipo real, com preciso dupla.
Sua declarao idntica aos nmeros reais:
double precision

:: varivel

Este tipo de declarao considerada obsoleta. A declarao de nmeros com dupla


preciso deve ser feita da seguinte forma:
Real(kind=8)

:: varivel

Exemplos de nmeros com dupla preciso:


Tpos de dados

2-10

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1
2.0D+05
0.31415d+01
Programa exemplo:
1.
2.
3.
4.
5.
6.

program var_double
implicit none
double precision
b=15e93
write (*,*) Valor de a: ,b
end program var_double

:: b

2.6.1 Complexo
Um nmero complexo, formado por dois nmeros reais. O primeiro deles, representa a
parte real do nmero, e a segunda parte, representa a parte imaginria. Quando uma varivel
complexa declarada, as duas partes da mesma, recebem o mesmo tipo.. Os operadores
relacionais so: ==, /=. Os operadores aritmticos especificam a aritmtica complexa. Os
operadores relacionais comparam operandos para produzir resultados lgicos. O resultado de
uma operao aritmtica com variveis complexas uma varivel complexa. Se uma das
variveis for real ou inteira, o resultado final ser complexo. Exemplos: (2,3), (-1,0), (0,-4.32)
A declarao da varivel complexa, segue o mesmo estilo das duas anteriores:
Complex

:: varivel

Programa exemplo:

Tpos de dados

2-11

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1. program var_complexa
2. implicit none
3. complex
:: a
4. complex
:: b
5. complex
:: c
6. ! Atribui o valor 5-5i varivel a
7. a=(5,-5)
8. ! b recebe o valor: (-2,3.5). A entrada dos dados, deve ser feita exatamente
9. ! como apresentado.
10. read (*,*) b
11. c=a*b
12. write (*,*) O valor de c eh: ,c
13. ! a sada ter como resultado: -7,5 - 27,5 i
14. end program var_complexa

2.7 Character
O tipo padro consiste de um conjunto de caracteres contidos em um par de apstrofes ou
aspas. Os caracteres no esto restritos ao conjunto de caracteres padro definido na seo (2.2).
Qualquer caracter que possa ser representado, pode ser permitido, exceto os caracteres de
controle tais como o return. Podem ser maisculas ou minsculas em um processador que
suporte ambos. Os apstrofes ou as aspas servem como delimitadores e no so considerados
como parte integrante do conjunto. Exemplos:
bom Dia
BRASIL
Fortran 90
A declarao do tipo character, possui 3 formas que so consideradas corretas:
1. character*NNN

:: varivel

2. character (len=NNN)

:: varivel

3. character(NNN)

:: varivel

Onde NNN o tamanho do conjunto de caracteres que se quer definir.


A leitura de dados do tipo caracter observa o mesmo formato dos tipos anteriores. Basta
que se declare uma varivel do tipo character, e o compilador ler a mesma diretamente do
teclado. Se for informado um string maior que o declarado, ser truncado. Se for informado um
string menor que o declarado, ser preenchido com brancos direita do string.
Programa exemplo:

Tpos de dados

2-12

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

1.
2.
3.
4.
5.
6.

program le_character
implicit none
character(10)
:: str_read
read (*,(A10)) str_read
write (*,*) Valor lido: ,str_read
end program le_character

Observa-se na linha 4 do programa acima, que o comando read, possui o seguinte


formato: (A10). Este formato est indicando para o Fortran 90, que ele dever ler
um tipo caracter, e este dever ter no mximo 10 caracteres. Caso esta informao
no seja dada, e o formato for livre (*), o programa ler normalmente as
informaes, com a diferena, neste caso que se a tecla de espao for pressionada,
o compilador entender apenas a primeira parte e tudo o que for digitado aps a
tecla de espao ser desconsiderado.
Exemplo:
1.
2.
3.
4.
5.
6.
7.

program le_character_com_espao
implicit none
character(N=20)
:: nome
read(*,*) nome
write(*,*) Nome lido: , nome
stop
end program le_character_com_espao

2.8 Logical
O tipo logical define variveis lgicas. Uma varivel lgica s pode assumir dois valores.
Verdadeiro e falso. A representao dos dois estados possveis de uma varivel lgica so: .True.
para verdadeiro, e .False. para falso.
Declarao:
Logical

:: variveis

Tpos de dados

2-13

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

2.9 Exerccios resolvidos


1. Qual ser o contedo de a, b, c, d aps as operaes com as linhas 5 at 9.
1.
2.
3.
4.
5.
6.
7.
8.
9.

integer
integer
integer
integer
a=13
b=12
c=a/b
a=a*c
d=a*b/(c+a)

:: a
:: b
:: c
:: d

Resposta:
Linha 7: c=13/12 1
Linha 8: a=13*c 13
Linha 9: d=13*12/(1+13) 11
2. Qual ser o contedo de x e y depois das seguintes operaes:
1.
2.
3.
4.
5.
6.
7.
8.
9.

real
real
real
real
t=15.25
z=17.12
x=t*z
y=sqrt(1/x)
z=y*x

:: x
:: y
:: z
:: t

Resposta:
Linha 5: t=15.25
Linha 6: z=17.12
Linha 7: x=15.25*17.12 261.08
Linha 8: y=(1/261,08)**.5 0.061889
Linha 9: z=16.157970

Tpos de dados

2-14

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


3. Verifique o resultado das seguintes atribuies
1. integer
2. real
3. complex :: c
4. complex :: d
5. integer
6. real
7. i=10
8. x=12.5
9. c=(-10,10)
10. d=i
11. e=x
12. f=c

:: i
:: x

:: e
:: f

Resposta:
Linha 10: d=i (Complexo=inteiro) (10.000000,0.000000)
Linha 11: e=x (inteiro=real) 12
Linha 12: f=c (real=complexo) -10
Escrever um programa que l 2 valores e calcula a rea do quadrado.
1. program quadrado
2. implicit none
3. real
:: a
4. real
:: b
5. real
:: area
6. write (*,*) Informe o valor de a:
7. read (*,*a
8. write (*,*) Informe o valor de b:
9. read (*,*b
10. area=a*b
11. write (*,*) Area do quadrado: ,area
12. end program quadrado

2.10 Exerccios propostos


1. Escrever um programa que l um nmero inteiro e o imprime.
2. Escrever um programa que l 3 numeros reais, e calcula a rea do retngulo dado pelas 3
medidas.
3. Escrever um programa que l um nmero complexo, e calcula as potncias de 2, 3 e 4, e as
imprime.
Tpos de dados

2-15

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

4. Escrever um programa que l os dados de um funcionrio (nome, salrio por hora, total de
horas trabalhadas, e calcula e imprime o seu salrio final).
5. Escrever um programa que l o nome e as trs notas no curso. Para o clculo da mdia final,
dever ser utilizada a seguinte formulao: MF=3/(1/N1+1/N2+1/N3).

Tpos de dados

2-16

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

3. Funes intrnsecas para tipos de dados


3.1 Introduo
As funes intrnsecas so aquelas que j esto definidas na padronizao da linguagem.
Neste captulo, so apresentadas as associadas aos tipos intrnsecos.

3.2 Funes intrnsecas associadas ao tipo inteiro

3.2.1 dfloat
Converte um tipo inteiro para real com dupla preciso.
Formato:
r=dfloat(i)
i (inteiro - entrada) - Argumento a ser convertido para real.
r (real - sada) - Real de preciso simples com um valor igual a j
Exemplo:
1.
2.
3.
4.
5.
6.
7.

program testa_dfloat
implicit none
double precision
:: convertido
integer
:: inicial=100
convertido=dfloat(inicial)
write (*,*) O nmero convertido : ,convertido
end program testa_dfloat

3.2.2 float
Converte um tipo inteiro para um tipo real.
Formato:
r=float(i)
i (inteiro - entrada) - Argumento a ser convertido para real.
r (real - sada) - Real de preciso simples com um valor igual a i

Comandos de controle de fluxo

3-17

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Exemplo:
1.
2.
3.
4.
5.
6.
7.

program testa_float
implicit none
float
:: convertido
integer
:: inicial=10
convertido=float(inicial)
write (*,*) O nmero convertido : ,convertido
end program testa_float

3.3 Funes intrnsecas associadas ao tipo real

3.3.1 aint
Trunca o argumento de entrada
Formato:
r=aint(a)
a (entrada - real) - o argumento a ser truncado.
Retorno:
Valor de a truncado
Exemplo:
1. program ex_aint
2. implicit none
3. real
:: a
4. real
:: b
5. real(kind=8)
:: c
6. a=10.5
7. b=aint(a)
8. c=aint(a)
9. write (*,*) A: ,a
10. write (*,*) B: ,b
11. write (*,*) C: ,c
12. end program ex_aint
13. Resultado:
14. A: 10.500000
15. B: 10.000000
16. C: 10.000000000000

3.3.2 anint
Arredonda o argumento para o nmero mais prximo de mquina.
Comandos de controle de fluxo

3-18

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Formato:
r=anint(a)
Parmetros:
a (entrada - real) - Argumentos a serem arredondados.
Retorno:
Tipo real. O nmero mais proximo de a
Exemplo:
1. program ex_anint
2. implicit none
3. real
:: a
4. real
:: b
5. real
:: c
6. a=-13.23
7. b=15.61
8. c=10.50
9. write (*,*) 'A: ',a,' = ',anint(a)
10. write (*,*) 'B: ',b,' = ',anint(b)
11. write (*,*) 'C: ',c,' = ',anint(c)
12. end program ex_anint
13. Resultado:
14. A:
-13.230000 = -13.000000
15. B:
15.610000 =
16.000000
16. C:
10.500000 =
11.000000

3.3.3 dble
Converte o argumento de entrada para dupla preciso. O argumento de entrada pode ser
inteiro, real ou complexo. Nos dois primeiros casos, a resposta um nmero com preciso dupla,
e no caso complexo, o resultado de preciso simples.
Formato:
r=dble(a)
Parmetros:
a (entrada - inteiro, real ou complexo) - Pode ser um array. o argumento que ser
convertido para o tipo real(8) ou dupla preciso.
Retorno:
real(8) ou dupla preciso com um valor igual a a . Se a for complexo, o resultado tem um
valor igual a parte real de a .
Exemplo:
Comandos de controle de fluxo

3-19

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1.
2.
3.
4.
5.
6.
7.
8.
9.

program testa_dble
implicit none
integer
:: a=5
real
:: b=10
complex
:: c=(1,5)
write (*,*) 'Inteiro : ',dble(a)
write (*,*) 'Real : ',dble(b)
write (*,*) 'Complexo: ',dble(c)
end program testa_dble

3.3.4 ifix
Converte um argumento real, de preciso simples em um inteiro por truncamento.
Formato:
r=ifix(a)
Parmetros:
a (entrada - real) - Pode ser um array. o argumento a ser convertido para inteiro por
truncamento.
Retorno:
Inteiro. o valor de a truncado.
Observaes:
A tabela abaixo lista as funes intrnsecas ifix para truncamento. Estas funes no podem ser
passadas como argumentos.
Tabela 3-1
Funo

Tipo de argumento

Tipo retornado

hfix (a)

Integer, real, or complex

integer(2)

ifix (a)

Real(4)

integer(4)

Integer, real, or complex

integer (4)

jfix (a)
Exemplo:
1.
2.
3.
4.
5.

program testa_ifix
implicit none
real
:: a=10.5
write (*,*) 'Ifix de : ',a,' = ',ifix(a)
end program testa_ifix

3.3.5 int
Converte um argumento de entrada para um inteiro por truncamento.
Comandos de controle de fluxo

3-20

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Formato:
r=int(a [,kind])
Parmetros:
a - (entrada, inteiro, real ou complexo) - Pode ser um array. Contm o valor a ser
convertido para inteiro por truncamento.
Kind (opcional, entrada, inteiro) - Se for especificado, determina o tipo do parmetro do
resultado.
Retorno:
Retorna o valor de a, com o tipo inteiro, truncado. Se kind for especificado, retornar no
tipo especificado, caso contrrio o resultado ser o inteiro padro (integer(4)). Se a um inteiro,
int (a) retorna um inteiro. Se a real, int(a) retorna a parte inteira de a . Se a for complexo,
int(a) retorna o valor truncado da parte real de a .
A tabela apresenta os valores retornados a partir do argumento de entrada das funes
idint e int.
Tabela 3-2
Funo

Argumento

Retorno

Idint (a)

real (8)

integer (4)

int (a)

Integer, real, ou complex

integer (4)

int1 (a)

Integer, real, ou complex

integer (1)

int2 (a)

Integer, real, ou complex

integer (2)

int4 (a)
Exemplo:

Integer, real, ou complex

integer (4)

Program testa_int
a=5.3
write (*,*) Valor de a: ,int(a)
Resultado:
5

3.3.6 mod
Retorna o resto de uma diviso.
Formato:
r=mod(a,p)
Comandos de controle de fluxo

3-21

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Parmetros:
a (entrada, inteiro ou real) - Pode ser um array. Se a entrada for um array, deve ser do
mesmo tipo de p. o dividendo.
p (entrada, inteiro ou real) - Possui o mesmo tipo de a . Pode ser um array. Se for um
array, deve ser do mesmo tipo que a . o divisor.
Retorno:
do mesmo tipo que a . Se p for diferente de zero, o resultado equivalente a: aint(a/p)*p. Se p=0 o resultado indefinido.
Observaes:
Amod e dmod usam o mesmo tipo de formula que mod. A funo mod difere da
modulo, pelo fato de ser uma funo resto, no uma funo modulo. A tabela abaixo lista as
diferentes entradas da mod e suas correspondentes sadas. Todas as funes podem ser passadas
como argumentos para funes externas. O argumento das funes deve observar a tabela
abaixo.
Tabela 3-2
Funo

Tipo de argumento

Valor de retorno

Amod (a, p)

Real(4)

real(4)

Dmod (a, p)

Real(8)

real(8)

integer(4)

integer(4)

Mod (a, p)
Exemplos:
1.
2.
3.
4.
5.
6.
7.
8.

program testa_modulo
implicit none
integer
:: i
real
:: r
r=mod(23,15)
i=mod(14,7)
i=mod(-15,7)
end program testa_modulo

! Retorna 8.00000
! Retorna 0
! Retorna -1

3.3.7 real
Converte um argumento para o tipo real.
Formato:
r=real(a [,kind])

Comandos de controle de fluxo

3-22

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


a (entrada, inteiro, real ou complexo). Pode ser um array. o argumento a ser convertido
para um tipo real.
kind (opcional, entrada, inteiro). Se for especificado, determina o tipo parametrizado do
resultado real.
Retorno:
Se a um inteiro ou real, o resultado real com o tipo determinado por kind. Caso no
seja especificado o retorno ser kind (real(4)). Se a complexo, o valor retornado a parte real
de a, ou um array de tais valores. O resultado real com kind do tipo especificado ou do mesmo
tipo de a, se a for omitido.

3.3.8 Scale
Multiplica um nmero real por 2 elevado em uma determinada potncia.
Formato:
r=scale(x,j)
Parmetros:
x (entrada, real) - Pode ser um array. Se for um array, dever ter o mesmo formato de i.
o nmero que escalonado por uma potncia de 2.
J (entrada, inteiro) - Pode ser um array. Se for um array, deve ser do mesmo formato que
x. o expoente de 2 no fator de escala.
Retorno:
Mesmo tipo que x e igual a x**(2**j), ou um array de tais valores.
Exemplo:

Comandos de controle de fluxo

3-23

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program ex_scale
2. implicit none
3. real,dimension(2)
:: a
4. real,dimension(2)
:: b
5. integer,dimension(2) :: j
6. a(1)=10
7. a(2)=5
8. j(1)=2
9. j(2)=3
10. b=scale(a,j)
11. write (*,*) 'Array de entrada : ',a(1:2)
12. write (*,*) 'Array de potencias: ',j(1:2)
13. write (*,*) 'Array solucao : ',b(1:2)
14. end program ex_scale
15. Resultado:
16. Array de entrada :
10.000000
5.000000
17. Array de potencias:
2
3
18. Array solucao :
40.000000
40.000000

3.4 Funes intrnsecas associadas ao tipo complexo

3.4.1 aimag/dimag
Retorna a parte imaginria de um nmero complexo.
Formato:
r=aimag(z)
z (entrada - complexo). Pode ser um array. Nmero cuja parte imaginria retornado.
Retorno:
real. Possui o mesmo tipo de z e igual a sua parte imaginria, ou um array de tais
valores.
Exemplo:
complex

:: a

a=(5,-3)
write (*,*) Parte complexa: ,aimag(a)
Resultado:
-3

3.4.2 cmplx/dcmplx
Converte seu argumento em um tipo de dado complexo.
Comandos de controle de fluxo

3-24

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Formato:
r=cmplx(x [ ,y ] [,kind])
Parametros:
x (Entrada - inteiro, real ou complexo). Pode ser um array. o argumento a ser
convertido para complexo. Se y especificado, x a parte real do resultado complexo.
y (Opcional - entrada - inteiro ou real). No pode estar presente se x complexo. Pode
ser um array. Neste caso, deve possuir o mesmo formato de x. Se for especificado, y a parte
imaginria do resultado complexo.
kind (Opcional - entrada - inteiro). Se especificado, determina o tipo parametrizado do
resultado complexo.
Retorno:
Valor complexo, ou um array de valores complexos. Se kind especificado, o resultado
tem tipo kind. Se kind for omitido, o resultado complex(4).
Exemplo:
program ex_complex
implicit none
complex

z1

z1=cmplx(3)

! retorna o valor 3.0 + i 0.0

3.4.3 conjg/dconjg
Retorna o conjugado complexo de um argumento complexo.
Formato:
r=conjg(z)
Parmetros:
z (entrada - complexo) - Pode ser um array. o argumento cujo complexo conjugado
retornado.
Retorno:
Retorna um complexo. O tipo o mesmo que z e igual ao complexo conjugado de z, ou
um array de tais valores. Se z=(real,imag), conjg(z) retorna (real,-imag).

Comandos de controle de fluxo

3-25

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.

program ex_conj
implicit none
complex
z
z=(10,5)
write (*,*) Conjugado de z: ,conjg(z)
end program ex_conj
Resultado:
(10,-5)

3.5 Funes intrnsecas associadas ao tipo Character


Achar: Retorna um caracter dado seu valor ascii
Formato:
achar(i)
Argumentos:
i (Entrada - Integer) - Contm o valor ASCII do caracter que se queira. O i deve ser maior ou
igual a zero e menor ou igual a 127.
achar (sada - character*1) - String contendo o caracter na i-zima posio da tabela ASCII.
Exemplo
write (*,*) achar(65)
Resposta
A

3.5.1 adjustl
Ajusta um string removendo todos os brancos sua esquerda e inserindo-os na sua direita.
Sintaxe:
result=adjustl(string)
Parmetros:
string (entrada - character*(*)) - Pode ser um array de strings. O string ser ajustado direita.
Result (sada - character*(*)) - Retorna o string ajustado, ou um array de strings.
Exemplo:
character(16)
string=adjustl(

:: string
Fortran 90

...
Comandos de controle de fluxo

3-26

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Retorna: Fortran 90

3.5.2 adjustr
Ajusta um caracter string direita, removendo todos os espaos em que estiverem esquerda e
inserindo igual nmero no incio do string.
Formato:
r=adjustr(string)
Parmetros:
string(entrada - character*(*)) - Pode ser um array de strings. o string a ser ajustado.
Retorno:
character*(*) - String ajustado esquerda ou um array de tais strings.
Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.

program ex_adjustr
implicit none
character(10) string
string=adjustr( Forte )
write (*,*) String: ,string
end program ex_adjustr
Resultado:
Forte

3.5.3 char
Retorna o caracter na posio especfica da tabela ASCII.
Formato:
r=char(j [, kind])
Parmetros:
j (entrada, inteiro, intervalo: [0,255]). Pode ser um array. Posio do caracter na tabela ASCII
kind (opcional, entrada, inteiro) - Se especificado, determina o tipo do parmetro do caracter
retornado.
Retorno:
do tipo character(1). Retorna o caracter na j-zima posio na tabela ASCII, ou um array de
tais caracteres. Se kind for especificado, o resultado tem o tipo de kind, por outro lado, o padro
um tipo caracter(1).
Exemplo:
char(80)

! retorna P.
Comandos de controle de fluxo

3-27

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

3.5.4 iachar
Retorna o valor inteiro na tabela ASCII do argumento de entrada.
Formato:
iachar(ch)
Argumentos:
ch (entrada - character*1) - Argumento character para o qual o valor inteiro ASCII
procurado.
Iachar (sada -integer) - Valor inteiro correspondente na iachar-zima posio da seqncia de
caracteres.
Exemplo:
write (*,*) iachar(A)
resultado:
65

3.5.5 len
retorna o tamanho de um string.
Formato:
r=len(string)
Parmetros:
string (entrada - character*(*)) - String de tamanho desconhecido. Pode ser um array de strings.
Retorno:
O padro um integer(4). um valor escalar igual ao tamanho do string passado como
parmetro ou o tamanho de um elemento do string, se este for um array.
Observao:
O argumento string no precisa estar com um valor atribudo antes que len seja usado.

3.5.6 len_trim
Retorna o tamanho de um string sem contar os brancos.
Formato:
r=len_trim(string)
Parmetros:

Comandos de controle de fluxo

3-28

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


string (entrada - character*(*)) - String de tamanho desconhecido. Pode ser um array de
strings.
Retorno:
um inteiro. o tamanho do string, retriando-se todos os espaos em branco, ou um
array de tamanhos.
Exemplo:
len_trim( oi) ! retorna 2

3.6 Exerccios resolvidos


3.7 Exerccios propostos

Comandos de controle de fluxo

3-29

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

4. Comandos de controle de fluxo


Todos os programas, excetuando-se aqueles considerados primrios, necessitam de
comandos que repitam um determinado conjunto de instrues, ou ento que executem
determinados comandos, caso uma operao lgica seja verdadeira.
As necessidades variam desde comandos que permitam que se some os 1000 elementos
de um vetor, com apenas algumas linhas de programao, evitando desta forma, que se faa um
cdigo imenso e tedioso de se escrever. Alm disto, pode-se querer saber quantos valores dentro
de um conjunto so positivos e quantos so negativos, apenas citando exemplos mais simples.
Para estas e outras necessidades, que a linguagem Fortran possui diversos comandos
para manipularmos o fluxo de um programa. As facilidades encontradas na linguagem, esto
entre aquelas consideradas mais apropriadas para uma linguagem de programao moderna.
A forma geral que um bloco inicia-se com uma palavra chave, no seu interior, diversas
declaraes e comandos, e no final, uma nova palavra chave informando o final do bloco. Um
bloco pode estar vazio, embora estes casos sejam extremamente raros.
Estes blocos podem estar aninhados, isto , um bloco pode conter um outro bloco. Nestes
casos, o bloco mais externo deve conter todo o bloco interno. A execuo de um bloco sempre
comea com seu comando executvel.

4.1 IF
O comando if prove um mecanismo para desvios dependendo de uma condio. Ele
permite que uma seqncia de comandos seja executada dependendo de uma condio ser
verdadeira. Caso contrrio, uma seqncia alternativa de comandos executada. Sua forma mais
simples :
[nome:] if (expresso lgica) then
bloco
end if [nome]
Onde (expresso lgica) qualquer expresso escalar lgica e bloco uma seqncia de
comandos executveis (Exceto um comando end). O bloco executado se a expresso lgica
resultar num valor verdadeiro, e o controle da execuo passar para a primeira linha aps o end
if caso seja falsa. Entre colchetes, encontra-se um nome, que pode ser atribudo quele bloco.
Este tipo de atribuio, no muito utilizada no Fortran.
Exemplo:
Comandos de controle de fluxo

4-30

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1.
2.
3.
4.
5.
6.
7.
8.
9.

program if_simples
implicit none
integer
:: a
write (*,*) Informe o valor de a:
read (*,*a
if (a==0) then
write (*,*) O valor digitado nulo
endif
end program if_simples
Uma forma mais elaborada do comando if, apresenta-se quando a partir da avaliao da

expresso lgica, existe um bloco a ser executado quando a expresso falsa. Para isto, utilizase o comando else. Forma geral:
if (expresso lgica) then
bloco 1
else
bloco 2
endif
Na construo acima, a expresso lgica avaliada. Caso seja verdadeira, ento o bloco 1
executado. Caso seja falso, o bloco 2 executado, e ao final, o controle do programa passar
para a primeira linha aps o endif.
Exemplo:
1. program maior_menor
2. implicit none
3. real
:: a
4. real
:: b
5. write (*,*) Informe dois valores:
6. read (*,*a
7. read (*,*b
8. if (a>b) then
9.
write (*,*) O primeiro valor maior que o segundo
10. else
11.
write (*,*) O segundo valor menor ou igual ao primeiro
12. endif
Alm destas duas formas bsicas, o comando if pode estar aninhado. Assim, ao invs do
else, simples, teremos um elseif e uma nova expresso lgica a ser avaliada. A construo abaixo
mostra um if aninhado:
if (expresso 1) then
bloco 1
Comandos de controle de fluxo

4-31

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


elseif (expresso 2) then
bloco 2
else
bloco 3
endif
Na construo acima, a expresso 1 avaliada. Caso seja verdadeira, o bloco 1
executado, e ao final, o controle passa para a primeira linha aps o endif. Caso seja falsa, a
expresso 2 avaliada, e caso seja verdadeira, ento o bloco 2 executado, caso contrrio, o
controle do programa passa para o bloco 3.
Exemplo 1:
1. program if_1
2. implicit none
3. integer :: fatorial
4. integer :: i
5. read (*,*numero
6. if (numero<0) then
7.
write (*,*) Nao e possivel calcular o fatorial
8. elseif (numero==0) then
9.
write (*,*) Fatorial de zero=1
10. .else
11.
fatorial=1
12.
do i=1,numero
13.
fatorial=fatorial*i
14.
enddo
15. endif
16. end program if_1

4.2 CASE
A construo case uma caracterstica nova no Fortran 90. Similar ao if, consiste de um
nmero de blocos, dos quais, apenas um selecionado para execuo. A seleo baseia-se no
valor da expresso escalar na declarao select case no incio do comando. O valor desta
expresso chamada de ndice do case. A partir do ndice, verificado qual dos cases o que
corresponde a expresso ndice. No momento em que encontrado, os comandos associados a
ele, so executados.
Sempre que se tem um comando select case, este deve vir acompanhado de um end
select, no final da seleo. Pelo menos um dos blocos selecionado dentro do case. No h
necessidade de se explicitar a sada do case. No momento em que o bloco de comandos
Comandos de controle de fluxo

4-32

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


selecionado terminar sua execuo, o controle do programa passa para a primeira linha aps o
end select.
O bloco case default um opcional. Se no case, no possuir o case default, nenhuma
ao tomada, e o programa continua. Pelo menos um bloco case executado.
Os valores dentro do seletor case podem tomar uma dentre cinco formas abaixo:
(valor) - O bloco s ser executado, se o valor da expresso e o valor entre parentesis forem
os mesmos.
(:faixa inferior ) - O bloco s ser executado, se o valor estiver dentro do intervalo
especificado por [-inf, faixa_inferior]
(faixa superior:) - O bloco s ser executado, se o valor estiver dentro do intervalo por
[faixa_superior, +inf].
(limite inferior : limite superior) - O bloco s ser executado, se o valor estiver dentdo do
intervalo [limite_inferior, limite_superior].
(valor1, valor2, valor3, ..., valor N) O bloco ser executado se o valor for igual a qualquer
um dos valores dentro do case.
Cada um dos valores case deve ser do mesmo tpo que a expresso case. Os tipos podem
ser integer, character e logical. Para caracteres, os valores do case, no necessariamente
precisam ser do mesmo tamanho que a expresso case. Faixas de valores usando ( : ) no so
permitidos para o tipo logical.

4.2.1 Forma geral do case


select case (expresso)
case (faixa de valores)
bloco de instrues
case (faixa de valores)
bloco de instrues
case default
bloco de instrues
end select

Comandos de controle de fluxo

4-33

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

4.2.2 Exemplos
Exemplo 1
1. program testa_case
2. implicit none
3. integer
:: a
4. read (*,*a
5. select case (a)
6. case(:-1 )
7.
write (*,*) Menor que zero
8. case(0)
9.
write (*,*) Igual a zero
10. case(1:)
11.
write (*,*) Maior que zero
12. end select
13. end program testa_case
Exemplo 2
1. program case_string
2. implicit none
3. character*5
:: nome
4. read (A5), nome
5. select case nome
6. case (joao)
7.
write (*,*) Codigo: 95
8. case (paulo)
9.
write (*,*) Codigo: 83
10. case default
11.
write (*,*) no cadastrado
12. end select
No exemplo acima, o programa verifica o nome informado. Caso seja joao ou paulo, o
programa imprimir seus cdigos. Caso nenhum nome exatamente igual aos dois for informado,
a mensagem no cadastrado aparecer na tela. importante observar que os strings so
sensitivos, ou seja, Joao diferente de joao.
Exemplo 3

Comandos de controle de fluxo

4-34

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program case_string
2. implicit none
3. character*5
:: nome
4. read (A5), nome
5. select case nome
6. case (a:z)
7.
write (*,*) Letras minusculas
8. case (A:Z)
9.
write (*,*) Letras maisculas
10. case (0:9)
11.
write (*,*) Nmeros
12. case default
13.
write (*,*) Caracteres especiais
14. end select
15. end program case_string
No exemplo acima, nome ser avaliado. Se o primeiro caracter for minsculo, ento, ser
impressa a mensagem de letras minsculas. O programa avalia apenas o primeiro caracter. Os
subsequentes so ignorados pelo case.

4.3 do
A construo do controla o nmero de vezes que uma determinada seqncia de
atribuies e comandos dever ser executada dentro de um loop. H trs passos na construo do
do:
1. Se a execuo da construo do for controlada por uma varivel do, as expresses
representando os parmetros que determinam o nmero de vezes que o bloco dever ser
executado so calculados.
2. Uma deciso feita para verificar se o bloco do loop deve ser executado.
3. Se for apropriado, o bloco do loop executado, a varivel do do atualizada e o passo 2
repetido.
No fortran 90, alm do tradicional DO loop que controlado por uma varivel que
incrementada um certo nmero de vezes como prescrito na declarao inicial do DO, existem
mais duas formas alternativas de se controlar o loop. Uma o DO WHILE e a outra o DO
simples, algumas vezes chamado de DO eterno.

Comandos de controle de fluxo

4-35

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

4.3.1 Forma do bloco DO


O bloco DO uma construo que termina com uma declarao END DO ou
CONTINUE. A varivel DO deve ser um escalar do tipo inteiro ou real (isto exclui variveis
que so elementos de array, struturas e componentes de estruturas).
Se o comando DO de um bloco tem um nome, o seu END DO correspondente deve ter o
mesmo nome. Se o comando de um bloco DO no possui nome, ento o correspondente END
DO no deve ter nome.
Formato:
DO <varivel>=<inicio>, <fim>, <incremento>
bloco DO
END DO
Onde:
varivel

: pode ser do tipo inteiro, real ou dupla preciso (obsoleto).

incio

: valor inicial que a varivel dever assumir.

fim

: valor final que a varivel dever assumir.

incremento

: valor que dever ser somado ou subtrado de incio para se chegar em

fim. Se no for definido um incremento, este assumir o valor 1.


Exemplo1 :
1. fat=1
2. do i=2,n
3.
fat=fat*i
4. enddo
No exemplo 1, a varivel i ir de 2 at n, variando de um em um.
Exemplo 2:
1.
2.
3.
4.
5.

x=10
y=0
do j=53,x,-2
y=y+j
enddo
No exemplo 2, a varivel j ir de 53 at 11, decrementando de 2, a cada iterao.

Comandos de controle de fluxo

4-36

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

4.3.2 do while
A forma DO WHILE da construo DO prove a habilidade de repetir o DO enquanto
uma condio especfica permanece verdadeira.
A forma geral do comando DO WHILE como segue:
DO WHILE (expresso)
bloco
END DO
O bloco do executado repetidamente. Antes da primeira execuo do do, a expresso
avaliada. Se for verdadeira, ento o bloco executado, caso contrrio, o controle do programa
passa para a primeira linha aps o end do
Exemplo:
1.
2.
3.
4.
5.
6.

sum=0.0
i=0
do while (i<5)
i=i+1
sum=sum+i
enddo
O do acima ser executado cinco vezes, e no final sum ser 15 e i ser 5.

4.3.3 Construo DO simples


Uma construo do sem qualquer controle prove a habilidade de repetir comandos na
faixa do at que a construo do seja terminada explicitamente por algum comando dentro do
intervalo. Quando o final do do for encontrado, o primeiro comando aps o bloco do
executado.
A forma do do simples :
do
bloco
teste para verificao do final do loop (if ou case)
exit ou stop
enddo
Na construo acima, o bloco interno ao do ser executado enquanto uma condio, que
est interna no lao no seja satisfeita. No momento em que isto acontecer, o comando exit
dever estar presente. Este comando tem por objetivo informar ao programa que dever sair do

Comandos de controle de fluxo

4-37

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


lao do - enddo, e passar o controle da execuo para a primeira linha aps o enddo. Caso o
objetivo seja o termino do programa, ento o comando stop deve ser acionado.
Exemplo:

4.3.4 Alterando a sequncia de execuo


H somente dois comandos que podem aparecer em uma contruo que alterem a
sequncia de execuo de uma construo do. Um o comando exit; o outro o comando cycle.
Outros comandos, tais como comandos de desvio, o comando return, e o comando stop,
tambm podem alterar a seqncia de execuo mas no restritos a construes do como os
comandos exit e cycle.

4.3.4.1 exit
O comando exit causa o final imediato de uma construo do. Nenhum outro comando
dentro do bloco do executado. O comando exit definido como segue:
exit
Exemplo:
1. i=93
2. do
3.
i=i-4
4.
if (i==1) then exit
5. enddo

4.3.4.2 cycle
Em contraste com o comando exit, que termina a execuo da construo do, o comando
cycle interrompe a execuo do bloco do e inicia um novo ciclo do bloco do, com os ajustes
apropriados feitos no contador de interaes e na varivel do, se estiver presente.
Exemplo:

Comandos de controle de fluxo

4-38

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program do_cycle
2. implicit none
3. integer
:: index
4. index=1
5. do
6.
index=index+1
7.
if (index==20) then
8.
cycle
9.
endif
10.
if (index==30) then
11.
exit
12.
endif
13.
write (*,*) 'Valor de indice: ',index
14. enddo
15. end program do_cycle
No exemplo acima, se o valor de index for 20, o fortran 90 no executar as duas linhas
abaixo da linha atual, iniciando o laco do novamente.

4.4 Exerccios resolvidos

4.5 Lista de exerccios


1. Escrever um programa que l um nmero indefinido de valores, todos positivos, e conta
quantos so pares, quantos so mpares. O programa dever finalizar quando for inserido um
nmero negativo, ou nulo.
2. Escrever um programa que l 3 valores a, b e c, e calcula as razes do polinmio de grau 2, e
imprime as razes (reais ou imaginrias).
3. Escrever um programa que l um nmero indefinido de pares ordenados e verifica quantos
esto em cada um dos quadrantes, e quantos esto sobre cada um dos eixos (positivo X e Y e
negativo X e Y). O critrio de parada a entrada de um ponto sobre a origem (0,0).
4. Escrever um programa que l um nmero indefinido de valores, e calcula o fatorial do
nmero. Alm disto, o programa dever verificar se o mesmo par ou impar. Se for par,
calcule o fatorial par do mesmo, e se for impar, o fatorial impar.
Fatorial par de 10: (2*4*6*8*10)=3840
Fatorial impar de 9: (1*3*5*7*9)=945
5. Escrever um programa que l 4 valores a, b, c e d, e calcula as 3 razes do polinmio:
F(x)=a*x^3+b*x^2+c*x^1+d. Para calcular a primeira raz dever ser usado o mtodo de

Comandos de controle de fluxo

4-39

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Newton: xk+1=xk-F(xk)/F(xk). O programa dever parar quando abs(F(xk)-F(xk-1)/(F(xk)<1e7.

Comandos de controle de fluxo

4-40

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

5. Subprogramas
Os subprogramas, existem para estruturar a soluo de um problema dentro de segmentos
de programa independentes, que podem ser chamados em qualquer parte do programa, mais de
uma vez.
Os subprogramas possuem duas formas: Subrotina e funo. Estas duas formas so
similares exceto pela maneira como so chamadas.
A subrotina um subprograma cujo propsito executar uma ao, tal como modificar
um conjunto de argumentos e/ou variveis globais, ou executar uma entrada/sada. Tipicamente,
a subrotina chamada com um comando call, mas o Fortran 90 possui uma forma adicional de
referncia a subrotina que a atribuio definida. Uma subrotina pode ser usada para definir
uma nova forma de atribuio, diferente daqueles j definidos em Fortran. Tais subrotinas so
chamadas com a sintaxe da atribuio (=) ao invs de utilizar-se o call.
O propsito da funo prover um valor necessrio a uma expresso. Uma funo
invocada como um operando de uma expresso, e o resultado usado como o valor para o
operando. Alm disto, em Fortran 90, uma funo pode ser usada para definir um novo operador
ou estender o significado o significado de um smbolo de operador intrnseco.
A principal diferena entre uma subrotina e uma funo que o resultado da funo
associado ao seu nome. Mais precisamente, h um valor de resultado associado com qualquer
execuo particular ou chamada a uma funo. Este resultado pode ser de qualquer tipo,
incluindo tipos derivados, e podem ser vetores ou matrizes. A opo result pode ser utilizada na
declarao da funo para dar ao resultado m nome diferente que o nome da funo.

5.1 Subrotinas
Uma subrotina define um processo completo e independente. Tem um comando inicial
subroutine, uma parte de especificao, uma parte de execuo onde est o algoritmo, qualquer
subprograma interno que executa processos auxiliares e um comando end. Quando uma
subrotina chamada, sua execuo inicia com a primeira construo executvel na subrotina.
Objetos de dados e outras entidades podem ser comunicadas de e para a subrotina atravs da
passagem de argumentos.

5.1.1 Definio
O formato geral de uma subrotina como segue:
Subprogramas

5-41

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


[recursive] subroutine nome_da_subrotina ([ arg1, arg2, arg3, ..., argN ])
declarao dos argumentos:
tipo,intent(in/out/inout)

:: arg1

tipo,intent(in/out/inout)

:: arg2

...
tipo,intent(in/out/inout)

:: argN

declarao das variveis da subrotina


comandos da subrotina
subrotinas ou funes internas
end subroutine [nome_da_subrotina]
Na declarao dos parmetros da subrotina, verifica-se a existncia de um atributo em cada um
dos argumentos, denominado intent. A funo do intent, justamente informar ao compilador,
se o argumento sendo passado, ser de leitura, de escrita, ou de leitura e escrita.
intent(in) - Neste caso, o contedo da varivel no poder ser modificado.
Intent(out) - O contedo da varivel, dever ser desconsiderado na entrada da subrotina, e no
seu interior, o valor que for atribudo, dever ser retornado para o programa chamador.
Intent(inout) - O contedo da varivel, na entrada da subrotina, dever ser considerado, e em
caso de modificao no seu contedo, este dever ser atualizado.
Exemplo:
Subrotina que recebe um nmero, e retorna seu fatorial

Subprogramas

5-42

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. subroutine calc_fat(nmero, fatorial)
2. implicit none
3. ! Declarao das variveis da subrotina
4. integer,intent(in)
:: nmero
5. integer,intent(out)
:: fatorial
6. ! Declarao das variveis da subrotina
7. integer
:: i
8. fatorial=1
9. if (nmero>1) then
10.
do i=2,nmero
11.
fatorial=fatorial*i
12.
enddo
13. endif
14. end subroutine calc_fat

5.2 Subprogramas externos


Subprogramas externos so subrotinas e funes armazenadas em arquivos diferentes que no
so parte de nenhuma outra unidade de programa. Eles podem compartilhar informaes, tais
como dados e subprogramas atravs de listas de argumentos, mdulos, mas por outro lado, no
podem compartilhar informaes com qualquer outra unidade de programa. Podem ser
utilizados, compilados e usados independentemente de outros subprogramas e unidades de
programa. Alm disto, no necessariamente precisam ser escritos em Fortran.

5.3 Subprogramas internos


Subprogramas internos so definidos dentro de outros subprogramas. O subprograma que
contm um subprograma interno chamado de hospedeiro do mesmo. Um subprograma interno
pode ser tanto uma subrotina ou uma funo e aparece entre os comandos contains e end do seu
hospedeiro. Um subprograma interno local ao seu hospedeiro e inerente ao ambiente do
hospedeiro atravs de associao.
Exemplo:
program faz_contas
implicit none
real,dimension(10)

:: a

integer

:: i

Subprogramas

5-43

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

5.4 Funes
As funes so similares as subrotinas em diversos aspectos, exceto que o retorno da funo est
associado ao seu nome. Anlogo a uma subrotina, uma funo tem uma declarao function,
uma parte de especificao de variveis de entrada (devem ser todas declaradas como
intent(in)), declarao das variveis utilizadas na funo, os comandos da funo e por fim, o
comando end function.

5.5 Definio
[tipo] [recursive] function nome_da_funo ([ arg1, arg2, arg3, ..., argN ]) result nome
declarao dos argumentos:
[tipo]

:: nome_da_funo

tipo,intent(in)

:: arg1

tipo,intent(in)

:: arg2

...
tipo,intent(in)

:: argN

declarao das variveis que sero utilizadas na funo


comandos da funo
subrotinas ou funes internas
end function [nome_da_funo]
Uma funo sempre possui um tipo associado a ela, que pode ser intrnseco ou definido pelo
usurio. Esta definio pode aparecer na linha de comando, ou ento na parte da funo
destinada a declarao de variveis. Outro aspecto que todos os argumentos na passagem da
funo so de entrada, ou seja, tem o atributo intent(in).
Exemplo 1:
Funo que calcula o fatorial de um nmero.

Subprogramas

5-44

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. integer function fat(n)
2. integer,intent(in)
3. integer
4. fat=1
5. if (n>=2) then
6.
do i=2,n
7.
fat=fat*i
8.
enddo
9. endif
10. end function fat

:: n
:: i

5.6 result
A opo result especifica um nome diferente do nome da funo para armazenar o resultado da
funo. O nome associado pode ser declarado, definido e referenciado como um objeto de dados
ordinrio. O nome da funo tem os mesmos atributos que o nome associado ao result.
Se no houver a clusula result, o nome da funo utilizado como objeto de dados do
resultado.
Exemplo:
Funo que inverte as palavras em uma dada frase:
1. recursive function reverse(phrase) result (flipped)
2. character(*)
:: phrase
3. character(len(phrase))
:: flipped
4. l=len_trim(phrase)
5. n=index(phrase(1:l), , back=.true.)
6. if (n==0 then
7.
flipped=phrase
8. else
9.
flipped=phrase(n+1,l) // :
10. endif
11. end function reverse

5.7 entry
A opo entry especifica um ponto de entrada secundrio a uma subrotina ou funo externa.
Definio:
Entry e-nome [(parmetros)] [result (nome alternativo) ]
e-nome:
Nome do ponto de entrada. Se este ponto de entrada for uma funo definida pelo usurio, o enome deve ser de um tipo de dados definido:
Por regras padronizadas de determinao de tipo
Subprogramas

5-45

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Por um tipo especificado por uma declarao implicit
Uma declarao de uma funo definida pelo usurio.
Se for especificada a clusula result, no podero ser declaradas funes ou subrotinas
internas com o mesmo nome dentro da funo ou subrotina.
Os argumentos so opcionais. Podem ser o nome de uma varivel ou matriz.
Para iniciar a execuo de uma subrotina na primeira declarao depois de uma declarao
entry, substitua o nome do subprograma pelo nome do ponto de entrada, usando a seguinte
sintaxe:
Subrotina call e-nome [ (argumentos)]
Funo

e-nome ( [argumentos])

Os parntesis devero aparecer quando uma funo for chamada, mesmo quando a funo no
possuir argumentos de entrada.
Uma declarao entry em uma subrotina define uma subrotina adicional cujo nome e-nome
e cujos argumentos so aqueles especificados na declarao entry.
Uma declarao entry em uma funo define uma funo adicional funo cujo nome ename e cujo resultado armazenado em e-nome. As especificaes da varivel resultante
definem as caractersticas do resultado da funo. Os argumentos so aqueles especificados
na declarao entry..
No h limite no nmero de declaraes entry que podem ser usadas em um subprograma. As
seguintes restries se aplicam a declarao entry:
Dentro de um subprograma, e-nome no pode Ter o mesmo nome de um argumento em uma
funo, subrotina, entry ou declarao external.
Dentro de uma funo e-nome no pode aparecer em qualquer declarao que no seja o tipo
de declarao depois que o e-nome tenha sido definido na declarao entry.
Se alguma declarao e-nome em uma funo for do tipo caracter, todos os nomes em
declaraes entry naquela funo devem ser do tipo caracter, e todos devem ter o mesmo
tamanho.

Subprogramas

5-46

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Um argumento no pode aparecer em uma declarao executvel que apareca antes da entrada
entry contendo o argumento, a menos que o argumento tambm aparea em uma declarao
de funo, subrotina ou entry que precede a declarao executvel.
Uma declarao entry dever aparecer somente em um subprograma externo ou um mdulo.
Um subprograma interno no pode conter uma declarao entry.
Uma declarao entry no poder aparecer em um bloco executvel tais como do, if ou case,
ou em um comando where.
No possvel definir um ponto de entrada quando a funo ou subrotina possuir a clusula
recursive. O atributo recursive em uma declarao de funo ou subrotina controla se o
ponto de entrada no procedimento for permitido para referenci-lo.
No final da subrotina que possui a declarao entry, dever aparecer uma declarao return,
que forcar o retorno da subrotina.
Exemplo:

Subprogramas

5-47

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. ! Programa principal
2. program testa_entry
3. implicit none
4. real
:: a
5. real
:: div
6. div=2
7. write (*,*) 'Informe um valor: '
8. read (*,*a
9. if (mod(a,div)==0) then
10.
call imprime_par(a)
11. else
12.
call imprime_impar
13. endif
14. end program testa_entry
15. ! Subrotinas
16. subroutine imprime_par(a)
17. implicit none
18. real,intent(in)
:: a
19. write (*,*) 'O valor lido ',a,' eh par.'
20. return
21. entry imprime_impar
22. write (*,*) 'O valor lido impar'
23. end subroutine imprime_par

5.7.1 Contains
A declarao contains delimita uma poro executvel de um programa ou subprograma de
quaisquer subprogramas internos. Ele separa os procedimentos internos do procedimento
hospedeiro, e separa a parte de especificao de um mdulo das funes e subrotinas do mdulo.
Se um programa contiver subprogramas internos, eles devero estar precedidos de uma
declarao contains. No existe um nmero limite de funes ou subrotinas que seguem a
declarao contains, mas procedimentos sozinhos no podem conter uma declarao contains.
Exemplo:

Subprogramas

5-48

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program testa_contains
2. implicit none
3. integer
:: a
4. write (*,*) 'Informe um numero: '
5. read (*,*a
6. if (a>0) then
7.
write (*,*) 'O fatorial de: ',a,' eh: ',fat(a)
8. else
9.
write (*,*) 'No possvel calcular o fatorial de um nmero negativo'
10. endif
11. contains
12. function fat(n)
13. integer
:: fat
14. integer
:: n
15. integer
:: i
16. fat=1
17. do i=2,n
18.
fat=fat*i
19. enddo
20. end function fat
21. end program testa_contains

5.8 Return
A declarao return encerra a execuo de um subprograma e transfere o controle ao programa
chamador. Ele pode ser inserido dentro do corpo do subprograma, tal como em blocos if para
retornos condicionais, e pode ser usado para se colocar pontos de sada do subprograma. Esta
declarao colocada geralmente na penltima linha da funo ou subrotina. No h uma
obrigatoriedade em se colocar o return pois a declarao end tem a mesma funo.

5.8.1 External
Identifica um nome definido pelo usurio como uma subrotina ou funo externa.
Declarao:
External nome
A declarao external especifica que uma funo particular, definida pelo usurio deve ser
considerada como externa ao programa chamador. Alm disto, no caso de haver uma declarao
de uma funo com nome igual a de uma funo intrnseca, esta substitui a funo intrnseca.
Se uma declarao external especificar um nome que tambm o nome de uma funo
intrnseca, no ser possvel utilizar aquela funo intrnseca no programa chamador.

Subprogramas

5-49

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


O Fortran assume que o nome de qualquer subrotina ou funo referenciada em uma unidade de
compilao (mas no definida ali) definida externamente.
Exemplo:
1. program testa_sub
2. implicit none
3. real
:: a
4. external rota
5. call rota(a)
6. end program testa_sub
7. ! Subrotina
8. subroutine rota
9. implicit none
10. real,intent(in)
:: a
11. write (*,*) Valor lido: ,a
12. end subroutine rota

5.8.2 Intrinsic
Declara que um nome uma funo intrnseca.
Declarao:
intrinsic nome
nome um ou mais nomes de funes intrnsecas, separadas por vrgulas.
Observaes:
Deve-se especificar o nome de uma funo intrnseca com a declarao intrinsic, se houver a
necessidade de se passar a mesma como um argumento para uma funo ou subrotina definida
pelo usurio. Nem todas as funes intrnsecas podem ser passadas como argumentos.
Exemplo:

Subprogramas

5-50

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program intrin
2. implicit none
3. real
:: a=1
4. intrinsic
sin
5. call rotina(sin(a))
6. end program intrin
7. subroutine rotina(a)
8. real,intent(in)
:: a
9. write (*,*) 'Seno de a: ',a
10. end subroutine rotina

5.9 Mdulos
Os mdulos so uma caracterstica nova do Fortran 90. Um mdulo permite o uso de pacotes de
especificao de dados e subprogramas, para serem utilizados em qualquer parte de um
programa. Um mdulo, por si s no executvel, embora as funes ou subrotinas que ele
contenha, possam ser referenciadas individualmente na execuo de outras unidades de
programa. O nmero de mdulos no restrito, e um mdulo pode usar qualquer nmero de
outros mdulos, a medida que for necessrio. Os mdulos so ferramentas extremamente
poderosas para o gerenciamento e a organizao de programas.

5.9.1 Formato
module nome_do_mdulo
[Parte de especificao]
[contains]
[Parte de subprogramas]
end module nome_do_mdulo

5.9.2 Parte de especificao


Na parte de especificao, so declaradas todas as variveis que sero utilizadas no mdulo.
Todas as variveis declaradas, podem ser utilizadas pelas funes e subrotinas que estiverem
presentes no mdulo.

5.9.3 Parte de subprogramas


Na parte de subprogramas, so declarados todos as funes e subrotinas, que faro parte daquele
mdulo. Sua definio aparece logo aps a declarao contains. As duas principais diferenas
entre subprogramas module e subprogramas internos so:
Subprogramas

5-51

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

A organizao, regras e restries de um subprograma module so aquelas dos subprogramas


externos.

Subprogramas declarados em module no so estritamente locais ao modulo hospedeiro,


nem so globais ao programa. Somente a unidade de programa que utilizar o mdulo pode
acessar as subrotinas do mdulo no especificadas para serem private.

5.9.4 Usando mdulos


Uma unidade de programa pode usar as especificaes e definies em um mdulo pela
referncia ao mdulo. Isto feito atravs da declarao use na unidade de programa que
requisitar o acesso as especificaes e definies daquele mdulo. Tais acessos causam uma
associao entre objetos do mdulo e o uso da unidade de programa, que chamada de
associao de uso. A declarao use dever aparecer logo abaixo da primeira linha da unidade de
programa.
Cada varivel em um mdulo pode ter os atributos public ou private, ao qual determina a
acessibilidade dela na unidade de programa chamadora. Uma varivel private, no acessvel
na unidade de programa chamadora, enquanto uma public, . Todas as variveis declaradas, e
no especificadas, so consideradas public.
Um outro ponto importante, quanto a lista de nomes que pode ser associada as variveis do
mdulo, para que se evite conflitos de nome. Exemplo:
use fourier
use s_lib, pressure => x_pres
No caso do mdulo chamado fourier, os nomes das variveis so aqueles especificados no
mdulo. No caso da s_lib, a varivel de nome x_press renomeada para pressure na unidade de
programa que est usando o mdulo. As outras variveis que acessem a s_lib tem o mesmo nome
na unidade de programa como no mdulo.
Exemplo:

Subprogramas

5-52

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program princ
2. use pontos
3. type(ponto)
:: a
4. type(ponto)
:: b
5. a=ponto(1,2,-3)
6. b=ponto(-3,4.2,0.2)
7. write (*,*) 'A distancia entre os dois pontos eh: ',distancia(a,b)
8. end program princ
9. module pontos
10. implicit none
11. type ponto
12. real
:: x
13. real
:: y
14. real
:: z
15. end type ponto
16. contains
17. function distancia(a,b)
18. type(ponto),intent(in)
:: a
19. type(ponto),intent(in)
:: b
20. real
:: distancia
21. distancia=sqrt((b%x-a%x)**2+(b%y-a%y)**2+(b%z-a%z)**2)
22. end function distancia
23. end module pontos

5.9.4.1 Atributos public e private


Os atributos public e private, fazem com que as variveis declaradas dentro do mdulo sejam
vistas (public) ou no (private), pelo programa que usa o mdulo.
As variveis com o atributo public podem ser utilizadas em outras unidades de programa pelo
uso da declarao USE. As variveis com o atributo private no podem ser acessadas fora do
mdulo. As variveis que no possurem uma especificao de acessibilidade tem o seu acesso
padro, que public, a menos que esta definio seja modificada por uma declarao private.
Declarao:
public [ private [ :: ] lista de variveis ]
Observaes:
Uma varivel no poder Ter o atributo public se o seu tipo j possuir o atributo private. Os
atributos de acessibilidade s podero ser utilizados dentro de mdulos. Se for feita uma
declarao public ou private, sem uma especificao de variveis, o Fortran assumir que todas
tero o atributo. Isto significa que cada varivel, constante e subprograma no modulo tem o
atributo a menos que seja declarado especificamente com o atributo no padro.
Subprogramas

5-53

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Por exemplo, tipos derivados definidos em um mdulo so acessveis em qualquer unidade que
use o mdulo. O padro pode ser modificado para limitar a acessibilidade para o mdulo. Um
tipo derivado particular pode ser declarado private, ou pode ser public enquanto alguns de seus
componentes so private.
Exemplo:

5.10 Interface
Uma declarao interface marca o incio de um bloco interface. Este tipo de declarao deve
aparecer se uma das seguintes condies for verdadeira:
Uma referncia a um subprograma aparece.

Com um argumento que uma palavra chave.

Com atribuio definida (=), apenas em subrotinas.

Em uma expresso como um operador definido, apenas em funes.

Como uma referncia pelo seu nome genrico.

A subrotina possuir parmetros opcionais.

O resultado da funo for uma matriz.

O argumento uma matriz de tamanho assumido.


Observaes:
Uma declarao interface lista todas as caractersticas de subprogramas externos, assim o

compilador pode confirmar se o subprograma est sendo chamado corretamente ou no. O


compilador verifica o nmero, tipos e atributos dos argumentos em uma chamada e verifica sua
consistncia com o que estiver declarado na interface.
Se for especificado um nome genrico, ento qualquer subrotina listada na interface pode
ser chamada pelo seu nome especfico, ou pelo nome genrico especificado na interface. Um
bloco interface com uma especificao genrica indica uma interface genrica para cada
subrotina.
Os subprogramas declarados em blocos interface tem o atributo external como padro.
Um subprograma cuja interface definida em um bloco interface no pode ser declarado como
external na mesma unidade de programa.

Subprogramas

5-54

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Subprogramas internos, modulos e subprogramas intrnsecos so todos considerados
como tendo interfaces explcitas. Subprogramas externos tem interfaces implcitas como padro.
Quando for especificado um bloco interface para eles, ento suas interfaces se tornam explcitas.
Um subprograma no pode ter mais de uma interface explcita dentro de uma mesma unidade de
programa. Isto significa que no podem ser includas subprogramas internos, mdulos ou
subprogramas intrnsecos em um bloco interface, a menos que se queira definir um nome
genrico para os mesmos.
O bloco interface no pode ter declaraes entry, data ou format, uma declarao de
funo ou interfaces para subprogramas internos.
Exemplo 1: No exemplo abaixo, uma subrotina que simplesmente imprime um valor. No
existe necessidade de criar uma interface, pois a subrotina no possui nenhum dos itens
necessrios para a sua criao (da interface).
1. program ve_inter
2. implicit none
3. real
:: a
4. interface
5.
subroutine teste(a)
6.
real,intent(in)
:: a
7.
end subroutine teste
8. end interface
9. a=10
10. call teste(a)
11. end program ve_inter
12. subroutine teste(a)
13. implicit none
14. real,intent(in)
:: a
15. write (*,*) 'Valor de a: ',a
16. end subroutine teste
Exemplo 2: Neste exemplo, tem-se duas funes. A primeira recebe dois parmetros
reais, e calcula a hipotenusa. Na Segunda, a mesma operao efetuada, com a diferena que os
parmetros so dupla preciso. definida uma interface com um nome explcito, e o Fortran se
encarrega de chamar a primeira ou a Segunda, dependendo apenas do tipo dos parmetros de
entrada.
No programa principal, aparece a linha: include interface.f90. O objetivo desta linha,
fazer com que o contedo do arquivo interface.f90 seja lido e includo no programa principal.
No existe necessidade de o arquivo a ser includo no programa principal ter a extenso .f90.
Programa principal:
Subprogramas

5-55

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program dist
2. implicit none
3. include 'interface.f90'
4. real
:: a
5. real
:: b
6. real
:: dist_real
7. real(kind=8)
:: c
8. real(kind=8)
:: d
9. real(kind=8)
:: dist_doub
10. a=10
11. b=15
12. c=15
13. d=20
14. dist_real=distancia(a,b)
15. dist_doub=distancia(c,d)
16. write (*,*) 'Distancia real: ',dist_real
17. write (*,*) 'Distancia imag: ',dist_doub
18. end program dist
19. Interface: Interface.f90
20. interface distancia
21.
function distancia_double(a,b)
22.
real(kind=8),intent(in)
:: a
23.
real(kind=8),intent(in)
:: b
24.
real(kind=8)
:: distancia_double
25.
end function distancia_double
26.
function distancia_real(a,b)
27.
real,intent(in)
:: a
28.
real,intent(in)
:: b
29.
real
:: distancia_real
30.
end function distancia_real
31. end interface
32. ! Funo que calcula a hipotenusa com parmetros reais:
33. function distancia_real(a,b)
34. real,intent(in)
:: a
35. real,intent(in)
:: b
36. real
:: distancia_real
37. distancia_real=sqrt(a**2+b**2)
38. end function distancia_real
39. ! Funo que calcula a hipotenusa com parmetros com dupla preciso.
40. function distancia_double(a,b)
41. real(kind=8),intent(in)
:: a
42. real(kind=8),intent(in)
:: b
43. real(kind=8)
:: distancia_double
44. distancia_double=sqrt(a**2+b**2)
45. end function distancia_double
Subprogramas

5-56

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

5.11 Exerccios resolvidos


1. Escrever uma funo que verifica se o nmero par ou impar. Se for par, retorna .true. caso
contrrio, .false.
1. ! Programa principal
2. program vepar
3. real
:: numero
4. logical :: par
5. interface
6. function ve_par(numero)
7. real,intent(in)
:: numero
8. logical
:: ve_par
9. end function ve_par
10. . end interface
11. write (*,*) 'Informe um numero: '
12. read (*,*numero
13. par=ve_par(numero)
14. if (par) then
15.
write (*,*) 'O numero ',numero, ' eh par'
16. else
17.
write (*,*) 'O numero ',numero, ' eh impar'
18. endif
19. end program vepar
20. ! Funo
21. function ve_par(numero)
22. implicit none
23. real,intent(in)
:: numero
24. logical
:: ve_par
25. real
:: dois=2
26. if (amod(numero,dois)==0) then
27.
ve_par=.True.
28. else
29.
ve_par=.False.
30. endif
31. end function ve_par
2. Escrever uma subrotina que calcula as duas razes de um polinmio de grau 2. Verifique se
as razes so reais ou imaginrias e faa uma entrada alternativa para chamar a subrotina
(use o entry).
3. Escrever uma funo que calcula a integral da seguinte expresso: F(x)=x^2-sin(x). A
funo dever ter como entrada o nmero de intervalos da integral, e os limites inferior e
superior de integrao.

Subprogramas

5-57

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


4. Escrever a subrotina que calcula a integral da expresso do exerccio 3. O mtodo de
integrao dever ser o trapzio.

5.12 Exerccios propostos

Subprogramas

5-58

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

6. - Matrizes
6.1 Introduo
As matrizes, dentro da verso 90 do Fortran, receberam um tratamento especial, e muitas
mudanas so visualizadas. No Fortran 90, possvel tratar um matriz como um objeto simples.
Esta caracterstica permite que expresses como C = A + B possam ser executadas como se
fossem escalares, mas na realidade sa matrizes. Alm disto, outras facilidades so encontradas,
tais como a atribuio. No existe mais a necessidade de se fazer laos para se zerar a matriz.
Para isto, basta um nico comando: D=0.
Estas caractersticas so extremamente convenientes e oferecem uma forma mais natural
de apresentar as expresses, e tambm so extremamente prticas para computadores que
utilizam-se de processamento paralelo e vetorial.
Alm disto, as funes podem retornar no apenas um valor, mas um matriz. Sees de
matrizes so obtidas, utilizando-se uma sintaxe similar ao Matlab. A(:,i) a i-zima coluna de A.
A(2:4,3:5), um matriz 3 x 3 obtida das linhas 2 at 4 e das colunas 3 at 5 da matriz A .

6.2 Matrizes nulas


O Fortran 90 permite que matrizes tenham tamanho zero. Quando o limite inferior excede
o correspondente limite superior, a matriz tem tamanho zero. H poucas regras especiais para
este tipo de estrutura porque eles seguem as regras tradicionais, mas deve-se tomar um pouco de
cuidado com sua interpretao. Por exemplo, dois matrizes de tamanho zero e de mesmo
nmero de dimenses pode ter diferentes formas. Um pode ser (0,2) e o outro (2,0). Tais
matrizes no so compatveis e portando podem no ser usados como operandos de uma
operao binria. Entretanto, uma matriz sempre compatvel com um escalar, assim o
comando:
32. matriz_tamanho_zero = escalar
valido, e o escalar armazenado em todos os elementos da matriz, e com isto teremos
uma linha de programa, que no faz absolutamente nada.

6.3 Declarao de matrizes


Uma matriz consiste de um conjunto retangular de elementos, todos do mesmo tipo. H
diversas formas pelas quais uma matriz pode ser declarada. Neste momento, ser vista apenas a

Matrizes

6-59

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


declarao de matrizes de tamanho fixo. Para declarar-se um vetor A de 20 elementos, o seguinte
comando poderia ser utilizado:
real, dimension(20)

:: a

Os elementos sucessivos de a, so referenciados atravs de um ndice: a(1), a(2), ...,


a(20). O nmero de elementos de um vetor chamado de dimenso. Cada um dos elementos do
vetor um escalar.
Muitos problemas requerem uma declarao mais elaborada de uma matriz. No Fortran
90 no existe restries quanto aos ndices de cada uma das dimenses da matriz. Sendo assim,
possvel ter-se matrizes com ndices negativos, tais como no exemplo abaixo:
real, dimension(-17:23)

:: matriz

Neste caso, a matriz possui 41 elementos, que sero referenciados da seguinte maneira:
matriz(-17), matriz(-16), e assim sucessivamente.
O nmero mximo de dimenses que o Fortran 90 permite 7. Sendo assim, pode-se ter
matrizes do tipo:
integer, dimension(10:11,15,7:12,-2:4,3:6,7:10,29:31)

:: estranho

No exemplo acima, observa-se que o terceiro ndice da matriz possui apenas um numero.
Neste caso, assume-se que o ndice inferior da dimenso em questo 1. Observa-se que o
tamanho da matriz em questo : 2 * 15 * 6 * 7 * 4 * 3= 15120. Um tipo composto pode conter
uma matriz como componente. Por exemplo, o seguinte tipo:
type matriz
real

:: parte_1

real, dimension(10) :: matri_1


real, dimension(3,4) :: matri_2
end type matriz
O Fortran, armazena o contedo de matrizes, por coluna. Sendo assim, a seqncia de
armazenamento de uma matriz a(3,3) ser: a(1,1) - a(2,1) - a(3,1) - ... - a(3,3). Desta forma,
quando forem escritos programas para manipular matrizes, d preferncia a varredura do objeto
por coluna.
A referncia um elemento individual de uma matriz chamado de ndices. Nos
exemplos acima foram usadas constantes inteiras, mas em geral cada ndice pode ser formado
por uma expresso escalar, que , qualquer expresso aritmtica cujo valor um escalar e do tipo

Matrizes

6-60

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


inteiro. Cada ndice deve estar dentro da faixa correspondente aos limites definidos na
declarao da matriz e o nmero de ndices deve ser igual dimenso. Abaixo, alguns exemplos:
A(1)
bi(i*j)
matriz(nint(x+3.)) ! a funo intrnseca nint, arredonda para o nmero inteiro mais
prximo. Alm disto, sub-matrizes, chamadas de sees, podem ser referenciadas especificandose uma faixa de um ou mais sub-ndices. Exemplos:
a(i:j) ! Pega todos os valores entre o ndice i e o ndice j
b(k,1:n) ! Matriz de uma linha e n colunas
c(1:i, 1:j, k)
d(:,1) ! toda a primeira coluna da matriz
e(1,: ) ! toda a primeira linha da matriz
Exemplo:
1. program meia_matriz
2. implicit none
3. real,dimension(3,3)
:: a
4. real,dimension(2,2)
:: b
5. integer
:: i
6. integer
:: j
7. do i=1,3
8.
do j=1,3
9.
a(i,j)=i*j
10.
enddo
11. enddo
12. b(:,:)=a(1:2,2:3)
13. write(*,100) ((a(i,j),j=1,3),i=1,3)
14. 100
format(3(F10.5,2x))
15. write(*,200) ((b(i,j),j=1,2),i=1,2)
16. 200
format(2(F10.5,2x))
17. end program meia_matriz
No exemplo acima, a matriz b ser formada pelos elementos da primeira e segunda linhas
e da segunda e terceira colunas de a . Sendo:

a=

|1

3|

|2

6|

|3

9|

A matriz b, ser:
b=

|2

3|
Matrizes

6-61

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


|4

6|

6.4 Matrizes de tamanho assumido


Quando matrizes so passados como parmetros para subprogramas, na maioria dos
casos, se sabe qual a dimenso dos mesmos, e no momento da declarao, informa-se o seu
tamanho. O Fortran 90, permite que a matriz seja declarada, mas sem uma dimenso definida.
No momento da chamada do subprograma, ele assumir o tamanho da matriz que estiver sendo
passado. Quando for declarado pela clusula dimension, cada dimenso ter a forma:
[limite inferior]:
Onde limite inferior uma expresso inteira. Caso no seja informado, a matriz assumir
o valor 1, independentemente do limite inferior declarado no programa principal. O que
acontecer, que o subprograma assumir que a matriz tem dimenso (1:N,1:M), onde M e N
so as dimenses totais dos matrizes.
Exemplo:
real,dimension(-1:5,3:6)

:: a

...
call sub_pro(a)
.....
real,dimension(:,: ),intent(in)

:: a

...
No exemplo acima, a assumir as dimenses (1:7,1:4). Para que o subprograma assuma
os limites inferiores, a matriz a, deve ser declarada da seguinte forma:
real,dimension(-1:,3: ),intent(in)

:: a

Para que o compilador saiba que os matrizes que compe a subrotina so de tamanho
assumido, h uma obrigatoriedade de se ter uma interface explcita informando o formato dos
parmetros do subprograma.

6.5 Objetos automticos


Em subprogramas cujos argumentos que so matrizes mudam de tamanho a cada
chamada, podem necessitar de matrizes declarados localmente, que possuam o mesmo tamanho
dos parmetros passados. Estes matrizes so chamadas de automticas, e so exemplos de
objetos automticos de dados. Estes so objetos de dados cujas declaraes dependem dos

Matrizes

6-62

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


valores de expresses no constantes, e no so argumentos de subprogramas. No exemplo
abaixo, a matriz work, modifica de tamanho a cada chamada da subrotina:
1.
2.
3.
4.
5.
6.
7.
8.

subroutine swap(a,b)
real,dimension(: ), intent(inout)
real,dimension(: ), intent(inout)
real,dimension(size(a))
work=a
a=b
b=work
end subroutine swap

:: a
:: b
:: work

6.6 Matrizes alocveis


Uma das caractersticas mais marcantes do Fortran 90, justamente a possibilidade de
alocar matrizes dinmicamente. A idia declarar todas as matrizes que se quer usar, sem
informar suas dimenses. Para isto, sua declarao dever estar acompanhada do atributo
allocatable:
integer,dimension(:,: ),allocatable

:: matriz

No exemplo acima, a matriz possui duas dimenses.

6.7 Comando allocate


O objetivo do comando allocate, alocar espao para matrizes.
Formato:
allocate(matriz(limite_inferior:limite_superior, ),STAT=ierr)
Onde:
matriz

nome da varvel que se quer alocar espao.

Limite_inferior

- ndice inferior da matriz.

Limite_superior

- ndice superior da matriz.

Caso no seja informado o limite inferior, assume-se que 1.


Ierr

- Argumento de sada, inteiro. Retorna 0 caso a matriz tenha sido alocada com

sucesso, ou o nmero do erro em tempo de execuo se um erro ocorrer. Se for especificado, o


parmetro STAT= deve aparecer como o ltimo argumento da lista. Se STAT= for omitido e um
erro ocorrer durante a alocao, o programa termina.
Observaes:
O comando allocate, aloca espao e d um formato definido a uma matriz. Para desalocar
a matriz da memria, deve-se usar o comando deallocate.
Matrizes

6-63

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Quaisquer variveis ou funes usadas para especificar os limtes da matriz podem ser
redefinidas ou descartadas sem afetar os limtes j estabelescidos para a matriz.
O comando allocate deve especificar limites para cada dimenso da matriz allocatable.
Isto significa que o nmero de dimenses a ser dimensionado, dever ser o mesmo que foi
declarado anteriormente.
Quando uma matriz alocata por um comando allocate, este permanece alocado e
definido at que seja desalocado pelo comando deallocate. Se for uma matriz j alocada, e
houver uma nova tentativa de alocao, isto gerar um erro de execuo no programa.
Para determinar se uma matriz alocvel est atualmente alocada, usa-se a funo
intrnseca allocated.
Exemplos:
1.
2.
3.
4.
5.
6.
7.
8.

program aloca_matriz
implicit none
real,dimension(:,: ),allocatable
:: a
integer
:: dimensao
write (*,*) Informe a dimensao da matriz:
read (*,*dimensao
allocate(a(dimensao,dimensao))
end program aloca_matriz

6.8 Comando deallocate


objetivo da funo deallocate liberar o espao previamente reservado em um comando
allocate.
deallocate(matriz1, matriz2, )
Matriz1, - So os nomes das matrizes que devero ser desalocadas, separadas por
vrgulas. Todos os membros da lista devem ter sido previamente alocados com o comando
allocate.
Observaes:
Se houver uma tentativa de desalocar uma matriz que no foi alocada, o fortran gerar um
erro em tempo de execuo.
Qualquer falha na desalocao causa o trmino do programa a menos que for especificado o
parmetro stat=.
Se um array allocatable for referenciado quando ele no estiver alocado, o resultado
imprevisvel.
Matrizes

6-64

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.

program alloca
implicit none
real,dimension(:),allocatable :: a
integer
:: n=10
allocate(a(n))
a(:)=1
deallocate(a)
end program alloca

6.9 Construo where


Permite que operaes sejam executadas em matrizes de maneira seletiva. A idia do
comando where, fazer uma varredura na matriz, comparando cada um dos elementos com uma
expresso-mscara.
Formato:
where(expresso-mascara)
. Comandos a serem executados
elsewhere
.. Comandos a serem executados
end where
Observaes:
O objetivo do comando where, localizar dentro da matriz todos os elementos que
satisfaam a uma determinada condio. Caso a comparao entre a expresso lgica e o
elemento da matriz, seja verdadeiro, ento um bloco de comandos executado. Caso seja falso, o
bloco de comandos aps o elsewhere executado. Caso este no esteja presente, o controle da
execuo passa para a primeira linha aps o end where.
Exemplo:

Matrizes

6-65

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program testa_where
2. implicit none
3. real,dimension(2,2)
:: a
4. a(1,1)=1
5. a(1,2)=0
6. a(2,1)=0
7. a(2,2)=2
8. write (*,*) 'Matriz antes: ',a
9. where(a>0)
10. a=a+10
11. elsewhere
12.
a=1
13. end where
14. write (*,*) 'Matriz depois: ',a
15. end program testa_where

6.10 Exerccios resolvidos


1. Escrever um programa que gera uma matriz A(n,m), levando em conta a seguinte regra de
formao da matriz:
a(i,j)=sin(i)+cos(j) para i<>j
a(i,j)=exp(i*tg(1/i)) para i==j
2. Escrever um programa que soma todos os elementos da N-zima coluna e imprime.
3. Escrever um programa que calcula a mdia de cada linha de uma matriz N x M, e armazena
em um vetor.
4. Escrever um programa que gera uma matriz m x n (seguindo a idia do exerccio 1), e
imprime. Depois, devero ser contados quantos elementos da matriz so pares, impares, e
calcular o percentual sobre o total.
5. Utilizando-se o mesmo programa do exerccio anterior, o programa dever contar quantos
elementos da matriz a(m,n) so negativos, e substitu-los por zero.
6. Escrever uma subrotina que recebe uma matriz m x n, e calcula o fatorial do menor valor
positivo armazenado em cada coluna, e imprime.

6.11 Exerccios propostos

Matrizes

6-66

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

7. Funes intrnsecas associadas matrizes


7.1 Allocated
Retorna o status de alocao da matriz
Formato:Allocated ([matriz=] matriz)
Descrio: A funo intrnseca allocated indica se um matriz alocvel est atualmente
alocado. O nome desta funo intrnseca no pode ser passado como argumento.
Valores de retorno: O tipo do resultado e formato so por padro um escalar lgico. O
resultado tem o valor true se a matriz est alocado atualmente e tem o valor false se a matriz no
est alocada.
Exemplo:
1. Program aloca_mat
2. Implicit none
3. real,dimension(: ),allocatable
:: a
4. ...
5. allocate(a(10))
! aloca o vetor a de 10 posies
6. ...
7. if (allocated(a)) then
8.
write (*,*) Amatriz foi alocada com sucesso
9. end if
10. end program aloca_mat

7.2 all
Determina se todos os valores so verdadeiros ou no.
Formato: all ([mask=]mask [,[dim=]dim])
Descrio: A funo determina se todos os valores so verdadeiros ao longo da dimenso,
a partir de mask. O nome desta intrnseca no pode ser passado como argumento.
Valores de retorno: O resultado do tipo lgico. O resultado um escalar se dim estiver
ausente ou se mask tiver dimenso 1. O resultado de all(mask) tem o valor true se todos os
elementos de mask so verdadeiros ou se mask um matriz de tamanho zero. O resultado tem o
valor falso se qualquer um dos elementos tiver valor false.
Exemplos:
all ((/.true., .false., .true. /)) false. O motivo disto que o segundo elemento .false..
b=

[ 1 3 5]
[ 2 4 6]
Funes intrnsecas associadas matrizes

7-67

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


c=

[ 0 3 5]
[ 7 4 8]

all (b.ne.c) .false.


all (b.ne.c, dim=1) [.true., .false., .false.]
all (b.ne.c, dim=2) [.false., .false.]
1. program testa_all
2. implicit none
3. real,dimension(5)
:: a
4. logical
:: positivos
5. a(1)=5.1
6. a(2)=3.4
7. a(3)=2.8
8. a(4)=9.6
9. a(5)=4.7
10. positivos=all(mask=a>0)
11. if (positivos) then
12.
write (*,*) 'Todos os valores sao positivos'
13. else
14.
write (*,*) 'Algum valor negativo ou nulo'
15. endif
16. end program testa_all

7.3 any
Determina se qualquer um dos valores verdadeiro.
Formato: any ([mask=]mask [,[dim=]dim])
Descrio:a funo any determina se qualquer um dos valores verdadeiro, dado o
argumento mask ao longo da dimenso dim. O nome desta intrnseca no pode ser passado como
argumento.
Valores de retorno: O resultado do tipo lgical. um resultado escalar se dim estiver
ausente ou se mask tiver dimenso 1. O resultado de any(mask) tem o valor true se qualquer
elemento de mask for verdadeiro. O resultado ter valor false se nenhum elemento de mask for
verdadeiro ou se mask um matriz de dimenso zero.
Exemplos:
any((/ .true., .false., .true. /)) verdadeiro.
any(mask) .false. quando mask um matriz de dimenso zero.
b=

[ 1 3 5]
[ 2 4 6]
Funes intrnsecas associadas matrizes

7-68

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


c=

[ 0 3 5]
[ 7 4 8]

any (b.ne.c) .true.


any (b.ne.c, dim=1) [.true., .false., .false.]
any (b.ne.c, dim=2) [.true., .true.]
1. program testa_any
2. implicit none
3. real,dimension(5)
:: a
4. logical
:: positivos
5. a(1)=5.1
6. a(2)=8.5
7. a(3)=-2.4
8. a(4)=-9.1
9. a(5)=4.7
10. positivos=any(mask=a<0)
11. if (positivos) then
12.
write (*,*) 'Algum valor do vetor negativo'
13. else
14.
write (*,*) 'Todos os valores so positivos'
15. endif
16. end program testa_any

7.4 count
Conta o nmero de elementos verdadeiros em um matriz.
Formato: count ([mask=] mask [, [dim=] dim])
Descrio: A funo count conta o nmero de elementos de um matriz verdadeiros ao
longo da dimenso dim, dada a mscara mask.. O nome desta funo no pode ser passado como
argumento.
Valores de retorno: O resultado do tipo inteiro. Ser escalar se dim estiver ausente ou se
mask tiver dimenso 1. O resultado de count(mask) tem um valor igual ao nmero de elementos
que corresponderem a mask ou ter o valor zero se mask um matriz de tamanho 0.
Exemplos:
count ( / .true. .false. .true. /)) 2.
b=

[ 1 3 5]
[ 2 4 6]

c=

[ 0 3 5]
[ 7 4 8]
Funes intrnsecas associadas matrizes

7-69

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


count (b .ne. c) 3.
count (b .ne. c, dim=1) [2, 0, 1]
count (b .ne. c, dim=2) [1, 2]
1. program testa_count
2. implicit none
3. real,dimension(5)
:: a
4. integer
:: negativos
5. a(1)=10
6. a(2)=5
7. a(3)=-1
8. a(4)=2
9. a(5)=3.4
10. negativos=count(mask=a<0)
11. write (*,*) 'Total de negativos: ',negativos
12. end program testa_count

7.5 cshift
Executa um shift circular em uma expresso matriz.
Formato: cshift([matriz=] matriz, [shift=]shift [,[dim=] dim)
Descrio: A funo cshift executa uma rotao circular em uma expresso matriz de
dimenso 1 ou executa uma rotao circular em todo uma seco ao longo de um dada matriz de
dimenso 2 ou maior. Os elementos rotacionados para fora da dimenso so colocados no incio
da matriz e assim sucessivamente. Diferentes sees podem ser rotacionadas por diferentes
quantidades e em diferentes direes; positivo para rotaes para a esquerda e negativo para
rotaes para a direita.
Valores de retorno: O resultado um matriz de mesmo tipo e forma dos parametros.
Exemplo:
v=[ 1, 2, 3, 4, 5, 6]
cshift(v,shift=2) --> [3, 4, 5, 6, 1, 2]
cshift(v, shift=-2) --> [5, 6, 1, 2, 3, 4]

Funes intrnsecas associadas matrizes

7-70

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program testa_cshift
2. implicit none
3. real,dimension(5)
4. real,dimension(5)
5. a(1)=-1
6. a(2)=3
7. a(3)=4
8. a(4)=-2.5
9. a(5)=2
10. b=cshift(a,2)
11. write (*,*) 'Original: ',a
12. write (*,*) 'Shiftada: ',b
13. end program testa_cshift

:: a
:: b

7.6 dot_product
Executa o produto interno entre dois vetores numricos ou lgicos.
Formato: dot_product([ vector_a=] vector_a, [vector_b=] vector_b)
Descrio: Executa um produto interno entre dois vetores numricos ou lgicos. No
vetoriza. O nome desta funo no pode ser passada como argumento.
Valores de retorno: Se os argumentos so do tipo numrico, o tipo resultante ser do
mesmo tipo dos vetores de entrada. Se os argumentos forem do tipo logical, o resultado ser um
valor lgico que vir da expresso: vector_a .and. vector_b. O resultado escalar.
Se o vector_a do tipo inteiro ou real, o resultado tem o valor sum(vector_a * vector_b).
Se o vetor tem tamanho zero, o resultado ser 0.
Se o vector_a do tipo complexo, o resultado ter valor sum(conjg(vector_a) *
vector_b). Se os vetores tiverem tamanho zero, o resultado ter valor zero.
Ss o vector_a do tipo lgico, o resultado ter valor any(vector_a .and. vector_b).
Exemplos: dot_product((/1, 2, 3 /), (/ 2, 3, 4 /) tem resultado 20.

Funes intrnsecas associadas matrizes

7-71

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program testa_dot
2. implicit none
3. real,dimension(3)
:: a
4. real,dimension(3)
:: b
5. real
:: prod
6. a(1)=2
7. a(2)=-3
8. a(3)=-1.2
9. b(1)=4
10. b(2)=-5
11. b(3)=-2.3
12. prod=dot_product(a,b)
13. write (*,*) 'Produto interno: ',prod
14. end program testa_dot

7.7 eoshift
Executa um shift-zero em uma expressa matriz.
Formato: eoshift ([matriz=] matriz, [shift=] shift [, [ boundary=] boundary] [, [dim=]
dim])
Descrio: A funo eoshift executa um shift-zero em uma expresso matriz de dimenso
1 em toda a sua extenso ou ao longo de uma dada matriz de dimenso dois ou maior. Os
elementos so rotacionados para cima ou para baixo e o espao deixado preenchido com zeros.
Diferentes sees podem ter diferentes valores de preenchimento e podem ser rotacionados por
diferentes quantidades em direes diferentes. Positivo para shifts para a esquerda e negativo
para shift para a direita. O nome deste intrnseco no pode ser passado como argumento.
Valores de retorno: O resultado um matriz de mesmo tipo dos parametros e formato
coma matriz.
Exemplos:
v=[1 2 3 4 5 6]
eoshift(v, shift=3) --> [ 4 5 6 0 0 0 ]

Funes intrnsecas associadas matrizes

7-72

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


1. program testa_eosh
2. implicit none
3. real,dimension(5)
:: a
4. a(1)=5
5. a(2)=-3
6. a(3)=4
7. a(4)=-1.5
8. a(5)=2.9
9. write (*,*) 'Shiftado para a direita: ',eoshift(a,-2)
10. end program testa_eosh

7.8 matmul
Multiplica duas matrizes numricas ou lgicas.
Formato: matmul ([matrix_a=]matrix_a, [matriz_b=] matrix_b)
Descrio: A funo matmul multiplica duas matrizes numricas. O nome deste
intrnseco no pode ser passado como um argumento.
Valores de retorno: A matriz de retorno depender das dimenses das matrizes de
entrada:
Se matrix_a tem formato (n,m) e matrix_b tem formato (m,k), o resultado tem formato
(n,k).
Se matrix_a tem formato (m) e matrix_b tem formato (m,k), o resultado tem formato (k).
se matrix_a tem formato (n,m) e matrix_b tem formato (m), o resultado tem formato (n).
Exemplos
a=

[123]
[234]

[12]
b=

[23]
[34]

O resultado de matmul(a,b) [11 20 ; 16 29]


Exemplo:

7.9 maxloc
Retorna a posio do valor mximo de um matriz.
Formato: maxloc ([ matriz=] matriz [, mask=] mask])

Funes intrnsecas associadas matrizes

7-73

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Descrio: A funo maxloc retorna a posio do primeiro elemento da matriz que tiver o
valor maximo dentre os elementos identificados por mask. O compilador gera um cdigo externo
para executar a funo, que no vetoriza. O nome deste intrnseco no pode ser passado como
argumento.
Valores de retorno: O resultado um matriz de inteiros de tamanho igual ao resultado
gerado por mask.
Exemplos:
maxloc( (/ 2, 6, 4, 6/)) [2].
integer, dimension(4:7)

:: b=(/ 8, 6, 3, 1)/

maxloc(b) [1]
[ 0 -5 8 -3 ]
a=

[ 3 4 -1 2 [
[ 1 5 6 -4 ]

maxloc(a) [1,3]
maxloc(a, mask=a .lt. 6) [3,2]

7.10 maxval
Retorna o maior valor dentro de um matriz.
Formato: maxval([MATRIZ=]matriz [,[DIM=dim] [, MASK=]mask ])
Descrio: A funo intrnseca maxval pode ser usada para a reduo de um matriz. Ele
retorna o valor mximo de elementos de um matriz ao longo da dimenso dim correspondendo
aos valores verdadeiros de mask.
Aceita os seguintes argumentos:
matriz Deve ser do tipo inteiro ou real. No deve ser escalar.
dim

Deve ser um valor inteiro escalar na faixa 1<=dim<=n, onde n o nmero de

dimenses de matriz.
mask Este argumento opcional deve ser do tipo lgico e deve ser compatvel com
matriz.
No vetoriza. Se dim for especificado e uma constante, ou se o intrnseco retornar um
resultado escalar, o compilador gerar um cdigo inline para executar este intrnseco. Caso
contrrio, o compilador gera uma chamada para uma biblioteca de uma funo externa.
Valores de retorno: O resultado do mesmo tipo da matriz. Se dim estiver ausente ou
matriz tiver rank 1, o resultado ser um escalar.
Funes intrnsecas associadas matrizes

7-74

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


O resultado de maxval(matriz) tem um valor igual ao valor mximo entre todos os
elementos da matriz ou tem o valor de numeros no negativos de maior magnitude suportado
para nmeros do tipo de dados de matriz.
Exemplo: maxval((/1, 2, 3 /)) 3.

7.11 minloc
Retorna a posio do menor valor de um matriz.
formato: minloc([MATRIZ=]matriz[,[MASK=]mask])
Descrio: A funo intrnseca minloc pode ser usada para uma locao de um matriz.
Retorna o local do primeiro elemento da matriz que tem o menor valor dos elementos apontados
por mask.
Aceita os seguintes argumentos:
matriz deve ser do tipo inteiro ou real. No pode ser um escalar.
mask Deve ser do tipo lgico.
Valores de retorno: O resultado um vetor de inteiros com dimenso igual a dimenso da
matriz. Se mask estiver ausente, o resultado um matriz cujos elementos so os valores das
posies de um elemento da matriz que o menor valor dele.
Se mask estiver presente, o resultado um vetor cujos elementos so os valores dos
ndices de um elemento da matriz, que corresponda ao procurado por mask.
Exemplos: minloc( (/4, 3, 6, 3 / ) ) 2.

A=

[0

-5

-3 ]

[3

-1

2]

[1

-4 ]

minloc(A) [1,2].

7.12 minval
Retorna o menor valor de um matriz.
Formato: minval([MATRIZ=] [,[DIM=]dim] [, [MASK=]mask])
Descrio: A funo intrnseca minval pode ser usada para uma reduo de matriz.
Retorna o menor valor dos elementos de um matriz ao longo da dimenso dim correspondendo
aos elementos verdadeiros de mask. Aceita os seguintes argumentos:
matriz Deve ser do tipo inteiro ou real. No pode ser escalar.

Funes intrnsecas associadas matrizes

7-75

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


dim

Deve ser um escalar inteiro na faixa 1 <= dim <=n, onde n a dimenso da

matriz. Esta funo faz uma verificao da existncia de dim.


mask Deve ser do tipo lgico.
Valores de retorno: O resultado do mesmo tipo de matriz. O resultado de
minval(matriz) mostra todos os elementos que correspondem a mask.
Exemplos:
b=

[135]
[246]

minval(b,dim=1) [1 3 5]
minval(b, dim=2) [1 2]
minval(b) 1

7.13 pack
acondiciona um matriz dentro de um vetor em cima de uma mscara.
Formato: pack([MATRIZ=]matriz, MASK=]mask [, [VECTOR=]vector])
Descrio: A funo pack guarda um matriz dentro de um matriz de dimenso 1 a partir
de uma mscara. Pode ser usado para uma construo de matriz. Aceita os seguintes argumentos:
matriz pode ser de qualquer tipo. No pode ser escalar.
mask deve ser do tipo lgico.
vector deve ser do mesmo tipo que matriz e deve ter dimenso 1. Vector deve ter pelo
menos os elementos que so verdadeiros em mask.
Valores de retorno: O resultado um vetor do mesmo tipo que matriz. Se vector est
presente, o tamanho do resultado o que estiver em vector.
Exemplos: N=( / ( 1, -1 , 3 /)
pack(n,mask=n.lt.0) [-1].
pack(n,mask=.true.) [ 1, -1, 3].

7.14 product
Forma o produto de elementos de um matriz.
Formato: product([MATRIZ=]matriz, [,[DIM=]dim] [MASK=]mask])
Descrio: A funo intrnseca product calcula o produto interno de todos os elementos
de um matriz ao longo da dimenso dim correspondentes aos elementos verdadeiros de mask.
Aceita os seguintes argumentos:
Funes intrnsecas associadas matrizes

7-76

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


matriz deve ser do tipo interio, real, ou complexo. No pode ser escalar.
dim

Deve ser escalar e do tipo inteiro com um valor na faixa 1 <=dim <= n, onde n

dimenso da matriz.
mask Deve ser do tipo logico.
Valores de retorno: O resultado tem o mesmo tipo de matriz. O resultao um escalar se
dim estiver ausente ou matriz tiver dimenso 1.
Exemplos: product( (/1 2 3 /)) 6.
b=

[135]
[246]

product(b, dim=1) [ 2 12 30], product(b, dim=2) [ 15 48]

7.15 reshape
Constri um matriz de um determinado formato.
Formato: reshape([SOURCE=]source, [SHAPE=]shape [,PAD=]pad] [,[ORDER=]
order])
Descrio: A funo intrnseca reshape contri um matriz de um determinado tipo a partir
dos elementos de um dada matriz. Aceita os seguintes argumentos:
source pode ser de qualquer tipo. Deve ser um matriz com valores. Se pad estiver ausente
ou tiver valor 0, o tipo de source deve ser maior ou igual ao product(shape). O tipo de resultado
o produto dos valores dos elementos de shape.
shape deve ser um inteiro, de dimenso 1, e do tipo constante. Size deve ser positivo e
menor que 8. No deve ter elementos cujos valores sejam negativos.
pad

Deve ser do mesmo tipo que source.

order Deve ser do tipo inteiro. Deve ter o mesmo formato que shape, seus valores
devem ser uma permutao de (1, 2, ..., n) onde n o tamanho de shape. Se estiver ausente, a
ordem (1, 2, ... , n).
Em tempo de execuo o compilador gera um cdigo inline para executar este intrnseco.
No vetoriza. O nome deste intrnseco no pode ser passado como um argumento.
Valores de retorno: O tipo do resultado do mesmo tipo que source. O resultado um
matriz com o formato de shape.
Exemplos: reshape(( / 1, 2, 3, 4, 5, 6 / ) ), ( / 2, 3 / )) tem o seguinte valor:
[135]
[ 2 4 6]
Funes intrnsecas associadas matrizes

7-77

Fortran 90 Curso bsico Copyright 1998 by J.D.B.

7.16 Shape
Retorna o formato de um matriz ou de um escalar.
Formato: shape ([source=]source)
Descrio: A funo intrnseca shape retorna a configurao de um matriz ou de um
escalar. O compilador gera um cdigo inline para executar a funo. Ela no vetoriza. O nome
desta intrnseca no pode ser passado como argumento.
Valores de retorno: O resultado um inteiro de dimenso 1 cujo tamanho igual ao
nmero de dimenses do source. O valor do resultado do tipo source.
Exemplo: o valor de shape(a(2:5,-1:1)) (4,3). O valor de shape(3) a dimenso -1 que
um matriz de dimenso 0.

7.17 Size
Retorna o numero total de elementos de um matriz.
Formato: size ([matriz=]matriz [,[dim=]dim])
Descrio: A funo size retorna o nmero total de elementos de um matriz. Se dim for
especificado, ele retornar apenas o nmero de elementos de uma determinada dimenso. O
compilador executa um cdigo externo para executar esta funo. No vetoriza. O nome desta
intrnseca no pode ser passado como argumento.
Valores de retorno: O resultado um inteiro. O resultado tem um valor igual ao nmero
de de elementos na matriz inteiro. Se dim for especificado ento a funo retornar o nmero de
elementos de uma determinada posico.
Exemplos: size(a(2:5, -1:1), dim=2) 3. O valor de size(a(2:5, -1:1)) 12.

7.18 spread
Constri um matriz com diversas cpias de um argumento.
Formato: spread([SOURCE=] source, [DIM=]dim, [NCOPIES=]ncopies)
Descrio:A funo spread constri um matriz com diversas cpias de um argumento. A
funo intrnseca pode ser usada para a construo de um matriz. Ela replicaum matriz
adicionando uma dimenso. Spread aceita os seguintes argumentos:
source deve ser de qualquer tipo. Pode ser um escalar ou um matriz. O nmero de
dimenses deve ser menor que 7.
dim

Deve ser um escalar e inteiro com valor na faixa 1 <= dim <= n, onde n

dimenso de source. Esta funo verifica a existncia de dim.


Funes intrnsecas associadas matrizes

7-78

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


ncopies

deve ser um escalar e inteiro.

Valores de retorno: O resultado um matriz de mesmo tipo que source e de dimenso


n+1, onde n a dimenso de source.
Exemplos: Assuma que ISCALR um escalar de valor 8. As seguintes declaraes so
verdadeiras:
spread(ISCALR,DIM=1,NCOPIES=0) um matriz de dimenso zero.
a=[ 2, 3, 4]
spread(a, DIM=1, NCOPIES=3) tem como resultado:
[2 3 4]
[2 3 4]
[2 3 4]

7.19 sum
Soma os elementos de um matriz.
Formato: sum ([MATRIZ=]matriz [, [ DIM=]dim] [, [MASK=]mask])
Descrio: A funo intrnseca sum soma todos os elementos de um matriz ao longo da
dimenso dim que correspondem aos valores verdadeiros de mask. Aceita os seguintes
argumentos:
matriz Deve ser do tipo inteiro, real ou complexo. No pode ser escalar.
dim

Deve ser um escalar do tipo inteiro com um valor na faixa 1 <= dim <=n, onde n

a dimenso da matriz.
mask Deve ser do tipo lgico.
Valores de retorno: O resultado do tipo do parametra matriz. Ser escalar se dim estiver
ausente ou se a matriz tiver dimenso 1. Caso contrrio, o resultado um matriz de dimenso n1.
Exemplos: sum (( / 1 , 2, 3 / )) 6.
b=

[135]
[246]

sum(b, dim=1) [3, 7, 11]


sum(b, dim=2) [9, 12]

7.20 Lbound
Retorna todos os limtes mnimos de um matriz.
Funes intrnsecas associadas matrizes

7-79

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Formato: lboud ([matriz=]matriz [,[dim=]dim])
Descrio: a funo lbound retorna todos os limtes mnimos ou um limte especfico de
um matriz.
Valores de retorno: O resultado deste tipo por padro inteiro. escalar se dim est
presente; por outro lado, o resultado um matriz de dimenso 1 e tamanho n.
Exemplos: Se A declarado real (a(2:3, 7:10), lbound(a) [2,7] e lbound(a,dim=2) 7.

7.21 Ubound
Retorna o nmero maximo de elementos de um matriz ou de uma das dimenses
especficas do mesmo.
Formato: ubound([matriz=]matriz[,[dim=]dim])
Descrio: A funo ubound retorna todos os valores mximos de dimenso de um
matriz.
Valores de retorno: O resultado um tipo inteiro. Se o escalar dim estiver presente.
Seno o resultado um matriz de dimenso N onde n o numero de dimenses da matriz.
Exemplo:
A matriz a declarada da seguinte forma:
real, dimension(3,10)

:: a;

...
ubound(a) [3,10]
ubound(a,1) 3;
ubound(a,dim=2) 10

7.22 transfer
Trata o primeiro argumento como se fosse do mesmo tipo como o segundo argumento.
Formato: transfer([SOURCE=]source, [MOLD=]mold [ , [SIZE=]size])
Descrio: A funo intrnseca transfer como um resultado com a representao fsica
idntica aquela de source mas interpretada com o tipo de mold. Se mold caracter, o resultado
tera o mesmo tamanho do caracter declarado por mold. Aceita os seguintes argumentos:
source Pode ser de qualquer tipo. Pode ser escalar ou matriz.
mold Pode ser de qualquer tipo. Pode ser escalar ou matriz.
size

deve ser um escalar e inteiro.

Funes intrnsecas associadas matrizes

7-80

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


Valores de retorno: Tem o mesmo tipo de mold. Se mold escalar e size no estiver
presente, o resultado escalar.
Exemplo: a= [1.1, 2.2, 3.3], transfer(a,(/ 0.0,0.0)/), 1) um complexo de dimenso 1 com
os elementos (1.1, 2.2)

7.23 transpose
Calcula a transposta de uma matriz de dimenso dois.
Formato: transpose ([MATRIX=]matriz)
Descrio: A funo intrnseca transpose um matriz bi-dimensional.
Valores de retorno: O resultado um matriz de mesmo tipo de matriz, com dimenso 2, e
formato (n,m), onde (m,n) o formato da matriz de entrada.
Exemplo:
[123]
a=

[456]
[789]

transpose(a)= [1 4 7 ]
[2 5 8 ]
[ 3 6 9]

7.24 unpack
A partir de um vetor, monta um matriz de acordo com mask.
Formato: unpack([VECTOR=]vector, [MASK=]mask, [FIELD=]field)
Descrio: A funo intrnseca unpack monta um matriz a partir de um vetor, com as
definies em mask. Aceita os seguintes argumentos:
vector Vetor de qualquer tipo. No pode ser escalar.
mask deve ser do tipo lgico.
field

Deve ser do mesmo tipo que vetor.

Valores de retorno: O resultado um matriz de mesmo tipo como vetor e de mesmo


formato que mask.
Exemplo: M tem o seguinte formato:
[ 1 0 0]
[ 0 1 0]
[ 0 0 1]
Funes intrnsecas associadas matrizes

7-81

Fortran 90 Curso bsico Copyright 1998 by J.D.B.


V=[1 2 3]
Q tem a mscara:
[ F T F]
[ T F F]
[ F F T]
Ento: unpack(V, MASK=Q, FIELD=M) tem o seguinte resultado:
[ 1 2 0 ][ 1 1 0 ][ 0 0 3 ]

7.25 Exerccios de fixao


1. Escrever um programa que l uma matriz e a imprime. Aps isto, verificar com o comando
count, contar quantos elementos so pares, e quantos so mpares.
2. Escrever um programa que gera 2 vetores de 50 posies cada, e calcula o seu produto
interno.
3. Escrever um programa que gera uma matriz (N x N), e verifica em que posio e qual o seu
maior nmero.
4. Escrever uma funo que retorna um vetor com a soma das linhas de uma matriz (M x N).
5. Escrever uma subrotina que recebe uma matriz (M x N) qualquer, e retorna a soma das
diagonais da mesma.

Funes intrnsecas associadas matrizes

7-82

Fortran 90 Curso bsico

8. Funes intrnsecas
As funes intrnsecas podem ser chamadas de qualquer unidade de programa ou
subprograma. Contudo, uma funo ou subrotina escrita com o mesmo nome de uma funo
intrnseca tem prioridade sobre a mesma.

8.1 Funes intrnsecas para manipulao de bits

8.1.1 Bit_size
Retorna o nmero de bits em um inteiro em um modelo de manipulao de bits.
Formato: bit_size ([i=]i)
Descrio: A funo bit_size retorna o nmero de bits s como definido pelo modelo de
bits. Esta funo aceita o seguinte argumento:
i

Deve ser do tipo inteiro.

Valores de retorno: O resultado um inteiro escalar com o mesmo tipo de parametro que
i.
Exemplos:
integer (kind=1)

i1

integer (kind=2)

i2

...
write (*,*) Bit_size i1= , bit_size(i1)
...
Sada:
bit_size i1 = 8

8.1.2 btest
Testa um bit de um nmero inteiro.
Formato: btest([i=]i,[pos=]pos)
Descrio: Testa um determinado bit de um nmero inteiro.
Valores de retorno: O resultado por default lgico. O resultado tem valor TRUE se o bit
pos de i tem valor 1 e tem valor FALSE se o bit pos tem o valor 0. O modelo de bits define a
interpretao de um inteiro como uma sequncia de bits.
Exemplo:
Funes intrnsecas

8-83

Fortran 90 Curso bsico


btest(8,3) tem valor TRUE

8.1.3 ibits
Extrai uma seqncia de bits.
Formato: ibits([I=]i, [POS=]pos, [LEN=]len)
Descrio: a funo intrnseca ibits extrai uma sequencia de bits. Aceita os seguintes
argumentos:
i

Deve ser do tipo inteiro.

pos

Deve ser do tipo inteiro. Deve ser no negativo e pos+len deve ser menor ou igual

a bit_size(i).
len

Deve ser do tipo inteiro e no negativo.

Valores de retorno: O resultado tem o valor da sequncia de len bits em i iniciando na


posio pos. O modelo de bits define o modelo para a interpretao de um valor inteiro como
uma sequencia de bits.
Exemplos: ibits(14,1,3) tem valor 7.

8.1.4 ibset
seta um bit.
Formato: ibset([I=]i, [POS=]pos)
Descrio: A funo intrnseca ibset seta um bit para 1.
i

Deve ser do tipo inteiro.

pos

Deve ser do tipo inteiro. Deve ser positivo e menor que bit_size(i).

O compilador gera cdigo inline para executar esta funo intrnseca. Vetoriza em
sistemas Cray PVP. O nome desta funo intrnsecas no podem ser passados como um
argumento.
Valores de retorno: O resultado tem o valor de uma sequncia de bits de i, exceto que o
bit pos setado para 1. O modelo de bits define a interpretao de um inteiro como uma
sequencia de bits.
Exemplo: ibset(12,1) tem valor 14.

8.1.5 ishft
Executa um shift lgico.
Formato: ishft([I=]i,[SHIFT=]shift)
Funes intrnsecas

8-84

Fortran 90 Curso bsico


Descrio: A funo ishft executa um shift lgico. Aceita os seguintes argumentos:
i

Deve ser do tipo inteiro.

shift

Deve ser do tipo inteiro. O valor absoluto de shift deve ser menor ou igual a

BIT_SIZE(i).
Valores de retorno: O resultado tem o mesmo tipo de i. O resultado tem o valor obtido
por rotao dos bits de por shift posies. Se shift positivo, o shift ser para a esquerda. Se o
shift for negativo, ele girar para a direita. se shift for zero, no haver rotao.
Exemplo: ishft(3,1) tem resultado 6.

8.1.6 ishftc
Executa uma rotao circular dos bits mais a esquerda.
Formato: ishftc([I=]i, [SHIFT=]shift [,[SIZE=]size])
Descrio: A funo intrnseca ishftc executa uma rotao circular dos bits mais a direita.
Aceita os seguintes argumentos:
i

Deve ser do tipo inteiro.

shift

Deve ser do tipo inteiro. O valor do shift absoluto deve ser menor ou igual a size.

size

Deve ser do tipo inteiro. O valor de size deve ser positivo e no deve exceder

bit_size(i). Se size estiver ausente, como se estivesse presente com o valor de bitsize(i).
Valores de retorno: O resultado tem o mesmo tipo de i. O resultado tem o valor obtido da
rotao dos bits de i iniciando-se em size, por shift. Se shift for positivo, rotacionar para a
direita, se for negativo rotacionar para a esquerda. Se shift for zero, nenhuma rotao
executada.
Exemplo: ishftc(3,2,3) tem o valor 5.

8.2 Funes intrnsecas para gerao de nmeros aleatrios

8.2.1 Random_number
Retorna um nmero pseudoaleatrio maior ou igual a zero e menor do que a distribuio
uniforme.
Formato:
Call random_number(harvest)
Onde: harvest (sada, real) pode ser um array. Nmeros pseudoaleatrios, no intervalo
[0,1], de distribuio uniforme, ou um array de tais nmeros.
Funes intrnsecas

8-85

Fortran 90 Curso bsico


Observaes:
A semente para o gerador de nmeros pseudoaleatrios usado pela subrotina
random_number pode ser inicializada com random_seed. Se random_seed no for usado, o
programa ajusta a semente para o gerador de nmeros aleatrios para um valor dependente do
processador.
Exemplo:
real x, array1(5,5)
call random_seed()
call random_number(x)
call random_number(array1)

8.3 Random_seed
Informa ao programa qual o ponto de partida para o gerador de nmeros pseudo
aleatrios que servem de entrada para o gerador de nmeros aleatrios RANDOM_NUMBER.
Sintaxe:
call random_seed([size][,put][,get])
size (opcional, sada, inteiro) Nmero de inteiros que o processador usa para inicializar a
semente.
put (opcional, entrada, inteiro) Vetor usado pelo processador para inicializar o valor da
semente.
get (opcional, entrada, inteiro) Vetor usado para informar o valor inicial da semente.
No h necessidade de informar nenhum dos argumentos. Os vetores put e get devem ser
dimensionados maiores que o tamanho do vetor que o processador usa para armazenar a
semente. possvel determinar o tamanho pela chamada da subrotina random_seed com o
argumento SIZE=1.
Se nenhum argumento especificado, o processador inicializa a semente para um valor
aleatrio baseado no relgio interno do computador.
Exemplo:
Call random_seed()

Funes intrnsecas

8-86

Fortran 90 Curso bsico

9. Atributos na declarao de variveis


9.1 Introduo
Nos captulos anteriores, foram apresentados alguns atributos na declarao de variveis,
tais como o dimension para declarar matrizes e o intent, para informar se o parmetro sendo
passado era de leitura, escrita ou leitura e escrita. Neste captulo sero apresentados os atributos
na declarao de variveis, que as tornam constantes, que as tornam parmetros opcionais em
chamadas a subrotinas, e tambm o atributo que faz com que o contedo de uma varivel seja
guardado para posterior utilizao em outra parte do programa.

9.2 Parameter
Uma constante pode ser determinada no momento de sua declarao com o atributo
parameter. A declarao de constantes segue:
tipo, parameter [,lista de atributos]

:: nome=expresso de inicializao.

A lista de atributos pode ser:


dimension
private
public
Exemplos:
integer, parameter

:: estados=25

integer, parameter

:: m=mod(28,3)

Observaes:
No momento em que a varivel declarada receber o atributo parameter, seu contedo
(expresso de inicializao), no poder ser modificado. Caso haja alguma tentativa de
modificao do contedo da varivel, o Fortran 90 gerar um erro em tempo de compilao.
Associado ao atributo parameter, encontra-se o comando parameter, que possui a
mesma funo do atributo, com a diferena que o segundo informado aps a declarao da
varivel, como no exemplo abaixo:

Atributos na declarao de variveis

9-87

Fortran 90 Curso bsico


1.
2.
3.
4.
5.
6.

program para_const
implicit none
real
:: a
parameter(a=10)
write (*,*) 'Contedo de a: ',a
end program para_const
Caso haja uma tentativa de declarar a varivel, com o atributo parameter, ou ento com

o comando parameter, o Fortran 90 acusar um erro de sintaxe, em tempo de compilao.

9.3 Optional
O atributo optional permite que uma varivel passada a uma subrotina seja omitida. A
funo intrnseca present pode ser usada para verificar a presena do argumento opcional em
uma invocao particular e este teste pode ser usado para controlar o processamento subsequente
na subrotina.
Formato:
tipo, optional [,lista de atributos]

:: lista de variveis;

Lista de atributos:
dimension
external
intent
pointer
target
O atributo optional especifica que a varivel em questo no necessariamente precisa
ser passada como parmetro na chamada da subrotina. Para verificar se determinada varivel
est presente na passagem dos parmetros, pode-se usar a funo intrnseca present, descrita
na seo seguinte.
O atributo optional pode ser utilizado somente em subrotinas ou em interfaces. O
comando optional tem o mesmo efeito do atributo de mesmo nome, podendo ser utilizado da
seguinte maneira:
Optional

:: lista de variveis.

Atributos na declarao de variveis

9-88

Fortran 90 Curso bsico

9.3.1 Present
Determina se um argumento opcional est presente ou no.
Formato: present ([a=]a)
Descrio: A funo present determina se um argumento opcional est presente na
chamada da subrotina. O compilador gera codigo inline e vetoriza em sistemas Cray PVP. O
nome desta funo intrnseca no pode ser passado como um argumento.
Valores de retorno: O tipo de resultado um escalar lgico. O resultado tem o valor true
se a est presente e false se no estiver.

9.4 Save
Variveis declaradas com o atributo save guardam seus valores, sua definio e status de
alocao depois do subprograma na qual eles so declarados encerram sua execuo. Variveis
sem o atributo save no guardam seu valor e status, embora o Fortran 90 trate blocos common
como se eles tivessem o atributo save.
Objetos declarados em um mdulo podem ter o atributo save. Nestes casos eles sempre
mantero seus valores e status quando uma subrotina que execute o mdulo complete a
execuo. Objetos em mdulos devem estar em uso contnuo para reter os valores.
Objetos declarados em subprogramas recursivos podem ter o atributo save . Tais objetos
so compartilhados por todas as instancias do subprograma.
Quaisquer objetos que so inicializados em uma declarao data tem o atributo save
como padro.
Formato:
tipo, save [, lista de atributos] :: lista de variveis
Lista de atributos:
allocatable
dimension
pointer
private
public
target
Atributos na declarao de variveis

9-89

Fortran 90 Curso bsico


obs: Se o atributo save aparecer no programa principal, ele no ter efeito. Alm disto, os
seguintes objetos no sero salvos:
uma subrotina
um resultado de funo
um argumento
Exemplo:
7. program ve_save
8. implicit none
9. real
:: ch=0
10. call sub1(ch)
11. ch=ch+1
12. call sub1(ch)
13. end program ve_save
1. subroutine sub1(ch)
2. implicit none
3. real,intent(in)
:: ch
4. !-----------------------------5. ! declarao da varivel que dever ser salva
6. !-----------------------------7. integer,save
:: contador=0
8. write (*,*) 'Chamada: ',ch,' valor: ',contador
9. contador=contador+1
10. end subroutine sub1

9.5 External
O atributo external em uma declarao de tipo indica que o nome declarado de uma
funo ou subrotina externa.
Formato:
tipo, external [, lista de atributos]

:: lista de variveis;

Lista de atributos:
optional
private
public
Exemplo:
! programa principal
Atributos na declarao de variveis

9-90

Fortran 90 Curso bsico


external sub_calc
....
subroutine sub_calc(...)
....

9.6 Intrinsic
O atributo intrinsic em uma declarao de tipo indica que um nome o nome da funo
intrnseca e permite que nomes de algumas funes intrnsecas sejam usadas como argumentos.
Formato:
tipo, intrinsic [, lista de atributos]

:: lista de funes intrnsecas

Lista de atributos:
private
public
exemplos:
real, intrinsic

:: sin, cos;

Atributos na declarao de variveis

9-91

Fortran 90 Curso bsico

10. Entrada e sada


Muitos programas necessitam de dados iniciais para o seu processamento. Depois que
os clculos estiverem completos, os resultados naturalmente precisam ser impressos,
mostrados graficamente ou salvos para uso posterior. Durante a execuo de um programa,
algumas vezes h uma quantidade grande de dados produzidos pr uma parte do programa
que muito grande para ser mantida na memria, tais como matrizes.
Os comandos de entrada e sada so:
read
print
write
open
close
O comando read, o responsvel pr transferir dados de um meio externo para o
programa ou de um arquivo interno para o programa atravs de um processo conhecido como
leitura.
Os comandos write e print so responsveis pr transferir dados da memria
principal para um arquivo interno ou outro dispositivo de sada atravs de um processo
conhecido como escrita.
Os comandos open e close so comandos de conexo com arquivos.
O comando inquire o comando para pesquisa em arquivo.
Os comandos backspace, endfile e rewind so comandos para posicionamento em
arquivos.

10.1 Registros, arquivos, mtodos de acesso e unidades


Colees de dados so armazenados em arquivos. Os dados em um arquivo so
organizados em registros. O Fortran trata um registro, pr exemplo, como uma linha em um
terminal de computador, uma linha em uma listagem, ou um registro lgico em uma fita
magntica ou arquivo em disco. Contudo, as propriedades gerais de arquivos e registros no
dependem de como as propriedades so adquiridas ou como os arquivos e registros so
armazenados.

Entrada e sada

10-92

Fortran 90 Curso bsico

10.1.1 Registros
H dois tipos de registros: dados e final de arquivo. Um registro de dados uma
seqncia de valores.
Os valores em um registro de dados podem ser representados de duas maneiras:
formatados e no formatados. Os dados formatados consistem de caracteres que podem ser
visualizados em alguns ambientes. Pr exemplo, um registro poderia conter os seguintes
valores caracter:
6
,
1
1
Eles tentam representar dois nmeros: 6 e 11. Neste caso o registro poderia ser
representado esquematicamente como mostrado na figura abaixo:

Dados no formatados consistem de valores tais como so armazenados na memria


do computador. Pr exemplo, se inteiros so armazenados em representao binria, um
registro no formatado, consistindo de dois valores inteiros, 6 e 11 poderiam ser vistos como
na figura abaixo:
0000001

0000010

10

11

Os valores em um registro de dados podem ser todos formatados ou no formatados.


Um registro formatado um que contem somente dados formatados. Pode ser criado pr um
usurio apenas digitando em um terminal ou pr um programa em fortran que converte
valores armazenados internamente em caracteres string que possuem uma representao
daqueles valores. Quando um programa l dados formatados, caracteres devero ser
convertidos para a forma de representao interna dos valores.
Um registro no formatado um que contem somente dados no formatados. Registros
no formatados podem ser geralmente criados executando-se um programa fortran, mas
podem ser criados pr outros meios. Dados no formatados geralmente necessitam de menos
espao em um dispositivo externo. Alm disto geralmente mais rpido para leitura e escrita
Entrada e sada

10-93

Fortran 90 Curso bsico


porque no existe regra de converso. O tamanho dos registros no formatados dependem do
nmero de valores nele, mas medido em bytes. Pode ser zero. O tamanho de um registro no
formatado que ser produzido pr uma sada particular pode ser determinado com o comando
inquire.

10.1.2 Arquivos
Um arquivo pode ter uma mistura de registros formatados e no formatados. O arquivo
pode ter um nome. O tamanho do nome do arquivo e do caminho dependem da plataforma.

10.1.2.1 Arquivos externos


Arquivos externos esto localizados em dispositivos externos como fitas, discos ou
terminais de computador. Para cada arquivo externo, h um conjunto de mtodos de acesso
permitidos, um conjunto de formas permitidas, um conjunto de aes e um conjunto de
tamanhos de registro. Estas caractersticas so determinadas pela combinao de requisies
pelo usurio do arquivo e pelas aes do sistema operacional.

10.1.2.2 Arquivos internos


O contedo de arquivos internos so armazenados como valores de variveis do tipo
caracter. Voc pode criar os valores caracter usando todos os meios usuais de atribuio de
valores caracter, ou pode cri-los como um comando de sada que especifica o nome do
arquivo externo e interno.

10.1.3 Mtodos de acesso


H dois mtodos de acesso:
Acesso seqencial
Acesso direto
Alguns arquivos podem ser acessados pr ambos mtodos; outros arquivos podem ser
restritos a um mtodo de acesso ou outro. Pr exemplo, uma fita magntica pode ser acessada
somente seqencialmente. Enquanto cada arquivo est aberto, existe um conjunto de mtodos
de acesso permitidos, a qual geralmente significa que pode ser acessado ou seqencialmente
ou diretamente. Contudo, nenhum arquivo pode ser acessado pr ambas as formas. Se o
arquivo estiver sendo acessado diretamente, necessrio o comando CLOSE para encerrar a
conexo e um comando OPEN para refazer a conexo em modo seqencial.
Entrada e sada

10-94

Fortran 90 Curso bsico

10.1.3.1 Acesso sequencial


O acesso seqencial aos registros em um arquivo inicia com o primeiro registro do
arquivo e continua seqencialmente para o segundo registro, e ento para o prximo registro,
registro a registro. Os registros so acessados serialmente como aparecem no arquivo. No
possvel iniciar com um registro particular dentro do arquivo sem ler os registros que
estiverem antes deste, na ordem seqencial.

10.1.3.2 Acesso direto


Quando um arquivo est sendo acessado diretamente, os registros so selecionados
pelo nmero do registro. Usando esta identificao, os registros podem ser lidos ou gravados
em qualquer ordem. Portanto possvel escrever um arquivo na posio 47, antes do registro
na posio 13.

10.1.4 Unidades
Todos os comandos de entrada e sada referem-se a um arquivo particular referenciado
pr uma unidade de E/S. Uma unidade de E/S ou externa ou interna. Uma unidade externa
ou um inteiro no negativo ou um asterisco (*). Quando um arquivo externo um inteiro no
negativo chamado de unidade de arquivo externa.

10.1.4.1 Nmeros de unidades


A coleo de nmeros de unidades que podem ser usadas em um programa para acesso
externo consistem de inteiros de 0 at 299. O nmero das unidades que podem ser usadas so
ditas existentes. Comandos de I/O devem referir-se a unidades que existem, exceto para
aquelas que fecham um arquivo. As atribuies para unidades 100, 101, e 102 no podem ser
trocadas, e estes nmeros no podem aparecer no comando OPEN. Nmeros 0, 5 e 6 no so
equivalentes ao asterisco, e podem receber uma nova atribuio.
A tabela abaixo apresenta os nmeros das unidades disponveis para usurios do F90:

Entrada e sada

10-95

Fortran 90 Curso bsico

Unidade

Disponibilidade

Associado com o arquivo stderr ou disponvel para especificao de usurio

1-4

Disponvel para o usurio

Associado com o arquivo stdin ou disponvel para o usurio

Associado com o arquivo stdout ou disponvel para o usurio

7-99

Disponvel para o usurio

100

Reservado para uso do sistema como um arquivo stdin

101

Reservado para o uso do sistema como um arquivo stdout

102

Reservado para o uso do sistema como um arquivo stderr

103-104

Reservado para o uso do sistema

105-299

Disponvel para o usurio

10.2 Comandos de transferncia de dados


Quando uma unidade conectada, ou pr pr conexo ou execuo de um comando
OPEN, os dados podem ser transferidos pela leitura ou escrita no arquivo associado com a
unidade. A transferncia pode ocorrer de arquivos internos ou externos.
Os comandos de transferncia de dados so READ, WRITE e PRINT. Estes
comandos so definidos como segue:
READ (io_control) [lista_itens] ou READ formato [, lista_itens]
WRITE (io_control) [lista_itens] ou WRITE formato [, lista_itens]
PRINT formato [, lista_itens]
Os comandos possveis para controle de entrada e sada (io_control), so definidas na
proxima seo.

10.2.1 Informaes de controle de I/O


10.2.1.1 unit
O formato do controle UNIT= especificado abaixo:
[UNIT=] unidade de sada
Uma unidade de sada pode ter as seguintes atribuies:
Nome de arquivo externo - O nome do arquivo que ser referenciado.
* Entrada e sada padro
Entrada e sada

10-96

Fortran 90 Curso bsico


Nome de arquivo interno - Varivel char
Nmero da unidade - Deve ser um nmero no negativo na faixa de 0 299.

10.2.1.2 fmt
O formato do controle FMT especificado abaixo:
[FMT=] formato
O formato definido como segue:
Expresso caracter
label
*
Especificando uma expresso caracter, que prove a especificao do formato na
forma de um caracter string, indica entrada e sada formatada. A expresso caracter deve estar
disponvel e deve ser uma especificao de formato vlida. Se a expresso um matriz,
tratado como se todos os elementos da matriz estivessem concatenados juntos em uma ordem
de elementos e deve ser uma especificao de formato vlida.
Especificando um label, este informar a linha onde o formato dos dados estar para
ser lido ou gravado. O comando de informa o formato o FORMAT.
Se o asterisco (*) estiver especificado, indica que formato livre.

10.2.1.3 advance
O formato do controle ADVANCE especificado abaixo:
ADVANCE= Expresso escalar.
Para a expresso escalar deve ser informado um valor YES ou NO. NO indica que o
arquivo de dados seqencial no formatado no dever avanar. YES indica que a
transferncia seqencial de dados dever avanar.

10.2.1.4 end
O formato do controle END especificado abaixo:
END= label
Se uma condio de final de arquivo ocorrer e nenhuma condio de erro ocorrer
durante a execuo do comando READ, o programa saltar para o endereo apontado pr
label.
Entrada e sada

10-97

Fortran 90 Curso bsico

10.2.1.5 eor
O formato do controle EOR especificado abaixo:
EOR = label
O programa salta para o label especificado por EOR se o final de registro for encontrado
para um comando READ sem avano.
se o final do registro for encontrado e nenhuma condio de erro ocorrer durante a
execuo do comando read:
O arquivo posicionado depois do registro corrente.
A variavel dada no IOSTAT=, se estiver presente, se torna definida com um valor
negativo.
A execuo do READ termina e o programa salta para o label do controle EOR.
A variavel dada em SIZE, se estiver presente, se torna definido com um valor inteiro igual
ao nmero de caracteres lidos do registro de entrada.

10.2.1.6 err
O formato do controle ERR especificado abaixo:
ERR = label
Se uma condio de erro ocorrer, a posio do arquivo se torna indeterminada.
O programa salta para o label no controle ERR se um erro ocorrer em um comando de
transferncia de dados.

10.2.1.7 iostat
O formato do controle IOSTAT especificado abaixo:
IOSTAT= varivel escalar inteira
Um valor inteiro retornado em varivel escalar inteira. O significado da varivel de
retorno pode ser:
Se varivel >0, uma condio de erro ocorreu.
Se varivel =0, nenhum erro, final de arquivo ou final de registro ocorreu.
Se variavel <0, uma condio de final de registro ou final de arquivo ocorreu. O valor
negativo de final de arquivo no o mesmo valor que o indicado para final de registro.
Entrada e sada

10-98

Fortran 90 Curso bsico

10.2.1.8 rec
O formato do controle REC especificado abaixo:
REC = escalar
O escalar especifica um valor inteiro que indica o numero do registro a ser escrito ou
lido. O controle REC pode aparecer somente em um comando de transferncia de dados com
uma unidade que est conectada para acesso direto.

10.2.1.9 size
O formato do controle SIZE especificado abaixo:
SIZE = escalar
O sistema de E/S retorna um inteiro no negativo em escalar que indica o nmero de
caracteres lidos. O controle SIZE aplica-se na execuo do comando READ e pode aparecer
somente em um comando READ com um controle ADVANCE com valor NO.

10.2.2 Acesso sequencial formatado


Para entrada e sada formatada, o arquivo consiste de caracteres. Estes caracteres so
convertidos dentro de representaes para armazenamento na memria do computador
durante a entrada e convertido para uma representao interna de caracteres na sada. Quando
um arquivo acessado seqencialmente, os registros so processados na ordem na qual
aparecero no arquivo.
O acesso seqencial formatado pode ter um dos seguintes formatos:
read ( [unit=] unidade, [fmt=]formato [ , iostat= escalar] [ , err= label] [ , end=
label] [ , advance = YES ]) Lista de variveis
read format [, lista de variveis]
write ( [unit=] unidade, [fmt=]formato [ , iostat= escalar] [ , err= label] [ , end=
label] [ , advance = YES ]) Lista de variveis
print format [ , lista de variveis]
write format [ , lista de variveis]
A unidade de E/S uma expresso inteira escalar com um valor no negativo e um
asterisco, ou um caracter literal constante. Todas as formas de entrada e sada apresentadas
indicam que a unidade um acesso seqencial formatado externo.
Exemplos:
Entrada e sada

10-99

Fortran 90 Curso bsico


read (5, 100, ERR=99, END=200) a, b,
read (9, IOSTAT=IEND, FMT=FMT_5) x, y
read (FMT=5E20.0, unit=5, advance=YES) (y(i), i=1,kk)
write (9, FMT=103, IOSTAT=IS, ERR=99) a, b, c, s
write(fmt=105,err=9, unit=7) x

10.2.3 Acesso sequencial no formatado


Para a entrada e sada seqencial no formatada, o arquivo consiste de valores
armazenados usando uma representao interna binria. Isto significa que uma pequena
converso necessria durante a entrada e sada.
O acesso seqencial aos dados no formatados so na realidade os comandos READ e
WRITE sem formato especfico. Os formatos so:
read ( [unit=] unidade [, iostat= escalar] [ , err= label] [ , end= label] ) Lista de
variveis
read (*,* lista de variveis]
write ( [unit=] unidade [ , iostat= escalar] [ , err= label]) Lista de variveis
print * [ , lista de variveis]
Exemplos:
read(5, err=99, end=100) a, b, (c(i), i=1,40)
read(iostat=iend, unit=9) x, y
read (5) y
write (9, iostat=is, err=99) a, b, c, s
write (err=99, unit=7) x
write (9) x

10.2.4 Acesso direto


Na transferncia de dados pr acesso direto, os registros so selecionados pr nmero
do registro. O nmero do registro um escalar inteiro cujos valores representam o nmero do
registro a ser lido ou escrito. Os registros podem ser escritos em qualquer ordem, mas todos
os registros devem ser do tamanho especificado pelo controle RECL em um comando
OPEN.
No possvel apagar um registro usando acesso direto. Contudo, os registros podem
ser rescritos, assim um registro pode ser apagado gravando-se brancos em cima do registro.
Entrada e sada

10-100

Fortran 90 Curso bsico

10.2.4.1 Acesso direto formatado


Para entrada e sada formatada, o arquivo consiste de caracteres. Estes caracteres so
convertidos para uma representao interna durante a entrada e so convertidos de uma
representao interna para caracteres durante a sada.
O formato dos comandos de entrada e sada formatados so descritos a seguir:
read ( [ unit=] escalar, [fmt=] formato, rec= escalar [ , iostat= escalar] [ , err=
label ] ) variveis
write ( [ unit=] escalar, [fmt=] formato, rec= escalar [ , iostat= escalar] [ , err=
label ] ) variveis
A unidade de entrada e sada uma expresso inteira escalar com um valor no
negativo, um asterisco, ou um caracter literal constante. A unidade de entrada e sada indica
que a unidade uma unicade de acesso sequencial externo.
Exemplos:
read (7, fmt_x, rec=32, err=99) a
write (8,(2F15.5), rec= n+2) x, y

10.2.4.2 Acesso direto no formatado


Para o acesso direto no formatado, o arquivo consiste de valroes armazenados
usando-se uma representao a mesma ou parecida com a usada no programa que est na
memria. Isto significa que uma pequena converso ou nenhuma feita durante a entrada ou
sada.
O formato dos comandos de entrada e sada no formatados so:
read ( [ unit=] escalar, rec = escalar [ , iostat= escalar] [ , err= label ] ) variveis
write ( [ unit=] escalar, rec= escalar [ , iostat= escalar] [ , err= label ] ) variveis
Exemplos:
read (7, * , rec=32, err=99) a
write (8, *, rec= n+2) x, y

10.3 Comando OPEN


O comando open estabelece uma conexo entre uma unidade e um arquivo externo e
determina as propriedades da conexo. Para executar transferncias de dados, o arquivo deve
estar conectado com um comando OPEN ou pr-conectado. Pode ser usado para trocar certas

Entrada e sada

10-101

Fortran 90 Curso bsico


propriedades de conexo entre o arquivo e a a unidade, para criar um arquivo que
preconectado, ou cria-se um arquivo e conecta-o.
O comando OPEN pode aparecer em qualquer lugar de um programa, e uma vez que
for executado, a conexo da unidade para o arquivo valida no programa principal ou em
qualquer subprograma por toda a execuo, a menos que um comando CLOSE for executado.
Se um arquivo estiver conectado com a unidade, ele no poder ser conectado a outra
unidade.

10.3.1 Forma do comando OPEN


O comando OPEN dfinido como segue:
open (lista de especificaes)
Os comandos da lista de especificaes so:
unit
access
action
blanck
delim
err
file
form
iostat
recl
status
Os valores possveis para as especificaes acima esto na tabela abaixo:

Entrada e sada

10-102

Fortran 90 Curso bsico

Espec

Valores possveis

Valor default

Access

direct, sequential

sequential

Action

read, write, readwrite

depende do arquivo

Blank

null, zero

null

Delim

apostrophe, quote, none

none

Err

label

sem default

File

expresso caracter

depende do nmero da unidade

Form

formatted, unformatted

formatted para acesso sequencial e unformatted


para acesso direto

Iostat

Varivel inteira escalar padro

sem padro

Recl

Expresso inteira positiva

Depende do arquivo

Status

old, new, unknown, replace,


scratch

sem padro

10.4 Especificaes
END=endlabel - Inteiro entre 1 e 99.999. Quando o final do arquivo for encontrado, o
programa transfere o controle para a linha especificada por label.
EOR=eorlabel - Inteiro entre 1 e 99.999. Quando o final do registro encontrado, o
programa transfere o controle para a linha especificada por label.
ERR=errlabel - Inteiro entre 1 e 99.999. Especifica o label de um comando
executvel quando a execuo for transferida devido a um erro de E/S.
FILE=file - Varivel caracter ou expresso. O Tamanho e formato do nome so
determinados pelo sistema operacional.
Especificaes
IOSTAT=iostat - Varivel inteira. Especifica uma varivel cujos valores indicam se
houve um erro de E/S.
MODE=permisso - 'READ', 'WRITE' or 'READWRITE' (default is 'READWRITE').
Tem o efeito que action.
POSITION=file_pos 'ASIS', 'REWIND' ou 'APPEND' (padro 'ASIS') - Especifica a
posio em um arquivo.
REC=rec - Varivel inteira positiva ou expresso que especifica o tamanho do
registro a ser lido ou escrito em arquivo.
Especificaes
Entrada e sada

10-103

Fortran 90 Curso bsico


RECL=length - Varivel inteira positiva ou expresso. Especifica o tamanho do
registro em arquivos de acesso direto, ou tamanho mximo de registro em arquivos com
acesso sequencial.
SIZE=size

- Varivel inteira. Retorna o nmero de caracteres lidos em um READ

sem avano antes da condio de fim de registro acontecer.

10.5 Comando CLOSE


Executando um comando close, este termina a conexo entre um arquivo e uma
unidade. Quaisquer coneces no fechadas explicitamente por um comando close so
fechados pelo sistema operacional quando o programa encerra o processamento, a menos que
uma condio de erro tenha terminado o programa.
O comando close definido como segue:
close (lista de especificaes)
Lista de especificaes:
unit
err
iostat
status
Se UNIT= for omitido, a unidade (unitspec deve ser o primeiro parmetro. Todos os outros
parmetros podem aparecer em qualquer ordem.
Unitspec (entrada, inteiro)

especifica uma unidade externa. Nenhum erro ocorre se a

unidade no estiver conectada.


Errlabel (inteiro, entrada) Linha de um comando executvel, na mesma unidade de
programa. Se for especificado e um erro de entrada e sada ocorrer, o controle do
programa passar para a linha definida em errlabel.
Iostat (sada, inteiro) Zero se nenhum erro ocorrer, caso contrrio o nmero da mensagem
de erro em tempo de execuo.
Observaes:
No existe uma obrigatoriedade em fechar arquivos. No momento em que ocorre o
encerramento da execuo do programa, todos os arquivos so automaticamente fechados. O
Entrada e sada

10-104

Fortran 90 Curso bsico


comando close no precisa aparecer na mesma unidade de programa onde o arquivo foi
aberto.

10.6 Inquire
O comando inquire retorna os valores dos vrios atributos associados com uma
unidade ou arquivo. Ele no pode retornar as propriedades de arquivos no abertos e no
pode distinguir entre os atributos que voc especificar e os atributos que so padro.
Todas as variveis listadas nas opes de sintaxe podem ser nomes de variveis,
elementos de matrizes ou componentes de tipos derivados.
No possivel omitir o string UNIT= em uma operao de inquire. Caso isto ocorra, a
unidade dever ser o primeiro parmetro. Os outros parmetros podem aparecer em qualquer
ordem.
O comando inquire pode ser utilizado a qualquer momento. Ele retorna os valores
associados ao arquivo no momento da sua chamada.
O tamanho de um registro no formatado que ser produzido por uma sada particular
pode ser determinado pelo comando INQUIRE.
Sintaxe
INQUIRE

{[UNIT=

unit

FILE=file

IOLENGTH=iolength}

,ACCESS=access ] [ , ACTION=action] [ , BINARY=binary] [ , BLANK=blank] [ ,


BLOCKSIZE=blocksize] [ , CARRIAGECONTROL=carriagecontrol] [ , DELIM=delim
]

[ , DIRECT=direct]

[ , ERR=err ] [ , EXIST=exist]

[ , FORM=form ] [,

FORMATTED=formatted [ , IOFOCUS=iofocus] [ , IOSTAT=iostat ] [ , MODE=mode ] [


, NAME=name ] [ , NAMED=named ] [ , NEXTREC=nextrec ] [ , NUMBER=number ] [ ,
OPENED=opened ] [ , PAD=pad ] [ , POSITION=position ] [ , READ=read ] [ ,
READWRITE=readwrite ] [ , RECL=recl ] [ , SEQUENTIAL=seq ] [ , SHARE=share] [ ,
UNFORMATTED=unformatted ] [ , WRITE=write ] )
Opes
UNIT (entrada, inteiro)

Expresso inteira representando a unidade, ou um

asterisco (*). Se for especificado * e for includo NUMBER=, um erro em tempo de execuo
ocorre.
FILE (entrada - character*(*))

Nome do arquivo que est sendo verificado.

Entrada e sada

10-105

Fortran 90 Curso bsico


ACCESS (sada - character*(*))

Retorna SEQUENTIAL se a unidade especificada

ou arquivo para acesso sequencial, ou DIRECT para acesso direto. Retorna UNDEFINED
se no existe conexo.
ACTION (sada - character*(*))

Retorna READ se o arquivo for somente de

leitura, WRITE se o arquivo de sada e READWRITE se for de leitura e escrita. Retorna


UNDEFINED se no existe conexo.
BINARY (sada character*(*))

Retorna YES se o arquivo binrio, NO se o

arquivo no binrio ou UNKNOWN se no estiver conectado.


BLOCKSIZE (sada, inteiro) Retorna o tamanho do buffer. Retorna 0 se a unidade ou
arquivo no estiverem conectados.
DIRECT (sada character*(*))

Retorna YES se o arquivo especificado ou

unidade foi aberta para acesso direto, ou NO se no. Caso contrrio, retorna UNKNOWN.
ERR

Label de um comando executvel na mesma unidade de programa. Se err

especificado, um erro de E/S transfere o controle do programa para ERR. Se omitido, o efeito
de um erro de E/S determinada pela presena ou ausncia de IOSTAT.
EXIST (sada) - logical) Retorna .TRUE. se as unidades especificadas ou arquivos
existem. Caso contrrio, retorna .FALSE.
FORM (sada, character*(*)) Retorna FORMATTED se a unidade especificada ou
arquivo conectado para E/S formatado, UNFORMATTED para E/S no formatado, ou
BINARY para E/S binrio. Retorna UNDEFINED se no existe conexo.
FORMATTED (sada, character*(*))

Retorna YES se o arquivo especificado ou

unidade pode ser conectada para E/S formatado, ou NO se no pode. Retorna UNKNOWN se
o processador no pode determinar se a formatao permitida.
IOSTAT (sada)

Padro inteiro (INTEGER(4) a menos que seja modificado pelo

usurio). Retorna 0 se no h erro, nem condio de final de arquivo, e condio de final de


registro. Retorna o nmero da mensagem de erro se um erro ocorre.
Retorna um nmero negativo se o final do arquivo ou condio de final de registro
ocorre.
MODE (sada, character*(*)) Retorna o status do arquivo ou unidade, que pode ser:
READ, WRITE ou READWRITE. Se no existe unidade conectada, o modo UNDEFINED.
NAME (sada, character*(*)) Retorna o nome do arquivo conectado a unidade. Se no
houver arquivo conectado a unidade, ou o arquivo conectado a unidade no tem nome,
NAME se torna indefinido.
Entrada e sada

10-106

Fortran 90 Curso bsico


NAMED (sada)

Retorna .TRUE. se o arquivo tem um nome, caso contrrio

retorna .FALSE.
NEXTREC (sada)

Padro inteiro (integer(4)). Retorna o nmero do prximo

registro em um arquivo de acesso direto.


NUMBER (sada, Inteiro)

Retorna o nmero da unidade conectada ao arquivo.

Retorna -1 se no h unidade conectada. Se incluir o NUMBER= com UNIT=, um erro em


tempo de execuo verificado.
OPENED (sada) Padro logical (LOGICAL(4). Retorna .TRUE. se o arquivo
especificado est conectado, caso contrrio, retorna .FALSE.
PAD (sada) character*(*) - Retorna YES se o arquivo foi aberto com a opo
PAD=YES, caso contrrio, retorna NO.
POSITION (sada) character*(*). Retorna REWIND se o arquivo est posicionado no
ponto inicial. APPEND se est posicionado antes do registro de final de arquivo, e ASIS se
est conectado sem trocar a posio. Retorna UNDEFINED se no existe conecxo ou se o
arquivo est conectado para acesso direto.
READ (sada) character*(*). Retorna YES se o arquivo foi aberto para leitura. Retorna
NO se o arquivo no puder ser lido. Retorna UNKNOWN se o processador no consegue
determinar se a leitura permitida.
READWRITE (sada) character*(*). Retorna YES se o arquivo especificado ou
unidade for aberta para leitura e escrita. Retorna NO se o arquivo no pode ser lido ou escrito.
Retorna UNKNOWN se o processador no puder determinar se a leitura e escrita so
permitidas.
RECL (sada) padro inteiro (INTEGER(4)). Tamanho do registro, em bytes, para
arquivos de acesso direto, ou o valor do tamanho mximo de registro para acesso sequencial a
arquivo.
Opes
SEQ (sada) character*(*) - Retorna YES se o arquivo especificado ou unidade foi
aberta para acesso sequencial, NO se no, ou UNKNOWN se o processador est
impossibilitado de determinar o tipo de acesso a arquivo.
SHARE (sada) character*(*) - Retorna o status de compatilhamento do arquivo
especificado ou unidade. Os valores especificados so os mesmos que os do comando OPEN:
COMPAT, DENYRW, DENYWR, DENYRD, e DENYNONE.
Opes
Entrada e sada

10-107

Fortran 90 Curso bsico


UNFORMATTED (sada) character*(*). Retorna YES se o arquivo especificado ou
unidade pode ser conectado para E/S no formatado, ou NO se no podem. Retorna
UNKNOWN se o processador no pode determinar se a formatao permitida.
WRITE (sada) character*(*). Retorna YES se o arquivo foi aberto com o acesso
WRITE. Retorna NO se o arquivo no pode ser aberto para escrita.
Exemplo
1. program testa_inq
2. implicit none
3. character*12
:: arquivo
4. logical
:: existe
5. read (A),arquivo
6. inquire(FILE=arquivo,EXIST=existe)
7. if (.not.existe) then
8. write (*,*) No encontrei o arquivo
9. endif
10. end program testa_inq

10.7 backspace
Posiciona um arquivo no incio do prximo registro.
Sintaxe:
BACKSPACE {unitspec ([UNIT=] unitspec [ , ERR=errlabel][ , IOSTAT=iostat] )}

10.8 Observaes
Se UNIT= omitida, unitspec deve ser o primeiro parmetro. Por outro lado, os outros
parmetros podem aparecer em qualquer ordem.
Especificaes:
UNIT= unitspec - (entrada - inteiro). Especifica uma unidade externa. Se unitspec no
estiver aberta ou no existir, um erro em tempo de execuo ocorre.
ERR= errlabel - Label de um comando executvel na mesma unidade de programa. Se
for especificado, um erro de E/S transfere o controle para o comando especificado por
errlabel. Se omitido, o efeito de um erro de E/S determinada pela presena ou ausncia do
iostat.
IOSTAT= iostat -(Sada - inteiro). Retorna zero se no ocorrerem erros, ou ento o
nmero da mensagem de erro se um erro ocorrer.
endfile
Escreve um registro de final de arquivo na unidade especificada.
Entrada e sada

10-108

Fortran 90 Curso bsico


sintaxe
ENDFILE {unitspec | ([UNIT=] unitspec [, ERR=errlabel][, IOSTAT=iocheck] )}
Se for omitido UNIT=, unitspec pode ser o primeiro parmetro. Caso contrrio, os
parmetros podem aparecer em qualquer ordem.

10.9 rewind
Reposiciona um arquivo no seu primeiro registro.
Sintaxe
REWIND { unit | ([UNIT=] unit [ , ERR=err][ , IOSTAT=iostat] )}
Se a palavra UNIT= for omitida, ento o primeiro parmetro do comando dever ser a
unidade. Todos os outros parmetros podem ser includos em qualquer ordem.
Unit (entrada, inteiro) Especifica uma unidade externa. Se o arquivo associado a
unidade externa no estiver aberto, o comando no ter efeito.
Err (entrada, inteiro) Nmero que indica a linha de um comando executvel. Se for
especificado, o programa automaticamente se desviar para esta linha caso ocorra um erro de
entrada/sada.
Iostat (sada, inteiro) Zero se o comando for executado com sucesso. Caso ocorra
algum problema na execuo, iostat conter o cdigo do erro associado ao problema.
Exemplo:
1. program testa_rew
2. implicit none
3. real
:: a
4. a=10
5. open(unit=7,file='teste.dat',status='unknown')
6. write(7,'(F10.5)') a
7. rewind(7)
8. read(7,'(F10.5)') a
9. write (*,*) 'valor de a: ',a
10. close(7)
11. end program testa_rew

Entrada e sada

10-109

Fortran 90 Curso bsico

11. Formatos de entrada e sada


Geralmente, os dados armazenados na memria do computador tem um formato binrio.
Por outro lado, registros de dados formatados em um arquivo consistem de caracteres. Desta
maneira, quando os dados so lidos de um registro formatado, devem ser transformados de
caracteres para a sua representao interna. Quando dados so escritos em um registro
formatado, devem ser convertidos em um string de caracteres.
Uma especificao de formato prove as informaes necessrias para determinar como
estas convenes sero executadas. Os formatos de especificao so basicamente uma lista de
descritores de edio, que tem geralmente tres tipos:
descritores de edio de dados
descritores de controle de edio
e descritores de edio de string
H um descritor de dados para cada valor de dados de entrada e sada. Os descritores de
controle de edio especificam o espaamento e a posio dentro de um registro, novos registros,
interpretao de brancos, e mais supresso de sinal. Descritores de edio de string transferem
strings caracter representados em especificaes de formato para registros de sada.
A referncia de formato que indica onde encontrar o formato pode ser uma linha com um
label que identifica o comando FORMAT, ou pode ser uma expresso caracter dando o formato
diretamente. As duas referncias so chamadas de formatao explcita. Neste captulo sero
apresentados apenas os descritores de edio de dados:
A tabela abaixo apresenta um resumo dos descritores de edio de dados
Descrito

Descrio

r
A

Converte dados do tipo caracter.

Converte dados do tipo inteiro de/para uma base binria.

Converte dados do tipo real; tem o mesmo formato que o descritor E.


Converte dados do tipo real com um expoente.

E
EN
ES

12. Converte dados do tipo real para notao de engenharia.


Converte dados do tipo real para notao cientfica.

Converte dados do tipo real sem expoente na sada.

Converte dados de todos os tipos intrnsecos.

Formatos de entrada e sada

11-110

Fortran 90 Curso bsico


I

Converte dados do tipo inteiro.

Converte dados do tipo logical

Converte dados do tipo inteiro para/de uma base octal.

Converte dados do tipo inteiro para/de uma base hexadecimal.

A tabela abaixo apresenta os descritores de edio e sua aplicabilidade com tipos de


dados:
NA indica uso ilegal e no permitido.
I,O indica uso legal para entrada e sada.
O indica uso legal para sada.
Tipos de
dados
Character
A

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

,O

COmplexo

Dupla
preciso
Inteiro

Lgico

11.1 Formatao explcita


A formatao explcita pode ser utilizada em uma das seguintes formas:
contida em um comando format, como segue:
write (6,100) light, and, heave
100 format(F10.2, I5, E16.8)
Dado como um valor em uma expresso caracter, como segue:
write (6, (F10.2, I5, E16.8)) light, and, heavy

Formatos de entrada e sada

11-111

Fortran 90 Curso bsico

11.1.1 Comando format


O comando FORMAT definido como segue:
format especificao de formato.
Como o exemplo abaixo mostra, o comando FORMAT deve ter um label. O label
usado nos comandos de I/O para referenciar um comando FORMAT especfico.
label

format([ lista de tens de formato])

Cada comando de entrada/sada pode referenciar um nico comando FORMAT, mas um


comando FORMAT pode ser usado em diversos comandos diferentes de E/S.

11.2 Edio numrica


H 7 descritores de edio que cobrem a edio numrica: I, F, E, EN, ES, D e G. As
seguintes regras se aplicam a todos eles:
Na entrada:
Espaos em branco no so significativos.
O sinal de mais (+) pode ser omitido na entrada de dados.
Um campo branco considerado zero, a menos que o descritor de edio BN ou a
especificao blank= estejam presentes.
Em campos numricos que tenham um ponto decimal e correspondam ao descritor F, E, EN,
ES, D ou G, o campo decimal sobrescreve o lugar do ponto decimal especificado pela
especificao do descritor de edio.
Em dados de entrada permitido ter mais digitos significativos que podem ser usados para
representar um nmero.
As minusculas e e d so equivalentes as maiusculas E e D.
Na sada:
Um valor positivo ou zero pode ter sinal de mais (+) dependendo do sinal do descritor de
edio usado.
Valores negativos tem um sinal negativo a menot que o valor impresso deveria ser zero. Zeros
negativos nunca so produzidos. Por exemplo: Suponha que a varivel SMALL tenha valor 0.000314. Na sada abaixo, os caracteres transferidos pelo comando no ter um sinal
negativo:
Formatos de entrada e sada

11-112

Fortran 90 Curso bsico


write (6,10) SMALL
10 format(F5.2)
O campo ser como segue porque um zero negativo no pode ser impresso:
b0.00
O nmero sempre posicionado direita no campo. Brancos podem ser inseridos.
Se o nmero ou o expoente forem muito grandes para a largura do campo especificado no
descritor de edio, o campo de entrada preenchido com asteriscos.

11.2.1 Edio de inteiros


O padro fortran 90 condiciona a sada correspondendo a um descritor de edio inteiro,
exceto para o descritor de edio G. Os descritores de edio inteiros so:
Iw [.m]
Bw [.m]
Ow [.m]
Zw [.m]
Gw.d [Ee]
Onde w, m, d e e tem o seguinte significado:
Descritor

Especificao

Largura do campo

O nmero mnimo de digitos no campo

O nmero de dgitos fracionais no campo

O nmero de dgitos no expoente

Para ambos entrada e sada:


O valor de m no pode exceder o valor de w.
Para uma lista de E/S inteira, o item descritor Gw.d[Ee] segue as mesmas regras como o Iw
descritor de edio para um dado valor de w.
Na sada:
m no tem efeito no campo de entrada.
Para um descritor de edio, o caractere string no arquivo deve ser opcionalmente assinalado
como um inteiro constante, mas no pode ter um underscore (_).
Formatos de entrada e sada

11-113

Fortran 90 Curso bsico


Para o Iw.0 descritor de edio, se os tens da lista de sada tem o valor 0, o campo consiste de
brancos.
Se m no est presente e o valor da lista de sada um no zero, o primeiro dgito deve ser um
no zero; por outro lado, o campo consiste de somente um digito 0 sem o caracter de sinal.
Zeros negativos nunca so produzidos.
Para os campos B, O e Z, as regras de formao do campo de sada para os valores de w e m
so os mesmos que para o descritor de edio exceto que o inteiro com sinal deve consistir de
dgitos de base binria, octal, ou hexadecimal, respectivamente. Um valor negativo indicado
no codigo dos dgitos escritos.

11.2.2 Edio real


Os descritores de edio F, E, EN, ES e D especificam o formato para a sada de tens
reais e complexos. O descritor G pode ser usado tambm para itens reais e complexos. Dois
descritores de edio so necessrios para cada tem de dado complexo.
As formas dos editores de descrio para valores reais so:
Fw.d
Ew.d [Ee]
Enw.d [Ee]
Esw.d [Ee]
Dw.d
Gw.d [Ee]
Dw.d Ee

11.2.2.1 Edio F
Fw.d converte para ou de um string ocupando w posies:
Para a entrada e sada:
d no pode exceder w.
O valor do campo de entrada ou o valor transferido para a sada pode ter sinal.
Exemplo:
read (5,100) x, y
Formatos de entrada e sada

11-114

Fortran 90 Curso bsico


100 format (F10.2, F10.3)
assume o seguinte campo de entrada:
bbbb6.42181234567890
Os valores de x e y so respectivamente: 6.4218 e 1234567.89

11.2.2.2 Edio E e D
Os descritores de edio Ew.d[Ee], Dw.dEe, e Dw.d convertem de e para um string
ocupando w posies. Para os descritores de edio Ew.d[Ee], Dw.dEe, e Dw.d, o campo
representando o ponto flutuante contem w caracteres, incluindo um expoente.
Para a entrada e sada:
w a largura do campo, d o nmero de lugares depois do decimal, e e o tamanho do
expoente.
d e e no podem exceder w.
Exemplo:
write (6,105) y, z
105 format(E15.3, 4PD15.3)
Se os valores de Y e Z so -21.2 e 26542.1232 respectivamente, o registro de sada
produzido como segue:
bbbbb-0.212E+02bbb2654.212E+01

11.2.2.3 Descritor de engenharia En


O descritor EN converte converte para ou de um string usando notao de engenharia
para um valor ocupando w posies.
Na entrada:
A forma ENw.d[Ee] o mesmo que a edio Fw.d.
Na sada:
O nmero na sada e na forma de notao em engenharia, onde o expoente divisivel por 3 e
o valor absoluto do significante est no intervalo [1, 1000). Possui a mesma forma que o
descritor de edio E, exceto por estes expoentes e diferenas significativas.
Exemplo:
write(6,110) b
110 format (EN13.3)
Formatos de entrada e sada

11-115

Fortran 90 Curso bsico


Se o valor de B 0.212, o registro de sada produzido como segue:
bb212.000E-03

11.2.2.4 Descritor cientfico ES


O editor de descrio cientfico ES converde para ou de um string usando notao
cientfica para um valor ocupando w posies.
Na entrada:
A forma ESw.d[Ee] o mesmo que para a edio Fw.d.
Na sada:
O nmero na sada na forma de notao cientfica, onde o valor absoluto do significante est
no intervalo [1, 10). Tem a mesma forma do descritor de edio E, exceto pela diferena do
significante.
Exemplo:
write(6,110) b
110 format(ES12.3)
Se o valor de b 0.12345678, o registro de sada como segue:
bbb1.235E-01

11.2.2.5 Edio de complexos


A edio de compexos segue as regras de edio numrica. A edio de complexos
requer dois descritores de edio reais distintos. O primeiro para a parte real e o segundo para a
parte imaginria. Diferentes descritores de edio podem ser usados pelas duas partes. O
controle e os caracteres string dos descritores podem ser inseridos entre os descritores de edio
para a parte real e imaginaria.
Exemplo:
complex cm(2)
read(5,(4E7.2)) (cm(i), i=1,2)
O registro de entrada como segue:
bb55511bbb2146bbbb100bbbb621
Os valores atrtibudos a cm(1) e cm(2) so: 555.11 + 21.46i e 1.0 + 6.21i,
respectivamente.

Formatos de entrada e sada

11-116

Fortran 90 Curso bsico

11.2.2.6 Edio de dados generalizados


Gw.d[Ee] converte de ou para um string usando edio generalizada. A forma para a
edio determinada pela magnitude do valor do nmero.
Entrada:
O Gw.d[Ee] descritor o mesmo que o Fw.d.
Sada:
O formato de sada vai variar conforme a magnitude do nmero.
Exemplo 1:
print (g10.1), 8.76E1
Sada:
bbb0.9E+02
A magnitude de N est fora da faixa de um descritor F, e produz o formato E10.1
Exemplo 2:
print (g10.3),8.76E1
O comando anterior produz a seguinte sada:
bb87.6bbb

11.2.2.7 Edio lgica


Os descritores de edio logica convertem para ou de uma representao string um valor
lgico que verdadeiro ou falso. O descritores de edio usados para edio so:
Lw
Gw.[Ee]
Onde w e e so descritos como segue:
Descritor

Especificao

Largura do campo

O nmero de dgitos no expoente

Para a entrada e sada:


As regras gerais da edio Gw.[Ee] segue as regras de Lw.
Na entrada:

Formatos de entrada e sada

11-117

Fortran 90 Curso bsico


O campo de entrada para um valor logico consiste de um numero qualquer de brancos,
seguido por um ponto opcional, seguido por um T ou F, para um valor verdadeiro ou falso
respectivamente, seguido por qualquer caracter representvel..
As letras T ou F podem ser minusculas. So tratadas da mesma forma que as letras
maiusculas.
Por exemplo, se for usado o comando read abaixo:
read(5, (2L8)) L1, L2
para ler esta entrada:
.true.bb.false.b
L1 e L2 tem todos os valores verdadeiro e falso, respectivamente. O resultado deveria ser
o mesmo se o arquivo de entrada fosse:
TUESDAYbFRIDAYb
Na sada:
O campo de sada consiste de w-1 brancos, seguidos por T ou F, para os valores de verdadeiro
e falso, respectivamente:
Exemplo:
write(6, (2L7)) L1, L2
Se L1 e L2 so verdadeiro e falso, respectivamente, o registro de sada ser como segue:
bbbbbbTbbbbbbF.

11.2.3 Edio de strings


A edio de caracteres string convertem para ou de um string de caracteres. Os editores
de descrio para edio de caracteres so:
A [w]
Gw.d[Ee]
w, d e e tem o seguinte significado:
Tabela 11-1
Descritor

Especificao

Largura do campo

O nmero de dgitos fracionais no campo

O nmero de dgitos no expoente


Formatos de entrada e sada

11-118

Fortran 90 Curso bsico


Para a entrada e sada:
w a largura do campo medida em caracteres.
Um Gw.d[Ee] descritor o mesmo que um Aw descritor de edio para dados caracter
Se w omitido do formato A, o tamanho dos dados caracter que sero transferidos ser o
tamanho do campo caracter.
Exemplos:
character (len=14), parameter :: slogan=save the river
write(*,(A)) slogan
Sada:
save the river

Formatos de entrada e sada

11-119

Fortran 90 Curso bsico

12. O conceito de kind


Em fortran 90, cada um dos cinco tipos intrnsecos real, integer, complex, character e
logical, tem um nmero inteiro no negativo associado chamado de parmetro de tipo ou kind.
Um processador deve suportar pelo menos dois tipos de real e complex, e um para integer,
character e logical.
O valor de KIND, o responsvel pela preciso que se quer de uma varivel de um tipo.

12.1 Funes intrnsecas associadas aos tipos

12.1.1 Digits
Retorna o nmero de dgitos significativos no modelo de representao de nmeros do
parmetro que est sendo passado como argumento. O nmero retornado o nmero de dgitos
significativos (base 2).
Formato: digits ([x=]x)
Retorno: O tipo de resultado um inteiro escalar. O resultado ter o valor de q se x for
do tipo inteiro e ter o valor p se x for do tipo real.
Exemplos:
integer (kind=4) i4
...
write (*,*) Digits i4: , digits(i4)
...
digits i4: 31

12.1.2 Epsilon
Descrio: A funo epsilon retorna um nmero positivo que quase zero se comparado
com a unidade no modelo de representao de nmero do mesmo tipo que o parametro que est
sendo passado.
Formato: epsilon ([x=]x)
Retorno: O resultado um escalar do mesmo tipo do parametro x. O resultado tem o
valor b(1-p) onde b e p so definidos no modelo para numeros reais representando numeros do
mesmo tipo que o parametro x.
Exemplos:

Diretivas de compilao do CF90

12-120

Fortran 90 Curso bsico


real (kind=4) r4
...
write (*,*) Epsilon r4= , epsilon(r4)
...
epsilon r4=1.192092896e-7

12.1.3 Huge
Retorna o maior numero no modelo inteiro ou real.
Formato: huge ([x=]x)
Retorno: O resultado um valor escalar do mesmo tipo que o tipo do parametro que
estiver sendo passado. O resultado tem o valor r(q-1) se x for do tipo inteiro e o valor (1-b-p)
multiplicado pelo be sub max se x do tipo real, onde r, q, b, p e e max so definidos no modelo de
nmeros reais, que representa numeros do mesmo tipo do parametro x.

12.1.4 Maxexponent
Retorna o expoente mximo em um modelo numrico.
Formato: maxexponent ([x=]x)
Retorno: O resultado padro um inteiro escalar. O resultado tem o valor emax, como
definido no modelo, o qual representa nmeros de mesmo tipo do parametro x.

12.1.5 Minexponent
Retorna o expoente mnimo de um nmero real em um modelo numrico.
Formato: mintexponent ([x=]x)

12.1.6 Precision
Retorna a preciso decimal de um nmero em um modelo de nmeros reais. O resultado
um inteiro escalar. O resultado tem o valor (int(p-1)*log10(b))+k onde b e p so como definidos
no modelo e onde k 1 se b for uma potncia integral de 10 e 0 se no for.
Formato: precision ([x=]x)

12.1.7 Radix
Retorna o nmero da base de modelos de nmeros reais ou inteiros.
Formato: radix ([x=]x)

Diretivas de compilao do CF90

12-121

Fortran 90 Curso bsico


Retorno: O resultado um inteiro escalar. O resultado tem valor r se x do tipo inteiro e
o valor b se x do tipo real, onde r e b so como definidos no modelo.
Exemplo: radix(x) tem valor 2 para valores de x reais.

12.1.8 Range
Retorna o valor do expoente decimal de um nmero de acordo com o modelo inteiro ou
real.
Formato: range([x=]x)
Retorno: O reslutado um inteiro escalar. Para um argumento inteiro, o resultado tem o
valor int(log10(huge)), onde huge o maior inteiro positivo no modelo de representao de
inteiros com o mesmo tipo do parametro x. Para um parmetro complexo, o resultado tem o
valor int(min(log10(huge), -log10(tiny))), onde huge e tiny so os maiores nmeros positivos e
negativos no modelo de representao de nmeros reais com o mesmo tipo do parametro x.

12.1.9 tiny(x)
A funo tiny retorna o menor valor positivo que pode ser representado pelo tipo de dado
do argumento.
Sintaxe:
Formato: result = tiny(x)
Retorno: O valor de retorno ter o mesmo tipo e kind do menor nmero positvo para
aquele tipo.

Diretivas de compilao do CF90

12-122

Fortran 90 Curso bsico

13. Tipos derivados


Uma das novas caractersticas do Fortran 90, a possibilidade de criar tipos de dados, a
partir dos cinco tipos de dados intrnsecos. Esta possibilidade permite ao usurio ter acesso a
objetos mais sofisticados que os tipos existentes. Imagine que haja uma necessidade de se
armazenar os dados de uma pessoa. As informaes que devem ser armazenadas so: Nome,
identificao e idade. Neste caso, necessitamos criar um tipo, que englobar 3 tipos intrnsecos.
Sua declarao no Fortran 90 teria a seguinte forma:
type pessoa
character(len=18)

:: nome

integer

:: identificao

real

:: idade

end type pessoa


! Aqui, eu declaro a varivel associada ao tipo.
type(person)

:: funcionrio

A varivel escalar funcionrio ento uma composio do objeto do tipo pessoa


contendo 3 componentes separados, um correspondendo ao nome, outro a identificao e um
terceiro correspondendo a idade. Como ser visto a seguir, a varivel funcionrio poder ser
referenciada como um objeto nico, ou ento, podero ser feitas referncias aos 3 tipos que
compe o objeto. Para se referenciar apenas um dos itens do objeto, deve-se usar o seletor de
componente que o %. A referncia ao nome do funcionrio fica:
funcionrio%nome
Caso queira-se armazenar informaes ao objeto, deve-se proceder conforme o exemplo
abaixo:
funcionario=pessoa(Joao,1593, 23)
A seqncia em que as variveis devem estar dispostas, deve ser a mesma da declarao
das variveis dentro do tipo.
Programa exemplo:

Diretivas de compilao do CF90

13-123

Fortran 90 Curso bsico


1. program cubos
2. implicit none
3. type tipo_cubo
4.
real
:: lado_1
5.
real
:: lado_2
6.
real
:: lado_3
7. end type tipo_cubo
8. type(tipo_cubo)
:: a
9. type(tipo_cubo)
:: b
10. real
:: vol_a
11. real
:: area_b
12. a=tipo_cubo(10.5,15.5,16)
13. b=tipo_cubo(13,12.5,17)
14. vol_a=a%lado_1*a%lado_2*a%lado_3
15. area_b=(b%lado_1* b%lado_2+ b%lado_1* b%lado_3+ b%lado_2* b%lado_3)**0.5
16. write (*,*) Volume do cubo a: ,vol_a
17. write (*,*) 'Area do cubo b: ',area_b
18. end program cubos

Diretivas de compilao do CF90

13-124

Vous aimerez peut-être aussi