MC102 |
O COMANDO REPEAT |
Como vimos, o WHILE testa a condição ANTES de executar o laço. Mas, e se quiséssemos testar DEPOIS da execução? Ou seja, se quiséssemos fazer algo pelo menos uma vez e então testar?
REPEAT comando1; comando2; ... comandon UNTIL condição; |
O que esse comando diz? Repita os comandos a seguir até que a condição seja verdadeira. Ou seja, primeiro ele executa os comandos comando1, comando2, ..., comandon para depois testar a condição. Se a condição for falsa, ele executa o laço novamente e testa de novo, e assim por diante. Se a condição for verdadeira, ele sai do laço e segui o programa.
Veja bem a diferença entre REPEAT e WHILE:
Outra coisa, notou a ausência de BEGIN e END? No REPEAT não recisa. Não é errado por, mas não precisa. Assim, as duas formas a seguir são redundantes:
REPEAT REPEAT comando1; BEGIN comando2; comando1; ... comando2; comandon ... UNTIL condição; comandon END UNTIL condição |
Note também que não preciso por ";" antes do UNTIL. Ou seja:
PROGRAM media; VAR soma, nota : real; cont : integer; BEGIN soma := 0; cont := 0; nota := 0; write('nota: '); readln(nota) WHILE nota <> -1 DO BEGIN soma := soma + nota; cont := cont + 1; write('nota: '); readln(nota) END; IF cont>0 THEN writeln('A média é ',soma/cont) END. |
Como escreveríamos isso com REPEAT?
PROGRAM media; VAR soma, nota : real; cont : integer; BEGIN soma := 0; cont := -1; nota := 0; REPEAT soma := soma + nota; cont := cont + 1; write('nota: '); readln(nota) UNTIL nota = -1; IF cont>0 THEN writeln('A média é ',soma/cont) END. |
Então, em suma:
REPEAT com WHILE: WHILE com REPEAT: f := true; REPEAT WHILE f DO BEGIN IF condição THEN BEGIN comando1; comando1; comando2; comando2; ... ... comandon; comandon f := NOT condição END END; UNTIL NOT condição; |
Quando você usa um ou outro na prática? Vai do gosto do freguês.