Subprogramas
Subprogramas, comumente conhecidos na literatura geral de programação procedural de computadores por procedimento ou procedure, são um grupo de instruções que executam uma tarefa bem definida.
Os subprogramas podem ser chamados a partir do seu programa principal (ou de outros programas de escopo superior) e as informações (ou dados) podem ser transmitidas entre eles através de argumentos.
Existem dois tipos de subprogramas:
- Funções
- Subrotinas
Estes suprogramas podem ser de dois tipos, internos (dentro do
programa principal) ou externos (fora do programa principal). A
principal vantagem da opção de subprogramas externos é a possibilidade
de modularização em arquivos separados com finalidade de criação de
bibliotecas para compartilhamento.
Funções
Uma função é um procedimento que retorna uma quantidade única. Uma função não deve modificar seus argumentos.
A quantidade devolvida é conhecida como valor da função, e é denotado pelo nome da função.
Sintaxe
function name(arg1, arg2, ....) [declarações, incluindo àquelas dos argumentos] [comandos executáveis] end function [name]
O exemplo a seguir demonstra uma função chamada area_do_circulo
. A função calcula a área de um círculo com o raio r
.
https://gist.github.com/zrhans/c024860d5ccf7b8b6113bf1dbdb8914d.js
view rawpf-subprogramas-01.f90 hosted with
Quando você compilar e executar o programa acima, produz o seguinte resultado:
A área do circulo com raio 2.0 é
12.5663710
NOTA: Você deve especificar que nenhuma variável seja de tipo implícito implicit none
tanto no programa principal quanto no subprograma.
O argumento r
na função chamada é chamado de argumento fictício dummy, entenda-o como argumento auxiliar.
A opção de retorno/resultado
Se quiser que o valor retornado para ser armazenado em algum outro nome que o nome da função, você pode usar a opção resultado result
.
Você pode especificar o nome da variável de retorno como:
function name(arg1, arg2, ....) result (return_var_name)
[declarações, incluindo àquelas dos argumentos]
[comandos executáveis]
end function [name]
Obs: Funções recursivas sempre exigem valor de retorno. Você seria capaz de se preguntar e responder o porquê?
Subrotina
A subrotina não retorna um valor, no entanto, pode modificar seus argumentos.
Sintaxe
subroutine name(arg1, arg2, ....)
[declarações, incluindo àquelas dos argumentos]
[comandos executáveis]
end subroutine
Chamando uma subrotina
Você precisa chamar uma subrotina utilizando a instrução de chamada call
.
O exemplo a seguir demonstra a definição e uso de uma subrotina chamada “troca”, que troca os valores de seus argumentos:
https://gist.github.com/zrhans/7433a1b82d4d2eab6ec1978ef64833fe.js
Quando você compilar e executar o programa acima, produz o seguinte resultado:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000
Especificando a “intenção” dos Argumentos
O atributo intent
permite que especificar a intenção com que argumentos são usados no subprograma. A tabela 1 apresenta as caracterísiticas desse atributo:
Tabela 1 – Uso do argumento intent em subprogramas Fortran
Intenção | Sintaxe | Descrição |
---|---|---|
entrada | intent(in) | usado como valor de entrada, não mudará no subprograma |
saida | intent(out) | usado como valor de saída, ele será alterado no subprograma |
ambos | intent(inout) | Argumentos são ambos usados e substituídos |
O exemplo seguinte demonstra esse conceito:
https://gist.github.com/zrhans/ff354f20215a639d31d5b192a2a79056.js
Quando você compilar e executar o programa acima, produz o seguinte resultado:
O valor do discriminante vale
17.0000000
Subprogramas recursivos
Recursão ocorre quando uma linguagem de programação permite que você chamar uma função dentro da mesma função. Chamamos isso de chamada recursiva da função.
Quando um subprograma chama a si mesmo, direta ou indiretamente, ele é chamado de subprograma recursivo. Você deve declarar este tipo de subprograma precedendo-o da da palavra recursive
antes de sua declaração.
NOTA Quando uma função é usada de forma recursiva, a opção de retorno ou resultado result
obrigatoriamente deve ser usada.
Exemplo que calcula fatorial para um determinado número usando um subprograma recursivo:
https://gist.github.com/zrhans/5e2d8d1fdde8e208db3df18e9f6d1a61.js
Subprogramas Internos
Quando um procedimento está contido dentro de um programa que chama o procedimento interno do programa, devemosprestar a atenção para a palavra chave contains
.
A sintaxe de um programa que contém um procedimento interno é como se segue:
https://gist.github.com/zrhans/fc0e380ea6900ad7dbf25e86295c206b.js
O programa a seguir exemplifica esse conceito:
https://gist.github.com/zrhans/e53a9da55b0ec556978fefa43d68e70d.js
Quando você compilar e executar o programa acima, produz o seguinte resultado:
Before calling swap
a = 2.00000000
b = 3.00000000
After calling swap
a = 3.00000000
b = 2.00000000
Desafio
- Ler o material sobre Subprogramas do curso CS201
- Refletir respondendo às questões seguintes:
- Elabore um mapa conceitual sobre os subprogramas em Fortran exemplo para inspiração.
- Quais regras devem ser obedecidas em relação ao programa principal e a função e/ou subrotina?
- Com base no texto lido, quando seria mais apropriado o uso de funções ao invés de subrotinas?
- Qual foi o seu entendimento com respeito ao escopo das variáveis?
- Descreva a sintaxe básica e as características dos elementos dos subprogramas.
- Exemplifique a utilização de subprogramas desenvolvendo um código fonte em Fortran à sua escolha.
IDPGPF-1820