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!

1
resposta

IMC

Anna Júlia está criando um sistema para calcular o Índice de Massa Corporal (IMC) e fornecer recomendações básicas. O programa deve receber o peso e a altura de uma pessoa e exibir o valor do IMC, além de indicar se está abaixo do peso, com peso normal ou acima do peso. Crie um programa que receba o peso (em kg) e a altura (em metros) e calcule o IMC usando a fórmula: IMC = peso / (altura ** 2) Depois, exiba o valor do IMC e uma mensagem indicando se está abaixo do peso (IMC < 18.5), peso normal (18.5 <= IMC < 25) ou acima do peso (IMC >= 25).

fui buscar um modelo que pudesse avalair outras variaveis

import json, math, os
from datetime import datetime

H = "historico_imc.json"

def c_h():
    try:
        with open(H) as f: return json.load(f)
    except: return []

def s_h(d):
    with open(H, "w") as f: json.dump(d, f, indent=4)

def p_g(s, c, p, q=None, a=None):
    if a is None: raise ValueError("Altura em cm obrigatoria")
    if s == "masculino":
        if c <= p: raise ValueError("Cintura deve ser > pescoço")
        return 86.010 * math.log10(c - p) - 70.041 * math.log10(a) + 36.76
    else:
        if q is None: raise ValueError("Quadril obrigatorio para mulheres")
        s = c + q - p
        if s <= 0: raise ValueError("Soma (cintura+quadril-pescoço) deve ser > 0")
        return 163.205 * math.log10(s) - 97.684 * math.log10(a) - 78.387

def c_g(p, s):
    if s == "masculino":
        return "Atleta (muito baixo)" if p < 6 else "Excelente" if p < 13 else "Bom" if p < 17 else "Regular" if p < 25 else "Alto (obesidade)"
    return "Atleta (muito baixo)" if p < 14 else "Excelente" if p < 20 else "Bom" if p < 24 else "Regular" if p < 31 else "Alto (obesidade)"

def c_i(i):
    if i < 16: return "Magreza grau III", "Alto risco"
    if i < 17: return "Magreza grau II", "Risco moderado"
    if i < 18.5: return "Magreza grau I", "Risco leve"
    if i < 25: return "Peso normal", "Saude ideal"
    if i < 30: return "Sobrepeso", "Atencao"
    if i < 35: return "Obesidade grau I", "Risco moderado"
    if i < 40: return "Obesidade grau II", "Risco grave"
    return "Obesidade grau III", "Alto risco"

def c_r(r, s):
    if s == "masculino":
        return ("Baixo risco", "") if r < 0.85 else ("Risco moderado", "") if r < 0.95 else ("Alto risco", "")
    return ("Baixo risco", "") if r < 0.75 else ("Risco moderado", "") if r < 0.85 else ("Alto risco", "")

def f(s):
    while True:
        try: return float(input(s))
        except: print("Valor invalido. Digite um numero.")

def main():
    print("\n" + "=" * 50)
    print("CALCULADORA DE IMC AVANCADA")
    print("=" * 50)
    
    print("\nDados Basicos:")
    p = f("Digite seu peso (kg): ")
    a = f("Digite sua altura (m): ")
    s = input("Digite seu sexo (masculino/feminino): ").strip().lower()
    while s not in ["masculino", "feminino", "m", "f"]:
        print("Opcao invalida. Digite 'masculino' ou 'feminino'.")
        s = input("Digite seu sexo (masculino/feminino): ").strip().lower()
    s = "masculino" if s in ["masculino", "m"] else "feminino"
    
    print("\nCircunferencias (em cm):")
    ci = f("Cintura: ")
    pe = f("Pescoço: ")
    q = f("Quadril: ") if s == "feminino" else None
    
    imc = p / (a ** 2)
    ic, ir = c_i(imc)
    a_cm = a * 100
    
    try:
        pg = p_g(s, ci, pe, q, a_cm)
        gc = c_g(pg, s)
    except ValueError as e:
        print(f"Aviso: {e}")
        pg, gc = None, None
    
    r = ci / q if q else None
    rc, re = c_r(r, s) if r else (None, None)
    
    print("\n" + "=" * 50)
    print("RESULTADOS")
    print("=" * 50)
    print(f"\nIMC: {imc:.2f}")
    print(f"   Classificacao: {ic} ({ir})")
    if pg: print(f"\nPercentual de Gordura: {pg:.2f}%\n   Classificacao: {gc}")
    if r: print(f"\nRelacao Cintura-Quadril (RCQ): {r:.2f}\n   Risco: {rc}")
    
    if input("\nSalvar no historico? (s/n): ").lower() == "s":
        h = c_h()
        h.append({"data": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "peso": p, "altura": a, "sexo": s, 
                  "imc": round(imc, 2), "imc_class": ic, "gordura": round(pg, 2) if pg else None, 
                  "gordura_class": gc, "rcq": round(r, 2) if r else None, "rcq_class": rc})
        s_h(h)
        print(f"Salvo! Total: {len(h)}")
    
    if input("\nVer historico? (s/n): ").lower() == "s":
        h = c_h()
        if h:
            print("\nHISTORICO:")
            for i, m in enumerate(h, 1):
                print(f"{i}. {m['data']} - IMC: {m['imc']} ({m['imc_class']})")
                if m.get("gordura"): print(f"   Gordura: {m['gordura']}% ({m['gordura_class']})")
                if m.get("rcq"): print(f"   RCQ: {m['rcq']} ({m['rcq_class']})")
        else: print("Nenhuma medicao salva.")

if __name__ == "__main__":
    main()
1 resposta

Oi, Luckas. Tudo certo?

Sua solução para calcular o IMC e fornecer recomendações foi significativamente expandida além do escopo inicial, implementando cálculos de percentual de gordura, relação cintura-quadril e um sistema completo de histórico. O código utiliza estruturas condicionais if e elif de forma eficiente através de funções bem organizadas, onde cada uma tem uma responsabilidade específica. A validação de entrada com tratamento de exceções garante que o programa continue robusto mesmo com dados inesperados, enquanto o uso de JSON permite persistência dos dados entre execuções.

A organização em funções como c_i para classificação de IMC, p_g para percentual de gordura e c_r para avaliação de risco demonstra bom entendimento de modularização. As operações lógicas e matemáticas estão implementadas corretamente, assim como a integração com a biblioteca datetime para registrar quando cada medição foi realizada. Essa abordagem profissional transforma um exercício simples em uma ferramenta funcional e reutilizável.

Considerando essa estrutura modularizada que você desenvolveu, como você organizaria o código se precisasse adicionar novos indicadores de saúde, como taxa metabólica basal ou consumo calórico diário?

Obrigado por compartilhar uma solução tão elaborada conosco. Parabéns pela iniciativa em expandir o projeto e continue trazendo seus trabalhos para o fórum. Ele está à sua disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!