




                                CAPTULO 3                              
            
                            ESTRUTURAS DE DECISO                  
            
                 Para resolver problemas complexos, um programa deve ser
            capaz  de   tomar  decises  e  escolher  uma  entre  vrias
            possibilidades. Nestes casos, so necessrias avaliaes bem
            sucedidas de  condies lgicas.  O Pascal  dispe  de  duas
            estruturas que  podem determinar uma direo especfica para
            um programa: o comando IF-THEN-ELSE e o comando CASE.
            
            
            3.1. COMANDOS COMPOSTOS        
            
                 Chamaremos de  comando composto a toda seqncia finita
            de instrues  separadas entre  si por  um ponto-e-vrgula e
            delimitadas pelas palavras chave BEGIN e END.
            
            Exemplo: A  seqncia de  comandos a  seguir    um  comando
            composto:
                                BEGIN
                                  ClrScr;
                                  Write('Valor de x? ');
                                  Readln(x)
                                END
            
                 Todo  ponto-e-vrgula   escrito  antes   de  um  END  
            opcional.   por isso  que  omitimos  o  ponto-e-vrgula  do
            Readln(x)  acima.  Tambm    comum  se  acrescentar  alguns
            espaoes em  branco nas linhas de comandos entre o BEGIN e o
            END (esse acrscimo de espaos em branco costuma ser chamado
            "endentao" ou "indentao").
                 Onde  a   sintaxe  do  Pascal  permitir  uma  instruo
            simples, tambm permitir um comando composto.
            
            3.2. A ESTRUTURA DE DECISO IF 
            
                 A estrutura  de deciso  IF seleciona  para execuo um
            entre dois  comandos, ou  decide se  um determinado  comando
            ser executado ou no.
                 A estrutura consiste das clusulas obrigatrias IF (se)
            e THEN (ento) seguidas, opcionalmente, de uma clusula ELSE
            (seno). Sua sintaxe :
            
                 IF condio THEN comando1 ELSE comando2;
            ou
                 IF condio THEN comando1;
            
            onde "condio"   uma expresso booleana. Se a condio for
            verdadeira,  isto  ,  for  avaliada  em  TRUE,  ento  ser
            executado o  comando1; se a condio for falsa (FALSE), ser
            executado o  comando2. Na  sua segunda forma (sem o ELSE), o
            IF no executar nenhuma ao se a condio for falsa.
            

                                        - 27 -





                         IF                                IF
                         |                                 |
                         /\                                /\
                  TRUE  /  \ FALSE                  TRUE  /  \ FALSE
                 +-----<cond>-----+                +-----<cond>-----+
                 |      \  /      |                |      \  /      |
                 |       \/       |                |       \/       |
                 v                v                v                |
             +----------+   +----------+      +----------+          |
             | comando1 |   | comando2 |      | comando1 |          |
             +----------+   +----------+      +----------+          |
                 |                |                |                |
                 +--->---+---<----+                +-------<--------+
                         |                         |
            
                 O  comando1   ou  comando2  acima  podem  ser  comandos
            compostos ou outras estruturas de deciso.
            
            Exemplo: Consideremos a seguinte estrutura de deciso:
            
                 IF  (x > 0)  THEN  WRITE(Sqrt(x))  ELSE  x := 1;
            
                 Neste caso,  se x for um valor numrico positivo, ento
            ser  mostrado  o  valor  da  sua  raiz  quadrada.  Em  caso
            contrrio, ser  atribudo  a  x  o  valor  constante  1.  A
            condio neste caso  a expresso lgica x > 0, o comando1 
            o WRITE(Sqrt(x))  e o  comando2   a atribuio  x :=  1.  A
            condio lgica  deste exemplo  no precisaria  estar  entre
            parnteses.
                  comum se escrever o IF na forma
            
                                IF condio THEN
                                  comando1
                                ELSE
                                  comando2;
            
            Assim, o atual exemplo tambm pode ser escrito na forma
            
                                IF x > 0 THEN
                                  WRITE(Sqrt(x))
                                ELSE
                                  x := 1;
            
            OBSERVAO IMPORTANTE:  No deve haver ponto-e-vrgula antes   
            do ELSE.  Se houvesse, o ponto-e-vrgula seria considerado o
            final do  IF e,  neste caso,   o  ELSE seria  considerado  o
            comando seguinte ao IF e seria rejeitado.
            
            Exemplo: Suponhamos  que x  seja uma  varivel  real  de  um
            programa e consideremos o seguinte IF:
                           IF (x > -1) AND (x < 1) THEN
                             Writeln('X tem modulo menor do que 1')
                           ELSE
                             Writeln('X tem modulo >= 1');

                                        - 28 -





            
                 Se x  em determinado momento valer 2, ento a expresso
            booleana (x  > -1)  AND (x  < 1)  ser falsa  e, assim, ser
            mostrada na tela a mensagem "X tem modulo >= 1".
                 Os parnteses  dessa expresso booleana so essenciais.
            Sem eles, teramos
                                x > -1 AND x < 1
            e,  como   o  AND  tem  prioriade  sobre  os  operadores  de
            comparao >  e < , ficaramos com uma expresso sem sentido
            equivalente a x > (-1 AND x) < 1.
            
            Exemplo: Consideremos  o seguinte  fragmento de um programa,
            no qual  esto definidas  a varivel  booleana CONTINUAR,  a
            varivel do  tipo char RESPOSTA, e as variveis inteiras A e
            B.
                      ...
                      Write('Continua? (s/n) '); Readln(resposta);
                      Continuar := (resposta = 'S') OR (resposta = 's');
            
                      (* CONTINUAR ser TRUE somente quando RESPOSTA
                                     for um S, maisculo ou minsculo *)
            
                      IF Continuar THEN
            
                      BEGIN    (* Inicio do comando composto 1 *)
                        Write('Forneca o valor de A : ');
                        Readln(A);
                        Write('Forneca o valor de B : ');
                        Readln(B);
                      END     (* Fim do comando composto 1. Nao pode ter
                                 ponto-e-vrgula aqui *)
            
                      ELSE
            
                      BEGIN    (* Inicio do comando composto 2 *)
                        Writeln;
                        Writeln('Pressione ENTER para encerrar');
                        Readln;
                      END;   (* Fim do comando composto 2 e fim do IF *)
                      ...
            
                 No IF  acima, se  CONTINUAR for verdadeira, ento sero
            solicitados valores  para  A  e  B.  Em  caso  contrrio,  o
            programa  esperar   ser  pressionado  a  tecla  ENTER  para
            encerrar.
                 Nas  constantes   do  tipo  char  ou  string,    feita
            distino entre  letras minsculas e maisculas. Logo, 'S' 
            considerado diferente de 's'.
            
            Exemplo: Queremos,  neste exemplo,  elaborar um programa que
            solicite do  usurio um  nmero real  qualquer x  e que seja
            mostrado na tela a sua raiz quadrada. Se, por exemplo, x for
            igual a 4, queremos ver na tela uma mensagem como
            

                                        - 29 -





                      A raiz quadrada de  4.000   2.000
            
                 Se x  for negativo,  por exemplo  -9, queremos ver algo
            como
            
                      A raiz quadrada de -9.000   3.000 i
            
                 A funo  pr-definida SQRT(x)  calcula a raiz quadrada
            de x, se x for maior do que ou igual a 0. Portanto, se x for
            negativo, deveremos calcular a raiz de  -x  e acrescentar um
            "i"   direita do resultado. Temos assim uma situao em que
            o programa  deve decidir  se calcula  SQRT(x) ou  se calcula
            SQRT(-x), um caso tpico de uma estrutura de deciso IF:
            
            PROGRAM RaizQuadrada;
            
            VAR
              x: real;
            
            BEGIN
              Write('Valor de x? '); Readln(x);
            
              IF (x >= 0) THEN
                Writeln('A raiz quadrada de ', x:7:3, ' e'' ',
                                                           SQRT(x):7:3)
              ELSE
                Writeln('A raiz quadrada de ', x:7:3, ' e'' ',
                                                    SQRT(-x):7:3, ' );
            END.
            
            Exemplo:   A ordem  definida no  conjunto das  constantes do
            tipo string  ou char   uma extenso da ordem alfabtica. As
            letras maisculas  so diferenciadas das minsculas e ocupam
            uma posio  anterior  s  mesmas.  Assim,  a  ordem  nesses
            conjuntos satisfaz
            
            'A' < 'B' < 'C' < ... < 'Z' < ... < 'a' < 'b' < ... < 'z'
            
             e  devido a  isso, temos  que 'X'  < 'b',  'JOAO PESSOA'  <
            'joao', 'Matematica' < 'logica'.
            
                 No fragmento  a seguir,  nome1, nome2  e aux  so  duas
            variveis do tipo string. Queremos comparar nome1 com nome2,
            e se  nome1 for  maior do  que  nome2,  queremos  trocar  os
            valores de  nome1 por  nome2 entre si. Toda troca de valores
            de variveis  s   possvel com  a ajuda  de  uma  varivel
            intermediria, que neste caso ser aux.
                           ...
                           IF (nome1 > nome2) THEN
                           BEGIN
                             aux := nome1;         (* Troca nome1 *)
                             nome1 := nome2;       (* por nome2   *)
                             nome2 := aux;
                           END;

                                        - 30 -





            
                 Se tivssemos,  por exemplo,  nome1 =  'Joa e nome2 =
            'An, aps  a execuo  do IF  anterior passaramos  a  ter
            nome1 = 'An e nome2 = 'Joa.
                 Observe que um fragmento como
                           ...
                           IF (nome1 > nome2) THEN
                           BEGIN
                             nome1 := nome2;
                             nome2 := nome1;
                           END;
                           ...
            no faria  a troca  desejada.  Neste  caso,  nome1  e  nome2
            ficariam ambas  iguais a  'Ana' e  o  valor  'Joao'  estaria
            perdido.
            
            Exemplo: O  programa a  seguir, testa  se trs nmeros reais
            fornecidos pelo  usurio podem  ser usados  como medidas dos
            lados de  um tringulo  retngulo. Exige-se  que os  valores
            sejam todos  positivos e  fornecidos em ordem crescente. Uma
            vez fornecido  os nmeros, o teste para saber se eles formam
            um tringulo  retngulo ou  no ser testar se o quadrado do
            maior deles  a soma dos quadrados dos menores.
            
            PROGRAM TrianguloRetangulo;
            
            VAR
              a, b, c: real;
              teste: boolean;
            
            BEGIN
              Write('Forneca 3 nmeros positivos em ordem crescente: ');
              Readln(a, b, c);
            
              teste := (a > 0) and (b > 0) and (c > 0) and  (a < b)  and
                       (b < c);     (* TESTE ser TRUE somente quando as
                                condies desejadas forem satisfeitas *)
            
              IF teste THEN
                IF (Sqr(c) = Sqr(a) + Sqr(b)) THEN
                  Writeln(a:6:2, ',', b:6:2, ' e ', c:6:2, ' formam um',
                          ' triangulo retangulo.')
                ELSE
                  Writeln(a:6:2, ',', b:6:2, ' e ', c:6:2, ' nao ',
                          'formam um triangulo retangulo.')
              ELSE
                Writeln('Os valores fornecidos devem ser positivos e ',
                        'em ordem crescente.');
            END.
            
                 Observe que  temos dois  IF's  encaixados.  O  IF  mais
            interno (IF  (Sqr(c)...) s  ser executado quando TESTE for
            TRUE.
            

                                        - 31 -





            Exemplo: Sendo  fornecidos 3  nmeros reais,  o  programa  a
            seguir mostra o maior entre eles.
            
            PROGRAM MaiorDeTres;
            
            VAR
              x, y, z, maior: real;
            
            BEGIN
              Write('Digite tres numeros: '); Readln(x, y, z);
              Writeln;
            
              IF (x > y) THEN     (* Neste caso y nao pode ser o maior.
                                     Devemos comparar x com z *)
                IF (x > z) THEN
                  maior := x
                ELSE
                  maior := z
            
              ELSE                (* Neste caso, x <= y e resta-nos
                                     comparar y com z *)
                IF (y > z) THEN
                  maior := y
                ELSE
                  maior := z;
            
              Writeln('O maior dos tres ' ', maior:6:2)
            
            END.
            
                 Observe a  ausncia do  ponto-e-vrgula em  muitas  das
            linhas acima.
            
            Exemplo:  Resolver   uma  equao  do  segundo  grau,  sendo
            fornecidos seus coeficientes a, b e c.
                 Nosso  roteiro   na  elaborao   do  programa  ser  o
            seguinte:
            
                 (1) Ler os valores dos coeficientes a, b, c;
                 (2) Verificar  se a  = 0.  Se for,  rejeitar os valores
            fornecidos.  Neste   caso,  usaremos  o  comando  HALT  para
            encerrar a execuo do programa;
                 (3) Calcular o valor do discriminante Delta = b2 - 4ac;
                 (4) Se  o Delta  for maior ou igual a zero, calcular as
            razes x1 e x2 usando a conhecidssima frmula;
                 (5)  Se  o  Delta  for  negativo,  calcular  as  razes
            complexas
                          x1 =  (-b)     | Sqrt(-Delta) |
                               ------  + |--------------| i
                                 2a      |      2a      |
            
                          x2 =  (-b)     | Sqrt(-Delta) |
                               ------  - |--------------| i
                                 2a      |      2a      |

                                        - 32 -





            
                 Estamos  colocando   o  mdulo   na  parte   imaginria
            simplesmente porque  queremos que  x1 tenha parte imaginria
            positiva e x2 a parte imaginria negativa, independentemente
            de a ser positivo ou no.
            
                 (6) Limpar a tela;
                 (7) Mostrar a equacao;
                 (8) Imprimir as razes.
            
            Seguindo esse roteiro, temos o seguinte programa:
            
            PROGRAM Eq_2o_Grau;
            
            { ======================================================== }
            {          RESOLUCAO DE EQUACOES DO SEGUNDO GRAU           }
            { ======================================================== }
            
            USES Crt;
            
            VAR
              a, b,  delta, x1, x2, ReX, ImX: real;
            
            BEGIN
              Writeln('                       2');
              Writeln('RESOLUCAO DA EQUACAO ax + bx + c = 0');
              Writeln;
              Write('Forneca os coeficientes a, b, c : ');
              Readln(a, b, c);
            
              IF (a = 0) THEN        { Encerra a execucao quando a = 0 }
              BEGIN
                Writeln('O valor de "a" nao deve ser nulo.');
                HALT;
              END;
            
              { Calculo do discriminante }
              delta := Sqr(b) - 4*a*c;
            
              IF (delta >= 0) THEN      { Caso das raizes reais }
            
              BEGIN
                x1 := (-b + Sqrt(delta))/(2*a);  { raiz 1 }
                x2 := (-b - Sqrt(delta))/(2*a);  { raiz 2 }
              END
            
              ELSE                      { Caso das raizes complexas }
            
              BEGIN
                ReX := (-b)/(2*a);          { Parte real das raizes }
                ImX := Abs(Sqrt(-delta)/(2*a));  { Parte imaginaria }
              END;
            
              ClrScr;     { Limpa a tela }

                                        - 33 -





            
              Writeln(' ':19, '2');
              Writeln('EQUACAO: (', a:7:2, ')x + (', b:7:2, ')x + (',
                      c:7:2, ') = 0');
              Writeln;
            
              IF (delta >= 0) THEN
                Writeln('Raizes reais: ', x1:7:2, ' e ', x2:7:2)
              ELSE
              BEGIN
                Writeln('Raizes complexas: ', ReX:7:2, ' + ',
                                                        ImX:7:2, ' );
                Writeln(' ':18, ReX:7:2, ' - ', ImX:7:2, ' );
              END;
            
              Readln;    { pausa }
            
            END.
            
                 Aps a execuo desse programa, temos na tela mensagens
            como:
            
                               2
            EQUACAO: (   1.00)x + (  -2.00)x + (   3.00) = 0
            
            Raizes complexas:    1.00 +    1.41 i
                                 1.00 -    1.41 i
            
                 Deixamos aos  usurios  com  uma  disposio  maior  de
            trabalho o  exerccio de melhorar a sada desses resultados,
            fazendo-a mais  prxima do  usual. Por  exemplo, no  exemplo
            executado acima, seria mais interessante (e mais trabalhoso)
            mostrar uma linha como
                      2
            EQUACAO: x - 2 x + 3 = 0.
            
            Exemplo: Sendo  fornecidos dois  reais a e b, queremos agora
            um programa  que fornea  a forma  polar do  numero complexo
            z =  a +  bi e,  opcionalmente, calcule uma potncia inteira
            desse nmero.
                 O clculo do mdulo r de z neste caso  imediato:
            
                           r := Sqrt(Sqr(a) + Sqr(b)).
            
                 O prximo  passo   saber a  qual quadrante  pertence o
            ponto (a,  b). Isto  pode ser  feito com  uma srie  de IF's
            encaixados. Uma  vez, descoberto  isso, o  argumento TETA de
            z = a + bi fica fcil de se determinar:
            
                      TETA =  ArcTan(b/a) se  (a, b)  for do  1o  ou  4o
                                                              quadrantes
            ou
                      TETA = ArcTan(b/a) + Pi nos demais casos.
            

                                        - 34 -





                 Devemos considerar  tambm os  casos especiais  em  que
            a = 0 ou b = 0.
                 A forma  polar de  z ser  r(cos(TETA) + i sen(TETA)) e
            para  calcularmos   z  elevado   a  n  basta  calcularmos  o
            valor de  r^n(cos(n*TETA) + i  sen(n*TETA)). A  potncia r^n
            pode ser calculada como EXP(n*LN(r)).
            
            
            PROGRAM FormaPolar;
            
            { ======================================================== }
            {  CALCULO DA FORMA POLAR E DE UMA POTENCIA DE z = a + bi  }
            { ======================================================== }
            
            USES Crt;
            
            VAR
              a, b,          { partes real e imaginria de z }
              r, teta:       { mdulo e argumento de z       }
                       real;
              n: integer;    { expoente de z                 }
              resposta: char;
              CalcularPotencia: boolean;
            
            BEGIN
              ClrScr;
            
              { Entrada de a e b }
              Write('FORNECA A PARTE REAL E A PARTE IMAGINARIA DE ');
              Writeln('z = a + b);
              Writeln;
              Write('       Valor de a: '); Readln(a);
              Write('       Valor de b: '); Readln(b);
              Writeln;
            
              { Calculo do mdulo de z }
              r := Sqrt(Sqr(a) + Sqr(b));
            
              { Calculo do argumento de z }
              IF (b = 0) THEN
                { caso em que z for real }
                IF (a >= 0) THEN teta := 0 ELSE teta := Pi
              ELSE
                IF (a = 0) THEN
                  { caso em que z for imaginrio puro }
                  IF (b >= 0) THEN teta := Pi/2 ELSE teta := 3*Pi/2
                ELSE
                  { demais casos }
                  IF (a > 0) THEN
                    teta := ArcTan(b/a)
                  ELSE
                    teta := ArcTan(b/a) + Pi;
            
              Write('Forma polar de z = ');

                                        - 35 -





              Writeln(r:8:4, ' (cos(', teta:8:4, ') + i sen(', teta:8:4,
                                                               '))' );
            
              Writeln;
              Write('Quer calcular alguma potencia de z? (s/n) ');
              Readln(resposta);
              CalcularPotencia := (resposta = 'S') OR (resposta = 's');
            
              IF CalcularPotencia THEN
              BEGIN
                Writeln;
                Write('Forneca o valor do expoente n da potencia: ');
                Readln(n);
                Writeln;
                Write('z elevado a ', n, ' e'' igual a ');
                Writeln( EXP(n*LN(r)) * COS(n*teta) :8:4,  ' + i (',
                         EXP(n*LN(r)) * SIN(n*teta) :8:4,  ')' );
              END;
            
              Writeln;
              Writeln('Pressione [ENTER] para encerrar.');
              Readln;
            END.
            
                 Executando esse  programa com  z =  1  +  3i,  temos  a
            seguinte apresentao na tela:
            
            FORNECA A PARTE REAL E A PARTE IMAGINARIA DE z = a + bi
            
                   Valor de a: 1
                   Valor de b: 3
            
            Forma polar de z =   3.1623 (cos(  1.2490) + i sen( 1.2490))
            
            Quer calcular alguma potencia de z? (s/n) s
            
            Forneca o valor do expoente n da potencia: 5
            
            z elevado a 5 e' igual a 316.0000 + i (-12.0000)
            
            Pressione [ENTER] para encerrar.
            
            Observao: Um  dos aspectos  que mais  causam confuso  com
            relao ao  IF em  qualquer linguagem  de programao  o IF
            encaixado  (tambm  chamado  de  IF  aninhado).  O  problema
            consiste na  dificuldade de  se indentificar  que ELSE  est
            relacionado com  qual IF.  Nestes casos  uma boa  endentao
            pode ajudar.
                 Observe o seguinte IF:
            
                                IF condio1 THEN
                                  IF condio2 THEN comando1
                                ELSE
                                  comando2;

                                        - 36 -





            
                 A qual  dos dois  IF's anteriores  o ELSE  se refere? A
            forma na qual os IF's foram escritos sugere erroneamente que
            o ELSE  est relacionado  com o primeiro IF. No entanto, ele
            est relacionado  com o  segundo IF.  Em geral,  o ELSE est
            ligado ao  IF mais  prximo.  Assim,  uma  forma  melhor  de
            escrever o fragmento acima :
            
                                IF condio1 THEN
                                   IF condio2 THEN
                                     comando1
                                   ELSE
                                     comando2;
            
                 Se  quisssemos   realmente  que   o   ELSE   estivesse
            relacionado com  o primeiro  IF, ento a forma correta de se
            escrever seria:
            
                                IF condio1 THEN
                                BEGIN
                                  IF condio2 THEN comando1
                                END
                                ELSE
                                  comando2;
            
                 Este tipo  de erro  lgico em  um programa, em geral, 
            difcil  de   se  detectar.   Ele  costuma  ser  chamado  de
            "armadilha dos IF's encaixados".
            
            3.3. A ESTRUTURA DE DECISO CASE  
            
                 O  comando  IF-THEN-ELSE  permite  que  um  entre  dois
            comandos seja  executado. O  comando CASE  permite que  seja
            selecionado um  entre vrios  comandos. Desse  modo, o  CASE
            funciona  como  uma  generalizao  do  IF  com  a  seguinte
            restrio: a  expresso  que    usada  para  selecionar  os
            comandos deve ser do tipo ordinal.
                 Sua sintaxe :
            
                           CASE expresso OF
                             val_1 : comando1;
                             val_2 : comando2;
                             ...     ...
                             ELSE
                               comandoN;
                           END;
            
                 O valor da expresso ordinal  avaliado e comparado com
            cada valor  alvo  val_1, val_2, ... . Se existir algum valor
            alvo que  coincida com  o valor  da  expresso,  ento  ser
            executado apenas  o comando  que  estiver  associado  aquele
            valor. Se  o valor  da expresso  no coincidir  com  nenhum
            valor alvo,  ento ser  executado  o  comando  que  estiver
            associado ao  ELSE, se  esse comando  existir. O  ELSE de um

                                        - 37 -





            CASE   opcional. Para encerrar o CASE deveremos ter um END,
            mas no temos um BEGIN para iniciar.
            
                       CASE
                         |
                       +---+  val_1       +----------+
                       | e |--------->----| comando1 |---->----+
                       | x |              +----------+         |
                       | p |  val_2       +----------+         |
                       | r |--------->----| comando2 |---->----+
                       | e |              +----------+         |
                       | s |   ...             ...             |
                       | s |                                   |
                       |  |  ELSE        +----------+         |
                       | o |--------->----| comandoN |---->----+
                       +---+              +----------+         |
                                                               v
            
            Exemplo: Suponhamos que x seja uma varivel inteira. Ento o
            comando CASE abaixo executar o comando1 quando tivermos x =
            5, o  comando2 quando  x =  11, o comando3 quando x = -4 e o
            comando4  quando   x  for   diferente  desses  trs  valores
            anteriores.
            
                                CASE x OF
                                  5 : comando1;
                                 11 : comando2;
                                 -4 : comando3;
                                  ELSE
                                      comando4;
                                END;
            
                 Em um  CASE, no  lugar de  um nico valor alvo, podemos
            ter um  lista de valores alvo associados a um mesmo comando.
            Nessa lista,  os valores devem ser separados por vrgulas ou
            fornecidos em forma de intervalo valor1..valor2, onde valor1
            e  valor2   so,  respectivamente,  os  limites  inferior  e
            superior do  intervalo. Por  exemplo, 1..1000    uma  forma
            abreviada de  se referir  aos  inteiros  de  1  a  1000    e
            'A'..'G'  o mesmo que 'A', 'B', 'C', 'D', 'E', 'F', 'G'.
            
            Exemplo: Seja  N inteiro  que possa  assumir em  um programa
            valores de 0 a 100. Consideremos o seguinte CASE:
            
                           CASE N OF
                             1, 3, 5,
                                   7, 9  : Write('N impar, N <= 10');
                             2, 4, 6,
                                   8, 10 : Write('N par, N <= 10');
                             11..20      : Write('11 <= N <= 20');
                             21..100     : Write('21 <= N <= 100');
                           END;
            

                                        - 38 -





                 De acordo  com o  valor de  N, ser mostrada apenas uma
            das mensagens  "N impar,  N  <=  10",  "N  par,  N  <=  10",
            "11 <= N <= 20" ou "21 <= N <= 100".
            
            Exemplo: Consideremos no CASE abaixo, CH como uma varivel
            do tipo ordinal char.
            
                      CASE Ch OF
                        'A'..'Z', 'a'..'z' :
                          Writeln('E'' uma letr);
                        '0'..'9':
                          Writeln('E'' um algarism);
                        '+', '-', '/', '*':
                          Writeln('E'' uma operaca);
                        ELSE
                          Writeln('E'' um caracter especial');
                      END;
            
                 De acordo com o valor de CH, ser mostrada uma mensagem
            especfica, dizendo  se CH    letra,  digito,  operador  ou
            smbolo especial ('<', '?', '[', '$', '%', ...)
            
            Exemplo: O  programa a seguir l dois nmeros reais A e B do
            teclado e  mostra na  tela um  menu onde  o  usurio  poder
            selecionar uma das operaes A+B, A-B, A/B, A*B ou A elevado
            a B. Uma vez feita a escolha da operao, seu resultado ser
            mostrado na tela.
                 Para ler qual foi o nmero da opo do menu, poderamos
            usar um  READLN(opcao), mas  no vamos us-lo. Vamos usar um
            outro comando de entrada chamado READKEY. Sua sintaxe :
            
                                Varivel := READKEY;
            
                 READKEY espera que seja digitado um caracter do teclado
            e o associa  varivel do tipo char escrita antes do smbolo
            de atribuio  ( :=  ). Alm  disso, READKEY  no  mostra  o
            caracter digitado na tela, nem espera ser pressionado ENTER.
                 Os comandos CASE e READKEY so ideais para serem usados
            em menus.
            
            PROGRAM Menu;
            
            USES Crt;
            
            VAR a, b, resultado: real;
                opcao, pausa: char;
            
            BEGIN
              Write('Forneca dois numeros: '); Readln(a, b);
              Writeln;
            
              ClrScr;
            
              Writeln;         (* Impressao do menu na tela *)

                                        - 39 -





              Writeln('=================== M E N U ==================');
              Writeln('|                                            |');
              Writeln('|                A = ',a:9:3,'               |');
              Writeln('|                B = ',b:9:3,'               |');
              Writeln('|                                            |');
              Writeln('+--------------------------------------------+');
              Writeln('|                                            |');
              Writeln('|        1. A + B             4. A/B         |');
              Writeln('|        2. A - B                 B          |');
              Writeln('|        3. A*B               5. A           |');
              Writeln('|                                            |');
              Writeln('======== Selecione uma opcao de 1 a 5 ========');
              Writeln;
            
              opcao := READKEY; { Le um caracter do teclado    }
            
              CASE opcao OF     { Calcula o resultado desejado }
                '1' : resultado := A + B;
                '2' : resultado := A - B;
                '3' : resultado := A*B;
            
                '4' : IF (B <> 0) THEN        { A/B nao ser calculado }
                        resultado := A/B      { se B = 0               }
                      ELSE
                      BEGIN
                        Writeln('Opcao invalida neste caso.');
                        Halt
                      END;
            
                '5' : IF (A > 0) THEN                 {  B             }
                         resultado := Exp(B*Ln(A))    { A    s   ser }
                      ELSE                            { calculado   se }
                      BEGIN                           { A for positivo }
                        Writeln('Opcao invalida neste caso.');
                        Halt
                      END;
            
              END; { fim do CASE }
            
              { Mostra o resultado na tela }
              Writeln;
              Writeln('Opcao = ', opcao, '        Resultado = ',
                                                     resultado:9:3);
              Writeln;
              Writeln('Pressione qualquer tecla para encerrar.');
              pausa := READKEY
            END.
            
            3.4. EXERCCIOS         
            
            1) Faa um programa que d trs informaes a respeito de um
            inteiro positivo N fornecido ao computador:
               i) Se N  mltiplo de 7;
              ii) Se N  um divisor de 1992;

                                        - 40 -





             iii) Se a raiz quadrada de N  um nmero inteiro.
            
            2) Supondo  que a cobrana de imposto de renda na fonte seja
            feita com  base na  tabela abaixo,  elabore um  programa que
            mostre na tela o valor do imposto, quando o usurio fornecer
            o valor do salrio (inteiro).
            
              +------------------------+----------+-------------------+
              |    salario (em Cr$)    | alquota | parcela a deduzir |
              +------------------------+----------+-------------------+
              |       at 200000       |   ----   |       -----       |
              |   de 200001 a 300000   |    5%    |       10000       |
              |   de 300001 a 400000   |   10%    |       25000       |
              |   de 400001 a 500000   |   15%    |       45000       |
              |   a partir de 500001   |   20%    |       70000       |
              +------------------------+----------+-------------------+
            
                 Por exemplo,  para um  salrio  de  350000,  temos  uma
            alquota de  10% e  uma parcela  a deduzir de 25000. Logo, o
            valor do imposto, segundo a tabela, dever ser de
                      350000 * 0.10 - 25000  =  10000 cruzeiros.
            
            3) Em  cada caso abaixo, determine o valor do inteiro x aps
            a execuo  do seguinte CASE, sabendo que o valor do inteiro
            y antes da execuo do CASE :
            
            a) y = 7;        CASE y OF
                              -10..0 : x := 5;
            b) y = -7;          2, 4 : x := y div 2 + Sqr(y - 1);
                               5..10 : BEGIN
            c) y = 2;                     IF Odd(y) THEN y := 12;
                                         x := Round(Sqrt(y + 5))
            d) y = -2;                  END;
                               ELSE
            e) y = 20            IF y > 4 THEN x := 0 ELSE x := 1;
                             END;
            
            4) Quais dos seguintes fragmentos so equivalentes 2 a 2?
            
              a) IF cond1 THEN comando1;      b) IF cond1 THEN
                 IF cond2 THEN comando2;           IF cond2 THEN
                                                     comando1; comando2;
            
              c) IF cond1 THEN                d) IF cond1 AND cond2 THEN
                   IF cond2 THEN                 begin
                   begin                           comando1;
                     comando1; comando2;           comando2;
                   end;                          end;
            
              e) IF cond1 OR cond2 THEN       f) IF cond1 AND cond2 THEN
                 begin                             comando1;
                   comando1; comando2;             comando2;
                 end;
            

                                        - 41 -
