Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 44 de 103

Páginas do PDF

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