11.1. Introdução
[D] Um "subprograma", como o próprio
nome diz, é uma seqüência de comandos que fazem parte
de um programa.
[C] Um programa executável consiste
num único programa principal e subprogramas opcionais.
[D] Uma "função" é
um tipo de subprograma que sempre retorna um valor único.
[D] Uma "subrotina" é um tipo de
subprograma que retorna uma quantidade variável de valores ou não
retorna nenhum valor.
[D] Uma "função intrínseca"
é um subprograma do tipo função fornecido pelo compilador.
11.2. Argumentos de Subprogramas
[D] Um "argumento de subprograma" é
uma entidade que transfere um valor para ou de um subprograma.
[D] Há duas espécies de argumentos:
atuais e mudos.
[D] Os argumentos "atuais" são escritos
no comando que chama o subprograma.
[D] Os argumentos "mudos" são especificados
na definição do subprograma.
[C] Quando o controle de execução
é transferido para o subprograma, os argumentos mudos são
associados com os argumentos atuais na base de 1 para 1.
[E] Se (i, j(2), 5) é uma lista
de argumentos atuais e (k, l, m) é uma lista associada de argumentos
mudos, então k é igual a i, l é igual a j(2) e m é
igual a 5.
11.3. Funções Intrínsecas (FI)
[C] As funções intrínsecas
são procedimentos tão usados que achou-se por bem inclui-las
como parte integrante do Fortran, e portanto, já vem definidas.
[D] Uma FI sempre é usada em uma expressão e retorna o valor calculado da função para o argumento, que se encontra entre parênteses:
FI(argumento)
[E] Exemplos:
y = cos(x) , FI = cos
, nome: cosseno; argumento = x.
y = 2.0*cos(x**2) ,
FI = cos , nome: cosseno; argumento = x**2.
[C] Geralmente os livros de Fortran contém
uma lista completa de todas as FI.
[C] ATENÇÃO: Um mesmo tipo
de FI pode ter vários nomes, dependendo do tipo de argumento e do
tipo do valor de retorno.
[C] A tabela abaixo contém algumas
das funções intrínsecas mais usadas em Fortran. Para
informações mais completas, veja o livro texto.
FUNÇÃO | DESCRIÇÃO |
|
|
int(x) | converte para o tipo inteiro, truncando a mantissa |
|
|
real(x) | converte para o tipo real |
|
|
nint(x) | arredonda para o inteiro mais próximo |
|
|
aint(x) | trunca a mantissa |
|
|
anint(x) | arredonda para o inteiro mais próximo |
|
|
char(x) | converte inteiro para caractere |
|
|
ichar(x) | converte caractere para inteiro |
|
|
abs(x) | valor absoluto (ou módulo) |
|
|
mod(x,z) | resto da divisão de x/z |
|
|
max(x,z,w,...) | encontra o maior valor entre os argumentos |
|
|
min(x,z,w,...) | encontra o menor valor entre os argumentos |
|
|
len(x) | comprimento de uma variável ou constante caractere |
|
|
index(x,z) | localiza a variável ou constante caractere x dentro da variável ou constante z |
|
|
sqrt(x) | raiz quadrada |
|
|
exp(x) | exponencial |
|
|
log(x) | logaritmo natural e neperiano |
|
|
log10(x) | logaritmo decimal |
|
|
sin(x) | seno |
|
|
cos(x) | cosseno |
|
|
tan(x) | tangente |
|
|
cotan(x) | cotangente |
|
|
11.4. Funções Function
[D] Um subprograma função
FUNCTION é usado do mesmo modo que se usa uma função
intrínseca. A diferença é que o subprograma FUNCTION
é escrito pelo próprio programador. Isto serve para resolver
problemas como, por exemplo, para se ter uma função que obtenha
o valor de y(x)=x2+3x+2. A função y(x) não
teria que ser reescrita diversas vezes ao longo do programa, evitando-se
erros.
[D] O subprograma FUNCTION sempre começa
com o comando não-executável FUNCTION, seguido por uma seqüência
de comandos e termina com um comando END. O controle de execução
é retornado para o programa principal através de um comando
RETURN (que também é um comando obrigatório).
[D] Regras para o uso de subprogramas FUNCTION:
11.4.1. Comando FUNCTION
[D] O comando FUNCTION deve aparecer como
o primeiro comando no subprograma.
[CF] A forma geral do comando FUNCTION é:
[tipo] function nome ([a[,a]])
sendo que:
- "tipo" é um dos tipos de variáveis
permitidas no Fortran.
- "nome" é o nome da função
e obedece às regras para os nomes das variáveis.
- "a" é um argumento que é
passado para ser processado pela função.
[CF] A forma de chamar um subprograma FUNCTION é a seguinte (aparecendo obrigatoriamente numa expressão):
nome ([b[,b])
sendo que:
-"nome" é o nome de um subprograma.
- "b" é um argumento.
[E] Exemplo.
program volcil
implicit none
real volume,area,raio,h
print *,'Digite o raio
e a altura do cilindro: '
read *,raio,h
volume=area(raio)*h
print *,volume
stop
end
real function area(x)
implicit none
real x
area=3.1415927*x**2
return
end
11.5. Funções de Comando
[D] Quando uma função envolve
uma única linha de computação, não é
necessário escrever um subprograma.
11.5.1. Definição de Função de Comando
[CF] Uma função de comando é definida por um comando da forma:
nome ([a[,a]?]) = e
sendo que:
- "nome" é o nome de uma função
e segue as mesmas regras para nomes de variáveis.
- "a" é um argumento.
- "e" é uma expressão.
[D] Usa-se uma função de comando como se usa uma função intrínseca.
[D] A função de comando é
um comando não-executável e portanto deve ser declarada no
início do programa, antes de qualquer comando executável.
[E] Exemplo:
program exemplo
implicit none
real area,raio
integer i
area(raio) = 3.1415927*raio**2
do i = 1, 10
read(*,*) raio
write(*,*) area(raio)
enddo
stop
end
[D] Uma subrotina difere de uma função nos seguintes modos:
11.6.1. Comando SUBROUTINE
[D] O comando SUBROUTINE deve aparecer
como o primeiro comando num subprograma tipo subrotina.
[CF] A forma geral do comando SUBROUTINE é:
SUBROUTINE nome [([a[,a]?])]
sendo que:
- "nome" é o nome da subrotina.
- "a" é um argumento.
11.6.2. Comando CALL
[CF] Uma subrotina é executada através de um comando CALL, que possui a seguinte forma geral:
CALL nome [([b[,b]?])]
sendo que:
- "nome" é um nome de subrotina.
- "b" é um argumento.
[E] Este é um exemplo simples, sendo que seria até desnecessário o uso de um subprograma do tipo SUBROUTINE para zerar 3 matrizes:
program matriz1
! Objetivo: exemplo do uso de subrotinas
! Programador: FCLavarda
implicit none
integer n,i,j
parameter(n=3)
real a(n,n),b(n,n),c(n,n)
call zerador(a,b,c,n)
do i=1,n
print *,(a(i,j),j=1,n)
enddo
stop
end
subroutine zerador(x,y,z,k)
implicit none
integer k,i,j
real x(k,k),y(k,k),z(k,k)
do i=1,k
do j=1,k
x(i,j)=0.0
y(i,j)=0.0
z(i,j)=0.0
enddo
enddo
return
end
11.7. Dimensões Ajustáveis
[C] Uma variável indexada (vi) dimensionada
no programa principal pode ser repassada para uma subrotina. E na subrotina,
os índices de dimensão podem ser diferentes que aqueles definidos
no programa principal (a vi pode ser redimensionada).