MC102
Algoritmos e Programação de Computadores
Parte X



Norton Trevisan Roman




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:

AND True False
True True False
False False False
OR True False
True True True
False True False
NOT
True False
False True

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:

Então, o seguinte vale:
  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:

Ou seja, ou arredondo, ou trunco. No caso do último, só a parte inteira é considerada.

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





‹— Parte IXPágina da disciplinaParte XI —›