Instituto Federal de Mato Grosso do SulAbril/2023
06. Condicionais
Construção de Algoritmos
Prof. Rodrigo Duran
Nesta aula vamos:
-
Aprender a sobre o controle de fluxo nos programas utilizando condicionais
Hoje nós vamos aprender a escolher "caminhos" para o nosso programa de acordo com diferentes entradas do usuário.
ESCOLHENDO CAMINHOS
Calculando a quantidade de latas de tinta ...
tArea = float(input("Digite o tamanho da área : "))
cobTinta = float(input("Digite a cobertura da tinta : "))
tamLata = float(input("Qual o tamanho da lata? : "))
valorTinta = float(input("Digite o valor da lata: "))
areaCoberta = tamLata * cobTinta
qtdLatas = (tArea // areaCoberta) + 1
print(f"Você precisa comprar {qtdLatas} latas no valor de {qtdLatas*valorTinta}")
Esse programa está ... correto?
- Exemplo 1: Área : 100, cobertura da tinta: 10, tamanho da lata: 8, valor da lata: 150.0 -> Resultado: 2 latas e R$ 300 (PASS)
- Exemplo 2: Área : 400, cobertura da tinta: 20, tamanho da lata: 18, valor da lata: 512.99 -> Resultado: 2 latas e R$ 1025.98 (PASS)
- Exemplo 3: Área : 1000, cobertura da tinta: 10, tamanho da lata: 10, valor da lata: 200.0 -> Resultado: 11 latas e R$ 2200.00 (FAIL)
O programa anterior tinha um BUG!
No exemplo anterior, vimos que dependendo da entrada existem duas decisões a serem tomadas:
- Se a divisão do tamanho da área a ser pintada pela cobertura feita pela tinta não for exata, somamos mais uma lata à compra
- Se não, compramos mais uma lata para cobrir a parte fracionária da divisão.
Os testes só podem ter 2 caminhos: quando o teste for verdadeiro e quando o teste for falso
No Python, o tipo que só pode assumir os valores True e False é o Boolean
Regra #19: Uma expressão Booleana só pode assumir dois valores: True ou False
teste = True
print(teste, type(teste))
Operações aritméticas não se aplicam a variáveis do tipo Boolean.
Expressões de comparação (relacionais) tem como resultado um valor Booleano. São operadores relacionais a igualdade (==) e diferença (!=)
teste1 = 5 == 4
print(teste1)
teste2 = 4 != 4
print(teste2)
Ainda temos os operadores relacionais de maior (>), menor (<), maior ou igual (>=) e menor ou igual (<=)
teste1 = 4 > 5
print(teste1)
teste2 = 4 < 5
print(teste2)
teste3 = 4 >= 4
print(teste3)
teste4 = 4 <= 4
print(teste4)
Como variáveis são expressões, o mesmo se aplica a elas
var1 = 10
teste = var1 > 0
print(teste)
var2 = 10
teste = var1 >= var2
print(teste)
var3 = 5
teste = var1 + var3 >= var2
print(teste)
print(var2 / var1 >= 0)
Selecionando entre duas alternativas: if
O comando if avalia uma expressão cujo resultado é do tipo Booleano. Dependendo do valor da expressão, um bloco é selecionado.
Um bloco é um conjunto de comandos com um recuo a direita. Geralmente definimos um bloco pela identação utilizando um tab.
Lembre-se que a expressão deve ter como resultado um valor Booleano
if (valor1 > valor2) :
Todos os comandos do primeiro bloco são executados caso a expressão seja igual a True
Vários comandos podem ser executados por bloco
print("Valor 1 é maior que o Valor 2")
else:
o segundo bloco, definido pelo else, é executado quando a expressão seja igual a False
print("Valor 2 é maior que o Valor 1")
print("Vida que segue")
Regra #20: A execução do programa não necessariamente é linear, linha a linha.
Regra #21: Um condicional avalia uma expressão booleana para escolher entre um dos caminhos de execução.
Regra #22: Em um condicional, após a execução de um dos blocos, o fluxo do programa continua após o comando condicional.
Regra #23: O comando condicional termina ao fim do seu bloco else (caso exista).
Escrevendo o código ...
CONDICIONAIS ANINHADOS E ÁLGEBRA BOOLEANA
O exemplo anterior tinha um bug: quando um número era igual ao outro, ele mostrava que o segundo número era maior, quando na verdade os dois números eram iguais.
Neste caso, o programa tem três opções diferentes:
- Primeiro número maior do que o segundo número
- Segundo número maior do que o primeiro número
- Ambos são iguais
Entretanto, cada condicional só pode avaliar duas opções: quando o teste é True ou False
A solução é encadear cuidadosamente condicionais para testar todos os casos possíveis.
Via de regra, se você tem n opções, você precisará de n-1 condicionais.
numero1 = int(input("Digite o 1o numero: "))
numero2 = int(input("Digite o 2o numero: "))
if (numero1 > numero2):
print("O primeiro numero é maior")
else:
if (numero2 > numero1):
print("O segundo número é maior")
else:
print("Os dois são iguais")
E quando meu teste depende de mais de uma condição?
Até agora os nossos testes todos dependiam de apenas uma condição Booleana, que poderia ser o resultado de várias expressões aritméticas e relacionais.
Imagine o seguinte caso:
“ O atual protocolo de vacinação da cidade de Nova Andradina estipula que estão aptos a tomar a primeira dose da vacina os indivíduos que atendam a todas as condições: (a) mais de 55 anos (b) moradores de Nova Andradina (c) não tenham restrições médicas ”
Podemos identificar, a partir do texto ,três variáveis que definem se o indivíduo está apto a ser vacinado ou não
idade = 64//Idade da pessoa, em anos
moraEmNA = True //Se mora em NA ou não, booleano
restricoes = False //Se possui restrições, booleano
Nós sabemos criar condições para cada um dos casos:
print(idade > 55)
True
print(moraEmNA == True)
True
print(restricoes == False)
True
Mas para que possamos "juntar" as três condições precisamos utilizar um novo tipo de álgebra: a algebra Booleana
Operadores booleanos
Assim como nas operações aritméticas, em Python nós temos três operadores Booleanos. Esses operadores dizem como devemos interpretar dois valores booleanos, que serão avaliados também em um valor booleano.
Operador Booleano E (and)
O operador E, pode ser interpretado como a intersecção de dois conjuntos. O resultado final só será verdade se todos os valores forem verdade.
idade = 64
morarEmNA = True
print( (idade > 55) and (moraEmNA == True) )
True
idade = 15
morarEmNA = True
print( (idade > 55) and (moraEmNA == True) )
False
idade = 70
morarEmNA = False
print( (idade > 55) and (moraEmNA == True) )
False
Desta forma, nós podemos criar expressões booleanas com quantos critérios forem necessários, conectando cada um deles com o operador Booleano
idade = 72
morarEmNA = True
restricoes = False
if ( (idade > 55) and (morarEmNA == True) and (restricoes == False) ):
print("Você pode tomar a sua vacina")
else:
print("Você não satisfaz as condições")
Operador Booleano OU (or)
O operador OU, pode ser interpretado como a união de dois conjuntos. O resultado final será verdade quando pelo menos um dos valores for verdade.
idade = 64
profissao = "professor"
comorbidade = True
print( (idade > 55) or (profissao == "professor") or (comorbidade == True) )
True
idade = 44
profissao = "professor"
comorbidade = False
print( (idade > 55) or (profissao == "professor") or (comorbidade == True) )
True
idade = 22
profissao = "advogado"
comorbidade = False
print( (idade > 55) or (profissao == "professor") or (comorbidade == True) )
False
Operador Booleano NÃO (not)
O operador NÃO, pode ser interpretado como a negação de um valor Booleano. Se o valor for verdadeiro, sua negação será falso, e vice-versa
moraEmNA = True
print(not moraEmNa)
False
idade = 44
profissao = "professor"
print( not ((idade > 55) or (profissao == "professor")))
False
idade = 22
profissao = "professor"
print( (not (idade > 55)) and (profissao == "professor"))
True
Condicionais aninhados
Até agora investigamos problemas onde existiam apenas dois resultados possíveis, indicados pelo bloco da verdade e o bloco da falsidade. Mas o que acontece quando temos vários resultados possíveis? Veja, o exemplo do cálculo do Índice de Massa Corporal (IMC):
O IMC é calculado como sendo o peso dividido pelo quadrado da altura do indivíduo. Ele deve ser interpretado de acordo com a seguinte tabela:
- Se o IMC for menor do que 16 a pessoa está abaixo do peso
- Se o IMC estiver entre 16 e 17, abaixo do peso moderadamente
- Se o IMC estiver entre 17 e 18.5, abaixo do peso levemente
- Se o IMC estiver entre 18.5 e 25, saudável
- Se o IMC estiver entre 25 e 30, sobrepeso
- Se o IMC estiver entre 30 e 35, Obesidade Grau I
- Se o IMC estiver entre 35 e 40, Obesidade Grau II
- Se o IMC estiver acima de 40, Obesidade Grau III
