Introdução à programação e aos algoritmos
3.4 Condições Compostas
Além de testes em série, por vezes precisamos testar mais de uma condição para tomar uma decisão. Um exemplo simples seria pedir que um usuário digite a letra “H” para indicar “Homem” e “M” para indicar “Mulher”. O problema é que o usuário poderia digitar letras maiúsculas ou minúsculas. Para o computador, “H” e “h” são letras diferentes. Você precisa testar as duas situações para tomar a decisão correta. Em pseudocódigo, você escreveria:
Se letra é igual a ‘H’ ou ‘h’...
Entre as duas opções temos o conectivo “ou”. Em Python seu
equivalente é o conectivo “or”. O programa, diretamente em Python, ficaria:
letra = input(‘Digite H para Homem e M para Mulher ‘
)
if letra == ‘H’ or letra == ‘h’:
print (“Você escolheu Homem.”)
elif letra == ‘M’ or letra == ‘m’:
print (“Você escolheu Mulher.”)
else:
print (“Você escolheu outra opção.”)
■ Programa 3.5: h_e_m.py.
No programa, testamos para cada letra suas opções em
maiúsculas e minúsculas. Um exemplo um pouco mais complexo seria calcular se um ano é bissexto. Diversas regras devem ser usadas para calcular se um ano é bissexto ou não.
As regras são as seguintes: a cada 4 anos temos um ano
bissexto, isto é, um ano com 366 dias. Todo ano bissexto deve ser divisível por 4, exceto aqueles que também são divisíveis por 100. A regra anterior não vale se o ano for divisível por 400, caso em que este será obrigatoriamente bissexto, apesar de ser divisível por 100. Confuso? Vamos simplificar:
A cada 4 anos o ano é bissexto, ou seja, todos os anos
• divisíveis por 4.
• A cada 100 anos o ano não é bissexto, apesar de ser divisível
por 4.
• A cada 400 anos o ano é bissexto, apesar de ser divisível por
100.
Para resolver isso, temos de usar alguns operadores que vão trabalhar com valores lógicos. E, OU e NÃO. Em Python, teremos os nomes em inglês, respectivamente and, or e not. Vamos usar os operadores diretamente em Python e não os seus equivalentes em português. Também os valores lógicos que esses operadores testam, Verdadeiro e Falso, serão os de Python, True e False.
Se algo é verdadeiro somente se duas condições forem verdadeiras, vamos usar o operador and. A partir disso tiramos uma tabela que chamaremos de Tabela-Verdade. Uma tabela-verdade é usada na lógica para determinar se uma expressão é verdadeira ou
falsa. A Tabela 3.1 apresenta os resultados para o operador and:
Tabela 3.1 Tabela-verdade para operador and
Condição 1 Condição 2 Condição 1 and Condição 2
False False False
False True False
True False False
True True True
Fazendo o mesmo para o operador OU, obtemos a Tabela 3.2:
Tabela 3.2 Tabela-verdade para operador or
Condição 1 Condição 2 Condição 1 or Condição 2
False False False
False True True
True False True
True True True
E para o not, temos a Tabela 3.3:
Tabela 3.3 Tabela-verdade para operador not
Condição not Condição
False True
True False
Com esses novos operadores, voltemos ao problema de calcular se um ano é bissexto. Vamos montar uma expressão para ser testada e assim decidir se um ano é bissexto ou não. Você se lembra do operador de resto da divisão inteira? Vamos usá-lo. A primeira regra é a da divisão por 4. Assim, temos:
if ano % 4 == 0:
print (‘Ano é bissexto’)
Obviamente, a expressão anterior está ainda incompleta. Testamos apenas uma das condições. A próxima condição invalida a primeira, ou seja, se o ano for divisível por 100, não será bissexto. Como incluir essa cláusula na expressão? Se queremos que a resposta seja bissexto, temos de negar a condição dos 100, isto é, um ano é bissexto se for divisível por 4 e não for divisível por 100. Para obter esse resultado colocamos a expressão entre parênteses e negamos todo o seu conteúdo.
if ano % 4 == 0 and not (ano % 100 == 0):
print (‘Ano é bissexto’)
Estamos quase lá. Falta ainda colocar a última condição: todo ano divisível por 400 é obrigatoriamente bissexto. A cláusula a ser usada é a OU. O programa completo ficaria assim:
ano = int(input(‘Digite um ano: ‘)) if (ano % 4 == 0 and not(ano % 100 == 0)) or ano % 4 00 == 0:
print (‘Ano é bissexto’)
■ Programa 3.6: bissexto.py.
A condição not nesse caso específico pode ser simplificada para usar o operador de diferença (!=) e também podemos colocar a alternativa else. Desse modo, obtemos:
ano = int(input(‘Digite um ano: ‘)) if (ano % 4 == 0 and ano % 100 != 0) or ano % 400 == 0:
print (‘Ano é bissexto’)
else:
print (‘Ano não é bissexto’)
■ Programa 3.7: bissexto_v2.py
Preste atenção aos parênteses. A expressão dentro de
parênteses é resolvida primeiro, e só depois a expressão seguinte é analisada.
Aqui é válido criar um fluxograma para entender melhor o teste
sendo feito. Quando você dominar melhor as condições compostas, o fluxograma poderá ser dispensável.
Dica 3.2 – Coloque a condição mais provável antes das outras.
As linguagens de programação são otimizadas de maneira que a primeira condição
que resolve um teste impede que as outras sejam testadas. Assim, se ano % 4 == 0
for falso, não há sentido em gastar tempo de execução testando se ano % 100 != 0 é
falso ou verdadeiro. Não importa mais, e o teste será interrompido nesse momento.
O único cuidado a ser tomado aqui é se uma condição depende da outra. Por
exemplo, no teste
Se i < n E tabela[i] == x
A inversão das condições para
Se tabela[i] == x E i < n
pode resultar em erro na execução se tabela não contiver valores para i ≥ n.
Uma versão alternativa, sem o uso de condições compostas,
mas com o uso de testes em cadeia e diversos comandos de impressão, poderia ser:
ano = int(input(‘Digite um ano: ‘))
if ano % 4 != 0:
print (‘Ano não é bissexto’)
elif ano % 100 != 0:
print (‘Ano é bissexto’)
elif ano % 400 == 0:
print (‘Ano é bissexto’)
else:
print (‘Ano não é bissexto’)
■ Programa 3.8: bissexto_v3.py
Para finalizar, Python tem uma maneira especial de tratar algumas condições compostas matemáticas. Digamos que você tenha de escrever um programa que defina descontos no ingresso de um evento baseado na idade do usuário, segundo a tabela.
Idade Desconto (%)
0 e menos de 12 anos 100
12 e menos de 26 anos 50
mais de 26 anos 0
Um algoritmo simples poderia ser:
Leia idade
Se idade estiver entre 0 (inclusive) e 12 (exclusive )
Imprimir desconto é de 100 %
senão Se idade estiver entre 12 (inclusive) e 26 (ex clusive)
Imprimir desconto é de 50 %
senão
Imprimir sem desconto
Normalmente este programa poderia ser traduzido em Python
por:
idade = int(input(‘Qual a idade? ‘))
if idade >= 0 and idade < 12:
print (‘Desconto é de 100%’)
elif idade >= 12 and idade < 26:
print (‘Desconto é de 50%’)
else:
print (‘Sem Desconto’)
■ Programa 3.9: calcula_desconto.py.
Porém, Python possui uma sintaxe mais próxima da linguagem
matemática, permitindo escrever expressões mais simples:
idade = int(input(‘Qual a idade? ‘))
if 0 <= idade < 12:
print (‘Desconto é de 100%’)
elif 12 <= idade < 26:
print (‘Desconto é de 50%’)
else:
print (‘Sem Desconto’)
■ Programa 3.10: Versão alternativa de calcula_desconto.py.
EXERCÍCIO 3.7
Uma empresa vai conceder um aumento diferenciado a seus funcionários,
segundo os seguintes critérios: quem ganha até 1000 reais (inclusive) terá
aumento de 20 %; entre 1000 e 2000 (inclusive), aumento de 18 %; entre 2000 e
4000 (inclusive) aumento de 15 % e acima de 4000 aumento de 10 %. Escreva um
programa que, dado um valor de salário, calcule o novo valor após o aumento.
EXERCÍCIO 3.8
Sabendo que um triângulo é dito equilátero quando tem 3 lados iguais, isósceles
quando tem 2 lados iguais e escaleno quando todos os lados têm tamanhos
diferentes, escreva um programa que receba os valores dos três lados de um
triângulo e imprima se ele é equilátero, isósceles ou escaleno.
EXERCÍCIO 3.9
Considere que um ser humano pode ser classi cado segundo sua idade nas
seguintes faixas etárias:
• Bebê (nascimento até 3 anos).
• Criança (4 até 7 anos).
• Pré-adolescente (8 até 12 anos).
• Adolescente (13 até 20 anos).
• Jovem (21 a 40 anos).
• Meia-idade (41 até 64 anos).
• Idoso (65 anos em diante).
Escreva um programa que solicite uma idade e imprima a classi cação
correspondente.
EXERCÍCIO 3.10
Este programa irá exigir um pouco mais de testes. É comum que donos de
cachorros calculem a “idade humana” equivalente de seus cães usando uma
simples multiplicação por 7, mas a conta é um pouco mais complexa que isso. O
envelhecimento de um cão depende de sua raça. Até os dois primeiros anos de
cães de uma raça pequena, cada ano equivale a 12,5 anos humanos. Para os cães
médios, esses dois anos contam 10,5 por ano e para os cães grandes, cada ano