No description
Find a file
2026-09-01 13:17:17 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:17:17 +02:00
src initial content 2026-09-01 13:17:15 +02:00
tests initial content 2026-09-01 13:17:15 +02:00
.gitignore Initial commit 2026-09-01 11:16:59 +00:00
Cargo.lock initial content 2026-09-01 13:17:15 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:17:17 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:17:17 +02:00
README.md initial content 2026-09-01 13:17:15 +02:00

Lição 56: Certificação Final (Comprehensive Review, Capstone Project)

1. Narrativa

A jornada do piloto pela Academia Æther chega ao momento decisivo — a Certificação Final. Este é o teste integrador que avalia tudo: ownership, traits, iterators, tratamento de erros e modelagem com enums. Cada desafio combina múltiplos conhecimentos em um sistema coeso. Apenas os pilotos certificados estão prontos para o campo de batalha real. Que o Borrow Checker esteja com você.

2. Conceito

A certificação final integra todos os conceitos do curso em um sistema unificado:

  • Ownership & Borrowing: Gerenciamento correto de dados dos candidatos
  • Traits & Generics: Comparações e ordenações via Ord, PartialEq
  • Iterators: Processamento de resultados com map, filter, fold
  • Error Handling: Result/Option para notas e aprovações
  • Enums: Modelagem de status, áreas e níveis de certificação

3. Requisitos

  • Modelar candidatos, provas e certificações
  • Implementar cálculos de pontuação e percentual
  • Determinar status de certificação por regras
  • Classificar e filtrar candidatos
  • Gerar relatórios finais de desempenho

4. Design de Dados

graph LR
    A[CandidatoPiloto] --> B[Vec de ResultadoProva]
    B --> C[calcular_pontuacao_total]
    A --> D[calcular_percentual]
    D --> E[determinar_certificacao]
    E --> F[StatusCertificacao]
    A --> G[gerar_relatorio]
    G --> H[RelatorioCertificacao]

5. Diagrama de Fluxo

flowchart TD
    A[Candidato] --> B[Para cada Área]
    B --> C[Pontuação >= 60%?]
    C -->|Não| D[Reprovado na Área]
    C -->|Sim| E[Aprovado na Área]
    D --> F{Mais áreas?}
    E --> F
    F -->|Sim| B
    F -->|Não| G{Áreas reprovadas?}
    G -->|Sim| H[Recusado]
    G -->|Não| I[Calcular Percentual]
    I --> J{Percentual?}
    J -->|< 70%| K[Cadete]
    J -->|< 85%| L[Piloto]
    J -->|< 95%| M[PilotoSenior]
    J -->|>= 95% + 10 missões| N[Comandante]
    J -->|>= 95% sem missões| M

6. Funções

Função Descrição
criar_candidato Cria novo candidato vazio
adicionar_resultado Registra resultado de prova
calcular_pontuacao_total Soma pontuações obtidas
calcular_pontuacao_maxima Soma pontuações máximas
calcular_percentual Calcula percentual (0-100%)
passou_na_area Verifica aprovação por área
areas_reprovadas Lista áreas com nota < 60%
determinar_certificacao Determina status final
gerar_relatorio Gera relatório completo
filtrar_por_status Filtra candidatos por status
encontrar_melhor_candidato Encontra maior percentual
classificar_candidatos Ordena por desempenho

7. Exemplo

let mut c = criar_candidato("Rex", "REG-001");
adicionar_resultado(&mut c, AreaConhecimento::Ownership, 90, 100);
adicionar_resultado(&mut c, AreaConhecimento::Traits, 85, 100);
c.missoes_completadas = 15;
let status = determinar_certificacao(&c);
assert_eq!(status, StatusCertificacao::PilotoSenior);
let relatorio = gerar_relatorio(&c);
assert_eq!(relatorio.percentual, 87.5);

8. Missão

  1. Implementar criar_candidato e adicionar_resultado
  2. Implementar calcular_pontuacao_total usando .map().sum()
  3. Implementar calcular_pontuacao_maxima de forma similar
  4. Implementar calcular_percentual com divisão segura (evitar / 0)
  5. Implementar passou_na_area verificando pontuação >= 60% do máximo
  6. Implementar areas_reprovadas filtrando áreas abaixo do limiar
  7. Implementar determinar_certificacao aplicando as regras em cascata
  8. Implementar gerar_relatorio combinando todas as informações
  9. Implementar filtrar_por_status, encontrar_melhor_candidato e classificar_candidatos

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • Use .iter().map(|r| r.pontuacao).sum() para somar pontuações
  • Divisão por zero: verifique se pontuacao_maxima > 0 antes de dividir
  • Aprovação: pontuacao * 100 / maximo >= 60 (evita floats)
  • Classificação: candidatos.iter().max_by() para encontrar o melhor
  • determinar_certificacao: verifique reprovações primeiro, depois percentual
  • StatusCertificacao deriva Ord — a ordem dos variants importa