x
MAC2166 - Introdução à Computação
x
08/04/2014 - Aula 5
x
Expressões lógicas: o tipo bool
e os operadores lógicos and
, or
e not
x
Uma expressão lógica é uma expressão que tem somente dois valores possíveis como resultado: verdadeiro ou falso.
Expressões desse tipo são construídas, por exemplo, por meio de operadores de comparação, como ==, !=, >, >=, <
e <=
, e operadores lógicos (que veremos mais adiante nesta aula).
12 == 12
True
12 == 13
False
x
Em aulas anteriores, usamos algumas expressões lógicas simples para indicar a condições de execução dos laços while
e das execuções condicionais if-elif-else
.
O resultado de uma expressão lógica é sempre do tipo bool
:
resultado = 12 == 12
print(resultado, type(resultado))
True <class 'bool'>
x
True
e False
são valores especiais, os únicos possíveis no tipo bool
:
print(type(True))
print(type(False))
<class 'bool'> <class 'bool'>
x
Portanto, True
e False
não são strings (True
não é a mesma coisa que "True"
).
Para construir expressões lógicas, podemos usar também operadores lógicos. Existem três operadores lógicos: and
, or
e not
.
O significado desses operadores é bastante intuitivo, uma vez que ele
equivale à interpretação que fazemos deles na língua inglesa (e também
das suas traduções para a língua portuguesa).
Exemplos:
x > 0 and x < 10
A expressão acima só é verdadeira (ou seja, o resultado é True
) somente quando duas condições são satisfeitas ao mesmo tempo: x
é maior que 0 e x
e menor que 10.
n%2 == 0 or n%3 == 0
A expressão acima é verdadeira quando pelo menos uma das condições é verdadeira, ou seja, quando n
é divisível por 2 ou quando n
é divisível por 3
. Note que se n
for divisível por 2 e por 3 ao mesmo tempo, a expressão continua sendo verdadeira.
not (x > y)
Na expressão acima, o operador not
nega o resultado da expressão lógica entre parênteses. Portanto, o resultado só será verdadeiro se x
não for maior que y
, ou seja, se x
for menor ou igual a y
.
As interpretações providas acima são apropriadas quando os operandos usados para o operador lógico são valores do tipo bool
ou uma expressão cujo o resultado é um bool
.
Mas Python não restringe o uso dos operadores lógicos apenas para operandos do tipo bool
. Portanto, existe uma outra que é mais conveniente para os casos em que pelo menos um dos operandos não é um bool
:
Na expressão
x and y
, primeiro ox
é avaliado. Se ox
é falso, então o seu valor é devolvido como resultado da operação deand
. No caso contrário,y
é avaliado e o valor resultante será o resultado da operaçãoand
.Na expressão
x or y
, primeiro ox
é avaliado. Se ox
é verdadeiro, então o seu valor é devolvido como resultado da operação deand
. No caso contrário,y
é avaliado e o valor resultante será o resultado da operaçãoand
.
Além disso, em uma expressão lógica, os valores 0 (int
), 0.0 (float
) e "" (str
) são considerados equivalentes ao valor booleano False
. Qualquer coisa diferente deles é considerado equivalente a True
.
Veja os exemplos a seguir:
x = 5
x > 0 and x < 10
True
0.0 and x == 5
0.0
17 and x == 5
True
x == 5 and 17
17
17 or x == 6
17
not(17) or x == 6
False
not(17) or 18
18
x
Os operadores lógicos tem menor precedência que os operadores matemáticos. Assim, em uma expressão, primeiro são avaliados os operadores matemáticos (de acordo com as regras de precedência que vimos na aula passada), e só depois são avaliados os operadores lógicos. O ordem de precedência (da maior para a menor) para os operações lógicas é a seguinte:
not
and
or
x
Problema 8
x
Dados um número inteiro n > 0
e as médias de n
alunos, determinar quantos ficaram de recuperação. Um aluno está de recuperação se sua média estiver entre 3,0
e 5,0
(nota máxima é 10,0
).
n = int(input("Digite n: "))
rec = 0
cont = 0
while cont < n:
media = float(input("Digite uma nota: "))
if media >= 3.0 and media < 5.0: # essa condição equivale a: 3.0 <= media < 5.0:
rec = rec + 1
cont = cont + 1
print(rec, "alunos ficaram de recuperação")
x
Problema 9
x
Dados um número inteiro n
, n > 0
, e uma sequência com n
números inteiros, verificar se a sequência está em ordem crescente.
n = int(input("Digite o tam da seq: "))
cresce = True
ant = int(input("Digite um num da seq: "))
n = n - 1
while n > 0 and cresce:
atual = int(input("Digite um num da seq: "))
n = n - 1
if ant >= atual:
cresce = False
ant = atual
if cresce:
print("Sequência crescente")
else:
print("Sequência não é crescente")
x
Na solução acima, é importante destacarmos a variável cresce
, que atua no programa como um indicador de passagem.
Um indicador de passagem é uma variável que inicia com um determinado
valor e, caso o evento que ele marca ocorra, seu valor é alterado e não
muda mais. Esse é o caso da variável cresce
, que é iniciada com o valor True
e só é modificada para False
quando o programa identifica que um número que "quebra a sequência de
números crescentes" foi fornecido como entrada. Ao final da execução do
laço while
, se cresce
estiver com o valor False
então ela indicará que foi encontrado na sequência de entrada um número que quebrou a ordem crescente.
O indicador de passagem é um padrão frequentemente usado em programação; ele identifica a occorência de um evento que impacta o fluxo de execução do programa. Por isso, é importante compreender muito bem como ele funciona.
x
Problema Extra
x
Dado um número inteiro n>0
, verificar se este número contém dois dígitos adjacentes iguais.
n = int(input("Digite um número: "))
iguais = False
d_ant = n % 10
n = n // 10
d = 0
while n > 0 and not iguais:
d_atual = n % 10
n = n // 10
if d_atual == d_ant:
iguais = True
d_ant = d_atual
if iguais:
print("Contém números adjacentes iguais")
else:
print("Não contém números adjacentes iguais")
x
Tópicos vistos na Aula 5
- tipo
bool
, valores booleanosTrue
eFalse
- operadores lógicos
and
,or
enot
- expressões lógicas
- indicador de passagem
x
Referências e outros materiais para estudo
- Computer Science Circles >> http://cscircles.cemc.uwaterloo.ca/
- Think Python - How to Think Like a Computer Scientist >> http://www.greenteapress.com/thinkpython/thinkpython.html
- Projeto MacMulti - Listas de exercícios (Introdução à Computação) >> http://www.ime.usp.br/~macmulti/exercicios/