| | | | |

2.5 Dados Booleanos

Compre o e-book deste material aqui!

Em Python, os valores lógicos são o True (verdadeiro) e o False (falso). Pertencem a uma subclasse dos números inteiros, com 1 correspondendo a True e 0 a False. Em referência ao matemático George Boole1616endnote: 16George Boole, 1815 - 1864, matemático britânico. Fonte: Wikipédia: George Boole., estes dados são chamados de booleanos.

Normalmente, eles aparecem como resultado de expressões lógicas. Por exemplo:

12/3 < 3/4
True
17/5 > 13/9
False

2.5.1 Operadores de Comparação

Python possui operadores de comparação que retornam valores lógicos, são eles:

  • < menor que

    12 < 3
    True
    
  • <= menor ou igual que

    14 <= 2**2
    True
    
  • > maior que

    15 > 7
    False
    
  • >= maior ou igual que

    12*5 >= 10
    True
    
  • == igual a

    19**2 == 81
    True
    
  • != diferente de

    181 != 9**2
    False
    
Observação 2.5.1.

(Precedência de operações.) Os operadores de comparação <, <=, >, >=, ==, != tem a mesma ordem de precedência e estão abaixo da precedência dos operadores numéricos básicos.

Exemplo 2.5.1.

A equação da circunferência de centro no ponto (a,b) e raio r é

(xa)2+(yb)2=r2. (2.37)

Um ponto (x,y) está no disco determinado pela circunferência, quando

(xa)2+(yb)2r2 (2.38)

e está fora do disco, noutro caso.

O seguinte código verifica se o ponto dado (x,y)=(1,1) está no disco determinado pela circunferência de centro (a,b)=(0,0) e raio r=1.

1# ponto
2x = 1
3y = 1
4
5# centro circunferência
6a = 0
7b = 0
8# raio circunferência
9raio = 1
10
11# verifica se está no disco
12v = (x-a)**2 + (y-b)**2 <= raio**2
13
14# imprime resposta
15print('O ponto está no disco?', v)

Comparação entre Pontos Flutuantes

Números decimais são arredondados para o número float(ponto flutuante) mais próximo na máquina1717endnote: 17Consulte a Subseção 2.4.2 para mais informações.. Com isso, a comparação direta entre pontos flutuantes não é recomendada, em geral. Por exemplo,

10.1 + 0.2 == 0.3
False

Inesperadamente, este resultado é esperado na aritmética de ponto flutuante! :)

O que ocorre acima, é que ao menos um dos números (na verdade todos) não tem representação exata como ponto flutuante. Isso faz com que a soma 0.1 + 0.2 não seja exatamente computada igual a 0.3.

O erro de arredondamento é de aproximadamente1818endnote: 18Épsilon de máquina ε2,22×1016. 1016 para cada entrada. Conforme operamos sobre pontos flutuantes este erro pode crescer. Desta forma, o mais apropriado para comparar se dois pontos flutuantes são iguais (dentro do erro de arrendamento de máquina) é verificando se a distância entre eles é menor que uma precisão desejada, por exemplo, 1015. No caso acima, podemos usar o método abs:

1abs(x - 0.3) <= 1e-15
True

2.5.2 Operadores Lógicos

Python tem os operadores lógicos (ou operadores booleanos):

  • and e lógico

    13 > 4 and 3 <= 4
    False
    
    Tabela 2.1: Tabela verdade do and.
    A B A and B
    True True True
    True False False
    False True False
    False False False
  • or ou lógico

    13 > 4 or 3 <= 4
    True
    
    Tabela 2.2: Tabela verdade do or.
    A B A or B
    True True True
    True False True
    False True True
    False False False
  • not negação lógica

    1not(3 < 2)
    True
    
    Tabela 2.3: Tabela verdade do not.
    A not A
    True False
    False True
Observação 2.5.2.

(Precedência de operações.) Os operadores booleanos tem a seguinte ordem de precedência:

  1. 1.

    not

  2. 2.

    and

  3. 3.

    or

São executados em ordem de precedência menor que os operadores de comparação.

Exemplo 2.5.2.

Sejam os discos determinados pelas circunferências

c1 :(xa1)2+(y+b1)2=r12, (2.39)
c2 :(xa2)2+(y+b2)2=r22, (2.40)

onde (a1,b1) e (a2,b2) são seus centros e r1 e r2 seus raios, respectivamente.

Assumindo, que a circunferência c1 tem

c1:(a1,b1)=(0,0),r1=1 (2.41)

e a circunferência c2 tem

c2:(a2,b2)=(1,1),r2=1, (2.42)

o seguinte código verifica se o ponto (x,y)=(12,12) pertence a interseção dos discos determinados por c1 e c2.

1# circunferência c1
2a1 = 0
3b1 = 0
4r1 = 1
5
6# circunferência c2
7a2 = 1
8b2 = 1
9r2 = 1
10
11# ponto obj
12x = 0.5
13y = 0.5
14
15# está em c1?
16em_c1 = (x-a1)**2 + (y-b1)**2 <= r1**2
17
18# está em c2?
19em_c2 = (x-a2)**2 + (y-b2)**2 <= r2**2
20
21# está em c1 e c2?
22resp = em_c1 and em_c2
23print('O ponto está na interseção de c1 e c2?', resp)
Observação 2.5.3.

(Ou exclusivo.) Presente em algumas linguagens, Python não tem um operador xor (ou exclusivo). A tabela verdade do ou exclusivo é

A B A xor B
True True False
True False True
False True True
False False False

A operação xor pode ser obtida através de expressões lógicas usando-se apenas os operadores and, or e not. Consulte o Exercício 2.5.9.

2.5.3 Exercícios

E. 2.5.1.

Considerando a linguagem Python, complete as lacunas.

  1. a)

    True é o valor lógico verdadeiro.

  2. b)

    False é o valor lógico falso.

  3. c)

    O operador de igualdade é o ==.

  4. d)

    1.275 != 1.275 retorna o valor booleano False.

Resposta.

a) True. b) falso. c) ==. d) !=.

E. 2.5.2.

Sem implementar, complete as lacunas.

  1. a)

    8 * 2 < 3 retorna o valor False.

  2. b)

    2 * 8 > 9 retorna o valor True.

  3. c)

    4 >= 3**2 retorna o valor False.

  4. d)

    16 == 16 // 8 retorna o valor False.

Resposta.

a) False. b) True. c) False. d) False.

E. 2.5.3.

Complete as lacunas.

  1. a)

    True and True retorna o valor True.

  2. b)

    False or True retorna o valor True.

  3. c)

    not (5 > 3) retorna o valor False.

Resposta.

a) True. b) True. c) False.

E. 2.5.4.

Compute as seguintes expressões:

  1. a)

    16>6

  2. b)

    32<43

  3. c)

    31,415×101==3.1415

  4. d)

    2,71282+23

  5. e)

    32+7824+1416

Resposta.

a) 1 - 6 > -6 b) 3/2 < 4/3 c) 31.415e-1 == 3.1415 d) 2.7128 >= 2 2/3+ e) 3/2 7/8 <= (24 + 14)/16+

E. 2.5.5.

Desenvolva um código que verifica se um número inteiro x dado é par. Teste-o para diferentes valores de x.

Resposta.
1x = 3
2print('É par?')
3print(x % 2 == 0)
E. 2.5.6.

Considere um quadrado de lado l dado e uma circunferência de raio r dado. Desenvolva um código que verifique se a área do quadrado é menor que a da circunferência. Teste o seu código para diferentes valores de l e r.

Resposta.
1# quadrado
2ladoQuad = 1
3areaQuad = ladoQuad**2
4
5# aprox pi
6pi = 3.14159
7
8# circunferência
9raioCirc = 1
10areaCirc = pi * raioCirc**2
11
12# verifica
13resp = areaQuad < areaCirc
14print('Área do quadrado é menor que da circunferência?')
15print(resp)
E. 2.5.7.

Considere o plano cartesiano xy. Desenvolva um código que verifique se um ponto (x,y) dado está entre a curvas y=(x1)3 e o eixo das abscissas1919endnote: 19Eixo x.. Verifique seu código para diferentes pontos (x,y).

Resposta.
1# ponto
2x = 2
3y = 0.5
4
5# y >= 0 e y <= f(x) ?
6resp1 = y >= 0 and y <= (x-1)**3
7# y >= f(x) e y <= 0 ?
8resp2 = y >= (x-1)**3 and y <= 0
9
10# conclusão
11print("O ponto está entre as curvas?")
12print(resp1 or resp2)
E. 2.5.8.

Sejam A e B valores booleanos. Verifique se as seguintes expressões são verdadeiras (True) ou falsas (False):

  1. a)

    A or A == A

  2. b)

    A and not(A) == True

  3. c)

    A or (A and B) == A

  4. d)

    not(A and B) == (not(A) or not(B))

  5. e)

    not(A or B) == (not(A) or not(B))

Resposta.

a) True. b) False. c) True. d) True. e) False.

E. 2.5.9.

Sejam A e B valores booleanos dados. Escreva uma expressão lógica que emule a operação xor (ou exclusivo) usando apenas os operadores and, or e not. Dica: consulte a Observação 2.5.3.

Resposta.

(A or B) and not(A and B)


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!