O repeat-until é o comando de repetição condicional com teste no final. Funciona de modo contrastante ao while-do, ou seja, repete até que uma dada expressão booleana resulte em verdadeiro. Esta expressão é avaliada após o bloco de instruções ter sido executado.
Sintaxe:
repeat <comandos>; until <expressao booleana>;
As palavras repeat e until são reservadas. Contrariamente ao comando while-do, o repeat-until pode executar vários comandos sem a delimitação de bloco por begin e end (ver seção Delimitadores de bloco).
Como em Pascal todo comando termina por ponto-e-vírgula e, neste caso, o comando repeat-until termina somente após a expressão booleana, então o ponto-e-vírgula somente aparece no final, e não no meio da construção.
Exemplo:
program exemplo_repeat_until_1; var n : integer; begin writeln('Informe um numero inteiro positivo: '); read(n); repeat writeln(n); n := n - 1; until n <= 0; writeln ('Fim.'); end.
O programa imprime de maneira decrescente todos os números entre n e 1. Contudo, aqui reside a principal diferença entre o repeat-until e o while-do: se o número lido for negativo ou nulo, o número será impresso seguido da mensagem de “Fim.”. Isto ocorre porque a avaliação da expressão somente é feita após a execução do bloco de comandos.
Dependendo da avaliação da expressão booleana, é possível definir um laço de execução infinita, tal como apresentado no exemplo a seguir. Um inteiro positivo, não nulo, lido do teclado é imprimido infinitamente. Caso um número nulo ou negativo seja lido, o programa termina após imprimir o número uma única vez e exibir a mensagem “Fim.”.
Exemplo:
program exemplo_repeat_until_2; var n : integer; begin writeln('Informe um numero inteiro positivo: '); read(n); repeat writeln(n); until n <= 0; writeln ('Fim.'); end.