Mobile App Development · Dart/Flutter
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
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