Expressões lógicas

Ver Todos os Exercícios

Teoria

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.

Beleza, mas qual é o motivo de termos que fazer operações lógicas quando estamos programando?

A verdade é que utilizaremos todos esses conceitos que nós acabamos de ver para criarmos condições em nosso programa. Nós fazemos isso através de um carinha chamado comando if, que nada mais é do que um comando condicional, mas não se preocupe com ele agora nós teremos um tópico especifico sobre isso aqui no Responde Aí.

Nesse momento, você só precisa entender como ele funciona em sua forma mais simples e como as expressões lógicas estão relacionadas com isso, olha só:

Conseguiu entender? Ao utilizarmos o comando if nós fomos capazes de definir dois blocos de execução que só serão executados dependendo do resultado da expressão lógica (que nesse caso verifica se as notas da prova e trabalho foram maior ou iguais a 6). Caso a expressão seja verdadeira, será impresso na tela que o aluno foi aprovado, caso contrário que o mesmo foi reprovado.

Legal, né? Por enquanto é isso, okay?! Valeuuuu!

Operador “or”

Operador “not”

Combinando operadores lógicos

Exercícios Resolvidos

Exercício Resolvido #1

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

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

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.

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

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

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

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.

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

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.

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

Analise o programa abaixo e, para cada uma das saídas (comandos print), detalhe passo a passo como o Python (segundo suas prioridades) resolveria as equações e o resultado final obtido.

Passo 1

Fala aí, doido! Se liga que nesse exercício a gente precisa analisar um código escrito, e não precisamos escrever nenhum código. Vamos começar olhando pro primeiro print(). Dentro dele só tem expressões matemáticas, então a gente pode usar nossos conhecimentos de matemática pra descobrir qual vai ser o resultado: é tudo uma questão de precedência. Tem vários operadores, mas qual vai ser a ordem de execução de cada um deles?!

Vamos pensar na notação que a gente tá acostumado! Assim, a gente tá ligado que primeiro temos que resolver a potenciação.

Vamos começar trocando as variáveis por seus respectivos valores (todos estão descritos no código, ok?!).

Agora, vamos resolvendo…

Beleza! Eu fiz com a calculadora, mas ok. Até aqui era só matemática mesmo, o próximo item que tenta complicar nossa vida.

Passo 2

Pra resolver a segunda etapa sim a gente vai precisar pensar um pouco mais. A ordem de precedência dos operadores são:

Isso significa que no segundo print(), primeiro serão realizados os cálculos matemáticos. Depois, os relacionais (>, =,

Beleza! Agora só sobraram operadores relacionais e lógicos. Vamos resolver os relacionais primeiro.

Lembra que operadores relacionais retornam valores booleanos, né?! (Verdadeiro e Falso, ou True e False). Agora, vamos resolver os operadores lógicos. Antes, vou deixar uma tabela verdade aqui pra gente dar uma coladinha:

Se liga que eu traduzi o nome dos operadores e abreviei True e False, jae? Beleza! Com essa informação, boa começar resolvendo o operador not (“não”, o operador lógico de maior precedência)!

Depois, resolvemos o and (“e”).

Por fim, vamos resolver o operador or (“ou”)!

Essa é a resposta do segundo print()! E é isso, finalizamos o exercício, maninho! Te vejo no próximo!

Resposta

238 e True.

Exercício Resolvido #7

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:

Passo 1

E aí! A gente precisa classificar o triângulo de acordo com seus ângulos.

Pra isso, bora começar perguntando pro usuário os ângulos, em graus, e guardando em variáveis. Vou chamar essas variáveis de a,b,c. Tipo assim:

Pronto! Agora, a gente pode usar estruturas condicionais pra verificar o tipo do ângulo.

Passo 2

Vamos começar checando se é um triângulo retângulo. Pra isso, a gente precisa que um dos ângulos seja igual a 90 graus. Ou seja, o ângulo a ou o b ou o c seja igual a 90.

Mano, se liga que o triângulo só pode ter uma das classificações do enunciado. Então, só uma das condições vai ser verdade. Então, a gente pode montar nossa estrutura condicional com elifs… Então já bora emendar com a segunda verificação: vamos checar se algum deles é maior que 90...

Pronto! Caso não seja nem reto e nem obtuso, então é um triângulo agudo. Pelo lógica, não precisamos fazer outra verificação, pois é a única opção. Podemos usar direto o else:

Mas repara que essa ordem não é obrigatória, beleza? Se a gente tivesse checado em odens diferentes, também daria no mesmo. Pra te provar, vou mudar de lugar a segunda e a terceira verificações.

Pronto, viu? Se todos os ângulos forem menores que 90, então é um triângulo agudo. Mas, no último caso, vai ser obtuso dessa vez. E, com isso, finalizamos o exercício!

Te vejo no próximo, doido! É nós!

Resposta

Exercício Resolvido #8

Escreva um programa para ler os valores das coordenadas cartesianas de um ponto e imprimir os valores lidos, seguidos do número (1 a 4) do quadrante em que o ponto está situado. Se o ponto estiver situado sobre um dos eixos, fornecer o valor -1. Se estiver sobre a origem, fornecer o valor 0.

Passo 1

É, aqui a gente vai precisar usar alguns ifs. Na verdade, vários!

Mas não se preocupe, vai dar bom! Vamos começar perguntando pro usuário os pontos X e Y. Pra isso, a gente vai usar a função input().

Mas se liga que a gente precisa converter pra um tipo numérico, hein! Aqui eu optei por usar números inteiros porque acho que faz mais sentido nesse caso. A professora não falou nada sobre também, então a gente escolhe o que quiser...

Pronto! Agora, a gente só precisa descobrir qual é o quadrante!

Passo 2

Cara, a primeira verificação que a gente pode fazer é se o ponto tá na origem, ou seja, ambas coordenadas iguais a 0. Nesse caso, o enunciado manda a gente definir o quadrante como 0. Tipo assim:

Pronto! Se os dois forem iguais a zero, definimos o quadrante como 0. Agora, no enunciado também fala que se pelo menos um estiver em cima do eixo (for igual a zero), o quadrante deve retornar -1. Então, vamos fazer um elif e checar essa condição!

Agora sim! Se os dois forem iguais a 0 o quadrante é 0, mas se só um for, o quadrante é -1. Agora, a gente checa os casos onde x e y são diferentes de zero. Mas antes, vamos dar uma revisada nos sinais do plano cartesiano:

Obs: lembrando que o par tá na ordem (x,y).

Vamos começar verificando se x é maior ou menor que zero.

E ai, dentro de cada escopo a gente pode fazer outro if aninhado pra verificar a situação da coordenada y.

Dessa forma a gente consegue todas as combinações, e aí a gente pode definir de boas qual o quadrante!

E só falta a gente exibir essa informação pro usuário no fim...

Passo 3

Agora, pra exibir pro usuário, a gente vai confiar na função print(). Junto com ela, a gente vai usar formatação de string pra facilitar o processo de concatenação dos nossos dados. Olha como fica +/-:

Resposta