|
MC102 |
| TIPO BOOLEAN |
Variáveis booleanas são variáveis capazes de conter apenas 1 de 2 valores: verdadeiro ou falso.
Como as condições no IF retornam verdadeiro ou falso são chamadas booleanas. Note que, em x > 2, x não é booleano, mas o resultado da expressão é.
Como defino uma variável booleana?
VAR v : boolean; |
E como abasteço um valor nessa variável? Assim, a forma geral do comando IF é:
PROGRAM abastece;
var b1,b2 : boolean;
a,b,c : integer;
BEGIN
a := 2;
b := 3;
c := 1;
b1 := true;
b2 := false;
b2 := a > b; {aqui b2 é "false", pois a é menor que b}
b1 := (a>b) AND (b>c); {b1 recebeu false, confira}
b2 := (a>b) OR NOT (b>c);
etc
END.
|
Opa! Quem é esse NOT? É a negação!
NOT true = false NOT false = true |
Vejamos um exemplo: suponha que queremos que b1 seja verdadeira se b2 for falsa e vice-versa. Como farei? Um modo horrendo é:
IF b2 THEN b1 := false ELSE b1 := true; |
Mas isso pode, e DEVE, ser substituído por:
b1 := NOT b2; |
O efeito é o mesmo, confira, e o programa fica menor.
Note também que não fiz:
IF b2 = true THEN b1 := false
ELSE b1 := true;
|
Por que? Porque é redundante. Quando o IF acima será executado? Quando o resultado de (b2 = true) for verdadeiro, ou seja, true. E, para que isso ocorra, que valor b2 deve ter? true. Então b2 = true equivale a simplesmente ler o valor de b2.
Mas e se quiséssemos que algo fosse executado se uma variável for false? Abaixo você vê as duas maneiras, a segunda é preferível:
modo 1:
IF b1=false THEN faz algo;
modo 2:
IF NOT b1 THEN faz algo
|
Agora confira e veja que as duas formas agem da mesma maneira: se a condição for verdadeira, faz e, para a condição ser verdadeira, ou b1 é false ou NOT b1 é verdadeiro => b1 é false.
| OPERADORES BOOLEANOS |
AND, OR e NOT sao operadores booleanos, porque agem em expressoes ou variaveis booleanas.
Suponha que temos duas variaveis booleanas a e b, a seguir temos uma tabela com seus valores e os resultados das operaçoes:
| a | b | a AND b | a OR b | NOT a | NOT b |
|---|---|---|---|---|---|
| True | True | True | True | False | False |
| True | False | False | True | False | True |
| False | True | False | True | True | False |
| False | False | False | False | True | True |
Ou seja:
|
|
|
Essas tabelas sao chamadas de tabelas verdade.
Lembra do nosso programa de chute? Suponha que, ao final do programa queiramos dizer que acabaram-se as chances do usuario, mas queremos dizer isso somente se ele errou todas as vezes. Vomo fazemos? Veja abaixo:
PROGRAM chute;
CONST num = 5; {valor a ser adivinhado}
VAR n : integer; {o chute do usuário}
c : integer; {contador do for}
acertou : boolean; {indica se o usuario acertou}
BEGIN
writeln('Você tem 10 chances');
acertou := false;
FOR c := 1 TO 10 DO
BEGIN
write('seu chute: ');
readln(n);
IF n = valor THEN
BEGIN
writeln('acertou"');
acertou := true;
c := 10
END;
if n > valor then writeln('seu palpite foi maior');
if n < valor then writeln('seu palpite foi menor')
END;
IF NOT acertou THEN writeln('suas chances acabaram');
END.
|
Por fim, lembre que as únicas operações permitidas em booleanos são AND, OR e NOT. +, - etc não funcionam porque não tem lógica, afinal, quanto é true + 1? E true + false?
| TIPO REAL |
As mesmas operações permitidas com integer podem ser usadas com real. Vale lembrar que "-" pode indicar subtração de dois valores ou indicar que o valor é negativo:
x := 2.5 - 1.43;
x := -3.12;
|
Agora vamos ver uma aplicação: vamos calcular quanto tempo passa, pela relatividade, em uma nave se movendo a uma velocidade v, enquanto que na Terra passaram n horas.
A fórmula é:
| Tn = TT √(1 - v²/c²) |
onde Tn é o tempo na nave, TT é o tempo na Terra e c é a velocidade da luz no vácuo.
Mas, peraí! Como calculo o quadrado e a raíz?
x := sqr(y); x recebe y² x := sqrt(y); x recebe √y |
lembre-se de que x deve ser real. Naturalmente, x := y*y; também funciona.
Então o programa fica:
PROGRAM relat;
CONST c = 300000; {km/s}
VAR tt : real; {tempo na terra (s)}
tn : real; {tempo na nave (s)}
v : real; {velocidade da nave (km/s)}
BEGIN
write('vel (km/s): );
readln(v);
tt := 60; {1 minuto}
tn := tt * sqrt(1 - (sqr(v) / sqr(c)));
writeln('t na nave é: ',tn:4:2,' s, t na terra é ',tt:4:2,' s')
END.
|
| CONVERSÃO DE TIPOS |
Como fazemos para converter entre real e integer? Para isso, pascal tem as seguintes regras:
VAR a : integer;
b : real;
BEGIN
b := a;
b := a/2;
etc
END.
|
Mas como convertemos de real para integer? Depende do que você quer que seja feito com o número. Podemos:
Se quisermos truncar:
x := trunc(4.7); x terá 4 |
Se quisermos arredondar:
x := round(4.7); x terá 5 |
A forma geral das funções é:
Trunc(x : real) : longint Round(x : real) : longint |
o que significa que trunc e round recebem um valor real edevolvem um longint.
Mas, e se o número for negativo? Nada muda:
Trunc(-expressão) = -Trunc(expressão) Round(-expressão) = -Round(expressão) |
Naturalmente, qualquer expressão real pode ser usada dentro de trunc ou round. Vejamos alguns exemplos:
| Valor | Trunc(valor) | Round(valor) |
|---|---|---|
| 5.0 | 5 | 5 |
| 4.5 | 4 | 5 |
| 4.99999 | 4 | 5 |
| 4.49999 | 4 | 4 |
| 4.2 | 4 | 4 |
| 4.7 | 4 | 5 |
| -5.0 | -5 | -5 |
| -4.5 | -4 | -5 |
| -4.2 | -4 | -4 |
| -4.7 | -4 | -5 |