
Captulo 12 - laos de repetio

  Em programao estruturada, os laos de repetio so muito importantes.
Praticamente, controlam toda a estrutura. Podemos ter diversas formas de 
laos de repetio, como veremos a seguir: 
FOR
  Este comando permiti-nos que executemos um BLOCO por um certo nmero de 
vezes predeterminado. Sua sintaxe : 
  FOR <x> := < valor inicial > TO <valor final> DO <BLOCO>; 
ou
  FOR <x> := <valor inicial> DOWNTO <valor final> DO <BLOCO>;
  A varivel de controle  incrementada automaticamente at que atinja um 
valor maior que o final. Se estivermos usando o TO, no caso de usarmos 
o DOWNTO, a varivel de controle ser decrementada at que seu valor seja
menor que o final.
  Vamos ver agora, um exemplo, utilizando o comando FOR em suas duas sintaxes:
PROGRAM texte_for;
USES CRT;
VAR
  i : BYTE;
  ch : CHAR;
BEGIN  
  CLRSCR;
  FOR i :=  1 TO 80 DO
    BEGIN
      GOTOXY (i,1);
      WRITE (*);
      GOTOXY (i,24);
      WRITE (*);
    END;
  FOR i := 23 DOWNTO 2 DO
    BEGIN
      GOTOXY (1,i);
      WRITE (*);
      GOTOXY (80,i);
      WRITE (*);
    END;
  GOTOXY (12,25);
  WRITE (pressione alguma tecla para finalizar);
  ch := READKEY;
END.
  
REPEAT
  Este comando permite-nos que executemos um BLOCO de comandos at que uma
determinada condio seja satisfeita. Sua sintaxe :
REPEAT
  <bloco>;
UNTIL <condio>;
  O bloco de comando ser executado pelo menos uma vez, e ser repetido 
at que a condio associada seja verdadeira. Vejamos um exemplo deste comando:
PROGRAM texte_repeat;
USES CRT;
VAR
  x1, y1,
  x2, y2, i : BYTE;
  ch : CHAR;
  fim : BOOLEAN;
BEGIN
  REPEAT
    CLRSCR;
    GOTOXY (10,10);
    WRITE (entre com a primeira coluna :);
    READLN (x1);
    GOTOXY (10,12);
    WRITE (entre com a primeira linha : );
    READLN (y1);
    GOTOXY (10,14);
    WRITE (entre com a segunda coluna : );
    READLN (x2);
    GOTOXY (10,16);
    WRITE (entre com a segunda linha : );
    READLN (y2);
    CLRSCR;
    FOR i := x1 TO x2 DO
      BEGIN
        GOTOXY (i,y1);
        WRITE (*);
        GOTOXY (i,y2);
        WRITE (*);
      END;
    FOR i := y2-1 DOWNTO y1+1 DO
      BEGIN
        GOTOXY (x1,i);
        WRITE (*);
        GOTOXY (x2,i);
        WRITE (*);
      END;
    GOTOXY (1,25);
    WRITE (pressione "S" para nova moldur);
    ch := UPCASE (READKEY);
  UNTIL ch <> S;
END.
  Neste exemplo, se digitarmos valores fora do espao delimitado da tela,
seria muito difcil fazermos a consistncia destes campos sem o uso do co-
mando REPEAT. Usando o exemplo anterior, faremos consistncias em todas 
as entradas de dados, usando o comando REPEAT:
PROGRAM texte_repeat;
USES CRT;
VAR
  x1, y1,
  x2, y2, i : BYTE;
  ch : CHAR;
  fim : BOOLEAN;
BEGIN
  REPEAT
    CLRSCR;
    REPEAT
      GOTOXY (10,10);
      WRITE (entre com a primeira coluna : );
      READLN (x1);
    UNTIL (x1 > 0) AND (x1 < 80);
    REPEAT
      GOTOXY (10,1 WRITE (*); 2);
      WRITE (entre com a primeira linha : );
      READLN (y1);
    UNTIL (y1 > 0) AND (y1 < 24);
    REPEAT 
      GOTOXY (10,14);
      WRITE (entre com a segunda coluna : );
      READLN (x2);
    UNTIL (x2 > x1) AND (x2 < 81);  
    REPEAT 
      GOTOXY (10,16);
      WRITE (entre com a segunda linha : );
      READLN (y2);
    UNTIL (y2 > y1) AND (y2 < 25);
    CLRSCR;
    FOR i := x1 TO x2 DO
      BEGIN
        GOTOXY (i,y1);
        WRITE (*);
        GOTOXY (i,y2);
        WRITE (*);
      END;
    FOR i := y2-1 DOWNTO y1+1 DO
      BEGIN
        GOTOXY (x1,i);
        WRITE (*);
        GOTOXY (x2,i);
        WRITE (*);
      END;
    GOTOXY (1,25);
    WRITE (deseja nova moldura S/N );
    REPEAT 
    ch := UPCASE (READKEY);
    UNTIL ch IN [S,N];
                     {IN operador de conjunto}
    UNTIL ch <> S;
END.
  Para o nvel de nossos conhecimentos at este momento, estas so as con-
sistncias possveis, porm podemos melhor-las em muito, entretanto isto
fica para mais adiante.

WHILE 
  Esta  uma ltima estrutura de repetio que estudaremos. Neste comando, o
BLOCO de comandos s  executado enquanto a condio for verdadeira.
  Sua sintaxe :
WHILE <condio> DO <bloco>;
  O bloco de comandos s ser executado se a condio for verdadeira. Caso,
ao encontrar este comando a condio seja falsa, o bloco de comandos no
ser executado nenhuma vez. Veja o exemplo: 
PROGRAM texte_while;
USES CRT;
VAR
  fim : BOOLEAN;
  ch : CHAR;
  i : BYTE;
BEGIN
  fim := FALSE;
  CLRSCR;
  WHILE NOT fim DO 
    BEGIN
      i := 1;
      WRITELN;
      WHILE i < 81 DO
      WRITE (-);
    WRITE (deseja uma nova linha? S/N? );
    REPEAT
      ch := UPCASE (READKEY);
    UNTIL ch IN [S,N];
     fim := ch = N;
    END;
END.
