|
Capítulo
2
|
2.6
Procedimentos e Funções
|
Em pseudo-código
costuma-se fazer distinção entre as estruturas chamadas procedimentos
e as estruturas chamadas funções. Nas linguagens de
programação esta distinção pode ser mais ou
menos acentuada, de acordo com as características da linguagem.
Em linhas gerais,
ambas são estruturas ou blocos de programa, que estão fora
do corpo do código principal (programa principal).
Obs.: Lembre-se que
existem blocos de código que são usados internamente aos
programas em comandos como para (for), se (if) entre outros.
No caso de funções e procedimentos, estes blocos serão
declarados fora do corpo do programa principal.
Obs2.: Em nosso tutorial
da linguagem C/C++ damos uma explicação
detalhada do uso de funções nesta linguagem.
|
No
desenho ao lado foram representados 3 blocos distintos.
O bloco 01 poderia
ser um procedimento, o bloco 02 uma função e o bloco final
seria a representação do programa (ou código) principal.
Veja que dentro
do programa principal existem chamadas para os dois blocos. Estas chamadas
podem ser iguais ou diferentes dependendo da natureza dos blocos 01 e 02
(com isso queremos explicar que existem diversas formas de se chamar procedimentos
e funções). |
|
1 - Sub-Rotinas
do Tipo Procedimento
|
A declaração
de um procedimento é composta de uma linha que indica o nome do
mesmo e de um bloco de programa, onde seu início e seu final são
bem delimitados. Caso um programa ou mesmo outro procedimento necessite
chamar o procedimento declarado, basta colocar o nome do mesmo no código:
| programa mat
procedimento
testa_mat
var
n,m : inteiro
início
escreva
"Digite a qtd de colunas da matriz A"
leia
m
escreva
"Digite a qtd de linhas da matriz B"
leia
n
se
(n <> m) então
escreva "Não podemos executar a operação de
multiplicação"
fim_se
fim
procedimento
mult_mat
var
L,K,C,i,k,,j : inteiro
matriz1 = conjunto [1..10,1..10] de inteiro
matriz2 = conjunto [1..10,1..10] de inteiro
início
escreva
"Digite a qtd de linhas da matriz A"
leia
L
escreva "Digite a qtd de colunas da matriz A"
leia
K
escreva "Digite a qtd de colunas da matriz B"
leia
C
para
i
de 1 até L passo 1 faça
para j de 1 até K passo 1 faça
início
escreva "Matriz1[i,,j]="
leia matriz1[i,,j]
fim
fim_para
fim_para
para
i
de 1 até K passo 1 faça
para j de 1 até C passo 1 faça
início
escreva "Matriz2[i,,j]="
leia matriz2[i,,j]
fim
fim_para
fim_para
para
i
de 1 até L passo 1 faça
para j
de 1 até C passo 1 faça
para k de 1 até K passo 1 faça
matriz3[i,,j] matriz3[i,,j]+matriz1[i,k]*matriz2[k,,j]
fim_para
fim_para
fim_para
fim
var
op : inteiro
início
escreva
" Escolha uma das Opções"
escreva
" 1 - Testa as imensões das Matrizes"
escreva
" 2 - Multiplicação de Matrizes"
caso op
seja
1 faça testa_mat
seja
2 faça mult_mat
fim |
No exemplo acima,
declaramos dois procedimentos (testa_mat
e mult_mat) e o programa principal que
chamará um destes procedimentos usando o comando caso. Veja
que em ambos os procedimentos necessitou-se das dimensões das matrizes.
Com certeza este programa poderia ter sido melhorado usando funções
ou procedimentos que possam receber parâmetros.
Obs.: Os procedimentos
podem receber parâmetros vindos do programa principal mas não
podem retornar resultados para o mesmo.
|
2 - Sub-Rotinas
do Tipo Função
|
As funções
possuem a possibilidade de receber parâmetros e retornar resultado
(diferentemente dos procedimentos). Esta característica passa a
ser muito importante em alguns casos específicos. Vale a pena dar
uma olhada da declaração de funções do tutorial
de C/C++.
| programa mat
função
testa_mat(m : inteiro, n : inteiro) : caractere
início
se
(n <> m) então
testa_mat "n"
senão
testa_mat "s"
fim_se
fim
procedimento
mult_mat(K : inteiro)
var
L,C,i,k,,j : inteiro
matriz1 = conjunto [1..10,1..10] de inteiro
matriz2 = conjunto [1..10,1..10] de inteiro
início
escreva
"Digite a qtd de linhas da matriz A"
leia
L
escreva "Digite a qtd de colunas da matriz B"
leia
C
para
i
de 1 até L passo 1 faça
para j de 1 até K passo 1 faça
início
escreva "Matriz1[i,,j]="
leia matriz1[i,,j]
fim
fim_para
fim_para
para
i
de 1 até K passo 1 faça
para j de 1 até C passo 1 faça
início
escreva "Matriz2[i,,j]="
leia matriz2[i,,j]
fim
fim_para
fim_para
para
i
de 1 até L passo 1 faça
para j
de 1 até C passo 1 faça
para k de 1 até K passo 1 faça
matriz3[i,,j] matriz3[i,,j]+matriz1[i,k]*matriz2[k,,j]
fim_para
fim_para
fim_para
fim
var
op : caractere
início
escreva "Digite a qtd de colunas da matriz A"
leia
m
escreva
"Digite a qtd de linhas da matriz B"
leia
n
op testa_mat(m,n)
caso op
seja
"s" faça mult_mat(m)
seja
"n" faça escreva "Não pode ser efetuada a multiplicação"
fim |
Neste caso, modificamos
o programa anterior para possibilitar o uso de uma função
(testa_mat) que irá receber a quantidade de colunas da matriz
A e o número de linhas da matriz B a fim de determinar se a multiplicação
de matrizes pode ser realizada. Caso n seja igual a m, então
a operação poderá ser realizada. Perceba que a função
recebe números inteiros e devolve um caractere (s para sim
e n para não). Caso a resposta seja positiva, então
o comando caso irá executar a primeira opção que é
a chamada do procedimento (mult_mat) que também foi modificado
apenas para demonstrar que em pseudo-linguagem os procedimentos podem inclusive
receber parâmetros (neste caso, o parâmetro é o número
de linhas de B ou colunas de A). |