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

Código que não funciona

Olá, fiz um código para calcular o IMC, e depois dizer quanto de peso a pessoa precisar perder ou ganhar para entrar na faixa idela... porém ele não funciona por 2 motivos, um por conta do "parseInt" que coloquei no prompt do peso e altura (não sei pq não posso colocar o parseInt nesse caso) e outro por conta da função em si que eu não soube desenvolver (me julguem)

<meta charset="UTF-8">

<script>

    function mostra(mensagem){
        document.write(mensagem);
        document.write("<br><br>")
    }

    function calculaMedia(nota1, nota2){
        return (nota1 + nota2) / 2;
    }

var nome = prompt("Qual o seu nome?");
var pesoInformado = parseInt(prompt("Qual o seu peso?"));
var alturaInformada = parseInt(prompt("Qual a sua altura"));

function imcCalculado(peso, altura) {
    return (peso / (altura * altura));
    };
var imc = imcCalculado(pesoInformado, alturaInformada);

mostra(nome + " seu IMC é " + imc + "!");

var imcMais = imc - 35;
var pesoMais = imcMais * (alturaInformada * alturaInformada)
var precisoPerder =  pesoInformado - pesoMais;

var imcMenos = 18.5 - imc;
var pesoMenos = imcMenos * (alturaInformada * alturaInformada)
var precisoGanhar = pesoInformado + pesoMenos;

if(imc > 35) {
    mostra("Você precisa perder " + precisoPerder + " quilos para entrar no estado saudável");
    };
if(imc >= 18.5 && imc <= 35) {
    mostra("Parabéns, você está dentro da faixa recomendada!");
    ;}
if(imc < 18.5) {
    mostra("Você precisa ganhar " + precisoGanhar + " quilos para entrar no estado saudável");
    };




</script>
2 respostas

Eduardo, a função parseInt() converte as strings para inteiro. Você deve usar parseFloat(), pois peso e altura possuem casas decimais (ex: 62.7 kg e 1.71 m).

Faz um teste aí e dá um retorno.

Abraço.

solução!

Olá Eduardo! Parabéns pela iniciativa de ir testando novas possibilidades. Fiz algumas pequenas alterações no seu código, dá uma olhada abaixo:

<meta charset="UTF-8">

<script>
    function mostra(mensagem) {
        document.write(mensagem);
        document.write("<br><br>")
    }

    // function calculaMedia(nota1, nota2){
    //     return (nota1 + nota2) / 2;
    // }

    var nome = prompt("Qual o seu nome?");
    var pesoInformado = parseFloat(prompt("Qual o seu peso?"));
    var alturaInformada = parseFloat(prompt("Qual a sua altura"));

    function imcCalculado(peso, altura) {
        return (peso / (altura * altura));
    };
    var imc = Math.round(imcCalculado(pesoInformado, alturaInformada));

    mostra(nome + " seu IMC é " + imc + "!");

    if (imc > 35) {
        var imcMais = imc - 35;
        var pesoMais = imcMais * (alturaInformada * alturaInformada)
            // var precisoPerder =  pesoInformado - pesoMais;
        mostra("Você precisa perder " + pesoMais + " quilos para entrar no estado saudável");
    };
    if (imc >= 18.5 && imc <= 35) {
        mostra("Parabéns, você está dentro da faixa recomendada!");;
    }
    if (imc < 18.5) {
        var imcMenos = 18.5 - imc;
        var pesoMenos = imcMenos * (alturaInformada * alturaInformada)
            // var precisoGanhar = pesoInformado + pesoMenos;
        mostra("Você precisa ganhar " + pesoMenos + " quilos para entrar no estado saudável");
    };
</script>
  1. As linhas que coloquei como comentário (//) são trechos de código que não são necessários para o funcionamento do seu programa.

  2. Troquei o parseInt pelo parseFloat. O parseInt vai te retornar um número inteiro, então, neste caso, o cálculo fica impreciso. Veja só, se você colocar o peso como 110 e a altura como 1.7 o parseInt vai converter esse 1.7 em 1 e assim o seu imc vai ter como resultado 110 / (1 * 1) = 110. Com o parseFloat esse 1.7 será entendido como 1.7 mesmo e o seu imc vai ter como resultado 110 / (1.7 * 1.7) = 38.6022..., ok?

  3. Também coloquei a função Math.round() no cálculo do imc para que o retorno fosse um número arredondado, assim o resultado dos dados inseridos acima será Math.round(110 / (1.7 * 1.7)) = 38.

  4. As variáveis precisoPerder e precisoGanhar não retornam o que você pretende com elas, elas retornam o peso ideal, porque na verdade o que você precisa perder é o que está na variável pesoMais e o que você precisa ganhar é o que está na variável pesoMenos e são elas que devem ser passadas para a função mostra(). Dá uma revisada na sua lógica e verifica se consegue enxergar essa diferença. Não troquei os nomes para justamente deixar mais claro a mudança, mais o ideal é a variável pesoMais se chamar precisoPerder e a variável pesoMenos se chamar precisoGanhar.

  5. Essa lógica de precisoPerder e precisoGanhar coloquei dentro dos ifs para justamente serem calculadas somente quando necessário. Neste programa simples isso não faz muita diferença, mas em programas mais complexos ganha-se muito em tempo de processamento, então já é bom ir pensando nisso também, ok?

Espero que tenha entendido esses pontos e se sua dúvida foi sanada marque o tópico como solucionado, assim você ajuda outros colegas com a mesma dúvida.

Abraços e sucesso nos estudos!