Você está na página 1de 8

1

TUTORIAL DE FORTRAN

Ana Paula Andrade


Departamento de Ciências Exatas e Tecnológicas - UESC
Disciplina: Laboratório de Computação Científica I
Curso: Física – Bacharelado e Licenciatura

- Para compilar um ‘códigofonte’ do GNU fortran77


f77 -C codigofonte.f (a terminação .f é obrigatória)

- Para criar um arquivo executável de um código já compilado:


f77 codigofonte.f -o condigofonte.exe (a terminação .exe é opcional)

- Para compilar o arquivo fonte e criar o arquivo executável em seguida:


f77 -O codigofonte.f -o codigofonte.exe

- Para executar um programa gerado:


./nomedoprograma

Itens Obrigatórios em um código fonte:


- Iniciar os comandos na 7a coluna.
- Linhas de comentários começam com um c na 1a coluna.
- Comentários no meio da linha em diante começam com uma exclamação!

Comandos Obrigatórios
- para começar: program
- para terminar: end
- Cabeçalho na abertura do programa contendo a declaração das variáveis:

Tipo Declaração Exemplo

Inteiras Integer -5; 9; -349, 9100


Reais (precisão simples) Real 3.141516; 1.5E-3; -6.645
Precisão dupla double precision 3.141516; 1.5E-3; -6.645
Complexa Complex 2.5 + 3.9i; 0 + 5i
Literal character*20 Uma seqüência de 20 caracteres
Lógica Logical True ou False
Constante Parameter Do tipo declarado
dimension matriz(m,n) Matriz de m linhas e n colunas
do tipo default (real)
dimension matriz(0:m,0:n) Matriz cuja contagem de linhas e
colunas começa no zero, ou seja
Matriz uma matriz de m+1 linhas e n+1
colunas
dimension matriz(-m:m,-n:n) Matriz de 2m+1 linhas e 2n+1
colunas
real matriz(-m:m,-n:n)
integer matriz(-m:m,-n:n)
complex matriz(-m:m,-n:n)
2

- Em uma lista, as variáveis devem ser separadas por vírgulas, exemplo:

integer i, j, k, matrizA(0:20 , 1:3), somamatriz,n_element, n_aluno


parameter (n_aluno = 20, n_nota = 3)

- O comando implicit none é usado para anular variáveis implícitas. Quando usado, todas as
variáveis inteiras ou não devem ser declaradas.

Operadores Aritméticos:

Adição +
Subtração -
Multiplicação *
Divisão /
Potenciação **
Comando de Atribuição =

Algumas Funções Matemáticas Específicas

Raiz quadrada de um número SQRT(numero)


Conversão de para um numero real REAL(numero)
Parte imaginária de um número complexo AIMAG(numero)
Valor absoluto de um número inteiro ou real ABS(numero)
Parte inteira de um número real INT(numero)
Aproximação de um número real ao inteiro NINT(numero)
mais próximo
Valor máximo de dois números MAX(numero1,numero2)
(Também vale para 3 ou mais números)
Valor mínimo de dois números MIN(numero1,numero2)
Logaritmo de um número LOG(numero)
Logaritmo neperiano LN(numero)
Exponencial de um número EXP(numero)
Cosseno de x (em radianos) COS(x)
Seno de x SIN(x)
Tangente de x TAN(x)
Arco cosseno de x ACOS(x)
Arco seno de x ASIN(x)
Arco tangente de x ATAN(x)

Para abrir um arquivo


open (unit = numero, file = 'nomedoarquivo', status = 'situação')

unit => número inteiro que servirá de referência para o arquivo


file => nome (e endereço) do arquivo a ser aberto
status => situação do arquivo (new, old ou unknown)
new => arquivo que obrigatoriamente não existe e deverá ser criado;
3

old => arquivo que obrigatoriamente já existe;


unknown => arquivo que pode ou não existir.

Para mover o cursor ao início do arquivo


rewind unit

Para mover o cursor para o começo da linha seguinte


backspace unit

Para fechar o arquivo


close(unit)

Para ler dados não formatados no arquivo:


read(unit,*)dado1,dado2

Para ler um dado não formatado do teclado


read *, dado
read(*,*)

Para escrever dados não formatados no arquivo:


write(unit,*)dado1,dado2

Para escrever dados não formatados no monitor


print *,dado
print *, 'Escrevendo o dado',dado
write(*,*)'Escrevendo o dado',dado

Para escrever dados formatados (troca-se o * por uma lista de comandos de formatação)

1 – write (unit,'lista de formataçao')dado1,dado2


2 – write (*,'lista de formatação')dado1,dado2
3 - print 40, dado1,dado2
40 format (lista de formatação)

Esta lista de formatação deve conter informações sobre o tipo de variável e a formatação desejada,
sendo as mais comuns:

Iw Dado inteiro com largura total de campo w.


Iw.m Dado inteiro com largura total de campo w e numero mínimo de caracteres m.
Fw.d Dado real com largura total de campo w e d casas decimais.
nX n espaços horizontais.
Ew.d Dado real em notação exponencial, com largura total de campo w e d casas
decimais.
Aw Dado de caractere com largura de campo w
PEw.d Dado real com p números antes da vírgula, em notação exponencial, com
largura total de campo w e d casas decimais.
/ Espaço vertical (saltar linha).
(Veja alguns exemplos no programa ‘formatação.f’, ao final deste texto)
4

Para ler dados formatados:


- a formatação deve ser especificada da mesma forma. Porém troca-se o comando write por read,
sendo:
read(unidade, 'lista de formatação') dado1,dado2

Para ler dados de um arquivo cujo final não se conhece bem


- usa-se a função iostat, sendo:

read(unidade, 'lista de formatação', iostat=var)

Neste caso, ao final da leitura, o valor da variável var será um valor retornado pela função iostat,
que será:

- um número positivo, caso tenha havido um erro na leitura dos dados;


- um número negativo, caso o final do arquivo tenha sido encontrado sem erros;
- zero se nenhum erro tenha sido encontrado, nem o final do arquivo.

Também se pode usar a função end para identificar o final de um arquivo:

read(unidade, 'lista de formatação', end=5)dado1,dado2


.
.
.
5 close(unidade)

No exemplo a seguir a identificação do final de um arquivo funciona como um comando goto,


saltando procedimentos e saindo dos loops:

open(15, file = arquivoentrada, status='old')


rewind 15
elementos = 0
do i = 1,1000
do j = 1,1000
read(15,*,end = 5) matriz(i,j) ! Neste caso, a leitura será continuada até que o final
elementos = elementos+1 ! do arquivo seja encontrado, quando o programa
enddo ! saltará para a linha indicada pelo número 5
enddo
5 close (15)

Operadores Relacionais (usados nas expressões lógicas)

Igual Eq
Diferente Ne
Maior Gt
Menor Lt
Maior e igual Ge
Menor e igual Lê
5

Operadores Lógicos (Conectivos)

Conjunção And
Exclusão Not
Disjunção Or
Equivalência Eqv
Não equivalência Neqv

Estrutura Condicional

Simples
if(expressão lógica) ...

Intermediária
if (expressão lógica) then
.
.
.
endif

Completa
if(expressão lógica) then
.
. Faça algo
.
else
.
. Faça outra coisa
.
endif

Estrutura de Repetição

do variável de controle = valor inicial, valor final, passo de incremento


.
.
.
enddo

Exemplo: do i=1,10,2
.
read (unit,*) dado
.
enddo

- Neste caso, i é a variável de controle, cujo valor inicial é 1, o valor final será 10 e o incremento
será de 2 em 2.
- Se não colocar o valor do passo, automaticamente ele assume o valor unitário.
- Os valores inicial, final e o passo podem ser negativos ou mesmo números decimais.
6

Outras opções:

do numero variável de controle = valor inicial, valor final, passo de incremento


.
.
.
n continue

PS: ao invés de colocar enddo, eu uso a indexação n para dizer onde continuar com o loop.

Exemplo: do 10, i=1,8,2


.
.
.
10 continue

Repetição usando while (enquanto):

i=1
do while (i.lt.10)
faça algo
i=i+1
enddo

Neste caso o incremento da variável de repetição deve ser feito pelo usuário.

Para pular atribuições

Usa-se o comando => goto número da declaração

Exemplo: 20 if (soma.le.limite) then


soma = soma+1
goto 20
endif

PS: o valor do flag (que no exemplo acima é 20) deve ser um número inteiro e deve ser colocado
na segunda coluna da linha que deve dar continuidade.

Outro exemplo: do i = 1,20


soma = soma+A(i)
if(soma.ge.30)
goto 10
endif
enddo
10 continue
7

Estruturas como if e do também podem ter nomes associados a elas, tipo:

externo: do i = 1,10
.
.
.
interno: do j = 1,10
.
.
.
enddo interno
enddo externo

Neste caso, as palavras: externo e interno estão nomeando os loops.

Para continuar a uma seqüência de comandos na linha seguinte:

Usa-se o dígito 2 na 5ª coluna da linha seguinte

-----------------------------------------------------------------------------------------------------------------------

A seguir, são listados os códigos-fonte de alguns algoritmos vistos em aula, são eles:

- formatacao.f => Exemplos de saída formatada;

- ordencacao.f; => Ordena uma lista de números em ordem crescente;

- ordenacaoB.f; => Outro método de ordenação;

- somamatriz.f; => Soma duas matrizes;

- media_alunos.f; => Calcula a média individual dos alunos, a média global da turma, a
média dos alunos aprovados e dos reprovados.
8

C Testando os tipos de formatacao


C Ana Paula A Andrade (25/05/2007)
Cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
program formatacao
implicit none
integer u,v,i
real dado1,dado2
character*20 qualquer

u=3
v=-2
dado1 = 2.4583344256
dado2 = 3.141529
qualquer='teste'

open(10,file='saidaformatada.dat',status='unknown')
rewind 10

write(10,*) '********* Saida 1 ****** '


write(10,*)u,v,dado1,dado2
write(10,*)''

write(10,*) '********* Saida 2 ****** '


write(10,'(1(I3),1(I3.2,1x),1(F8.6,1x),1(E12.6,/))')
2 u,v,dado1,dado2

write(10,*) '********* Saida 3 ****** '


write(10,'(1(I3.2),1(I3,2x),1(1pe12.6,1x),1(2pe13.6,1x,/))')
2 u,v,dado1,dado2

write(10,*) '********* Saida 4 ****** '


write(10,'(2(I2,1x),2(1pe12.6,1x),1(A5,/))')
2 u,v,dado1,dado2,qualquer
close(10)

c Para escrever na tela, pode-se usar o comando print


print *, u,v,dado1,dado2
print *
print 10,u,v,dado1,dado2
10 format((1(I3),1(I3.2,1x),1(F8.6,1x),1(E12.6,/)))
print 20,u,v,dado1,dado2
20 format((1(I3.2),1(I3,2x),1(1pe12.6,1x),1(2pe13.6,1x,/)))
print 30,u,v,dado1,dado2,qualquer
30 format((2(I2,1x),2(1pe12.6,1x),1(A5),/))

stop
end
-----------------------------------------------------------
Este programa gera uma saída formatada da seguinte forma:

********* Saida 1 ******


3 -2 2.45833445 3.14152908

********* Saida 2 ******


3-02 2.458334 0.314153E+01

********* Saida 3 ******


03 -2 2.458334E+00 31.41529E-01

********* Saida 4 ******


3 -2 2.458334E+00 3.141529E+00 teste