Escolar Documentos
Profissional Documentos
Cultura Documentos
NDICE
CAPTULO 1: CONCEITOS DA LINGUAGEM 1
1. INTRODUO ............................................................................................................................ 1 2. FORMATAO .......................................................................................................................... 1 3. CONCEITOS BSICOS ................................................................................................................ 2 4. DECLARAO DE VARIVEIS .................................................................................................... 3 Tipos de Variveis 4 Inteiras (INTEGER) 4 Reais (REAL) 5 Complexas (COMPLEX) 5 Alfanumricas (CHARACTER) 5 Lgicas (LOGICAL) 6 5. OPERADORES ........................................................................................................................... 6 Atribuio 6 Operadores Literais 6 Operadores Aritmticos 7 Operadores Relacionais 7 Operadores Lgicos 7 Prioridade 8 6. FUNES INTRNSECAS ............................................................................................................. 8 Funes Trigonomtricas 8 Funes Diversas 9 7. FUNES E SUBROTINAS ........................................................................................................... 9 Funes 9 Subrotinas 10 8. LEITURA E IMPRESSO ............................................................................................................ 11 9. FORMATOS (LEITURA OU IMPRESSO)...................................................................................... 12 Outros Recursos Para Formatos 15 10. ARQUIVOS ............................................................................................................................ 16 Outros Recursos 17
18
1. ESTRUTURA SEQENCIAL ....................................................................................................... 18 2. COMANDO GO TO OU GOTO ............................................................................................ 19 3. ESTRUTURA CONDICIONAL ..................................................................................................... 19 Estrutura Condicional Simples 19 Estrutura Condicional Composta 19 Estrutura Condicional Composta Simplificada 20 4. ESTRUTURAS DE REPETIO ................................................................................................... 21 Estruturas de Repetio Simples 21 DO WHILE (F90) 22 DO Implcito (WIN) 23
24
1. DESLOCAMENTO..................................................................................................................... 24 GOTO Implcito 24 IF Com Deslocamento 24 2. DECLARAES E ATRIBUIES AVANADAS ........................................................................... 25 DIMENSION 25 PARAMETER 26 TYPE (F90) 26 DATA 27 3. DESIGNAO DE MEMRIA ..................................................................................................... 28 COMMON 28 BLOCK DATA 29 4. MODULARIZAO .................................................................................................................. 29 INCLUDE 29
31
1. FUNES TRIGONOMTRICAS ................................................................................................. 31 2. FUNES GENRICAS ............................................................................................................. 32 3. EXPONENCIAIS ....................................................................................................................... 33 4. LOGARITMOS.......................................................................................................................... 33 5. MXIMOS............................................................................................................................... 33 6. MNIMOS ................................................................................................................................ 33 7. RESTOS .................................................................................................................................. 33 8. RAIZ QUADRADA DE X ........................................................................................................... 34 9. TRUNCAMENTO DE X .............................................................................................................. 34 10. ARREDONDAMENTO DE X ..................................................................................................... 34 11. DIFERENA POSITIVA ENTRE X E Y....................................................................................... 34 12. TIPO DE DADO ...................................................................................................................... 34 13. TRANSFORMAO DO TIPO DE X ........................................................................................... 35 14. COMPLEXOS ......................................................................................................................... 35 15. CARACTERES ........................................................................................................................ 35 16. VALORES ABSOLUTOS DE X .................................................................................................. 36
37
1. ABERTURA DE ARQUIVOS (OPEN) .......................................................................................... 37 2. FECHAMENTO DE ARQUIVOS (CLOSE).................................................................................... 38 3. ESCRITA (WRITE).................................................................................................................. 38 4. LEITURA (READ)................................................................................................................... 39 5. RECUO TOTAL (REWIND)...................................................................................................... 39 6. RECUO DE UM CAMPO (BACKSPACE) ................................................................................... 40
41
.1.
2. 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.
.2.
Os seguintes critrios devem ser seguidos para se escrever um programa em FORTRAN no modo de formulrio fixo: colunas 1 a 5: so usadas para escrever os rtulos label 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 6: 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 72: comandos ou comentrios; colunas 73 a 80: 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.
3. Conceitos Bsicos
Nesta seo sero apresentados outros conceitos importantes para a construo de programas em FORTRAN. Comentrios: 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. N77 o ponto de exclamao ! indica que o que vem aps ele comentrio, ele pode vir em qualquer posio, inclusive aps os comandos.
.3.
Variveis e Nomes de Blocos: devem ter no mximo seis letras, no permitido o uso de caracteres especiais e no podem comear com um nmero.
N77 podem ter 31 caracteres, inclusive o caractere underscore _ Constantes Numricas: 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. Alfanumricas: (so as strings, 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 wHvalorliteral, onde w o nmero de caracteres do valor alfanumrico. Apresar de vlido este formato praticamente no usado nos programas atuais. Maisculas e Minsculas: FORTRAN no case 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. Nomes 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.
4. Declarao de Variveis
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 I at N como inteiras (INTEGER*4) e todas as outras como reais (REAL*4).
.4.
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 /valor/, logo aps sua declarao. No caso de vetores e matrizes devem ser dados os valores para todos os elementos de cada linha em seqncia.
INTEGER*4 pode ser representado somente por: INTEGER integer d integer*1 a, b, c ! a varivel d inteira do tipo *4 ! a, b e c so inteiras do tipo *1 ! a = 6 ! b =
0 1 2 3
Os nmeros aps o * indicam quantos bytes a varivel ocupa na memria do computador. Esta observao vlida para todos os tipos de variveis.
.5.
A parte exponencial deve ser separada por um d ou D no lugar do e ou E para real do tipo *8. N77 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) integer d ! todas as variveis so reais ! a varivel d inteira mesmo com a ! declarao acima
Complexas (COMPLEX)
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. complex c/(4.,.3)/ ! c vale 4,0 reais e 0,3 imaginrios
Alfanumricas (CHARACTER)
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)
.6.
Lgicas (LOGICAL)
LOGICAL NOME Podem assumir os valores .TRUE. (VERDADEIRO) ou .FALSE. (FALSO) Ou somente T e F ou ainda 1 e 0 ou diferente de zero e 0.
5. 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 = Engenharia Quimica ano = 1999 data1 = 12\10\98 data2 = 20\11\98 data3 = 15\3\99 temp(1)= 25.6 temp(2)= 22.4 temp(3)= 22.8 ! no se pode usar acentuao ! no preciso de ; no final ! as strings no precisam usar ! todo o campo a que tem direito ! atribuindo valores a vetores
F90 estas declaraes poderiam estar na mesma linha desde que fossem separadas por ponto e vrgula ;. data3 = 15\3\99;temp(1)= 25.6;num_dias= 3
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 = visao c = a//b
! c = televisao
.7.
Quando uma varivel inteira recebe o resultado de uma diviso com resto, este resto desprezado ou seja o valor truncado. C = A**2 + B**2 D = E**(1/2) ! c = a2 + b2 ! d = e1/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.
FORTRAN .LT. .LE. .EQ. .NE. .GT. .GE. F90 Matemtica Tradicional Significado < < MENOR QUE <= MENOR OU IGUAL QUE == = IGUAL A /= DIFERENTE DE > > MAIOR QUE >= MAIOR OU IGUAL QUE
! verdadeiro ! falso
Operadores Lgicos
So usados quando so necessrias mais de uma condio relacional ou quando preciso inverter seu resultado.
FORTRAN .AND. .OR. .NOT. .NEQV. ou .XOR. .EQV. Significado Juno verdadeiro se os dois operadores forem verdadeiros Disjuno verdadeiro se um dos dois operadores forem verdadeiro Negao verdadeiro se o operador for falso Desigualdade Lgica verdadeiro se somente um dos operadores for verdadeiro Igualdade Lgica verdadeiro se os dois operadores forem falsos ou verdadeiros
10.GT.5 .AND. 20.GT.25 10.GT.5 .OR. 20.GT.25 .NOT. 20.GT.25 10 > 5 .XOR. 20 >= 25
! ! ! !
ou ou ou ou
0 1 1 1
.8.
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. (20.GT.10 .AND. 20.GT.25).OR.(10.LT.20 .AND. 10.LT.(3*10)) ! .TRUE.
6. Funes Intrnsecas
Existem vrias funes predefinidas em FORTRAN, que podem ser usadas em qualquer parte do programa.
Funes Trigonomtricas
Nome SIN (x) ASIN (x) COS (x) ACOS (x) TAN (x) ATAN (x) SINH (x) COSH (x) TANH (x) Definio Tipo de Argumento Tipo da Funo seno (radianos). Se x for complexo, a parte real Real ou complexo. REAL*4 assumida como valor em radianos. Arcoseno (radianos). Retorna valores na faixa [Real, |x| .le. 1 REAL*4 _/2, _/2 ] Coseno (radianos) Se x for complexo, a parte real Real ou complexo REAL*4 assumida como valor em radianos. Arcocoseno (radianos) ) Retorna valores na faixa Real, |x| .le. 1 REAL*4 [ 0, _ ] Tangente (radianos) Real REAL*4 Arcotangente (radianos). Retorna valores na faixa Real REAL*4 [-_/2, _/2 ] Seno Hiperblico (radianos) Real REAL*4 Coseno Hiperblico (radianos) Real REAL*4 Tangente Hiperblica (radianos) Real REAL*4
.9.
Funes Diversas
Nome ALOG10 (x) ALOG (x) EXP (x) ABS (x) IABS (x) IFIX (x) FLOAT (x) DBLE (x) CMPLX (x) SIGN (x,y) MOD (x,y) AMOD (x,y) SQRT (x) Definio Tipo de Argumento Tipo da Funo logaritmo de x na base 10 real real logaritmo neperiano de x (x > 0) real real o nmero e (base dos logaritmos real real neperianos) elevado a x valor absoluto de x real real valor absoluto de x inteiro inteiro converso de real para inteiro, truncando real inteiro converso de inteiro para real inteiro real converte para dupla preciso real real (dupla preciso) converte para o tipo complexo real complexo real real fornece valor positivo de x se y 0 e negativo de x se y < 0 resto da diviso de x por y inteiro inteiro resto da diviso de x por y real real real real raiz quadrada de x (x 0)
7. Funes e Subrotinas
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.
Funes
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
.10.
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_funo(lista_de_parmetros) Definio: function nome_da_funo(lista_de_parmetros) definio e declarao das variveis e constantes locais seqncia de comandos 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_funo = expresso Exemplo: volume = gas_ideal(T,P,3) ! volume recebe o valor gerado pela ! funo gas_ideal
function gas_ideal(temp,press,n_mols) implicit none real temp,press,n_mols,gas_ideal gas_ideal = n_mols*8.314*temp/press return end
Subrotinas
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 Impresso) ou executar clculos. Como ocorrem com as funes, as subrotinas podem chamar outras subrotinas ou funes.
.11.
8. Leitura e Impresso
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 (unidade, formato) lista_de_parmetros
impresso:
write (unidade, formato) lista_de_parmetros ou print formato, lista_de_parmetros 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
.12.
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) Engenharia write (*,2) Quimica 2 format(a)
imprime: Engenharia Quimica 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.
.13.
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. Isto 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 (especificao1, especificao2, ...) onde r um numero inteiro, e representa o rtulo do format. Um mesmo format pode ser usado por vrios comandos de escrita e leitura. 10 format (2x,a,I) ! imprime 2 espaos em branco, uma ! string e um valor inteiro N77 o formato pode vir entre apstrofos e parnteses (esp.1, esp2,..), dentro do prprio comando de impresso ou leitura. print (esp.), var1 write (*, (esp.1,esp.2)) var1,var2 read (*, (esp.1,esp.2)) var1,var2 As strings devem vir entre apstrofos duplos (string) nesse formato.
.14.
Formato Iw[.m] Fw.d Ew.d[Ee] Gw.d[Ee] Dw.d Lw A[w] Zw_hexedit Bw[.m] Ow[.m] ENw.d[Ee] ESw.d[Ee]
Uso Valores Inteiros Valores Reais Valores Reais com expoente Mesmo que Iw[.m], Ew.d[Ee], Lw e A[w] Valores Reais de Dupla Preciso Valores Lgicos Seqncia de Caracteres Valores Hexadecimais Valores Binrios Valores Octadecimais Valores Reais em Notao de Engenharia 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. 12345 read (*,(f5.3)) a => a = 12.345
Quando o ponto existe mas no est na posio especificada, a sua posio original mantida. 12.345 read (*,(f5.4)) a => a = 12.345
A notao com zeros m s vlida quando m maior que o nmero de casas que o nmero ocuparia no formato livre. a = 555 print (i5.4),a => 0555
Nas notaes com expoente (ENw.d[Ee], ESw.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.345 b = 12345.789e6 write (*,1) a,b 1 format ( a=,e10.4e3, e b=,e10.4e3) => a=.1235E+002 e b=.1235E+011 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.
.15.
F90 os valores dos campos podem ser variveis desde que venham entre <var1>. No valido para print. a = 5 b = FORTRAN write (*,(a<a>)) b
=>
FORTR
Para valores numricos que precisam de mais casas de impresso que as indicadas no format, sero impressos somente * naquele campo. pi = 3.1416 print (1x,E7.3e2), pi print (1x,E8.3e2), pi => ******* => .314E+01
Antes ou depois de , , /, \, nH, $ ou : a vrgula opcional. real a, b character dia*20 a = 23.99 b = 55.8e-3 dia = 'Segunda-feira' write (*,'(5x,sp,e10.3e2,2x,en12.3e3)') a, b write (*,'(/2x,''hoje e '',a8)') dia
.16.
10. Arquivos
Quando se deseja trabalhar com grandes quantidades de dados, o melhor armazenlos 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 (unidade,file=nome.ext) 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 (Item 8, Leitura e Impresso), 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
.17.
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 (unidade,status=estado) ou endfile unidade onde status=estado opcional. Estado pode ser keep 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 unidade backspace unidade (volta o controle ao primeiro espao do arquivo) (volta o controle um campo no arquivo) Arquivo arqui.dat ' Qumica' ' Fsica' ' Engenharia' Arquivo arqui.out este um arquivo de sada Qumica Engenharia Qumica
Programa character *15a,b,c open(20,file='arqui.out') open(30,file='arqui.dat') read (30,*) a write(20,*) ' este um ' write(20,*) ' arquivo de ' write(20,*) ' sada ' read (30,*) b rewind 30 read (30,*) c write(20,*) a write(20,*) b,c end
.18.
10 20
10
.19.
2. Comando GO TO ou GOTO
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 10 20 30 goto 20 write (*,*) write (*,*) write (*,*) end goto 1 write (*,*) continue write (*,*) continue write (*,*) end ' linha 10' ' linha 20' ' linha 30' linha 20 linha 30 Resultado
10 1 20 2 30
linha 20 linha 30
3. Estrutura Condicional
Estrutura Condicional Simples
if (expresso de teste) comando ou if (expresso de teste) then seqncia de comandos 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.
.20.
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 then. permitido o uso de estruturas condicionais umas dento das outras.
Programa implicit integer (a-z) a=10 b=20 c=30 if (a.lt.b) then write (*,*) ' a<b' a=b+10 else write (*,*) ' a>b' b=a-5 end if if (c.ge.20) write(*,*)' c=',c, a, b end Resultado a<b c= 30 30 20
seleo n)
ou literal (somente um
caractere character*1). Caso o valor de exp. 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.
.21.
No permitida a superposio de valores. Os valores literais devem vir entre apstrofos e seus valores sero avaliados de acordo com o padro ASCII. Uma tabela com os valores ASCII pode ser encontrada no Anexo C.
Programa i=20 select case (i) case (10) write (*,*) 'a=10' case (20) write (*,*) 'a=20' case (11,19) write (*,*) 'a>11 a<19' end select end character i*1 i='h' valor_i: select case (i) case ('a','b','c') write (*,*) 'i=a ou b ou c' case ('d':'m') write (*,*) 'i esta entre d e m' case ('D':'M') write (*,*) 'i esta entre D e M' end select valor_i end Resultado a=20
i esta entre d e m
importante observar que as letras maisculas e minsculas possuem valores ASCII diferentes.
4. Estruturas 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.
.22.
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 var=n1,n2,n3 seqncia de comandos r1 continue ou N77 do var=n1,n2,n3 seqncia de comandos 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 n3 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 n3 podem ser constantes ou variveis inteiras ou reais, positivas ou negativas. Quando n3 for igual a um ele pode ser omitido.
DO WHILE (F90)
Uma forma de se usar uma expresso de teste no comando do, o uso do do while. do while(exp. teste) seqncia de comandos end do Enquanto exp. teste for verdadeira a seqncia de comandos ser executada.
Programa real*8 a,b a=0 b=0 1 if(a.lt.0) goto 2 a=cos(b) b= b+.125 write (*,*) a goto 1 2 continue end Resultado 1.000000000000000 9.921976672293290E-001 9.689124217106447E-001 9.305076219123143E-001 8.775825618903728E-001 8.109631195052179E-001 7.316888688738209E-001 6.409968581633251E-001 5.403023058681398E-001 4.311765167986662E-001 3.153223623952687E-001 1.945477079889872E-001 7.073720166770291E-002 -5.417713502693632E-002
.23.
09 10 11 12
DO Implcito (WIN)
Nos comandos read e write possvel usar uma estrutura de repetio semelhante ao DO, mas de forma implcita e mais simplificada. read(unidade,formato)(lista_de_parmetros, var=n1,n2,n3) Onde var=n1,n2,n3 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 integer a(5,3), b(3) do i=1,5 do j=1,3 a(i,j)=10*i+j b(j)=100+j**3 enddo enddo write (*,1) ((a(i,j), i=1,5) & & ,b(j), j=1,3) 1 format ( 2x,i4,' - ',i5,' - ',i4) end
11 41 12 42 13 43
.24.
IF Com Deslocamento
Uma outra maneira de se deslocar num programa, usando agora um comando if a seguinte: if (exp. numrica) r1,r2,r3 exp. numrica no pode ser complexa. r1, r2, r3 so rtulos. Se o valor de exp. numrica 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 exp. numrica 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..
.25.
.26.
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 3.14159. 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 constante1, constante2,... parameter ( constante1 = valor, constante2 = valor,...) 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 :: constante1=valor, constante2=valor,...
Programa real pi,r(3) parameter (pi=3.1459) do i=1,3 r=i**2 call area(r(i),pi) enddo end subroutine area(r,pi) real r,a a=2*pi*r print *,a return end resultado 6.291800 25.167200 56.626200
real pi,r(3),a parameter (pi=3.1459) do i=1,3 r=i**2 a=area(r(i),pi) print *,a enddo end function area(r,pi) real r,area area=2*pi*r return end
TYPE (F90)
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: type nome_type declaraes end type nome_type
.27.
nome_type o nome do bloco, e deve seguir as mesmas regras para nomes de variveis. declaraes so declaraes de variveis (tipo varivel). 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: type (nome_type) :: nome Atribuio: nome = nome_type (valor das variveis) ou nome%nome_varivel = valor
Programa type anivers character nome*10 character mes*10 integer*1 dia end type anivers type (anivers) :: helder type (anivers) :: keila type (anivers) :: carlo helder=anivers('Helder','Fevereiro',17) carlo=anivers('Carlo','Fevereiro',12) keila %nome='Keila' keila %mes='marco' keila%dia=24 write(*,*) helder%mes write(*,*) helder%nome,helder%dia write(*,*) carlo%nome,carlo%dia write(*,'(1x,a,a,i2)') keila end Resultado Fevereiro Helder 17 Carlo 12 Keila Agosto 22
DATA
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 var1/valor1/,var2/valor2/,...,varn/valorn/ ou data var1,var2,...,varn/valor1,valor2,...,valorn/ Os valores de vetores e matrizes devem ser declarados todos de uma vez, com a separao entre eles feita por vrgula.
.28.
3. Designao de Memria
COMMON
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/lista de variveis/nome2/lista de variveis2,... 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.
.29.
BLOCK DATA
As variveis declaradas em um common com nome podem receber valores iniciais de uma forma mais estruturada. No block data podem ser usados os seguintes recursos: common(com nome), parameter, data, dimension e variveis derivadas de um type. block data nome_bloco declaraes e atribuies end O nome_bloco opcional e deve seguir as mesmas regras para nomes de variveis.
4. Modularizao
INCLUDE
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.
.30.
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.
.31.
SIND (X)
real ou complexo
real*4
CSIN (X) CDSIN (X) DSIN (X) DSIND (X) ASIN (X) ASIND (X) DASIN (X) DASIND (X) COS (X)
complex*4 complex*8 real*8 real*8 real, |x| .le. 1 real |x| .le. 1 real*8 real*8 real ou complexo
COSD (X)
real ou complexo
real*4
CCOS (X) CDCOS (X) DCOS (X) DCOSD (X) AOS (X)
real*4 real*8
DACOSD (X) TAN (X) TAND (X) DTAN (X) DTAND (X) COTAN (X) DCOTAN (X)
real*8, |x| .le. 1 real real real*8 real*8 real. x no pode ser 0. real*8. x no pode ser 0.
.32.
real
real*4
real*8
real*8
real*8
real*8
real*4
real. x e no podem ambos real*4 ser 0. real*8 x e y no podem ambos ser 0. real*8 x e y no podem ambos ser 0. real real*8 real real*8 real real*8 real*8
2. Funes Genricas
Nome DPROD(A,B) EOF(UNIT) SIGN(X,Y) ISIGN(X,Y) DSIGN(X,Y) Definio a*b verifica o final da unidade unit retorna x com o sinal de y retorna x com o sinal de y retorna x com o sinal de y Parmetro real*4, real*4 integer*2 real ou inteiro inteiro real*8 Resultado real*8 logical real ou inteiro inteiro real*8
.33.
3. Exponenciais
O nmero e elevado a X (eX )
Nome CDEXP (X) CEXP (X) DEXP (X) EXP (X) Parmetro complex*16 complex*8 real*8 real, inteiro ou complexo Resultado complex*16 complex*8 real*8 mesmo que o parmetro
4. Logaritmos
Nome LOG (X) ALOG (X) DLOG (X) CLOG (X) CDLOG (X) LOG10 (X) ALOG10 (X) DLOG10 (X) Definio logaritmo natural logaritmo natural logaritmo natural logaritmo natural logaritmo natural logaritmo na base 10 logaritmo na base 10 logaritmo na base 10 Parmetro real ou complexo real*4 real*8 complex*8 complex*16 real real*4 real*8 Resultado mesmo que o parmetro real*4 real*8 complex*8 complex*16 mesmo que o parmetro real*4 real*8
5. Mximos
Nome MAX(X1,X2,..) MAX0(X1,X2,..) AMAX1(X1,X2,..) AMAX0(X1,X2,..) MAX1(X1,X2,..) DMAX1(X1,X2,..) Definio maior valor maior valor maior valor maior valor maior valor maior valor Parmetro qualquer tipo inteiro real inteiro real real*8 Resultado maio tipo entre os valores inteiro real real inteiro real*8
6. Mnimos
Semelhante as funes de mximo (MIN, MIN0, AMIN1, AMIN0, MIN1, DMIN1)
7. Restos
Resto da diviso de X por Y
Nome MOD(X,Y) AMOD(X,Y) DMOD(X,Y) Parmetro real ou inteiro real*4 real*8 Resultado real ou inteiro real*4 real*8
.34.
8. Raiz Quadrada de X
Nome SQRT(X) DSQRT(X) CSQRT(X) CDSQRT(X) Parmetro real ou complexo real*8 complex*8 complex*16 Resultado real ou complexo real*8 complex*8 complex*16
9. Truncamento de X
Nome AINT(X) DINT(X) real real*8 Parmetro real real*8 Resultado
10. Arredondamento de X
Nome NINT(X) DNINT(X) ANINT(X) IDNINT real real*8 real real*8 Parmetro inteiro real*8 real inteiro Resultado
.35.
14. Complexos
Nome IMAG(X) DIMAG(X) AIMAG(X) CONJG(X) DCONJG(X) Definio retorna a parte imaginria retorna a parte imaginria retorna a parte imaginria retorna o complexo conjugado retorna o complexo conjugado Parmetro complexo complex*16 complex*8 complex*8 complex*16 Resultado real real*8 real*4 complex*8 complex*16
15. Caracteres
Nome LEN(X) LGE(X,Y) LGT(X,Y) LLE(X,Y) LLT(X,Y) INDEX(X,Y) LEN_TRIM(X) SCAN(X,Y) VERIFY(X,Y) Definio tamanho de x compara x e y se x >= y .true. compara x e y se x > y .true. compara x e y se x <= y .true. compara x e y se x < y .true. procura y em x e retorna a posio tamanho de x menos o nmero de espaos procura um dos caracteres de y em x e retorna o nmero de ocorrncias procura um dos caracteres de y em x e retorna a posio da primeira no ocorrncia Parmetro character character character character character character character character character Resultado inteiro logical logical logical logical inteiro inteiro inteiro inteiro
.36.
Os formula:
valores
absolutos
dos
dados
complexos
so
calculados
pela
seguinte
(real )2 + (imag )2
.37.
.38.
share Expresso alfanumrica. DENYRW ignora mode=READWRITE, DENYWR ignora mode=WRITE, DENYRD ignora mode=READ, DENYNONE ignora qualquer mode, status 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
3. Escrita (WRITE)
WRITE ([UNIT=] unit [ , [{[ FMT=] format] | [ NML=] nml }] [ , ERR=errlabel] [ , IOSTAT=iocheck] [ , REC=rec] ) iolist UNIT= - Quando omitido, o primeiro valor ser o nmero da unidade (unit). Se FMT= ou NML= forem omitidos, format ou nml devem ser o segundo parmetro. unit Expresso inteira. Indica o nmero da unidade. format Expresso inteira. Indica 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.
.39.
comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de iocheck. iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do erro quando um ocorre. rec Expresso inteira. Indica a posio do arquivo onde o dado ser impresso. Somente para arquivos com access=DIRECT. iolist Lista de variveis serem impressas.
4. Leitura (READ)
READ { { format, | nml } | ([UNIT=]unit [ , [ {[FMT=] format] | [NML=]nmlspec}] [ , END=endlabel] [ , ERR=errlabel] [ , IOSTAT=iocheck] [, REC=rec])} iolist UNIT= - Quando omitido, o primeiro valor ser o nmero da unidade (unit). Se FMT= ou NML= forem omitidos, format ou nml devem ser o segundo parmetro. unit Expresso inteira. Indica o nmero da unidade. format Expresso inteira. Indica 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. endlabel Expresso inteira. Indica o rtulo de uma linha no mesmo arquivo para onde o comando vai se a marca de fim de arquivo (EOF) for encontrada. errlabel Expresso inteira. Indica 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 iocheck. iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna 1 se encontrar EOF, retorna o nmero do erro quando um ocorre. rec Expresso inteira. Indica a posio do arquivo de onde o dado ser lido. iolist Lista de variveis serem lidas.
.40.
comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de iocheck. iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do erro quando um ocorre.
.41.