Apost Fortran90

Embed Size (px)

DESCRIPTION

Introdução à programação em Fortran 90.

Citation preview

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. Introduo

    1.1 Formato do programa fonte

    No Fortran 90 no existe uma coluna especfica para iniciar o programa. Pode-se comear

    a escrever um programa a partir da coluna 1, e esta pode se extender at a coluna 132. Alm

    disto, os caracteres em branco so irrelevantes em qualquer lugar do cdigo, exceto quando

    estiverem sendo utilizados entre apstrofes. Neste caso cada caracter em branco, ser avaliado na

    composio final do string.

    Mais de um comando pode aparecer em uma linha simples. O separador de linhas padro

    do Fortran 90 o ; (ponto e vrgula). Multiplos ; em uma linha, com ou sem brancos, so

    considerados como um separador simples. O final de uma linha considerado um separador

    tambm, mas um ; no final de uma linha no considerado um comentrio e considerado

    como um separador simples.

    Uma linha com um ! em qualquer parte da mesma, considerado um comentrio (

    direita do !).

    Exemplos:

    x=1.0; y=2.3

    ! Se um ; for includo no final de uma linha, sem nenhum comando aps o mesmo, o ;

    desconsiderado.

    z=9.3;

    ! Consecutivos ; so considerados como um nico.

    Todos os programas fontes em Fortran 90, devem iniciar com a seguinte linha:

    program

    Esta linha indica que o programa principal ser iniciado. O deve

    ser substitudo pelo nome que o autor deseja para o seu cdigo. Este nome utilizado para

    referncias internas no programa, sendo que o nome externo (arquivo) do programa pode ser

    completamente diferente.

    Para encerrar um programa, deve-se colocar a seguinte linha:

    end program

    Introduo 1-1

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Esta construo dever aparecer em todas as rotinas do programa. O

    no obrigatrio. Caso seja omitido, a palavra chave program, tambm

    deve ficar de fora. Abaixo, um exemplo tpico de um programa em Fortran 90:

    1. program first 2. implicit none 3. write (*,*) Hello, world 4. end program first

    O programa acima, quando executado, escrever apenas a mensagem Hello, world, na

    tela do computador.

    1.2 Entrada e sada padro

    O Fortran 90 possui trs comandos de entrada/sada de dados padro. O comando de

    leitura :

    read (*,*) Onde , so as variveis que devero receber seus valores via teclado.

    O comando read ser apresentado em detalhes no captulo 10. A declarao de variveis ser

    apresentada no captulo 2.

    O comando read no aceita que sejam impressas mensagens junto com a leitura.

    Quaisquer mensagens que o programador quiser, dever imprimir em separado com os comandos

    print ou write.

    Para a escrita, existem dois comandos:

    write (*,*) , O objetivo do comando write, escrever no dispositivo de sada padro (vdeo). Com o

    comando write, possvel escrever-se mensagens ou ento o contedo de variveis declaradas

    no programa. As mensagens so colocadas entre apstrofes. Exemplos de mensagens:

    write (*,*) Teste do dia

    write (*,*) valor da varivel

    write (*,*) Matriz lida:

    write (*,*) , No comando acima, observa-se a presena de dois asteriscos:

    Introduo 1-2

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    O primeiro informa ao compilador em qual dispositivo de sada padro devero ser mandados os dados ou mensagens presentes no comando. Os comandos de entrada e sada

    em arquivo sero discutdos em detalhes no captulo 10. A sada padro representada pelo

    asterisco (*).

    O segundo informa ao compilador se os dados a serem impressos possuem um formato especfico ou se esto em formato livre, que representado pelo (*). Os formatos de entrada

    e sada so discutidos no captulo 11.

    Exemplos:

    write(*,*) Teste de impresso write(5,*) Gravando no arquivo de nmero 5, com varivel: ,var write(*,100) x,y,z

    No exemplo acima, as variveis x, y e z sero impressas conforme o formato descrito na

    linha 100.

    write(10,F15.10) a No exemplo acima, a varivel a ser impressa no arquivo apontado por 10, com o

    formato F15.10. Os formatos de impresso de dados sero discutidos no captulo 11.

    Quando se quiser imprimir as informaes no dispositivo de sada padro (vdeo), pode-se informar apenas o formato de sada que se quer. Exemplo:

    write *,teste write *,Valor da varivel: ,a 1.3 Declarao implicit none

    Cada varivel ou constante utilizado em um programa, possui um tipo e um nome. A

    declarao implicit none especifica que todas as variveis que forem utilizadas dentro do

    programa devem ser declaradas. O exemplo abaixo mostra um programa em Fortran 90 que l

    um valor real e o imprime:

    Introduo 1-3

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program le_valor 2. implicit none 3. real :: a 4. write (*,*) Informe o valor de a: 5. read (*,*) a 6. write (*,*) Valor lido: ,a 7. end program le_valor

    Se no fosse especificada a declarao implicit none, a varivel a assumiria o tipo real.

    O Fortran nas suas verses anteriores possuia uma declarao implcita de tipos. Na faixa I-N,

    todas as variveis eram inteiras e as demais, reais.

    Importante salientar, a posio onde aparece a declarao implicit none. Ela dever ser

    a Segunda linha de programa a ser especificada. Antes dela deve aparecer apenas a linha

    indicando qual o nome do programa em Fortran 90.

    1.4 Continuao de linha

    No Fortran 90 o (&) usado como o smbolo de continuao de linha. Se o ltimo

    caracter de uma linha for um &, o comando continuada na primeira linha que no houver

    comentrio, com a colocao de um outro & no incio da linha. Os & utilizados como

    smbolos de continuao no so considerados como parte do comando. Os & podem ser

    utilizados, alm de continuidade de uma linha, como continuao de uma constante caracter.

    Caso o & deva ser considerado como parte do texto ou string, ento deve-se repetir a sua

    ocorrncia.

    Exemplo 1:

    nota_do_aluno = nota_um + & & nota_2+nota_3

    Exemplo 2:

    ! Como constante caracter:

    nome_da_empresa = Joo &&

    & filhos

    ! O resultado acima : nome_da_empresa=Joo & filhos

    Introduo 1-4

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1.5 Exerccios resolvidos

    1. Escrever um programa em Fortran 90, que imprime a seguinte mensagem:

    Teste de programa.

    1. program second 2. implicit none 3. write(*,*) Teste de programa 4. stop 5. end program second

    2. Escrever um programa que leia um valor real, e imprime a sua potncia de 2.

    1. program pot2 2. implicit none 3. real :: num 4. write(*,*) Informe um valor: 5. read(*,*) num 6. write(*,*) A potncia de dois do valor : ,2**num 7. stop 8. end program pot2

    Na linha 6, observa-se a presena de dois asteriscos (*). Estes dois asteriscos representam a potncia em Fortran 90.

    3. Escrever um programa que l um valor e calcula a sua raiz quadrada:

    1. program le_val 2. implicit none 3. real :: valor 4. write(*,*) Informe um valor: 5. read(*,*) valor 6. write(*,*) A potencia de 2 de ,valor, eh: ,valor**0.5 7. stop 8. end program le_val

    Na linha 6 do programa acima, observa-se que o valor est elevado a uma potncia 0.5, o que representa o clculo da raiz quadrada de um nmero. A linha 6 poderia

    ser reescrita da seguinte maneira:

    6. write(*,*) A potncia de 2 de ,valor,eh: ,sqrt(valor)

    Onde sqrt, uma funo intrnseca que calcula a raiz quadrada de um nmero real.

    Introduo 1-5

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4. Escrever um programa que l dois valores reais, e imprime a multiplicao

    entre os dois.

    1. program le_dois 2. implicit none 3. real :: a 4. real :: b 5. write(*,*) Informe os dois valores: 6. read(*,*) a 7. read(*,*) b 8. write(*,*) A multiplicao dos dois eh: ,a*b 9. stop 10. end program le_dois

    No exerccio acima, as linhas 6 e 7 podem ser comprimidas em uma linha s, como no exemplo abaixo:

    read(*,*) a,b

    Neste caso, o Fortran agir de duas formas distintas: Na primeira, ele aguardar que o usurio informe dois numeros via teclado, separados por vrgula, ou ento

    dever ser informado um valor, pressionando-se a tecla e ento digita-

    se o segundo valor.

    Comentrios gerais: Nos programas acima, pode-se observar algumas coisas em comum. Como visto anteriormente, todos possuem em comum as duas linhas

    iniciais e as duas linhas finais, mudando apenas o nome do programa em questo.

    Um outro detalhe a ser salientado diz respeito a declarao de variveis, que dever

    aparecer antes de qualquer comando executvel do Fortran 90.

    Introduo 1-6

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1.6 Exerccios propostos:

    1. Escrever um programa que imprime a seguinte mensagem: Segunda-feira

    um bom dia para o trabalho.

    2. Escrever um programa que l um valor real, e imprime a metade dele.

    3. Escrever um programa que l dois valores, e imprime a diferena entre os

    dois.

    4. Escrever um programa que l dois valores, e imprime o primeiro elevado na

    raiz quadrada do segundo.

    5. Escrever um programa que l dois valores, e imprime a raiz quadrada da

    diviso do primeiro pelo segundo.

    6. Escrever um programa que l um ngulo, e calcula o seno, o cosseno e a

    tangente do mesmo. Lembrete: as funes intrnsecas so: sin, cos, tan.

    Importante salientar que os ngulos so em radianos.

    Introduo 1-7

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    2. Tipos de dados

    2.1 Introduo

    Fortran foi projetado para dar aos cientistas e pesquisadores uma forma fcil de resolver

    problemas usando computadores. As declaraes de variveis, e os comandos da linguagem, no

    geral, se parecem como frases em ingls.

    2.2 Conjunto de caracteres

    No Fortran, os elementos bsicos, ou conjunto de caracteres, so as 26 letras do alfabeto,

    os 10 nmeros arbicos, o underscore _ e um conjunto de caracteres especiais apresentados na

    Tabela 2-1. Dentro da sintaxe da linguagem, no existem diferenas entre letras maisculas e

    minsculas. As letras, os numerais, e o underscore so conhecidos como caracteres

    alfanumricos. Neste documento as palavras chaves e funes intrnsecas do fortran sero

    escritas em negrito, funes ou atributos, que no necessariamente precisam aparecer, entre

    colchetes [ ] e por fim, as variveis utilizadas nos exemplos e programas, sero escritas em

    itlico.

    Tabela 2-1 Caracteres especiais do Fortran 90

    Caracter Nome Caracter Nome

    = Igual : dois pontos

    + Soma branco

    - Subtrao ! Exclamao

    * Multiplicao Aspas

    / Diviso % Percent

    ( Parnteses esquerdo & E comercial

    ) Parnteses direito ; ponto e vrgula

    , Vrgula ? marca de questo

    . ponto decimal ** Potncia

    $ smbolo corrente Apostrofe

    A tabela 2-2 apresenta a relao de operadores relacionais do Fortran 90. Na coluna 1, o

    significado do operador, na coluna 2, sua representao com caracteres, e na coluna 3, sua

    Tpos de dados 2-8

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    representao com smbolos. Qualquer uma das duas representaes vlida, com a diferena

    que a de smbolos mais moderna que a com caracteres, e a representao em caracteres

    considerada obsoleta.

    Significado Caracteres Smbolos

    Maior que .GT. >

    Menor que .LT. <

    Igual a .EQ. ==

    Maior ou igual .GE. >=

    Menor ou igual .LE.

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    O tipo de dados inteiro possui valores que representam um subconjunto dos inteiros

    matemticos.

    Programa exemplo:

    1. program inteiro 2. implicit none 3. integer :: x 4. ! O valor a ser digitado, no poder conter ponto (.). Caso isto acontea, vai gerar um 5. ! erro de execuo no programa, devido a entrada indevida. 6. read (*,*) x 7. write (*,*) Valor lido: ,x 8. end program inteiro

    2.5 Real

    O tipo de dado real, composto de 4 partes, assim dispostas: Uma parte inteira, com ou

    sem sinal, um ponto decimal, uma parte fracionria, e um expoente tambm com ou sem sinal.

    Uma das duas ou ambas partes inteira e fracionria devem estar presentes. Se a parte exponencial

    estiver presente, ela vai consistir da letra E seguida de um inteiro com ou sem sinal. Um exemplo

    :-10.6E-11, que significa -10.6 x 10-11 , 1, 2.9321321, 3.1415926.

    A declarao do tipo real, idntica ao do tipo inteiro:

    real :: varivel

    Programa exemplo:

    1. program var_real 2. implicit none 3. real :: a 4. a=10 5. write (*,*) Valor de a: ,a 6. end program var_real

    2.6 Double precision

    Uma declarao double precision define as variveis de tipo real, com preciso dupla.

    Sua declarao idntica aos nmeros reais:

    double precision :: varivel

    Este tipo de declarao considerada obsoleta. A declarao de nmeros com dupla

    preciso deve ser feita da seguinte forma:

    Real(kind=8) :: varivel

    Exemplos de nmeros com dupla preciso:

    Tpos de dados 2-10

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1

    2.0D+05

    0.31415d+01

    Programa exemplo:

    1. program var_double 2. implicit none 3. double precision :: b 4. b=15e93 5. write (*,*) Valor de a: ,b 6. end program var_double

    2.6.1 Complexo

    Um nmero complexo, formado por dois nmeros reais. O primeiro deles, representa a

    parte real do nmero, e a segunda parte, representa a parte imaginria. Quando uma varivel

    complexa declarada, as duas partes da mesma, recebem o mesmo tipo.. Os operadores

    relacionais so: ==, /=. Os operadores aritmticos especificam a aritmtica complexa. Os

    operadores relacionais comparam operandos para produzir resultados lgicos. O resultado de

    uma operao aritmtica com variveis complexas uma varivel complexa. Se uma das

    variveis for real ou inteira, o resultado final ser complexo. Exemplos: (2,3), (-1,0), (0,-4.32)

    A declarao da varivel complexa, segue o mesmo estilo das duas anteriores:

    Complex :: varivel

    Programa exemplo:

    Tpos de dados 2-11

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program var_complexa 2. implicit none 3. complex :: a 4. complex :: b 5. complex :: c 6. ! Atribui o valor 5-5i varivel a 7. a=(5,-5) 8. ! b recebe o valor: (-2,3.5). A entrada dos dados, deve ser feita exatamente 9. ! como apresentado. 10. read (*,*) b 11. c=a*b 12. write (*,*) O valor de c eh: ,c 13. ! a sada ter como resultado: -7,5 - 27,5 i 14. end program var_complexa

    2.7 Character

    O tipo padro consiste de um conjunto de caracteres contidos em um par de apstrofes ou

    aspas. Os caracteres no esto restritos ao conjunto de caracteres padro definido na seo (2.2).

    Qualquer caracter que possa ser representado, pode ser permitido, exceto os caracteres de

    controle tais como o return. Podem ser maisculas ou minsculas em um processador que

    suporte ambos. Os apstrofes ou as aspas servem como delimitadores e no so considerados

    como parte integrante do conjunto. Exemplos:

    bom Dia

    BRASIL

    Fortran 90

    A declarao do tipo character, possui 3 formas que so consideradas corretas:

    1. character*NNN :: varivel

    2. character (len=NNN) :: varivel

    3. character(NNN) :: varivel

    Onde NNN o tamanho do conjunto de caracteres que se quer definir.

    A leitura de dados do tipo caracter observa o mesmo formato dos tipos anteriores. Basta

    que se declare uma varivel do tipo character, e o compilador ler a mesma diretamente do

    teclado. Se for informado um string maior que o declarado, ser truncado. Se for informado um

    string menor que o declarado, ser preenchido com brancos direita do string.

    Programa exemplo:

    Tpos de dados 2-12

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program le_character 2. implicit none 3. character(10) :: str_read 4. read (*,(A10)) str_read 5. write (*,*) Valor lido: ,str_read 6. end program le_character

    Observa-se na linha 4 do programa acima, que o comando read, possui o seguinte formato: (A10). Este formato est indicando para o Fortran 90, que ele dever ler

    um tipo caracter, e este dever ter no mximo 10 caracteres. Caso esta informao

    no seja dada, e o formato for livre (*), o programa ler normalmente as

    informaes, com a diferena, neste caso que se a tecla de espao for pressionada,

    o compilador entender apenas a primeira parte e tudo o que for digitado aps a

    tecla de espao ser desconsiderado.

    Exemplo:

    1. program le_character_com_espao 2. implicit none 3. character(N=20) :: nome 4. read(*,*) nome 5. write(*,*) Nome lido: , nome 6. stop 7. end program le_character_com_espao

    2.8 Logical

    O tipo logical define variveis lgicas. Uma varivel lgica s pode assumir dois valores.

    Verdadeiro e falso. A representao dos dois estados possveis de uma varivel lgica so: .True.

    para verdadeiro, e .False. para falso.

    Declarao:

    Logical :: variveis

    Tpos de dados 2-13

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    2.9 Exerccios resolvidos

    1. Qual ser o contedo de a, b, c, d aps as operaes com as linhas 5 at 9.

    1. integer :: a 2. integer :: b 3. integer :: c 4. integer :: d 5. a=13 6. b=12 7. c=a/b 8. a=a*c 9. d=a*b/(c+a)

    Resposta:

    Linha 7: c=13/12 1 Linha 8: a=13*c 13 Linha 9: d=13*12/(1+13) 11

    2. Qual ser o contedo de x e y depois das seguintes operaes:

    1. real :: x 2. real :: y 3. real :: z 4. real :: t 5. t=15.25 6. z=17.12 7. x=t*z 8. y=sqrt(1/x) 9. z=y*x

    Resposta:

    Linha 5: t=15.25

    Linha 6: z=17.12

    Linha 7: x=15.25*17.12 261.08 Linha 8: y=(1/261,08)**.5 0.061889 Linha 9: z=16.157970

    Tpos de dados 2-14

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    3. Verifique o resultado das seguintes atribuies

    1. integer :: i 2. real :: x 3. complex :: c 4. complex :: d 5. integer :: e 6. real :: f 7. i=10 8. x=12.5 9. c=(-10,10) 10. d=i 11. e=x 12. f=c

    Resposta:

    Linha 10: d=i (Complexo=inteiro) (10.000000,0.000000) Linha 11: e=x (inteiro=real) 12 Linha 12: f=c (real=complexo) -10 Escrever um programa que l 2 valores e calcula a rea do quadrado.

    1. program quadrado 2. implicit none 3. real :: a 4. real :: b 5. real :: area 6. write (*,*) Informe o valor de a: 7. read (*,*a 8. write (*,*) Informe o valor de b: 9. read (*,*b 10. area=a*b 11. write (*,*) Area do quadrado: ,area 12. end program quadrado

    2.10 Exerccios propostos

    1. Escrever um programa que l um nmero inteiro e o imprime.

    2. Escrever um programa que l 3 numeros reais, e calcula a rea do retngulo dado pelas 3

    medidas.

    3. Escrever um programa que l um nmero complexo, e calcula as potncias de 2, 3 e 4, e as

    imprime.

    Tpos de dados 2-15

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4. Escrever um programa que l os dados de um funcionrio (nome, salrio por hora, total de

    horas trabalhadas, e calcula e imprime o seu salrio final).

    5. Escrever um programa que l o nome e as trs notas no curso. Para o clculo da mdia final,

    dever ser utilizada a seguinte formulao: MF=3/(1/N1+1/N2+1/N3).

    Tpos de dados 2-16

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    3. Funes intrnsecas para tipos de dados

    3.1 Introduo

    As funes intrnsecas so aquelas que j esto definidas na padronizao da linguagem.

    Neste captulo, so apresentadas as associadas aos tipos intrnsecos.

    3.2 Funes intrnsecas associadas ao tipo inteiro

    3.2.1 dfloat

    Converte um tipo inteiro para real com dupla preciso.

    Formato:

    r=dfloat(i)

    i (inteiro - entrada) - Argumento a ser convertido para real.

    r (real - sada) - Real de preciso simples com um valor igual a j

    Exemplo:

    1. program testa_dfloat 2. implicit none 3. double precision :: convertido 4. integer :: inicial=100 5. convertido=dfloat(inicial) 6. write (*,*) O nmero convertido : ,convertido 7. end program testa_dfloat

    3.2.2 float

    Converte um tipo inteiro para um tipo real.

    Formato:

    r=float(i)

    i (inteiro - entrada) - Argumento a ser convertido para real.

    r (real - sada) - Real de preciso simples com um valor igual a i

    Comandos de controle de fluxo 3-17

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Exemplo:

    1. program testa_float 2. implicit none 3. float :: convertido 4. integer :: inicial=10 5. convertido=float(inicial) 6. write (*,*) O nmero convertido : ,convertido 7. end program testa_float

    3.3 Funes intrnsecas associadas ao tipo real

    3.3.1 aint

    Trunca o argumento de entrada

    Formato:

    r=aint(a)

    a (entrada - real) - o argumento a ser truncado.

    Retorno:

    Valor de a truncado

    Exemplo:

    1. program ex_aint 2. implicit none 3. real :: a 4. real :: b 5. real(kind=8) :: c 6. a=10.5 7. b=aint(a) 8. c=aint(a) 9. write (*,*) A: ,a 10. write (*,*) B: ,b 11. write (*,*) C: ,c 12. end program ex_aint 13. Resultado: 14. A: 10.500000 15. B: 10.000000 16. C: 10.000000000000

    3.3.2 anint

    Arredonda o argumento para o nmero mais prximo de mquina.

    Comandos de controle de fluxo 3-18

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Formato:

    r=anint(a)

    Parmetros:

    a (entrada - real) - Argumentos a serem arredondados.

    Retorno:

    Tipo real. O nmero mais proximo de a

    Exemplo:

    1. program ex_anint 2. implicit none 3. real :: a 4. real :: b 5. real :: c 6. a=-13.23 7. b=15.61 8. c=10.50 9. write (*,*) 'A: ',a,' = ',anint(a) 10. write (*,*) 'B: ',b,' = ',anint(b) 11. write (*,*) 'C: ',c,' = ',anint(c) 12. end program ex_anint 13. Resultado: 14. A: -13.230000 = -13.000000 15. B: 15.610000 = 16.000000 16. C: 10.500000 = 11.000000

    3.3.3 dble

    Converte o argumento de entrada para dupla preciso. O argumento de entrada pode ser

    inteiro, real ou complexo. Nos dois primeiros casos, a resposta um nmero com preciso dupla,

    e no caso complexo, o resultado de preciso simples.

    Formato:

    r=dble(a)

    Parmetros:

    a (entrada - inteiro, real ou complexo) - Pode ser um array. o argumento que ser

    convertido para o tipo real(8) ou dupla preciso.

    Retorno:

    real(8) ou dupla preciso com um valor igual a a . Se a for complexo, o resultado tem um

    valor igual a parte real de a .

    Exemplo:

    Comandos de controle de fluxo 3-19

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program testa_dble 2. implicit none 3. integer :: a=5 4. real :: b=10 5. complex :: c=(1,5) 6. write (*,*) 'Inteiro : ',dble(a) 7. write (*,*) 'Real : ',dble(b) 8. write (*,*) 'Complexo: ',dble(c) 9. end program testa_dble

    3.3.4 ifix

    Converte um argumento real, de preciso simples em um inteiro por truncamento.

    Formato:

    r=ifix(a)

    Parmetros:

    a (entrada - real) - Pode ser um array. o argumento a ser convertido para inteiro por

    truncamento.

    Retorno:

    Inteiro. o valor de a truncado.

    Observaes:

    A tabela abaixo lista as funes intrnsecas ifix para truncamento. Estas funes no podem ser passadas como argumentos.

    Tabela 3-1

    Funo Tipo de argumento Tipo retornado

    hfix (a) Integer, real, or complex integer(2)

    ifix (a) Real(4) integer(4)

    jfix (a) Integer, real, or complex integer (4) Exemplo:

    1. program testa_ifix 2. implicit none 3. real :: a=10.5 4. write (*,*) 'Ifix de : ',a,' = ',ifix(a) 5. end program testa_ifix

    3.3.5 int

    Converte um argumento de entrada para um inteiro por truncamento.

    Comandos de controle de fluxo 3-20

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Formato:

    r=int(a [,kind])

    Parmetros:

    a - (entrada, inteiro, real ou complexo) - Pode ser um array. Contm o valor a ser

    convertido para inteiro por truncamento.

    Kind (opcional, entrada, inteiro) - Se for especificado, determina o tipo do parmetro do

    resultado.

    Retorno:

    Retorna o valor de a, com o tipo inteiro, truncado. Se kind for especificado, retornar no

    tipo especificado, caso contrrio o resultado ser o inteiro padro (integer(4)). Se a um inteiro,

    int (a) retorna um inteiro. Se a real, int(a) retorna a parte inteira de a . Se a for complexo,

    int(a) retorna o valor truncado da parte real de a .

    A tabela apresenta os valores retornados a partir do argumento de entrada das funes

    idint e int.

    Tabela 3-2

    Funo Argumento Retorno

    Idint (a) real (8) integer (4)

    int (a) Integer, real, ou complex integer (4)

    int1 (a) Integer, real, ou complex integer (1)

    int2 (a) Integer, real, ou complex integer (2)

    int4 (a) Integer, real, ou complex integer (4) Exemplo:

    Program testa_int

    a=5.3

    write (*,*) Valor de a: ,int(a)

    Resultado:

    5

    3.3.6 mod

    Retorna o resto de uma diviso.

    Formato:

    r=mod(a,p)

    Comandos de controle de fluxo 3-21

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Parmetros:

    a (entrada, inteiro ou real) - Pode ser um array. Se a entrada for um array, deve ser do

    mesmo tipo de p. o dividendo.

    p (entrada, inteiro ou real) - Possui o mesmo tipo de a . Pode ser um array. Se for um

    array, deve ser do mesmo tipo que a . o divisor.

    Retorno:

    do mesmo tipo que a . Se p for diferente de zero, o resultado equivalente a: a-

    int(a/p)*p. Se p=0 o resultado indefinido.

    Observaes:

    Amod e dmod usam o mesmo tipo de formula que mod. A funo mod difere da

    modulo, pelo fato de ser uma funo resto, no uma funo modulo. A tabela abaixo lista as

    diferentes entradas da mod e suas correspondentes sadas. Todas as funes podem ser passadas

    como argumentos para funes externas. O argumento das funes deve observar a tabela

    abaixo.

    Tabela 3-2

    Funo Tipo de argumento Valor de retorno

    Amod (a, p) Real(4) real(4)

    Dmod (a, p) Real(8) real(8)

    Mod (a, p) integer(4) integer(4) Exemplos:

    1. program testa_modulo 2. implicit none 3. integer :: i 4. real :: r 5. r=mod(23,15) ! Retorna 8.00000 6. i=mod(14,7) ! Retorna 0 7. i=mod(-15,7) ! Retorna -1 8. end program testa_modulo

    3.3.7 real

    Converte um argumento para o tipo real.

    Formato:

    r=real(a [,kind])

    Comandos de controle de fluxo 3-22

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    a (entrada, inteiro, real ou complexo). Pode ser um array. o argumento a ser convertido

    para um tipo real.

    kind (opcional, entrada, inteiro). Se for especificado, determina o tipo parametrizado do

    resultado real.

    Retorno:

    Se a um inteiro ou real, o resultado real com o tipo determinado por kind. Caso no

    seja especificado o retorno ser kind (real(4)). Se a complexo, o valor retornado a parte real

    de a, ou um array de tais valores. O resultado real com kind do tipo especificado ou do mesmo

    tipo de a, se a for omitido.

    3.3.8 Scale

    Multiplica um nmero real por 2 elevado em uma determinada potncia.

    Formato:

    r=scale(x,j)

    Parmetros:

    x (entrada, real) - Pode ser um array. Se for um array, dever ter o mesmo formato de i.

    o nmero que escalonado por uma potncia de 2.

    J (entrada, inteiro) - Pode ser um array. Se for um array, deve ser do mesmo formato que

    x. o expoente de 2 no fator de escala.

    Retorno:

    Mesmo tipo que x e igual a x**(2**j), ou um array de tais valores.

    Exemplo:

    Comandos de controle de fluxo 3-23

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program ex_scale 2. implicit none 3. real,dimension(2) :: a 4. real,dimension(2) :: b 5. integer,dimension(2) :: j 6. a(1)=10 7. a(2)=5 8. j(1)=2 9. j(2)=3 10. b=scale(a,j) 11. write (*,*) 'Array de entrada : ',a(1:2) 12. write (*,*) 'Array de potencias: ',j(1:2) 13. write (*,*) 'Array solucao : ',b(1:2) 14. end program ex_scale 15. Resultado: 16. Array de entrada : 10.000000 5.000000 17. Array de potencias: 2 3 18. Array solucao : 40.000000 40.000000

    3.4 Funes intrnsecas associadas ao tipo complexo

    3.4.1 aimag/dimag

    Retorna a parte imaginria de um nmero complexo.

    Formato:

    r=aimag(z)

    z (entrada - complexo). Pode ser um array. Nmero cuja parte imaginria retornado.

    Retorno:

    real. Possui o mesmo tipo de z e igual a sua parte imaginria, ou um array de tais

    valores.

    Exemplo:

    complex :: a

    a=(5,-3)

    write (*,*) Parte complexa: ,aimag(a)

    Resultado:

    -3

    3.4.2 cmplx/dcmplx

    Converte seu argumento em um tipo de dado complexo.

    Comandos de controle de fluxo 3-24

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Formato:

    r=cmplx(x [ ,y ] [,kind])

    Parametros:

    x (Entrada - inteiro, real ou complexo). Pode ser um array. o argumento a ser

    convertido para complexo. Se y especificado, x a parte real do resultado complexo.

    y (Opcional - entrada - inteiro ou real). No pode estar presente se x complexo. Pode

    ser um array. Neste caso, deve possuir o mesmo formato de x. Se for especificado, y a parte

    imaginria do resultado complexo.

    kind (Opcional - entrada - inteiro). Se especificado, determina o tipo parametrizado do

    resultado complexo.

    Retorno:

    Valor complexo, ou um array de valores complexos. Se kind especificado, o resultado

    tem tipo kind. Se kind for omitido, o resultado complex(4).

    Exemplo:

    program ex_complex

    implicit none

    complex z1

    z1=cmplx(3) ! retorna o valor 3.0 + i 0.0

    3.4.3 conjg/dconjg

    Retorna o conjugado complexo de um argumento complexo.

    Formato:

    r=conjg(z)

    Parmetros:

    z (entrada - complexo) - Pode ser um array. o argumento cujo complexo conjugado

    retornado.

    Retorno:

    Retorna um complexo. O tipo o mesmo que z e igual ao complexo conjugado de z, ou

    um array de tais valores. Se z=(real,imag), conjg(z) retorna (real,-imag).

    Comandos de controle de fluxo 3-25

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Exemplo:

    1. program ex_conj 2. implicit none 3. complex z 4. z=(10,5) 5. write (*,*) Conjugado de z: ,conjg(z) 6. end program ex_conj 7. Resultado: 8. (10,-5)

    3.5 Funes intrnsecas associadas ao tipo Character

    Achar: Retorna um caracter dado seu valor ascii

    Formato:

    achar(i)

    Argumentos:

    i (Entrada - Integer) - Contm o valor ASCII do caracter que se queira. O i deve ser maior ou igual a zero e menor ou igual a 127.

    achar (sada - character*1) - String contendo o caracter na i-zima posio da tabela ASCII. Exemplo

    write (*,*) achar(65)

    Resposta

    A

    3.5.1 adjustl

    Ajusta um string removendo todos os brancos sua esquerda e inserindo-os na sua direita.

    Sintaxe:

    result=adjustl(string)

    Parmetros:

    string (entrada - character*(*)) - Pode ser um array de strings. O string ser ajustado direita.

    Result (sada - character*(*)) - Retorna o string ajustado, ou um array de strings.

    Exemplo:

    character(16) :: string

    string=adjustl( Fortran 90 )

    ...

    Comandos de controle de fluxo 3-26

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Retorna: Fortran 90

    3.5.2 adjustr

    Ajusta um caracter string direita, removendo todos os espaos em que estiverem esquerda e

    inserindo igual nmero no incio do string.

    Formato:

    r=adjustr(string)

    Parmetros:

    string(entrada - character*(*)) - Pode ser um array de strings. o string a ser ajustado.

    Retorno:

    character*(*) - String ajustado esquerda ou um array de tais strings.

    Exemplo:

    1. program ex_adjustr 2. implicit none 3. character(10) string 4. string=adjustr( Forte ) 5. write (*,*) String: ,string 6. end program ex_adjustr 7. Resultado: 8. Forte

    3.5.3 char

    Retorna o caracter na posio especfica da tabela ASCII.

    Formato:

    r=char(j [, kind])

    Parmetros:

    j (entrada, inteiro, intervalo: [0,255]). Pode ser um array. Posio do caracter na tabela ASCII

    kind (opcional, entrada, inteiro) - Se especificado, determina o tipo do parmetro do caracter

    retornado.

    Retorno:

    do tipo character(1). Retorna o caracter na j-zima posio na tabela ASCII, ou um array de

    tais caracteres. Se kind for especificado, o resultado tem o tipo de kind, por outro lado, o padro

    um tipo caracter(1).

    Exemplo:

    char(80) ! retorna P.

    Comandos de controle de fluxo 3-27

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    3.5.4 iachar

    Retorna o valor inteiro na tabela ASCII do argumento de entrada.

    Formato:

    iachar(ch)

    Argumentos:

    ch (entrada - character*1) - Argumento character para o qual o valor inteiro ASCII

    procurado.

    Iachar (sada -integer) - Valor inteiro correspondente na iachar-zima posio da seqncia de

    caracteres.

    Exemplo:

    write (*,*) iachar(A)

    resultado:

    65

    3.5.5 len

    retorna o tamanho de um string.

    Formato:

    r=len(string)

    Parmetros:

    string (entrada - character*(*)) - String de tamanho desconhecido. Pode ser um array de strings.

    Retorno:

    O padro um integer(4). um valor escalar igual ao tamanho do string passado como

    parmetro ou o tamanho de um elemento do string, se este for um array.

    Observao:

    O argumento string no precisa estar com um valor atribudo antes que len seja usado.

    3.5.6 len_trim

    Retorna o tamanho de um string sem contar os brancos.

    Formato:

    r=len_trim(string)

    Parmetros:

    Comandos de controle de fluxo 3-28

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    string (entrada - character*(*)) - String de tamanho desconhecido. Pode ser um array de

    strings.

    Retorno:

    um inteiro. o tamanho do string, retriando-se todos os espaos em branco, ou um

    array de tamanhos.

    Exemplo:

    len_trim( oi) ! retorna 2

    3.6 Exerccios resolvidos

    3.7 Exerccios propostos

    Comandos de controle de fluxo 3-29

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4. Comandos de controle de fluxo Todos os programas, excetuando-se aqueles considerados primrios, necessitam de

    comandos que repitam um determinado conjunto de instrues, ou ento que executem

    determinados comandos, caso uma operao lgica seja verdadeira.

    As necessidades variam desde comandos que permitam que se some os 1000 elementos

    de um vetor, com apenas algumas linhas de programao, evitando desta forma, que se faa um

    cdigo imenso e tedioso de se escrever. Alm disto, pode-se querer saber quantos valores dentro

    de um conjunto so positivos e quantos so negativos, apenas citando exemplos mais simples.

    Para estas e outras necessidades, que a linguagem Fortran possui diversos comandos

    para manipularmos o fluxo de um programa. As facilidades encontradas na linguagem, esto

    entre aquelas consideradas mais apropriadas para uma linguagem de programao moderna.

    A forma geral que um bloco inicia-se com uma palavra chave, no seu interior, diversas

    declaraes e comandos, e no final, uma nova palavra chave informando o final do bloco. Um

    bloco pode estar vazio, embora estes casos sejam extremamente raros.

    Estes blocos podem estar aninhados, isto , um bloco pode conter um outro bloco. Nestes

    casos, o bloco mais externo deve conter todo o bloco interno. A execuo de um bloco sempre

    comea com seu comando executvel.

    4.1 IF

    O comando if prove um mecanismo para desvios dependendo de uma condio. Ele

    permite que uma seqncia de comandos seja executada dependendo de uma condio ser

    verdadeira. Caso contrrio, uma seqncia alternativa de comandos executada. Sua forma mais

    simples :

    [nome:] if (expresso lgica) then

    bloco

    end if [nome]

    Onde (expresso lgica) qualquer expresso escalar lgica e bloco uma seqncia de

    comandos executveis (Exceto um comando end). O bloco executado se a expresso lgica

    resultar num valor verdadeiro, e o controle da execuo passar para a primeira linha aps o end

    if caso seja falsa. Entre colchetes, encontra-se um nome, que pode ser atribudo quele bloco.

    Este tipo de atribuio, no muito utilizada no Fortran.

    Exemplo:

    Comandos de controle de fluxo 4-30

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program if_simples 2. implicit none 3. integer :: a 4. write (*,*) Informe o valor de a: 5. read (*,*a 6. if (a==0) then 7. write (*,*) O valor digitado nulo 8. endif 9. end program if_simples

    Uma forma mais elaborada do comando if, apresenta-se quando a partir da avaliao da

    expresso lgica, existe um bloco a ser executado quando a expresso falsa. Para isto, utiliza-

    se o comando else. Forma geral:

    if (expresso lgica) then

    bloco 1

    else

    bloco 2

    endif

    Na construo acima, a expresso lgica avaliada. Caso seja verdadeira, ento o bloco 1

    executado. Caso seja falso, o bloco 2 executado, e ao final, o controle do programa passar

    para a primeira linha aps o endif.

    Exemplo:

    1. program maior_menor 2. implicit none 3. real :: a 4. real :: b 5. write (*,*) Informe dois valores: 6. read (*,*a 7. read (*,*b 8. if (a>b) then 9. write (*,*) O primeiro valor maior que o segundo 10. else 11. write (*,*) O segundo valor menor ou igual ao primeiro 12. endif

    Alm destas duas formas bsicas, o comando if pode estar aninhado. Assim, ao invs do

    else, simples, teremos um elseif e uma nova expresso lgica a ser avaliada. A construo abaixo

    mostra um if aninhado:

    if (expresso 1) then

    bloco 1

    Comandos de controle de fluxo 4-31

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    elseif (expresso 2) then

    bloco 2

    else

    bloco 3

    endif

    Na construo acima, a expresso 1 avaliada. Caso seja verdadeira, o bloco 1

    executado, e ao final, o controle passa para a primeira linha aps o endif. Caso seja falsa, a

    expresso 2 avaliada, e caso seja verdadeira, ento o bloco 2 executado, caso contrrio, o

    controle do programa passa para o bloco 3.

    Exemplo 1:

    1. program if_1 2. implicit none 3. integer :: fatorial 4. integer :: i 5. read (*,*numero 6. if (numero

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    selecionado terminar sua execuo, o controle do programa passa para a primeira linha aps o

    end select.

    O bloco case default um opcional. Se no case, no possuir o case default, nenhuma

    ao tomada, e o programa continua. Pelo menos um bloco case executado.

    Os valores dentro do seletor case podem tomar uma dentre cinco formas abaixo:

    (valor) - O bloco s ser executado, se o valor da expresso e o valor entre parentesis forem os mesmos.

    (:faixa inferior ) - O bloco s ser executado, se o valor estiver dentro do intervalo especificado por [-inf, faixa_inferior]

    (faixa superior:) - O bloco s ser executado, se o valor estiver dentro do intervalo por [faixa_superior, +inf].

    (limite inferior : limite superior) - O bloco s ser executado, se o valor estiver dentdo do intervalo [limite_inferior, limite_superior].

    (valor1, valor2, valor3, ..., valor N) O bloco ser executado se o valor for igual a qualquer um dos valores dentro do case.

    Cada um dos valores case deve ser do mesmo tpo que a expresso case. Os tipos podem

    ser integer, character e logical. Para caracteres, os valores do case, no necessariamente

    precisam ser do mesmo tamanho que a expresso case. Faixas de valores usando ( : ) no so

    permitidos para o tipo logical.

    4.2.1 Forma geral do case

    select case (expresso)

    case (faixa de valores)

    bloco de instrues

    case (faixa de valores)

    bloco de instrues

    case default

    bloco de instrues

    end select

    Comandos de controle de fluxo 4-33

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4.2.2 Exemplos

    Exemplo 1

    1. program testa_case 2. implicit none 3. integer :: a 4. read (*,*a 5. select case (a) 6. case(:-1 ) 7. write (*,*) Menor que zero 8. case(0) 9. write (*,*) Igual a zero 10. case(1:) 11. write (*,*) Maior que zero 12. end select 13. end program testa_case Exemplo 2

    1. program case_string 2. implicit none 3. character*5 :: nome 4. read (A5), nome 5. select case nome 6. case (joao) 7. write (*,*) Codigo: 95 8. case (paulo) 9. write (*,*) Codigo: 83 10. case default 11. write (*,*) no cadastrado 12. end select

    No exemplo acima, o programa verifica o nome informado. Caso seja joao ou paulo, o

    programa imprimir seus cdigos. Caso nenhum nome exatamente igual aos dois for informado,

    a mensagem no cadastrado aparecer na tela. importante observar que os strings so

    sensitivos, ou seja, Joao diferente de joao.

    Exemplo 3

    Comandos de controle de fluxo 4-34

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program case_string 2. implicit none 3. character*5 :: nome 4. read (A5), nome 5. select case nome 6. case (a:z) 7. write (*,*) Letras minusculas 8. case (A:Z) 9. write (*,*) Letras maisculas 10. case (0:9) 11. write (*,*) Nmeros 12. case default 13. write (*,*) Caracteres especiais 14. end select 15. end program case_string

    No exemplo acima, nome ser avaliado. Se o primeiro caracter for minsculo, ento, ser

    impressa a mensagem de letras minsculas. O programa avalia apenas o primeiro caracter. Os

    subsequentes so ignorados pelo case.

    4.3 do

    A construo do controla o nmero de vezes que uma determinada seqncia de

    atribuies e comandos dever ser executada dentro de um loop. H trs passos na construo do

    do:

    1. Se a execuo da construo do for controlada por uma varivel do, as expresses

    representando os parmetros que determinam o nmero de vezes que o bloco dever ser

    executado so calculados.

    2. Uma deciso feita para verificar se o bloco do loop deve ser executado.

    3. Se for apropriado, o bloco do loop executado, a varivel do do atualizada e o passo 2

    repetido.

    No fortran 90, alm do tradicional DO loop que controlado por uma varivel que

    incrementada um certo nmero de vezes como prescrito na declarao inicial do DO, existem

    mais duas formas alternativas de se controlar o loop. Uma o DO WHILE e a outra o DO

    simples, algumas vezes chamado de DO eterno.

    Comandos de controle de fluxo 4-35

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4.3.1 Forma do bloco DO

    O bloco DO uma construo que termina com uma declarao END DO ou

    CONTINUE. A varivel DO deve ser um escalar do tipo inteiro ou real (isto exclui variveis

    que so elementos de array, struturas e componentes de estruturas).

    Se o comando DO de um bloco tem um nome, o seu END DO correspondente deve ter o

    mesmo nome. Se o comando de um bloco DO no possui nome, ento o correspondente END

    DO no deve ter nome.

    Formato:

    DO =, ,

    bloco DO

    END DO

    Onde:

    varivel : pode ser do tipo inteiro, real ou dupla preciso (obsoleto). incio : valor inicial que a varivel dever assumir. fim : valor final que a varivel dever assumir. incremento : valor que dever ser somado ou subtrado de incio para se chegar em

    fim. Se no for definido um incremento, este assumir o valor 1.

    Exemplo1 :

    1. fat=1 2. do i=2,n 3. fat=fat*i 4. enddo

    No exemplo 1, a varivel i ir de 2 at n, variando de um em um.

    Exemplo 2:

    1. x=10 2. y=0 3. do j=53,x,-2 4. y=y+j 5. enddo

    No exemplo 2, a varivel j ir de 53 at 11, decrementando de 2, a cada iterao.

    Comandos de controle de fluxo 4-36

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4.3.2 do while

    A forma DO WHILE da construo DO prove a habilidade de repetir o DO enquanto

    uma condio especfica permanece verdadeira.

    A forma geral do comando DO WHILE como segue:

    DO WHILE (expresso)

    bloco

    END DO

    O bloco do executado repetidamente. Antes da primeira execuo do do, a expresso

    avaliada. Se for verdadeira, ento o bloco executado, caso contrrio, o controle do programa

    passa para a primeira linha aps o end do

    Exemplo:

    1. sum=0.0 2. i=0 3. do while (i

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    lao do - enddo, e passar o controle da execuo para a primeira linha aps o enddo. Caso o

    objetivo seja o termino do programa, ento o comando stop deve ser acionado.

    Exemplo:

    4.3.4 Alterando a sequncia de execuo

    H somente dois comandos que podem aparecer em uma contruo que alterem a

    sequncia de execuo de uma construo do. Um o comando exit; o outro o comando cycle.

    Outros comandos, tais como comandos de desvio, o comando return, e o comando stop,

    tambm podem alterar a seqncia de execuo mas no restritos a construes do como os

    comandos exit e cycle.

    4.3.4.1 exit

    O comando exit causa o final imediato de uma construo do. Nenhum outro comando

    dentro do bloco do executado. O comando exit definido como segue:

    exit

    Exemplo:

    1. i=93 2. do 3. i=i-4 4. if (i==1) then exit 5. enddo

    4.3.4.2 cycle

    Em contraste com o comando exit, que termina a execuo da construo do, o comando

    cycle interrompe a execuo do bloco do e inicia um novo ciclo do bloco do, com os ajustes

    apropriados feitos no contador de interaes e na varivel do, se estiver presente.

    Exemplo:

    Comandos de controle de fluxo 4-38

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program do_cycle 2. implicit none 3. integer :: index 4. index=1 5. do 6. index=index+1 7. if (index==20) then 8. cycle 9. endif 10. if (index==30) then 11. exit 12. endif 13. write (*,*) 'Valor de indice: ',index 14. enddo 15. end program do_cycle

    No exemplo acima, se o valor de index for 20, o fortran 90 no executar as duas linhas

    abaixo da linha atual, iniciando o laco do novamente.

    4.4 Exerccios resolvidos

    4.5 Lista de exerccios

    1. Escrever um programa que l um nmero indefinido de valores, todos positivos, e conta quantos so pares, quantos so mpares. O programa dever finalizar quando for inserido um nmero negativo, ou nulo.

    2. Escrever um programa que l 3 valores a, b e c, e calcula as razes do polinmio de grau 2, e

    imprime as razes (reais ou imaginrias).

    3. Escrever um programa que l um nmero indefinido de pares ordenados e verifica quantos

    esto em cada um dos quadrantes, e quantos esto sobre cada um dos eixos (positivo X e Y e

    negativo X e Y). O critrio de parada a entrada de um ponto sobre a origem (0,0).

    4. Escrever um programa que l um nmero indefinido de valores, e calcula o fatorial do

    nmero. Alm disto, o programa dever verificar se o mesmo par ou impar. Se for par,

    calcule o fatorial par do mesmo, e se for impar, o fatorial impar.

    Fatorial par de 10: (2*4*6*8*10)=3840

    Fatorial impar de 9: (1*3*5*7*9)=945

    5. Escrever um programa que l 4 valores a, b, c e d, e calcula as 3 razes do polinmio:

    F(x)=a*x^3+b*x^2+c*x^1+d. Para calcular a primeira raz dever ser usado o mtodo de

    Comandos de controle de fluxo 4-39

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Newton: xk+1=xk-F(xk)/F(xk). O programa dever parar quando abs(F(xk)-F(xk-1)/(F(xk)

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    5. Subprogramas Os subprogramas, existem para estruturar a soluo de um problema dentro de segmentos

    de programa independentes, que podem ser chamados em qualquer parte do programa, mais de

    uma vez.

    Os subprogramas possuem duas formas: Subrotina e funo. Estas duas formas so

    similares exceto pela maneira como so chamadas.

    A subrotina um subprograma cujo propsito executar uma ao, tal como modificar

    um conjunto de argumentos e/ou variveis globais, ou executar uma entrada/sada. Tipicamente,

    a subrotina chamada com um comando call, mas o Fortran 90 possui uma forma adicional de

    referncia a subrotina que a atribuio definida. Uma subrotina pode ser usada para definir

    uma nova forma de atribuio, diferente daqueles j definidos em Fortran. Tais subrotinas so

    chamadas com a sintaxe da atribuio (=) ao invs de utilizar-se o call.

    O propsito da funo prover um valor necessrio a uma expresso. Uma funo

    invocada como um operando de uma expresso, e o resultado usado como o valor para o

    operando. Alm disto, em Fortran 90, uma funo pode ser usada para definir um novo operador

    ou estender o significado o significado de um smbolo de operador intrnseco.

    A principal diferena entre uma subrotina e uma funo que o resultado da funo

    associado ao seu nome. Mais precisamente, h um valor de resultado associado com qualquer

    execuo particular ou chamada a uma funo. Este resultado pode ser de qualquer tipo,

    incluindo tipos derivados, e podem ser vetores ou matrizes. A opo result pode ser utilizada na

    declarao da funo para dar ao resultado m nome diferente que o nome da funo.

    5.1 Subrotinas

    Uma subrotina define um processo completo e independente. Tem um comando inicial

    subroutine, uma parte de especificao, uma parte de execuo onde est o algoritmo, qualquer

    subprograma interno que executa processos auxiliares e um comando end. Quando uma

    subrotina chamada, sua execuo inicia com a primeira construo executvel na subrotina.

    Objetos de dados e outras entidades podem ser comunicadas de e para a subrotina atravs da

    passagem de argumentos.

    5.1.1 Definio

    O formato geral de uma subrotina como segue:

    Subprogramas 5-41

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    [recursive] subroutine nome_da_subrotina ([ arg1, arg2, arg3, ..., argN ])

    declarao dos argumentos: tipo,intent(in/out/inout) :: arg1

    tipo,intent(in/out/inout) :: arg2

    ...

    tipo,intent(in/out/inout) :: argN

    declarao das variveis da subrotina comandos da subrotina subrotinas ou funes internas end subroutine [nome_da_subrotina]

    Na declarao dos parmetros da subrotina, verifica-se a existncia de um atributo em cada um

    dos argumentos, denominado intent. A funo do intent, justamente informar ao compilador,

    se o argumento sendo passado, ser de leitura, de escrita, ou de leitura e escrita.

    intent(in) - Neste caso, o contedo da varivel no poder ser modificado. Intent(out) - O contedo da varivel, dever ser desconsiderado na entrada da subrotina, e no

    seu interior, o valor que for atribudo, dever ser retornado para o programa chamador.

    Intent(inout) - O contedo da varivel, na entrada da subrotina, dever ser considerado, e em caso de modificao no seu contedo, este dever ser atualizado.

    Exemplo:

    Subrotina que recebe um nmero, e retorna seu fatorial

    Subprogramas 5-42

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. subroutine calc_fat(nmero, fatorial) 2. implicit none 3. ! Declarao das variveis da subrotina 4. integer,intent(in) :: nmero 5. integer,intent(out) :: fatorial 6. ! Declarao das variveis da subrotina 7. integer :: i 8. fatorial=1 9. if (nmero>1) then 10. do i=2,nmero 11. fatorial=fatorial*i 12. enddo 13. endif 14. end subroutine calc_fat

    5.2 Subprogramas externos

    Subprogramas externos so subrotinas e funes armazenadas em arquivos diferentes que no

    so parte de nenhuma outra unidade de programa. Eles podem compartilhar informaes, tais

    como dados e subprogramas atravs de listas de argumentos, mdulos, mas por outro lado, no

    podem compartilhar informaes com qualquer outra unidade de programa. Podem ser

    utilizados, compilados e usados independentemente de outros subprogramas e unidades de

    programa. Alm disto, no necessariamente precisam ser escritos em Fortran.

    5.3 Subprogramas internos

    Subprogramas internos so definidos dentro de outros subprogramas. O subprograma que

    contm um subprograma interno chamado de hospedeiro do mesmo. Um subprograma interno

    pode ser tanto uma subrotina ou uma funo e aparece entre os comandos contains e end do seu

    hospedeiro. Um subprograma interno local ao seu hospedeiro e inerente ao ambiente do

    hospedeiro atravs de associao.

    Exemplo:

    program faz_contas

    implicit none

    real,dimension(10) :: a

    integer :: i

    Subprogramas 5-43

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    5.4 Funes

    As funes so similares as subrotinas em diversos aspectos, exceto que o retorno da funo est

    associado ao seu nome. Anlogo a uma subrotina, uma funo tem uma declarao function,

    uma parte de especificao de variveis de entrada (devem ser todas declaradas como

    intent(in)), declarao das variveis utilizadas na funo, os comandos da funo e por fim, o

    comando end function.

    5.5 Definio

    [tipo] [recursive] function nome_da_funo ([ arg1, arg2, arg3, ..., argN ]) result nome

    declarao dos argumentos: [tipo] :: nome_da_funo

    tipo,intent(in) :: arg1

    tipo,intent(in) :: arg2

    ...

    tipo,intent(in) :: argN

    declarao das variveis que sero utilizadas na funo comandos da funo subrotinas ou funes internas end function [nome_da_funo]

    Uma funo sempre possui um tipo associado a ela, que pode ser intrnseco ou definido pelo

    usurio. Esta definio pode aparecer na linha de comando, ou ento na parte da funo

    destinada a declarao de variveis. Outro aspecto que todos os argumentos na passagem da

    funo so de entrada, ou seja, tem o atributo intent(in).

    Exemplo 1:

    Funo que calcula o fatorial de um nmero.

    Subprogramas 5-44

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. integer function fat(n) 2. integer,intent(in) :: n 3. integer :: i 4. fat=1 5. if (n>=2) then 6. do i=2,n 7. fat=fat*i 8. enddo 9. endif 10. end function fat

    5.6 result

    A opo result especifica um nome diferente do nome da funo para armazenar o resultado da

    funo. O nome associado pode ser declarado, definido e referenciado como um objeto de dados

    ordinrio. O nome da funo tem os mesmos atributos que o nome associado ao result.

    Se no houver a clusula result, o nome da funo utilizado como objeto de dados do

    resultado.

    Exemplo:

    Funo que inverte as palavras em uma dada frase:

    1. recursive function reverse(phrase) result (flipped) 2. character(*) :: phrase 3. character(len(phrase)) :: flipped 4. l=len_trim(phrase) 5. n=index(phrase(1:l), , back=.true.) 6. if (n==0 then 7. flipped=phrase 8. else 9. flipped=phrase(n+1,l) // : 10. endif 11. end function reverse

    5.7 entry

    A opo entry especifica um ponto de entrada secundrio a uma subrotina ou funo externa.

    Definio:

    Entry e-nome [(parmetros)] [result (nome alternativo) ]

    e-nome:

    Nome do ponto de entrada. Se este ponto de entrada for uma funo definida pelo usurio, o e-

    nome deve ser de um tipo de dados definido:

    Por regras padronizadas de determinao de tipo Subprogramas 5-45

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Por um tipo especificado por uma declarao implicit Uma declarao de uma funo definida pelo usurio. Se for especificada a clusula result, no podero ser declaradas funes ou subrotinas

    internas com o mesmo nome dentro da funo ou subrotina.

    Os argumentos so opcionais. Podem ser o nome de uma varivel ou matriz. Para iniciar a execuo de uma subrotina na primeira declarao depois de uma declarao

    entry, substitua o nome do subprograma pelo nome do ponto de entrada, usando a seguinte

    sintaxe:

    Subrotina call e-nome [ (argumentos)] Funo e-nome ( [argumentos]) Os parntesis devero aparecer quando uma funo for chamada, mesmo quando a funo no

    possuir argumentos de entrada.

    Uma declarao entry em uma subrotina define uma subrotina adicional cujo nome e-nome e cujos argumentos so aqueles especificados na declarao entry.

    Uma declarao entry em uma funo define uma funo adicional funo cujo nome e-name e cujo resultado armazenado em e-nome. As especificaes da varivel resultante

    definem as caractersticas do resultado da funo. Os argumentos so aqueles especificados

    na declarao entry..

    No h limite no nmero de declaraes entry que podem ser usadas em um subprograma. As seguintes restries se aplicam a declarao entry:

    Dentro de um subprograma, e-nome no pode Ter o mesmo nome de um argumento em uma funo, subrotina, entry ou declarao external.

    Dentro de uma funo e-nome no pode aparecer em qualquer declarao que no seja o tipo de declarao depois que o e-nome tenha sido definido na declarao entry.

    Se alguma declarao e-nome em uma funo for do tipo caracter, todos os nomes em declaraes entry naquela funo devem ser do tipo caracter, e todos devem ter o mesmo

    tamanho.

    Subprogramas 5-46

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Um argumento no pode aparecer em uma declarao executvel que apareca antes da entrada entry contendo o argumento, a menos que o argumento tambm aparea em uma declarao

    de funo, subrotina ou entry que precede a declarao executvel.

    Uma declarao entry dever aparecer somente em um subprograma externo ou um mdulo. Um subprograma interno no pode conter uma declarao entry.

    Uma declarao entry no poder aparecer em um bloco executvel tais como do, if ou case, ou em um comando where.

    No possvel definir um ponto de entrada quando a funo ou subrotina possuir a clusula recursive. O atributo recursive em uma declarao de funo ou subrotina controla se o

    ponto de entrada no procedimento for permitido para referenci-lo.

    No final da subrotina que possui a declarao entry, dever aparecer uma declarao return, que forcar o retorno da subrotina.

    Exemplo:

    Subprogramas 5-47

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. ! Programa principal 2. program testa_entry 3. implicit none 4. real :: a 5. real :: div 6. div=2 7. write (*,*) 'Informe um valor: ' 8. read (*,*a 9. if (mod(a,div)==0) then 10. call imprime_par(a) 11. else 12. call imprime_impar 13. endif 14. end program testa_entry 15. ! Subrotinas 16. subroutine imprime_par(a) 17. implicit none 18. real,intent(in) :: a 19. write (*,*) 'O valor lido ',a,' eh par.' 20. return 21. entry imprime_impar 22. write (*,*) 'O valor lido impar' 23. end subroutine imprime_par

    5.7.1 Contains

    A declarao contains delimita uma poro executvel de um programa ou subprograma de

    quaisquer subprogramas internos. Ele separa os procedimentos internos do procedimento

    hospedeiro, e separa a parte de especificao de um mdulo das funes e subrotinas do mdulo.

    Se um programa contiver subprogramas internos, eles devero estar precedidos de uma

    declarao contains. No existe um nmero limite de funes ou subrotinas que seguem a

    declarao contains, mas procedimentos sozinhos no podem conter uma declarao contains.

    Exemplo:

    Subprogramas 5-48

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program testa_contains 2. implicit none 3. integer :: a 4. write (*,*) 'Informe um numero: ' 5. read (*,*a 6. if (a>0) then 7. write (*,*) 'O fatorial de: ',a,' eh: ',fat(a) 8. else 9. write (*,*) 'No possvel calcular o fatorial de um nmero negativo' 10. endif 11. contains 12. function fat(n) 13. integer :: fat 14. integer :: n 15. integer :: i 16. fat=1 17. do i=2,n 18. fat=fat*i 19. enddo 20. end function fat 21. end program testa_contains

    5.8 Return

    A declarao return encerra a execuo de um subprograma e transfere o controle ao programa

    chamador. Ele pode ser inserido dentro do corpo do subprograma, tal como em blocos if para

    retornos condicionais, e pode ser usado para se colocar pontos de sada do subprograma. Esta

    declarao colocada geralmente na penltima linha da funo ou subrotina. No h uma

    obrigatoriedade em se colocar o return pois a declarao end tem a mesma funo.

    5.8.1 External

    Identifica um nome definido pelo usurio como uma subrotina ou funo externa.

    Declarao:

    External nome

    A declarao external especifica que uma funo particular, definida pelo usurio deve ser

    considerada como externa ao programa chamador. Alm disto, no caso de haver uma declarao

    de uma funo com nome igual a de uma funo intrnseca, esta substitui a funo intrnseca.

    Se uma declarao external especificar um nome que tambm o nome de uma funo

    intrnseca, no ser possvel utilizar aquela funo intrnseca no programa chamador.

    Subprogramas 5-49

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    O Fortran assume que o nome de qualquer subrotina ou funo referenciada em uma unidade de

    compilao (mas no definida ali) definida externamente.

    Exemplo:

    1. program testa_sub 2. implicit none 3. real :: a 4. external rota 5. call rota(a) 6. end program testa_sub 7. ! Subrotina 8. subroutine rota 9. implicit none 10. real,intent(in) :: a 11. write (*,*) Valor lido: ,a 12. end subroutine rota

    5.8.2 Intrinsic

    Declara que um nome uma funo intrnseca.

    Declarao:

    intrinsic nome

    nome um ou mais nomes de funes intrnsecas, separadas por vrgulas.

    Observaes:

    Deve-se especificar o nome de uma funo intrnseca com a declarao intrinsic, se houver a

    necessidade de se passar a mesma como um argumento para uma funo ou subrotina definida

    pelo usurio. Nem todas as funes intrnsecas podem ser passadas como argumentos.

    Exemplo:

    Subprogramas 5-50

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program intrin 2. implicit none 3. real :: a=1 4. intrinsic sin 5. call rotina(sin(a)) 6. end program intrin 7. subroutine rotina(a) 8. real,intent(in) :: a 9. write (*,*) 'Seno de a: ',a 10. end subroutine rotina

    5.9 Mdulos

    Os mdulos so uma caracterstica nova do Fortran 90. Um mdulo permite o uso de pacotes de

    especificao de dados e subprogramas, para serem utilizados em qualquer parte de um

    programa. Um mdulo, por si s no executvel, embora as funes ou subrotinas que ele

    contenha, possam ser referenciadas individualmente na execuo de outras unidades de

    programa. O nmero de mdulos no restrito, e um mdulo pode usar qualquer nmero de

    outros mdulos, a medida que for necessrio. Os mdulos so ferramentas extremamente

    poderosas para o gerenciamento e a organizao de programas.

    5.9.1 Formato

    module nome_do_mdulo

    [Parte de especificao]

    [contains]

    [Parte de subprogramas]

    end module nome_do_mdulo

    5.9.2 Parte de especificao

    Na parte de especificao, so declaradas todas as variveis que sero utilizadas no mdulo.

    Todas as variveis declaradas, podem ser utilizadas pelas funes e subrotinas que estiverem

    presentes no mdulo.

    5.9.3 Parte de subprogramas

    Na parte de subprogramas, so declarados todos as funes e subrotinas, que faro parte daquele

    mdulo. Sua definio aparece logo aps a declarao contains. As duas principais diferenas

    entre subprogramas module e subprogramas internos so:

    Subprogramas 5-51

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    A organizao, regras e restries de um subprograma module so aquelas dos subprogramas externos.

    Subprogramas declarados em module no so estritamente locais ao modulo hospedeiro, nem so globais ao programa. Somente a unidade de programa que utilizar o mdulo pode

    acessar as subrotinas do mdulo no especificadas para serem private.

    5.9.4 Usando mdulos

    Uma unidade de programa pode usar as especificaes e definies em um mdulo pela

    referncia ao mdulo. Isto feito atravs da declarao use na unidade de programa que

    requisitar o acesso as especificaes e definies daquele mdulo. Tais acessos causam uma

    associao entre objetos do mdulo e o uso da unidade de programa, que chamada de

    associao de uso. A declarao use dever aparecer logo abaixo da primeira linha da unidade de

    programa.

    Cada varivel em um mdulo pode ter os atributos public ou private, ao qual determina a

    acessibilidade dela na unidade de programa chamadora. Uma varivel private, no acessvel

    na unidade de programa chamadora, enquanto uma public, . Todas as variveis declaradas, e

    no especificadas, so consideradas public.

    Um outro ponto importante, quanto a lista de nomes que pode ser associada as variveis do

    mdulo, para que se evite conflitos de nome. Exemplo:

    use fourier

    use s_lib, pressure => x_pres

    No caso do mdulo chamado fourier, os nomes das variveis so aqueles especificados no

    mdulo. No caso da s_lib, a varivel de nome x_press renomeada para pressure na unidade de

    programa que est usando o mdulo. As outras variveis que acessem a s_lib tem o mesmo nome

    na unidade de programa como no mdulo.

    Exemplo:

    Subprogramas 5-52

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program princ 2. use pontos 3. type(ponto) :: a 4. type(ponto) :: b 5. a=ponto(1,2,-3) 6. b=ponto(-3,4.2,0.2) 7. write (*,*) 'A distancia entre os dois pontos eh: ',distancia(a,b) 8. end program princ 9. module pontos 10. implicit none 11. type ponto 12. real :: x 13. real :: y 14. real :: z 15. end type ponto 16. contains 17. function distancia(a,b) 18. type(ponto),intent(in) :: a 19. type(ponto),intent(in) :: b 20. real :: distancia 21. distancia=sqrt((b%x-a%x)**2+(b%y-a%y)**2+(b%z-a%z)**2) 22. end function distancia 23. end module pontos

    5.9.4.1 Atributos public e private

    Os atributos public e private, fazem com que as variveis declaradas dentro do mdulo sejam

    vistas (public) ou no (private), pelo programa que usa o mdulo.

    As variveis com o atributo public podem ser utilizadas em outras unidades de programa pelo

    uso da declarao USE. As variveis com o atributo private no podem ser acessadas fora do

    mdulo. As variveis que no possurem uma especificao de acessibilidade tem o seu acesso

    padro, que public, a menos que esta definio seja modificada por uma declarao private.

    Declarao:

    public [ private [ :: ] lista de variveis ]

    Observaes:

    Uma varivel no poder Ter o atributo public se o seu tipo j possuir o atributo private. Os

    atributos de acessibilidade s podero ser utilizados dentro de mdulos. Se for feita uma

    declarao public ou private, sem uma especificao de variveis, o Fortran assumir que todas

    tero o atributo. Isto significa que cada varivel, constante e subprograma no modulo tem o

    atributo a menos que seja declarado especificamente com o atributo no padro.

    Subprogramas 5-53

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Por exemplo, tipos derivados definidos em um mdulo so acessveis em qualquer unidade que

    use o mdulo. O padro pode ser modificado para limitar a acessibilidade para o mdulo. Um

    tipo derivado particular pode ser declarado private, ou pode ser public enquanto alguns de seus

    componentes so private.

    Exemplo:

    5.10 Interface

    Uma declarao interface marca o incio de um bloco interface. Este tipo de declarao deve

    aparecer se uma das seguintes condies for verdadeira:

    Uma referncia a um subprograma aparece. Com um argumento que uma palavra chave. Com atribuio definida (=), apenas em subrotinas. Em uma expresso como um operador definido, apenas em funes. Como uma referncia pelo seu nome genrico. A subrotina possuir parmetros opcionais. O resultado da funo for uma matriz. O argumento uma matriz de tamanho assumido.

    Observaes:

    Uma declarao interface lista todas as caractersticas de subprogramas externos, assim o

    compilador pode confirmar se o subprograma est sendo chamado corretamente ou no. O

    compilador verifica o nmero, tipos e atributos dos argumentos em uma chamada e verifica sua

    consistncia com o que estiver declarado na interface.

    Se for especificado um nome genrico, ento qualquer subrotina listada na interface pode

    ser chamada pelo seu nome especfico, ou pelo nome genrico especificado na interface. Um

    bloco interface com uma especificao genrica indica uma interface genrica para cada

    subrotina.

    Os subprogramas declarados em blocos interface tem o atributo external como padro.

    Um subprograma cuja interface definida em um bloco interface no pode ser declarado como

    external na mesma unidade de programa.

    Subprogramas 5-54

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Subprogramas internos, modulos e subprogramas intrnsecos so todos considerados

    como tendo interfaces explcitas. Subprogramas externos tem interfaces implcitas como padro.

    Quando for especificado um bloco interface para eles, ento suas interfaces se tornam explcitas.

    Um subprograma no pode ter mais de uma interface explcita dentro de uma mesma unidade de

    programa. Isto significa que no podem ser includas subprogramas internos, mdulos ou

    subprogramas intrnsecos em um bloco interface, a menos que se queira definir um nome

    genrico para os mesmos.

    O bloco interface no pode ter declaraes entry, data ou format, uma declarao de

    funo ou interfaces para subprogramas internos.

    Exemplo 1: No exemplo abaixo, uma subrotina que simplesmente imprime um valor. No

    existe necessidade de criar uma interface, pois a subrotina no possui nenhum dos itens

    necessrios para a sua criao (da interface).

    1. program ve_inter 2. implicit none 3. real :: a 4. interface 5. subroutine teste(a) 6. real,intent(in) :: a 7. end subroutine teste 8. end interface 9. a=10 10. call teste(a) 11. end program ve_inter 12. subroutine teste(a) 13. implicit none 14. real,intent(in) :: a 15. write (*,*) 'Valor de a: ',a 16. end subroutine teste

    Exemplo 2: Neste exemplo, tem-se duas funes. A primeira recebe dois parmetros

    reais, e calcula a hipotenusa. Na Segunda, a mesma operao efetuada, com a diferena que os

    parmetros so dupla preciso. definida uma interface com um nome explcito, e o Fortran se

    encarrega de chamar a primeira ou a Segunda, dependendo apenas do tipo dos parmetros de

    entrada.

    No programa principal, aparece a linha: include interface.f90. O objetivo desta linha,

    fazer com que o contedo do arquivo interface.f90 seja lido e includo no programa principal.

    No existe necessidade de o arquivo a ser includo no programa principal ter a extenso .f90.

    Programa principal:

    Subprogramas 5-55

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program dist 2. implicit none 3. include 'interface.f90' 4. real :: a 5. real :: b 6. real :: dist_real 7. real(kind=8) :: c 8. real(kind=8) :: d 9. real(kind=8) :: dist_doub 10. a=10 11. b=15 12. c=15 13. d=20 14. dist_real=distancia(a,b) 15. dist_doub=distancia(c,d) 16. write (*,*) 'Distancia real: ',dist_real 17. write (*,*) 'Distancia imag: ',dist_doub 18. end program dist 19. Interface: Interface.f90 20. interface distancia 21. function distancia_double(a,b) 22. real(kind=8),intent(in) :: a 23. real(kind=8),intent(in) :: b 24. real(kind=8) :: distancia_double 25. end function distancia_double 26. function distancia_real(a,b) 27. real,intent(in) :: a 28. real,intent(in) :: b 29. real :: distancia_real 30. end function distancia_real 31. end interface 32. ! Funo que calcula a hipotenusa com parmetros reais: 33. function distancia_real(a,b) 34. real,intent(in) :: a 35. real,intent(in) :: b 36. real :: distancia_real 37. distancia_real=sqrt(a**2+b**2) 38. end function distancia_real 39. ! Funo que calcula a hipotenusa com parmetros com dupla preciso. 40. function distancia_double(a,b) 41. real(kind=8),intent(in) :: a 42. real(kind=8),intent(in) :: b 43. real(kind=8) :: distancia_double 44. distancia_double=sqrt(a**2+b**2) 45. end function distancia_double

    Subprogramas 5-56

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    5.11 Exerccios resolvidos

    1. Escrever uma funo que verifica se o nmero par ou impar. Se for par, retorna .true. caso

    contrrio, .false.

    1. ! Programa principal 2. program vepar 3. real :: numero 4. logical :: par 5. interface 6. function ve_par(numero) 7. real,intent(in) :: numero 8. logical :: ve_par 9. end function ve_par 10. . end interface 11. write (*,*) 'Informe um numero: ' 12. read (*,*numero 13. par=ve_par(numero) 14. if (par) then 15. write (*,*) 'O numero ',numero, ' eh par' 16. else 17. write (*,*) 'O numero ',numero, ' eh impar' 18. endif 19. end program vepar 20. ! Funo 21. function ve_par(numero) 22. implicit none 23. real,intent(in) :: numero 24. logical :: ve_par 25. real :: dois=2 26. if (amod(numero,dois)==0) then 27. ve_par=.True. 28. else 29. ve_par=.False. 30. endif 31. end function ve_par 2. Escrever uma subrotina que calcula as duas razes de um polinmio de grau 2. Verifique se

    as razes so reais ou imaginrias e faa uma entrada alternativa para chamar a subrotina

    (use o entry).

    3. Escrever uma funo que calcula a integral da seguinte expresso: F(x)=x^2-sin(x). A

    funo dever ter como entrada o nmero de intervalos da integral, e os limites inferior e

    superior de integrao.

    Subprogramas 5-57

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    4. Escrever a subrotina que calcula a integral da expresso do exerccio 3. O mtodo de

    integrao dever ser o trapzio.

    5.12 Exerccios propostos

    Subprogramas 5-58

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    6. - Matrizes

    6.1 Introduo

    As matrizes, dentro da verso 90 do Fortran, receberam um tratamento especial, e muitas

    mudanas so visualizadas. No Fortran 90, possvel tratar um matriz como um objeto simples.

    Esta caracterstica permite que expresses como C = A + B possam ser executadas como se

    fossem escalares, mas na realidade sa matrizes. Alm disto, outras facilidades so encontradas,

    tais como a atribuio. No existe mais a necessidade de se fazer laos para se zerar a matriz.

    Para isto, basta um nico comando: D=0.

    Estas caractersticas so extremamente convenientes e oferecem uma forma mais natural

    de apresentar as expresses, e tambm so extremamente prticas para computadores que

    utilizam-se de processamento paralelo e vetorial.

    Alm disto, as funes podem retornar no apenas um valor, mas um matriz. Sees de

    matrizes so obtidas, utilizando-se uma sintaxe similar ao Matlab. A(:,i) a i-zima coluna de A.

    A(2:4,3:5), um matriz 3 x 3 obtida das linhas 2 at 4 e das colunas 3 at 5 da matriz A .

    6.2 Matrizes nulas

    O Fortran 90 permite que matrizes tenham tamanho zero. Quando o limite inferior excede

    o correspondente limite superior, a matriz tem tamanho zero. H poucas regras especiais para

    este tipo de estrutura porque eles seguem as regras tradicionais, mas deve-se tomar um pouco de

    cuidado com sua interpretao. Por exemplo, dois matrizes de tamanho zero e de mesmo

    nmero de dimenses pode ter diferentes formas. Um pode ser (0,2) e o outro (2,0). Tais

    matrizes no so compatveis e portando podem no ser usados como operandos de uma

    operao binria. Entretanto, uma matriz sempre compatvel com um escalar, assim o

    comando:

    32. matriz_tamanho_zero = escalar valido, e o escalar armazenado em todos os elementos da matriz, e com isto teremos

    uma linha de programa, que no faz absolutamente nada.

    6.3 Declarao de matrizes

    Uma matriz consiste de um conjunto retangular de elementos, todos do mesmo tipo. H

    diversas formas pelas quais uma matriz pode ser declarada. Neste momento, ser vista apenas a

    Matrizes 6-59

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    declarao de matrizes de tamanho fixo. Para declarar-se um vetor A de 20 elementos, o seguinte

    comando poderia ser utilizado:

    real, dimension(20) :: a

    Os elementos sucessivos de a, so referenciados atravs de um ndice: a(1), a(2), ...,

    a(20). O nmero de elementos de um vetor chamado de dimenso. Cada um dos elementos do

    vetor um escalar.

    Muitos problemas requerem uma declarao mais elaborada de uma matriz. No Fortran

    90 no existe restries quanto aos ndices de cada uma das dimenses da matriz. Sendo assim,

    possvel ter-se matrizes com ndices negativos, tais como no exemplo abaixo:

    real, dimension(-17:23) :: matriz

    Neste caso, a matriz possui 41 elementos, que sero referenciados da seguinte maneira:

    matriz(-17), matriz(-16), e assim sucessivamente.

    O nmero mximo de dimenses que o Fortran 90 permite 7. Sendo assim, pode-se ter

    matrizes do tipo:

    integer, dimension(10:11,15,7:12,-2:4,3:6,7:10,29:31) :: estranho

    No exemplo acima, observa-se que o terceiro ndice da matriz possui apenas um numero.

    Neste caso, assume-se que o ndice inferior da dimenso em questo 1. Observa-se que o

    tamanho da matriz em questo : 2 * 15 * 6 * 7 * 4 * 3= 15120. Um tipo composto pode conter

    uma matriz como componente. Por exemplo, o seguinte tipo:

    type matriz

    real :: parte_1

    real, dimension(10) :: matri_1

    real, dimension(3,4) :: matri_2

    end type matriz

    O Fortran, armazena o contedo de matrizes, por coluna. Sendo assim, a seqncia de

    armazenamento de uma matriz a(3,3) ser: a(1,1) - a(2,1) - a(3,1) - ... - a(3,3). Desta forma,

    quando forem escritos programas para manipular matrizes, d preferncia a varredura do objeto

    por coluna.

    A referncia um elemento individual de uma matriz chamado de ndices. Nos

    exemplos acima foram usadas constantes inteiras, mas em geral cada ndice pode ser formado

    por uma expresso escalar, que , qualquer expresso aritmtica cujo valor um escalar e do tipo

    Matrizes 6-60

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    inteiro. Cada ndice deve estar dentro da faixa correspondente aos limites definidos na

    declarao da matriz e o nmero de ndices deve ser igual dimenso. Abaixo, alguns exemplos:

    A(1)

    bi(i*j)

    matriz(nint(x+3.)) ! a funo intrnseca nint, arredonda para o nmero inteiro mais

    prximo. Alm disto, sub-matrizes, chamadas de sees, podem ser referenciadas especificando-

    se uma faixa de um ou mais sub-ndices. Exemplos:

    a(i:j) ! Pega todos os valores entre o ndice i e o ndice j

    b(k,1:n) ! Matriz de uma linha e n colunas

    c(1:i, 1:j, k)

    d(:,1) ! toda a primeira coluna da matriz

    e(1,: ) ! toda a primeira linha da matriz

    Exemplo:

    1. program meia_matriz 2. implicit none 3. real,dimension(3,3) :: a 4. real,dimension(2,2) :: b 5. integer :: i 6. integer :: j 7. do i=1,3 8. do j=1,3 9. a(i,j)=i*j 10. enddo 11. enddo 12. b(:,:)=a(1:2,2:3) 13. write(*,100) ((a(i,j),j=1,3),i=1,3) 14. 100 format(3(F10.5,2x)) 15. write(*,200) ((b(i,j),j=1,2),i=1,2) 16. 200 format(2(F10.5,2x)) 17. end program meia_matriz

    No exemplo acima, a matriz b ser formada pelos elementos da primeira e segunda linhas

    e da segunda e terceira colunas de a . Sendo:

    | 1 2 3 |

    a = | 2 4 6 |

    | 3 6 9 |

    A matriz b, ser:

    b = | 2 3 |

    Matrizes 6-61

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    | 4 6 |

    6.4 Matrizes de tamanho assumido

    Quando matrizes so passados como parmetros para subprogramas, na maioria dos

    casos, se sabe qual a dimenso dos mesmos, e no momento da declarao, informa-se o seu

    tamanho. O Fortran 90, permite que a matriz seja declarada, mas sem uma dimenso definida.

    No momento da chamada do subprograma, ele assumir o tamanho da matriz que estiver sendo

    passado. Quando for declarado pela clusula dimension, cada dimenso ter a forma:

    [limite inferior]:

    Onde limite inferior uma expresso inteira. Caso no seja informado, a matriz assumir

    o valor 1, independentemente do limite inferior declarado no programa principal. O que

    acontecer, que o subprograma assumir que a matriz tem dimenso (1:N,1:M), onde M e N

    so as dimenses totais dos matrizes.

    Exemplo:

    real,dimension(-1:5,3:6) :: a

    ...

    call sub_pro(a)

    .....

    real,dimension(:,: ),intent(in) :: a

    ...

    No exemplo acima, a assumir as dimenses (1:7,1:4). Para que o subprograma assuma

    os limites inferiores, a matriz a, deve ser declarada da seguinte forma:

    real,dimension(-1:,3: ),intent(in) :: a

    Para que o compilador saiba que os matrizes que compe a subrotina so de tamanho

    assumido, h uma obrigatoriedade de se ter uma interface explcita informando o formato dos

    parmetros do subprograma.

    6.5 Objetos automticos

    Em subprogramas cujos argumentos que so matrizes mudam de tamanho a cada

    chamada, podem necessitar de matrizes declarados localmente, que possuam o mesmo tamanho

    dos parmetros passados. Estes matrizes so chamadas de automticas, e so exemplos de

    objetos automticos de dados. Estes so objetos de dados cujas declaraes dependem dos

    Matrizes 6-62

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    valores de expresses no constantes, e no so argumentos de subprogramas. No exemplo

    abaixo, a matriz work, modifica de tamanho a cada chamada da subrotina:

    1. subroutine swap(a,b) 2. real,dimension(: ), intent(inout) :: a 3. real,dimension(: ), intent(inout) :: b 4. real,dimension(size(a)) :: work 5. work=a 6. a=b 7. b=work 8. end subroutine swap

    6.6 Matrizes alocveis

    Uma das caractersticas mais marcantes do Fortran 90, justamente a possibilidade de

    alocar matrizes dinmicamente. A idia declarar todas as matrizes que se quer usar, sem

    informar suas dimenses. Para isto, sua declarao dever estar acompanhada do atributo

    allocatable:

    integer,dimension(:,: ),allocatable :: matriz

    No exemplo acima, a matriz possui duas dimenses.

    6.7 Comando allocate

    O objetivo do comando allocate, alocar espao para matrizes.

    Formato:

    allocate(matriz(limite_inferior:limite_superior, ),STAT=ierr)

    Onde:

    matriz nome da varvel que se quer alocar espao.

    Limite_inferior - ndice inferior da matriz.

    Limite_superior - ndice superior da matriz.

    Caso no seja informado o limite inferior, assume-se que 1.

    Ierr - Argumento de sada, inteiro. Retorna 0 caso a matriz tenha sido alocada com

    sucesso, ou o nmero do erro em tempo de execuo se um erro ocorrer. Se for especificado, o

    parmetro STAT= deve aparecer como o ltimo argumento da lista. Se STAT= for omitido e um

    erro ocorrer durante a alocao, o programa termina.

    Observaes:

    O comando allocate, aloca espao e d um formato definido a uma matriz. Para desalocar

    a matriz da memria, deve-se usar o comando deallocate.

    Matrizes 6-63

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Quaisquer variveis ou funes usadas para especificar os limtes da matriz podem ser

    redefinidas ou descartadas sem afetar os limtes j estabelescidos para a matriz.

    O comando allocate deve especificar limites para cada dimenso da matriz allocatable.

    Isto significa que o nmero de dimenses a ser dimensionado, dever ser o mesmo que foi

    declarado anteriormente.

    Quando uma matriz alocata por um comando allocate, este permanece alocado e

    definido at que seja desalocado pelo comando deallocate. Se for uma matriz j alocada, e

    houver uma nova tentativa de alocao, isto gerar um erro de execuo no programa.

    Para determinar se uma matriz alocvel est atualmente alocada, usa-se a funo

    intrnseca allocated.

    Exemplos:

    1. program aloca_matriz 2. implicit none 3. real,dimension(:,: ),allocatable :: a 4. integer :: dimensao 5. write (*,*) Informe a dimensao da matriz: 6. read (*,*dimensao 7. allocate(a(dimensao,dimensao)) 8. end program aloca_matriz

    6.8 Comando deallocate

    objetivo da funo deallocate liberar o espao previamente reservado em um comando

    allocate.

    deallocate(matriz1, matriz2, )

    Matriz1, - So os nomes das matrizes que devero ser desalocadas, separadas por

    vrgulas. Todos os membros da lista devem ter sido previamente alocados com o comando

    allocate.

    Observaes:

    Se houver uma tentativa de desalocar uma matriz que no foi alocada, o fortran gerar um erro em tempo de execuo.

    Qualquer falha na desalocao causa o trmino do programa a menos que for especificado o parmetro stat=.

    Se um array allocatable for referenciado quando ele no estiver alocado, o resultado imprevisvel.

    Matrizes 6-64

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    Exemplo:

    1. program alloca 2. implicit none 3. real,dimension(:),allocatable :: a 4. integer :: n=10 5. allocate(a(n)) 6. a(:)=1 7. deallocate(a) 8. end program alloca

    6.9 Construo where

    Permite que operaes sejam executadas em matrizes de maneira seletiva. A idia do

    comando where, fazer uma varredura na matriz, comparando cada um dos elementos com uma

    expresso-mscara.

    Formato:

    where(expresso-mascara)

    . Comandos a serem executados

    elsewhere

    .. Comandos a serem executados

    end where

    Observaes:

    O objetivo do comando where, localizar dentro da matriz todos os elementos que

    satisfaam a uma determinada condio. Caso a comparao entre a expresso lgica e o

    elemento da matriz, seja verdadeiro, ento um bloco de comandos executado. Caso seja falso, o

    bloco de comandos aps o elsewhere executado. Caso este no esteja presente, o controle da

    execuo passa para a primeira linha aps o end where.

    Exemplo:

    Matrizes 6-65

  • Fortran 90 Curso bsico Copyright 1998 by J.D.B.

    1. program testa_where 2. implicit none 3. real,dimension(2,2) :: a 4. a(1,1)=1 5. a(1,2)=0 6. a(2,1)=0 7. a(2,2)=2 8. write (*,*) 'Matriz antes: ',a 9. where(a>0) 10. a=a+10 11. elsewhere 12. a=1 13. end where 14. write (*,*) 'Matriz depois: ',a 15. end program testa_where

    6.10 Exerccios resolvidos

    1. Escrever um programa que gera uma matriz A(n,m), levando em conta a seguinte regra de

    formao da matriz:

    a(i,j)=sin(i)+cos(j) para ij

    a(i,j)=exp(i*tg(1/i)) para i==j

    2. Escrever