IEC037 Introdução à Programação de Computadores Aula 06 – Operadores Lógicos Turma: Matemática Professor: André Luiz da Costa Carvalho E-mail: [email protected] Problema Inicial Três jogadores (A, B, C) lançam dados. Ganha aquele que tirar a face com maior número. Como determinar quem ganhou? Ou se houve empate? Processo de resolução de problemas algorítmicos Início 1 Identificar o problema 2 Definir as entradas e as saídas Decompor 3 Projetar o algoritmo 4 Converter o algoritmo em linguagem de programação 5 Testar solução Fim Refinar passo a passo Problema Inicial :: Identificar o problema Existem diversas possibilidades de vitória, empate entre dois jogadores e empate entre os três jogadores a se considerar. Para não se perder na árvore de decisão, vamos considerar um cenário mais simples, onde os dados lançados pelos jogadores nunca empatam. Problema Inicial Simplificado :: Árvore de decisão J1 > J2 V F J1 > J3 V J1 ganhou J2 > J3 F J3 ganhou V J2 ganhou F J3 ganhou De volta ao Problema Inicial :: Árvore de decisão parcial Como saber se houve empate? J1 == J2 V F J3 > J1 F Empate J2 == J3 V V J3 ganhou F J1 > J2 F Empate J1 == J3 V V J1 ganhou F J2 > J1 F Empate Árvore simplificada V J2 ganhou De volta ao Problema Inicial :: Árvore de decisão completa J1 == J2 V F J3 > J1 F Empate V V J3 ganhou J2 == J3 J1 > J2 F Empate V V J1 ganhou F J1 == J3 J2 > J1 F Empate F V J2 ganhou F J1 > J2 J1 > J3 F V J2 > J3 V F V J1 J3 J2 J3 ganhou ganhou ganhou ganhou De volta ao Problema Inicial :: Testar Solução J1 == J2 V F J3 > J1 F V V Empate J3 ganhou J2 == J3 J1 > J2 F Empate V V J1 ganhou J1 == J3 J2 > J1 F Empate J1 = 1, J2 = 2, J3 = 3 J1 = 6, J2 = 5, J3 = 4 J1 = 6, J2 = 5, J3 = 5 J1 = 5, J2 = 5, J3 = 5 J1 = 4, J2 = 5, J3 = 5 F F V J2 ganhou F J1 > J2 J1 > J3 F V J2 > J3 V F V J1 J3 J2 J3 ganhou ganhou ganhou ganhou Problema 1 Duas pessoas jogam pedra, papel, tesoura. Como determinar quem ganhou? Tipos de operadores Aritméticos Operadores Relacionais Lógicos Comparando Operadores :: Entrada e saída Operadores Aritméticos número Operando1 número Operador aritmético Resultado Operadores Relacionais Operadores Lógicos número Operando1 número número Operador relacional Operando2 Resultado Verdadeiro/falso Verdadeiro/falso Operando1 Operando2 Verdadeiro/falso Operador lógico Operando2 Resultado Verdadeiro/falso Operadores Lógicos Operadores lógicos (ou booleanos) são utilizados para a efetuar avaliações entre valores lógicos (Verdadeiro ou Falso). Possui um Operador Operação Exemplos NÃO Negação NÃO (COR == “azul”) E OU Conjunção (ladoA == ladoB) E (ladoB == ladoC) Disjunção (ladoA == ladoB) OU (ladoB == ladoC) OU (ladoA == ladoC) único operando. Verifica se triângulo é equilátero. Verifica se triângulo é isósceles. Operadores Lógicos :: Tabelas Verdade Conjunto de todas as possibilidades de resultados de cada operador lógico. A NÃO (A) A B (A) E (B) A B (A) OU (B) F V F F F F F F V F F V F F V V V F F V F V V V V V V V Precedência entre operadores Prioridade Operador lógico 1 NÃO 2 E 3 Prioridade 1 2 3 4 OU Operador Parênteses mais internos Operadores aritméticos Operadores relacionais Operadores lógicos Da esquerda para a direita Juntando todos os operadores :: Exemplos Exemplo A 2 < 5 E 15/3 == 5 5 Exemplo B F OU 20 // (18/3) != (21/3) % 4 6 7 2 < 5 E 5 == 5 V V F OU 20 // 6 != 7 % 4 3 3 VEV V F OU 3 != 3 F F OU F F Problema 2 Quais valores de X, Y e Z fazem a expressão abaixo ser verdadeira? NÃO ( X E Y ) E ( NÃO Y OU Z ) A. B. C. D. X = F, Y = V, Z = F X = V, Y = V, Z = F X = F, Y = F, Z = F X = V, Y = V, Z = V Problema 3 Dados três valores X, Y e Z, verifique: Se eles podem ser os comprimentos dos lados de um triângulo. Caso positivo, se o triângulo é equilátero, isósceles ou escaleno. Processo de resolução de problemas algorítmicos Início 1 Identificar o problema 2 Definir as entradas e as saídas Decompor 3 Projetar o algoritmo 4 Converter o algoritmo em linguagem de programação 5 Testar solução Fim Refinar passo a passo Problema 3 :: Identificar o problema Propriedade básica de um triângulo: O comprimento de cada lado de um triângulo é menor do que a soma dos comprimento dos demais lados. Equilátero Isósceles Escaleno Triângulo cujos os lados têm comprimentos iguais. Triângulo que tem dois lados com comprimentos iguais. Triângulo que tem os três lados com comprimentos diferentes. Problema 3 :: Definir Entradas e Saídas Entradas Saídas Saídas Grandeza Unidade de medida Faixa de valores X m >0 Y m >0 Z m >0 --- “Não é triângulo”, “Triângulo equilátero”, “Triângulo isósceles”, “Triângulo escaleno” mensagem Problema 3 :: Árvore de decisão (X < Y + Z) E (Y < Z + X) E (Z < X + Y) V F Não é triângulo (X == Y) E (Y == Z) F V Equilátero (X == Y) OU (Y == Z) OU (Z == X) V Isósceles F Escaleno Condições :: Como NÃO montar (1) X == Y == Z Por que não é assim? (X == Y) resulta em V/F. A comparação == ocorre entre dois operando aritméticos, mas o resultado de (X==Y) é lógico, não podendo ser comparado com Z. Como deveria ser montada? Compare os valores dois a dois. Junte os resultados de cada comparação – cujo resultado é V ou F – através de operadores lógicos: (X == Y) E (Y == Z) Condições :: Como NÃO montar (2) X == Y, Y == Z, Z == X Por que não é assim? Cada comparação gera um valor lógico. Mas a condição deve resultar em um único valor lógico. Diversos valores lógicos são consolidados por operadores lógicos (e não por vírgulas). Como deveria ser montada? Compare os valores dois a dois. Junte os resultados de cada comparação através de operadores lógicos: (X == Y) OU (Y == Z) OU (Z == X) Problema 3 :: Solução início X, Y, Z C1 F C1 (X < Y + Z) E (Y < Z + X) E (Z < X + Y) C2 (X == Y) E (Y == Z) C3 (X == Y) OU (Y == Z) OU (Z == X) V C2 V F C3 F V Não é triângulo Equilátero fim Isósceles Escaleno Problema 3 :: Testar Solução início X, Y, Z C1 F C1 (X < Y + Z) E (Y < Z + X) E (Z < X + Y) C2 (X == Y) E (Y == Z) C3 (X == Y) OU (Y == Z) OU (Z == X) V C2 V F C3 F V Não é triângulo Equilátero fim Isósceles Escaleno X = 1, Y = 2, Z = 3 X = 4, Y = 4, Z = 4 X = 3, Y = 2, Z = 3 X = 3, Y = 4, Z = 5 Voltando ao Problema 1 Duas pessoas jogam pedra, papel, tesoura. Como determinar quem ganhou? Voltando ao Problema 1 :: Identificando o problema Se J1 == J2 Empate J1 ganha quando: (J1 == Pedra E J2 == Tesoura) OU (J1 == Papel E J2 == Pedra) OU (J1 == Tesoura E J2 == Papel) J2 ganha caso contrário Voltando ao Problema 1 :: Solução Final início C1 Sortear J1, J2 J1 == J2 V (J1 == Pedra E J2 == Tesoura) OU (J1 == Papel E J2 == Pedra) OU (J1 == Tesoura E J2 == Papel) F C1 F V Empate Jogador 1 ganhou fim Jogador 2 ganhou Voltando ao Problema 1 :: Testando Solução início C1 Sortear J1, J2 J1 == J2 V (J1 == Pedra E J2 == Tesoura) OU (J1 == Papel E J2 == Pedra) OU (J1 == Tesoura E J2 == Papel) F C1 J1 F V Empate Jogador 1 ganhou fim Jogador 2 ganhou J2 Problema 1 pode ficar mais interessante? Como determinar o vencedor no jogo Pedra, Papel, Tesoura, Lagarto, Spock? Problema 4 Sejam A, B, C três números inteiros quaisquer. Escreva um fluxograma para arrumá-los em ordem decrescente. Problema 4 :: Identificar o problema São dados três números quaisquer A, B, C. Eles devem ser arrumados em ordem decrescente. Pode-se considerar que a saída seja N1 ≥ N2 ≥ N3 Agora, o problema se resume a atribuir: A B C N1 N2 N3 Problema 4 :: Definir Entradas e Saídas Entradas Saídas Grandeza Unidade de medida A, B, C --- N1, N2, N3 --- Faixa de valores Inteiros, qualquer ordem Inteiros, ordem decrescente Problema 4 :: Árvore de decisão A>B V F N1 = A N2 = B N1 = B N2 = A C > N1 V F N3 = N2 N2 = N1 N1 = C C > N2 V N3 = N2 N2 = C F N3 = C Problema 4 :: Solução início 1 A, B, C A>B V C > N1 F V F C > N2 F V N1 = B N2 = A N1 = A N2 = B N3 = N2 N2 = N1 N1 = C N3 = N2 N2 = C 1 N1, N2, N3 fim N3 = C Problema 4 :: Teste início 1 A, B, C A>B V A = 1, B = 2, C = 3 A = 4, B = 4, C = 4 A = 1, B = 4, C = 3 A = 3, B = 5, C = 5 C > N1 F V F C > N2 F V N1 = B N2 = A N1 = A N2 = B N3 = N2 N2 = N1 N1 = C N3 = N2 N2 = C 1 N1, N2, N3 fim N3 = C Estrutura Condicional de Seleção Múltipla Utilizada em situações onde há necessidade de se testar uma mesma variável (ou expressão) que pode assumir diversos valores. Executa ações diferentes para valores (casos) diferentes. início ler signo áries? V Ganhará na loteria V Não saia de casa hoje! V Sorte no amor F touro? F gêmeos? F tente de novo fim Problema 5 A alíquota de imposto de renda é determinada de acordo com a faixa de renda mensal. Escreva um algoritmo que determine a alíquota de imposto que uma pessoa deve pagar com base na renda mensal informada. Faixa de renda mensal Alíquota Até R$ 1.499,15 Isento De R$ 1.499,16 até R$ 2.246,75 7,5% De R$ 2.246,76 até R$ 2.995,70 15% De R$ 2.995,71 até R$ 3.743,19 22,5% acima de R$ 3.743,19 27,5% Problema 5 :: Definir Entradas e Saídas Entradas Saídas Grandeza Unidade de medida Faixa de valores Renda R$ ≥0 Alíquota % ≥0 Problema 5 :: Solução início R R ≤ 1499,15 V A=0 1 F R ≤ 2264,75 V A = 7,5 F R ≤ 2995,70 V A A = 15 F fim R ≤ 3743,19 F A = 27,5 1 V A = 22,5 Problema 6 A partir da renda mensal, como determinar o valor do imposto de renda devido? Importante: as alíquotas são aplicadas de forma progressiva. Problema 6 :: Definir Entradas e Saídas Entradas Saídas Grandeza Unidade de medida Faixa de valores Renda R$ ≥0 Imposto R$ ≥0 Problema 6 :: Projeto do Algoritmo O que é o cálculo progressivo? Uma pessoa que recebe R$ 1.500 mensais não pagará imposto de 7,5% sobre os R$ 1.500, mas sim sobre a diferença (1500,00 – 1499,15 = 0,85). Da mesma maneira, quem recebe R$ 2.500 pagará: 7,5% de (2264,75 – 1499,15) 15% de (2500 – 2264,75) E assim por diante... Problema 6 :: Projeto do Algoritmo Para simplificar o desenho do fluxograma, vamos adotar as seguintes convenções: Faixa de renda mensal Constante R$ 1.499,15 V1 R$ 2.246,75 R$ 2.995,70 R$ 3.743,19 V2 V3 V4 Problema 6 :: Solução início R R > V1 F imp = 0 V R > V2 F V R > V3 V V imp = 0,075*(R-V1) F R > V4 imp = 0,075*(V2-V1) + F 0,15*(R-V3) imp = 0,075*(V2-V1) + 0,15*(V3-V2) + 0,225*(R-V4) imp fim imp = 0,075*(V2-V1) + 0,15*(V3-V2) + 0,225*(V4-V3)+ 0,275*(R-V4) Problema 7 Anos bissextos são definidos da seguinte forma: 1. Anos divisíveis por 400 são bissextos. 2. Anos divisíveis por 100, mas não por 400, não são bissextos. 3. Anos divisíveis por 4, mas não por 100, são bissextos. 4. Todos os outros anos não são anos bissextos. Escreva um fluxograma que determine se um ano é bissexto ou não. Problema 7 :: Definir Entradas e Saídas Entradas Saídas Saídas Grandeza Unidade de medida Ano --- Mensagem --- Faixa de valores {bissexto, não bissexto} Problema 7 :: Árvore de decisão ano % 400 == 0 F V Bissexto ano % 100 == 0 F V Não bissexto ano % 4 == 0 V Bissexto F Não bissexto Problema 7 :: Solução 1 início C1 ano % 400 == 0 ano C2 ano % 100 == 0 C1 V F C3 C2 V F C3 F V Bissexto Não bissexto fim Bissexto Não bissexto ano % 4 == 0 Problema 7 :: Teste da Solução 1 início C1 ano % 400 == 0 ano C2 ano % 100 == 0 C1 V F C3 C2 V ano % 4 == 0 F C3 F V Bissexto Não bissexto fim Bissexto Não bissexto 1900, 2000, 2014, 2016, 2100 e 2400 Problema 7 :: Solução 2 ano % 400 == 0 F V Bissexto ano % 100 == 0 F V Não bissexto ano % 4 == 0 V Bissexto Bissexto: F Não bissexto ano % 400 == 0 OU (ano % 100 ≠ 0) E (ano % 4 == 0) Problema 7 :: Solução 2 início C1 (ano % 400 == 0) OU ((ano % 100 ≠ 0) E (ano % 4 == 0)) ano V C1 F Não bissexto Bissexto fim Problema 7 :: Teste da Solução 2 início C1 (ano % 400 == 0) OU ((ano % 100 ≠ 0) E (ano % 4 == 0)) ano V C1 F Não bissexto Bissexto fim 1900, 2000, 2014, 2016, 2100 e 2400 Equivalência entre Expressões Booleanas Na álgebra numérica, existem expressões equivalentes, ou seja, cujo valor é sempre o mesmo: 𝑥(𝑦 + 𝑧) 𝑥𝑦 + 𝑥𝑧 O mesmo ocorre com expressões booleanas: num ≠ 0 NÃO (num == 0) Equivalência entre Expressões Booleanas (num ≠ 0) E (num ≠ 6) NÃO (num == 0 OU num == 6) ... -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 ... 0 1 2 3 4 5 6 7 8 ... 0 1 2 3 4 5 6 7 8 ... (num ≥ 0) E (num ≤ 6) (NÃO num < 0) E (NÃO num > 6) NÃO (num < 0 OU num > 6) ... -8 -7 -6 -5 -4 -3 -2 -1 (num < 0) OU (num > 6) (NÃO num ≥ 0) E (NÃO num ≤ 6) NÃO (num ≥ 0 OU num ≤ 6) ... -8 -7 -6 -5 -4 -3 -2 -1 Referências bibliográficas Menezes, Nilo Ney Coutinho (2010). Introdução à Programação com Python. Editora Novatec. Farrer, Harry (2011). Algoritmos Estruturados, 3ª edição. Editora LTC. Forbellone, A. L. V.; Eberspächer, H. F. (2006) Lógica de Programação, 3ª edição. Pearson. HETLAND, Magnus Lie (2008). Beginning Python: From Novice to Professional. Springer eBooks, 2ª edição. Disponível em: http://dx.doi.org/10.1007/978-1-4302-0634-7. Dúvidas?