Académique Documents
Professionnel Documents
Culture Documents
Introduo ao Fortran
Ps-D.Sc. Weslley Assis
Sala C07
Sumrio
Conceitos
PrimeiroPrograma
Operadores
ComandosdeEntradaeSada
Funesdisponveis
Programa
Oqueumprograma?
Umconjuntodeinstruesencadeadas
demodolgico,convertidoemuma
linguagemquecomputadorespodem
interpretar
Oqueumconjuntodeinstrues
encadeadasdemodolgico?
Algoritmo
Umalgoritmoumconjuntodeinstrues
(comandos/ordens)encadeadosdemodo
lgico
Comotransformaralgoritmosem
instruesqueocomputadorpossa
interpretar?
Compiladores
Umcompiladorresponsvelpor
transformaralgoritmos,escritosem
algumalinguagem,eminstruesqueo
computadorpossainterpretar
Relembrando
Algoritmo
CdigoFonte
Compilador
Objetivo da Disciplina
Estabelecercontatocomumalinguagemde
programao
Construirprogramasnestalinguagem
Tercontatocomosproblemasadvindosde
transformaesdealgoritmospara
programas
Linguagem
LinguagemFortran90
Compiladorgfortran(openfree)
Ambientegedit
Observaes
Trabalhoseexercciosdeveroser
entreguesnopadrofortan90
QualquerIDEpodeserusadoparao
desenvolvimento
Antes de comearmos...
Devemos saber responder algumas questes BASTANTE
bsicas:
2.
Tenha prazer em programar como quem est para decifrar um enigma. Como
eu fao esse computador fazer o que eu quero?
3.
4.
5.
6.
Desenvolvendo programas
Planejar;
Lgica de programao
Desenvolver;
Linguagem (C/C++, Fortran, Java, etc...)
Ambiente de programao (Vi, Notepad, Visual Studio, KDE developer, etc...)
Testar (depurao);
Ambiente de programao
Corrigir (depurao);
Ambiente de programao
Commentary: most debugging problems are fixed easily;
identifying the location of the problem is hard. -- unknown
Construindo um programa
Pr-processamento
Compilao
linkedio ou linkagem
fonte
pr-processado
fonte
pr-processado
arq1.f90
arq1.i
arq1.f90
arq1.i
compilado
compilado
arq1.obj
arq1.obj
fonte
pr-processado
fonte
pr-processado
arq2.f90
arq2.i
arq2.f90
arq2.i
compilado
compilado
arq2.obj
arq2.obj
fonte
pr-processado
fonte
pr-processado
arq3.f90
arq3.i
arq3.f90
arq3.i
compilado
compilado
arq3.obj
arq3.obj
programa
programa
foo.exe
foo.exe
Em Unix e similares:
Referncias
Google, Google, Google
34.300.000 referncias para a palavra Fortran
Fortran Wikipedia:
http://pt.wikipedia.org/wiki/Fortran
Livros:
Stephen J. Chapman, Fortran 90/95 for Scientists and Engineers
James F. Kerrogan, Migrating to Fortran 90
Apostila:
http://www.nacad.ufrj.br/~rnelias/fortran
Fortran90 (1993);
Fortran95 (1997);
Fortran2003;
HPC (High Performance Fortran)
Fortran IV
Fortran 90
FORTRAN
Fortran 77
Fortran 95
Fortran 2003
Elementos da linguagem
O Fortran no sensvel letras maisculas e minsculas:
Casa = casa = CASA = cASA = cAsA = CaSa
Caracteres de comentrio
Rtulos (labels)
Continuao de linha
Formatos de arquivos
FIXO
LIVRE
O que um tipo?
O tipo de uma varivel informa ao compilador, e consequentemente ao
programa, como o computador dever interpretar a varivel.
No exemplo acima a, i e str ocupam quantidades distintas de
memria devido aos seus TIPOS serem tambm diferentes.
Comentrio til
Varivel auto-explicativa:
integer :: NumberOfNodes
Tipos de dados
Inteiro
integer :: n = 1
Lgico
logical :: ok = .false.
Character
character
:: str*80
character(80) :: str
character*80 :: str
character*80 str
=
=
=
=
=
'Elias'
'Renato'
25628080
30
.true.
Declarao implcita
Antagonicamente NO recomendado, porm, bastante til
Declarao de tipo implicitamente determinada pela primeira
letra do nome da varivel:
i,j,k,l,m,n: variveis inteiras
a-h, o-z: variveis reais de preciso simples
Na prtica...
program foo
implicit real*8 (a-h,o-z)
a = 2.d0
b = 3.d0
c = a+b
print *, c
end program
program foo
implicit none
real*8 :: a,b,c
a = 2.d0; b = 3.d0; c = a+b
print *, c
end program
program foo
implicit none
a = 2.d0
b = 3.d0
c = a+b
print *, c
end program
ERRADO!!!!
produzir erro de compilao
Operadores
Operadores Lgicos
Exemplo:
considere aa=.true.
= .true.ee bb=.false.
= .false.para
paraavaliar
avaliaras
asseguintes
seguintesoperaes
operaeslgicas
lgicas
c = a .and. b ! c = .false.
c = a .or. b
! c = .true.
c = .not. a
! c = .false.
c = a .eqv. b ! c = .false.
c = a .neqv. b ! c = .true.
Exemplo:
x+1/x-1 diferente de (x+1)/(x-1)
Observao:
algumas funes intrnsecas possuem verses especficas de acordo
com o tipo de dado utilizado, por exemplo:
dabs(x) ! x e o resultado da operao so real*8
iabs(n) ! n e o resultado da operao so integer
Programa PI
Programa PI:
Obter o valor de PI usando a funo intrnseca ACOS do Fortran para
obter o Arco-cosseno de -1
program PIValue
real*4 :: pi_sp
real*8 :: pi_dp
pi_sp = acos(-1.)
print *, Pi in single precision is:, pi_sp
pi_dp = dacos(-1.d0)
print *, Pi in double precision is:, pi_dp
end program
Inside every well-written large program is a well-written small program. -- Charles Antony
Richard Hoare, computer scientist
Real
3.0/5.0 = 0.6
3./5. = 0.6
13./4.0 = 3.25
Mista
3.0/5 = 0.6
13/4.0 = 3.25
Lets do something...
Programa DegToRad para converter graus em radianos
se 180 equivale a pi radianos, ento, usando a nossa velha conhecida
regra de 3:
xo = x*pi/180
program DegToRad
real*8 :: ang, PI
PI = dacos(-1.d0)
ang = 45
print *, ang , graus = , ang*PI/180.0, radianos
end program
Comandos condicionais
Os comandos condicionais causam desvios no fluxo natural do
programa de acordo com a avaliao de alguma expresso
lgica
Em Fortran, os comandos condicionais bsicos so:
IF (lgico)
IF, THEN, ELSEIF, ENDIF
CASE
Comandos condicionais
IF (lgico):
executa, ou no, uma operao de acordo com a avaliao de uma
expresso lgica (Booleana)
if (a<10.0) a = 0.0
! Exemplo 3
if (b > c) then
a = a+1
c = 0
elseif (c.eq.a) then
a = a-1
b = 10
else
a = a+2
b = 0
endif
Repare que o elseif nada
mais do que um if aninhado
numa clusula else
Comandos condicionais
SELECT CASE:
Este comando pode substituir uma srie de ifs aninhados, porm, ele
s pode ser utilizado com variveis INTEGER e CHARACTER
nome: select case (i)
case(:-1) ! todos os valores inteiros menores que 1
print *, numero negativo
case(0) ! somente se i for igual a 0
print *, zero
case(1:9) ! numeros inteiros entre 1 e 9
print *, numero de 1 unico digito:
case(10:99) ! numeros inteiros entre 10 e 99
print *, numero de 2 digitos
end select nome
Comandos de repetio
Os comandos de repetio, laos ou loops so utilizados na
execuo de um ou mais comandos repetidas vezes.
Em Fortran, os comandos de repetio so:
DO (simples e infinito)
WHILE
Loops implcitos (veremos mais tarde quando tratarmos de variveis
indexadas)
Comandos de repetio
DO:
Os laos DO em Fortran so a forma mais natural de se realizar uma
ou mais operaes repetidas vezes. Nesse tipo de lao uma varivel de
controle utilizada como contador e, consequentemente, como critrio
de parada para o lao.
Forma geral:
nome: DO <varivel de controle> = inicio, fim, incr
! corpo do lao
ENDDO nome
Observaes:
Se o incremento for unitrio o mesmo poder ser omitido
O incremento poder ser negativo (decremento)
A varivel de controle no deve ser alterada no interior do lao
! Exemplo 4:
i0=-5; i1=30; inc=4
DO n=i0,i1,inc
print *, n
ENDDO
! Exemplo 5:
h=0.5
DO x=4.0,7.9,h
print *, x
ENDDO
! Exemplo 6:
externo: DO i=5,10
interno: DO j=10,1,-1
print *, i+j vale:, i+j
ENDDO interno
ENDDO externo
! Exemplo 3:
DO i=1,10
j = j+1
DO j=10,1
! variavel de controle
! do segundo loop sendo
! usada no primeiro loop
ENDDO
ENDDO
! Exemplo 4
externo: DO i=1,10
interno: DO j=1,10
! laos cruzados
enddo externo
enddo interno
Comandos de repetio
DO WHILE:
O lao DO WHILE executa uma ou mais operaes ENQUANTO uma
condio esteja sendo satisfeita (avaliada como verdadeira).
Forma geral:
nome: DO WHILE <teste lgico>
! corpo do lao
END DO nome
Observaes:
Ao contrrio do que ocorre com o lao DO, no DO WHILE a varivel de
controle utilizada no teste lgico, pode (e geralmente ) utilizada em
alguma operao no corpo do lao
DO WHILE em exemplos:
! Exemplo 1
i=0
DO WHILE (i<=10)
print *, i
i = i + 1
END DO
! Exemplo 2
logical :: Ok = .false.
i=1; j=50
DO WHILE (.not.Ok)
i=i+1
j=j-2
Ok = i>j
print *, Ok, i, j
ENDDO
Comandos de repetio
DO infinito:
O Fortran 90 introduziu o conceito de DO infinito, ou eterno. Nesse tipo
de lao uma ou mais operaes so repetidas indefinidamente (o que
faz pouco sentido em programao) ou at que algum comando force a
sada de dentro do lao
Forma geral:
DO
! corpo do loop
if <satisfeita uma condio> exit
ENDDO
DO infinito em 1 exemplo
program CelsiusToKelvin
real*4 :: celsius
character :: opt*1
DO
print *, 'Entre com a temperatura em Celsius:'
read(*,*) celsius ! falaremos do comando READ mais tarde
print *, celsius, ' Celsius = ', celsius+273.15, ' Kelvin'
print *, 'Deseja sair (S/N)'
read(*,*) opt
if (opt.eq.'s'.or.opt.eq.'S') exit
ENDDO
end program