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 é
 

 FunctionName := Value

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:


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