|
Aula 13: Programação Modular II:
Procedimentos com input e output
|
|
traduizido pelo Peter Stallinga
Na aula anterior (aula 12) vimos Procedures
que não aceitam parâmetros ou retornam valores. Aqueles
foram
procedimentos simples. Agora vamos ver procedimentos que aceitam
parâmetros
e procedimentos que geram valores (funções).
Parâmetros de Procedures
Nos podemos passar parâmetros aos procedures. O procedure pode
usar
e trabalhar com este parâmetro. Em PASCAL pomos os
parâmetros
do procedure depois do nome do procedure, entre parêntesis:
Procedure ProcedureName(lista_de_parametros);
Var <variable_list>;
Const <const_list>;
begin
instructions;
end;
|
|
|
Os parâmetros na lista dos parâmetros são
declarados
da mesma forma como as variáveis normais do programa ou
procedimento,
nomeademente temos de especificar o tipo do cada parâmetro.
Dentro
do procedimento podemos usar o parâmetro tal como foi uma
variável
normal. Podemos calcular com eles, usar nas condições e
mesmo
mudar os valores.
No exemplo abaixo, o programa calcula e mostra o quadrado de uma
variável
x:
Nota a maneira de declarar e usar o parâmetro
r.
código PASCAL
PROGRAM WithParameters;
Var x: real;
PROCEDURE WriteSquare(r: real);
var y: real;
begin
r := r*r;
y := r;
Writeln('The suare of ',r:0:1,'
is
',y:0:1);
end;
begin
x := 4;
WriteSquare(x);
WriteSquare(3.0);
end.
|
output
The square of 4.0 is 16.0
The square of 3.0 is 9.0 |
O exemplo também mostrou como chamar o procedimento com
parâmetros;
com uma variável tal como em WriteSquare(x)ou
com uma constante tal como em WriteSquare(3.0).
Um outro exemplo, onde o procedimento tem dois parâmetros:
código PASCAL
PROGRAM WithParameters;
Var x: integer;
y: integer;
PROCEDURE WriteSum(i1, i2: integer);
( will write the sum of i1 and
i2
*)
var j: integer;
begin
j := i1+i2;
Writeln('The sum of ',i1,' and ',
i2, ' is ', j);
end;
begin
x := 4;
y := 5;
WriteSum(x, y);
WriteSum(3, 4);
end.
|
output
The sum of 4 and 5 is 9
The sum of 3 and 4 is |
Finamente, um exemplo com uma lista de parâmetros dos tipos
sortidos.
Tal como na declaração normal, parâmetros na lista
dos parâmetros são separados com ;
código PASCAL
PROGRAM WithParameters;
PROCEDURE WriteNTimes(r: real; n:
integer);
(* Will write n times the real r
*)
var i: integer;
begin
for i := 1 to n do
WriteLn(r:0:3);
end;
PROCEDURE WriteFormatted(r: real; n:
integer);
(* Will write the real r with n
decimal
cases *)
begin
WriteLn(r:0:n);
end;
begin
WriteNTimes(3.0, 4);
WriteFormatted(5.0, 5);
WriteFormatted(5.0, 1);
end.
|
output
3.000
3.000
3.000
3.000
5.00000
5.0 |
Funções
Funções são procedimentos que retornam um valor de
output.
O tipo do valor a retornar deve ser especificado na altura da
declaração
da função, depois a lista dos parâmetros (se tem),
e precedido pelo :
Exemplo:
Function FunctionName(parameter_list):
type;
Var <variable_list>;
Const <const_list>;
begin
instructions;
end;
|
|
Funções sem e com
parâmetros de input.
|
Em algum lugar a função deve especificar o valor a
retornar.
A forma de especificar isto é
Com FunctionName igual a nome da
função,
exactamente como foi declarado. Por exemplo
FUNCTION Square(r: real): real;
(* retornara o quadrado
do parametro r *)
begin
r := r*r;
Square := r;
end;
No lugar onde o programa chama a função, devemos
atribuir
o valor que a função retorna a uma variavel (do mesmo
tipo),
por exemplo
y := Square(3.0);
ou usar numa expressão, por exemplo
y := 4.0 * Square(3.0) + 1.0;
ou usar numa outra função ou procedimento, por exemplo
Writeln(Square(3.0):0:1);
A full example:
código PASCAL
PROGRAM WithParameters;
Var x, y: real;
FUNCTION Square(r: real): real;
(* will return the square of of
the
parameter r *)
begin
r := r*r;
Square := r;
end;
begin
x := 4.0;
y := Square(x);
WriteLn('The square of ', x:0:1,
'
is ', y:0:1);
WriteLn('The square of ',
3.0:0:1,
' is ',
Square(3.0):0:1);
end.
|
output
The square of 4.0 is 16.0
The square of 3.0 is 9.0 |
Porquê?
Agora a grande questão é "porquê?". Porquê
escrever
procedimentos se é possível fazer as coisas com linhas de
instruções normais? Certo, as primeiras linguagens de
programção
não tiveram a possibilidade de escrever procedimentos (por
exemplo
BASIC) e ainda foi possível atacar qualquer problema. Portanto,
existem duas razões de usar procedimentos:
- Com módulos, porque são caixas negras,
é
possível
distribuir as tarefas de programação. Podemos pedir uma
pessoa
de escrever parte de um programa, por exemplo diagonalizar um matriz, e
não precisa de preocupar com os pormenores da
implementação.
Só precisa de concordar a lista dos parâmetros a passar.
Da mesma forma, podemos usar partes dos outros programas (ou
biblitecas).
Idealmente fazemos só um "link" aos procedimentos que o nosso
programa
precisa, sem saber come eles funcionam. (Obviamento com saber o
que é que eles fazem e como chamar eles). - Com
módulos o programa fica mais pequeno, mais eficiente e
mais
legível por evasão das repeticões de código
e organização mais logica.
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, 2 Abril
2002