|
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:
-
Módulos que retornam nada. Em PASCAL chamam-se Procedures.
Têm dois sub-tipos
-
Procedures que aceitam parámetros e
-
Procedures que não usam parámetros (input)
-
Módulos que retornam valores. Em PASCAL chamam-se Functions.
Outra vez, existem dois sub-tipos
-
Functions que aceitam parámetros e
-
Functions que não usam parámetros (input)
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 nome. As mesmas regras para identificadores aplicam. Veja aula
5
-
Variáveis e constantes. temos de declarar-as no procedimento.
-
uma combinação begin - end; Nota que
este
end é finalizado com ;
-
O código
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