MC102 |
O COMANDO IF |
Suponha que queremos um programa onde o usuário adivinha um número que definimos. Como fazemos isso?
|
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:
|
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.
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:
|
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:
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.