Académique Documents
Professionnel Documents
Culture Documents
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
construo
dever
aparecer
em
todas
as
rotinas
do
programa.
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.
Introduo
1-2
Introduo
1-3
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.
Introduo
1-4
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
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
Introduo
1-6
Introduo
1-7
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.
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
2-8
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.
/=
Significado
Soma
subtrao
multiplicao
diviso
**
potncia
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
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
:: varivel
:: varivel
2-10
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
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
Tpos de dados
2-12
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
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
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
:: 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-15
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
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
3-17
program testa_float
implicit none
float
:: convertido
integer
:: inicial=10
convertido=float(inicial)
write (*,*) O nmero convertido : ,convertido
end program testa_float
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
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
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(2)
ifix (a)
Real(4)
integer(4)
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
Argumento
Retorno
Idint (a)
real (8)
integer (4)
int (a)
integer (4)
int1 (a)
integer (1)
int2 (a)
integer (2)
int4 (a)
Exemplo:
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
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])
3-22
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:
3-23
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
z1
z1=cmplx(3)
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).
3-25
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.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
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
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:
3-28
3-29
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
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
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
4-33
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
4-34
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.
4-35
incio
fim
incremento
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.
4-36
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-37
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:
4-38
4-39
4-40
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
:: arg1
tipo,intent(in/out/inout)
:: arg2
...
tipo,intent(in/out/inout)
:: argN
Subprogramas
5-42
:: a
integer
:: i
Subprogramas
5-43
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
Subprogramas
5-44
:: 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
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
Subprogramas
5-47
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
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
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
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-51
Subprogramas
5-52
5-53
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.
Subprogramas
5-54
5-55
5-56
Subprogramas
5-57
Subprogramas
5-58
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 .
Matrizes
6-59
:: a
:: 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
Matrizes
6-60
a=
|1
3|
|2
6|
|3
9|
A matriz b, ser:
b=
|2
3|
Matrizes
6-61
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.
Matrizes
6-62
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
:: matriz
Limite_inferior
Limite_superior
- Argumento de sada, inteiro. Retorna 0 caso a matriz tenha sido alocada com
6-63
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-64
program alloca
implicit none
real,dimension(:),allocatable :: a
integer
:: n=10
allocate(a(n))
a(:)=1
deallocate(a)
end program alloca
Matrizes
6-65
Matrizes
6-66
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
[ 0 3 5]
[ 7 4 8]
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
[ 0 3 5]
[ 7 4 8]
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
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]
7-70
:: 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.
7-71
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 ]
7-72
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]
7.9 maxloc
Retorna a posio do valor mximo de um matriz.
Formato: maxloc ([ matriz=] matriz [, mask=] mask])
7-73
:: 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
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
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.
7-75
Deve ser um escalar inteiro na faixa 1 <= dim <=n, onde n a dimenso da
[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
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]
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
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
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
7-78
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]
7.20 Lbound
Retorna todos os limtes mnimos de um matriz.
Funes intrnsecas associadas matrizes
7-79
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
7-80
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
7-81
7-82
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.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
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
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
pos
Deve ser do tipo inteiro. Deve ser no negativo e pos+len deve ser menor ou igual
a bit_size(i).
len
8.1.4 ibset
seta um bit.
Formato: ibset([I=]i, [POS=]pos)
Descrio: A funo intrnseca ibset seta um bit para 1.
i
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
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
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.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
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
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.
:: 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:
9-87
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
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.
9-88
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
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
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 atributos:
private
public
exemplos:
real, intrinsic
:: sin, cos;
9-91
Entrada e sada
10-92
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:
0000010
10
11
10-93
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-94
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.
Entrada e sada
10-95
Unidade
Disponibilidade
1-4
7-99
100
101
102
103-104
105-299
10-96
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
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
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-99
10-100
Entrada e sada
10-101
Entrada e sada
10-102
Espec
Valores possveis
Valor default
Access
direct, sequential
sequential
Action
depende do arquivo
Blank
null, zero
null
Delim
none
Err
label
sem default
File
expresso caracter
Form
formatted, unformatted
Iostat
sem padro
Recl
Depende do arquivo
Status
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
10-104
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}
[ , DIRECT=direct]
[ , ERR=err ] [ , EXIST=exist]
[ , FORM=form ] [,
asterisco (*). Se for especificado * e for includo NUMBER=, um erro em tempo de execuo
ocorre.
FILE (entrada - character*(*))
Entrada e sada
10-105
ou arquivo para acesso sequencial, ou DIRECT para acesso direto. Retorna UNDEFINED
se no existe conexo.
ACTION (sada - character*(*))
unidade foi aberta para acesso direto, ou NO se no. Caso contrrio, retorna UNKNOWN.
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*(*))
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)
10-106
retorna .FALSE.
NEXTREC (sada)
10-107
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
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
Descrio
r
A
E
EN
ES
11-110
,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-111
11-112
Especificao
Largura do campo
11-113
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
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-115
11-116
Especificao
Largura do campo
11-117
Especificao
Largura do campo
11-118
11-119
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:
12-120
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)
12-121
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.
12-122
:: nome
integer
:: identificao
real
:: idade
:: funcionrio
13-123
13-124