terça-feira, 31 de julho de 2012

Procedures


Definição

Uma das técnicas mais utilizadas e tida como vantajosa na confecção de programas grandes é a modularização. Consiste em dividir o programa em diversos módulos ou subprogramas, de certa forma dependentes uns dos outros. Existe um módulo que é o principal, a partir do qual são chamados os outros módulos, esse módulo recebe o nome de programa principal, enquanto que os outros são chamados de subprogramas. No  sistema Turbo Pascal, existem dois tipos de subprogramas, a saber:

                - Procedures (procedimentos)
                - Functions (funções)

A procedure é como se fosse um programa. Ela tem a estrutura praticamente igual a de um programa, como veremos mais adiante. A procedure deve ser ativada (chamada) pelo programa principal ou por uma outra procedure, ou até por ela mesma.

Declaração de procedures

Uma procedure tem praticamente a mesma estrutura de um programa, ou seja, ela contém um cabeçalho, área de declarações e o corpo da procedure. Na área de declarações, podemos ter as seguintes sub-áreas:
           Label - Const - Type - Var - Procedures - Functions.
Devemos salientar que tudo que for declarado dentro das sub-áreas só será reconhecido dentro da procedure. Mais para frente, voltaremos a falar sobre isso.

        Exemplo:

Program Exemplo_1;  (* cabeçalho do programa *)
        Uses CRT;
        Procedure linha;      (* cabeçalho da procedure linha *)
        Var i : integer;      (* subárea Var da procedure linha *)
        Begin                 (* corpo da procedure linha *)
           for i:=1 to 80 do write('-');
        End;
        Begin                 (* corpo do programa principal *)
           ClrScr;
           linha;             (* ativação da procedure linha *)
           writeln('teste');
           linha;             (* ativação da procedure linha, novamente *)
        End.

O programa acima, pura e simplesmente faz o seguinte:

1-) Apaga a tela e coloca o cursor em 1,1
2-) Ativa a procedure linha
3-) Escreve a palavra teste
4-) Ativa novamente a procedure linha.

Por sua vez, a procedure linha traça uma linha a partir da posição atual do cursor. Uma observação importantíssima a ser feita neste instante, é que a variável inteira i, definida dentro da procedure linha só existe dentro da procedure, isto significa que toda vez que ativamos a procedure linha, a variável  'i'  é criada e toda vez que saímos da procedure linha, ela é destruída.

Passagem de parâmetros

No exemplo acima, ao ativarmos a procedure linha, não houve passagem de parâmetros, mas poderia haver, repare no exemplo abaixo:

        Exemplo:

Program Exemplo;
        Uses CRT;
        Var i,j:integer;
        Procedure soma(x,y:integer);
        Begin
           writeln(x+y);
        end;
        Begin
           ClrScr;
           soma(3,4);
           i:=45;
           j:=34;
           soma(i,j);
        end.

Como podemos reparar, a procedure soma depende de dois parâmetros inteiros, e ao ativarmos esta procedure, devemos fornecer os dois parâmetros. Esses parâmetros podem ser dois números inteiros ou duas variáveis inteiras, obviamente deve haver compatibilidade entre os parâmetros passados. Podemos também passar parâmetros de tipos  diferentes, senão vejamos:

Program Exemplo_1;
        Uses CRT;
        Var i,j:integer;
        Procedure soma(x,y:integer;h,g:real);
        Begin
           writeln(x+y);
           writeln(h/g:10:2);
        end;
        Begin
           ClrScr;
           i:=34;
           j:=35;
           soma(i,j,3.4,4.5);
        End.

{Nos exemplos acima, houve passagem de parâmetros para as procedures, mas elas também podem passar dados de volta para o programa chamador, exemplo:}

        Program exemplo;
        Uses CRT;
        Var i : Integer;
        Procedure Soma(x,y:Integer;Var z:Integer);
        Begin
           z:=x+y;
        End;
        Begin
           ClrScr;
           Soma(3,4,i);
           Writeln(i);
        End.

Da forma como foi declarada a procedure soma, quando a ativamos com a seqüência Soma(3,4,i), ocorrem as seguintes passagens:

        - O número 3 é passado para x
        - O número 4 é passado para y
        - O parâmetro z é passado para i.

Como podemos ver, houve passagem de dados do programa chamador para a procedure e da procedure para o programa chamador.

A declaração forward

        Suponha o programa abaixo:

        Program exemplo;
        Uses CRT;
        Procedure Soma(x,y:Integer);
        Begin
           linha;
           Writeln(x+y);
        End;
        Procedure Linha;
        Var i:integer;
        Begin
           For i:=1 to 80 do Write('-');
        End;
        Begin
           ClrScr;
           Soma(3,4);
        End.

Repare que a procedure Soma chama uma procedure chamada linha. No entanto, a procedure linha está declarada mais à frente e portanto, ao compilarmos o programa, o compilador irá "reclamar" que não conhece o identificador  Linha  e com justa razão, isto porque a compilação é feita de cima para baixo e da esquerda para a direita. Para tanto, podemos usar a declaração Forward, cuja finalidade é a de indicar ao compilador que determinada procedure está definida mais para frente.

        Exemplo:

Program exemplo;
        Uses CRT;
        Procedure Linha; Forward;
        Procedure Soma(x,y:Integer);
        Begin
           linha;
           Writeln(x+y);
        End;
        Procedure Linha;
        Var i:integer;
        Begin
           For i:=1 to 80 do Write('-');
        End;
        Begin
           ClrScr;
           Soma(3,4);
        End.

        Agora sim, podemos compilar o programa sem erro.

O escopo de objetos num programa

        Reparem o Exemplo abaixo:

Program Exemplo;
        Uses CRT;
        Const a=100;                     (* constante global *)
        Label fim;                       (* Label global *)
        Var i,x,y : Integer;             (* variáveis globais *)
        Procedure Linha;
        Var i : Integer;                 (* i é local à procedure
                                            linha *)
        Begin
           For i:=1 to 80 do Write('-');
        End;
        Procedure Teste;
        Procedure Sub_teste;              (* a procedure
                                           Sub_teste é local
                                           à procedure Teste *)
        Begin
           Write('Estive em sub_teste');
        End;
        Begin
           Sub_teste;
           Writeln;
        End;
        Begin
           ClrScr;
           i:=100;
           Linha;
           x:=20;
           y:=30;
           Teste;
           Linha;
           Writeln('i=',i,' y=',y,' x=',x);
        End.

Todos os elementos (constantes, variáveis, labels etc.) que forem definidos antes de começar o corpo do  programa, são considerados globais e podem ser utilizados por todas as procedures, functions e o próprio programa. O espaço para tais elementos é criado durante a compilação. Já, os elementos declarados dentro de uma procedure, só existem dentro da procedure, exemplo: ao declararmos uma variável dentro de uma procedure, toda vez que ativarmos a procedure, tal variável será criada e ao sairmos da procedure ela será destruída. Portanto, dizemos que esta variável é local à procedure.
No entanto, se repararmos bem no exemplo, veremos que existe uma variável i inteira declarada antes do início do programa, portanto global, e outra dentro da procedure linha, portanto local a esta procedure. Mas não há problema, pois o Turbo Pascal irá considerá-las diferentes. Quando estivermos dentro do programa, teremos acesso à variável global e quando estivermos dentro da procedure, teremos acesso à variável local.

Nenhum comentário:

Postar um comentário