Sei sulla pagina 1di 61

Guia bsico de programao em linguagem

Fortran 77 e 90

Programao em
Linguagem FORTRA

!elder Pereira "risto
#elo !ori$onte
%un&o'(00)

NDICE
"AP*T+LO ,- "O"./TO0 1A L/G+AG.2
1. NTRODUO
2. FORMATAO
3. CONCETOS BSCOS
4. DECLARAO DE VARVES
Tipos de Variveis
Inteiras (INTEGER)
Reais (REAL)
Complexas (COMPLE)
Al!an"m#ri$as (C%ARACTER)
L&'i$as (LOGICAL)
5. OPERADORES
Atri("i)*o
Operadores Literais
Operadores Aritm#ti$os
Operadores Rela$ionais
Operadores L&'i$os
Prioridade
6. FUNES NTRNSECAS
+"n),es Tri'onom#tri$as
+"n),es -iversas
7. FUNES E SUBROTNAS
+"n),es
."(rotinas
8. LETURA E MPRESSO
9. FORMATOS (LETURA OU MPRESSO)
O"tros Re$"rsos Para +ormatos
10. ARQUVOS
O"tros Re$"rsos
"AP*T+LO (- .0TR+T+RA0 1. PROGRA2A34O
1. ESTRUTURA SEQENCAL
2. COMANDO 'GO TO' OU 'GOTO'
3. ESTRUTURA CONDCONAL
Estr"t"ra Condi$ional .imples
Estr"t"ra Condi$ional Composta
Estr"t"ra Condi$ional Composta .impli!i$ada
4. ESTRUTURAS DE REPETO
Estr"t"ras de Repeti)*o .imples
-O /%ILE (+01)
-O Impl2$ito (/IN)
"AP*T+LO )- R."+R0O0 1. PROGRA2A34O
1. DESLOCAMENTO
GOTO Impl2$ito
I+ Com -eslo$amento
2. DECLARAES E ATRBUES AVANADAS
-IMEN.ION
PARAMETER
T3PE (+01)
-ATA
3. DESGNAO DE MEMRA
COMMON
4LOC5 -ATA
4. MODULARZAO
INCL6-E
A.5O A- F+36.0 /TR*0."A0
1. FUNES TRGONOMTRCAS
2. FUNES GENRCAS
3. EXPONENCAS
4. LOGARTMOS
5. MXMOS
6. MNMOS
7. RESTOS
8. RAZ QUADRADA DE X
9. TRUNCAMENTO DE X
10. ARREDONDAMENTO DE X
11. DFERENA POSTVA ENTRE X E Y
12. TPO DE DADO
13. TRANSFORMAO DO TPO DE X
14. COMPLEXOS
15. CARACTERES
16. VALORES ABSOLUTOS DE X
A.5O #- OP36.0 1. AR7+/8O09 L./T+RA . .0"R/TA
1. ABERTURA DE ARQUVOS (OPEN)
2. FECHAMENTO DE ARQUVOS (CLOSE)
3. ESCRTA (WRTE)
4. LETURA (READ)
5. RECUO TOTAL (REWND)
6. RECUO DE UM CAMPO (BACKSPACE)
A.5O "- TA#.LA 1. 8ALOR.0 A0"//
"ap:tulo ,- "onceitos da Linguagem
,; /ntroduo
Em FORTRAN existem basicamente duas formas de se escrever um programa: com
formulrio fixo ('!ixed !orm7) ou com formulrio livre ('!ree !orm'). Sendo este segundo
disponvel apenas para os compiladores mais novos que suportam a programao em
FORTRAN 90. Outro ponto importante que existem comandos vlidos somente para
estes novos compiladores (por exemplo Microsoft Developer Studio) que aceitam
programas em FORTRAN 90. Algumas verses dos compliladores baseados em
FORTRAN 77 aceitam funes ou comandos criados posteriormente a essa verso,
mas no aceitam todas as inovaes dos compiladores de FORTRAN 90. Para as
explicaes ficarem mais claras a seguinte nomenclatura ser utilizada:
tpicos precedidos da identificao 77 s so validos para compiladores novos,
mas que no aceitam a programao em FORTRAN 90;
tpicos precedidos de F90 so vlidos apenas para os compiladores que aceitam
comandos FORTRAN 90.
Deve ficar claro que compiladores para FORTRAN 90 aceitam tambm os outros dois
tipos, e os baseados em FORTRAN N77 aceitam todos os comandos dos
compiladores mais antigos (FORTRAN 77), e que a recproca no verdadeira.
Os programas podem ser escritos em qualquer editor de texto, desde que sejam
salvos com as extenses .for ou .f90. Esta segunda forma somente para F90. Os
compiladores em N77 e F90 possuem um editor prprio; que deve ser usado, pois
possui muitos recursos adicionais, como por exemplo o destaque das palavras chaves
e identificaes mais claras dos erros de compilao, o que facilita muita a deteco
de falhas na criao dos programas.
(; Formatao
A formatao dos cdigos em FORTRAN, principalmente em formato fixo deve seguir
um estilo diferente dos usados na maioria das linguagens de programao. Estes
conceitos iniciais podem no ficar claro para os iniciantes na linguagem, estes leitores
podem observar o exemplo no final do item 8 (Leitura e impresso) para ter maior
clareza da disposio dos comandos em FORTRAN.
Os seguintes critrios devem ser seguidos para se escrever um programa em
FORTRAN no modo de formulrio fixo:
colunas , a <: so usadas para escrever os rtulos 'la(el' ou nmeros de
comando. Estes nmeros devem ser inteiros e estar totalmente contido nestas
colunas. No podem se repetir e no precisam estar em ordem crescente. Sero
usados para que outros comandos possam identificar aquela linha;
coluna =: qualquer caractere diferente de 0 "zero nesta coluna indica que o que
vem a seguir continuao da linha anterior ou da ultima linha que no seja um
comentrio (prximo item, conceitos bsicos). Um mesmo comando pode estar
dividido em at 19 linhas de cdigo. Entre as linhas do comando pode haver linhas em
branco ou comentrios;
colunas 7 a 7(: comandos ou comentrios;
colunas 7) a >0: campos de identificao, so usados pelo compilador, portanto
no se deve escrever nestas colunas.
F90 O programa pode ser escrito em qualquer posio, desde que o modo
formulrio livre esteja ativado. Alguns pontos devem ser observados para este formato:
as linhas de continuao so indicadas pelo smbolo '&' no fim da sentena, e a
prxima linha abaixo que no seja um comentrio ser tomada como continuao.
Deixe sempre um espao entre os comandos e o smbolo de continuao. permitida
a insero de comentrios aps o '&';
os rtulos devem ser os primeiros caracteres da linha, e podem estar em qualquer
coluna.
); "onceitos #sicos
Nesta seo sero apresentados outros conceitos importantes para a construo de
programas em FORTRAN.
"omentrios- no so interpretados pelo computador, um bom programa deve
conter muitos para que fique o mais claro possvel principalmente para quem vai
analis-lo. Em FORTRAN a letra 'c' ou o caractere '*' na primeira coluna indica que
toda a linha um comentrio. Alguns compiladores aceitam o uso de qualquer
caractere diferente de nmeros para iniciar a linha de comentrio. Na linha de
comentrio permitido o uso de qualquer caractere, especial ou no.
77 o ponto de exclamao '!' indica que o que vem aps ele comentrio, ele pode
vir em qualquer posio, inclusive aps os comandos.
8ari?eis e omes de #locos- devem ter no mximo seis letras, no permitido
o uso de caracteres especiais e no podem comear com um nmero.
77 podem ter 31 caracteres, inclusive o caractere 8"nders$ore7 '_'
"onstantes
um@ricas- podem conter quaisquer valores reais, inteiros ou complexos. A parte
decimal separada da inteira por um ponto '.'. Os zeros antes e depois do ponto
decimal podem ser omitidos, se no forem significantes. O expoente decimal
indicado pela letra 'e' ou 'E', deve vir entre o nmero e seu expoente sem o uso de
espaos entre eles. Nmeros negativos assim como a parte exponencial quando for
negativa deve vir precedida do sinal menos '-'. O sinal '+' opcional em ambas as
partes. Os nmeros imaginrios devem vir entre parnteses e a parte real deve ser
separada por uma vrgula da parte imaginria.
AlAanum@ricas- (so as 'strin's', seqncias de letras e/ou nmeros) podem
conter qualquer seqncia de caracteres no especiais. Devem vir entre aspas " " ou
apstrofos ' '. As aspas tm preferncia sobre os apstrofos, portanto um valor literal
pode conter apstrofos, desde que seu valor venha entre aspas. No permitido o uso
de caracteres especiais e letras acentuadas. Uma forma de se indicar ao compilador
que usar um valor alfanumrico o uso de B!valorliteral, onde w o nmero de
caracteres do valor alfanumrico. Apresar de vlido este formato praticamente no
usado nos programas atuais.
2aiCsculas e 2inCsculas- FORTRAN no '$ase sensitive', isto no faz
qualquer distino entre letras maisculas e minsculas. permitido inclusive o uso do
nome da varivel escrita de formas diferentes num mesmo programa. EX.: VAR = var
= Var.
omes de programa- os programas podem conter no incio o seu nome
(program nome_do _programa), e devem terminar com a palavra 'end' indicando
que o que vem a seguir no precisa ser executado.
D; 1eclarao de 8ari?eis
As variveis podem ser inteiras, reais ou literais. A declarao de uma varivel deve vir
antes que ela seja usada, se isto no ocorrer o compilador assumir que as variveis
que comeam com as letras at N como inteiras (INTEGER9:) e todas as outras
como reais (REAL9:).
Esta forma de declarao implcita pode ser modificada usando o comando
'implicit tipo (a1-a2,b1-b2,...)' sendo a1, a2, b1, b2 quaisquer letras do
alfabeto. A vrgula separa os intervalos de letras e o sinal determina o intervalo. As
letras que no estiverem em nenhum dos intervalos ter o seu tipo dado pela
declarao implcita. O comando seguinte indica que as variveis que comeam com
as letras a, b, c e de r at z so do tipo TIPO1.
implicit TIPO1 (a, b, c, r-z)
os espaos so usados para dar clareza e so ignorados pelo compilador. Quando
no se deseja que nenhuma varivel seja declarada implicitamente usa-se o comando
implicit none. Se este comando for usado e uma varivel citada no programa
no estiver em nenhuma outra declarao o complilador acusar um erro.
Para se declarar variveis que sejam matrizes e vetores deve-se indicar suas
dimenses logo aps o nome da varivel; entre parnteses, e separadas umas das
outras por vrgula. Ex.: a(4,3) indica uma matriz 'a' de 4 linhas por 3 colunas.
As variveis podem receber valores iniciais usando '/alor/', logo aps sua
declarao. No caso de vetores e matrizes devem ser dados os valores para todos os
elementos de cada linha em seqncia.
Tipos de 8ari?eis
/nteiras E/T.G.RF
Podem assumir os seguintes valores:
NTEGER*1 128 a 127
NTEGER*2 32,768 a 32,767
NTEGER*4 2,147,483,648 a 2,147,483,647
NTEGER*4 pode ser representado somente por: NTEGER
integer d ! a ari"el d # inteira do tipo $%
integer$1 a, b, c ! a, b e c &'o inteira& do tipo $1
integer a/(/, b(2,2)/),1,2,*/ ! a + (
! b +
Os nmeros aps o * indicam quantos bytes a varivel ocupa na memria do
computador. Esta observao vlida para todos os tipos de variveis.
Reais ER.ALF
Preciso simples, 6 casas decimais (padro):
REAL*4 ou REAL `3.402823E+38
ncremento mnimo de `1.175494E-38
Preciso dupla, 15 casas decimais (padro):
REAL*8 ou DOBLE PRECSON `1.797693134862316D+308
ncremento mnimo de `2.225073858507201D-308
A parte exponencial deve ser separada por um 'd' ou 'D' no lugar do 'e' ou 'E' para real
do tipo *8.
77 podem ser usados o 'e' ou 'E' para separar a parte exponencial. No s isso
mas tambm todas as outras funes (item 6 Funes intrnsecas) podem ser iguais a
de um real, no sendo necessrio o uso de funes especiais para este tipo de valor.
implict real(a-z) ! toda& a& ari"ei& &'o reai&
integer d ! a ari"el d # inteira me&mo com a
! declara,'o acima
"ompleGas E"O2PL.5F
Preciso simples, 6 casas decimais:
COMPLEX*8 ou COMPLEX
Preciso dupla, 15 casas decimais:
COMPLEX*16
Os valores que um complexo pode assumir so os mesmos que os reais.
comple- c/(%.,.*)/ ! c ale %,) reai& e ),* imagin"rio&
AlAanum@ricas E"!ARA"T.RF
CHARACTER NOME*w
Onde w representa o nmero mximo de caracteres que a varivel pode conter dentro
do programa.
Ou CHARACTER *wvar1,var2
(var1 e var2 possuem o mesmo tamanho w)
Ou CHARACTER (LEN = w) var1, (LEN=w2) var2
(var1 tem tamanho w e var2 tamanho w2)
c.a/a0t1r lo2c2ra/alta/ ! 3ortran n'o 4az di4eren,a
! entre mai5&c2la& e min5&c2la&
c6aracter data$7,$8 data2,data* ! data pode conter 7 caractere&
! e data2 e data* 8 caractere&
LHgicas ELOG/"ALF
LOGCAL NOME
Podem assumir os valores .TRUE. (VERDADERO) ou .FALSE. (FALSO)
Ou somente T e F ou ainda 1 e 0 ou diferente de zero e 0.
<; Operadores
Atribuio
A varivel ou identificador que estiver a esquerda do sinal de atribuio '=' recebem o
valor da expresso, constante ou varivel que estiver direita.
Identificador = Expresso
nome + 1ngen6aria 92imica ! n'o &e pode 2&ar acent2a,'o
ano + 1888 ! n'o # preci&o de : no 4inal
data1 + ;12<1)<87=
data2 + ;2)<11<87= ! a& &tring& n'o preci&am 2&ar
data* + ;1><*<88= ! todo o campo a ?2e tem direito
temp(1)+ 2>.(
temp(2)+ 22.% ! atrib2indo alore& a etore&
temp(*)+ 22.7
F90 estas declaraes poderiam estar na mesma linha desde que fossem separadas
por ponto e vrgula ';'.
data* + ;1><*<88=:temp(1)+ 2>.(:n2m_dia&+ *
Operadores Literais
Uma funo til para variveis literais a concatenao, ou a juno de duas ou mais
palavras. Em FORTRAN a concatenao feita pelo operador '//'.
a + tele
b + i&ao
c + a//b ! c + telei&ao
Operadores Aritm@ticos
Executam operaes aritmticas comuns.
FORTRA2atemtica Tradicional 0igniAicado
+ + soma
- - Subtrao
* Multiplicao
/ Diviso
** a
p
Potenciao
Quando uma varivel inteira recebe o resultado de uma diviso com resto, este resto
desprezado ou seja o valor truncado.
0 + @$$2 A B$$2 ! c + a
2
A b
2
C + 1$$(1/2) ! d + e
1/2
Operadores Relacionais
Comparam variveis, constantes ou expresses e retornam '.TRUE.', 'T' ou '1' se a
comparao for verdadeira, '.FALSE.', 'F' ou '0' se a comparao for falsa.
FORTRAF90 2atemtica Tradicional 0igniAicado
.LT. < < MENOR QUE
.LE. <= MENOR OU GUAL QUE
.EQ. == = GUAL A
.NE. /= DFERENTE DE
.GT. > > MAOR QUE
.GE. >= MAOR OU GUAL QUE
2) .ne. *) ! erdadeiro
1))) .lt. >)) ! 4al&o
Operadores LHgicos
So usados quando so necessrias mais de uma condio relacional ou quando
preciso inverter seu resultado.
FORTRA 0igniAicado
.AND.
Juno verdadeiro se os dois operadores
forem verdadeiros
.OR.
Disjuno verdadeiro se um dos dois
operadores forem verdadeiro
.NOT. Negao verdadeiro se o operador for falso
.NEQV. ou .XOR.
Desigualdade Lgica verdadeiro se somente
um dos operadores for verdadeiro
.EQV.
gualdade Lgica verdadeiro se os dois
operadores forem falsos ou verdadeiros
1).DT.> .@EC. 2).DT.2> ! .3@FG1. o2 )
1).DT.> .O/. 2).DT.2> ! .T/H1. o2 1
.EOT. 2).DT.2> ! .T/H1. o2 1
1) I > .JO/. 2) I+ 2> ! .T/H1. o2 1
1).DT.> .E19K. 2>.DT.2) ! .3@FG1. o2 )
1) L > .19K. 2) L+ 2> ! .T/H1. o2 1
1).FT.> .19K. 2>.DT.2) ! .3@FG1. o2 )
Prioridade
FORTRAN usa a seguinte relao de prioridades:
Operador Prioridade
** 1
* 2
/ 2
+ 3
- 3
.EQ. 4
.NE. 4
.GT. 4
.GE. 4
.LT. 4
.LE. 4
.NOT. 5
.AND. 6
.OR. 7
O uso de parnteses pode ser feito para trocar a ordem de prioridade.
(2).DT.1) .@EC. 2).DT.2>).O/.(1).FT.2) .@EC. 1).FT.(*$1)))
! .T/H1.
=; FunIes /ntr:nsecas
Existem vrias funes predefinidas em FORTRAN, que podem ser usadas em
qualquer parte do programa.
FunIes Trigonom@tricas
ome 1eAinio Tipo de
Argumento
Tipo da
Funo
SN (x) seno (radianos). Se x for complexo, a parte real
assumida como valor em radianos.
Real ou
complexo.
REAL*4
ASN (x) Arcoseno (radianos). Retorna valores na faixa [-
_/2, _/2 ]
Real, |x| .le. 1 REAL*4
COS (x) Coseno (radianos) Se x for complexo, a parte real
assumida como valor em radianos.
Real ou complexo REAL*4
ACOS (x) Arcocoseno (radianos) ) Retorna valores na faixa [
0, _ ]
Real, |x| .le. 1 REAL*4
TAN (x) Tangente (radianos) Real REAL*4
ATAN (x) Arcotangente (radianos). Retorna valores na faixa
[-_/2, _/2 ]
Real REAL*4
SNH (x) Seno Hiperblico (radianos) Real REAL*4
COSH (x) Coseno Hiperblico (radianos) Real REAL*4
TANH (x) Tangente Hiperblica (radianos) Real REAL*4
Outras funes trigonomtricas podem ser encontradas no Anexo A.
FunIes 1i?ersas
ome 1eAinio Tipo de
Argumento
Tipo da Funo
ALOG10 (x) logaritmo de x na base 10 real real
ALOG (x) logaritmo neperiano de x (x > 0) real real
EXP (x) o nmero e (base dos logaritmos
neperianos) eleado a x
real real
A!" (x) alor absol#to de x real real
$A!" (x) alor absol#to de x inteiro inteiro
$%$X (x) &oners'o de real para inteiro(
tr#n&ando
real inteiro
%LOA) (x) &oners'o de inteiro para real inteiro real
*!LE (x) &onerte para d#pla pre&is'o real real (d#pla
pre&is'o)
+,PLX (x) &onerte para o tipo &omplexo real &omplexo
"$G- (x(.) /orne&e alor positio de x se . 0 e
negatio de x se . 0 0
real real
,O* (x(.) resto da diis'o de x por . inteiro inteiro
A,O* (x(.) resto da diis'o de x por . real real
"12) (x) rai3 4#adrada de x (x 0) real real
Outras funes intrnsecas podem ser encontradas no Anexo A.
7; FunIes e 0ubrotinas
Funes e subrotinas podem ser usadas para economizar espao e tempo de
programao j que podem ser usadas vrias vezes num mesmo programa. Outro
ponto importante que elas podem dar ao programa maior clareza, pois vrias
seqncias de clculos ou execues podem vir separadas do restante dos
comandos.
O que d grande versatilidade s funes e subrotinas, so os argumentos passados
a elas, que quando variam produzem resultados diferentes. As funes e subrotinas
podem vir em qualquer parte do programa, mas o mais comum que apaream no fim
(aps o 'end' de termino do programa), por motivo de clareza. As variveis e rtulos
usados em funes e subrotinas so locais e por isso devem ser declarados
novamente, podendo ser usados os mesmos nomes de variveis e rtulos de outras
funes e subrotinas ou mesmo do programa principal. Os parmetros necessrios
devem ser passados junto com a chamada da funo ou subrotina, devem vir entre
parnteses e separados por virgula. Os nomes das variveis no precisam ser os
mesmos na chamada e definio de uma funo ou subrotina, devendo apenas estar
na mesma ordem.
FunIes
Retornam sempre um valor, e a ela podem ser passados qualquer nmero de
parmetros. As funes funcionam de forma semelhante s funes intrnsecas, com a
diferena de que agora o programador que define o que a funo deve gerar como
resultado. O tipo da funo deve ser declarado no programa principal, como se fosse
uma varivel comum. Uma funo pode utilizar outras funes.
Chamada:
nome_da_42n,'o(li&ta_de_parMmetro&)
Definio:
function nome_da_42n,'o(li&ta_de_parMmetro&)
de4ini,'o e declara,'o da& ari"ei& e con&tante& locai&
&e?NOncia de comando&
return
end
A palavra chave 'return' opcional, pode aparecer em qualquer ponto e mais de
uma vez. Ela indica que o comando deve retornar ao programa principal ou funo
ou subrotina que a chamou.
A funo retornar o valor do ultimo comando do tipo:
nome_da_42n,'o + e-pre&&'o
Exemplo:
ol2me + ga&_ideal(T,P,*) ! ol2me recebe o alor gerado pela
! 42n,'o ga&_ideal
42nction ga&_ideal(temp,pre&&,n_mol&)
implicit none
real temp,pre&&,n_mol&,ga&_ideal
ga&_ideal + n_mol&$7.*1%$temp/pre&&
ret2rn
end
0ubrotinas
No retornam nenhum valor, e tambm a elas podem ser passados qualquer nmero
de parmetros inclusive nenhum. As subrotinas podem conter quaisquer tipos de
comandos como imprimir resultados, abrir arquivos (estes sero vistos frente,
prximo item Leitura e mpresso) ou executar clculos. Como ocorrem com as
funes, as subrotinas podem 'chamar' outras subrotinas ou funes.
Chamada:
call nome_da_&2brotina (li&ta_de_parMmetro&)
Definio:
subroutine nome_da_&2brotina (li&ta_de_parMmetro&)
de4ini,'o e declara,'o da& ari"ei& e con&tante& locai&
&e?NOncia de comando&
return
end
A palavra chave 'ret"rn' opcional.
Exemplo:
call conerte_2nidade& ! c6ama a &2brotina para conerter a&
! 2nidade&
&2bro2tine conerte_2nidade&
implicit none
real temp,pre&&,n_mol&,ga&_ideal
T + temp A 2P*.1>
P + pre&&$1)1*2>
ol2me + ga&_ideal(T,P,*) ! c6ama a 42n,'o com o& alore&
! corrigido& de T e P
end
>; Leitura e /mpresso
Na maior parte dos programas preciso haver uma interao entre o programa e o
usurio. Essa interao pode ser feita em FORTRAN pelos comandos de leitura e
escrita de dados. Esses comandos na sua forma mais simplificada possuem a
seguinte estrutura:
leitura :
read (2nidade, 4ormato) li&ta_de_parMmetro&
impresso:
write (2nidade, 4ormato) li&ta_de_parMmetro&
ou
print 4ormato, li&ta_de_parMmetro&
Onde 'lista_de_parmetros' representa os dados que sero impressos, e devem
vir separados por vrgula. Podendo conter variveis ou expresses alfanumricas,
estas ltimas devem vir entre apstrofos ' '. 'unidade' representa a unidade onde os
dados sero impressos ou de onde sero lidos; tela, teclado, impressora ou arquivo.
'formato' pode conter uma lista de formatos de impresso (prximo item, Formatos),
um rtulo que indique um comando 'format' (que contenha a lista de formatos) ou o
smbolo '*' que indica impresso ou leitura de forma livre.
As unidades '6' e '*' se no forem definidas dentro do programa, sero consideradas
como a tela do computador ('write' ou 'print'). Da mesma forma as unidades '5' ou
'*' so definidas como o teclado ('read'). O comando 'print' imprime sempre os
resultados na unidade definida por '*' ou na tela caso no haja nenhuma definio para
de uma unidade especificada pelo '*'.
Na leitura os dados devem vir separados por espaos ou vir na linha seguinte. Caso
se tenham mais dados em uma linha do que os que sero lidos por um comando
'read' eles sero desprezados, inclusive pelo prximo comando 'read'. Na escrita os
dados viro um aps os outros separados por espaos (no caso de 'strings' viro
sem espaos de separao), ou na linha seguinte quando no houver mais espao. O
prximo comando 'write' ou 'print' comear a escrever na linha seguinte.
F90 para que se leia ou escreva dados na mesma linha mesmo aps mudar o
comando pode-se usar a opo 'advance=opcao' no comando anterior. Onde
'opcao' pode ser 'yes' ou 'no' e indica se o comando deve ou no avanar
automaticamente para a prxima linha. So usados somente nos comandos 'read' e
'write' onde a opo formato no seja livre.
write ($,2,advance=no) 1ngen6aria
write ($,2) 92imica
2 format(a)
imprime: 1ngen6aria 92imica
a significa que ser impressa uma string de qualquer tamanho (item 9, Formatos).
Outras opes de impresso e leitura podem ser encontradas no Anexo B.
9; Formatos Eleitura ou impressoF
Os formatos servem para que os dados sejam impressos ou lidos de uma forma
especfica, determinada pelo programador. Os formatos so compostos por uma
seqncia de especificaes que determinaro como os dados sero processados.
Cada uma dessas especificaes deve vir separada por vrgulas. Pode-se ainda
imprimir constantes numricas e alfanumricas, sendo que esta ltima deve vir entre
apstrofos ' '. O uso do '*' no lugar do formato indica que todos os dados sero
impresso ou lidos de forma livre, com o nmero de casas especificado pelo prprio
compilador. um recurso til para se evitar erros.
O FORTRAN no considera a primeira coluna da unidade de leitura e impresso
quando a sada ou entrada formatada, por isso deve-se incluir uma casa de
impresso em branco a mais para dados. Para formato livre no necessrio pois o
FORTRAN os posiciona automaticamente.
Quando mais de um dado usar a mesma especificao, ela pode ser feita da seguinte
forma: nespecificao1, n2especificao2 ou n(especificao1,
especificao2, ..., onde n e n2 representam o nmero de vezes que a
especificao ou seqncia de especificaes deve se repetir.
Caso o nmero de especificaes seja menor que o de variveis a serem lidas ou
impressas, a ultima especificao ou a ultima seqncia, caso seja usado o recurso
n(especificao1, especificao2, ..., ser repetida at que se complete
o nmero necessrio. sto no valido para constantes inclusas nos comandos de
leitura e impresso.
Quando o nmero de especificaes maior que os de dados a serem impressos as
ultimas sero desprezadas.
A forma de se declarar os formatos a seguinte:
r format (e&peci4ica,'o1, e&peci4ica,'o2, ...)
onde r um numero inteiro, e representa o rtulo do 'format'. Um mesmo 'format'
pode ser usado por vrios comandos de escrita e leitura.
1) 4ormat (2-,a,I) ! imprime 2 e&pa,o& em branco,
2ma
! &tring e 2m alor inteiro
77 o formato pode vir entre apstrofos e parnteses '(esp.1, esp2,..', dentro
do prprio comando de impresso ou leitura.
print (e&p.), ar1
write ($, (e&p.1,e&p.2)) ar1,ar2
read ($, (e&p.1,e&p.2)) ar1,ar2
As strings devem vir entre apstrofos duplos (''string'') nesse formato.
Formato +so

w[.m] Valores nteiros

Fw.d Valores Reais

Ew.d[Ee] Valores Reais com expoente

Gw.d[Ee] Mesmo que w[.m], Ew.d[Ee], Lw e A[w]

Dw.d Valores Reais de Dupla Preciso

Lw Valores Lgicos

A[w] Seqncia de Caracteres
77Zw_hexedit Valores Hexadecimais
F90 B;[.m] Valores Binrios
F90 O;[.m] Valores Octadecimais
F90 EN;<d[Ee] Valores Reais em Notao de Engenharia
F90 ES;<d[Ee] Valores Reais em Notao Cientifica
'w' representa o tamanho do campo a ser impresso ou lido, 'm' representa o nmero
de zeros que vir antes do nmero, 'd' o nmero de casas decimais e 'e' o nmero de
casas para o expoente.
O ponto decimal, o 'e' do expoente e o sinal '-' devem ser contados ao se dar o
tamanho do campo ('w'). Ao ler um dado que no possui ponto decimal e no seu
formato esperado um, o compilador ler este dado como se l houvesse um ponto.
12*%>
read ($,(4>.*)) a +I a + 12.*%>
Quando o ponto existe mas no est na posio especificada, a sua posio original
mantida.
12.*%>
read ($,(4>.%)) a +I a + 12.*%>
A notao com zeros 'm' s vlida quando m maior que o nmero de casas que o
nmero ocuparia no formato livre.
a + >>>
print (i>.%),a +I )>>>
Nas notaes com expoente (EN;<d[Ee], ES;<d[Ee], ...) no se pode omitir o 'E' ou 'e'.
Sempre que houver este termo, a parte exponencial vai existir independente do seu
valor.
a + 12.*%>
b + 12*%>.P78e(
Qrite ($,1) a,b
1 4ormat ( a+,e1).%e*, e b+,e1).%e*)
+I a+.12*>1A))2 e b+.12*>1A)11
Caso as strings sejam maiores que o espao reservado a elas, sero tomados apenas
os w primeiros caracteres. Se forem menores, elas sero alinhadas a direita e os
outros espaos deixados em branco.
belo 6orizonte
read ($, (a1))) nome +I belo 6oriz
Qrite ($, (a1>)) nome +I belo 6oriz
F90 os valores dos campos podem ser variveis desde que venham entre '!var1"'.
No valido para 'print'.
a + >
b + 3O/T/@E
Qrite ($,(aLaI)) b +I 3O/T/
Para valores numricos que precisam de mais casas de impresso que as indicadas
no 'format', sero impressos somente '*' naquele campo.
pi + *.1%1(
print (1-,1P.*e2), pi +I $$$$$$$
print (1-,17.*e2), pi +I .*1%1A)1
Outros Recursos Para Formatos
Alguns recursos adicionais so permitidos para 'read' ou 'write'.

Formato+so

string Transmite uma string para a sada
F90 Q A varivel recebe o nmero de espaos que o valor ocupa

nH Transmite os prximos n caracteres para a sada

Tc Move o ponto de leitura ou escrita para a posio c

TLc Move o ponto de leitura ou escrita c posies esquerda

TRc Move o ponto de leitura ou escrita c posies direita

nX Deixa n posies em branco

SP Escreve o sinal '+' onde ele opcional

SS Omite o sinal '+' onde ele opcional

S Retorna ou padro 'ss'

/ Muda de linha
77\ Comea a escrever no ponto onde a ultima escrita parou
77$ Comea a escrever no ponto onde a ultima escrita parou

: Termina a impresso se no houver mais itens na lista

kP O nmero multiplicado por 10 elevado -k (se o nmero j possuir expoente
no h efeito)

BN gnora os espaos em branco

BZ Transforma os espaos em branco em zeros
Antes ou depois de ', '', /, \, nH, $ ou : a vrgula opcional.
real a, b
c6aracter dia$2)
a + 2*.88
b + >>.7e-*
dia + RGeg2nda-4eiraR
Qrite ($,R(>-,&p,e1).*e2,2-,en12.*e*)R) a, b
Qrite ($,R(/2-,RR6oSe e RR,a7)R) dia
produz o seguinte resultado:
A.2%)1A)2 A>>.7))1-))*
6oSe e Geg2nda-
,0; ArJui?os
Quando se deseja trabalhar com grandes quantidades de dados, o melhor
armazen-los numa unidade de memria secundria, ou seja em arquivos. Um
programa pode gerar tantos dados que todos eles no caberiam na tela de uma s
vez, e ainda seriam perdidos ao finalizar o programa. Os dados salvos em arquivos
podem ser usados pelo prprio programa ou exportados para serem processados de
outra forma. Arquivos de leitura economizam um tempo precioso para o usurio do
programa pois ele no vai precisar enviar dados via teclado, e com arquivos milhares
de dados podem ser lidos em fraes de segundos.
O primeiro passo para se usar arquivos em FORTRAN indicar ao programa qual o
nome do arquivo e o nmero da unidade referente a ele.
open (2nidade,file=nome.e-t)
onde unidade deve ser um inteiro maior ou igual a zero, e uma referncia a este
arquivo. O nmero da unidade deve vir no comando 'read' ou 'write' indicando que
os dados sero retirados ou armazenados nesta unidade. A disposio dos dados em
arquivos a mesma utilizada nas unidades de entrada e sada padro (tem 8, Leitura
e mpresso), com uma nica diferena, as strings devem vir entre apstrofos ' '. A
abertura do arquivo pode ser feita em qualquer parte do programa (inclusive dentro de
funes e subrotinas), desde que venha antes de um comando que o utilize.
F90 o rtulo 'unidade' pode ser uma string.
Outras opes para abertura e fechamento de arquivos podem ser encontradas no
Anexo B.
Apesar de se poder usar qualquer extenso de arquivo ou at omiti-la, as extenses
.dat para leitura e .out para sada so mais comumente encontradas.
Quando no for utilizado o comando 'open', alguns compiladores emitiro uma
mensagem na tela pedindo um nome, podendo o usurio escolher um nome diferente
a cada vez que o programa for executado. Em outros compiladores sero dados
nomes padro como fort.1, fort.2, etc para cada arquivo utilizado que no foi aberto.
Todos os arquivos devem estar ou sero criados no mesmo diretrio em que estiver o
programa a menos que se d como nome o caminho para um outro diretrio. Os
caminhos seguem o mesmo padro do DOS.
Um arquivo pode tambm ser fechado, isto far com que o FORTRAN coloque uma
marca de fim de arquivo naquele ponto, esta marca pode ser identificada por outro
comando ou funo (Anexos A e B).
close (2nidade,status=e&tado)
ou
endfile 2nidade
onde status=estado opcional. Estado pode ser '#eep' que mantm o arquivo
na memria (este padro esta opo omitida), ou 'delete' que apaga o arquivo da
memria.
Arquivos fechados podem ser reabertos em qualquer parte do programa.
Outros Recursos
rewind 2nidade (volta o controle ao primeiro espao do arquivo)
backspace 2nidade (volta o controle um campo no arquivo)
Programa ArJui?o KarJui;datL
c6aracter $1>a,b,c
open(2),4ile+Rar?2i.o2tR)
open(*),4ile+Rar?2i.datR)
read (*),$) a
Qrite(2),$) R e&te # 2m R
Qrite(2),$) R ar?2io de R
Qrite(2),$) R &aTda R
read (*),$) b
reQind *)
read (*),$) c
Qrite(2),$) a
Qrite(2),$) b,c
end
R 92TmicaR R 3T&icaR
R 1ngen6ariaR
ArJui?o KarJui;outL
e&te # 2m
ar?2io de
&aTda
92Tmica
1ngen6aria 92Tmica
"ap:tulo (- .struturas de Programao
,; .strutura 0eJMencial
Os programas em FORTRAN devem conter os comandos escritos na ordem em que
sero executados, com exceo das funes, subrotinas e laos de repetio.
Portanto um programa em FORTRAN deve seguir o seguinte padro:
declara,'o 1
declara,'o 2
...
declara,'o n
comando 1
comando 2
...
comando n
end
onde as declaraes so opcionais (item 4 Captulo 1).
O comando 'end' indica o fim do programa. Se o programador preferir pode finalizar o
programa prematuramente usando os comandos 'stop' ou 'call e$it'.
Programa Resultado
integer$1 a,b
a+1)
b+2)
c+*)
Qrite ($,$) a
Qrite ($,$) b
1)
2)
*).))))))
Qrite ($,$) c
end
integer$1 a,b
a+1)
b+2)
c+*)
Qrite ($,$) a
Qrite ($,$) b
&top
Qrite ($,$) c
end
1)
2)
integer$1 a,b
a+1)
b+2)
c+*)
Qrite ($,$) a
call e-it
Qrite ($,$) b
Qrite ($,$) c
end
1)
(; "omando KGO TOL ou KGOTOL
O quando se deseja que o comando do programa avance ou recue em sua estrutura
de forma no seqencial, usa-se o comando 'goto' ou 'go to'.
goto r
onde r um rtulo de uma linha que possui ou no um comando. Como uma linha
rotulada no pode estar em branco pode-se usar a palavra chave 'continue', que
no ir interferir em nada no programa.
Programa Resultado
goto 2)
1) Qrite ($,$) R lin6a 1)R
2) Qrite ($,$) R lin6a 2)R
*) Qrite ($,$) R lin6a *)R
end
lin6a 2)
lin6a *)
goto 1
1) Qrite ($,$) R lin6a 1)R
1 contin2e
2) Qrite ($,$) R lin6a 2)R
2 contin2e
*) Qrite ($,$) R lin6a *)R
end
lin6a 2)
lin6a *)
); .strutura "ondicional
.strutura "ondicional 0imples
if (e-pre&&'o de te&te) comando
ou
if (e-pre&&'o de te&te) then
&e?NOncia de comando&
end if
Quando a expresso de teste for verdadeira os comandos sero executados,
quando for falsa o programa segue para o prximo comando logo abaixo da estrutura
condicional. A primeira opo s valida quando for executado um nico comando.
Este comando pode ser de qualquer tipo, atribuio, escrita, leitura, 'goto' ou
interrupo do programa.
.strutura "ondicional "omposta
if (e-pre&&'o de te&te) then
&e?NOncia de comando& 1
else
&e?NOncia de comando& 2
end if
Quando a expresso de teste for falsa a seqncia de comandos 2 ser executada.
Mesmo quando s h um comando na seqncia de comandos 1, no se pode omitir a
palavra chave 't%en'.
permitido o uso de estruturas condicionais umas dento das outras.
Programa Resultado
implicit integer (a-z)
a+1)
b+2)
c+*)
i4 (a.lt.b) t6en
Qrite ($,$) R aLbR
a+bA1)
el&e
Qrite ($,$) R aIbR
b+a->
end i4
i4 (c.ge.2)) Qrite($,$)R c+R,c, a, b
end
aLb
c+ *) *) 2)
.strutura "ondicional "omposta 0impliAicada
Uma outra forma de se usar uma estrutura condicional composta (somente N77 e F90)
usando o comando 'case'.
77 F90
SELEC C!SE (e-p. ca&e)
C!SE (li&ta de &ele,'o 1)
comando& 1
C!SE (li&ta de &ele,'o 2)
comando& 2
...
C!SE (li&ta de &ele,'o n)
comando& n
C!SE "E#!$L
comando& d
E%" SELEC
nome_ca&eU SELEC C!SE (e-p. ca&e)
C!SE (li&ta de &ele,'o 1)
comando& 1
C!SE (li&ta de &ele,'o 2)
comando& 2
...
C!SE (li&ta de &ele,'o n)
comando& n
C!SE "E#!$L
comando& d
E%" SELEC nome_ca&e
onde 'e$p. case' uma expresso ou constante inteira, lgica ou literal (somente
um caractere 'character*1'). Caso o valor de 'e$p. case' estiver na 'lista de
seleo 1', os 'comandos 1' sero executados. Se o valor no estiver na 'lista
de seleo 1' o computador ir avaliar a 'lista de seleo 2', se for
verdadeira sero executados os 'comandos 2' e assim at terminar os comandos
'case (lista de seleo n'. O comando 'case default' opcional, e faz
com que os 'comandos d' sejam executados caso nenhuma das outras avaliaes
sejam verdadeiras. 'nome_case' opcional e deve seguir as mesmas regras usadas
para dar nomes as variveis. A sua utilidade apenas de dar maior clareza ao
programa.
As listas de seleo podem ser da seguinte forma:
.strutura "ondio para ser ?erdadeira
case (valor) Exp. teste igual valor
case (-valor) Exp. teste menor que valor
case (valor-) Exp. teste maior que valor
case (valor1-valor2) Exp. teste entre valor1 e valor2
case (valor19valor29...9valorn) Exp. teste igual valor1 ou igual valor2 ou ... valorn.
No permitida a superposio de valores.
Os valores literais devem vir entre apstrofos e seus valores sero avaliados de
acordo com o padro ASC. Uma tabela com os valores ASC pode ser encontrada no
Anexo C.
Programa Resultado
i+2)
&elect ca&e (i)
ca&e (1))
Qrite ($,$) Ra+1)R
ca&e (2))
Qrite ($,$) Ra+2)R
ca&e (11,18)
Qrite ($,$) RaI11 aL18R
end &elect
end
a+2)
c6aracter i$1
i+R6R
alor_iU &elect ca&e (i)
ca&e (RaR,RbR,RcR)
Qrite ($,$) Ri+a o2 b o2 cR
ca&e (RdRURmR)
Qrite ($,$) Ri e&ta entre d e mR
ca&e (RCRURVR)
Qrite ($,$) Ri e&ta entre C e VR
i e&ta entre d e m
end &elect alor_i
end
importante observar que as letras maisculas e minsculas possuem valores ASC
diferentes.
D; .struturas de Repetio
Quando o mesmo comando precisa ser executado vrias vezes at que se atinja uma
certa condio ou um nmero certo de repeties, o melhor usar as estruturas de
repetio. Estas estruturas so bem simples e podem economizar vrias linhas de
comando.
.struturas de Repetio 0imples
r1 if (condi,'o_de_te&te) goto r2
comando&
goto r1
r2 continue
Esta uma estrutura de repetio muito simples, mas no recomendada para
programao. Estruturas mais aceitas, pois possuem equivalentes em outras
linguagens, so da seguinte forma:
do r1 ar+n1,n2,n*
&e?NOncia de comando&
r1 continue
ou
%&& - do ar+n1,n2,n*
&e?NOncia de comando&
end do
'var' uma varivel inteira ou real que recebe inicialmente o valor 'n1', a seqncia
de comandos se repete, e o valor de 'var' aumenta de 'n&' a cada vez que o comando
volta para a linha do 'do'. A repetio s para quando o valor de 'var' ultrapassa 'n2'.
Caso o programa exija uma contagem regressiva o valor de n3 deve ser negativo e n1
maior que n2.
A palavra chave 'end do' pode ser escrita como 'enddo'. 'n1', 'n2' e 'n&' podem ser
constantes ou variveis inteiras ou reais, positivas ou negativas. Quando 'n&' for igual
a um ele pode ser omitido.
1O N!/L. EF90F
Uma forma de se usar uma expresso de teste no comando 'do', o uso do 'do
w%ile'.
do while(e-p. te&te)
&e?NOncia de comando&
end do
Enquanto 'e$p. teste' for verdadeira a seqncia de comandos ser executada.
Programa
Resultado
real$7 a,b
a+)
b+)
1 i4(a.lt.)) goto 2
a+co&(b)
b+ bA.12>
Qrite ($,$) a
goto 1
2 contin2e
end
1.)))))))))))))))
8.8218P((P228*28)1-))1
8.(7812%21P1)(%%P1-))1
8.*)>)P(21812*1%*1-))1
7.PP>72>(178)*P271-))1
7.1)8(*118>)>21P81-))1
P.*1(777(77P*72)81-))1
(.%)88(7>71(**2>11-))1
>.%)*)2*)>7(71*871-))1
%.*11P(>1(P87(((21-))1
*.1>*22*(2*8>2(7P1-))1
1.8%>%PP)P87787P21-))1
P.)P*P2)1((PP)2811-))2
->.%1PP1*>)2(8*(*21-))2
integer i/1/, S/1/
do Q6ile (i)
S+SA1
i4(S.e?.>) i+)
print $,S,i
end do
end
2 1
* 1
% 1
> )
real$7 a(%)
i + 1: a(1) + 2.8P(%>87%
a(2) + >P(.P%e>
a(*) +.%>: a(%) + &in(.>)
do Q6ile(i.le.%)
printR(2-,&p,en1(.>e*)R, a(i)
Qrite ($,$)R ---------------R
i + i A 1
end do
end
A2.8P(%(1A)))
---------------
A>P.(P%))1A))(
---------------
A%%8.888881-))*
---------------
A%P8.%2>>%1-))*
---------------
do i+8,12
print R(2-,I2.2)R,i
enddo
end
)8
1)
11
12
1O /mpl:cito EN/F
Nos comandos 'read' e 'write' possvel usar uma estrutura de repetio
semelhante ao 'DO', mas de forma implcita e mais simplificada.
read(2nidade,4ormato)(li&ta_de_parMmetro&, ar=n1'n2'n*)
Onde 'var=n1,n2,n&' tem o mesmo significado que na estrutura 'DO'. Podem ser
usadas vrias estruturas deste tipo em um mesmo read ou write desde que venham
separadas por parnteses. Quando impressos desta forma, os dados ficam na mesma
linha. Para leitura eles podem vir na seqncia correta na mesma linha ou em linhas
diferentes. Os parmetros em formato sero usados at que se atinja o seu final,
quando isto acontecer o comando muda de linha e os formatos so usados novamente
desde o comeo.
Programa Resultado
integer a(>,*), b(*)
do i+1,>
do S+1,*
a(i,S)+1)$iAS
b(S)+1))AS$$*
enddo
enddo
Qrite ($,1) ((a(i,S), i+1,>) W
,b(S), S+1,*)
1 4ormat ( 2-,i%,R - R,i>,R - R,i%)
end
11 - 21 - *1
%1 - >1 - 1)1
12 - 22 - *2
%2 - >2 - 1)7
1* - 2* - **
%* - >* - 12P
"ap:tulo )- Recursos de Programao
,; 1eslocamento
GOTO /mpl:cito
Outra forma de usar o 'goto' a seguinte:
goto (r1, r2, ..., rn) ari"el
Onde 'vari'vel' uma varivel ou expresso inteira que deve ter valor mximo igual
ao nmero de rtulos que esto dentro dos parnteses. Quando esta varivel tiver
valor 1 o comando do programa vai para a linha rotulada com 'r1', quando tiver valor 2
vai para a linha com o rtulo r2, e assim por diante. Se o valor de 'varivel' for maior
que o nmero de rtulos o comando do programa vai para a linha imediatamente
abaixo do 'goto'.
Programa Resultado
i+2
goto (1),2),1>) i
1) Qrite ($,$) R o alor de i+1R
goto 1
2) Qrite ($,$) R o alor de i+2R
go to 1
1> Qrite ($,$) R o alor de i+*R
1 contin2e
end
o alor de i+2
/F "om 1eslocamento
Uma outra maneira de se deslocar num programa, usando agora um comando if a
seguinte:
if (e-p. n2m#rica) r1'r2'r*
'e$p. num(rica' no pode ser complexa. r1, r2, r& so rtulos. Se o valor de
'e$p. num(rica' for menor que zero o comando vai para a linha com o rtulo r1,
quando for igual a zero o comando vai para linha com o rtulo r2 e quando for maior
que zero vai para r3.
A 'e$p. num(rica' pode ser uma expresso que gere como valores 0 (zero) que
ser considerado como .false. ou qualquer nmero diferente de 0 (zero) que ser
considerado como .true..
Programa Resultado
i+1
1) i4(i-2) 1,2,*
1 Qrite ($,$) R iL2R
i+2
goto 1)
2 Qrite ($,$) R i+2R
i+*
goto 1)
* Qrite ($,$) R iI2R
end
iL2
i+2
iI2
(; 1eclaraIes e AtribuiIes A?anadas
1/2.0/O
Uma outra forma de se declarar vetores e matrizes, com a vantagem de se poderem
especificar os ndices mnimos e mximos em cada direo usando o comando
'dimension'.
tipo ar1'ar2'...'arn
dimension ar1(Fi1UF&1)' ar2(Fi2(F&2)'...' arn(Fin(F&n)
ou
tipo ar1(Fi1(F&1)' ar2(Fi2(F&2)' ...,arn(Fin(F&n)
'tipo' pode ser qualquer tipo de varivel inteira, real, lgica, complexa ou literal. Li1,
Li2,..., Lin so os ndices inferiores, e Ls1, Ls2,..., Ln so os ndices superiores da
matriz ou vetor. Os valores de Li e Ls podem ser positivos, nulos ou negativos desde
que sejam inteiros. Quando o valor de Li omitido, o valor um usado como padro.
As variveis podem ter duas ou mais dimenses, sendo declaradas da mesma forma,
com cada dimenso separada das outras por vrgulas.
ar(Fi1UF&1' Fi2UF&2, ...,FinUF&n)
Programa Resultado
integer a
dimen&ion a(-*U1,*)
do i+-*,1
do S+1,*
a(i,S)+i$$S
print 1,Ra(R,i,R,R,S,R)+R,a(i,S)
1 4ormat(1-,&p,a,i*.2,a,i*.2 W
,a,i*.2)
enddo
enddo
end
a(-)*,A)1)+-)*
a(-)*,A)2)+A)8
a(-)*,A)*)+-2P
a(-)2,A)1)+-)2
a(-)2,A)2)+A)%
a(-)2,A)*)+-)7
a(-)1,A)1)+-)1
a(-)1,A)2)+A)1
a(-)1,A)*)+-)1
a(A)),A)1)+A))
a(A)),A)2)+A))
a(A)),A)*)+A))
a(A)1,A)1)+A)1
a(A)1,A)2)+A)1
a(A)1,A)*)+A)1
PARA2.T.R
Uma constante pode ser representada por um smbolo no lugar do seu valor, ou seja o
valor de _, por exemplo, pode ser sempre que preciso referenciado como 'pi', no lugar
de se escrever sempre &.1)1*+. Bastando para isso o uso do comando
'parameter'. A diferena entre um valor com 'parameter' e uma varivel comum
que com 'parameter' o valor no pode ser modificado em nenhuma parte do
programa ou ser lido atravs de um comando 'read'. O tipo da constante deve ser
especificado antes ou sero usadas s atribuies implcitas (item 4 Captulo 1).
tipo con&tante1, con&tante2,...
parameter ( con&tante1 = alor, con&tante2 + alor,...)
Os parnteses so opcionais. 'tipo' pode ser 'integer', 'real' ou qualquer outro
tipo de varivel. Em 'parameter' no se podem declarar vetores e matrizes.
F90 Uma forma simplificada de se atribuir o valor e o tipo da constante feito da
seguinte forma.
tipo ' parameter (( con&tante1+alor, con&tante2+alor,...
Programa resultado
real pi,r(*),a
parameter (pi+*.1%>8)
do i+1,*
r+i$$2
a+area(r(i),pi)
print $,a
enddo
end
42nction area(r,pi)
real r,area
area+2$pi$r
ret2rn
end
real pi,r(*)
parameter (pi+*.1%>8)
do i+1,*
r+i$$2
call area(r(i),pi)
enddo
end
&2bro2tine area(r,pi)
real r,a
a+2$pi$r
print $,a
ret2rn
end
(.2817))
2>.1(P2))
>(.(2(2))
TOP. EF90F
Quando vrias variveis esto relacionadas entre si, o melhor agrup-las em grupos
'type', de forma que possam ser acessadas pelo nome do grupo. Este um recurso
semelhante programao orientada a objetos.
Declarao:
t)pe nome_tXpe
declara,Ye&
end t)pe nome_tXpe
nome_type o nome do bloco, e deve seguir as mesmas regras para nomes de
variveis. declara,es so declaraes de variveis (tipo vari'vel). Este bloco
pode ser usado vrias vezes, associando cada novo grupo um nome. O bloco com
esse novo nome ter as mesmas variveis feitas na declarao.
Associao:
t)pe (nome_tXpe) (( nome
Atribuio:
nome = nome_tXpe (alor da& ari"ei&)
ou
nome*nome_ari"el = alor
Programa Resultado
tXpe anier&
c6aracter nome$1)
c6aracter me&$1)
integer$1 dia
end tXpe anier&
tXpe (anier&) UU 6elder
tXpe (anier&) UU Zeila
3eereiro
.elder 1P
0arlo 12
[eila @go&to 22
tXpe (anier&) UU carlo
6elder+anier&(R.elderR,R3eereiroR,1P)
carlo+anier&(R0arloR,R3eereiroR,12)
Zeila \nome+R[eilaR
Zeila \me&+RmarcoR
Zeila\dia+2%
Qrite($,$) 6elder\me&
Qrite($,$) 6elder\nome,6elder\dia
Qrite($,$) carlo\nome,carlo\dia
Qrite($,R(1-,a,a,i2)R) Zeila
end
1ATA
O modo mais estruturado de se atribuir valores iniciais a variveis pelo comando
'data'. As diferenas entre o 'data' e 'parameter' que as variveis declaradas em
'data' podem alterar seu valor durante o programa, e essas variveis podem ser
vetores ou matrizes.
data ar1+alor1+'ar2+alor2+'...'arn+alorn+
ou
data ar1'ar2'...'arn+alor1'alor2'...'alorn+
Os valores de vetores e matrizes devem ser declarados todos de uma vez, com a
separao entre eles feita por vrgula.
Programa Resultado
integer 6(*,%),a,b,c
logical l1,l2
c6aracter cor$>
data 6/1,2,*,%,>,(,P,7,8,1),11,12/
)1)2)*)%)>)(
)P)7)81)1112
)> )* 1)
T 3
data a/>/,b/*/,c/1)/
data l1,l2,cor/.tr2e.,.4al&e.,RpretoR/
print R(2-,(i2.2,/,2-,(i2.2)R,6
print R(2-,*(i2.2,2-))R,a,b,c
print R(2-,lP,2-,lP)R,l1,l2
print $,cor
end
preto
); 1esignao de 2emHria
"O22O
Quando muitos dados devem ser passados a funes ou subrotinas, um recurso til
o 'common', que pode resumir este servio. Um mesmo 'common' pode ser usado
vrias vezes e 'carregar' muitas variveis ao mesmo tempo. Este comando deve
aparecer de forma igual no incio do programa principal (logo aps a definio dos
tipos de variveis) e tambm no incio de cada funo ou subrotina que o utilize.
common +nome+li&ta de ari"ei&+nome2+li&ta de ari"ei&2'...
O nome do bloco opcional, e se for repetido, as variveis sero agrupadas em um
mesmo bloco. A ausncia do nome e o nome '/ /' tm o mesmo significado. As
variveis de um 'common' sem nome no podem ser declaradas pelo comando 'data'.
Uma mesma varivel no pode ocupar mais de um comando 'common'.
A ordem em que as variveis aparecem no common devem ser iguais em qualquer
parte do programa, apesar de seus nomes poderem variar de uma subrotina ou funo
para outras.
Na declarao de um 'common' recomendvel que se siga uma ordem crescente do
tamanho das variveis. O tamanho de uma varivel dado pelo nmero de bites que
ela ocupa. A seqncia para essa declarao : logical, character, integer, real, vetores
e matrizes. As matrizes e vetores devem seguir esta mesma seqncia de tamanhos
(vetores logical, vetores character, ...). As strings so consideradas vetores de
caracteres.
Alguns compiladores apenas mostraro mensagens de advertncia quando est
seqncia estiver incorreta, outros no avaliam esta ordem e consideram como
corretas quaisquer ordem em que as variveis aparecerem.
Programa Resultado
common /42nc/a,b
common / /c,d
common e,4
data a,b/1,2/
c+*:d+%:e+>
4+42ncao(%)
call &2brotina(>)
end
! 42n,Ye& e &2brotina&
42nction 42ncao(t)
common /42nc/a,b
a+a$2
42ncao+tAaAb
ret2rn
end
&2bro2tine &2brotina(r)
common /42nc/a,b
common c,d,e,4
r+rAcAdAe
print R(*(2-,4(.*,/))R,r,a,4
ret2rn
end
12.)))
2.)))
%.)))
#LO"P 1ATA
As variveis declaradas em um 'common' com nome podem receber valores iniciais de
uma forma mais estruturada. No '-loc# data' podem ser usados os seguintes
recursos: common(com nome), parameter, data, dimension e variveis derivadas de
um type.
block data nome_bloco
declara,Ye& e atrib2i,Ye&
end
O 'nome_-loco' opcional e deve seguir as mesmas regras para nomes de variveis.
D; 2odulari$ao
/"L+1.
Declaraes, atribuies, common e outros comados que estejam em um arquivo de
texto com o mesmo formato usado no programa podem ser adicionados ao programa
principal atravs do comando 'include'. Esses arquivos podem ser adicionados a
outros arquivos 'include' ao programa principal e a funes e subrotinas. O mesmo
arquivo pode ser usado vrias vezes. Os arquivos sero interpretados como parte do
programa, e por isso devem seguir as mesmas regras do programa normal escrito em
FORTRAN.
include ,nome.e-t
ou
include -nome.e-t.
Nome e extenso podem ser qualquer um, mas a extenso '.inc' a mais comum para
este tipo de arquivo. permitido o uso de caminhos completos no lugar do nome.
AneGo A- FunIes /ntr:nsecas
,; FunIes Trigonom@tricas
ome 1eAinio ParQmetro Resultado
SN (X) seno (radianos). se x for
complexo, a parte real
assumida como valor em
radianos.
real ou complexo. real*4
SND (X) seno (graus se x for
complexo, a parte real
assumida como valor em
graus.
real ou complexo real*4
CSN (X) seno (radianos) complex*4 complex*4
CDSN (X) seno (radianos) complex*8 complex*8
DSN (X) seno (radianos) real*8 real*8
DSND (X) seno (graus) real*8 real*8
ASN (X) Arcoseno (radianos). retorna
valores na faixa [-_/2, _/2 ]
real, |x| .le. 1 real*4
ASND (X) Arcoseno (graus) retorna
valores na faixa [-90, 90 ]
real |x| .le. 1 real*4
DASN (X) Arcoseno (radianos). retorna
valores na faixa [-_/2, _/2 ]
real*8 real*8
DASND (X) Arcoseno (graus) retorna
valores na faixa [-90, 90 ]
real*8 real*8
COS (X) coseno (radianos) se x for
complexo, a parte real
assumida como valor em
radianos.
real ou complexo real*4
COSD (X) coseno (graus) se x for
complexo, a parte real
assumida como valor em
graus.
real ou complexo real*4
CCOS (X) coseno (radianos) complex*4 complex*4
CDCOS (X) coseno (radianos) complex*8 complex*8
DCOS (X) coseno (radianos) real*8 real*8
DCOSD (X) coseno (graus) real*8 real*8
AOS (X) Arcocoseno (radianos) )
retorna valores na faixa [ 0,
_ ]
real, |x| .le. 1 real*4
ACOSD (X) Arcocoseno (graus) retorna
valores na faixa [ 0, 180 ]
real, |x| .le. 1 real*4
DACOS (X) Arcocoseno (radianos) )
retorna valores na faixa [ 0, _]
real*8, |x| .le. 1 real*8
DACOSD (X) Arcocoseno (graus) ) retorna
valores na faixa [ 0, 180 ]
real*8, |x| .le. 1 real*8
TAN (X) tangente (radianos) real real*4
TAND (X) tangente (graus) real real*4
DTAN (X) tangente (radianos) real*8 real*8
DTAND (X) tangente (graus) real*8 real*8
COTAN (X) cotangente (radianos) real. x no pode ser 0. real*4
DCOTAN (X) cotangente (radianos) real*8. x no pode ser 0. real*8
ome 1eAinio ParQmetro Resultado
ATAN (X) Arcotangente (radianos). )
retorna valores na faixa [-_/2,
_/2 ]
real real*4
ATAND (X) Arcotangente (graus). )
retorna valores na faixa [-90,
90 ]
real real*4
DATAN (X) Arcotangente (radianos).
retorna valores na faixa [-_/2,
_/2 ]
real*8 real*8
DATAND (X) Arcotangente (graus). retorna
valores na faixa [-90, 90 ]
real*8 real*8
ATAN2 (Y,X) Arcotangente (y / x) em
radianos. retorna valores na
faixa [-_,_ ]
real. x e y no podem
ambos ser 0.
real*4
ATAN2D (Y,X) Arcotangente (y / x) em
graus. retorna valores na
faixa [-180, 180 ]
real. x e no podem ambos
ser 0.
real*4
DATAN2 (Y,X) Arcotangente (y / x) em
radianos retorna valores na
faixa [-_,_ ])
real*8 x e y no podem
ambos ser 0.
real*8
DATAN2D (Y,X) Arcotangente (y / x) em
graus. retorna valores na
faixa [-180, 180 ]
real*8 x e y no podem
ambos ser 0.
real*8
SNH (X) seno hiperblico (radianos) real real*4
DSNH (X) seno hiperblico (radianos) real*8 real*8
COSH (X) coseno hiperblico (radianos) real real*4
DCOSH (X) coseno hiperblico (radianos) real*8 real*8
TANH (X) tangente hiperblica
(radianos)
real real*4
DTANH (X) tangente hiperblica
(radianos)
real*8 real*8
(; FunIes Gen@ricas
ome 1eAinio ParQmetro Resultado
DPROD(A,B) a*b real*4, real*4 real*8
EOF(UNT) verifica o final da unidade
unit
integer*2 logical
SGN(X,Y) retorna x com o sinal de y real ou inteiro real ou inteiro
SGN(X,Y) retorna x com o sinal de y inteiro inteiro
DSGN(X,Y) retorna x com o sinal de y real*8 real*8
); .Gponenciais
O nmero 'e' elevado a X (e
X
)
ome ParQmetro Resultado
CDEXP (X) complex*16 complex*16
CEXP (X) complex*8 complex*8
DEXP (X) real*8 real*8
EXP (X) real, inteiro ou complexo mesmo que o parmetro
D; Logaritmos
ome 1eAinio ParQmetro Resultado
LOG (X) logaritmo natural real ou complexo mesmo que o
parmetro
ALOG (X) logaritmo natural real*4 real*4
DLOG (X) logaritmo natural real*8 real*8
CLOG (X) logaritmo natural complex*8 complex*8
CDLOG (X) logaritmo natural complex*16 complex*16
LOG10 (X) logaritmo na base 10 real mesmo que o
parmetro
ALOG10 (X) logaritmo na base 10 real*4 real*4
DLOG10 (X) logaritmo na base 10 real*8 real*8
<; 2Gimos
ome 1eAinio ParQmetro Resultado
MAX(X1,X2,..) maior valor qualquer tipo maio tipo entre os
valores
MAX0(X1,X2,..) maior valor inteiro inteiro
AMAX1(X1,X2,..) maior valor real real
AMAX0(X1,X2,..) maior valor inteiro real
MAX1(X1,X2,..) maior valor real inteiro
DMAX1(X1,X2,..) maior valor real*8 real*8
=; 2:nimos
Semelhante as funes de mximo (MN, MN0, AMN1, AMN0, MN1, DMN1)
7; Restos
Resto da diviso de X por Y
ome ParQmetro Resultado
MOD(X,Y) real ou inteiro real ou inteiro
AMOD(X,Y) real*4 real*4
DMOD(X,Y) real*8 real*8
>; Rai$ 7uadrada de 5
ome ParQmetro Resultado
SQRT(X) real ou complexo real ou complexo
DSQRT(X) real*8 real*8
CSQRT(X) complex*8 complex*8
CDSQRT(X) complex*16 complex*16
9; Truncamento de 5
ome ParQmetro Resultado
ANT(X) real real
DNT(X) real*8 real*8
,0; Arredondamento de 5
ome ParQmetro Resultado
NNT(X) real inteiro
DNNT(X) real*8 real*8
ANNT(X) real real
DNNT real*8 inteiro
,,; 1iAerena Positi?a .ntre 5 e O
( se Y > X o valor zero)
ome ParQmetro Resultado
DM(X,Y) real ou inteiro real ou inteiro
DDM(X,Y) real*8 real*8
DM(X,Y) inteiro inteiro
,(; Tipo de 1ado
ome 1eAinio ParQmetro Resultado
ALLOCATED(X) .true. se a for vetor ou
matriz
todos lgico
EPSLON(X) menor valor que pode
ser incrementado
real real
HUGE(X) maior valor possvel real ou inteiro real ou inteiro
MAXEXPONENT(X) maior expoente possvel real real
MNEXPONENT(X) menor expoente possvel real real
NEAREST(X,Y) se y positivo retorna o
maior real se negativo o
menor real
real real
PRECSON(X) nmero de casas
decimais
real real
TNY(X) menor valor positivo que
pode ser armazenado
real real
,); TransAormao do Tipo de 5
ome ParQmetro Resultado
NT(X) real, inteiro ou complexo inteiro
NT1(X), NT2(X), NT4(X),
NTC(X)
real, inteiro ou complexo integer*1, integer*2, integer*4, c
integer
FX(X) real*4 inteiro
HFX(X) real, inteiro ou complexo integer*2
JFX(X) real, inteiro ou complexo integer*4
DNT(X) real*8 inteiro
REAL(X) real, inteiro ou complexo real*4
DREAL(X) complex*16 real*8
FLOAT(X) inteiro real*4
SNGL(X) real*8 real*4
DBLE(X) real*8 ou complexo real*8
DFLOAT(X) real*8 ou complexo real*8
CMPLX(X) inteiro, real, complexo complexo
DCMPLX(X) inteiro, real, complexo complex*16
CHAR(X) ASC inteiro
CHAR(X) integer*4 ASC
,D; "ompleGos
ome 1eAinio ParQmetro Resultado
MAG(X) retorna a parte
imaginria
complexo real
DMAG(X) retorna a parte
imaginria
complex*16 real*8
AMAG(X) retorna a parte
imaginria
complex*8 real*4
CONJG(X) retorna o complexo
conjugado
complex*8 complex*8
DCONJG(X) retorna o complexo
conjugado
complex*16 complex*16
,<; "aracteres
ome 1eAinio ParQmetro Resultado
LEN(X) tamanho de x character inteiro
LGE(X,Y) compara x e y se x >= y .true. character logical
LGT(X,Y) compara x e y se x > y .true. character logical
LLE(X,Y) compara x e y se x <= y .true. character logical
LLT(X,Y) compara x e y se x < y .true. character logical
NDEX(X,Y) procura y em x e retorna a posio character inteiro
LEN_TRM(X) tamanho de x menos o nmero de
espaos
character inteiro
SCAN(X,Y) procura um dos caracteres de y em x e
retorna o nmero de ocorrncias
character inteiro
VERFY(X,Y) procura um dos caracteres de y em x e
retorna a posio da primeira no
character inteiro
ocorrncia
,=; 8alores Absolutos de 5
ome ParQmetro Resultado
ABS(X) complexo ou real complexo ou real
ABS(X) inteiro inteiro
DABS(X) real*8 real*8
CABS(X) complex*16 complex*16
CDABS(X) complex*16 real*8
Os valores absolutos dos dados complexos so calculados pela seguinte formula:
AneGo #- OpIes de ArJui?os9 Leitura e
.scrita
As opes contidas aqui foram baseadas no compilador FORTRAN Visual Workbrench
v 1.00. Outros compiladores possuem outros nomes para estas opes, e podem
possuir outras alem destas.
As opes entre colchetes so opcionais. Elas podem vir em qualquer ordem, exceto
quando explicitado.
,; Abertura de ArJui?os EOP.F
OPEN ([UNT=]"nit [ , ACCESS=a$$ess] [ , BLANK=(lan=s]
[ , BLOCKSZE=(lo$=si>e] [ , ERR=errla(el] [ , FLE=!ile]
[ , FORM=!orm] [ , OSTAT=io$?e$=] [ , MODE=mode]
[ , RECL=re$l] [ , SHARE=s?are] [ , STATUS=stat"s])
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit).
"nit Expresso inteira. ndica o nmero da unidade.
a$$ess Expresso alfanumrica. 'APPEND' , 'DRECT' ou 'SEQUENTAL' (padro,
quando access omitido)
(lan$= Expresso alfanumrica. 'NULL' ignora zeros e espaos, 'ZERO' espaos so
substitudos por zeros. Os formatos BN e BZ podem anular este efeito.
(lo$=si>e Expresso inteira. Especifica o tamanho da unidade (em bytes).
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
!ile Expresso alfanumrica. ndica o nome do arquivo. Quando omitido o programa
pede ao usurio um nome.
!orm Expresso alfanumrica. 'FORMATED' (padro quando
a$$ess='SEQUENTAL'), 'UNFORMATED' (padro quando a$$ess='DRECT'),
'BNARY'.
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna um nmero
negativo se encontrar a marca de fim de arquivo (EOF), retorna o nmero do erro
quando um ocorre.
mode Expresso alfanumrica. 'READ' o arquivo s para leitura, 'WRTE' o arquivo
s para escrita, 'READWRTE' o arquivo pode ser usado para leitura ou escrita.
re$l Expresso inteira. Representa o tamanho de cada dado em bytes. obrigatrio
para a$$ess='DRECT'.
s?are Expresso alfanumrica. 'DENYRW' ignora mode='READWRTE', 'DENYWR'
ignora mode='WRTE', 'DENYRD' ignora mode='READ', 'DENYNONE' ignora qualquer
mode,
stat"s Expresso alfanumrica. 'OLD' indica que o arquiva j existe, 'NEW' indica
que o arquivo deve ser criado, 'UNKOWN' (padro) verifica a existencia do arquivo, se
ele no existir ser criado um, 'SCRATHC'
(; Fec&amento de ArJui?os E"LO0.F
CLOSE ( [UNT=] "nit [,ERR=errla(el] [,OSTAT=io$?e$=]
[,STATUS=stat"s] )
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit).
"nit Expresso inteira. ndica o nmero da unidade.
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna um nmero
negativo se encontrar a marca de fim de arquivo (EOF), retorna o nmero do erro
quando um ocorre.
stat"s Expresso alfanumrica. 'KEEP' indica que o arquiva deve ser mantido,
'DELETE' indica que o arquivo deve ser apagado.
); .scrita ENR/T.F
WRTE ([UNT=] "nit [ , [{[ FMT=] !ormat] | [ NML=] nml }]
[ , ERR=errla(el] [ , OSTAT=io$?e$=] [ , REC=re$] ) iolist
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit). Se FMT=
ou NML= forem omitidos, !ormat ou nml devem ser o segundo parmetro.
"nit Expresso inteira. ndica o nmero da unidade.
!ormat Expresso inteira. ndica o rtulo de um comando 'format'. Expresso
alfanumrica. Expresso que contenha os formatos de impresso.
nml Lista de variveis serem impressas, se estiver presente iolist deve ser omitida.
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do
erro quando um ocorre.
re$ @ Expresso inteira. ndica a posio do arquivo onde o dado ser impresso.
Somente para arquivos com a$$ess='DRECT'.
iolist @ Lista de variveis serem impressas.
D; Leitura ER.A1F
READ { { !ormat, | nml } | ([UNT=]"nit [ , [ {[FMT=] !ormat] |
[NML=]nmlspe$}] [ , END=endla(el] [ , ERR=errla(el] [ , OSTAT=io$?e$=]
[, REC=re$])} iolist
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit). Se FMT=
ou NML= forem omitidos, !ormat ou nml devem ser o segundo parmetro.
"nit Expresso inteira. ndica o nmero da unidade.
!ormat Expresso inteira. ndica o rtulo de um comando 'format'. Expresso
alfanumrica. Expresso que contenha os formatos de leitura.
nml Lista de variveis serem lidas, se estiver presente iolist deve ser omitida.
endla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para
onde o comando vai se a marca de fim de arquivo (EOF) for encontrada.
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna 1 se
encontrar EOF, retorna o nmero do erro quando um ocorre.
re$ @ Expresso inteira. ndica a posio do arquivo de onde o dado ser lido.
iolist @ Lista de variveis serem lidas.
<; Recuo Total ER.N/1F
REWND { "nit | ([UNT=]"nit [ , ERR=errla(el] [ , OSTAT=io$?e$=])}
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit).
"nit Expresso inteira. ndica o nmero da unidade.
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do
erro quando um ocorre.
=; Recuo de um "ampo E#A"P0PA".F
BACKSPACE {"nit|( [UNT=] "nit [,ERR=errla(el] [,OSTAT=io$?e$= ]] ) }
UNT= - Quando omitido, o primeiro valor ser o nmero da unidade ("nit).
"nit Expresso inteira. ndica o nmero da unidade.
errla(el Expresso inteira. ndica o rtulo de uma linha no mesmo arquivo para onde
o comando vai se houver erro. Quando omitido o efeito determinado pela presena
ou no de io$?e$=<
io$?e$= Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do
erro quando um ocorre.
AneGo "- Tabela de 8alores A0"//
Valor ASC Caracter Correspondente

Potrebbero piacerti anche