Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Dúvida no IMC

Boa tarde, estou com dificuldade com código IMC, aonde eu criei uma função para realizar o calculo IMC e pegar apenas duas casas decimais depois da vírgula do resultado, e outra função para verificar se o valor do IMC é ideal para a pessoa, mas ao executar me parece que ele não realiza a conta e não mostra o a mensagem na tela. Poderia me auxiliar por favor?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

13 respostas

Olá Luiz! Você poderia postar o HTML também para que eu possa teu auxiliar melhor?

solução!

Olá Luiz, faltou invocar as funções, e acredito que o resultado tem que ser definido fora do calculoIMC pra ser usado como parâmetro no verificarIMC

Bom dia Samuel, td bem? segue abaixo meu HTML:

<div class="container">
    <div class="container__conteudo">
        <div class="container__informacoes">
            <div class="container__texto">
                <h1></h1>   
                <p class="texto__paragrafo"></p>
            </div>
            <input type="number" min="1" max="10" class="container__input">
            <div class="chute container__botoes">
                <button onclick="verificarChute()" class="container__botao">Chute</button>
                <button onclick="reiniciarJogo()" id="reiniciar" class="container__botao" disabled>Reiniciar Jogo</button>
            </div>
        </div>
        <img src="./img/ia.png" alt="Uma pessoa olhando para a esquerda" class="container__imagem-pessoa" />
    </div>
</div>




<script src="app.js" defer></script>

Olá Daniel, agora eu invoquei as funções como mostra os prints abaixo, mas me parece que conta não está funcionando porque sempre puxa pela estrutura de seleção "if" e não vai para o "else". Consegue me ajuda?

https://drive.google.com/drive/folders/1BVzPNw6LSMnLKMWETWNKGcJl4QJGf835?usp=sharing

Olá Luiz, ao invocar funções com parâmetros é necessário passar os valores dos parâmetros. ex: calcularIMC(peso,altura); E acredito que o resultado tem que ser definido fora do scopo de calcularIMC pra ser usado em outra função, vou recriar seu código depois pra conferir.

Opa Daniel, coloquei os valores dos parâmetros para invocar a função e o código faz com que execute o calculo do IMC, mas no caso eu gostaria que ele selecionasse somente duas casas decimais após da virgula do resultado do calculo do IMC e depois verificasse se esse resultado está entre o índice ideal para informar ao usuário se ele está no peso ideal ou não. Sobre o resultado não entendi o que você quis dizer, no caso eu defino ele antes da função do calcularIMC?

https://drive.google.com/drive/folders/1BVzPNw6LSMnLKMWETWNKGcJl4QJGf835?usp=sharing

Para deixar apenas 2 casas decimais usa .toFixed(2) como você havia usado anteriormente, e criando resultado dentro da função calculoIMC estava dando como undefined, então por isso definir fora da função como no exemplo a seguir:

let peso = parseFloat(prompt('Qual é seu peso?'));
let altura = parseFloat(prompt('Qual é sua altura em metros?'));
let resultado;

Se quiser o código completo resolvido é só pedir, mas aconselho tentar resolver primeiro.

Opa Daniel, pelo que entendi seria definir a variável resultado fora da função e depois colocar ela na função para deixar apenas 2 casas decimais né? como está abaixo:

//Calculo do IMC

let peso = parseFloat(prompt('Digite seu peso(kg):')); let altura = parseFloat(prompt('Digite sua Altura(Metros):')); let resultado;

function calculoIMC(peso, altura) { const imc = peso / (altura * altura); const resultado = imc.toFixed(2); return resultado; } calculoIMC(peso, altura);

alert(resultado);

Eu fiz isso e ainda está dando como undefined.

Opa Daniel, eu li novamente seu post e entendi o que eu devia fazer para que o resultado do calculo do IMC aparecesse na tela com apenas duas casas decimais, criando a váriavel antes e depois dando o valor da variavel resultado usando o .toFixed(2) e retornando o valor dela dentro da função como tinha feito antes. Assim deu certo. Segue o código:

//Calculo do IMC

let peso = parseFloat(prompt('Digite seu peso(kg):')); let altura = parseFloat(prompt('Digite sua Altura(Metros):')); let resultado;

function calculoIMC(peso, altura) { let imc = peso / (altura * altura); resultado = imc.toFixed(2); return resultado } calculoIMC(peso, altura);

alert(resultado);

Agora a segunda parte do código que tenho que ajustar para funcionar.

Opa Daniel, eu marquei como solução sem querer, mas ainda falta a segunda parte do meu código que preciso de ajuda que é a parte da verificação do resultado.

Opa Consegui arrumar o código e agora está funcionando como eu gostaria, Obrigado Daniel.

Segue o código:

//Calculo do IMC

let peso = parseFloat(prompt('Digite seu peso(kg):')); let altura = parseFloat(prompt('Digite sua Altura(Metros):')); let resultado;

function calculoIMC(peso, altura) { let imc = peso / (altura * altura); resultado = imc.toFixed(2); return resultado } calculoIMC(peso, altura);

function verificarIMC(resultado){ if(resultado >= 18.5 && resultado <= 24.90) { alert(O seu IMC é ${resultado}. De acordo com a Organização Mundial da Saúde, seu IMC é considerado normal para a sua altura. Parabéns:)) } else { alert(O seu IMC é ${resultado}. De acordo com a Organização Mundial da Saúde, seu IMC está acima para a sua altura.) } }

verificarIMC(resultado);

Boa, era isso mesmo, eu usei uma verificação a mais pra dizer se o imc está abaixo, mas o código é o mesmo.

Não li todas as mensagens porque são muitas, mas acho que entendi os problemas. Aqui vão algumas dicas e possíveis correções:

  1. A função toFixed( ) retorna uma string, o que faria uma variável que você esperava ser um valor numérico armazenar na realidade uma string, que consequentemente faria ser impossível fazer operações com a variável. Para converter o resultado para valor numérico novamente, é só inserir um sinal de adição antes do uso da função.
  2. O nome dos parâmetros não precisam ser os mesmos dos argumentos, na verdade é bom eles serem diferentes porque o identificador (nome) do parâmetro deve deixar claro o que ele vai receber, e o nome do argumento deve identificar o que ele é.
  3. Quando você declara uma variável dentro de uma função, ela só é visível/existe no escopo daquela função, o que significa que ela não poderá ser usada em outras funções ou linhas do código. Para variáveis que serão usadas por outras funções ou em outras partes do código, elas devem ser globais, ou seja, declaradas fora de funções, em linhas do arquivo do código. No seu código por exemplo, a variável resultado deveria ter sido declarada fora da função calculoIMC( ) já que ela também é usada na função verificarIMC( ).

Seguindo o seu código, acho que ele poderia estar assim:

let peso = Number(prompt("Digite seu peso em kilogramas:")),
  altura = Number(prompt("Digite sua altura em metros:")),
  resultado = calculoIMC(peso, altura);

function calculoIMC(pesoKg, alturaMetros) {
  return +(pesoKg / (alturaMetros * alturaMetros)).toFixed(2);
}

function verificarIMC(resultadoIMC) {
  if (resultadoIMC >= 18.5 && resultadoIMC <= 24.9) {
    alert(`Seu IMC: é ${resultadoIMC}. De acordo com a Organização Mundial da Saúde, seu IMC é considerado normal para sua altura. `);
  } else {
    alert(`Seu IMC: é ${resultadoIMC}. De acordo com a Organização Mundial da Saúde, seu IMC está acima do recomendado para sua altura. `);
  }
}

verificarIMC(resultado);

Caso você queira um código mais enxuto, poderia ter feito assim:

let peso = Number(prompt("Digite seu peso em kilogramas:")),
  altura = Number(prompt("Digite sua altura em metros:")),
  resultado = calculoIMC(peso, altura);

function calculoIMC(pesoKg, alturaMetros) {
  return +(pesoKg / alturaMetros ** 2).toFixed(2);
}

alert(`Seu IMC: é ${resultado}. De acordo com a Organização Mundial da Saúde, seu IMC ${resultado >= 18.5 && resultado <= 24.9 ? "é considerado normal para sua altura" : "está acima do recomendado para sua altura"}.`);
  • A função Number( ) basicamente converte valores de outros tipos (por exemplo boolean ou string) para valor numérico.
  • Só uma curiosidade rápida que eu acho muito estranho mas doido ao mesmo tempo: dá pra usar a chamada de uma função como argumento para outra, contando que ela retorne algum valor, por exemplo no seu código é possível fazer isso:
verificarIMC(calculoIMC(peso, altura));