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