inpe fortran
TRANSCRIPT
-
Apostila de FORTRAN
Rita Valria Andreoli
Joo Carlos Carvalho
INPE
dezembro/2001
-
2Apresentao
No documento final do I-EPGMET (Encontro dos Alunos de Ps-Graduao em Meteorologia),realizado em 2000, expressa-se claramente que os alunos gostariam de ter cursos introdutrios dosprincipais softwares e linguagens de programao utilizados pela comunidade de Meteorologia doINPE. Desde ento, essa demanda permaneceu presente, mas adormecida. Recentemente, emsetembro, com a retomada das discusses sobre a necessidade de cursos, props-se a elaborao deapostilas simples, bsicas, voltadas para o usurio que nada ou muito pouco conhece do software ouda linguagem de programao. Dessa proposta nasceu o Projeto Apostila.
O Projeto Apostila composto de 5 grupos. Cada grupo foi responsvel pela elaborao de umaapostila sobre um software ou uma linguagem de programao. Os grupos so: Rosane Chaves eDaniel Andres (Grads); Rita Valria Andreoli e Joo Carlos Carvalho (Fortran); Marcelo Zeri(Matlab); Pablo Fernandez e Emanuel Giarolla (Latex); e Hlio Camargo e Marcos Oyama (Unix).Os grupos, durante 2 meses, trabalharam intensamente (sem se descuidar das suas dissertaes eteses) para produzir as apostilas. A apostila que voc est recebendo fruto do esforo de um dosgrupos.
Gostaramos de agradecer a todos os colegas que revisaram a verso "0" das apostilas: AlexandraAmaro de Lima, Antnio Marcos Mendona, Edna Sousa, Elizabeth Reuters, Everson dal Piva, JosFrancisco de Oliveira Jnior, Marcos Yoshida, Maurcio Bolzan, Patrcia Moreno Simes, PauloMarcelo Tasinaffo, Raimundo Moura, Rodrigo de Souza e Wantuir Aparecido de Freitas. Assugestes, crticas e os comentrios apresentados foram de grande valia. Muito obrigado!
Gostaramos, tambm, de agradecer a Ansio Moliterno por disponibilizar a rea pblica da fractalpara os arquivos de exemplos das apostilas.
As apostilas no tm o objetivo de competir com os cursos que so oferecidos pelo CPTEC ouINPE, mas complementar. A idia que o usurio, aps estudar a apostila, possa caminharsozinho, consultando manuais ou os colegas; ou seja, torne-se independente. A apostila umaponte, no o fim. Recomenda-se aos leitores da apostila que faam os cursos oferecidos peloCPTEC ou INPE: sempre temos algo a aprender! Alm disso, no futuro, as apostilas podem servirde base para cursos ministrados por alunos - instrutores.
Espera-se que, no futuro, outros Projetos Apostila sejam realizados, melhorando e atualizando asapostilas existentes. Alm disso, outras apostilas (p.ex. Fortran 90), podero ser elaboradas.
Boa leitura!
-
3Instalao dos exemplos
Pea a algum do Suporte (ou algum colega que conhea um pouco de UNIX) para instalar osexemplos na sua rea. As instrues so as seguintes:
1. Transfira (via ftp, como usurio annimo) o arquivo instala_apostila da rea pblica dafractal ( /pub/software/apostila ) para o home do usurio.(em negrito est o que voc deve digitar; a tecla Enter) nevasca:/home/fulano>ftp fractal Name (fractal:fulano):anonymous Guest login ok... Password:[email protected] #ATENO: no ir aparecer na tela! Guest login ok... ftp>cd pub/software/apostila ftp>asc ftp>get instala_apostila ftp>quit nevasca:/home/fulano>
2. Abra a permisso de execuo de instala. nevasca:/home/fulano>chmod u+x instala_apostila
3. Execute instala_apostila (e entre com as informaes pedidas durante a instalao). nevasca:/home/fulano>instala_apostila
________________________________________________________________________________
Explicao dos exemplos
A apostila de programao em FORTRAN contm vrios exemplos, que so disponibilizados aousurio. Esses exemplos, esto na forma original apresentada na apostila, e encontram-se no arquivoprog_for.tar.
1) adiciona.f - este programa soma nmeros de 1 a100, utilizando o comando DO, encerrado pelocomando enddo;
2) adiciona1.f - executa a mesma operao do programa anterior, mas utiliza o comandoCONTINUE, para encerrar o lao do comando DO;
3) array2.f - calcula mdia e desvio padrode uma srie de dados fornecida a partir do tecaldo;4) calcula_pi.f - calcula o valor de pi, utilizando uma funo intrnseca;5) contagem.f - faz contagem regressiva a partir de um nmero fornecido via teclado;6)contagem1.f - permite observar quando esto sendo executadas as primeira e segunda intreaes
na estrutura de laos aninhados (comando DO);7) equacao.f - calcula a equao de segundo grau;8) equao1.f - calcula a equao de segundo grau, e suas razes, utilizando a estrutura do IF
aritmtico;9) equacao2.f - calcula a equao de segundo grau, e suas raizes utilizando o comando IF
expandido.10) ler_arq.f - l sries temporais a partir de arquivos em disco, faz a soma e gera um arquivo de
sada;11) notas.f - fornece um conceito, dependendo, da nota fornecida via teclado;
-
412) rad.f - calcula o nvel de radiao utilizando o comando DO WHILE;13) radiacao.f - mostra um exemplo de formatao;14) raio.f - calcula a rea do circulo de raio r15) read.f - l um arquivo do disco no formatado, e escreve com um formato especfico16) sqrt.f - calcula raiz quadrada de um nmero, utilizando uma funa intrnseca17) teste.f - exemplo simpes utilizando a estrura do IF lgico simples18) soma1.f, soma2.f, soma3.f, soma4.f e soma5.f - so exemplo simples, utilizando alguns
comandos bsicos.19) os arquivos *.dat - so sries temporais, utilizadas em alguns exemplos.
-
5SUMRIO1.INTRODUO 1 Formatao Compilao e execuo
2. CONCEITOS BSICOS 2 Comando Stop Comando End Comando Pause Comando Parameter
3. DECLARAO DE VARIVEIS 5 Tipos de Variveis Inteiras (INTEGER) Reais (REAL) Alfanumricas (CHARACTER) Lgicas (LOGICAL)
4. OPERADORES 5 Atribuio Operadores Literais Operadores Aritmticos Operadores Relacionais Operadores Lgicos Prioridade
5. FUNES INTRNSECAS 9 Funes Trigonomtricas Outras Funes
6. COMANDOS DE CONTROLE 10 Comando IF Comando DO Comando DO WHILE
7. COMANDOS E FORMATOS DE ENTRADA E SADA 18 Comando READ Comandos WRITE e PRINT Canais de entrada e sada - Teclado e monitor - Arquivos em disco: Comandos OPEN e CLOSE Formatos
8. REFERNCIAS BIBLIOGRFICAS 24
-
11. INTRODUO
O FORTRAN (FORmula TranSLATION) uma linguagem de alto nvel, desenvolvida entre 1954e 1958 por John Backus e colaboradores. Como o prprio nome diz, ele permite uma traduo quasedireta de frmulas, por meio de uma simbologia de variveis e operadores algbricos, sendo assimpor excelncia uma linguagem voltada para problemas que possam ser formuladosmatematicamente, em particular nos campos da fsica, da engenharia, da estatstica e da prpriamatemtica. Apesar de ele permitir a elaborao de cdigos extremamente sofisticados para aresoluo de problemas de grande complexidade, o amplo sucesso do FORTRAN nos meiosacadmicos e cientficos deve-se ao uso de uma terminologia simples (em ingls) - OPEN, READ,STOP, etc - aliada codificao de cima para baixo (top-down approach), linha por linha,aproximando-se bastante do procedimento manual para a resoluo desses problemas. Assim, aidia expressar de maneira simples o problema a ser resolvido. Vamos comear com um exemplosimples.
Imagine que o nosso problema fazer a soma de trs valores. O primeiro passo , ento, tentardescrever as etapas a serem seguidas para obter essa soma. A etapas a serem seguidas seriam: ler osvalores, somar os valores, imprimir seu resultado e finalizar. Vamos agora tentar descrever esseproblema em linguagem Fortran, seguindo essas etapas.
__________________________________________________________________
C23456789 !linha de comentrio program soma !inicia o programa chamado soma integer k,n,m !declara que k,n,m so variveis inteiras n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m k=m+n !soma n e m, e o resultado armazenado em k print*,k !escreve na tela a varivel k stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
Como podemos notar acima, uma estrutura bsica que inclui o comando program (d um nome aoprograma), declarao de variveis, clculo, e os comandos stop e end, seguida para a elaboraode um programa em Fortran . Alm disso, podemos notar que alguns critrios de formatao sousados para editar o programa. O programa pode ser editado em qualquer editor de texto (como,nedit, textedit, etc).
Formatao
Os seguintes critrios devem ser seguidos para se escrever um programa em FORTRAN no modode formulrio fixo:
colunas 1 a 5: so usadas escrever os rtulos (label) ou nmeros de comando. Estes nmerosdevem ser inteiros e estar totalmente contido nestas colunas. No podem se repetir e noprecisam estar em ordem crescente. Sero usados para que outros comandos possamidentificar aquela linha;
-
2 coluna 6: qualquer caractere diferente de 0 (zero) nesta coluna indica que o que vem a seguir continuao da linha anterior ou da ltima linha que no seja um comentrio (prximoitem); podem existir at 19 linhas de continuao;
colunas 7 a 72: comandos; colunas 73 a 80: ignoradas pelo compilador; como as palavras - comando em FORTRAN so todas em ingls, letras acentuadas, c
cedilha () e til NO so aceitas.
Conhecendo, agora, a conveno de colunas utilizada para a elaborao de um programa emFORTRAN, tente editar o programa dado na introduo, em seu editor de texto de preferncia. Como programa j editado a partir da stima coluna (no esquea), salve seu programa com a extenso .f(por exemplo soma1.f). O prximo passo a compilao e execuo desse programa.
Compilao e Execuo
A compilao de um programa em FORTRAN numa workstation, sob unix feita no terminal, viateclado, no se usa o mouse. No prompt do terminal digite:
f77 -o .f
Assim, considerando seu programa soma1.f, a compilao ser:
f77 o soma1.exe soma1.f
Quando voc executar o comando de compilao ir aparecer no prompt a seguinte mensagem:
soma1.f: MAIN soma:
Se houver erro em seu programa, aparecer mensagem de erro no terminal e no ser criado oexecutvel.
A execuo ser realizada a seguir. No prompt do terminal digite:
ou seja,
soma1.exe
Agora que j conhece os comandos de compilao e execuo faa um teste. Para verificar isto,inclua em seu programa um erro. Voc pode introduzir um outro operador alm da soma para geraresse erro (k=*n+m). Agora s compilar novamente o programa e ver a mensagem de erro.
Seguindo nosso exemplo 1 (soma1.f), alguns conceitos bsicos so apresentados, a seguir. Elesreferem-se a estrutura bsica.
2. CONCEITOS BSICOS
1. Comentrios: no so interpretados pelo computador; um bom programa deve contermuitos para que fique o mais claro possvel. Em FORTRAN a letra c ou oscaracteres * e ! na primeira coluna indicam que toda a linha um comentrio. Na
-
3linha de comentrio permitido o uso de qualquer caracter, especial ou no. Noteque no programa soma1.f, a primeira linha que define as colunas inicia-se com aletra c. Muitos comentrios tambm so colocados em cada linha, aps o caracter !.
2. Constantes: Numricas: podem conter qualquer valor real, inteiro ou complexo. A
parte decimal separada da inteira por um ponto.. Os zeros antes edepois do ponto decimal podem ser omitidos, se no foremsignificativos. O expoente decimal indicado pela letra e ou E, edeve vir entre o nmero e seu expoente sem o uso de espaos entreeles. Nmeros negativos assim como a parte exponencial quando fornegativa deve vir precedida do sinal menos -. O sinal + opcionalem ambas as partes. Os nmeros imaginrios devem vir entreparnteses e a parte real deve ser separada por uma vrgula da parteimaginria.
Ex: 0 , -5 , 4 (inteiras) 2.5 , 1.0E+05 , -2.55E-02 (reais) 5+2i (5.0,2.0) (complexa)
Alfanumricas: (so as strings, seqncias de letras e/ou nmeros)podem conter qualquer seqncia de caracteres. Deve vir entre aspas "" ou apstrofos . As aspas tm preferncia sobre os apstrofos;portanto, um valor literal pode conter apstrofos, desde que seu valorvenha entre aspas. No permitido o uso de caracteres especiais eletras acentuadas.
3. Maisculas e Minsculas: o FORTRAN no faz qualquer distino entre letrasmaisculas e minsculas. permitido inclusive o uso do nome da varivel escrita deformas diferentes no mesmo programa. EX.: VAR = var = Var.
4. Os programas podem conter no incio o seu nome (program nome_do _programa), edevem terminar com a palavra end. Outra forma de parar o programa, e esta podeser usada em qualquer parte dele, usando a palavra stop. O programa terminarindependentemente de haver mais comandos na seqncia.
COMANDO STOP termina a execuo do programa. Embora no seja comum, ele podeaparecer no meio do programa.
COMANDO END - indica o final do programa devendo ser obrigatoriamente a sua ltima linha.
COMANDO PAUSE interrompe temporariamente a execuo do programa, que retornada apartir daquele ponto assim que o usurio fornecer um comando adequado.Esse comando pode ser includo no exemplo anterior para verificarmos seu uso.
-
4__________________________________________________________________
C23456789 !linha de comentrio program soma !inicia o programa chamado soma integer k,n,m !declara que k,n,m so variveis inteiras n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m pause digite a letra c para continuar k=m+n !soma n e m, e o resultado e armazenado em k print*,k !escreve na tela a varivel k stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
COMANDO PARAMETER
Este comando define um nome para uma constante. A diferena entre um valor com parameter euma varivel comum que com parameter o valor no pode ser modificado em nenhuma parte doprograma ou ser lido atravs de um comando de leitura read. Vamos ento introduzir o comandoparameter em nosso programa soma1.f e definir um segundo programa (soma2.f)__________________________________________________________________
C23456789 program soma !inicia o programa chamado soma parameter(raio=3) !define um nome simblico para uma constante integer k,n,m !declara que k,n,m so variveis inteiras integer pi !declara que o valor de raio inteiro n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m k=m+n+pi !soma n , m e raio, e o resultado armazenado em k print*,k !escreve na tela a varivel k stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
Um outro programa considerando o comando parameter, mostrado abaixo (raio.f)__________________________________________________________________
c O programa calcula a area do circulo com raio r program circle real r, area, pi parameter (pi = 3.14159) write (*,*) 'Give radius r:' !escreve na tela o valor de r read (*,*) r !l o valor de r area = pi*r*r !calcula a rea e atribui o valor em area write (*,*) 'Area = ', area stop end________________________________________________________________________________
-
5Como j vimos acima, sempre declaramos que tipo de variveis estamos utilizando. Assim, umadescrio dos tipos de variveis feita. Em seguida so apresentados os operadores aritmticos.
3. DECLARAO DE VARIVEIS
As variveis podem ser inteiras, reais, alfanumricas ou literais. A declarao de uma varivel devevir antes que ela seja usada, atravs dos comandos de especificao explcita, tais como: integer,real, complex, character. Se isto no ocorrer, o compilador assumir as variveis que comeam comas letras I at N como inteiras (INTEGER*4) e todas as outras como reais (REAL*4). Isso chamado declarao implcita. Quando no se deseja declarar implicitamente nenhuma varivel usa-se o comando implicit none .
Para se declarar variveis que sejam matrizes e vetores deve-se indicar suas dimenses logo aps onome da varivel; entre parnteses, e separadas umas das outras por vrgula. Ex.: a(4,3) indica umamatriz a de 4 linhas por 3 colunas.
Tipos de Variveis:
Inteiras (INTEGER): so aquelas s quais se atribuem valores inteiros.
Reais (REAL): so aquelas s quais se atribuem valores reais.
Alfanumricas (CHARACTER): so as palavras ou expressesCHARACTER NOME*w - w representa o nmero mximo de caracteres que a varivel podeconter dentro do programa.
Lgicas (LOGICAL): As variveis lgicas so nomes aos quais se atribuem valores de constanteslgicas. Assim, podem assumir os valores .TRUE. (VERDADEIRO) ou .FALSE. (FALSO) , ousomente T e F.
4. OPERADORES
Atribuio
A varivel ou identificador que estiver esquerda do sinal de atribuio = recebe o valor daexpresso, constante ou varivel que estiver direita. Veja que em nosso exemplo (soma1.f) asvariveis m, n e k recebem valores atravs desse operador.
Operadores Literais
Uma funo til para variveis literais a concatenao, ou a juno de duas ou mais palavras. EmFORTRAN a concatenao feita pelo operador //.
Ex:a = meteorb = ologiac = a//b => c = meteorologia
-
6Operadores Aritmticos
Executam operaes aritmticas comuns.
FORTRAN MatemticaTradicional
Significado
+ + Soma- - Subtrao* X Multiplicao/ Diviso
** ap Potenciao
Dois operadores no podem aparecer lado a lado. Ex: A*-B(errado) ; A*(-B) (certo).Quando uma varivel inteira recebe o resultado de uma diviso com resto, este resto desprezadoou seja o valor truncado. Alguns exemplos de expresses aritmticas so:
C = A**2 + B**2D = E**(1/2)q=(a+b)/(c+d)
Uma observao importante, que o quociente entre dois nmeros inteiros resulta sempre numinteiro mais prximo; igual ou menor ao valor verdadeiro, pelo processo de truncamento puro esimples. Assim, quando consideramos uma expresso do tipo D=E**(1/2), o resultado da diviso(1/2) ser 0 (zero). Para contornar esse problema, escrevemos os valores da diviso como reais,acrescentando um ponto aps cada nmero da diviso; a expresso torna-se:
D = E**(1./2.)
Operadores Relacionais
Comparam variveis, constantes ou expresses e retornam .TRUE. ou 1 se a comparao forverdadeira, .FALSE. ou 0 se a comparao for falsa.
FORTRAN MatemticaTradicional
Significado
.LT.(less than) < MENOR QUE.LE.(less than or equal to) MENOR OU IGUAL QUE
.EQ.(equal to) = IGUAL A.NE.(not equal to) DIFERENTE DE.GT.(greater than) > MAIOR QUE
.GE.(greater than or equal to) MAIOR OU IGUAL QUE
Exs: A.NE.B NOME.EQ.JOAO B**2-4.*A*C .LT. 0.
-
7Operadores Lgicos
So usados quando necessrio mais de uma condio relacional ou quando preciso inverter seuresultado. Alguns exemplos da estrutura bsica so mostrados.
FORTRAN Significado.AND. Juno.OR. Disjuno
.NOT. Negao
Ex: L1 .AND. L2 ; (A .LT. B) .AND. (C .GT. B)
Dois operadores lgicos e/ou relacionais no podem aparecer lado a ladoX .NOT. .EQ. Y (errado) ; X .NE. Y (certo)
PrioridadeOperador 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. As expresses so calculadasde dentro para fora.
(5o) (6o) (2o) (4o) (8o) Ex: (A + B - C * ( X - Y **2 ) / 3.0 ) * Z + W (3o) (1o) (7o)
Com o conhecimento dos tipos de variveis e operadores aritmticos podemos incorporar novoscomandos ao nosso programa inicial. Tente incluir em seu primeiro programa outras operaes. Noexemplo abaixo, a soma de variveis reais e a concatenao de strings so includas (exemplo3,soma3.f).
-
8________________________________________________________________
C23456789 program soma !inicia o programa chamado soma integer k,n,m !declara que k,n,m so variveis inteiras real a,b,c !declara que as variveis a,b,c so reais character*2 estado !declara que estado string com 2 caracteres character*3 codigo !declara que estado string com 3 caracteres character*5 tudo !declara que estado string com 5 caracteres n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m k=m+n !soma n e m, e o resultado armazenado em k a=2.5 !atribui o valor 2.5 a varivel a b=1.0 !atribui o valor 1.0 a varivel b c=a+b !soma a e b, e o resultado armazenado em c print*,k,c !escreve na tela a varivel k e c estado = SP ! atribui o string SP varivel estado codigo=01a ! atribui o string 01a varivel cdigo tudo= estado//codigo !concatena estado e cdigo e atribui a tudo print*, tudo !escreve na tela a varivel tudo stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
O exemplo seguinte (equacao.f) faz a resoluo de uma equao de 2o.__________________________________________________________________
C234567C este programa calcula equacao de segundo grau program equacao !inicia o programa equao integer b,a,c !declara que as variveis a,b,c so inteiras real delta a=4 b=5 c=1 delta=b**2-4.0*A*C !calcula a equao e resultado atribudo a delta write(*,*)delta !escreve na tela o valor de delta stop end________________________________________________________________________________
Tente, agora, montar alguns programas simples.
5. FUNES INTRNSECAS
Existem vrias funes predefinidas em FORTRAN, que podem ser usadas em qualquer parte doprograma. Aqui algumas dessas funes so apresentadas.
-
9Funes Trigonomtricas
Nome Definio Tipo deArgumento
Tipo daFuno
SIN (x) Seno (radianos). Se x forcomplexo, a parte real assumida como valor emradianos.
Real oucomplexo.
REAL*4
ASIN (x) Arcoseno (radianos).Retorna valores na faixa[- /2, /2 ]
Real, |x| .le. 1 REAL*4
COS (x) Coseno (radianos) Se xfor complexo, a partereal assumida comovalor em radianos.
Real oucomplexo
REAL*4
ACOS (x) Arcocoseno (radianos) )Retorna valores na faixa[ 0, ]
Real, |x| .le. 1 REAL*4
TAN (x) Tangente (radianos) Real REAL*4ATAN (x) Arcotangente (radianos).
Retorna valores na faixa[- /2, /2 ]
Real REAL*4
SINH (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
Nome Definio Tipo deArgumento
Tipo daFuno
ALOG10 (x) Logaritmo de x na base 10 Real RealALOG (x) Logaritmo neperiano de x (x > 0) Real RealEXP (x) o nmero e (base dos logaritmos
neperianos) elevado a xReal Real
ABS (x) valor absoluto de x Real RealIABS (x) valor absoluto de x Inteiro InteiroIFIX (x) Converso de real para inteiro,
truncandoReal Inteiro
FLOAT (x) Converso de inteiro para real Inteiro RealDBLE (x) Converte para dupla preciso Real Real
(duplapreciso)
CMPLX (x) Converte para o tipo complexo Real Complexo
-
10
SIGN (x,y) Fornece valor positivo de x se y 0 e negativo de x se y < 0
Real Real
MOD (x,y) resto da diviso de x por y Inteiro InteiroAMOD (x,y) resto da diviso de x por y Real RealSQRT (x) raiz quadrada de x (x 0) Real Real
Como us-las? Nos exemplos a seguir mostramos dois exemplos simples. Um calcula o valor de (calcula_pi.f) e o outro a raiz quadrada de um nmero qualquer (sqrt.f).__________________________________________________________________C234567c Calcular o nmero pi.c Pi o arco cujo cosseno -1. program p_calcpi real pi pi=acos(-1.0) !calcula o valor de pi utilizando a funo acos write(*,*) 'Pi = ',pi stop end
__________________________________________________________________
C Este programa calcula a raiz quadrada de um numeroc utilizando a funcao intrinseca SQRT program funcoes implicit none real x, y print *,'entre com um numero real' read *, x y=sqrt(x) !calcula a raiz quadrada de x e armazena em y print *,'a raiz quadrada do numero dado ', y stop end________________________________________________________________________________
6.COMANDOS DE CONTROLE
Como j foi dito, uma das caractersticas da linguagem FORTRAN o processamento de cima parabaixo, linha por linha. Entretanto, essa ordem pode ser alterada quando utilizamos algumascondies para que os clculos sejam realizados. Isso pode ser feito utilizando o comando IF.
Estrutura do IF
O IF (se) utilizado quando queremos optar por vrias alternativas dependendo do resultado oudo dado fornecido. H duas formas de sintaxe mais comuns:
IF com uma alternativa (estrutura condicional simples) A sintaxe do comando :
-
11
IF (condio) then Bloco 1 end if
Neste caso, se a condio for verdadeira, o bloco1 executado. Caso seja falsa, ele pula e prosseguecom o programa. Vamos voltar ao nosso primeiro exemplo e incluir uma condio para que eleexecute a soma (exemplo, soma4.f).
________________________________________________________________________________
C23456789 program soma !inicia o programa chamado soma integer k,n,m !declara que k,n,m so variveis inteiras n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m if(m .ne. 0)then !se o valor de m for diferente de zero, ento k=m+n !soma n e m, e o resultado e armazenado em k endif !finaliza o bloco print*,k !escreve na tela a varivel k stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
IF com duas alternativas (estrutura condicional composta) - Aqui, se a condio for verdadeira,o bloco1 executado; se no, o bloco2 que ser executado. A sintaxe do comando :
IF (condio)then Bloco1 else Bloco2 end if
Como ficaria agora nosso exemplo? ( soma5.f)________________________________________________________________________________
C23456789 program soma !inicia o programa chamado soma integer k,n,m !declara que k,n,m so variveis inteiras n=1 !atribui o valor 1 varivel n m=3 !atribui o valor 3 varivel m if(m .ne. 0)then !se o valor de m for diferente de zero, ento K=m+n !soma n e m, e o resultado armazenado em k else !se a condio no for verdadeira k=n !o valor de n atribudo a k endif !finaliza o bloco print*,k !escreve na tela a varivel k stop !para a execuo do programa end !fim do programa soma________________________________________________________________________________
-
12
IF lgico simples - executa ou no o comando a sua frente (na seqncia, na mesma linha)dependendo de sua condio. Este comando pode ser de qualquer tipo, atribuio, escrita, leitura(teste.f). A sintaxe nesse caso :
IF (condio) comando
________________________________________________________________________________
C234567 program teste real x,y x=5 y=4 if(x .gt. y) y=x !se valor de x maior que y, o valor de x atribudo a y print*,x,y stop end________________________________________________________________________________
IF aritmtico
Uma maneira de se deslocar num programa, usando uma expresso no lugar de uma varivel aseguinte:
IF (exp. Numrica) r1,r2,r3Exp. numrica no pode ser complexa. r1, r2, r3 so rtulos. Se o valor de exp. numrica formenor que zero o comando vai para a linha com o rtulo (label) r1, quando for igual a zero ocomando vai para linha com o rtulo r2 e quando for maior que zero vai para r3. Retornando aoexemplo equacao.f , e podemos incluir o comando if aritmtico (exemplo equacao1.f)________________________________________________________________________________
C234567C este programa calcula equacao de segundo grau program equacao !inicia o programa equao real b,a,c,x, x1,x2 !declara que as variveis a,b,c so inteiras real delta a=4 b=5 c=1 delta=b**2-4.0*A*C !calcula a equao; resultado atribudo a delta write(*,*)delta !escreve na tela o valor de delta if (delta) 10, 20, 30 !se delta menor que zero executa a linha comc label 10, se delta igual a zero executa a linhac com label 20, se delta maior que zero executa ac linha com label 30
10 print*,delta < 0 ; no real rootsgo to 100 !a execuo desviada para o comando stop
20 x=-b/(2.0*a)print*,delta = 0 ; two equal real roots
-
13
print *, x1=x2= ,xgo to 100 !a execuo desviada para o comando stop
30 sd=sqrt(delta)x1=0.5*(-b-sd)/ax2=0.5*(-b+sd)/aprint*,delta > 0; two different real roots print*, x1= ,x1print*, x2= ,x2
100 stop end
________________________________________________________________________________
Alm do comando If aritmtico, neste programa ns usamos, pela primeira vez, a formatao doslabel. Note que os nmeros 10, 20 e 30 esto definidos entre as colunas de 1 a 5. O uso dosapstrofos tambm foi includo quando desejamos escrever na tela uma mensagem.
IF expandido neste caso, vrias condies so testadas. A estrutura a sintaxe :
IF (condio ) then bloco1 else if (condio2) then bloco2 : else if (condio n) then blocon else bloco (n+1) end if
Um exemplo neste caso pode ser visto abaixo (notas.f)
________________________________________________________________________________
c Exemplo de programa usando o comando IF em sua formac expandidac23456 program resultadonota implicit none !todas as variveis devem ser declaradas explicitamente real nota !declara a varivel nota como real print *, 'qual foi a nota da sua prova?' !escreve na tela a nota read *, nota !l a nota if (nota .ge. 9.00) then !se a nota for maior que 9, ento executa oc comando a seguir; se no, testa a nova condio print *,'muito bem!' else if (nota .ge. 7.00) then print *,'voce foi bem!' else if (nota .ge. 5.00) then print *,'voce tem que melhorar um pouco!' else
-
14
print *,'farelo!!!!!!' end if !finaliza o bloco if stop end________________________________________________________________________________
Um segundo exemplo rescrevermos o programa equacao1.f utilizandoa estrutura de if estendido (equacao2.f).________________________________________________________________________________
C234567C este programa calcula equacao de segundo grau program equacao !inicia o programa equao real b,a,c,x, x1,x2 !declara que as variveis a,b,c so inteiras real delta a=4 b=5 c=1 delta=b**2-4.0*A*C !calcula a equao; resultado atribudo a delta write(*,*)delta !escreve na tela o valor de delta if (delta .lt. 0)then !se a condio1 for verdadeira, ento executa ac linha abaixo e finaliza o bloco if
print*,delta < 0 ; no real roots
else if(delta .eq. 0)then !se a condicao1 for falsa a condio2c testada; se for verdadeira, executa osc comandos das linhas seguintes e finaliza.c Se for falsa, uma condio3 testada
x=-b/(2.0*a)print*,delta = 0 ; two equal real rootsprint *, x1=x2= ,x
else if (delta .gt. 0)then !testa a terceira condio sd=sqrt(delta)
x1=0.5*(-b-sd)/ax2=0.5*(-b+sd)/aprint*,delta > 0; two different real roots print*, x1= ,x1print*, x2= ,x2
endif !finaliza o bloco if stop end________________________________________________________________________________
COMANDO DO (faa)
Quando o mesmo comando precisa ser executado vrias vezes at que se atinja uma certa condioou um nmero certo de repeties, o melhor usar as estruturas de repetio. Estas estruturas sobem simples e podem economizar vrias linhas de comando.
-
15
Laos simples
do i = ibeg,iend,incr (comandos a serem executados) end do
i uma varivel inteira que recebe inicialmente o valor ibeg, a seqncia de comandos se repete,e o valor de i aumenta de incr a cada vez que o comando volta para a linha do do. A repetios para quando o valor de i maior que iend.A palavra chave end do pode ser escrita como enddo. ibeg, iend e incr podem ser constantesou variveis inteiras ou reais, positivas ou negativas. Quando incr for igual a 1 ele pode seromitido. O exemplo a seguir pode ajudar a entender o comando do (adiciona.f).________________________________________________________________________________
C234567c somar os nmeros inteiros de 1 a 100. program p_add100c inicializa um acumulador. ia=0 !atribui o valor zero para varivel que ir acumular os valores do ic=1,100,1 !para os valores de 1 a 100 com intervalo de 1, faz ia=ia+ic !adiciona o valor de ic soma (ia) end do !encerra o loop write(*,*) ia stop end________________________________________________________________________________
Outra forma para encerrar um lao do comando DO , utilizando o comando CONTINUE. Aestrutura bsica do comando : do n i = 1,10 (comandos do bloco) n continuen label (nmero inteiro) referente ao comando a CONTINUE que identifica o final da seqnciade comandos a ser executada vrias vezes. O exemplo anterior utilizando o comando continue ser(adiciona1.f):________________________________________________________________________________
c234567c somar os numeros inteiros de 1 a 100. program p_add100c inicializa um acumulador. ia=0 !atribui o valor zero para varivel que ir acumular os valores do 10 ic=1,100,1 !para os valores de 1 a 100 com intervalo de 1, faz ia=ia+ic !adiciona o valor de ic soma (ia) 10 continue !enquanto ic
-
16
Outro Exemplo: (contagem.f)________________________________________________________________________________c este programa faz contagem regressiva a partir de um numerofornecido program contagem ! incio do programa implicit none ! todas variveis devem ser declaradas explicitamente integer interv, tempo, inicio ! declara as variveis do tipo inteiras parameter (interv=-1) ! a constante -1 representada pela varivel interv print *, 'entre com um numero inteiro' ! escreve na tela tudoc que estiver entre aspas read *, inicio ! l o numero digitado e o atribui a varivel inicio print *, 'comeou a contagem regressiva' do 10 tempo=inicio, 1, interv ! executa o comando dentro do laoc at que a varivel inicio seja igual a l print *, tempo 10 continue print *, 'bummmm!!' stop end ! fim do programa_____________________________________________________________________________________________Laos aninhadosA situao em que temos um DO dentro de outro DO chamado de laos aninhados, ou seja, o laointerno ser executado o nmero de vezes determinado pelo lao externo. Este tipo de estrutura fundamental quando trabalhamos com matrizes. No exemplo abaixo (contagem1.f) o comando nointerior do lao ser executado 50 vezes.
do i=1,10 !(externo)! do j=1,50 !(interno)! (comando) end do !(interno)! end do !(externo)!________________________________________________________________________________c este programa permite observar quando est sendo!c executado o primeiro e o segundo do! program loop
implicit none integer m, n parameter (m=3, n=2) integer i, j print *,' i j ' do 10 i=1,m ! inicio do lao externo print *, 'primeiro do ', i do 20 j=1,n ! inicio do lao interno print *, 'segundo do ',i,j 20 continue ! fim do lao interno 10 continue ! fim do lao externo stop end________________________________________________________________________________
-
17
COMANDO "DO WHILE"
Este comando utilizado para executar um bloco repetidas vezes enquanto a condio forverdadeira. A partir do momento em que a condio passa a ser falsa, este sai do lao continuando aexecuo do restante do programa. a sintaxe do comando :
DO WHILE (condio) (comandos do bloco)
END DO
O programa abaixo mostra a utilizao do comando DO WHILE (rad.f).________________________________________________________________________________
!Este programa calcula o nivel de radiao e o grau de segurana!!o programa utiliza o comando do while, que utilizado para!executar um bloco repetidas vezes enquanto a condio for!verdadeira. A partir do momento em que a condicao passa a ser!falsa, este sai do loop continuando a execucao do restante do!programa. program radiacao implicit none !todas as variveis devem ser declaradas explicitamente real radseg, fatseg, nivrad, radmin ! declarao das variveis do tiporeais parameter (radseg=0.466, fatseg=10.0) !atribui nomes s variveis integer dia ! declarao das variveis do tipo inteira dia=0 print *,'entre com o nivel de radiao do dia' read *, nivrad print *, 'n.dias radiacao ' radmin=radseg/fatseg do while (nivrad .gt. radmin) ! executa as instrues dentro do lao ate queac condio seja satisfeita if (nivrad .gt. radseg) then print *,dia,nivrad,' inseguro' else print *, dia, nivrad, ' seguro' end if dia=dia+3 nivrad=nivrad/2.0 end do ! fim do comando do while end________________________________________________________________________________
7. COMANDOS E FORMATOS DE ENTRADA E SADA
Os comandos de entrada e sada, na sua forma mais simplificada, possuem a seguinte estrutura:
COMANDO READ permite a entrada de dados via teclado ou de um arquivo em disco.
-
18
read (unidade, formato) lista_de_parmetros
unidade: se nmero inteiro, especifica o canal (arquivo em disco) se * ,indica entrada de dados via teclado
formato: se nmero inteiro, especifica rtulo de formato se * ,indica formato livre________________________________________________________________________________
c23456 program ler integer a,b,c print*,entre com os valores de a b c read(*,*)a,b,c sum=a+b+c stop end________________________________________________________________________________
COMANDO WRITE permite a sada de dados para o monitor ou para um arquivo em disco.write (unidade, formato) lista_de_parmetros
As mesmas especificaes para unidade e formato, dadas acima, so utilizadas para o comado write.Podemos notar que, nos exemplos utilizados anteriormente, esses comandos eram expressosconsiderando a entrada de dados via teclado e sada na tela. Ou seja, nossa unidade e formato eramdefinidos por *.________________________________________________________________________________
c23456 program escrever integer a,b,c print*,entre com os valores de a b c read(*,*)a,b,c sum=a+b+c write(*,*)a,b,c,sum stop end________________________________________________________________________________
Uma outra maneira de escrever os arquivos de sada atravs do comando PRINT . Essecomando permite a sada de dados exclusivamente para o monitor. Sua sintaxe :
Print formato, lista_de_parmetrosOnde lista_de_parmetros representa os dados que sero impressos, e devem vir separados porvrgula. esta lista pode conter variveis ou expresses alfanumricas; estas ltimas devem vir entreapstrofos .
-
19
________________________________________________________________________________c23456 program ler integer a,b,c print*,entre com os valores de a b c read(*,*)a,b,c sum=a+b+c print*,sum =,sum stop end________________________________________________________________________________
As unidades 6 e * se no forem definidas dentro do programa, sero consideradas como oterminal (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 como o terminal.
CANAIS DE ENTRADA E SADA
- Teclado e monitor
No comando READ(*,formato), os dados de entrada devem ser digitados no teclado, conforme aespecificao do formato, se for o caso; e separados por vrgula ou espao em branco, para formatolivre.
Nos comandos WRITE(*,formato) e PRINT, os dados sero exibidos no monitor conforme aespecificao de formato, se for o caso; ou em formato aleatrio, escolhido pelo computador, paraformato livre.
O exemplo a seguir calcula a mdia e desvio padro a partir de dados fornecidos via teclado(array.f)________________________________________________________________________________
c este programa calcula a media e o desvio padrao de umac serie de dados fornecidos a partir do teclado program conjloop integer maxitm parameter (maxitm = 8) integer i real x(maxitm), averag, stdev, sum, sumsqr print *, 'entre', maxitm, 'numeros, um por linha:' do 10 i=1, maxitm read *, x(i) 10 continue sum = 0.0 sumsqr = 0.0 do 20 i=1,maxitm sum = sum + x(i) sumsqr = sumsqr + x(i) ** 2 20 continue averag=sum/real(maxitm) stdev=sqrt(sumsqrt/real(maxitm) - averag ** 2)
-
20
print * print 15, 'o valor medio e', averag print 15, 'o desvio padrao e', stdev 15 format (1x, a, f8.1) print * print *, 'tabela de diferena entre x(i) e a media' print 25, 'i', 'x(i)', 'diferena' 25 format (1x, a4, 3x, a8, 3x, a14) do 30 i=1, maxitm print 35, i, x(i), x(i)-averag 35 format (1x, i4, 3x, f8.1, 3x, f14.1) 30 continue stop end________________________________________________________________________________
- Arquivos em disco
Como especificado anteriormente, o 1o argumento nos comandos READ ou WRITE especifica ocanal de entrada/sada. Assim, se a unidade for um nmero (inteiro), feita uma associao entrea lista de variveis a ser lida e o nome do arquivo correspondente atravs dos comandos OPEN eCLOSE.
COMANDO OPEN (abrir)
OPEN (UNIT=nmero da unidade,FILE=nome_arquivo,STATUS=tipo_arquivo)Ex:
OPEN (UNIT=1,FILE=dados,STATUS=OLD)OPEN (UNIT=2,FILE=dados,STATUS=NEW)
O nmero da unidade deve ser um nmero inteiro no associado a um outro arquivo. O tipo de arquivo deve ser NEW para um arquivo de sada novo , OLD para um
arquivo j existente, ou UNKNOWN para arquivo desconhecido. Em geral no se usao NEW porque os compiladores do mensagem de erro quando o arquivo j existe evoc quer ignorar o que foi escrito anteriormente nesse arquivo. Ento se usa oUNKNOWN para arquivos novos tambm.
COMANDO CLOSE (fechar)
Um arquivo pode tambm ser fechado. Isto far com que o FORTRAN coloque uma marca de fimde arquivo naquele ponto, esta marca pode ser identificado por outro comando ou funo .
close (unidade,status=estado)ouendfile unidade
Onde status=estado opcional. Estado pode ser keep que mantm o arquivo na memria (esta a opo assumida quando status=estado omitida), ou delete que apaga o arquivo da memria.Arquivos fechados podem ser reabertos em qualquer parte do programa. O exemplo a seguir(ler_arq.f) mostra a leitura e escrita de arquivos em disco.
-
21
________________________________________________________________________________
c234567 program ler_arqc este programa le series temporais real var1(104),var2(104),x(104),y(104),z(104)c*************************************************************c arquivos de entradac************************************************************* open(10,file='serie1.asc',status='old') open(11,file='serie2.asc',status='old')c*************************************************************c arquivo de saidac************************************************************* open(12,file='soma.asc',status='new')c************************************************************c leitura de dadosc************************************************************ do l=1,104 read(10,*)var1(l) !ler a var1 contida no arq referente a unidade 10
read(11,*)var2(l) !ler var2 contida no arq referente na unidade 11 x(l)=var1(l) !atribui o valor da varivel para x
y(l)=var2(l) !atribui o valor da varivel para y z(l)=x(l)+y(l)
write(12,*)z(l) !escreve o arq_saida na unidade 12
enddo close(10)
close(11) close(12) stop end________________________________________________________________________________
FORMATOS
A maioria dos exemplos mostrados consideram que os arquivos de entrada e sada tm umaformatao livre, definida pelo caracter *. um recurso til para se evitar erros. Os formatosservem para que os dados sejam impressos ou lidos de uma forma especifica, determinado peloprogramador. Os formatos so compostos por uma seqncia de especificaes que determinarocomo os dados sero processados. Cada uma dessas especificaes devem vir separadas porvrgulas. Pode-se ainda imprimir constantes numricas e alfanumricas, sendo que esta ltima devevir entre apstrofos .
A forma de se declarar os formatos a seguinte:
r format (especificao1, especificao2, ...)
-
22
Onde r um numero inteiro, e representa o rtulo do format. Um mesmo format pode ser usadopor vrios comandos de escrita e leitura. Strings devem vir entre apstrofos duplos (string) nesseformato.
Formato UsoImm: nmero de posies reservadas,inclusive para o sinal
Valores InteirosEx: valor formato 12345 I5
Fm.nm: nmero total de posiesreservadas, incluindo o ponto decimaln: nmero de casas decimais
Valores ReaisEx: 1234.5678 F9.4
Em.nm: nmero total de posies,inclusive o sinal e o ponto decimal damantissa, smbolo E, e o sinal e osdois dgitos do expoenten: nmero de casas decimais damantissa.
Valores Reais com expoenteEx: 0.1234E+04 E10.4
mX m nmero de espaos em branco
Deixa m espaos em branco
A[m]m: nmero de caracteres
Seqncia de CaracteresEx: meteorologia A(12)
Caso as strings sejam maiores que o espao reservado elas, sero tomados apenas os m primeiroscaracteres. Se forem menores, elas sero alinhadas a direita e os outros espaos deixados em branco.
Nome = belo horizonteread (*, (a10)) nomewrite (*, (a15)) nome
=> belo horiz=> belo horiz
A seguir, dois exemplos ( read.f e radiacao.f, respectivamente) sero apresentados considerandoalgumas especificaes de formato.
________________________________________________________________________________
c23456 program readc Este programa le os dados do arquivo "sen_cos.dat" quec possui formatacao livre e imprime para a tela usando oc comando FORMAT integer nmax, u parameter (nmax=1000, u=20) real x(nmax), y(nmax), z(nmax) open (u, FILE='sen_cos.dat', STATUS='OLD') !abre o arquivo de c
dados
read(u,*) n !l o numero de pontos
-
23
if (n.GT.nmax) then !se n>nmax ento, executa os comandos do if write(*,*) 'Erro: n = ',n,'e maior que nmax =', nmax stop !para a execuo endif !finaliza o bloco if
do 10 i= 1, n !para valores de 1 a n, faa read(u,*) x(i), y(i), z(i) !l os valores de x, y,z 10 enddo close (u) !fecha a unidade u
do 20 i= 1, n !para valores de 1 a n, faa write(*,100) x(i), y(i), z(i) !escreve os valores de x, y, z parac o formato definido 20 enddo 100 format (3(F10.4)) !especificao do formato. Neste caso, o nmero c
3 representa o nmero de vezes que ac especificao de formato deve se repetir stop end________________________________________________________________________________
!programa que mostra um exemplo de formatacao usando o comandoformat program radiacao!este programa calcula o grau de contaminao de uma certa!!area e o tempo necessario para que esta que com um grau!!de segurana! real radseg, fatseg parameter (radseg=0.466, fatseg=10.0) integer dia real nivrad, radmin dia=0 print *,'entre com o nivel de radiao do dia' read *, nivrad print 15, 'n. dias', 'radiacao', 'condicao' 15 format (1x,a7,2x,a11,2x,a8) radmin=radseg/fatseg do while (nivrad .gt. radmin) if (nivrad .gt. radseg) then print 25, dia, nivrad, 'inseguro' 25 format (1x, i7, 2x, f11.7, 2x, a8) else print 35, dia, nivrad, 'seguro' 35 format (1x, i7, 2x, f11.7, 2x, a8) end if dia = dia + 3 nivrad = nivrad/2.0 end do end_____________________________________________________________________________________________
-
24
REFERNCIAS BIBLIOGRFICAS
Esta apostila foi preparada levando em considerao, o objetivo principal, que fornecer subsdios um pblico sem nenhum conhecimento prvio do assunto; razo pela qual a abordagem iniciada a partir de conceitos bsicos da linguagem FORTRAN, tais como as convenes para adefinio de variveis e as regras para operaes aritmticas simples. Alm disso, teve-se apreocupao de reunir um contedo mnimo que permitisse ao usurio a aquisio de informaessuficientes para a elaborao de um programa em FORTRAN de complexidade simples a mdia.No obstante, acreditamos que outros tpicos, como, funes e subrotinas, no apresentados nestaapostila, podero ser teis na gerao de programas mais sofisticados, como tambm nacompreenso de cdigos escritos por outros autores. Assim, algumas referncias so apresentadas,pois acreditamos que essas podero servir de complemento ao material reunido nesta apostila, emparticular, para aqueles interessados em aplicaes mais especficas de programao emFORTRAN.
1. Shibata, C. S. Fortran Bsico: Notas de aula referentes ao curso organizado pelo setor detreinamento. INPE. Primeira edio, julho de 1996.
Esta apostila serve como guia introdutrio ao uso de Fortran, com uma abordagem ampla doassunto. um material compreensvel para um usurio no especializado, e suficientemente bompara a resoluo de problemas simples.
2. Farrer, H. ; Becker, C. G.; Faria, E. C.; Campos, F.F.; Matos, H. F.; Santos, M. A.; Maia, M. L.Programao estruturada de computadores: FORTRAN ESTRUTURADO. Editora GuanabaraKoogan S.A., p.194, 1992.
um livro bastante claro e didtico, e contm vrios exemplos e exerccios propostos.
3. Hehl, M. E. Linguagem de programao estruturada: FORTRAN 77. Editora McGraw-Hill,1987.
um livro no muito didtico, indicado para usurios que j possuem algum conhecimento prviosobre o assunto.
4. Press, W. H. et al. Numerical Recipes in Fortran: the Art of Scientific Computing.Cambridge Univ. Press, Cambrigde, 1986.
Livro em nvel mais avanado. Traz um breve desenvolvimento terico do problema, seguido docdigo numrico correspondente.