quarta-feira, fevereiro 11, 2009

O Não Tão Básico do Básico - Paradigmas de Programação - Parte 3

A Programação Estruturada

Na parte anterior vimos como inicialmente o controle de fluxo era dominado pelas instruções GOTO, gerando códigos confusos, propícios a bugs e de difícil manutenção. A reação a isto foi a Programação Estruturada.

A Programação Estruturada simplifica o controle de fluxo pela quebra do programa em estruturas geradas encadeando sub-estruturas de uma poucas formas padronizadas:
  • Sequência: na qual uma estrutura é executada incondicionalmente em seguida a outra. Em quase todas as linguagens isto é feito codificando uma estrutura logo em seguida a outra.
  • Seleção: onde uma entre várias estruturas é executada conforme o estado do programa. As linguagens estruturadas fazem isto através de instruções como IF/THEN/ELSE e SWITCH.
  • Repetição: onde uma estrutura é executada até que um certo estado do programa seja atendido. As instruções normalmente encontradas são WHILE, FOR, DO UNTIL.
Cada estrutura deve ter um único ponto de entrada. Na forma mais radical, as estruturas devem ter um único ponto de saída. Na prática, entretanto, ter um único ponto de saída acaba obrigando o encadeamento excessivo de IFs e a criação de variáveis auxiliares, o que aumenta a complexidade. Por este motivo, as linguagens estruturadas costumam fornecer instruções para encerrar uma estrutura antes do seu fim, como BREAK e RETURN.

Embora seja pouco usual, existe uma forma gráfica de representar o fluxo de um programa estruturado. O fluxo abaixo corresponde ao meu exemplo do algorítimo de Euclides:

Reparar que para obedecer às regras da estruturação foi preciso acrescentar uma iniciação dummy para r e duplicar o teste r <> 0 (alguns compiladores otimizadores conseguem suprimir este teste duplicado ao gerar o código).

Para encerrar esta etapa, vejamos o algoritmo de Euclides codificado de forma estruturada em Pascal:
begin
write ('m = ');
read (m);
write ('n = ');
read (n);
r := 1;
while r <> 0 do
begin
r := m mod n;
if (r <> 0) then
begin
m := n;
n:= r;
end
end;
writeln (n);
end.
A seguir: vamos fazer um pequeno desvio para falar sobre a Programação Modular.

Nenhum comentário: