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

Implementação do isNaN no cálculo de IMC

<script>

        function pulaLinha() {
            document.write("<br><br>");
        }
        function exibir(frase) {
            pulaLinha();
            document.write("<big>" + frase + "</big>");
        }
        function calculaImc (pesoInformado, alturaInformada) {
            var imc = pesoInformado / (alturaInformada * alturaInformada);
            return imc;

        }

        var nome = prompt("Informe o seu nome");
        var pesoInformado = prompt(nome + ", informe seu peso");
        var alturaInformada = prompt(nome + ", informe sua altura");
        var imc = calculaImc(pesoInformado,alturaInformada);

        exibir(nome + ", o seu IMC é: " + imc);

        while( isNaN(pesoInformado) ) {
            pesoInformado = prompt(nome + ", informe seu peso"); 
            pesoInformado = pesoInformado + 1;   
        }
        while( isNaN(alturaInformada) ) {
            alturaInformada = prompt(nome + ", informe sua altura");
            alturaInformada = alturaInformada + 1;    
        }


        if(imc < 18.5) {

            exibir("Você está abaixo do recomendado");
        }

        if(imc >= 18.5 && imc <= 35) {

            exibir("Seu IMC está excelente!");

        }

        if(imc > 35) {

            exibir("Você está acima do recomendado");
        }

    </script>
10 respostas

Henrique,

disponibilize seu código pra gente entender melhor. E se colar seu código junto com a mensagem, ele não aparece.

Deve:

  • copiar seu código;
  • clicar em "<> inserir código";
  • e colar sobre o texto "insira seu código aqui".

Obrigado, abaixo vou deixar o que estava escrito separado: Obs: Se o peso e a altura é digitado corretamente da primeira vez o código funciona normalmente, inclusive a parte que acrescentei (a pessoa digita no peso ou altura um valor que não seja número aquela instrução irá se repetir até de fato digitar um número), porém se a pessoa erra e repete o processo digitando o número ao concluir o peso e altura irá aparecer NaN.

Olá Henrique, tudo bem?

Coloque as duas linhas abaixo depois dos laços while. Assim, elas capturam os novos valores informados:

        while( isNaN(pesoInformado) ) {
            pesoInformado = prompt(nome + ", informe seu peso"); 
            pesoInformado = pesoInformado + 1;   
        }
        while( isNaN(alturaInformada) ) {
            alturaInformada = prompt(nome + ", informe sua altura");
            alturaInformada = alturaInformada + 1;    
        }


       var imc = calculaImc(pesoInformado,alturaInformada);     ### ESSA LINHA!!

        exibir(nome + ", o seu IMC é: " + imc);      ### E ESSA LINHA!

Testa aí e nos diga o resultado.

Você é brasa broto, agora não aparece mais NaN como aparecia antes, porém agora acontece uma coisa curiosa, na primeira tentativa informa o IMC corretamente como já fazia antes, mas agora o resultado que aparece se houver mais tentativas é multiplicado por 10, sendo que se fizer corretamente da primeira vez isso não acontece.

Henrique,

seu código tem uns pequenos problemas. Pegue seu código original;

Esta linha:

exibir(nome + ", o seu IMC é: " + imc);

deve ser modificada (só o "+ imc"), e colocada abaixo e fora do segundo while, assim:

exibir(nome + ", o seu IMC é: " + calculaImc(pesoInformado, alturaInformada));

Para evitar o erro de cálculo, deve excluir estas duas linhas:

pesoInformado = pesoInformado + 1; 

alturaInformada = alturaInformada + 1;

Do jeito que está, se responder com algo não numérico à primeira pergunta (peso), ela passa à segunda pergunta (altura), e só depois volta para a primeira pra solicitar de novo um peso que seja numérico.

Para evitar isto, deve atribuir às variáveis um valor não numérico na declaração das duas variáveis, assim:

        var pesoInformado = "X";
        var alturaInformada = "X"

ao invés de atribuir duas vezes valores a elas com prompt.


E só como complemento, pode implementar um arredondamento ao valor calculado de imc, com .toFixed(2):

O código, sem alterar sua lógica, com estas alterações, ficaria assim:

<meta charset="UTF-8">

<script>

        function pulaLinha() {
            document.write("<br><br>");
        }
        function exibir(frase) {
            pulaLinha();
            document.write("<big>" + frase + "</big>");
        }
        function calculaImc (pesoInformado, alturaInformada) {
            var imc = pesoInformado / (alturaInformada * alturaInformada);
            //return imc;
            return imc.toFixed(2);
        }

        var nome = prompt("Informe o seu nome");
        //var pesoInformado = prompt(nome + ", informe seu peso");
        var pesoInformado = "X";
        //var alturaInformada = prompt(nome + ", informe sua altura");
        var alturaInformada = "X";
        var imc = calculaImc(pesoInformado,alturaInformada);

        //exibir(nome + ", o seu IMC é: " + imc);

        while( isNaN(pesoInformado) ) {
            pesoInformado = prompt(nome + ", informe seu peso"); 
            //pesoInformado = pesoInformado + 1;   
        }
        while( isNaN(alturaInformada) ) {
            alturaInformada = prompt(nome + ", informe sua altura");
            //alturaInformada = alturaInformada + 1;    
        }

        exibir(nome + ", o seu IMC é: " + calculaImc(pesoInformado,alturaInformada));

        if(imc < 18.5) {

            exibir("Você está abaixo do recomendado");
        }

        if(imc >= 18.5 && imc <= 35) {

            exibir("Seu IMC está excelente!");

        }

        if(imc > 35) {

            exibir("Você está acima do recomendado");
        }

    </script>

pode apagar as linhas comentadas com //.

Bons estudos!

solução!

Seu código foi de grande ajuda, porém ainda precisei fazer leves alterações para funcionar perfeitamente, aproveitei para deixar algumas anotações para me ajudar e ajudar quem precisar do código:

<meta charset="UTF-8">

<script>

        function pulaLinha() {
            document.write("<br><br>");
        }
        function exibir(frase) {
            pulaLinha();
            document.write("<big>" + frase + "</big>");
        }
        function calculaImc (pesoInformado, alturaInformada) {
            var imc = pesoInformado / (alturaInformada * alturaInformada);//Cálculo de IMC.
            //return imc;
            return imc.toFixed(2);//Serve para arredondar o resultado, o número entre parênteses são as casas depois da vírgula.
        }

        var nome = prompt("Informe o seu nome");
        //Declarando um valor não numérico para as variáveis abaixo, impede que o usuário avance caso digite um valor não numérico.
        var pesoInformado = "X";
        var alturaInformada = "X";
        var imc = calculaImc(pesoInformado,alturaInformada);

        // O isNaN abaixo serve para caso o que for digitado não seja um número, obriga digitar novamente.
        while( isNaN(pesoInformado) ) {
            pesoInformado = prompt(nome + ", informe seu peso"); 
        }
        while( isNaN(alturaInformada) ) {
            alturaInformada = prompt(nome + ", informe sua altura");   
        }

        //Abaixo ao invés de declarar 'imc' , deve ser declarado 'calculaImc(peso informado,alturaInformada)'.
        exibir(nome + ", o seu IMC é: " + calculaImc(pesoInformado,alturaInformada));

        if(calculaImc(pesoInformado,alturaInformada) < 18.5) {

            exibir("Você está abaixo do recomendado");
        }

        if(calculaImc(pesoInformado,alturaInformada) >= 18.5 && calculaImc(pesoInformado,alturaInformada)  <= 35) {

            exibir("Seu IMC está excelente!");

        }

        if(calculaImc(pesoInformado,alturaInformada) > 35) {

            exibir("Você está acima do recomendado");
        }

    </script>

Henrique,

não é meu código. É seu código, com as correções. Mas realmente faltou uma alteração. Bom que pensou pra tentar resolvê-la.

Mas na verdade, bastaria colocar a linha abaixo logo abaixo dos 'while' para funcionar como queria. E assim também não precisaria ficar invocando a function calculaImc várias vezes.

var imc = calculaImc(pesoInformado,alturaInformada);

Ficaria assim, seu código:

<meta charset="UTF-8">

<script>

    function pulaLinha() {
        document.write("<br><br>");
    }
    function exibir(frase) {
        pulaLinha();
        document.write("<big>" + frase + "</big>");
    }
    function calculaImc (pesoInformado, alturaInformada) {
        var imc = pesoInformado / (alturaInformada * alturaInformada);
        //return imc;
        return imc.toFixed(2);
    }

    var nome = prompt("Informe o seu nome");
    var pesoInformado = "X";
    var alturaInformada = "X";        

    while( isNaN(pesoInformado) ) {
        pesoInformado = prompt(nome + ", informe seu peso"); 
    }

    while( isNaN(alturaInformada) ) {
        alturaInformada = prompt(nome + ", informe sua altura");
    }

    var imc = calculaImc(pesoInformado,alturaInformada);

    exibir(nome + ", o seu IMC é: " + imc);

    if(imc < 18.5) {
        exibir("Você está abaixo do recomendado");
    }

    if(imc >= 18.5 && imc <= 35) {
        exibir("Seu IMC está excelente!");

    }

    if(imc > 35) {
        exibir("Você está acima do recomendado");
    }

</script>

Bons estudos!

Eu fiquei meio sem entender porque ndeixar somente a variável 'imc' não estava funcionando, obrigado mesmo!

É porque imc estava sendo calculado antes de saber quais valores deveriam ser usados para o cálculo.