Instituto Federal de Mato Grosso do SulAbril/2023

IFMS marca

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:

  1. 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
  2. Se não, compramos mais uma lata para cobrir a parte fracionária da divisão.
Decisão entre verdadeiro e falso

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))
True class 'bool'

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)
False
teste2 = 4 != 4
print(teste2)
False

Ainda temos os operadores relacionais de maior (>), menor (<), maior ou igual (>=) e menor ou igual (<=)


teste1 = 4 > 5
print(teste1)
False


teste2 = 4 < 5
print(teste2)
True


teste3 = 4 >= 4
print(teste3)
True


teste4 = 4 <= 4
print(teste4)
True

Como variáveis são expressões, o mesmo se aplica a elas

var1 = 10
teste = var1 > 0
print(teste)
True


var2 = 10
teste = var1 >= var2
print(teste)
True


var3 = 5
teste = var1 + var3 >= var2
print(teste)
True


print(var2 / var1 >= 0)
True

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")
Decisão se o valor1 é maior do que o valor2

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:

  1. Primeiro número maior do que o segundo número
  2. Segundo número maior do que o primeiro número
  3. 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
Interseccao entre condicoes

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
Uniao entre condicoes

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

Diagrama IMC