Controle de Fluxo

Comandos de controle de fluxo de um programa servem para especificar a ordem em que os comandos devem ser executados. Nos capítulos anteriores foi suposta a execução linear de todos os comandos de um programa; mostraremos comandos que permitirão:


  • Executar condicionalmente um grupo de comandos;
  • Executar repetidamente um grupo de comandos conforme uma condição;
  • Executar repetidamente um grupo de comandos um certo número de vezes;
  • Abandonar um subprograma no meio da execução.

Comando SE

O comando SE executa um conjunto de comandos se o resultado de uma expressão lógica for verdadeira. O formato do comando é:


SE expressão lógica

.... comandos.....

.....

FIM


A expressão lógica pode resultar em um valor verdadeiro ou falso; se for verdadeiro, o conjunto de comandos encontrados até a palavra FIM será executado; caso contrário não. Por exemplo:


SE %BITOLA = 0

N NBIT = 2

N BITOLA = 8

FIM


A variável BITOLA foi comparada com zero. Sendo igual, os 2 comandos seguintes serão executados. Todo o comando SE termina numa palavra FIM.


A expressão lógica contém somente constantes, e por isto as variáveis envolvidas precisam sempre ser substituídas por seu valor através do sinal "%". Os tipos de expressões lógicas possíveis são:


=Igual a
<>Diferente de
>Maior que
<Menor que
>=Maior que ou igual a
<=Menor que ou igual a


O sinal != pode ser usado também no lugar de <>.


Expressões lógicas e aritméticas

O programa permite a construção de expressões lógicas bem mais complexas. Para entender como isto é possível, é preciso conhecer as regras de interpretação de expressões lógicas:


  • A expressão lógica interpretada pelo comando SE na verdade é uma expressão aritmética, que resulta em valor numérico. Este valor será considerado falso se valer zero e verdadeiro se diferente de zero.
  • Os operadores lógicos funcionam como operadores aritméticos, que atuam sobre um ou mais operandos, e resultam no valor 1 quando a condição for verdadeira ou 0 se falsa. Os operadores, assim como outros operadores aritméticos são interpretados da esquerda para a direita, a menos da precedência dos parênteses.
  • Os operadores E, OU e NAO, podem ser usados em expressões lógicas, com os seguintes resultados:

OperaçãoResultado
0 E 00
1 E 00
1 E 11
0 OU 00
1 OU 01
1 OU 11
NAO 01
NAO 10


onde 0 representa um valor falso, e 1 verdadeiro. Como exemplo, suponha que uma linha entre os pontos 1 e 2 deva ser desenhada se A e B forem não nulos ou se C e D forem nulos:


SE ((%A <> 0) E (%B <> 0)) OU -

((%C = 0) E (%D = 0))

LINHA 1 2

FIM


Os parênteses usados são estritamente necessários; se não fossem utilizados, as expressões passariam a ser interpretadas da esquerda para a direita, o que resultaria em um valor lógico incorreto.


Expressões lógicas com cadeias de caracteres

O comando SE interpreta apenas expressões aritméticas. Para comparar cadeias de caracteres, a função CMP retorna o valor (0) se duas cadeias de caracteres forem iguais ou (1) se forem diferentes. Por exemplo, colocaremos o texto armazenado em TITULO no desenho, a menos que seu valor seja 'INVALIDO':


SE CMP ('%TITULO', 'INVALIDO') <> 0

TEXTO 0,0 '%TITULO'

FIM


SENAO

O comando SE executa um conjunto de comandos a seguir se o resultado da expressão lógica for verdadeiro. A palavra SENAO colocada antes do FIM do comando SE permite que um conjunto de comandos seja executado no caso da condição ser falsa. Por exemplo:


SE %BITOLA = 0

N NBIT= 2

N BITOLA= 8

SENAO

N NBIT= 4

FIM


Resultará em NBIT=2 e BITOLA=8 se BITOLA valer zero, ou em NBIT=4 caso contrário.


Aninhamento de SEs

O comando SE permite que um conjunto de comandos seja executado condicionalmente. Neste conjunto de comandos pode haver outros comandos SE, que poderão executar outro conjunto e assim por diante. Independente da quantidade de SEs usados, cada um deles deverá terminar por um comando FIM. Por exemplo:



SE LEN ('%TITULO') > 0

SE LEN ('%TITULO') < 10

NUM HTEX 0.4

DEFINE NÍVEL 0

SENAO

NUM HTEX 0.2

DEFINE NÍVEL 1

FIM

TEXTO 100,200 HTEX %HTEX '%TITULO'

FIM


O primeiro SE executa um conjunto de comandos se o numero de caracteres da variável alfanumérica TITULO for maior que zero. Entre os comandos executados, existe um outro SE, que define o tamanho de um texto e o nível de desenho, conforme o número de caracteres de TITULO menor ou maior que 10.


Quando o DP encontra uma palavra FIM, ela se refere sempre ao último comando SE "aberto" (ou ainda, ao ENQUANTO ou REPETE, que veremos adiante). Se não houver SE aberto, então o FIM se referirá ao fim do subprograma ou desenho, que será terminado.


Note também que na medida que os SE foram sendo abertos, fomos deslocando os comandos agrupados sob o SE para a direita, de modo a deixar claro o seu agrupamento. Esta medida tem o efeito meramente estético, mas é extremamente importante para quem lê o programa, que enxerga como os comandos estão agrupados.


SENAO SE

Uma última variante do comando SE é o SENAO SE. Suponha que necessitemos analisar uma série de hipóteses mutuamente exclusivas, como no exemplo:


SE %A = 1

A TIPO = 'Tijolo de maciço'

SENAO

SE %A = 2

A TIPO = 'Tijolo cerâmico'

SENAO

SE %A = 3

A TIPO = 'Argamassa'

SENAO

SE %A = 4

A TIPO = 'Azulejo'

SENAO

A TIPO = 'INVALIDO'

FIM

FIM

FIM

FIM


O comando SENAO SE permite analisar casos deste tipo, sem aninhamento adicional dos SEs. Quando o DP encontra um SENAO SE, o nível de aninhamento não é aumentado, e somente um FIM continua necessário. Usando este comando, o exemplo acima ficaria:


SE %A = 1

A TIPO = 'Tijolo de maciço'

SENAO SE %A = 2

A TIPO = 'Tijolo cerâmico'

SENAO SE %A = 3

A TIPO = 'Argamassa'

SENAO SE %A = 4

A TIPO = 'Azulejo'

SENAO

A TIPO = 'INVALIDO'

FIM


REPETE

Este comando repete um conjunto de comandos um número determinado de vezes. A repetição é controlada por uma variável, dita de controle, que tem o seu valor incrementado ou decrementado após cada iteração. A sintaxe é:


REPETE nome [=] valor1 [A] valor2 [PASSO valor]

.... (comandos) ....

FIM


nome se refere ao nome de uma variável numérica de controle, que não deve ser macro-substituido; valor1 é o valor inicial assumido pela variável de controle e valor2 o valor final; o incremento da variável de controle após cada repetição é de menos que um valor diferente seja especificado sinal de "=" e a letra "A" entre valor1 e valor2 são opcionais, e servem apenas de comentário.


O conjunto de comandos a ser repetido deve ser terminado pela palavra FIM. Como exemplo, vamos determinar o peso médio de um conjunto de N tipos de elementos, onde:


N Número de tipos de elementos

Pi Peso de cada elemento: P1, P2, ... Pn

Qi Quantidade de cada elemento: Q1, Q2, ... Qn

MEDIA Média ponderada

NTOTN úmero total de elementos


O programa será:


N MEDIA= 0

N NTOT= 0

REPETE I= %N

N MEDIA= %MEDIA + (%P%I * %Q%I)

N NTOT= %NTOT + %Q%I

FIM

N MEDIA= %MEDIA / %NTOT


A lógica do comando REPETE é:


Atribuir o valor inicial à variável de controle;


Verificar se a variável de controle é superior ao valor limite (se o passo for negativo verifica se é inferior); se for, sair do comando;


Caso contrário, executar todos os comandos até o próximo fim;


Encontrando o FIM, somar o incremento à variável de controle e voltar para (b).


O DP permite que a variável de controle seja alterada dentro do conjunto de comandos em repetição; no entanto deve-se evitar este tipo de procedimento, que dificulta a compreensão do programa.


Entre os comandos que podem ser repetidos incluem-se outros comandos de repetição, SEs e ENQUANTOS.


ENQUANTO

Este comando repete um conjunto de comandos terminados por FIM, enquanto for válida uma condição. A sintaxe é:


ENQUANTO expressão lógica

.... (comandos) ....

FIM


Por exemplo, suponha que devamos desenhar linhas entre os nós 1 e 2 até que a abscissa X do nó 1 atinja 1000:


N DELTAX50

10,0

20,200

ENQUANTO%X1 < 1000

POL1 2

11 @ %DELTAX, 0

22 @ %DELTAX, 0

FIM


O DP verifica a validade da expressão antes de executar o conjunto de comandos; se for verdadeira, os comandos serão executados, caso contrário não. Ao encontrar o FIM correspondente, volta-se à expressão lógica e faz-se o teste novamente, e assim por diante, até que a expressão se torne falsa.


Podem fazer parte do conjunto de comandos repetidos por este comando outros ENQUANTOs, SEs e REPETEs.


QUEBRA

É conveniente, às vezes, controlarmos a saída de um REPETE ou ENQUANTO de outro modo além do teste feito no início. O comando QUEBRA permite uma saída antecipada da repetição; ele termina imediatamente o laço mais interno.


Suponha que precisemos desenhar 10 linhas com incremento de coordenadas DELTAX, DELTAY, mas a abscissa X do primeiro nó não pode ser superior a 1000:


N DELTAX150

N DELTAY100

10,0

20,200

REPETE I= 10

SEX1 > 1000

QUEBRA

FIM

POL1 2

11 @ %DELTAX, %DELTAY

21 @ %DELTAX, %DELTAY

FIM


CONTINUA

Este comando funciona de forma semelhante ao QUEBRA, iniciando imediatamente a próxima iteração do REPETE ou ENQUANTO atual. Por exemplo, no problema de cálculo da média ponderada, suponha que não desejemos que os valores de peso negativo entrem no cálculo:


N MEDIA= 0

N NTOT= 0

REPETE I= %N

SE%P%I < 0

CONTINUA

FIM

N MEDIA= %MEDIA + (%P%I * %Q%I)

N NTOT= %NTOT + %Q%I

FIM

N MEDIA= %MEDIA / %NTOT


SAÍDA

Em algumas situações é preciso abandonar o processamento de um subprograma antes do seu fim. O comando SAÍDA termina imediatamente a execução. Por exemplo, se um subprograma não puder ser executado se a variável COMPR valer zero:


SE %COMPR = 0

SAIDA

FIM


Aninhamento de SE, REPETE, ENQUANTO

Os comandos acima controlam a execução de um conjunto de comandos. Neste conjunto pode haver outros comandos SE, REPETE e ENQUANTO, que controlarão outros conjuntos e assim por diante. As seguintes regras são válidas:


O comando FIM se aplica ao último SE, REPETE ou ENQUANTO executado;


Os comandos QUEBRA e CONTINUA se aplicam ao último REPETE ou ENQUANTO executado.