Algoritmos e Estruturas de Dados I

Aula 12: Subprogramas

Estrutura de Blocos:

Variáveis podem ser:

Variáveis Locais e Globais

program processa_caracteres;
var linha: array [1..80] of char;
    n: integer;

procedure imprime_linha;
var i: integer;
begin
  for i := 1 to 80 do write(linha[i]);
  writeln;
  n := 0;
end;

procedure inclui_caracter(c: char);
begin
  n := n + 1;
  linha[n] := c;
  in n = 80 then imprime_linha;
end;

...

Variáveis

Efeito colateral:

Persistência de valores:

Escopo de Variáveis

Escopo é a ``área'' do programa aonde aquela variável pode ser acessada.

program bla;
var a: integer;
  procedure p1(b: integer);
  begin
    ...
  end;

  procedure p2(a, b: integer);

    procedure p3;
    var a: integer;
    begin
      ...
    end;

  begin
    ...
  end;
begin
  ...
end.

Escopo de Variáveis

Escopo é a ``área'' do programa aonde aquela variável pode ser acessada.

program bla;
var a: integer;
  procedure p1(b: integer);
  begin
    ...
  end;

  procedure p2(a, b: integer);

    procedure p3;
    var a: integer;
    begin
      ...
    end;

  begin
    ...
  end;
begin
  ...
end.

Refinamentos Sucessivos - Top Down

Idéia: dividir cada problema em subproblemas.

Vantagem: permite atacar um problema de cada vez

Exemplo: listar todos os números inteiros menores que um dado n cujos quadrados são palíndromos.

(palíndromo: sequência de caracteres que não muda quando lida da esquerda para a direita ou vice-versa.

Palíndromos

Métodos de solução:

Palíndromos

program inutil;

var n, num, quad: integer;

begin
  readln(n);
  num := 1;
  while (num < n) do begin
    quad := n * n;
    if palindromo(quad) then 
      writeln(num);
    num := num + 1;
  end;
end.

Palíndromos

function palindromo(p: integer):boolean;
var i: integer;
begin
  i := inverso(p);
  if p = i then palindromo := true;
           else palindromo := false;
end;



function inverso(k: integer): integer;
var i, dividendo, resto: integer;
begin
  i := 0;
  dividendo := k;
  while dividendo > 0 do begin
    resto := dividendo mod 10;
    dividendo := dividendo div 10;
    i := i * 10 + resto;
  end;
  inverso := i;
end;

Desenvolvimento e Teste Incrementais de Programas

Objetivos:

Estratégia:

Desenvolvimento:

Teste incremental:

Palíndromos 2 -- O Teste

Módulo a ser testado:

program inutil;
var n, num, quad: integer;
begin
  readln(n);
  num := 1;
  while (num < n) do begin
    quad := n * n;
    if palindromo(quad) then 
      writeln(num);
    num := num + 1;
  end;
end.
Módulo de teste:

function palindromo(p: integer):boolean;
begin
  palindromo := true;
end;

Palíndromos 2 -- O Teste

Módulo a ser testado:

function palindromo(p: integer):boolean;
var i: integer;
begin
  i := inverso(p);
  ...
end;
Módulo de teste:

function inverso(k: integer): integer;
var kinv: integer;
begin
  write('Entre com o valor invertido 
de', k);
  readln(kinv);
  inverso := kinv;
end;

Palíndromos 2 -- O Teste

Programa de teste:

program teste;
var num: integer;
begin
  readln(num);
  while (num > 0) do begin
    writeln(num);
    if palindromo(num)
      then writeln('E palindromo.');
      else writeln('Nao e palindromo');
    readln(num);
  end;
end.