You are on page 1of 55

Programao de Computadores

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:

O que um programa de computador?


Por que eu preciso aprender a programar?
O que um arquivo ou cdigo fonte?
O que um objeto ou arquivo compilado?
O que uma linguagem de programao?
O que lgica de programao?
O que um pr-processador?
O que um compilador?
O que um linker?
O que uma biblioteca?

Como aprender uma linguagem de programao?


slide de (des)motivao para aprendizado de qualquer linguagem de programao
1.

Precise dela!!!!! Se eu no preciso, por que tenho de aprend-la?

2.

Tenha prazer em programar como quem est para decifrar um enigma. Como
eu fao esse computador fazer o que eu quero?

3.

Pegue um programa simples, contendo bons comentrios passo-a-passo e


tente utilizar os fragmentos que se assemelham com o que se deseja fazer
como um modelo. Guarde esse programa-modelo em um cofre a sete chaves at
se sentir seguro o suficiente para programar sozinho

4.

Comece a programar com a ajuda de um bom ambiente de programao. mas


nunca se torne escravo dele

5.

No desanime, seja persistente! Errar a melhor parte do processo de


aprendizado pois os erros, geralmente, so mais facilmente assimilados do que os
acertos

6.

No tenha medo de tentar! O (bom) compilador adora nos humilhar mostrando


nossos deslizes, alm disso, um simples programa no ir fazer o computador
explodir -- mas talvez ele precise ser reiniciado...
A good programmer is someone who looks both ways before crossing a one-way street.
-- Doug Linder, systems administrator

Desenvolvendo programas
Planejar;
Lgica de programao

Desenvolver;
Linguagem (C/C++, Fortran, Java, etc...)
Ambiente de programao (Vi, Notepad, Visual Studio, KDE developer, etc...)

Pr-processar, compilar e linkeditar


Compiladores (Intel, G95, PGF90, Compaq, gfortran e 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

O que eu preciso para programar em Fortran?


Um editor de textos, um compilador ou um ambiente de
programao que fornea o editor de textos e o compilador
juntos
Em Windows:
Compaq Visual Studio (comercial)
Visual Studio + Intel Fortran (comercial)
Fortran Force (gratuito: http://www.guilherme.tk/)

Em Unix e similares:

G77 (gratuito no recomendado);


Sun Studio (gratuito);
Intel Fortran (gratuito para uso no comercial)
Compilador do Portland Group (comercial)
Gfortran (gratuito)

Referncias
Google, Google, Google
34.300.000 referncias para a palavra Fortran

Fortran Wikipedia:
http://pt.wikipedia.org/wiki/Fortran

Fortran Standards Technical Commitee


http://www.j3-fortran.org/

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

Fortran Um pouco de histria


Criada em 1954-57 por uma equipe da IBM chefiada por John Backus;
Nome da linguagem derivado de seu principal propsito FORmula
TRANslator
Primeira linguagem de programao de alto nvel desenvolvida para
computadores;
Com sua rpida popularizao surgiu a necessidade de uma
padronizao em 1966 (Fortran IV ou Fortran66)
Sofreu algumas modificaes em 1977 (Fortran77)
Outras atualizaes:

Fortran90 (1993);
Fortran95 (1997);
Fortran2003;
HPC (High Performance Fortran)

Motivos para NO APRENDER Fortran


Programao de interface grfica (GUI);
Programao de bancos de dados;
Programao voltada para internet;
Programao que utilize manipulao intensiva de strings;
Programao dirigida a objetos (OOP).

Motivos para APRENDER Fortran


Fcil de aprender, desenvolver e depurar;
Extremamente eficiente na execuo de CLCULOS;
CLCULOS
Milhares de bibliotecas cientficas testadas, otimizadas e
distribudas gratuitamente para uso com o Fortran;

Deficincias anteriores ao Fortran 90


Exigncia de uso de formato fixo para codificao;
Impossibilidade de acesso dinmico de dados;
Inabilidade de representao implcita de operaes em arrays
Falta de portabilidade (padro definido pelo fabricante)
Impossibilidade de definio de tipos pelo programador;
Inexistncia de recursividade;
Acesso aos dados globais atravs de COMMON blocks

Recursos adicionados ao Fortran90


Formato livre de arquivos;
Sintaxe prpria para operaes com arrays
Alocao dinmica e incluso de pointers
Tipos de dados portveis (KIND)
Tipos de dados derivados e operadores
Recursividade
Modules em substituio e extenso aos COMMON BLOCKS
Estruturas de controle mais aprimoradas
I/O aprimorado

O que iremos aprender?

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

Formatos de arquivos aceitos pelo Fortran

Fixo (extenses *.for, *.f77, *.f, *.F)


Livre (extenses *.f90, *.F90)

Caracteres de comentrio

Linhas contendo os caracteres c ou C na coluna 1


Qualquer texto iniciado pelo caractere !

Rtulos (labels)

Nmeros de (1 a 99999) colocados nas 5 primeiras colunas

Continuao de linha

Formato fixo: linha que possui qualquer caractere na coluna 6


Formato livre: Qualquer linha finalizada com um ampersand (&)

Vrios comandos em uma mesma linha

Separar os comandos com um ponto e vrgula ;

Formatos de arquivos
FIXO

LIVRE

Comentrios e continuao de linha


Formato fixo (arquivo hello.f)

Formato livre (arquivo hello.f90)

Outras perguntas bsicas...


O que uma varivel?
a = 1.0
i = 1
str = Fortran

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.

Evitando dores de cabea


Faa comentrios significativos nos seus programas:
Comentrio intil
i=0 ! i recebe valor 0

Comentrio til

i=0 ! i est sendo zerado pois ser utilizado como


! contador do prximo loop

Crie nomes de variveis auto-explicativos


Varivel pouco explicativa:
integer :: n

Varivel auto-explicativa:
integer :: NumberOfNodes

Endente seu programa para facilitar a leitura


Tente usar somente funes intrnsecas da linguagem
Compatibilidade = portabilidade = flexibilidade
Se for usar bibliotecas, procure se informar se essa biblioteca estar disponvel
nos sistemas que pretende usar

Estrutura bsica de um programa Fortran


program <nome_do_programa>
! declaracao de modules
use dados
! declaracao de variaveis
integer :: n, k, l
! corpo do programa
n = 1
k = 2
l = n+k
print *, l
! finalizacao do programa
end program

Tipos de dados
Inteiro
integer :: n = 1

Real de preciso simples


real*4 :: a = 3.0 ! 7 casas de preciso
real(4) :: a = 3.0E1
real
:: a = 3.

Real de preciso dupla


double precision :: a = 2.5d0 ! 15 casas de preciso
real*8
:: a = 2.5D0
real(8)
:: a = 2.5D0

Lgico
logical :: ok = .false.

Tipos de dados (continuao)


Complexo de preciso simples
complex*8 :: c = (1.,4.)
complex
:: c = (1.3,4.1E1)

Complexo de preciso dupla


complex*16 :: c = (1.d0,4.d0)

Character
character
:: str*80
character(80) :: str
character*80 :: str
character*80 str

Tipos de dados derivados


Permite a criao de tipos de acordo com a necessidade do
programador
Type employee_name
SEQUENCE ! (Opcional) preserva a ordem de armazenamento dos
campos
character(25) last_name
character(15) first_name
END TYPE employee_name
Type employee_data
TYPE (employee_name) :: name ! Usando o tipo previamente
criado
integer telefone
integer age
logical married
END TYPE

Usando um tipo derivado


Type(employee_data) :: employee
employee%name%last_name
employee%name%first_name
employee%telefone
employee%age
employee%married

=
=
=
=
=

'Elias'
'Renato'
25628080
30
.true.

! Ver programa exemplo typeder.f90

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

Modificando a declarao implcita


implicit real*8 (a-h,o-z)
implicit integer (i-k)

Obrigando que todas as variveis sejam explicitamente


declaradas
implicit none

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.

Hierarquia entre operaes


1. Parnteses mais internos
2. Clculo de funes
3. Potenciao
4. Menos unrio
5. Multiplicao e diviso
6. Adio e subtrao
7. Concatenao

Exemplo:
x+1/x-1 diferente de (x+1)/(x-1)

Algumas funes intrnsecas

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

Aritmtica inteira, real e mista


Inteira
3/5 = 0
13/4 = 3

Real
3.0/5.0 = 0.6
3./5. = 0.6
13./4.0 = 3.25

Converso automtica de tipo:


program conv
integer :: nres
nres = 1.25+9/4
print *, nres
! imprimir 3 ao invs de 3.5
end program
ATENO:

Mista
3.0/5 = 0.6
13/4.0 = 3.25

Notem que embora o resultado da operao


seja real, ele foi armazenado em uma varivel
do tipo inteiro ocasionando uma converso
automtica. (EVITEM FAZER ISSO!!!)

Evitando o uso de potenciao


A potenciao internamente implementada como uma
operao com logartmos, portanto, uma operao lenta e
sujeita a erros
result = y**2.0

! internamente seria result = exp(x*ln(2.0))

Podemos evitar isso utilizando expoentes inteiros sempre que


possvel ou realizando a operao explicitamente:
result = y**2
result = y*y

Operaes com strings


Para o Fortran uma string um array de characters
program string
character(3) :: str1, str2
character(6) :: str3
str1 = ABC
str2 = DEF
str3 = str1//str2 ! concatenando str1 com str2
print *, str3
print *, primeiras 2 letras de str1: , str1(:2)
print *. ultimas 4 letras de str3: , str3(3:6)
end program

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

IF, THEN, ELSE, ELSEIF:


desvia a execuo do programa de acordo com a avaliao de uma, ou
vrias, expresso(es) lgica(s)
nome: if (teste logico) then
! corpo do if
end if nome
! os nomes so opcionais e geralmente utilizados para
! fins de identificacao

IF, THEN, ELSE, ELSEIF (continuao...)


! Exemplo 1
if (b > c) then
a = a+1
c = 0
else
a = a1
b = 10
endif
! Exemplo 2
idade: if (age>18) then
print *, maior
else
print *, menor
endif idade

! 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)

Existem comandos auxiliares que controlam a sada forada de


dentro de um lao, so eles:
exit
cycle [label]:
goto [label]:
return:

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

DO: O que podemos fazer...


! Exemplo 1:
DO i=1,10
print *, i
ENDDO
! Exemplo 2:
DO n=1,10,3
print *, n
ENDDO
! Exemplo 3:
DO j=10,1,-1
print *, j
END DO

! 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

DO: O que NO podemos fazer...


! Exemplo 1:
DO i=1,10
i = i+1
! i no deve ser usado em
! calculos dentro do loop
ENDDO
! Exemplo 2:
DO i=1,10
DO i=10,1
! 2 loops com a mesma
! varivel de controle
ENDDO
ENDDO

! 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

Complicando o que deveria ser simples...


program DOCycle
cycle_loop: do i = 1, 5
print *,i
if (i.gt.3) cycle cycle_loop
print *,i
end do cycle_loop
print *,'done!'
end program
! Quando i torna-se maior que 3 o loop s
! executado at o cycle

You might also like