Expressões lógicas

Teoria Completa

Revisão dos operadores relacionais

Fala aí! A gente trocou uma ideia maneira sobre expressões relacionais no tópico de dados booleanos, e falamos sobre os operadores comparativos e seus resultados. Tu lembra?! Bora revisar! Olha esses exemplos aqui:

O resultado da expressão é True caso seja verdade, ou False, se não for. Mas nem sempre a gente quer o resultado de uma só expressão, queremos fazer operações que relacionam um ou mais valores booleanos. As operações com valores Booleanos (álgebra booleana) requerem um pouco de lógica, que a gente vai aprender aqui! Mas antes, vou te apresentar os personagens da aula.

Os nomes dos personagens são, respectivamente, Sasuke, Naruto e Sakura. Vamos usar esses nomes nos próximos exemplo, ok?! :)

Operador “and”

O operador “and” significa “e” mesmo, exatamente como nas linguagens humanas. Esse operador diz quando dois valores booleanos são verdadeiros. Mas calma, eu vou te explicar a lógica.

Imagina que o Naruto e o Sasuke estão de boas na aula de Cálculo Ninja IV, e você é o professor!

Aí eu pergunto pra você o seguinte: “cara, o Naruto e o Sasuke estão na aula?”

Sua resposta seria “sim”, certo? Isso porque os dois estão na aula. Mas se o Naruto for no banheiro por um instante e a Sakura tomar o lugar do Naruto, a resposta seria diferente.

Nesse caso, eu te pergunto de novo. O Naruto e o Sasuke estão na aula?! A resposta é “não”. Apenas o Sasuke está, mas o Naruto não, certo?! Pra que a resposta dessa pergunta seja sim, as duas proposições devem ser verdade.

Essa tabelinha se chama tabela verdade, e ela relaciona todos os possíveis valores das variáveis e suas o resultado da expressão. É exatamente assim que o operador “and” funciona, e vou te mostrar como usar esse operador em Python. VEM COMIGO PRO EDITOR!

Operador “or”

Além do “and” tem o operador “or”, que também tem o mesmo significado da linguagem humana, “ou”. Vamos voltar pra sala de aula de cálculo ninja?!

O Naruto ou a Sakura estão na sala?! A resposta é “sim”! Apesar do Naruto não estar presente, a Sakura tá lá! O operador “or” só precisa que UMA das condições seja verdadeira.

O operador “or” pode ser usado em Python da seguinte forma:

Operador “not”

De todos, esse é o mais simples. O operador “not” nega a condição que foi dada, invertendo a resposta final. Ficou confuso?! Beleza! Partiu sala de aula!

É verdade que o Naruto não está na aula?! A resposta é “não”. O Naruto está sim na aula! O uso do “não” na pergunta fez com que a gente tivesse que inverter a resposta também!

Diferente dos outros operadores relacionais que a gente viu até agora, o “not” é unário. Ser unário significa que só precisa de uma proposição pra funcionar.

Os outros operadores que vimos eram binários, pois precisavam de duas proposições. Vou te mostrar como se usa esse operador aqui em baixo:

Combinando operadores lógicos

Assim como na matemática a gente pode usar vários operadores na mesma expressão, aqui a gente também pode!

É verdade que a (Sakura e o Sasuke) ou o Naruto não estão na sala de aula?! Repara que eu usei parênteses () ali pra enfatizar a precedência. Com o uso de parênteses você pode dizer qual condição você quer que seja verificada primeiro, beleza?!

A tabela verdade da seguinte pergunta tá aqui:

Nessa tabela eu to usando “T” e “F” em vez de “sim” e “não”. Mas a ideia é a mesma, é mais pra você já ir acostumando com os termos em inglês. Assim, essa tabela mostra o resultado final da expressão de acordo com as combinações nos valores das variáveis Naruto, Sakura e Sasuke. Repara que as operações foram feitas uma de cada vez, desde o parênteses mais interno até o mais externo. No fim, chegamos a um valor lógico pra expressão. Em Python, um dos casos:

Mas é claro, onde a gente colocou True e False nas variáveis, podíamos ter feito com expressões relacionais. Essas expressões resultam em valores booleanos, e aí a gente ia conseguir fazer as operações lógicas.

Por enquanto é isso, okay?! Valeuuuu!

Expandir

Exercício Resolvido #1

Codesdope - adaptado

Sem usar o interpretador, determine o resultado das seguintes expressões:

  • not(True and True)
  • True or False
  • not(False and True)
  • False and False
MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, doido! Estou BOLADO porque a gente não pode usar o interpretador pra resolver essa questão.

Mas, ok. Bora começar analisando a primeira expressão:

Cara, não se esqueça que os parênteses sempre tem a mais alta precedência. Então, a gente precisa resolver o que tem dentro dos parênteses primeiro. E o operador que a gente vai ter que resolver é o “and”. Esse operador checa se os dois lados do operador são True, exatamente como tá ali. Nesse caso, o resultado é True também. Mas olha aqui uma tabela ilustrando outras situações com esse operador:

Nosso caso era o “Sim e Sim” (ou “True and True”), e, nesse caso, o resultado é “Sim” (ou “True”). Então, agora nossa expressão virou essa:

E agora a gente deu de cara com o operador not. Esse operador simplesmente inverte o valor verdade que tem em seguida. Ou seja, True vira False e False vira True. Nesse caso, o resultado final da expressão é False.

Bora dar uma olhada na segunda expressão do enunciado!

Passo 2

Agora, meu rei, a expressão é essa:

E o operador “ou” (or) retorna um resultado verdadeiro quando PELO MENOS um dos elementos é True. Nesse caso, o da esquerda é True. Por isso, o resultado da expressão vai ser True também.

Mas eu também vou deixar aqui a tabelinha pra você recordar do resultado das outras situações com esse operador:

Pronto! Falta só mais duas… Tamo indo bem! Vem comigo...

Passo 3

A próxima expressão é a seguinte:

Mano, esse é bem parecida com a primeira, po! Primeiro a gente resolve o que tá dentro do parênteses seguindo a regrinha do operador and: só é verdadeiro quando ambos são. Nesse caso, como tem um False e um True, o resultado é False!

E mais uma vez a gente caiu no operador de negação. Mas ele é o mais fácil de todos, lembra?! A gente só precisa inverter o valor verdade que vem em seguida.

E esse é o resultado da expressão! Só falta uma agora, hein...

Passo 4

A última expressão lógica é a seguinte:

Mais uma vez com o operador and. Acabamos de conversar sobre a regra desse operador, hein! Só retorna verdadeiro quando ambos valores verdade são True. Se tiver PELO MENOS um False, o resultado é False. Assim como nesse caso:

E assim a gente termina o exercício! Te vejo no próximo, hein, doido! BORAA

Resposta

Exercício Resolvido #2

Elaboração Própria

Escreva um programa para caixas de cinema. Seu programa deve receber a idade do usuário e se este é estudante. Com esses dados, exiba o preço do ingresso conforme a seguinte tabela:

  • Estudante ou idoso (acima de 65 anos) pagam R$15,00.
  • Preço normal: R$30,00.
MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aí, doido! A gente precisa perguntar pro cara a idade e se ele é estudante ou não. Então, bora já lançar nossas funções input() pra pegar esses dados.

Agora, com esses dados, vamos verificar se o cara vai pagar só meia entrada ou inteira. Pra pagar meia, o cara precisa ser estudante ou ter acima de 65 anos. Vamos fazer essas verificações dentro de uma estrutura condicional.

Mas caso o cara não atenda aos pré-requisitos, então ele vai pagar o ingresso integralmente. Então, pra definir um escopo de condição contrária ao if, a gente usa a palavra-chave else.

E a gente pode colocar, direto no if, um print() exibindo quanto será cobrado, assim como solicitado pelo enunciado.

E pronto! Show de bolinhas! Te vejo no próximo exercício pra gente treinar mais, ok?! Nós se vê por aí!

Resposta

Exercício Resolvido #3

Elaboração própria

Escreva um programa que receba três números e exiba o maior deles.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aí, doido! Cara, a ideia dessa questão é tirar ponto nosso por redundância nas estruturas condicionais, então bora praticar pra você entender na moral o que isso significa e como evitar, jae?

Mas bora começar do começo! A gente precisa perguntar pro usuário três números, então bora perguntar com a função input().

Se liga que a gente quer números, então precisamos fazer uma conversão de tipos ali. Show! Agora que começa a treta real…

Passo 2

Pô, bora começar tentando descobrir se o número A é o maior de todos. E, bom, pro A ser o maior, ele precisa ser maior que o B e que o C, né? Tipo assim:

Se o A for maior que os outros 2, então é o maior de todos… Mas, caso não seja, a gente precisa verificar outro número. E é aqui que a gente pode perder ponto. Se liga, vem comigo… Se o A não é o maior, pode parecer intuitivo fazer a mesma verificação pro B agora. Desse jeito:

Essa solução funciona, e tá certa. Mas, a gente tá dando um trabalho desnecessário pro computador.

Olha, pensa comigo… Na primeira condicional a gente verificou se o A era o maior de todos, lembra? E o if só executa um dos blocos condicionais. Isso significa que, se o programa chegar no elif, já significa que “A” NÃO É o maior número de todos. Se fosse, o programa não teria chegado até o elif. Por isso, no elif, a gente sabe que o maior de todos só pode ser o B ou o C.

Então, a gente só precisa comparar esses dois! Tipo assim:

Pronto! Esse programa funciona exatamente igual ao anterior, a única diferença é que esse é menos trabalhoso, porque a gente tá fazendo uma verificação a menos. E, por último, se liga que a gente já checou se o A era o maior e depois checou se o B era o maior. Cara, no último caso a gente nem precisa fazer verificação nenhuma. Até porque, se nem o A e nem o B era o maior, então só resta o C.

E pronto! Finalizamos o exercício, doido! Não esquece de prestar atenção nesses detalhes quando estiver fazendo sua prova, beleza?! A gente aqui do Responde Aí tá torcendo por você.

Valeu! Até o próximo exercício.

Resposta

Exercício Resolvido #4

Pense Python - adaptado

Sabendo que um ano é bissexto deve ser múltiplo de 4 mas não pode ser múltiplo de 100, a menos que seja também múltiplo de 400, escreva um programa que pergunte um ano e exiba se é bissexto ou não.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Fala aí, meu consagrado! Se liga que aqui a ideia é a gente lançar um if pra verificar se é bissexto ou não.

Porém, o fato de ter mais de uma condição complica bastante as coisas. Mas, que tal a gente começar perguntando o ano pro usuário?!

Pronto! Mas repara que a gente já converteu o ano digitado direto pra inteiro, beleza? Até porque, é um número mas a gente não usa casas decimais no ano.

Agora a gente vai checar se é bissexto ou não.

Passo 2

Pô, o enunciado já deu pra gente spoiler de quais verificações a gente tem que fazer. Vamos começar digitando a expressão que verifica se é múltiplo de 4 ou não:

A gente pode fazer isso checando o resto da divisão inteira. Se o resto da divisão inteira por 4 for igual a 0, então é múltiplo de 4. Mas a gente precisa que seja múltiplo de 4 e, ao mesmo tempo, NÃO seja múltiplo de 100. Então, vamos colocar um and ali!

Pronto! Agora, no nosso escopo a gente tem o ano que é múltiplo de 4 e não é de 100. Mas ainda falta mais uma das condições que estão escritas no enunciado. É que, a gente só precisa checar essas condições se o ano NÃO for múltiplo de 400. Ou seja, pra ser bissexto, é preciso ser múltiplo de 400 OU (múltiplo de 4 e não múltiplo de 100).

Então, a gente já pode lançar um print e falar pro usuário que o ano é bissexto!

Prontinho! Nosso programa é capaz de descobrir quando um ano é bissexto. Mas o enunciado também manda falar caso não seja bissexto. E, pra essa condição, a gente pode usar o else. Ou seja, se não for bissexto...

Aí a gente exibe uma mensagem que não é bissexto, ué!

E foi! Concluímos a questão, ok?! Te vejo na próxima, doido! Valeuuu

Resposta

Exercício Resolvido #5

UFF - Lista 4 (Profª Vanessa)

Faça um programa que lê três valores. Se todos forem positivos, calcule e imprima a área do trapézio que tem A e B por bases, e C por altura.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

E aí, doido! Realmente, pra gente calcular área de um trapézio, todos as suas medidas tem que ser positivas. Aqui a ideia é a gente fazer nosso programa checar, antes de calcular, se essa condição tá sendo atendida.

Então bora começar do começo, maninho. Vamos perguntar os dados A, B e C pro usuário usando a função input();

Show! Com esses valores, a gente já pode calcular a área. Mas vamos montar nossa estrutura condicional pra checar se todos são positivos antes!

A gente checou se os três são positivos ao mesmo tempo usando o operador “and” pra montar nossa expressão dentro de um só if. Agora, a gente só precisa calcular a área.

Passo 2

Pra calcular a área, é de extrema importância que a gente saiba a fórmula. O google nunca falha:

Adaptando as variáveis da fórmula pras variáveis que a gente tem no código, fica assim:

Sabendo disso, a gente pode escrever ela no nosso código.

E agora a gente pode exibir o valor calculado com a função print()!

Obs: eu também usei uma formatação de string ali.

Beleza! Agora, vamos também exibir uma mensagem de erro caso um dos valores não seja positivo. Repara que esse é o caso contrário ao if que a gente declarou, então a gente só precisa da palavra-chave else.

E pronto! Finalizamos nosso exercício, doido! e vejo no próximo, ok?! É nóssss

Resposta

Exercício Resolvido #6

IFC, Prof. Marcelo Cendron

Escreva um programa que leia o valor de 3 ângulos de um triângulo e escreva se o triângulo é Acutângulo, Retângulo ou Obtusângulo. Sendo que: