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
   optesta_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).

Pagina anteriorIndiceProxima pagina
Hosted by www.Geocities.ws

1