Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.