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