Mobile App Development · Dart/Flutter

14 · Desafio IMC — Exercícios

Uma versão completa e interativa do cálculo de IMC: lê peso e altura do usuário, valida a entrada, calcula, classifica e recomenda.

Exercício

imc_exercicio.dart

Programa interativo que lê peso e altura pelo terminal usando stdin, com uma função lerDoublePositivo que repete a pergunta até receber um número válido maior que zero (aceitando vírgula como separador decimal via double.tryParse). Em seguida calcula o IMC, classifica o resultado em uma das quatro faixas com classificarImc e devolve uma recomendação personalizada com recomendacaoPorFaixa, usando um switch.

Como o programa lê valores digitados pelo usuário, a saída real depende do que for informado a cada execução — não existe uma saída fixa.

// Exercício: calcular o IMC do usuário e fornecer uma recomendação personalizada.
// Usa funções separadas para leitura, cálculo, classificação e recomendação.
import 'dart:io';

void main() {
  // Lê peso e altura do usuário validando que são números positivos.
  final double peso = lerDoublePositivo('Digite seu peso (kg): ');
  final double altura = lerDoublePositivo('Digite sua altura (m): ');

  // Fórmula do IMC: peso / (altura ao quadrado).
  final double imc = peso / (altura * altura);
  final String classificacao = classificarImc(imc);
  final String recomendacao = recomendacaoPorFaixa(classificacao);

  // Exibe os resultados formatados.
  print('IMC: ${imc.toStringAsFixed(2)}');
  print('Classificação: $classificacao');
  print('Recomendação: $recomendacao');
}

// Lê um double positivo do stdin; repete até o usuário digitar um valor válido.
double lerDoublePositivo(String mensagem) {
  while (true) {
    stdout.write(mensagem);
    final String? entrada = stdin.readLineSync();

    if (entrada == null || entrada.trim().isEmpty) {
      print('Entrada inválida. Tente novamente.');
      continue;
    }

    // Aceita vírgula como separador decimal (padrão brasileiro).
    final double? valor = double.tryParse(entrada.replaceAll(',', '.'));

    if (valor == null || valor <= 0) {
      print('Informe um número válido maior que zero.');
      continue;
    }

    return valor;
  }
}

// Classifica o IMC nas quatro faixas padrão da OMS.
String classificarImc(double imc) {
  if (imc < 18.5) return 'Abaixo do peso';
  if (imc < 25.0) return 'Peso normal';
  if (imc < 30.0) return 'Sobrepeso';
  return 'Obesidade';
}

// Retorna uma recomendação textual de acordo com a faixa de IMC.
String recomendacaoPorFaixa(String classificacao) {
  switch (classificacao) {
    case 'Abaixo do peso':
      return 'Procure orientação profissional para ganho de peso saudável.';
    case 'Peso normal':
      return 'Continue mantendo uma rotina saudável.';
    case 'Sobrepeso':
      return 'Avalie ajustes na alimentação e prática de atividades físicas.';
    default:
      // Cobre a faixa 'Obesidade' e qualquer classificação não mapeada.
      return 'Busque acompanhamento médico para um plano individualizado.';
  }
}

Saída esperada

Programa interativo — pede peso e altura no terminal e repete a pergunta se o valor digitado for inválido. Exemplo de execução digitando 72 para o peso e 1.75 para a altura:

Digite seu peso (kg): 72
Digite sua altura (m): 1.75
IMC: 23.51
Classificação: Peso normal
Recomendação: Continue mantendo uma rotina saudável.

Como executar

O terminal vai pausar aguardando você digitar o peso e, em seguida, a altura — informe os valores e pressione Enter após cada um.

dart run 14-DesafioIMC/02_Exercicios/codigo_fonte/imc_exercicio.dart