Mobile App Development · Dart/Flutter

03 · Funções — Desafios

Três desafios que combinam funções encadeadas para montar uma calculadora de pedidos, um boletim escolar e uma média de notas.

Desafio 1

desafio_01_calculadora_pedidos.dart

Calculadora de pedidos com três funções encadeadas, cada uma com responsabilidade única: calcular o subtotal, calcular o valor do desconto e calcular o total final — o resultado de uma alimenta a próxima.

// Desafio: criar uma calculadora de pedidos usando funções separadas.
// Cada função tem uma responsabilidade única (princípio da responsabilidade única).

// Calcula o subtotal: preço unitário × quantidade.
double calcularSubtotal(double precoUnitario, int quantidade) {
  return precoUnitario * quantidade;
}

// Calcula o valor do desconto: subtotal × percentual (ex.: 0.15 = 15%).
double calcularDesconto(double subtotal, double percentualDesconto) {
  return subtotal * percentualDesconto;
}

// Calcula o total final: subtotal menos o desconto já calculado.
double calcularTotal(double subtotal, double desconto) {
  return subtotal - desconto;
}

void main() {
  String produto = 'Mochila';
  int quantidade = 2;
  double precoUnitario = 120.00;
  // Desconto de 15% expresso como proporção decimal (0.15).
  double percentualDesconto = 0.15;

  // Encadeia as funções: cada resultado alimenta a próxima função.
  double subtotal = calcularSubtotal(precoUnitario, quantidade);
  double desconto = calcularDesconto(subtotal, percentualDesconto);
  double total = calcularTotal(subtotal, desconto);

  // Exibe o resumo do pedido com todos os valores formatados.
  print('=== Pedido ===');
  print('Produto: $produto');
  print('Subtotal: R\$ ${subtotal.toStringAsFixed(2)}');
  print('Desconto: R\$ ${desconto.toStringAsFixed(2)}');
  print('Total: R\$ ${total.toStringAsFixed(2)}');
}

Saída esperada

=== Pedido ===
Produto: Mochila
Subtotal: R$ 240.00
Desconto: R$ 36.00
Total: R$ 204.00

Como executar

dart run 03-Funcoes/03-Desafios/codigo_fonte/desafio_01_calculadora_pedidos.dart

Desafio 2

desafio_02_boletim_aluno.dart

Boletim escolar com três funções dedicadas: uma calcula a média de duas notas, outra classifica a situação do aluno (Aprovado, Recuperação ou Reprovado) e uma terceira, com parâmetros nomeados, exibe o boletim completo.

// Desafio: criar um boletim escolar com funções dedicadas para calcular e classificar.
// Demonstra separação de responsabilidades: cada função faz apenas uma coisa.

// Calcula a média aritmética de duas notas.
double calcularMedia(double primeiraNota, double segundaNota) {
  // Soma as notas e divide por 2 para obter a média.
  return (primeiraNota + segundaNota) / 2;
}

// Classifica a situação do aluno com base na média calculada.
// Retorna uma String descritiva do resultado (Aprovado, Recuperação ou Reprovado).
String classificarSituacao(double media) {
  // Aprovado: média igual ou superior a 7.
  if (media >= 7) {
    return 'Aprovado';
  }

  // Recuperação: média entre 5 (inclusive) e 7 (exclusive).
  if (media >= 5) {
    return 'Recuperacao';
  }

  // Reprovado: média abaixo de 5.
  return 'Reprovado';
}

// Exibe o boletim completo do aluno usando parâmetros nomeados.
void exibirBoletim({required String aluno, required double media}) {
  print('=== Boletim ===');
  print('Aluno: $aluno');
  // Formata a média com 2 casas decimais.
  print('Media: ${media.toStringAsFixed(2)}');
  // Chama 'classificarSituacao' para obter e exibir o resultado final.
  print('Situacao: ${classificarSituacao(media)}');
}

void main() {
  // Calcula a média do aluno Lucas com notas 8.0 e 6.5 → média = 7.25.
  double media = calcularMedia(8.0, 6.5);
  // Passa o nome e a média calculada para exibir o boletim formatado.
  exibirBoletim(aluno: 'Lucas', media: media);
}

Saída esperada

=== Boletim ===
Aluno: Lucas
Media: 7.25
Situacao: Aprovado

Como executar

dart run 03-Funcoes/03-Desafios/codigo_fonte/desafio_02_boletim_aluno.dart

Desafio extra

desafio_funcoes.dart

Calcula a média de uma lista de notas (List<double>) usando reduce() para acumular a soma em uma única expressão, com proteção contra divisão por zero se a lista estiver vazia.

// Desafio: calcular a média de uma lista de notas usando função com retorno.
// Usa reduce() para acumular a soma em uma única expressão funcional.

// Calcula a média aritmética de uma lista de notas.
double calcularMedia(List<double> notas) {
  // Proteção contra divisão por zero se a lista estiver vazia.
  if (notas.isEmpty) return 0;

  // reduce() aplica a função acumuladora sobre cada elemento da lista.
  final double soma = notas.reduce((acumulador, nota) => acumulador + nota);
  return soma / notas.length;
}

void main() {
  // Lista de notas do aluno a ser avaliada.
  final List<double> notas = [7.5, 8.0, 9.0, 6.5];
  final double media = calcularMedia(notas);

  print('Notas: $notas');
  print('Média final: ${media.toStringAsFixed(2)}');
}

Saída esperada

Notas: [7.5, 8.0, 9.0, 6.5]
Média final: 7.75

Como executar

dart run 03-Funcoes/03-Desafios/codigo_fonte/desafio_funcoes.dart