apost fortran90
Post on 14-Jan-2016
72 Views
Preview:
DESCRIPTION
TRANSCRIPT
-
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
top related