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.