Pascal/Estrutura Condicional


Estrutura CondicionalEditar

Essa estrutura é conhecida também como estrutura de decisão ou de seleção, ela se caracteriza por execução de determinados códigos de programação dependendo da veracidade de uma condição. Neste tópico são apresentadas as estruturas de condição simples, composta, aninhada (uma dentro da outra) e a estrutura Case.


Estrutura Condicional - SimplesEditar

Sintaxe:

  SE condição
  ENTÃO comando

Notas: O comando só será executado se a condição for verdadeira. Uma condição é uma comparação que possui dois valores possíveis, verdadeiro ou falso.

Sintaxe:

  SE condição
  ENTÃO INÍCIO
     comando1                
     comando2
     comando3
        FIM


Notas: Aqui o comando também só será executado se a condição for verdadeira, a diferença dos dois exemplos acima é que, quando o número de instruções a serem executadas forem maior que um, então é necessário colocar as instruções dentro de blocos (Begin = INICIO e End = FIM).

  • SE = IF
  • ENTÃO = THEN
  • INÍCIO = BEGIN
  • FIM = END

Exemplo com apenas uma instrução:

   Uses Crt;

   var X, Y : Integer;
   
   begin
     Writeln ('Digite dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If (X > Y) Then {Condição - SE X for maior que Y}
       Writeln ('X é Maior que Y, e seu valor é = ', X);
   end.

Exemplo com mais de uma instrução:

   uses Crt;
   
   var X, Y : Integer;
   
   begin
     Writeln ('Entre com dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If (X = Y) Then {Condição - SE X for igual a Y}
     Begin  {INICIO - Repare abaixo que existe duas instruções, dois comandos Writeln, por isso estão entre BEGIN e END}
       Writeln ('X é igual que Y');
       Writeln ('O Valor de X é =', X);
     End; {FIM}
   end.

Exemplo utilizando operadores Lógicos:

   uses Crt;
   
   var X, Y : Integer;
   
   begin
     Writeln ('Entre com dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If ((X > Y) And (Y <> 0)) Then {Condição - SE X for maior que Y E Y diferente de 0 - Repare no And}
     Begin  {INICIO - Repare abaixo que existe três instruções, três comandos Writeln, por isso estão entre BEGIN = INICIO e END = FIM}
       Writeln ('X é Maior que Y');
       Writeln ('Y é diferente de 0');
       Writeln ('O Valor de X é =', X);
     End; {FIM}
   end.

Notas: Repare no operador Lógico AND, só serão executados os comandos Writeln, se as duas condições forem verdadeiras. Se a variável X for maior que a variável Y e se a variável Y for diferente de 0 (zero).

Exemplo utilizando operadores Lógicos:

   uses Crt;
   
   var X, Y : Integer;
   
   begin
     Writeln ('Entre com dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If ((X > Y) Or (Y <> 0)) Then {Condição - SE X for maior que Y OU Y diferente de 0 (zero)- Repare no Or}
     Begin  {INICIO - Repare abaixo que existe três instruções, três comandos Writeln, por isso estão entre BEGIN = INICIO e END = FIM}
       Writeln ('X é Maior que Y');
       Writeln ('Y é diferente de 0');
       Writeln ('O Valor de X é =', X);
     End; {FIM}
   end.

Notas: Nesse caso acima utilizando o Operador Lógico OR (OU), serão executados os comandos Writeln, se uma das duas condições forem verdadeira. Se a variável X for maior que a variável Y OU Se a variável Y for diferente de 0 (zero).

Estrutura Condicional - CompostaEditar

Sintaxe:

  SE condição
  ENTÃO comando1
  SENÃO comando2
     

Notas: O comando1 só será executado se a condição for verdadeira, caso contrário, se a condição for falsa, será executado o comando2.

Sintaxe:

  SE condição
  ENTÃO INÍCIO
     comando1                
     comando2
     comando3
        FIM
  SENÃO INÍCIO
     comando4
     comando5       
        FIM  
  • SE = IF
  • ENTÃO = THEN
  • SENÃO = ELSE
  • INÍCIO = BEGIN
  • FIM = END

Exemplo com apenas uma instrução:

   Uses Crt;
   
   var X, Y : Integer;
   
   begin
     Writeln ('Entre com dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If (X > Y) {Condição - SE X for maior que Y}
       Then Writeln ('X é Maior que Y, e seu valor é = ', X) {Entra nesse comando apenas se X for maior que Y - Repare que antes de ELSE não vai ";"}
       Else Writeln ('Y é maior ou igual a X, seu valor é = ',Y); {Entra nesse comando se Y for maior ou igual a X}
   end.

Exemplo com mais de uma instrução:

   Uses Crt;
   
   var X, Y : Integer;
   
   begin
     Writeln ('Entre com dois Números:'); { Mostra na tela a mensagem}
     Readln (X, Y); { Lê os dois números }
     If (X > Y) {Condição - SE X for maior que Y}
     Then Begin
            Writeln ('X é Maior que Y');
            Writeln ('O valor de X é =', X);   
          End       { Repare que não tem ponto e vírgula por que "End" está antes do "Else"}
     Else Begin
            Writeln ('Y é Maior ou Igual a X');
            Writeln ('O valor de Y é =', Y); 
          End;
   end.        { Sempre no "End" do programa principal vai ponto final ".", e não ponto e virgula ";"}


Estrutura Condicional AninhadaEditar

O if aninhado é simplesmente um if dentro da declaração de um outro if externo. É necessário saber exatamente a qual if um determinado else está ligado, para não ocasionar erro na lógica do programa.

Exemplos de IF's aninhados:

   Uses Crt;
   
   Var X, Y, A, B : Integer;
   
   Begin
     Readln (X,Y,A,B);
     If (X > Y) Then { Entrará no Próximo If apenas se a variável X for maior que a variavel Y }
     | If (A > B) 
     | | Then Writeln ('X é maior que Y e A é maior que B') {Sem ";"}
     | Else Writeln ('A não é Maior que B')   {Sem ";"}
     Else Writeln ('X não é maior que Y');
   End.
   
   { O caracter "|" serve para indicar qual IF pertence a qual ELSE}
   { Repare que antes do ELSE nao tem ";"}

Exemplo de IF's aninhados:

   Uses Crt;
   
   Var X, Y, A, B : Integer;
   
   Begin
     Readln (X,Y,A,B);
     If (X > Y) Then
     | If (A > B)
     |    Then Begin
     |    |    | Writeln ('X é maior que Y e A é maior que B');
     |    |    | Writeln ('O Valor de X é = ', X);
     |    |    | Writeln ('O Valor de A é = ', A);
     |    |    End
     |    Else Begin
     |         | Writeln ('A não é Maior que B');
     |         | Writeln ('O Valor de B é = ', B);
     |         End
     Else Writeln ('X não é maior que Y');
   End.

Notas: Repare que para cada BEGIN sempre terá um END, e tem que ficar atento sempre em relação a qual ELSE perfence a qual IF. Os programas acima para compilá-los é necessários tirar todos os caracteres "|" (pipe), que foi utilizado para mostrar a inter-relação entre BEGIN's - END's e IF's - ELSE's.

Else PendenteEditar

Else pendente acontece quando ele se encontra "perdido" dentro do código, ou seja, ele não sabe a qual If pertence.

Exemplo de Else pendente:

   Uses Crt;
   
   Var X, Y, A, B : Integer;
   
   Begin
     Readln (X,Y,A,B);
     If (X > Y) Then
       If (A > B) Then 
         Writeln ('A é maior que B')
       Else  Writeln ('A não é Maior que B');
   End.

Notas: O compilador adota que o Else sempre será do If mais interno.


Exemplo de como resolver o problema do Else pendente:

   Uses Crt;
   
   Var X, Y, A, B : Integer;
   
   Begin
     Readln (X,Y,A,B);
     If (X > Y) Then
     Begin 
       If (A > B) Then 
         Writeln ('A é maior que B')
       Else  Writeln ('A não é Maior que B');
     End;
   End.

Notas: Para que não haja duvidas a qual If o Else pertence utilize os delimitadores BEGIN - END.


Estrutura CaseEditar

O comando CASE é importante para a estruturação de um programa que possua diversas opções de execução, tornando-o bem legivel e estruturado, evitando o uso do IF de forma repetida. O comando CASE trás junto com ele uma restrição, onde, seletor tem que ser do tipo char, integer ou boolean.

Sintaxe:

         CASE seletor OF
              alvo1 : comando1;
              alvo2 : comando2;
              alvo3 : comando3;
         END;


Sintaxe:

         CASE seletor OF
              alvo1 : BEGIN
                        ... instruções ...
                      END;
              
              alvo2 : comando2;   
              
              alvo3 : BEGIN
                        ... instruções ...  
                      END; 
              ELSE comando4;  
         END;

Exemplo:

   { Um simples exemplo de como se trabalha com a Estrutura Case }

   Uses Crt;
   
   Var X : Integer;
   
   Begin
     Readln (X); 
     Case X Of
          1 : Writeln ('Ola Mundo'); { E o valor de X for igual a 1, irá executar essa linha }
          2 : Writeln ('GNOIA');     { X = 2, essa linha será executada }
          3 : Writeln ('Software Livre'); { X = 3 - essa linha será executada }
     End;
   End.

Exemplo:

   Uses Crt;
   
   Var Y, X : Integer;
   
   Begin
     Readln (X, Y);
     Case X Of
          1 : Begin
                Y := 4;
                Writeln ('Entrou no Primeiro alvo');
              End;
   
          2 : Begin
                Y := 3;
                Writeln ('Entrou no Segundo alvo');
              End;
   
          3 : Writeln ('Entrou no Terceiro alvo');
          Else Writeln ('Entrou no Else');
     End;
   End.

ExercíciosEditar

01- Faça um programa para ler três números e escrever se estes podem ou não formar um triângulo. Observação – Para formar os lados de um triângulo cada um dos valores tem que ser menor que a soma dos outros dois.

Resolução:

 Program triangulo ;
 var
    l1,l2,l3:integer;
 Begin
   clrscr;
   writeln('Digite os lados do triângulo');
   readln(l1,l2,l3);
   if (l1<l2+l3) and (l2<l1+l3) and (l3<l1+l2) then
         writeln('Os números formam os lados de um triângulo')
   else  writeln('Os números não formam os lados de um triângulo');
   readkey; 
 End.

02- Faça um programa para ler três números e se estes poderem formar um triângulo dizer se o triângulo é “EQUILÁTERO”, “ISÓSCELES” OU “ESCALENO”.

A Wikipédia tem mais sobre este assunto:
Triângulo

Resolução:

 Program triangulo ;
 var
    A,B,C:integer; //A, B, C > 0
 Begin
 |  clrscr;
 |  writeln('Digite os lados do triângulo');
 |  readln(A,B,C);
 |  if (A<B+C) and (B<A+C) and (C<A+B) then //'and' é usado para 'excluir' os valores A ou B ou C=0
 |  |   begin
 |  |   |  write('Os números formam os lados de um triângulo ');
 |  |   |  if (A=B) and (B=C) then
 |  |   |  |  write('equilátero ')
 |  |   |  else
 |  |   |  | if (A<>B) and (A<>C) and (B<>C) then 
 |  |   |  | | write('escaleno')
 |  |   |  | else
 |  |   |  | | write('isósceles');
 |  |   end     
 |  else write('Os números não formam os lados de um triângulo'); 
 |  readkey; 
 End.

03- Faça um programa que leia as três notas, as faltas e o nome de um aluno e imprima sua situação. ( “APROVADO”, “REPROVADO POR FALTA” ou “REPROVADO POR MÉDIA” ) Observação – A média para aprovação é 5.0 e o limite de faltas é 17.

Resolução:

 Program aluno;
 var
 nome:string;
 n1,n2,n3,media:real;
 f:integer;
 Begin
    clrscr;
    writeln('Digite os dados do aluno');
    write('Nome: ');
    readln(nome);
    write('3 notas: ');
    readln(n1,n2,n3);
    if (n1<0) or (n1>10) or (n2<0) or (n2>10) or (n3<0) or (n3>10) then
      begin
       write('Notas inválidas, digite notas de 0 a 10!');
       readln(n1,n2,n3);
      end;
    media:=(n1+n2+n3)/3;  
    write('Quantidade de faltas :');
    readln(f);
    if f<0 then 
      begin
        write('Faltas inválidas! digite um número maior ou igual a 0!');
        readln(f);
      end;  
    write('O aluno ',nome,' está ');
    if (media>=5) and (f<18) then write('aprovado com média: ',media:2:2);
    if media<5 then write('reprovado por média: ',media:2:2);
    if f>17 then write('reprovado por falta: ',f:2);
    readkey;
 End.