Você está na página 1de 24

NOES BSICAS

DE
LINGUAGEM FORTRAN
Notas de Aula

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Linguagem Fortran (Notas de Aula)


1. Introduo:
A linguagem FORTRAN foi a primeira linguagem de programao de alto nvel
desenvolvida, foi desenvolvida pela IBM especificamente para clculos numricos, o que o
torna muito robusto para trabalhar com nmeros.
Aqui, ser abordada a programao estruturada tambm conhecida como
programao up-down (de cima para baixo). Um programa escrito como um texto, onde
as frases so ordens, conhecidas como comandos, dadas ao computador. Quando o
computador l um programa dizemos que ele est sendo executado. Este programa pode ser
escrito sem uma regra predefinida de execuo, chamado de no-estruturado, comeando do
incio do texto, indo para o meio, depois para o final, voltando para o incio, de novo para o
final, voltando para o meio, e finalmente terminando a execuo do programa.

Figura 1: Seqncia de execuo de um programa no-estruturado.


Complicado? Por isso foram criadas regras de programao aconselhando aos
programadores que fossem criados programas mais organizados, tanto na disposio dos
comandos, quanto na execuo, estes programas so chamados de estruturados.
Basicamente as regras dizem que os programas fossem escritos linearmente de cima para
baixo, sem os sobe e desce que complicam e tornam ilegveis os programas.
Os programas estruturados tm as seguintes caractersticas:
 Clareza deve estar claro o que cada comando realiza;
 Legibilidade deve ser fcil de se ler e compreender;
 Adaptvel deve ser fcil adapt-lo a qualquer situao;
 Fcil Manuteno deve ser fcil alterar, ou encontrar as linhas de comando;
 Boa Documentao Qualquer pessoa, mesmo que no saiba programar com
Fortran, deve ter condies de compreender o programa.
Alm dessas caractersticas, o programa s pode usar trs estruturas bsicas de
controle:
 Seqncia comandos escritos um aps o outro na ordem em que vo ser
executados;
 Seleo comandos que permitem escolher entre um resultado e outro, ou entre a
execuo de um comando e outro;
 Repetio, Iterao ou Loop comandos que permitem repetir quantas vezes se
queira um determinado comando ou conjunto de comandos.
O princpio bsico da programao estruturada que a execuo do programa deve
ser feita sempre para diante, sem desvios e retornos. Os comandos de seleo e de repetio
so considerados como um nico comando e no como desvios ou retornos.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

2. Caractersticas Bsicas do Fortran:




Caracteres aceitos:


Letras :
a, b, c, d, e, f, g, h, i, j, k, ,l m, n, o, p, q, r, s, t, u, v, w, x, y, z
A, B, C, D, E, F, G, H, I, J, K, ,L M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z

Nmeros:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Smbolos:
+
-

Constantes, Variveis e Tipos:




Constantes: Local na memria do computador que serve para guardar um nmero,


letra ou smbolo, este valor no pode ser alterado. representado com um nome que
dado pelo programador, que tambm no pode ser alterado durante o programa. O
nome deve obedecer a algumas regras que sero apresentadas a seguir.

Varivel: Local na memria do computador que serve para guardar um nmero, letra
ou smbolo, este valor pode ser alterado. representado com um nome que dado
pelo programador, que no pode ser alterado durante o programa. O nome deve
obedecer a algumas regras que sero apresentadas a seguir.

Regra para dar nome a variveis:


1) Cada nome deve ter no mximo 6 caracteres e no mnimo 1 caracter;
2) O primeiro caracter deve ser obrigatoriamente uma letra;
3) Os demais caracteres s podem ser letras ou nmeros;
4) No pode ter espao em branco no meio do nome.
 Exemplos:
Nomes vlidos: JOSE, A1, D3F4, HI98, a23, joao, df34, A4f5.
Nomes invlidos: JOS, 1A, D!F4, H(1), 5b, joo, Nomecomprido.
Tipos: Identifica o tipo de informao que a varivel ou constante ir guardar.
 Integer guarda nmeros inteiros, ex. 1
23
-15
0;
 Real guarda nmeros reais, ex. 1.2
23.0
-15.
0.002;
 Complex guarda nmeros complexos, ex. 1.2
+ i 23.0 -15. + i 0.002;
 Character guarda caracteres, ex. ab, DaQ, 09, +, (%)\!;
 Logical guarda valores lgicos, ou seja, verdadeiro ou falso;

Obs. 1: Basta a presena de um ponto . para que o nmero seja real.


Obs. 2: Se no for especificado o tipo de constante ou varivel, o Fortran ir considerar todos
os nomes iniciados com os caracteres I, J, K, L, M, N, como sendo inteiro e o restante
como sendo real.
Obs. 3: Um nmero complexo escrito entre parntesis. Por exemplo: 1 + i 2 = (1, 2)
-1 + i3 = (-1, 3) -4.5 i2.1 = (-4.5, -2.1)
Obs. 4: Em Fortran, o valor verdadeiro do tipo logical escrito como .true., e o valor falso como
.false., no se pode esquecer os pontos no incio e no fim dos valores lgicos.
Qual a importncia de se dividir as constantes e variveis em tipos ? Existem dois
grandes problemas, o primeiro a quantidade de memria requerida para guardar um valor
qualquer. lgico que para guardar o nmero 9284365.9872 deve-se gastar mais memria
que para guardar o nmero 19, por exemplo. Alm disso, existem tipos que admitem operaes
aritmticas como os tipos integer, real e complex, enquanto que outros no admitem, como o
character e o logical. No faz sentido dividir o valor abc por 2, ou multiplicar o valor .true. por
3.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Como informar qual o tipo de uma varivel ? Basta escrever o nome do tipo seguido de
um espao e do nome das varivel no programa, onde os nomes das variveis so separados
por vrgula (,). Por exemplo:
 integer a1, i2, valor1, numero
 real a1, i2, valor1, numero
 complex a1, i2, valor1, numero
 character a1, i2, valor1, nome
 logical a1, i2, valor1, logico, vouf
Cada tipo de varivel possui um tamanho de memria para que ele possa guardar
informaes, conforme apresentado a seguir:
Tipo
Tamanho
Valor Mnimo
Valor Mximo
Integer
4 bytes
-2147483648
+2147483647
Real
4 bytes
-3.4028235E+38
+3.4028235E+38
Complex
8 bytes
-3.4028235E+38
+3.4028235E+38
- i 3.4028235E+38
+ i 3.4028235E+38
Character
varivel
vazio
32.767 caracteres
Logical
4 bytes
.false. ou .true.
.false. ou .true.
Obs. 1: O nmero real pode ser representado na forma de notao cientfica, onde o smbolo
E ou e representa a base da potncia 10.
12
-4
Ex. 1.5E12 = 1.5 x 10 ,-0.1e-4 = -0.1 x 10 .
Obs. 2: Para nmeros reais qualquer valor acima de -1.1754944E-38, ou abaixo de
+1.1754944E-38 considerado igual a zero (0).
Obs. 3: O expoente da potncia de 10 deve ser inteiro.
Obs. 4: O tipo complex pode ser considerado como dois tipos reais, onde cada um ocupa 4
bytes, dando um total de 8 bytes.
Obs. 5: Os valores do tipo character devem estar entre apstrofes e .
Ex. Texto
0897
a1(4)
Obs. 6: O tamanho, em bytes, de um tipo character igual a quantidade de caracteres que a
constante ou varivel possui mais 1, onde este byte a mais, guarda o tamanho da
constante ou varivel.
3. Expresses:
Existem trs tipos de expresses em Fortran, as expresses aritmticas, cujo
resultado um nmero, as expresses lgicas, e as expresses relacionais, cujos resultados
so .true. ou .false..


Expresses Aritmticas:

Operador Fortran
+
*
/
**

Operador Matemtico
+

ab ou ab

Significado
Adio
Subtrao
Multiplicao
Diviso
Potenciao ou Radiciao

Exemplo
A+B
AB
A*B
A/B
A ** B

Como na matemtica existe uma hierarquia, chamada de ordem de precedncia, ou


seja, quais operaes sero executadas primeiro. Em uma expresso aritmtica os operadores
sero executados obedecendo a ordem de precedncia, mas para operadores de mesma
ordem sero executados da esquerda para a direita. A ordem de precedncia pode ser alterada
com parntesis ( e ), pode-se ter vrios nveis de parntesis, mas no se pode usar
colchetes [ e ] ou chaves { e }. A ordem de precedncia apresentada a seguir:
Operador
**
*
/

Ordem de Precedncia
a
1 ordem (ordem mais alta)
a
2 ordem
a
3 ordem

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir


a

4 ordem
5 ordem (ordem mais baixa)

+
-

Exemplo:
A * B ** C + D E ** F =

(((A * (B ** C)) + D) (E ** F))

Exemplos de Expresses Aritmticas


2




ax + by + c
a
b+c
x n 1
yn

a
a+b
+

b+c
c

Codificao em Fortran
a * x **2 + b * y + c
a / (b + c)

x ** (n 1) / y ** n

x +1
((a + b) / c + a / (b + c)) ** (x + 1)

Obs. 1: Nenhum operador pode ser omitido. Por exemplo: ax + b a * x + b.


Obs. 2: Dois operadores no podem aparecer juntos: Por exemplo: a * -b a * (-b).
Obs. 3: Nos expoentes podem existir constantes, variveis ou expresses aritmticas.
Obs. 4: Das operaes aritmticas acima, a diviso diferente para nmeros inteiros e reais,
para operaes com nmeros inteiros, a casa decimal do resultado truncada.
Exemplos:
7 / 2 = 3, e no 3.5
1 / 3 = 0, e no 0.33,
pois os resultados so inteiros, mas 7.0 / 2 = 3.5 e 1.0 / 3 = 0.33, pois quando um dos nmeros
real o resultado passa a ser real, exceto quando a varivel inteira, neste caso o resultado
convertido para inteiro.


Expresses Lgicas:

Operador Fortran
.GT.
.GE.
.LT.
.LE.
.EQ.
.NE.

Operador Matemtico
>

<

Significado
Maior que
Maior ou igual a
Menor que
Menor ou igual a
Igual
Diferente

Exemplo
A>B
AB
A<B
AB
A=B
AB

A ordem de precedncia igual para todos os operadores lgicos e os resultados de


cada operao ser sempre .true. ou .false., a ordem de precedncia pode ser alterada com
parntesis ( e ).
Exemplo:
(A .GT. B) .EQ. (C .NE. D)


Expresses Relacionais:

Operador Fortran
.NOT.
.AND.
.OR.
.XOR.

Operador Matemtico
No existe

No existe

Significado
Negao
E
Ou
Ou exclusivo

Exemplo
.NOT. A
A .AND. B
A .OR. B
A .XOR. B

A ordem de precedncia a mesma apresentada acima, elas funcionam e obedecem


as mesmas regras que as expresses aritmticas, e pode ser alterada com parntesis. Elas
so usadas em conjunto com as expresses lgicas.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Obs. O operador .NOT. usado com apenas 1 argumento, os demais usam 2 argumentos.
Exemplo:
((A .GT. B) .EQ. (C .NE. D)) . AND. F
O significado desses operadores um pouco diferente do que a matemtica usa, a
seguir so apresentadas tabelas chamadas de Tabela Verdade. Estas tabelas mostram os
possveis resultados das expresses relacionais.
A
.false.
.false.
.true.
.true.

B
.false.
.true.
.false.
.true.

A .AND. B
.false.
.false.
.false.
.true.

A
.false.
.false.
.true.
.true.

B
.false.
.true.
.false.
.true.

A
.false.
.false.
.true.
.true.

B
.false.
.true.
.false.
.true.

A .XOR. B
.false.
.true.
.true.
.false.

A
.false.
.true.

.NOT. A
.true.
.false.

A .OR. B
.false.
.true.
.true.
.true.

4. Comandos de Atribuio, Escrita e Leitura:


Como guardar um valor numrico na memria do computador ? H vrias maneiras de
se guardar no apenas um nmero, mas qualquer tipo de informao, como texto, som,
imagem, etc. Contudo, o nosso objetivo guardar, ou armazenar, nmeros e caracteres na
memria do computador. Uma maneira usar o comando de atribuio, semelhante ao
comando de igualdade da matemtica, porm muito mais poderoso.
4.1. Comando de Atribuio:
O comando de atribuio serve para armazenar valores numricos e caracteres em
constantes e variveis, ou seja, na memria do computador, pois constantes e variveis so
pequenos pedaos de memria do computador que servem como armazenamento temporrio
ou permanente. Quando gravamos apenas nas constantes ou variveis estamos gravando na
memria principal (RAM), e como ele voltil ao trmino do programa a memria apagada.
Enquanto que, quando gravamos no disco rgido ou nos disquetes, neste caso dizemos que
guardamos em arquivos (memria secundria ou de massa) as informaes ficam gravadas
permanentemente, at o momento que decidirmos apagar as informaes.
Para usar o comando de atribuio basta colocarmos do lado esquerdo uma varivel
ou uma constante, o smbolo de igualdade (=) seguida de uma constante, varivel ou
expresso do lado direito. Ex.:
x=5
y=a+b
z = nome
Obs.: Do lado esquerdo no pode aparecer nenhuma expresso ou constante, apenas
variveis, pois no h como fazer uma atribuio a uma expresso, nem a uma
constante, j que seu valor fixo.
At agora vimos que o smbolo de atribuio idntico a igualdade da matemtica,
qual a diferena? Na matemtica podemos ter algo como o seguinte exemplo:
x=x+1
y
y=2
Na matemtica no se pode ter algo parecido, como dizer que x = x + 1?
x = x + 1, basta passar tudo que tem x para a esquerda, ento:
xx=1
0 = 1, zero igual a um !!! Isto pode? claro que no. Ento como o
computador faz isso ? Ele pega o valor de x que est guardado na memria do computador (se
no tiver nenhum ento zero para nmero, e vazio para caracteres) soma com 1 e guarda o
novo valor no x que est do lado esquerdo. Por exemplo, suponha que na memria do
computador tem x = 2, ento temos:
x=x+1

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

x=2+1
x = 3, ou seja, na memria passa a ficar gravado o valor 3, ao invs do 2 que
havia antes.
O que vlido e o que no vlido?
Vlido
No vlido
x=1
1=x
x=y+1
1+y=x
2
2
2
x = x + 2x 2
x = x 2x + 5
4.2. Comando de Escrita:
um comando utilizado para escrever na tela, ou monitor, do computador, e tambm
para escrever em um arquivo no disco. O comando de escrita WRITE, ele pode ser utilizado
de uma forma muito complexa, porm utilizaremos sua forma mais simples, a chamada forma
livre. Formas de uso:
write(*,*) a
write(*,*) 5
write(*,*) a + b
write(*,*) 5 / x
write(*,*) texto
O primeiro * substitui o nmero correspondente a linha onde est o formato do nmero
(ser apresentado mais adiante), o segundo * substitui o dispositivo de sada (monitor,
impressora ou arquivo).
4.3. Comando de Leitura:
um comando utilizado para ler do teclado do computador, e tambm para ler de um
arquivo no disco. O comando de leitura READ, tambm utilizaremos sua forma mais simples,
a chamada forma livre. Diferentemente do comando de escrita, o comando de leitura s pode
se referenciar a variveis, j que a leitura de um valor deve ser guardado na memria do
computador. Formas de uso:
read(*,*) a
read (*,*) b
O primeiro * substitui o nmero correspondente a linha onde est o formato do nmero
(ser apresentado mais adiante), o segundo * substitui o dispositivo de entrada (teclado ou
arquivo).
Obs.: Os comandos de escrita e leitura podem ser utilizados para escrever ou ler mais de uma
varivel de cada vez.
Exemplo:
read(*,*) a, b, c
write(*,*) a, b, texto, 5, a + 2 * b
Porm na leitura deve-se ter o cuidado de separar os valores digitados por vrgulas ou
espaos, j para a escrita sero escritos todos juntos, ento para evitar esse pssimo hbito
vou aconselhar que use um comando de escrita e de leitura para cada varivel, constante, ou
caracter, como nos primeiros exemplos.
5. Como Escrever um Programa em Fortran
1

10

11

70

71

72

73

74

75

76

77

78

Um programa escrito em Fortran escrito em qualquer editor de textos, em seguida


deve ser salvo (gravado em disco) com a extenso .for. Na digitao deve-se observar o
seguinte:

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Para as colunas:
1. O programa deve ser escrito a partir da coluna 7 at a coluna 72, aps esta coluna
tudo desprezado.
2. A coluna 1: reservada para sinalizao de comentrios, basta colocar uma letra c
(maisculo ou minsculo) nesta coluna e toda a linha considerada como
comentrio, ou seja, um aviso ou mensagem, e no como parte constituinte do
programa.
3. Colunas 1 a 5: numerao de linhas, pode-se numerar todas as linhas do
programa, mas na prtica se numeram apenas comandos que exigem a
numerao.
4. Coluna 6: identificador de continuao de linha de comando. Caso algum comando
no caiba entre as colunas 7 e 72, basta colocar um caracter qualquer na coluna 6
e continuar o comando como se no houvesse interrupo, um comando pode
ocupar mais de uma linha (duas, trs, etc).
1

10

70

71

72

73

74

75

76

77

78

1
2
3
4
5
6
7
8
9


Para as linhas:
1. Linha 1: Pode-se usar o comando Program nome, para identificar o nome do
programa.
2. Linha 2: Pode-se declarar as constantes (pode fazer isso em vrias linhas).
3. Linha 3: Pode-se declarar variveis (pode fazer isso em vrias linhas).
4. Linha 4 at a antepenltima: Escreve-se o programa.
5. Penltima linha: o comando stop, indicando a parada de execuo do programa.
6. ltima linha: o comando end indicando o final do programa.

O comando stop apenas encerra a execuo do programa, podem existir vrios


comandos stop no programa, porm apenas um comando end. Pode-se colocar comentrios
em qualquer linha do programa. A seqncia aqui sugerida para que se possa escrever
programas sem se ter problemas, apesar de alguns comandos poderem vir em posio
diferente, porm recomendo seguir esta receita de bolo. A seguir apresento um pequeno
programa que l dois nmeros e apresenta sua soma. O primeiro passo dar uma mensagem
pedindo para o usurio digitar um nmero, em seguida se l esse nmero, o segundo passo
apresentar uma nova mensagem para se digitar um nmero e novamente se l esse nmero. O
terceiro passo somar os nmeros e armazenar o resultado em uma varivel, apresentando o
resultado acompanhado de uma mensagem que o identifica.
program soma
real x, y, s
write(*,*)Digite um nmero:
read(*,*)x
write(*,*)Digite outro nmero:
read(*,*)y
s=x+y
write(*,*)O resultado da soma : , s
stop
end
O programa pode ser escrito em letras maisculas ou minsculas, foi convencionado
pelos programadores que programas escritos em Fortran seriam em letras maisculas, porm
por motivo de esttica, aparncia com outras linguagens de alto nvel como o Pascal e C,
escreverei todos os programas em letras minsculas. A seguir o programa ser reescrito nas
respectivas colunas e com comentrios.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

c
c
c
c

a
r

r
e

a
a

u
w
r

r
r
e

a
i
a

t
d

u
w
r

r
r
e

a
i
a

d
=

s
w
d
s
e

Obs. 1:
Obs. 2:
Obs. 3:
Obs. 4:

c
s

l
n

p
e

a
r

r
o

d
a
s

c
d

l
i

o
x

d
y

e
,

d
e
(

o
(
*

p
,
*

r
*
)

i
)
x

e
d

i
i

r
g

o
i

n
e

*
,

d
e
(

o
(
*

*
,

s
,
*

e
*
)

g
)
y

n
d

d
i

o
g

n
t

t
d

o
x

s
+

e
r

n
i

t
t

a
e

o
,

d
)

e
r

s
e

u
s

l
u

t
l

o
t
n

p
p

o
d

6
i

m
u

e
m

o
n

e
o

r
u

o
t

a
t

d
a

o
d

A numerao acima apenas para identificar a coluna em que iniciou a digitao.


Podem existir quantas linhas em branco se desejar no programa.
Apenas os comentrios podem ocupar qualquer coluna e qualquer linha no programa .
O comando program foi substitudo por comentrios que so mais explicativos.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Na tela do computador surgir algo do tipo:


C:\>soma
Digite um nmero:
2
Digite outro nmero:
3
O resultado da soma : , 5
Program Stopped.
C:\>
De agora em diante todos os programas sero apresentados livremente sem os quadrados
da tabela da pgina anterior.
7. Funes Predefinidas
Algumas funes matemticas comuns esto incorporadas no Fortran e podem ser
utilizadas normalmente no programa. Deve-se tomar algumas precaues no uso das funes, a
primeira quanto ao argumento delas, deve-se observar o tipo de argumento (inteiro, real,
complexo ou character), a segunda precauo quanto ao valor retornado da funo (resultado da
funo) a varivel onde ser armazenado o resultado da funo deve ser do mesmo tipo do valor
que a funo retorna.
Tipo do
Tipo do
Valor
Argumento
Retornado
(tipo de x)
Valor absoluto (mdulo)
abs(x)
real
real
Valor absoluto (mdulo)
iabs(x)
integer
integer
Valor absoluto (mdulo)
cabs(x)
complex
complex
Converter nmero real para inteiro
ifix(x)
real
integer
Converter nmero inteiro para real
float(x)
integer
real
Resto da diviso de n1 por n2
mod(x1,x2)
integer
integer
Exponencial
exp(x)
real/complex
real/complex
Logaritmo
log(x)
real/complex
real/complex
Raiz quadrada
sqrt(x)
real/complex
real/complex
Seno de um ngulo em radianos
sin(x)
real/complex
real/complex
Coseno de um ngulo em radianos
cos(x)
real/complex
real/complex
Tangente de um ngulo em radianos
tan(x)
real
real
Arco-tangente em radianos
atan(x)
real
real
Seno hiperblico
sinh(x)
real
real
Coseno hiperblico
cosh(x)
real
real
Tangente hiperblico
tanh(x)
real
real
Parte real do nmero complexo
real(x)
complex
real
Parte imaginria do nmero complexo
imag(x)
complex
real
Conjugado do nmero complexo
conjg(x)
complex
complex
Comprimento do string*
len(x)
character
integer
* O comprimento do string corresponde quantidade de caracteres na varivel.
Funes mais Comuns

Funes em
Fortran

Exemplos de uso das funes:


Expresso Aritmtica

x+y

sin (2y )

+ sinh (x )

Expresso em Fortran

abs( x + y ) / sin( 2 * 3.14 * y ) + sqrt( sin( x ) )

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

cos(y )e tan (ln (x ))

cos( y ) * exp( tan( log( x ) ) )

8. Exemplos de Programas
1. Programa para ler um nmero e apresentar o seno, coseno e tangente:
program trigon
c
declarao da varivel
real x
c
leitura do nmero
write(*,*) Digite um nmero:
read(*,*) x
c
clculo das funes e apresentao dos resultados
write(*,*)Seno do nmero em radianos = ,sin(x)
write(*,*)Coseno do nmero em radianos = ,cos(x)
write(*,*)Tangente do nmero em radianos = ,tan(x)
c
fim do programa
stop
end
2. Programa para ler o nome de uma pessoa e dizer quantas letras tem o nome:
program letras
c
declarao da varivel character com no mximo 30 caracteres
character*30 nome
c
leitura do nome
write(*,*) Digite seu nome (mximo 30 letras):
read(*,*) nome
c
clculo da quantidade de letras e apresentao do resultado
write(*,*)Quantidade de letras no nome = ,len(nome)
c
fim do programa
stop
end
o

3. Programa para calcular as razes reais de uma funo do 2 grau:


program grau2
c
declarao da varivel
real a, b, c, x1, x2, delta
c
leitura dos coeficientes
write(*,*) Digite o coeficiente a:
read(*,*) a
write(*,*) Digite o coeficiente b:
read(*,*) b
write(*,*) Digite o coeficiente c:
read(*,*) c
c
clculo das razes
delta = b**2 4 * a * c
x1 = (-b + sqrt(delta)) / (2 * a)
x2 = (-b - sqrt(delta)) / (2 * a)
c
apresentao dos resultados
write(*,*)x1 = ,x1
write(*,*)x2 = ,x2
c
fim do programa
stop
end

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

10

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

4. Programa para calcular o mdulo e o ngulo de um nmero complexo:


program cmplx
c
declarao da varivel
complex c
real modulo, angulo
c
leitura do nmero
write(*,*) Digite um nmero complexo:
read(*,*) c
c
clculo e apresentao dos resultados
write(*,*)Mdulo do nmero complexo = ,cabs(c)
write(*,*) ngulo do nmero complexo = ,atan(imag(c) / real(c))
c
fim do programa
stop
end

8. Vetores e Matrizes
A declarao de vetores e matrizes feita por meio do comando DIMENSION. Por
exemplo, para declarar que uma varivel V um vetor de 10 componentes, fazemos:
DIMENSION V(10)
Note que isto no especifica o tipo de V. Seu tipo especificado por meio dos comandos
listados acima. possvel especificar o tipo de um vetor (ou matriz) e seu tamanho em uma nica
declarao. Por exemplo, no caso da matriz M(10,10) (matriz 10 x 10):
REAL*8 M(10,10)
Note que nas declaraes acima, os ndices de V e M variam de 1 a 10. Muitas vezes
necessrio utilizar ndices que assumam valores negativos ou nulo. Deste modo, se o primeiro
ndice da matriz A variar de 0 a 20 e o segundo ndice de -15 a 50 fazemos:
DIMENSION A(0:20,-15:50)
Finalmente, note que uma matriz pode ser de ordem maior do que 2. Por exemplo, para
delcarar uma matriz 10 x 10 x 10, fazemos:
DIMENSION M(10,10,10)
Exemplo 1:
Apresentamos abaixo um exemplo simples do uso de vetores e matrizes
program summat
real mat1(2,2), mat2(2,2), sum(2,2)
write(*,*)'Digite os elementos da primeira matriz (2x2)'
read(*,*) mat1(1,1), mat1(1,2), mat1(2,1), mat1(2,2)
write(*,*)'Digite os elementos da segunda matriz (2x2)'
read(*,*) mat2(1,1), mat2(1,2), mat2(2,1), mat2(2,2)
sum(1,1) = mat1(1,1) + mat2(1,1)
sum(1,2) = mat1(1,2) + mat2(1,2)
sum(2,1) = mat1(2,1) + mat2(2,1)
sum(2,2) = mat1(2,2) + mat2(2,2)

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

11

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

write(*,*)'A soma das matrizes e'''


write(*,*) sum(1,1), sum(1,2), sum(2,1), sum(2,2)
stop
end
9. Testes Lgicos
O fortran fornece um conjunto de comandos que permitem a implementao de testes
lgicos. A sintaxe para estes comandos :
IF("valor"."condio"."valor")THEN
"instrues"
ELSE
"instrues"
ENDIF
ou, numa forma mais complexa:
IF("valor"."condio"."valor")THEN
"instrues"
ELSE IF("valor"."condio"."valor")THEN
"instrues"
ELSE
"instrues"
ENDIF
importante notar que os pontos entre "valor" e "condio" so obrigatrios. A palavra
"instrues" no bloco de testes acima representa um conjunto de instrues a serem executadas
se o teste lgico correspondente for satisfeito. Estas instrues podem envolver mais de uma linha.
Durante a execuo de um bloco de testes, o fortran executar apenas o conjunto de
instrues associadas ao primeiro teste lgico que for satisfeito.
As instrues associadas a ELSE so executadas se nenhum dos demais testes lgicos for
satisfeito. As instrues IF("valor"."condio"."valor")THEN e END IF so obrigatrias. Por outro
lado, ELSE IF("valor"."condio."valor")THEN e ELSE so opcionais.
O teste ELSE IF("valor"."condio"."valor")THEN pode aparecer mais de uma vez no
mesmo bloco de testes lgicos.
Nas instrues acima:

"valor" - representa tanto um nmero quanto o valor de uma varivel ou valor retornado por
uma funo.

"condio" - denota a condio lgica que se deseja testar. Estas condies podem ser
tanto operadores lgicos (.GE., . GE., .LT, .LE., .EQ. e .NE.), quanto operadores
relacionais (.AND., .OR., .NOT. e .XOR.).
No caso de um teste envolvendo uma varivel lgica, delcaradas por meio de LOGICAL
TESTE (TESTE o nome da varavel), deveramos fazer o teste lgico utilizando IF(TESTE)THEN.
As instrues associadas a este teste lgico sero executadas apenas se a varivel TESTE for
verdadeira. Neste ponto, til mencionar o modo de se atribuir um valor a variveis lgicas. Para
atribuirmos a TESTE o valor "verdadeiro", devemos fazer:
TESTE=.true.
e se quizermos que TESTE seja falso, fazemos:
TESTE=.false.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

12

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

O valor de TESTE pode ser alterado durante o programa por meio de atribuies explicitas
do programador. possvel testar mais de uma condio em um nico IF. Para isto, utilizamos
AND ou OR. Por exemplo, o teste lgico
IF("valor1"."condio1"."valor2".AND."valor3"."condio2"."valor4")THEN
far com as instrues associadas a ele sejam executadas apenas se os testes
"valor1"."condio1"."valor2" e "valor3"."condio2"."valor4" forem simultaneamente verdadeiros.
Outra maneira de usar o comando IF :
IF("valor1"."condio1"."valor2") "instruo"
Em muitos casos essa instruo pode ser o comando GOTO "n", onde "n" o nmero de
uma linha de comando. O GOTO leva a execuo do programa para a linha "n", que ser a linha
da prxima intruo a ser executada. Porm, esse comando pode executar apenas uma nica
instruo, se quizermos executar mais de uma instruo, devemos usar o THEN e o ENDIF.
10. Loops
O comando DO do fortran permite que um conjunto de instrues seja executado at que
um contador atinja um certo valor determinado. A sintaxe deste comando :
DO "contador"="incio","fim","passo"
"instrues"
ENDDO

"contador" - representa a variavel que ser incrementada no loop.


"contador"="incio" faz com que o valor da varivel "incio" seja atribudo varivel
"contador".
"fim" - possui o seguinte significado: o loop ser abandonado quando o valor de "contador"
for maior que "fim". Esta condio testada a cada vez que um valor atribuido a
"contador". Isto feito na primeira linha do loop (linha que contm DO...). As instrues
contidas no loop no sero executadas quando o teste sobre o "contador" for feito e
constatado que o loop deve ser abandonado.
"passo" - representa o incremento na varivel "contador". Esta varivel incrementada na
linha que contm a declarao DO. No permitido ao programador alterar o valor do
contador dentro do loop.
"instrues" - representa o cojunto de instrues a serem executadas no loop. Estas
instrues podem envolver mais de uma linha.
ENDDO - delimita o fim das linhas de comando a serem executadas pelo loop.

Pode se usar tanto variveis do tipo real como inteiro para controlar e incrementar o loop.
No entanto, recomenda-se o uso de variveis do tipo inteiro para evitar problemas numricos.
Como ltima observao, permitido omitir "passo" no loop. Neste caso, o compilador
fortran assume que o incremento de "contador" 1.
Embora no faa parte do padro do fortran 77, loops do tipo
DO WHILE("varivel1"."condio"."varivel2")
"instrues"
ENDDO
so
aceitos
pela
maior
parte
dos
compiladores
fortran
77.
A
instruo
"varivel1"."condio"."varivel2" funciona como um teste lgico, descrito acima. O loop
executado enquanto o teste lgico for verdadeiro.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

13

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Outra maneira de usar o comando DO conhecido como DO implicito, muito para leitura
e escrita de matrizes e vetores. Seu formato
write(*,*) (variavel(contador), "contador" = "inicio", "fim", passo")
onde o comando write executado quantas vezes o comando DO for repetido. semelhante a
DO "contador"="incio","fim","passo"
write(*,*) variavel(contador)
ENDDO
porm tem a vantagem de no pular de linha toda vez que executar o comando write. Outra
maneira muito usada para o comando DO :

"n"

DO "n" "contador"="incio","fim","passo"
"instrues"
CONTINUE

ou

"n"

DO "n" "contador"="incio","fim","passo"
"instrues"
"ltima instruo"

onde "n" o nmero da linha do comando CONTINUE, que simplesmente continua o comando DO,
ou pode ser o nmero da linha da ltima instruo.
Exemplo 2:
Apresentamos abaixo um exemplo mais completo que o anterior
program summat
real mat1(10,10), mat2(10,10), sum(10,10)
integer lin, col, i, j
write(*,*)'Qual a dimenso das matrizes'
read(*,*) lin, col
write(*,*)'Digite os elementos da primeira matriz', '(',lin,'x',col,')'
do i = 1, lin
read(*,*) (mat1(i,j), j = 1, col)
enddo
write(*,*)'Digite os elementos da segunda matriz', '(',lin,'x',col,')'
do i = 1, lin
read(*,*) (mat2(i,j), j = 1, col)
enddo
do i = 1, lin
do j = 1,col
sum(i,j) = mat1(i,j) + mat2(i,j)
enddo
enddo
write(*,*)'A soma das matrizes e'''
do i = 1, lin

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

14

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

write(*,*) (sum(i,j), j = 1, col)


enddo
stop
end
11. Comentrios

Podemos fazer comentrios de duas maneiras:


Colocando-se um "c" ou "C" na primeira coluna da linha em que se quer fazer o
comentrio.
Colocando-se um smbolo de exclamao ("!") em qualquer coluna da linha que se quer
fazer o comentrio, a diferena que com "!" o comentrio pode ocupar a mesma linha
que uma instruo.

12. Formatao dos Dados


Para se escrever algo no monitor ou se ler algo do teclado, no precisamos usar nenhum
tipo de formatao, porm isso muito importante quando queremos ler algo de um arquivo, ou
escrever algo no arquivo. Os comandos utilizados para este fim so:
WRITE("onde","como")
READ("onde","como")
Nos exemplos anteriores a opo "onde" foi escolhida como a saida padro, representada
por um "*". Em geral, a saida padro o monitor. Porm veremos mais adiante que sua funo
tambm escrever em um arquivo de dados.
A opo "como" requer uma discusso um pouco mais detalhada. Apesar de termos usado
sem formatao, sua funo formatar a entrada ou sada de dados. A escolha mais simples
dizer ao compilador fortran que escreva em formato livre. Isto pode ser feito colocando-se o
caractere "*" no lugar de "como". Para formatarmos os dados, usamos o comando FORMAT. No
exemplo a seguir, utilizamos "como" igual a 10 e 20, que so as numeraes das linhas
correspondentes aos comandos FORMAT.
As diferentes instrues para FORMAT so separadas por vrgula. Algumas instrues
utilizadas no FORMAT so:
FORMAT("nmero"x,'Mensagem',\,FX.Y,IX)

"nmero"x - introduz "nmero" espaos em branco na linha impressa, antes da prxima


instruo que aparece aps a vrgula.
'Mensagem' - imprime uma mensagem delimitada por ' '.
\ - Move cursor para o comeo da prxima linha, ou seja, pula uma linha.
FX.Y - avisa ao compilador que um nmero real ser impresso com X caracteres no total
(incluindo o sinal de menos, se for o caso, e o ponto decimal) e com Y caracteres aps o
ponto decimal.
IX - avisa ao compilador que um nmero inteiro ser impresso com X caracteres (incluindo
o sinal negativo se for o caso).

onde estas instrues podem aparecer em qualquer quantidade, ou na ordem que ns


necessitarmos.
Para usarmos as instrues mais de uma vez no mesmo FORMAT basta acrescentar a
quantidade na frente da instruo. Se for mais de uma instruo temos que coloc-la entre
parntesis.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

15

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Exemplo 3:
Uso da formatao
program exemp1
integer*4 i,j
real*8 x, y, w
x=10.d0
y=50.d0
i=20
j=100

! O d indica dupla preciso

w=((x - y) / (i + j)) * (i - j)

10

write(*,10)w
format(1x,'w = ',f7.3,\)

20

write(*,20)x,y,i,j
format(1x,'x = ', f5.2 ,5x, 'y = ', f5.2, 5x, \, 'i = ',i2, 5x,'j = ',i3)

30

write(*,30)w,x,y,i,j
format(3(f5.2, 5x), \, 2(i2, 5x))
stop
end

O comando FORMAT pode vir em qualquer lugar no programa, devido a numerao da


linha. O mesmo comando FORMAT pode ser usado por vrios comandos WRITE e READ.
13. Arquivos de Dados
O comando OPEN permite o acesso a um arquivo de dados. A sintaxe para este comando
a seguinte:
OPEN(FILE=NOME,UNIT=NMERO,STATUS=STATUS,FORM=TIPO)

NOME - Nome do arquivo. Pode ser um nome entre ' ', como 'saida.dat' por exemplo, ou
uma varivel do tipo cadeia de caracteres, previamente definida.
NMERO - Unidade lgica por meio da qual o arquivo ser acessado.
STATUS - Se STATUS='OLD', significa que o arquivo j existe e ser usado para leitura.
Se STATUS='NEW', o arquivo ainda no existe e criado no momento em que a instruo
OPEN executada. Neste caso, podemos escrever no arquivo. Finalmente,
STATUS='UNKNOWN', permite uma maior flexibilidade no que se refere ao acesso ao
arquivo. No entraremos em detalhes sobre esta opo aqui, pois importante em
programao se ter segurana no que se est fazendo. Saber previamente se o arquivo
acessado j existe ou no importante para evitar que resultados anteriores sejam
apagados ou que os novos sejam misturados com antigos.
TIPO - Se a opo FORM for omitida, o compilador assumir que o arquivo formatado.
Neste caso, os seu conteudo ser escrito em ASCII. Isto pode ser reforado fazendo-se
TIPO='FORMATTED'. Para que o arquivo seja escrito em binrio, fazemos
FORM='UNFORMATTED'. Isto basntante til quando estamos lidando com arquivos
grandes. Um arquivo em binrio ocupa muito menos espaco em disco do que um arquivo
em ASCII.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

16

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

GRAVAO EM ARQUIVO - O comando WRITE permite escrever num arquivo acessado


por OPEN. Por exemplo, se um arquivo for aberto como 'NEW' e se a unidade lgica associada a
ele for 10, por exemplo, para escrever uma dada varivel X em formato livre neste arquivo,
fazemos:
WRITE(10,*)X
Note que o comando FORMAT descrito acima tambm pode ser usado junto com WRITE para
escrever em arquivos. No entanto, se o arquivo for aberto como binrio, devemos escrever:
WRITE(10)X
LEITURA DE DADOS - O comando READ permite a leitura de dados para processamento no
programa. Os dados podem ser lidos em um arquivo de dados ou a partir da entrada padro (em
geral teclado). Do mesmo modo que o comando WRITE, o comando READ possui os seguintes
argumentos "onde" e "como". Sua utilizao, analoga descrita acima para o comando WRITE.
Este comando tambm pode ser combinado com FORMAT.
FECHAMENTO DE ARQUIVO - O comando CLOSE(NMERO) fecha o arquivo associado
unidade lgica NMERO. importante que os arquivos sejam fechados, principalmente quando
foram abertos para gravao.
Para terminar este ponto, devemos mencionar que o acesso a arquivos depende bastante do
compilador fortran utilizado. Mais precisamente, as opes do comando OPEN variam de
compilador para compilador. Embora seja sempre possvel escrever um arquivo em binrio, por
exemplo, a declarao pode no ser FORM='UNFORMATTED'. Nestes casos, necessrio
consultar o manual do fabricante.
Exemplo 1:
O exemplo abaixo ilustra a entrada e sada de dados utilizando arquivos.
program exemp1
real*8 x,y
open(file='entrada.dat', unit=10, status='old', form='formatted')
open(file='saida.dat', unit=20, status='new', form='formatted')
read(10,*)x,y
write(20,10)2.d0*x,y/3.d0
close(10)
close(20)
10

format(1x,'2*x = ',f6.3,5x,'y/3 = ',f6.3)


stop
end

Para o arquivo de entrada podemos ter:


5.D0

20.D0

o seguinte arquivo de saida ser produzido:


2*x = 10.000

y/3 = 6.667

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

17

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

14. Funes
Uma FUNO em fortran retorna um valor, que pode ser atribudo a uma varivel ou comparado a
algum outro valor. Por exemplo se f(x) uma funo que recebe um argumento x e retorna um
valor real ao final de sua execuo, podemos atribuir este valor varivel real Y:
y=f(x)
Existem funes pre-definidas, como SIN(X), EXP(X), etc... Entretanto, o programador tambm
pode definir funes que sejam convenientes para seu programa. Isto feito por meio da
declarao FUNCTION. Uma FUNCTION construda do seguinte modo:
function f(x1,x2,i1,i2,etc..)
real*8 f
real*8 x1,x2,etc..
integer i1,i2,etc..
(instrues)
f=expresso
end
Observaes:

function f(x1,x2,i1,i2...) - marca o comeo da regio do programa na qual a funo f ser


definida.
f - neste caso o nome da funo, que poderia ter at seis caracteres.
real*8 f - avisa ao compilador que esta funo retornar um resultado real em preciso
dupla. escolhemos real*8 apenas como exemplo. na realidade, esta funo poderia
retornar um resultado lgico, por exemplo, para isto, teramos que utilizar logical f.
Observaes anlogas podem ser feitas quanto declarao das variveis x1, x2,i1 e i2.
Escolhemos o tipo real e inteiro, apenas para exemplificar.
(x1,x2,i1,i2,...) - representa a lista de argumentos para a funo f.
(instrues) - representa vrias operaes, testes lgicos, chamadas de funes ou
subbrotinas (que veremos mais adiante), que podem ser feitas antes da funo retornar um
valor.
f=expresso - atribui um valor funo f que ser retornado. Note que neste caso no se
deve escrever f(x1,x2,i1,i2...). Isto seria errado.
end - delimita o fim das instrues para a funo.

As vezes necessrio fazer com que a funo no execute todas as linhas, abreviadas no
exemplo acima por (instrues), dependendo dos resultados intermedirios obtidos nestas linhas
ou se a funo for definida por meio de testes lgicos (veremos isto mais adiante). Para isto,
utilizamos o comando RETURN. Contudo, importante ter em mente que uma funo deve
retornar um valor. Ento, necessrio que a declarao F=expresso aparea antes de RETURN.
importante mencionar que todas as variveis, exceto aquelas que so passadas para
funo por argumento (ou por COMMON como veremos abaixo), so locais. Mais precisamente, as
demais partes do programa no sabem que elas existem. Isto significa, que podemos utilizar uma
varivel x dentro de uma funo sem nos preocuparmos se existe alguma outra varivel no
programa, fora desta funo, que possua o mesmo nome.
Entretanto, importante ter em
mente que, em princpio, variveis definidas dentro de uma funo deixam de existir quando
samos da funo. Em outras palavras, se uma dada varivel x possui um certo valor antes de
sairmos da funo, esta varivel pode conter lixo na prxima vez que o programa acessar esta
funo. Para que esta varivel no perca seu contedo, devemos utilizar a instruo SAVE nome
da varivel, na linha abaixo da linha em que a varivel declarada.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

18

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Como ltima observao, importante ter em mente que uma FUNCTION pode chamar outras
FUNCTIONS. Porm, ela no pode chamar a si prpria (recursividade). Embora vrios
compiladores fortran permitam recursividade, o fortran 77 padro no permite isto.
Exemplo 2:
O exemplo abaixo ilustra algumas das caractersticas dos comandos descritos acima.
integer*4 i
real*8 x,y
real*8 absx
integer*4 n
real*8 dx
parameter(dx=0.5d0,n=10)
x=-2.d0
do i=1,n
x=x+dx
y=absx(x)
write(*,*)' x = ',x,' f(x) = ',y
end do
write(*,*)
x=-2.d0
do while(x.lt.3.0d0)
x=x+dx
write(*,*)' x = ',sngl(x),' f(x) = ',sngl(absx(x))
end do
end
function absx(x)
implicit none
real*8 absx
real*8 x
if(x.lt.0.d0)then
absx=-x
else
absx=x
end if
end
Em ambos os loops, a varivel x incrementada de dx a cada vez que o loop executado.
Em cada loop, a funo xabs chamada. Esta funo o valor absoluto de x. Note que
desnecessrio se fazer uma FUNCTION com este fim. O fortran prov uma funo intrnseca
(ABS) para isto.
Alguns comentarios sobre as instrues novas que apareceram no exemplo acima.
A instruo PARAMETER serve para se definir uma constante que pode ser utilizada no programa.
Embora as constantes definidas por PARAMETER se paream com variveis, elas no podem ser
alteradas pelo programa.
O comando SNGL utilizado no ltimo loop converte o valor de seu argumento em real de
preciso simples. Isto extremamente til quando se deseja escrever num arquivo de dados. Em
primeiro lugar, o arquivo ocupar menos espao em disco (o que pode ser muito importante se o
arquivo for grande). Em segundo lugar, muitos softwares grficos tm problemas em ler arquivos
de dados em dupla preciso.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

19

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

15. Subrotinas
O fortran permite a separao do programa em vrias partes independentes que executam tarefas
diferentes. Estas partes independentes so chamadas SUBROUTINE. Uma subrotina recebe, ou
no, uma lista de variveis por argumento, de modo anlogo s FUNCTIONS descritas acima. A
diferena fundamental entre uma SUBROUTINE e uma FUNCTION que a primeira no retorna
nenhum valor. Ilustramos abaixo a forma que uma subrotina deve possuir:
subroutine nome(x1,x2,...,i1,i2,...)
implicit none
real*8 x1,x2,...
integer*4 i1,i2,...
"instrues"
end
O comando END delimita o fim da subrotina. Todas as observaes feitas sobre as
variveis locais a uma FUNCTION permanecem vlidas no caso de uma subrotina. O comando
RETURN tambm pode ser utilizado dentro de uma subrotina, afim de que as demais linhas da
subrotina no sejam executadas. Isto particularmente til no caso em que, se alguns resultados
intermedirios assumem certos valores, no necessrio (ou no se deve) executar as demais
linhas da subrotina.
De modo anlogo s FUNCTIONS, as "instrues" representam um conjunto de linhas
contendo vrias instrues diferentes, que podem ser chamada a FUNCTIONS ou outras
subrotinas, etc... Porm, recursividade tambm no permitida aqui (veja comentrios em
FUNES).
Apresentamos uma lista de argumentos bastante limitada para a subrotina, embora estes
argumentos podem ser vetores, matrizes, etc... Na realidade, poderamos ter passado at mesmo
subrotinas ou FUNCTIONS por argumento. Para se passar uma FUNCTION por argumento,
necessrio avisar ao compilador que no se trata de uma varivel, mas sim de uma FUNCTION.
Isto feito dentro da subrotina utilizando o comando EXTERNAL. Por exemplo, para que o
compilador espere que uma subrotina receba uma FUNCTION por argumento, devemos incluir as
seguintes linhas na subrotina:
REAL*8 F
EXTERNAL F
Note que estamos supondo que F uma FUNCTION que retorna um resultado em dupla
preciso. Isto no necessariamente verdade. Ela poderia retornar um valor em preciso simples,
por exemplo. Neste caso, deveramos modificar a instruo correspondente a declarao de seu
tipo convenientemente.
No caso de alguns compiladores, apenas as instrues descritas acima so necessrias
para se passar uma FUNCTION por argumento. Entretanto, isto pode gerar resultados errados em
alguns outros. Por este motivo, importante que a linha
EXTERNAL NOME DA FUNO
esteja presente no lugar onde a subrotina chamada.

A chamada de uma subrotina executada por meio da instruo CALL. Por exemplo
CALL NOME(A1,A2,...,J1,J2,...)
faz com que as instrues contidas na subrotina NOME sejam executadas e a lista de argumentos
(A1,A2,...,J1,J2,...) seja transferida a ela. Ao trmino da execuo dos comandos da subrotina, as
variveis contidas na lista de argumentos so "devolvidas" atualizadas para a parte do programa

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

20

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

que chamou a subrotina, caso alguma delas tenha sido alterada. Note que utilizamos nomes
diferentes para as variveis da lista de argumentos para insistir no fato de que os nomes de
variveis dentro das subrotinas (ou FUNCTIONS) so independentes dos nomes de variveis em
outras partes do programa. Isto no verdade no que se refere s FUNCTIONS ou
SUBROUTINES. O nome de uma FUNCTION ou subrotina conhecido em todas as FUNCTIONS
ou subrotinas do programa. Entretanto, o tipo da FUNCTION (se ela real ou retorna valor lgico)
no conhecido. Por esta razo, necessrio declarar o tipo da FUNCTION dentro de uma
subrotina ou funo. Note que isto no quer dizer que se uma FUNCTION passada por
argumento ela deve possuir o mesmo nome na lista de argumentos da declarao da subrotina que
no resto do programa (na chamada subrotina sim). Neste caso, temos liberdade para escolher
seu nome como no caso de qualquer outra varivel.
16. Common
Uma vez que as variveis dentro de FUNCTIONS e SUBROUTINES so independentes, o
comando COMMON extremamente importante para que SUBROUTINES e FUNCTIONS se
comuniquem sem que tenhamos que passar todas as variavis por argumento de uma para a
outra. A sintaxe para COMMON a seguinte:
COMMON/"nome do common"/X1,X2,...

"nome do common" - representa um nome que distinguir um COMMON do outro. A


liberdade em se escolher um nome para um COMMON extremamente importante pois
permite a criao de COMMONS independentes. Isto muito til quando apenas um certo
grupo de variveis passado para uma subrotina (ou funo) e esta recebe um outro
grupo de variveis diferentes de uma outra subrotina (ou funo).
X1,X2,... - representa a lista de variveis associadas a este COMMON. Estas variveis
podem ser inteiras, reais, vetores, matrizes, etc... (no podem ser funes ou subrotinas).
importante que as variveis que ocupam mais espao na memria apaream em
primeiro lugar na lista do COMMON do que aquelas que ocupam menos espao. Por
exemplo, um nmero real em preciso dupla deve aparecer antes de um nmero inteiro.
Isto tambm verdade para os argumentos da subrotina.
Para que duas subrotinas (ou funes) diferentes acessem e/ou alterem uma (ou algumas)
das variveis na lista de um COMMON basta que o COMMON esteja presente nas duas (ou mais)
subrotinas (e/ou funes). Note, mais uma vez, que as variveis da lista do COMMON podem ter
nomes diferentes nas diferentes subrotinas ou funes. O compilador identifica as variveis num
dado COMMON pela sua posio na lista.
Exemplo 3:
integer*2 i
integer*2 n
parameter(n=10)
real*8 v2(n)
real*8 v1(n)
common/zerav1/v1
real*8 absx
external absx
do i=1,n
v1(i)=0.d0
v2(i)=0.d0
end do
call altera(v2,absx)

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

21

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

do i=1,n
write(*,*)' i = ',i,' v1(i) = ',sngl(v1(i)), ' v2(i) = ',sngl(v2(i))
end do
end
subroutine altera(v2,f)
integer*2 n
parameter(n=10)
real*8 v2(n)
real*8 v1(n)
common/zerav1/v1
real*8 f
external f
real*8 fexp
integer*2 i
real*8 x
real*8 dx
parameter(dx=0.5d0)
x=-2.d0
do i=1,n
x=x+dx
v1(i)=f(x)
v2(i)=fexp(x)
end do
end
function absx(x)
real*8 absx
real*8 x
if(x.lt.0.d0)then
absx=-x
else
absx=x
end if
end
function fexp(x)
real*8 fexp
real*8 x
fexp=exp(x)
end

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

22

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Exerccios Fortran
1. Faa um programa que leia 3 nmeros diferentes e os escreva em ordem crescente.
2. Faa um programa que leia dois vetores e apresente o produto escalar e o produto vetorial
deles.
3. Faa um programa que leia uma lista de valores (semelhante a vetores) de uma experincia de
laboratrio (por exemplo, temperatura e velocidade do som no ar) e calcule as mdias
aritmticas, o desvio padro e a varincia de cada uma das grandezas, alm disso, calcule a
correlao. As equaes esto no final das notas de aula.
4. Faa um programa que calcule a integral de uma funo pelo mtodo do retngulo.
5. Faa um programa que calcule a soluo de um sistema de equaes pelo mtodo iterativo.

Obs.: Para todos os programas use arquivos de dados na entrada e na sada dos resultados, crie
tambm funes e/ou subrotinas para os clculos.

a) Mdia Aritmtica:
N

x=

xi
i =1

1
(x1 + x2 +  + xN )
N

b) Desvio Padro:

1 N
(xi x )2

N 1 i =1
v=

c) Regresso Linear:
N

a=

i =1

i =1
2

xi yi N xi yi
i =1

xi2
i =1

1 N
xi
N i = 1

b=

i =1

i =1

yi a xi
N

R=a

x
y

onde N a quantidade de medies, xi o i-simo valor medido, x o valor mdio, o desvio


padro, v a varincia, x e y, so os desvios padres das grandezas x e y e R a correlao
entre os valores das grandezas x e y.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

23

Você também pode gostar