inpe fortran

Upload: edguntergrass

Post on 12-Oct-2015

51 views

Category:

Documents


0 download

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.