Aula 12: Programação Modular I:

Procedures

traduzido pelo Peter Stallinga


Até já usamos só coisas que PASCAL nos deu. Nos aprendemos escrever ciclos (for, while-do, repeat-until), usar input e output (readln, writeln), como a controlar o programa (if-then, if-then-else, case-of), como declarar variáveis (var), constantes (const), como atribuir valores (:=) e como a calcular, até calculos complicados do tipo álgebra Booleana. Mas, nunca usamos coisas NOVAS. Com procedimentos (procedures e functions) podemos fazer exactamento isso, definir novas instruções.
Já encontramos alguns procedimentos da linguagem PASCAL, nomeademente Write, WriteLn, Read e ReadLn. Agora vamos definir os nossos procedimentos próprios.

Procedures (procedimentos) e Functions (funções) são pequenos programas ou módulos dentro do programa principal. Cada módulo faz uma tarefa específica. Isto ajuda organizar o programa. Faz-o mais lógico e aumenta a eficiência através evitar repetições de partes do programa.

Existem dois tipos de módulos:

  1. Módulos que retornam nada. Em PASCAL chamam-se Procedures. Têm dois sub-tipos
  2. Módulos que retornam valores. Em PASCAL chamam-se Functions. Outra vez, existem dois sub-tipos


Procedures

Módulos que retornam nada chamam-se Procedures. Eles fazem coisas sem retornar nada. Eles podem aceitar parámetros (e trabalhar com eles) ou  fazer o trabalho sem dados de entrada. In any case, Procedures são como programas dentro do programa. Eles têm O protótipo de um procedure é
 Procedure ProcedureName

 Var <variable_list>;
 Const <const_list>;

 begin
   instructions;
 end;

O lugar para declarar um procedure é dentro do programa (então depois a declaração do nome do programa), mas antes o começo do programa principal, então antes o begin.


Chamar

Depois a declaração do procedimento podemos usar-o no programa principal. Isto chama-se calling (chamar) o procedimento. Fazemos isto através escrever o nome do procedimento. Um exemplo inteiro

 
código PASCAL


PROGRAM WithProcedure;

Var x: real;

PROCEDURE Module1;
var y: real;
begin
  WriteLn('Now I am entering Procedure Module1');
  WriteLn('Give a value for y:');
  ReadLn(y);
  Writeln(y/3:0:3);
end;

begin
  WriteLn('Starting the program');
  Module1;
end.

output


Starting the program
Now I am entering Procedure Module1
Give a value for y:
 12
4.000


Um programa chama um
dos seus procediementos


Procedures chamam procedures

Procedimentos podem ser chamados pelos outros procedimentos ou funções. Normalmente, em PASCAL estes procedimentos devem ser declarados depois o procedimento a chamar. Análise bem o programa a seguir com o seu output:
código PASCAL

PROGRAM TwoProcedures;

Var x: real;

PROCEDURE Module1;
var y: real;
begin
  WriteLn('Now I am entering Procedure Module1'); 
  WriteLn('Give a value for y:');
  ReadLn(y);
  Writeln(y/3:0:3);
  WriteLn('Leaving Module1');
end;

PROCEDURE Module2;
var z: real;
begin
  WriteLn('Now I am entering Procedure Module2');
  Module1;
  WriteLn('Give a value for z:');
  ReadLn(z);
  Writeln(z*2:0:3);
  WriteLn('Leaving Module2');
end;

begin
  WriteLn('Now I am starting the program');
  Module2;
end.

output

Now I am starting the program
Now I am entering Procedure Module2 
Now I am entering Procedure Module1
Give a value for y:
 12
4.000
Leaving Module1
Give a value for z:
 10
20.000
Leaving Module2


Um programa chama um dos seus
procedimentos que chama um outro
procedimento.


Usar as variáveis

Sim: Procedimentos podem usar as variáveis do programa principal, mas
Não: O programa principal não pode (não é possível) usar as variáveis do procedimento. Imagine o procedimento como uma caixa com janelas do tipo espelho-uma sentido. Dentro consegues ver tudo fora, mas fora não consegues ver nada do que está a acontecer interior.
Não: Procedimenots não podem usar variáveis dos outros procedimentos. O mesmo rociocínio aplica. Um procedimento consegue ver os outros procedimentos, mas não consegue ver dentro dos procedimentos. Procedimentos são caixas negras.

Aqui vem um exemplo. Todas as instruções escritas com fonte vermelho grosso italico são proíbidas.
 
código PASCAL

PROGRAM ProcedureVariables; 

Var x: real;

PROCEDURE Module1;
var y: real;
begin
  WriteLn(x);
  WriteLn(y);
  WriteLn(z); (* this is not allowed *)
end;

PROCEDURE Module2;
var z: real;
begin
  WriteLn(x);
  WriteLn(y); (* this is not allowed *)
  WriteLn(z);
end;

begin
  WriteLn(x);
  WriteLn(y); (* this is not allowed *)
  WriteLn(z);   (* this is not allowed *)
end.



Proíbido (setas vermelhas dashed) e
permitido (setas verdes solidas)
use das varáveis.

Mais tarde vamos estudar o assunto de âmbito (scope) das variáveis em mais pormenor.


  Nesting


Em muitas linguagens de programação podemos fazer nesting (aninhamento) dos procedimentos. Podemos escrever (por) procedimentos dentro dos procedimentos dentro ....
Examina o progrma abaixo. O procedimento dentro o procedimento é escrito em fonte grosso. tal como as variáveis do procedimento Module1, o sub'procedimento não é visível fora do Module1.
 
código PASCAL

PROGRAM NestedProcedures;

Var x: real;

PROCEDURE Module1;
var y: real;
  PROCEDURE Module2;
  var z: real;
  begin
    WriteLn('Now I am entering Procedure Module2'); 
    Module1;
    WriteLn('Give a value for z:');
    ReadLn(z);
    Writeln(z*2:0:3);
    WriteLn('Leaving Module2');
  end;
begin
  WriteLn('Now I am entering Procedure Module1'); 
  WriteLn('Give a value for y:');
  ReadLn(y);
  Writeln(y/3:0:3);
  Module2;
  WriteLn('Leaving Module1');
end;

begin
  WriteLn('Now I am starting the program');
  Module1;
    (* cannot use variables or procedures *)
    (*  of Module1 here:                  *)
    (* cannot call Module2 here           *)
    (* cannot use variable y or z here    *) 
end.

output

Now I am starting the program
Now I am entering Procedure Module1 
Give a value for y:
 12
4.000
Now I am entering Procedure Module2
Give a value for z:
 10
20.000
Leaving Module2
Leaving Module1


Mini teste

Quick test:Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique aqui para um teste on-line.

Peter Stallinga. Universidade do Algarve, 15 março 2002