Ŀ
V - Comandos para controle do fluxo do programa


V.1 - If Then Else
      ------------

    O  comando   If  permite ao programa tomar decises. Ele pode ter  duas
    sintaxes:

    Primeira sintaxe:

    If <expresso_lgica> Then Comando;

    Expresso_lgica  pode   ser  simples   ou at relaes complexas. Se a
    expresso_lgica   resultar  verdadeira (TRUE),   ento  o comando ser
    executado caso contrrio no. Para os casos em que tivermos mais  de um
    comando   para  serem  executados,  eles  devero vir delimitados pelas
    palavras Begin e End.

    If <expresso_lgica> Then
    Begin
      Comando_1;
      Comando_2;
      Comando_3;
      . . .
    End;

    No   caso  acima,  se  expresso_lgica  for  TRUE ento todos  comandos
    inclusos entre as palavras Begin e End sero executados, caso  contrrio
    no.

    Segunda sintaxe:

    If <expresso_lgica> Then Comando_1
                          Else Comando_2;

    Neste caso, se expresso_lgica for TRUE ento comando_1 ser executado
    e  comando_2  no, caso contrrio, comando_2 ser executado e comando_1
    no. Repare que no temos ; no final de comando_1.

    Podemos tambm escrever:

    If <expresso> Then Begin
                           Comando_1;
                           Comando_2;
                           . . .
                        End          (* no tem ; *)
                   Else Begin
                           Comando_3;
                           Comando_4;
                           . . .
                        End;

    Exemplos:

    ---------------------------------------------------------
    Program Exemplo_1;
    Uses CRT;
    Var i : Integer;

    Begin
       Clrscr;
       Write('Digite um inteiro maior que 100 --> ');
       Readln(i);
       Writeln;
       Writeln;
       If (i>100)
          Then Writeln('Voce conseguiu')
          Else Writeln(i,' nao e maior que 100');
    End.
    ---------------------------------------------------------
    Program Exemplo_2;

    (********************************************************
     Programa para determinar o maior numero entre dois lidos
     do teclado
    ********************************************************)
    Uses CRT;

    Var Numero_1,Numero_2 : Integer;

    Begin
       ClrScr;
       Write('Primeiro numero ----> ');
       Readln(Numero_1);
       Write('Segundo numero -----> ');
       Readln(Numero_2);
       Writeln;
       Writeln;
       If (Numero_1 > Numero_2)
          Then Write(Numero_1,' e o maior')
          Else If (Numero_2 > Numero_1)
                  Then Writeln(Numero_2,' e o maior')
                  Else Writeln('sao iguais');
    End.
    ---------------------------------------------------------
    Program Exemplo_3;

    (********************************************************
     Programa para colocar em ordem crescente 3 numeros lidos
     do teclado
    ********************************************************)

    Uses CRT;

    Var x,y,z : Integer;

    Begin
       ClrScr;
       Write('Primeiro numero --> ');
       Readln(x);
       Write('Segundo numero ---> ');
       Readln(y);
       Write('Terceiro numero --> ');
       Readln(z);
       Writeln;
       Writeln;

       If (x>=y)
          Then If (x>=z)
                  Then If (y>=z)
                          Then Writeln(x,' ',y,' ',z)
                          Else Writeln(x,' ',z,' ',y)
                  Else Writeln(z,' ',x,' ',y)
          Else If (y>=z)
                  Then If (x>=z)
                          Then Writeln(y,' ',x,' ',z)
                          Else Writeln(y,' ',z,' ',x)
                  Else Writeln(z,' ',y,' ',x);
    End.
    ---------------------------------------------------------


V.2 - Labels e Goto
      -------------

    A  instruo  Goto  permite desviar a sequncia de execuo do programa
    para  um  determinado Label pr-definido. Para utilizarmos algum Label,
    ele deve, obrigatoriamente, ser declarado na subrea Label.

    Exemplos:

    ---------------------------------------------------------
    Program Exemplo_1;

    (********************************************************
     Programa para colocar em ordem crescente 3 numeros lidos
     do teclado
     ********************************************************)

    Uses CRT;

    Label Inicio;

    Var x,y,z : Integer;
        tecla : Char;
    Begin
       Inicio:
       ClrScr;
       Write('Primeiro numero --> ');
       Readln(x);
       Write('Segundo numero ---> ');
       Readln(y);
       Write('Terceiro numero --> ');
       Readln(z);
       Writeln;
       Writeln;

       If (x>=y)
          Then If (x>=z)
                  Then If (y>=z)
                          Then Writeln(x,' ',y,' ',z)
                          Else Writeln(x,' ',z,' ',y)
                  Else Writeln(z,' ',x,' ',y)
          Else If (y>=z)
                  Then If (x>=z)
                          Then Writeln(y,' ',x,' ',z)
                          Else Writeln(y,' ',z,' ',x)
                  Else Writeln(z,' ',y,' ',x);
       Writeln;
       Write('Deseja Continuar --> ');
       Tecla:=Readkey;

       If ((Tecla = 'S') OR (Tecla = 's')) Then Goto Inicio;

    End.
    ---------------------------------------------------------
    Program Exemplo_2;

    (********************************************************
     Programa para determinar se 3 valores lidos do teclados
     so lados de um tringulo

                          Observaes:

           Supondo que x,y,z, sejam os valores lidos, ento:

     1-) Se x<y+z e y<x+z e z<x+y ento x,y,z so lados de um
         tringulo e se:

     2-) x=y=z ento  um tringulo Equiltero

     3-) x=y ou x=z ou y=z ento  um tringulo Isceles

     4-) x<>y<>z ento  escaleno

    ********************************************************)

    Label INICIO;

    Uses CRT;

    Var x,y,z : Real;
        Tecla : Char;

    Begin
    INICIO:
       ClrScr;
       Write('X = ');
       Readln(x);
       Write('Y = ');
       Readln(y);
       Write('Z = ');
       Readln(z);
       Writeln;Writeln;
       If (x<y+z) and (y<x+z) and (z<x+y)
          Then If (x=y) and (x=z)
                  Then Writeln('TRIANGULO EQUILATERO')
                  Else If (x=y) Or (x=z) Or (y=z)
                          Then Writeln('TRIANGULO ISOCELES')
                          Else Writeln('TRIANGULO ESCALENO')
          Else Writeln('X,Y,Z NAO SAO LADOS DE UM TRIANGULO');
       Writeln;Writeln;
       Write('Deseja Continuar ? --> ');
       Tecla:=ReadKey;
       If (Tecla='s') Or (Tecla='S')
          Then Goto INICIO;
    End.
    ---------------------------------------------------------


V.3 - For
      ---

    Este  comando   permite  que   um grupo de operaees ou comandos sejam
    repetidos um certo nmero de vezes. Sintaxe geral:

    For <varivel> := <valor inicial> to/downto <valor final> do <comando>;

    A varivel dever ser, obrigatoriamente, do tipo integer (qualquer um),
    char  ou  Boolean.  A variao  de varivel entre valor inicial e valor
    final  ser  crescente e de um em um, quando utilizamos a palavra to, e
    decrescente de um em um, quando utilizamos a palavra downto.

    Exemplos:

    ---------------------------------------------------------
    Program Exemplo_1;

    Uses CRT;

    Var i : Integer;

    Begin
       ClrScr;
       For i:=10 to 15 do Writeln(i); (* para i igual a 10 at 15 faa
                                         escreva i *)
    End.
    ---------------------------------------------------------
    Program Exemplo_2;
    Uses CRT;

    Var i : Integer;

    Begin
       ClrScr;
       For i:=10 downto 1 do Writeln(i);
    End.
    ---------------------------------------------------------
    Program Exemplo_3;
    Uses CRT;

    { Este programa escreve na tela os quadrados dos numeros
      de 1 at 20 }

    Var i : Integer;

    Begin
       ClrScr;
       For i:=1 to 20 do
           Begin
              Write('Valor de i --> ');
              Write(i:3);
              Write('..... quadrado de i = ');
              Writeln(i*i:5);
           End;
    End.
    ---------------------------------------------------------
    Program Exemplo_4;
    Uses CRT;

    { Este programa calcula a soma entre todos os nmeros
      compreendidos entre dois nmeros lidos do teclado }

    Label INICIO;

    Var i,Numero_1,Numero_2,soma : Integer;
        Tecla                    : Char;

    Begin
    INICIO:
       ClrScr;
       Write('Primeiro Numero --> ');
       Readln(Numero_1);
       Write('Segundo Numero ---> ');
       Readln(Numero_2);
       Writeln;
       Writeln;
       Soma:=0;
       For i:=Numero_1 to Numero_2 do Soma:=Soma+i;
       Writeln('Soma entre ',Numero_1,' e ',Numero_2,' = ',soma);
       Writeln;
       Writeln;
       Write('Deseja Continuar ? --> ');
       tecla:=ReadKey;
       If ((Tecla = 'S') OR (Tecla='s')) Then Goto INICIO;
       ClrScr;
       Write('Tchau .........');
    End.
    ---------------------------------------------------------
    Program Exemplo_5;
    Uses CRT;

    (********************************************************
     Programa para clculo de fatorial de um nmero lido do
     teclado. Lembrando que fatorial de um nmero  definido
     como segue:
            N! = 1.2.3.4...N
         e  0! = 1
    ********************************************************)

    Label Inicio,fim;

    Var n,Fatorial,i : Integer;

    Begin
       Clrscr;
    Inicio:
       Write('N = ( menor que 0 = fim) --> ');
       Readln(n);
       If n<0 then goto Fim;
       Fatorial:=1;
       Writeln;

       If (n>0)
          Then For i:=1 to n do
                       Fatorial:=Fatorial*i;
       Writeln('Fatorial de ':30,n,' = ',fatorial);
       Writeln;
       Goto Inicio;
       Fim:
    End.
    ---------------------------------------------------------


V.4 - Repeat Until
      ------------

    Repete   um   bloco  de   instrues   at  que uma certa condio seja
    satisfeita. Sua sintaxe :

    Repeat
        Comando_1;
        Comando_2;
        Comando_3;
        . . .
    Until (expresso_lgica);

    Neste  caso,  todos  os comandos entre as palavras reservadas Repeat  e
    Until  sero   executadas,  at  que a expresso lgica seja verdadeira
    (TRUE), obviamente, devemos ter o cuidado para que ela venha a ser TRUE
    em determinado momento, pois caso contrrio, teremos um LOOP  INFINITO,
    (o programa fica preso dentro da estrutura Repeat - Until).

    Exemplos:
    ---------------------------------------------------------
    Program Exemplo_1;
    Uses CRT;

    (*******************************************************)
     Programa exemplo para mostrar o funcionamento da estru-
     tura Repeat Until
    ********************************************************)

    Var i : Integer;

    Begin
       ClrScr;
       i:=1;
       Repeat
          Writeln(i);
          i:=i+1;
       Until i=10;
    End.
    ---------------------------------------------------------
    Program Exemplo_2;
    Uses CRT;

    (********************************************************
     Programa que soma os nmeros pares compreendidos entre
     dois nmeros lidos do teclado
    ********************************************************)

    Var par,numero_1,numero_2,soma:Integer;

    Begin
       Clrscr;
       Soma:=0;
       Write('Primeiro Numero ---> ');
       Readln(numero_1);
       Write('Segundo Numero ----> ');
       Readln(numero_2);
       par:=numero_1;

       If par MOD 2 <> 0 then par:=par+1; (* Verifica se o primeiro n
                                             mero  par, se no  for
                                             adiciona-se um *)
       Repeat
          Soma:=soma+par;
          par:=par+2;
       Until par>numero_2;
       Writeln;writeln;
       Write('Soma dos numeros pares entre ');
       Writeln(numero_1,' e ',numero_2,' = ',soma);
    end.
    ---------------------------------------------------------
    Program Exemplo_3;
    Uses CRT;

    (********************************************************
     Programa para clculo de fatorial.
    ********************************************************)

    Label inicio,fim;

    Var n,i,fatorial:integer;

    Begin
       ClrScr;
    inicio:
       Write('N = (menor que 0 = fim) --> ');
       Readln(n);
       If n<0 then goto fim;
       Writeln;
       fatorial:=1;
       i:=1;
       if n>1
          then Repeat
                  i:=i+1;
                  fatorial:=fatorial*i;
               Until i=n;
        Writeln('fatorial de ':30,n,' = ',fatorial);
        Writeln;
        goto inicio;
    fim:
    End.
    ---------------------------------------------------------


V.5 - While Do
      --------

    A   estrutura While..Do   permite  controlar o nmero de vezes que  uma
    instruo   ou  bloco  de  instrues   ser executado.  Ela  difere da
    instruo  Repeat..Until  porque  esta  s avalia a expresso lgica no
    final   do  primeiro  Loop, enquanto que a instruo While..Do avalia a
    expresso  lgica   antes  da   primeira interao, isto significa que,
    eventualmente, pode no ocorrer sequer a primeira interao.

    A sintaxe de While..Do :

    While <expresso_lgica> Do <comando>;

    ou

    While <expresso_lgica> Do
    Begin
      comando_1;
      comando_2;
      . . .
    End;

    Exemplos:

    ---------------------------------------------------------
    Program Exemplo_1;
    Uses CRT;

    (********************************************************
      Programa exemplo que escreve na tela de 0 at 10
    ********************************************************)

    Var i : Integer;

    Begin
       ClrScr;
       i:=0;
       While (i<11) Do
          Begin
             Writeln(i);
             i:=i+1;
          End
    End.
    ---------------------------------------------------------
    Program Exemplo_2;
    Uses CRT;

    (********************************************************
     Programa que le nmeros do teclado e depois informa
     a mdia dos nmeros lidos, a quantidade lida, e soma
     deles
    ********************************************************)

    Label INICIO;

    Const Quant_de_num : Integer = 0;
          Soma         : Real    = 0;
          Media        : Real    = 0;

    Var   Numero       : Real;
          Tecla        : Char;

    Begin
    INICIO:
       ClrScr;
       Write('Valor numerico (menor que 0=fim) --> ');
       Readln(Numero);
       While (Numero>=0) Do
          Begin
             Soma := Soma + Numero;
             Quant_de_num := Quant_de_num + 1;
             Write('Valor numerico (menor que 0=fim) --> ');
             Readln(Numero);
          End;

       If Quant_de_num > 0
          Then Begin
                 Media := Soma/Quant_de_num;
                 Writeln;
                 Writeln('Quantidade de numeros = ',Quant_de_num);
                 Writeln('Soma ................ = ',Soma:10:2);
                 Writeln('Media ............... = ',Media:10:2);
              End
           Else Writeln('Nao se realizou calculos');
        Writeln;
        Write('Deseja continuar ? ---> ');
        tecla:=ReadKey;
        If (Tecla='s') Or (Tecla='S') Then Begin
                                             Quant_de_num:=0;
                                             Soma := 0;
                                             Goto Inicio;
                                           End;
    End.
    ---------------------------------------------------------


V.6 - Case
      ----

    Esta  instruo  nos  permite selecionar uma opo baseada no valor  de
    uma varivel ou expresso. Existem duas sintaxes, a saber:

     Sintaxe nmero 1:

    Case <expresso ou varivel> of

        <valor 1> : Comando_1;
        <valor 2> : Comando_2;
        . . .
        <valor n> : Comando_n;

    End;

    ou

    Case <expresso ou varivel> of

        <valor 1> : Begin
                      comando_1;
                      comando_2;
                      . . .
                    End;
        <valor 2> : Begin
                      comando_1;
                      comando_2;
                      . . .
                    End;
        . . .
        <valor n> : Begin
                      comando_1;
                      comando_2;
                      . . .
                    End;
    End;

    A   expresso  ou   varivel  no comando Case deve ser do tipo simples,
    normalmente Char ou Integer. Aps a avaliao da expresso,   seu valor
    ou o valor da varivel  comparado com os diversos valores  discrimina-
    dos.   Se   houver   algum  que  satisfaa,  o comando subsequente ser
    executado.

    Sintaxe nmero 2:

    Case <expresso ou varivel> of

        <valor 1> : Comando_1;
        <valor 2> : Comando_2;
        . . .
        <valor n> : Comando_n;

    Else Comando;
    End;

    Neste   caso,  se  o  resultado da expresso ou o valor da varivel no
    satisfizer nenhum dos valores discriminados,ento o comando que estiver
    na frente da clusula Else ser executado.

    Exemplos:
    ---------------------------------------------------------
    Program Exemplo_1;
    Uses CRT;

    (********************************************************
     Programa exemplo da instruo Case. Calcula  a soma, ou
     a subtrao, ou a multiplicao, ou a diviso entre dois
     nmeros lidos do teclado
    ********************************************************)

    Var  oper : Char;
         x,y  : Real;

    Begin
       ClrScr;
       Write('Valor de X = ');
       Readln(x);
       Write('Valor de Y = ');
       Readln(y);
       Writeln;
       Write('Operacao --> ');
       oper:=ReadKey;
       Writeln(oper);Writeln;

       Case Oper of
            '+' : Write('X + Y = ':10,x+y:6:2);
            '-' : Write('X - Y = ':10,x-y:6:2);
            '*' : Write('X * Y = ':10,x*y:6:2);
            '/' : Write('X / Y = ':10,x/y:6:2);
            Else  Writeln(oper,'  nao e operacao');
       End; (* case *)
    End. (* programa *)
    ---------------------------------------------------------
    Program Exemplo_2;
    Uses CRT;

    (********************************************************
     Programa para clculo de rea de figuras
    ********************************************************)

    Var escolha,continua : Char;
        x,y : real;

    Begin
       Repeat
          ClrScr;
          Write('Calculo de area de figuras':53);
          Gotoxy(25, 5);Write('1 - Sair do programa');
          Gotoxy(25, 7);Write('2 - Triangulo');
          Gotoxy(25, 9);Write('3 - Quadrado');
          Gotoxy(25,11);Write('4 - Retangulo');
          Gotoxy(25,13);Write('5 - Circulo');
          TextBackGround(7);
          TextColor(0+16);
          Gotoxy(10,17);Write('Sua escolha ---> ');
          escolha:=ReadKey;
          Textbackground(0);
          Textcolor(14);

          Case escolha of

             '2' : Begin
                      ClrScr;
                      Writeln('Calculo da area de triangulos':55);
                      continua:='s';
                      While Continua='s' Do
                      Begin
                         Writeln;
                         Write('Base   = ');
                         Readln(x);
                         Write('Altura = ');
                         Readln(y);
                         Writeln;
                         Writeln('Area = ',x*y/2:8:2);
                         Writeln;
                         Writeln;
                         Write('Mais calculos (s/n) --> ');
                         continua:=ReadKey;
                         Writeln;Writeln;
                      End;
                   End;

             '3' : Begin
                      ClrScr;
                      Writeln('Calculo da area de quadrados':55);
                      continua:='s';
                      While Continua='s' Do
                      Begin
                         Writeln;
                         Write('lado = ');
                         Readln(x);
                         Writeln;
                         Writeln('Area = ',x*x:8:2);
                         Writeln;
                         Writeln;
                         Write('Mais calculos (s/n) --> ');
                         continua:=Readkey;
                         Writeln;Writeln;
                      End;
                   End;

             '4' : Begin
                      ClrScr;
                      Writeln('Calculo da area de retangulos':55);
                      continua:='s';
                      While Continua='s' Do
                      Begin
                         Writeln;
                         Write('comprimento = ');
                         Readln(x);
                         Write('largura     = ');
                         Readln(y);
                         Writeln;
                         Writeln('Area = ',x*y:8:2);
                         Writeln;
                         Writeln;
                         Write('Mais calculos (s/n) --> ');
                         continua:=readkey;
                         Writeln;Writeln;
                      End;
                   End;

             '5' : Begin
                      ClrScr;
                      Writeln('Calculo da area de circulos':55);
                      continua:='s';
                      While Continua='s' Do
                      Begin
                         Writeln;
                         Write('raio = ');
                         Readln(x);
                         Writeln;
                         Writeln('Area = ',PI*x*x:8:2);
                         Writeln;
                         Writeln;
                         Write('Mais calculos (s/n) --> ');
                         continua:=readkey;
                         Writeln;Writeln;
                      End;
                   End;
          End;
       Until escolha='1';
    End.
    ---------------------------------------------------------
