Instituto Federal de Mato Grosso do SulAbril/2022
07. Condicionais
Algoritmos 1
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
Voltando ao programa da Dona V. ...
let tomarPporDia = 3
let tomarZporDia = 4
let tomarMporDia = 1
let tomarTporDia = 1
let tomarPporMes = tomarPporDia * 30
let tomarZporMes = tomarZporDia * 30
let tomarMporMes = tomarMporDia * 30
let tomarTporMes = tomarTporDia * 30
let estoqueP = 44
let estoqueZ = 52
let estoqueM = 36
let estoqueT = 14
let precisoComprarDeP = tomarPporMes - estoqueP
let precisoComprarDeZ = tomarZporMes - estoqueZ
let precisoComprarDeM = tomarMporMes - estoqueM
let precisoComprarDeT = tomarTporMes - estoqueT
let caixaDeP = Math.floor(precisoComprarDeP / 30) + 1
let caixaDeZ = Math.floor(precisoComprarDeZ / 60) + 1
let caixaDeM = Math.floor(precisoComprarDeM / 15) + 1
let caixaDeT = Math.floor(precisoComprarDeT / 30) + 1
let quantidade = "Dona V. precisa comprar "+caixaDeP+" caixas de P, precisa comprar "+caixaDeZ+" caixas de Z, precisa comprar "+caixaDeM+" caixas de M, precisa comprar "+caixaDeT+" caixas de T"
console.log(quantidade)
Esse programa está ... correto?
let tomarPporDia = 3
let tomarZporDia = 4
let tomarMporDia = 1
let tomarTporDia = 1
let tomarPporMes = tomarPporDia * 30
let tomarZporMes = tomarZporDia * 30
let tomarMporMes = tomarMporDia * 30
let tomarTporMes = tomarTporDia * 30
let estoqueP = 14
let estoqueZ = 32
let estoqueM = 30
let estoqueT = 24
let precisoComprarDeP = tomarPporMes - estoqueP
let precisoComprarDeZ = tomarZporMes - estoqueZ
let precisoComprarDeM = tomarMporMes - estoqueM
let precisoComprarDeT = tomarTporMes - estoqueT
let caixaDeP = Math.floor(precisoComprarDeP / 30) + 1
let caixaDeZ = Math.floor(precisoComprarDeZ / 60) + 1
let caixaDeM = Math.floor(precisoComprarDeM / 15) + 1
let caixaDeT = Math.floor(precisoComprarDeT / 30) + 1
let quantidade = "Dona V. precisa comprar "+caixaDeP+" caixas de P, precisa comprar "+caixaDeZ+" caixas de Z, precisa comprar "+caixaDeM+" caixas de M, precisa comprar "+caixaDeT+" caixas de T"
console.log(quantidade)
Vamos analisar ...
O programa anterior tinha um BUG!
No exemplo anterior, vimos que dependendo da entrada existem duas decisões a serem tomadas:
- Se o número de comprimidos a serem comprados for menor ou igual a zero, compramos 0 caixas.
- Se não, compramos o número de comprimidos, arredondados para cima.
Como podemos observar, os testes só podem ter 2 caminhos: quando o teste for verdadeiro e quando o teste for falso
Agora iremos introduzir um novo tipo ao JavaScript: o Boolean
Regra #19: Uma expressão Booleana só pode ter dois valores: True ou False
let teste = True
console.log(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 (!=)
let teste1 = 5 == 4
console.log(teste1)
let teste2 = 4 != 4
console.log(teste2)
Ainda temos os operadores relacionais de maior (>), menor (<), maior ou igual (>=) e menor ou igual (<=)
let teste1 = 4 > 5
console.log(teste1)
let teste2 = 4 < 5
console.log(teste2)
let teste3 = 4 >= 4
console.log(teste3)
let teste4 = 4 <= 4
console.log(teste4)
Como variáveis são expressões, o mesmo se aplica a elas
let var1 = 10
let teste = var1 > 0
console.log(teste)
let var2 = 10
teste = var1 >= var2
console.log(teste)
let var3 = 5
teste = var1 + var3 >= var2
console.log(teste)
console.log(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 dentro de um par de chaves { }
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
console.log("Valor 1 é maior que o Valor 2")
}
else{
o segundo bloco, definido pelo else, é executado quando a expressão seja igual a FALSE
console.log("Valor 2 é maior que o Valor 1")
}
console.log("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 ...
Você consegue adivinhar meu tipo de pet preferido?
CONDICIONAIS ANINHADOS E ÁLGEBRA BOOLEANA
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
let idade = 64//Idade da pessoa, em anos
let moraEmNA = true //Se mora em NA ou não, booleano
let restricoes = false //Se possui restrições, booleano
Nós sabemos criar condições para cada um dos casos:
console.log(idade > 55)
true
console.log(moraEmNA == true)
true
console.log(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 JavaScript 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 (&&)
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.
let idade = 64
let morarEmNA = true
console.log( (idade > 55) && (moraEmNA == true) )
true
idade = 15
morarEmNA = true
console.log( (idade > 55) && (moraEmNA == true) )
false
idade = 70
morarEmNA = false
console.log( (idade > 55) && (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
let idade = 72
let morarEmNA = true
let restricoes = false
if ( (idade > 55) && (morarEmNA == true) && (restricoes == false) ){
console.log("Você pode tomar a sua vacina")
}
else {
console.log("Você não satisfaz as condições")
}
Operador Booleano OU (||)
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.
let idade = 64
let profissao = "professor"
let comorbidade = true
console.log( (idade > 55) || (profissao == "professor") || (comorbidade == true) )
true
let idade = 44
let profissao = "professor"
let comorbidade = false
console.log( (idade > 55) || (profissao == "professor") || (comorbidade == true) )
true
let idade = 22
let profissao = "advogado"
let comorbidade = false
console.log( (idade > 55) || (profissao == "professor") || (comorbidade == true) )
false
Operador Booleano NÃO (!)
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
let moraEmNA = true
console.log(!moraEmNa)
false
let idade = 44
let profissao = "professor"
console.log( !((idade > 55) || (profissao == "professor")))
false
let idade = 22
let profissao = "professor"
console.log( (!(idade > 55)) && (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
Condicionais aninhados
A ideia é que ao usar os condicionais aninhados, o bloco falsidade de um determinado condicional é um novo condicional, e assim sucessivamente até que tenhamos satisfeito todos os resultados possíveis.
Um jeito fácil de saber quantos condicionais serão necessários é usar a fórmula: n = r-1. Onde n é o número de condicionais e r é o número de resultados possíveis. Vejamos:
Quando só temos 2 resultados possíveis (true e false): n = 2 - 1 = 1, logo só precisamos de um condicional.
Quando só temos 3 resultados possíveis: n = 3 - 1 = 2, logo só precisamos de dois condicionais.
let peso = 60
let altura = 1.72
let IMC = peso/(altura*altura)
if (IMC < 16){
console.log("abaixo do peso")
}
else {
if (IMC < 17) {
console.log("abaixo do peso moderadamente")
}
else {
if (IMC < 18.5){
console.log("abaixo do peso moderadamente")
}
}
}
