MC102
Algoritmos e Programação de Computadores
Parte IX



Norton Trevisan Roman




O COMANDO IF

Suponha que queremos um programa onde o usuário adivinha um número que definimos. Como fazemos isso?

1. Pedimos o número ao usuário.
2. Se ele adivinhou, aviso.

Como eu faço a segunda parte? Para ele ter adivinhado, o número que o usuário deu deve ser igual ao número que definimos. Suponha que este número pré-definido seja 5. Então a parte 2 fica:

1. Pedimos o número n ao usuário.
2. Se n = 5 então digo que ele acertou.

E como faço isso em Pascal?

  PROGRAM adivinha;
  CONST valor = 5;
  VAR n : integer; {o chute do usuário}

  BEGIN
    write('seu chute: ');
    readln(n);
    IF n = 5 THEN write('acertou!')
  END.
        

note que é n = 5 e não n := 5.

Assim, a forma geral do comando IF é:

   IF condição THEN comando;
        

e, da mesma forma que o FOR:

   IF condição THEN
   BEGIN
     comando1;
     comando2;
     ...
     comandon
   END;
        

Esse comando diz que se a condição for verdadeira, então o comando (ou grupo de comandos entre BEGIN e END) que vem após o THEN ser'executado. Se não for verdadeira, ele não será executado.



CONDIÇÕES

Mas, afinal, que tipo de condições podemos usar no IF? Qualquer tipo de comparação envolvendo constantes, variáveis, valores ou expressões:

Condição Significado Exemplo
expressão1 = expressão2 igual 5 = 6 é falso
expressão1 < expressão2 menor 5 < 6 é verdadeiro
expressão1 <= expressão2 menor ou igual 5 <= 6 é verdadeiro
expressão1 > expressão2 maior 5 > 6 é falso
expressão1 >= expressão2 maior ou igual 5 >= 6 é falso
expressão1 <> expressão2 diferente 5 <> 6 é verdadeiro

Vamos melhorar nosso exemplo de adivinhar números. Agora ele compara os números e, se o usuário adivinhou, pára o FOR. Ele dá também dicas ao usuário se o chute é maior ou menor e 10 chances, no máximo, para acertar:

  PROGRAM adivinha;
  CONST valor = 5;
  VAR n : integer; {o chute do usuário}
      c : integer; {contador do for}

  BEGIN
    writeln('Você tem 10 chances');

    FOR c := 1 TO 10 DO
    BEGIN
      write('seu chute: ');
      readln(n);
      IF n = valor THEN
      BEGIN
        writeln('acertou"');
        c := 10
      END;
      if n > valor then writeln('seu palpite foi maior');
      if n < valor then writeln('seu palpite foi menor')
    END
  END.
        

Viu como fizemos para sair do FOR? Enganamos a máquina, fazendo ela achar que esta era a iteração de número 10 e, portanto, a última.

Atenção! Esse modo de sair do FOR é HORRENDO e extremamente DESADONSELHÁVEL. Além disso, NÃO se pode garantir que o compilador que você usa irá fazer isso mesmo. Em Free Pascal isso funciona. Mas, então, por que está sendo apresentado? Mais adiante você verá comandos que interrompem o ciclo quando uma determinada condição for satisfeita. No momento, essa "interrupção" terrível do FOR pode servir para mostrar a você como o FOR funciona e qual a importância de seu contador, sua variável de controle. Por isso vale lembrar... NUNCA FAÇA ISSO!

Mas esse programa não está bem escrito. Veremos agora por quê.



ELSE

Suponha agora que queremos dizer que o usuário errou ou acertou. Ou seja, queremos tomar a seguinte decisão:

Se o usuário acertou, escrevo "acertou!"
Senão escrevo "errou"

Como faço isso em Pascal?

   IF n = 5 THEN writeln('acertou!')
   ELSE writeln('errou!');
        

Notou a falta do ";" após o writeln? Antes do ELSE NUNCA bote ";". Se puser, o compilador reclamará.

Então, de um modo geral, o IF fica:

   IF condição THEN comando1
   ELSE comando2;
        

e, nesse caso, se a condição for verdadeira, então comando1 é executado. Se não for verdadeira, o comando2 é executado.

Ou seja, se condição for verdadeira, o que vier depois do THEN é executado e o ELSE é pulado. Se for falsa, o que vem após o THEN é pulado e o ELSE é executado.

Da mesma forma que antes, em vez de um comando podemos ter blocos de comandos:

   IF condição THEN
   BEGIN
     comando1;
     ...
     comandon
   END { --> note a falta do ";" }
   ELSE BEGIN
     comandok;
     ...
     comandoj
   END;
        

Vamos, agora, reescrever nosso programa anterior:

  PROGRAM adivinha;
  CONST valor = 5;
  VAR n : integer; {o chute do usuário}
      c : integer; {contador do for}

  BEGIN
    writeln('Você tem 10 chances');

    FOR c := 1 TO 10 DO
    BEGIN
      write('seu chute: ');
      readln(n);
      IF n = valor THEN
      BEGIN
        writeln('acertou"');
        c := 10
      END
      ELSE {n <> valor}
        IF n > valor THEN writeln('seu palpite foi maior')
        ELSE { n < valor }
          writeln('seu palpite foi menor')
    END
  END.
        

Viu como sumimos com uma comparação? Do modo modo como o programa estava, quando o usuário tinha acertado, ainda assim a máquina comparava para ver se era > e para ver se era <, uma perda de tempo.

Agora, se for =, a parte do ELSE não é executada.

Da mesma forma, antes, se era >, ainda assim fazia o teste para <, que daria falso. Agora esse teste não é feito.

Além desses ganhos, ganhamos com a lógica. Por que o terceiro if sumiu? Porque era desnecessário, veja:

Mas há um problema com o IF. Há uma ambigüidade que surge quando usamos IFs aninhados. Por exemplo:
   IF condição1 THEN
     IF condição2 THEN
       comando1
   ELSE comando2;
        

Quando comando2 será executado? Ou seja, o ELSE é de qual IF? Não deixe a edentação errada te enganar! Nesse caso, o computador casa o ELSE sempre com o último IF que não esteja impedido. Assim, comando2 será executado se condição1 for verdadeira e condição2 for falsa; e comando1 se ambas as condições forem verdadeiras.

E se fizermos assim:

   IF condição1 THEN
   BEGIN
     IF condição2 THEN
       comando1
   END
   ELSE comando2;
        

Nesse caso, o ELSE é do primeiro IF, pois isolamos o segundo dentro do corpo do primeiro, impedindo o segundo IF. Então comando2 é executado somente se condição1 for falsa.

No código seguinte:

   IF condição1 THEN
     IF condição2 THEN comando1
     ELSE comando2
   ELSE comando3;
        

comando1 é executado se condição1 e condição2 forem verdadeiras, comando2 se condição1 for verdadeira e condição2 for falsa, e comando3 se condição1 for falsa.

Note como a edentação deixa realmente o código mais legível.



AND

Suponha que queremos executar um comando somente quando duas condições, C1 e C2, forem verdadeiras. Queremos algo como:

   se C1 e C2 forem verdadeiras
   então faça comando
        

Como fazemos isso em Pascal?

   IF (C1) AND (C2) THEN comando;
        

Note os parênteses em volta das condições. Eles precisam estar aí.



OR

Suponha agora que queremos executar um comando quando uma de duas condições (ou ambas) forem verdadeiras. Então queremos algo assim:

   se C1 ou C2 forem verdadeiras,
   então faça o comando
        

Em Pascal isso é:

   IF (C1) OR (C2) THEN comando;
        

note novamente os parênteses.





‹— Parte VIIIPágina da disciplinaParte X —›