1
resposta

[Dúvida] separar mensagens "Peso inválido!", "Altura inválida!" ou "Peso e altura inválidos!"

ei, pessoal, tudo bem com vocês? ontem fiquei um tempão tentando criar a mensagem "Peso e altura inválidos!", mas o meu obstáculo foi que ela aparecia tanto quando o peso era inválido quanto quando a altura era inválida (ambos isoladamente).essa foi a minha primeira tentativa (sem sucesso):

if(peso <= 0 || peso >= 1000 && altura <= 0 || altura >= 2.50){
    console.log("Peso e altura inválidos!");
    alturaValida && pesoValido = false;
    tdImc.textContent = "Peso e altura inválidos!";
} 

depois, pesquisando no fórum da Alura, descobri a seguinte solução (que me pareceu incompleta - pelo menos pro meu propósito, que era mostrar as mensagens específicas "Peso inválido!", "Altura inválida!" ou "Peso e altura inválidos!" no td do Imc):

if(alturaValida && pesoValido){
    var imc = peso / (altura * altura); // nesse caso, 100 / 4 = 25
    tdImc.textContent = imc; 
} else {
        tdImc.textContent = "Peso e altura inválidos!";
    }

aqui acredito que o ideal seria que eu colocasse a mensagem "Peso e/ou altura inválidos!" e apagasse as mensagens "Peso inválido!" e "Altura inválida!" das funções anteriores (já que a única mensagem que seria mostrada seria a "Peso e/ou altura inválidos!" mesmo). mas chegar, exatamente, ao resultado que estava imaginando, então comecei uma série de tentativas aleatórias (sem saber exatamente o que eu estava fazendo), até que cheguei à seguinte:

if(999 > peso < 0.1 && 2.49 > altura < 0.1){
    console.log("Peso e altura inválidos!");
    tdImc.textContent = "Peso e altura inválidos!";
}

finalmente consegui que as três mensagens ("Peso inválido!", "Altura inválida!" ou "Peso e altura inválidos!") aparecessem em seus respectivos contextos. feitos os devidos testes: tudo ok, mas me surgiu uma dúvida, digamos assim, primária (matemática básica hehe): não entendi o sentido lógico do maior que (>) e menor que (<). vamos lá:

if(999 > peso < 0.1 && 2.49 > altura < 0.1){
    console.log("Peso e altura inválidos!");
    tdImc.textContent = "Peso e altura inválidos!";
}

eu leria essa sentença/função assim:

se 999 é maior que o peso e o peso é menor do que 0.1 e se 2.49 é maior que a altura e a altura é menor do que 0.1, então aparecerá no console e no tdImc a mensagem "Peso e altura inválidos!".

mas pensando lógicamente o certo não seria se 999 é menor que o peso (ou seja, o peso é maior que 999) e o peso é menor que 0.1 e se 2.49 é menor que a altura (ou seja, a altura é maior que 2.49) e a altura é menor que 0.1, então peso e altura serão inválidos? tentei trocar os sinais, para traduzirem essa última frase, mas não deu certo.

alguém pode me explicar a lógica por trás disso? e porque deu certo mesmo com a "tradução" da lógica significando outra coisa. ou a minha lógica que está errada?

obrigada pela atenção, desde já. um grande abraço Anita :)

1 resposta

Oi, Anita

Você não pode usar esta expressão 999 > peso < 0.1

O que está acontecendo:

// o que acontece é que ele trata a primeira sentença e depois a segunda
// lembrando que true vale 1 e false vale 0 

let peso = 100
// (999 > peso < 0.1)
// 999 > peso  -> resultado é true
// true < 0.1 -> resultado final é false

let peso = 0
// (999 > peso < 0.1)
// 999 > peso  -> resultado é true
// true < 0.1 -> resultado final é false

let peso = 1000
// (999 > peso < 0.1)
// 999 > peso  -> resultado é false
// true < 0.1 -> resultado final é true

O seu segundo exemplo é o que melhor pode de ajudar

Use "else if" para mostra o resultado específico para altura e peso