Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Cálculo do IMC, como você faria?

Olá!

Estou cursando a formação em PHP e o terceiro desafio é calcular o IMC e exibir se você está abaixo, dentro ou acima do peso.

Fui um pouco além e utilizei um vetor para que a resposta fosse um pouco mais específica de acordo com a fonte.

O que dá para melhorar no código?

Obrigado!

// Terceiro desafio - Cálculo do IMC
// Fonte: https://www.minhavida.com.br/alimentacao/tudo-sobre/32159-imc
$altura = 1.90;
$peso = 120;

$imc = $peso / ($altura ** 2);

$dicionario = [
    18.5 => "Abaixo do peso",
    24.9 => "Peso normal",
    29.9 => "Sobrepeso",
    34.9 => "Obesidade grau 1",
    39.9 => "Obesidade grau 2",
    40.0 => "Obesidade grau 3"
];

foreach($dicionario as $key => $value){
    //Se a chave for menor que 40, então testa os valores de acordo com o IMC. 
    if($key < 40.0){
        if($imc <= $key){
            echo PHP_EOL."$value";
            break;
        }
    }else{ //Se a chave for maior ou igual a 40
        echo PHP_EOL."$value";
    }
}
5 respostas

Opa, Luiz. Gostei bastante da sua implementação!

Do seu código eu só tiraria o primeiro if, já que ele não se faz necessário. Ficaria assim:

foreach($dicionario as $key => $value){
    if($imc <= $key){
        echo PHP_EOL."$value";
        break;
    }
}

Parabéns por ir além do proposto! É assim que aprendemos mais. :-D

Olá, Vinicius Dias .

Agradeço pelo comentário e principalmente pelo curso.

No caso da sua implementação, eu havia feito da mesma forma no início, porém, quando o IMC supera os 40 pontos não há resposta o que seria um bug e deixaria de atender pessoas com "Obesidade grau 3".

Aaahhhh Verdade, Luiz!

Mas agora, olhando com mais atenção, percebi uma coisa. Você está utilizando as chaves de um array (seu $dicionario) como float. Infelizmente no PHP isso não é permitido.

Execute var_dump($dicionario) e repare que as chaves reais estão diferentes das que você definiu.

Desculpe ter deixado isso passar inicialmente.

Pra manter o exemplo simples, minha sugestão para agora seria voltar para a sequência de ifs.

Vinicius,

Perfeito, realmente estava incorreto. Para corrigir isso e manter no mesmo "padrão" de código, eu joguei as chaves para string e converti os valores dentro dos IFs. Creio que agora esteja de acordo, coloquei alguns "echo" para verificar os valores dentro do loop.

$dicionario = [
    "18.5" => "Abaixo do peso",
    "24.9" => "Peso normal",
    "29.9" => "Sobrepeso",
    "34.9" => "Obesidade grau 1",
    "39.9" => "Obesidade grau 2",
    "40.0" => "Obesidade grau 3"
];

foreach($dicionario as $key => $value){
    //Se a chave for menor que 40, então testa os valores de acordo com o IMC. 
    if((float) $key < 40.0){
        if($imc <= (float) $key){
            echo PHP_EOL."$value";
            break;
        }
    }else{ //Se o IMC for maior ou igual a 40
        echo PHP_EOL."$value";
    }
}

Talvez não seja o ideal para códigos mais complexos e extensos, porém, para o desafio em questão creio que atenda.

solução

Show de bola, Luiz. Para o desafio em questão, atende sim.

Para códigos mais complexos você utilizaria alguns padrões onde a orientação a objetos ajudaria.

Novamente, parabéns!

Forte abraço e bons estudos!