Linguagens de programação estruturadas


Programação Estruturada

Um programa de computador é um conjunto de instruções seqüenciais, que define as ações a serem executadas e a ordem na qual essas ações devem ser executadas. Essas ações incluem o que se chama transferência de controle, que permite que a instrução a ser executada não seja a imediatamente seguinte, passando o controle para outra instrução ou bloco de instruções escrito em outra parte do programa. A transferência de controle permite a ramificação dos programas, representando seqüências possíveis de instruções que o computador haverá de executar, a depender da satisfação ou não das condições requeridas.

Segundo Deitel e Deitel (1) , o uso indiscriminado das transferências de controle é causador de muitas dificuldades dos programadores para escrever e principalmente para depurar os programas. Na década de 1960 percebeu-se que a maior responsável por isso era a instrução goto, existente em muitas linguagens, que permite a transferência de controle para qualquer destino que se queira num programa. Os blocos ou ramos dos programas escritos usando goto podem possuir mais de uma entrada e mais de uma saída, e isso é uma fonte de problemas.

Num trabalho muito importante, Bohm e Jacopini (2) demonstraram em 1966 que qualquer programa pode ser escrito sem usar a instrução goto, usando apenas três tipos de estruturas de controle de entrada e de saída únicas. Isso evita os problemas criados pelas entradas e saídas múltiplas, e permite a escrita de programas muito mais fáceis de serem compreendidos.

Essas estruturas de controle são a seqüência, a seleção e a repetição.

As linguagens de computador estruturadas são linguagens que usam essas estruturas de entrada/saída únicas, e não usam ou não tem a instrução goto. A linguagem Java é estruturada e não possui a instrução goto.

Programas e fluxogramas

Os programas podem ser representados por fluxogramas, diagramas que representam a ação do programa a partir de um número limitado de símbolos que representam as ações básicas que um programa pode fazer. Um fluxograma consiste num conjunto dessas estruturas ligadas umas às outras através dos símbolos de conexão. Um mesmo programa pode ser descrito, em diferentes níveis de detalhe, por diferentes fluxogramas. O uso de fluxogramas no projeto de programas de computador, da sua concepção inicial ao produto final, contribui bastante para a obtenção de programas bem-estruturados e confiáveis.

Os seguintes elementos bastam para representar os programas de computador como fluxogramas:

Elementos de um fluxograma
Utilizado para indicar o inicio e o fim de
um algoritmo.
Indica o sentido do fluxo.
Símbolo de ação - indica que uma ação deve ser executada.
Símbolo de decisão - indica que uma decisão deve ser tomada.



As três estruturas de controle de entrada/saída única de Bohm e Jacopini são as seguintes, representadas como fluxogramas:

1. A estrutura de seqüência: as ações são executadas, uma por vez, de forma encadeada, na ordem definida no programa.

2. A estrutura de seleção: a partir da verificação de uma condição, o programa realiza ou não uma ação e volta à seqüência do programa.

3. A estrutura de repetição: um bloco de ações é repetido um número de vezes conforme se deseje, e após isso o controle volta à seqüência do programa.



A exigência de que a entrada e a saída de cada estrutura seja única facilita muito a construção de fluxogramas simples e não limita as possibilidades do que a estrutura faz. Um programa estruturado é descrito por um fluxograma formado pela combinação dessas estruturas de acordo com duas regras de formação apenas, empilhamento e aninhamento.

Um programa estruturado pode ser formado pela aplicação das seguintes regras:

1) Iniciar com o fluxograma mais simples.

2) Qualquer retângulo (ação) pode ser substituído por dois retângulos em seqüência . Isso significa que uma ação complexa do fluxograma inicial pode ser quebrada em ações mais simples, até que se chegue à ação mais elementar possível.

3) Qualquer retângulo pode ser substituído por qualquer estrutura de controle. Isso significa que entre as ações representadas no retângulo inicial podem estar tomadas de decisão

4) As regras 2 e 3 podem ser aplicadas quantas vezes quiser em qualquer ordem.

Aplicar as regras sempre resulta em um fluxograma estruturado com uma aparência de blocos de construção. A regra 2 gera uma pilha de estruturas de controle, e por isso é conhecida como regra do empilhamento. A regra 3 é chamada de regra de aninhamento pois resulta em estruturas de controle devidamente aninhadas. A regra 4, por sua vez, gera estruturas maiores. A aplicação repetida dessas regras, em sucessivos níveis de detalhe, representam o trabalho de se escrever um programa de computador e seu algoritmo, da definição inicial do que deve ser feito até o código do programa.

As estruturas de controle de entrada/saída única de java

A linguagem Java é uma linguagem estruturada e não possui a instrução goto; entretanto, essa é uma palavra reservada, "por via das dúvidas", e não pode ser usada em nenhum código escrito em Java.

Java implementa as três estruturas de controle de entrada saída únicas de Bohm e Jacopini em sete diferente estruturas de controle, que são as seguintes:

SEQUÊNCIA: Implementada naturalmente na forma que o compilador interpreta o código escrito do programa.

SELEÇÃO: A linguagem Java possui 3 estruturas de seleção, todas redutíveis a estrutura de seleção única básica da programação estruturada. São elas:



Estrutura if (seleção única).
if (condição) {
bloco de instruções;
}

Se condição for verdadeira, o programa executa o bloco de instruções e continua para a próxima instrução. Exercício: escreva um programa que lê um número dado como entrada e, se esse for diferente de zero, calcula o seu inverso.



Estrutura if/else (seleção dupla).
if (condição) {
bloco de instruções 1;
}
else {
bloco de instruções 2;
}

Se condição for verdadeira, o programa executa o bloco de instruções 1, e se for falsa executa o bloco de instruções 2, após o que continua para a próxima instrução. Exercício: escreva um programa que lê um número dado como entrada e, se esse for diferente de zero, calcula o seu inverso, e se for igual zero escreva "indefinido" na saída.


Estrutura switch (seleção múltipla).
Switch (critério) {

case possibilidade1:
bloco de instruções 1;
break;

case possibilidade2:
bloco de instruções 2;
break;


case possibilidadeN:
bloco de instruções N;
break;

default:
bloco de instruções alternativo;

}


A estrutura verifica se o valor da variável critério é igual a cada uma das N possibilidades dadas por possibilidade1, possibilidade2, ... , possibilidadeN, e executa o bloco de instruções correspondente. Caso critério seja diferente de todas as possibilidades, o bloco de instruções alternativo é executado. A alternativa "default" é opcional. Após uma instrução "break" ou após executar a alternativa "default" o controle segue para a próxima instrução após a estrutura. Exercício: escreva um programa que lê um número dado como entrada e o classifica conforme o resto da divisão por 4.


REPETIÇÃO:

Java implementa a estrutura de repetição de três formas diferentes:



Estrutura while
while (condição) {
bloco de instruções;
}

O programa verifica a condição e, se for verdadeira, executa a ação do bloco de instruções, após o que torna a verificar a condição. A execução do bloco de instruções é repetida até que a condição se torne falsa. Nesse caso, o controle do programa segue para a primeira instrução após a estrutura. Exercício



Estrutura do/while
do {
bloco de instruções;
}
while (condição);


Na estrutura do/while, o programa primeiro executa a ação definida pelo bloco de instruções e testa a condição. Se for verdadeira, o bloco de instruções é repetido e a condição é novamente testada. Se for falsa, o programa segue para a primeira instrução após a estrutura. Exercício



Estrutura for
for(expressão1; expressão2; expressão3) {
bloco de instruções;
}


Essa estrutura de repetição implementa um contador que irá controlar quantas vezes a ação será repetida. A (expressão1) define o contador e seu valor inicial, e a expressão3 incrementa ou decrementa o valor do contador cada vez que o bloco de instruções é executado. O loop é encerrado quando a condição definida em expressão2 deixar de ser verdadeira. Exercício






Bibliografia

1. DEITEL, H. M e Deitel, P. J.. Java, como programar. 4a.ed. - Porto Alegre: Bookman, 2003.


2. BOHM, C. e Jacopini, G. Flow Diagrams, Turing Machines, and Languages with only Two Formation Rules. Communications of the ACM, vol. 9, no. 5, maio 1966, pp 336-371.