MC102
Algoritmos e Programação de Computadores
Parte XII



Norton Trevisan Roman




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:

Ou seja, enquanto que o WHILE pára se a condição for falsa, o REPEAT continua se ela for falsa, ou seja, pára se ela for verdadeira.

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:

Vejamos uma aplicação: lembra do nosso programa anterior com WHILE para achar a média?
  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:

Meio nebulosa a diferença não? Não é para menos, REPEAT e WHILE são completamente equivalentes, ou seja, você pode escrever um em função do outro. Por exemplo, abaixo vemos, à esquerda, um REPEAT escrito com WHILE (ou seja, o código escrito com WHILE age como se fosse um REPEAT), e à direita temos um WHILE escrito com REPEAT (ou seja, o código escrito com REPEAT age como se fosse um WHILE):
  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.





‹— Parte XIPágina da disciplinaParte XIII —›