Instituto Federal de Mato Grosso do SulAbril/2022

IFMS marca

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:

  1. Se o número de comprimidos a serem comprados for menor ou igual a zero, compramos 0 caixas.
  2. Se não, compramos o número de comprimidos, arredondados para cima.
Decisão entre verdadeiro e falso

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)
True

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)
False
let teste2 = 4 != 4
console.log(teste2)
False

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


let teste1 = 4 > 5
console.log(teste1)
False


let teste2 = 4 < 5
console.log(teste2)
True


let teste3 = 4 >= 4
console.log(teste3)
True


let teste4 = 4 <= 4
console.log(teste4)
True

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

let var1 = 10
let teste = var1 > 0
console.log(teste)
True


let var2 = 10
teste = var1 >= var2
console.log(teste)
True


let var3 = 5
teste = var1 + var3 >= var2
console.log(teste)
True


console.log(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 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")
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 ...

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

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

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

Diagrama IMC

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")
    }
  }
}