Construindo loops WHILE e UNTIL em COBOL
A semântica do COBOL pode confundir o programador que está começando a trabalhar com essa linguagem e tem experiência prévia em liguagenns como C, Java, PHP, .NET etc.
Isso acontece porque, em COBOL, tanto o loop do tipo while quanto o loop do tipo until são construídos com o mesmo comando PERFORM UNTIL, com algumas variaçoes.
Loop WHILE
Nesse tipo de loop, um bloco de comandos ou um procedimento (um parágrafo, por exemplo) é executado enquanto uma ou mais condições são satisfeitas e a verificação dessas condições acontece antes da primeira execução do bloco ou procedimento.
No COBOL, o comando PERFORM UNTIL, por default, também valida as condições antes da execução do bloco de comandos ou procedimento. Mas ele executa até que uma ou mais condições sejam satisfeitas (e não enquanto).
Logo, para implementar um loop while em COBOL precisamos inverter os operadores lógicos das condições.
Fica mais claro com um exemplo. Imagine que precisemos implementar o seguinte loop:
comando 0
while A < B
comando 1
comando 2
comando 3
end-while
comando 4
Queremos executar os comandos 1, 2 e 3 enquanto A for menor que B; quando A for maior ou igual a B, o loop é encerrado e o fluxo de execução segue para o comando 4.
Se por acaso, depois de executar o comando 0, o valor de A for maior ou igual a B, os comandos 1, 2 e 3 não serão executados e o fluxo seguirá para o comando 4. Isso acontece porque a condição é validada antes da execução do bloco.
Em COBOL, isso seria escrito da seguinte forma:
comando 0
perform until A >= B
comando 1
comando 2
comando 3
end-perform
comando 4
Ou seja, “execute os comandos 1, 2 e 3 até que A seja maior ou igual a B. Quando isso acontecer o loop é encerrado e o fluxo segue para o comando 4. Repare que tivemos que inverter o operador lógico, porque estamos trabalhando “até que” e não “enquanto.
Loop UNTIL
Já num loop verdadeiramente until, um determinado bloco de comandos é executado até que uma ou mais condições sejam atendidas, mas o teste dessas condições acontece no final do bloco.
No exemplo abaixo, o programa executaria os comandos 0, 1, 2 e 3 e depois verificaria se A é maior ou igual a B. Caso isso seja falso, o programa executa de novo os comandos 1, 2 e 3 até que a condição seja satisfeita.
comando 0
do
comando 1
comando 2
comando 3
until A >= B
Em COBOL, continuaríamos usando o comando PERFORM UNTIL, mas agora com a opção WITH TEST AFTER para garantir que os comandos 1, 2 e 3 serão executados ao menos uma vez, e que a condição vai ser testada ao final desse bloco de comandos:
PERFORM UNTIL A >= B WITH TEST AFTER
COMPUTE C = B ** 2
ADD 1 TO A
END-PERFORM