Capítulo 20: Projeto Integrador Final - FastLog TMS (Fleet & Inventory System)

🎯 Objetivo da Aula

Chegou o momento de consolidar todos os conhecimentos adquiridos ao longo dos 20 capítulos do curso. Você não é mais um iniciante que digita comandos soltos: agora você é um Desenvolvedor de Algoritmos Estruturados.

Nesta aula final, você desenvolverá o Projeto Integrador FastLog TMS (Transportation Management System), um software completo em modo console que integra:

  1. Menus de navegação contínuos com repita-ate e escolha-caso.
  2. Estruturas de dados com vetores paralelos para controle de frota e quilometragem.
  3. Procedimentos modulares para entrada de dados e exibição de relatórios.
  4. Funções matemáticas para cálculo de médias estatísticas e faturamento.
  5. Algoritmos de busca linear com flags de validação.

Este capítulo quebra a estrutura dos anteriores de propósito: por ser o Projeto Integrador Final, ele não tem as seções “💡 Checkpoint de Lógica” nem “🔥 Desafio de Fixação” — elas são substituídas pelo “🛠️ Roteiro de Testes e Validação do Projeto” e pela “🎓 Mensagem de Encerramento” ao final da aula. Não é uma omissão editorial: o próprio roteiro de testes cumpre o papel de checkpoint final do curso.

📥 Material de Apoio e Código-Fonte da Aula:


🏢 O Cenário Prático (Seu Desafio Final)

Situação: A diretoria da FastLog aprovou o projeto de modernização do centro de controle operacional. O software precisa gerenciar a frota titular de 5 caminhões e motoristas, oferecendo aos operadores da torre de controle:

  • Módulo 1 (Cadastro de Frota): Registro do Nome do Motorista, Placa do Veículo e Quilometragem Rodada no Mês.
  • Módulo 2 (Relatório de Performance): Listagem de todos os veículos, cálculo da Quilometragem Total da frota e da Média por caminhão.
  • Módulo 3 (Auditoria do Campeão): Identificação automática do motorista que mais produziu no mês.
  • Módulo 4 (Localizador Instantâneo): Busca de motorista por nome com exibição da placa e KM.

Missão: Programar o sistema completo seguindo a Arquitetura em 3 Camadas e entregá-lo 100% funcional.


🧠 Fundamentos: A Arquitetura do Sistema

graph TD
    UI["1. CAMADA DE APRESENTAÇÃO (UI / Menu Principal)<br/>repita ... ate (opcao = 0)"] --> Router{"escolha opcao"}
    
    Router -->|1| ModCad["Módulo 1: CadastrarFrota()<br/>(Procedimento)"]
    Router -->|2| ModRel["Módulo 2: EmitirRelatorioGeral()<br/>(Procedimento + Função Media)"]
    Router -->|3| ModAud["Módulo 3: IdentificarCampeao()<br/>(Função Maior Elemento)"]
    Router -->|4| ModBus["Módulo 4: PesquisarPorNome()<br/>(Busca Linear com Flag)"]
    
    ModCad --> DB[(Camada de Dados em RAM:<br/>Vetores Nomes, Placas e KM)]
    ModRel --> DB
    ModAud --> DB
    ModBus --> DB
    
    style UI fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style Router fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style DB fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

📖 O Código-Fonte Completo do Projeto Integrador

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
algoritmo "FastLog_TMS_ProjetoFinal"
// ============================================================================
// PROJETO INTEGRADOR: FASTLOG TRANSPORTATION MANAGEMENT SYSTEM (TMS)
// Versão: 3.0 Enterprise
// Descrição: Sistema Integrado de Gestão de Frota e Auditoria Operacional
// ============================================================================

var
   // CAMADA DE PERSISTÊNCIA EM MEMÓRIA (VETORES GLOBAIS)
   nomes : vetor [1..5] de caractere
   placas : vetor [1..5] de caractere
   kmRodados : vetor [1..5] de real
   
   opcaoMenu, totalCadastrados : inteiro

// ============================================================================
// CAMADA DE PROCESSAMENTO E FUNÇÕES PURAS
// ============================================================================

// Função 1: Somatório Total de Quilometragem
funcao SomarKmTotal() : real
var
   i : inteiro
   soma : real
inicio
   soma <- 0.0
   para i de 1 ate totalCadastrados faca
      soma <- soma + kmRodados[i]
   fimpara
   retorne soma
fimfuncao

// Função 2: Média de KM da Frota
funcao CalcularMediaKm() : real
inicio
   se (totalCadastrados > 0) entao
      retorne SomarKmTotal() / totalCadastrados
   senao
      retorne 0.0
   fimse
fimfuncao

// ============================================================================
// CAMADA DE PROCEDIMENTOS MODULARES
// ============================================================================

procedimento DesenharCabecalho(titulo : caractere)
inicio
   escreval("==================================================")
   escreval("         FASTLOG TMS - SISTEMA DE FROTA           ")
   escreval("   ", titulo)
   escreval("==================================================")
fimprocedimento

procedimento CadastrarVeiculos()
var
   i : inteiro
inicio
   DesenharCabecalho("MÓDULO 1: CADASTRO DE FROTA")
   para i de 1 ate 5 faca
      escreval("--- VEÍCULO #", i, " ---")
      escreva("Nome do Motorista Titular : ") leia(nomes[i])
      escreva("Placa do Veículo (7 dígitos): ") leia(placas[i])
      
      repita
         escreva("Quilometragem Mensal (KM) : ") leia(kmRodados[i])
         se (kmRodados[i] < 0.0) entao
            escreval("[ERRO]: A quilometragem não pode ser negativa!")
         fimse
      ate (kmRodados[i] >= 0.0)
   fimpara
   totalCadastrados <- 5
   escreval("")
   escreval(">> [SUCESSO] 5 veículos cadastrados e integrados ao sistema!")
fimprocedimento

procedimento EmitirRelatorioPerformance()
var
   i : inteiro
inicio
   se (totalCadastrados = 0) entao
      escreval(">> [ALERTA] Nenhum veículo cadastrado. Execute a Opção [1] primeiro.")
   senao
      DesenharCabecalho("MÓDULO 2: RELATÓRIO DE PERFORMANCE")
      escreval(" ID | MOTORISTA TITULAR   | PLACA   | KM RODADOS  ")
      escreval("----+---------------------+---------+-------------")
      para i de 1 ate totalCadastrados faca
         escreval(" #", i, " | ", nomes[i]:19, " | ", placas[i]:7, " | ", kmRodados[i]:8:2, " km")
      fimpara
      escreval("--------------------------------------------------")
      escreval("TOTAL KM ACUMULADO NA FROTA : ", SomarKmTotal():10:2, " km")
      escreval("MÉDIA DE QUILOMETRAGEM/VEÍCULO: ", CalcularMediaKm():10:2, " km")
      escreval("==================================================")
   fimse
fimprocedimento

procedimento IdentificarMotoristaDestaque()
var
   i, posCampeao : inteiro
   maiorKm : real
inicio
   se (totalCadastrados = 0) entao
      escreval(">> [ALERTA] Cadastre os veículos antes de apurar o destaque.")
   senao
      maiorKm <- kmRodados[1]
      posCampeao <- 1
      para i de 2 ate totalCadastrados faca
         se (kmRodados[i] > maiorKm) entao
            maiorKm <- kmRodados[i]
            posCampeao <- i
         fimse
      fimpara
      
      DesenharCabecalho("MÓDULO 3: CAMPEÃO DE PRODUTIVIDADE")
      escreval(">> MOTORISTA HOMENAGEADO DO MÊS:")
      escreval("   Colaborador : ", nomes[posCampeao])
      escreval("   Veículo     : Placa ", placas[posCampeao])
      escreval("   Total Rodado: ", maiorKm:8:2, " km")
      escreval("   Bonificação : R$ 1.500,00 (Prêmio Eficiência)")
      escreval("==================================================")
   fimse
fimprocedimento

procedimento PesquisarMotorista()
var
   termoBusca : caractere
   i : inteiro
   encontrado : logico
inicio
   se (totalCadastrados = 0) entao
      escreval(">> [ALERTA] Base de dados vazia. Cadastre os veículos primeiro.")
   senao
      DesenharCabecalho("MÓDULO 4: LOCALIZADOR DE VEÍCULO")
      escreva("Digite o nome exato do motorista: ")
      leia(termoBusca)
      
      encontrado <- FALSO
      para i de 1 ate totalCadastrados faca
         se (nomes[i] = termoBusca) entao
            escreval("")
            escreval(">> [REGISTRO ENCONTRADO NO BANCO]:")
            escreval("   Posição no Pátio: Box #", i)
            escreval("   Motorista       : ", nomes[i])
            escreval("   Placa do Veículo: ", placas[i])
            escreval("   KM Acumulada    : ", kmRodados[i]:8:2, " km")
            encontrado <- VERDADEIRO
         fimse
      fimpara
      
      se (nao encontrado) entao
         escreval("")
         escreval(">> [AVISO]: Motorista '", termoBusca, "' não foi localizado na base.")
      fimse
      escreval("==================================================")
   fimse
fimprocedimento

// ============================================================================
// BLOCO PRINCIPAL DE EXECUÇÃO (INTERFACE DO USUÁRIO)
// ============================================================================

inicio
   totalCadastrados <- 0

   repita
      escreval("")
      DesenharCabecalho("PAINEL OPERACIONAL PRINCIPAL")
      escreval(" [1] Cadastrar 5 Veículos da Frota")
      escreval(" [2] Emitir Relatório Geral de Performance")
      escreval(" [3] Apurar Motorista Destaque (Maior KM)")
      escreval(" [4] Pesquisar Veículo por Nome de Motorista")
      escreval(" [0] Finalizar e Desconectar do Sistema")
      escreval("==================================================")
      escreva("Selecione a operação desejada: ")
      leia(opcaoMenu)

      escreval("")
      escolha opcaoMenu
         caso 1: CadastrarVeiculos()
         caso 2: EmitirRelatorioPerformance()
         caso 3: IdentificarMotoristaDestaque()
         caso 4: PesquisarMotorista()
         caso 0: escreval(">> Desconectando da torre de controle... Até logo!")
         outrocaso: escreval(">> [ERRO]: Opção inválida! Digite um número de 0 a 4.")
      fimescolha
   ate (opcaoMenu = 0)
fimalgoritmo

🛠️ Prática de Apresentação e Validação do Projeto

Roteiro de Testes Obrigatório:

  1. Passo 1: Ao iniciar, tente acessar a opção [2]. O sistema deve emitir o alerta defensivo de base vazia sem quebrar a execução.
  2. Passo 2: Escolha a opção [1] e cadastre 5 motoristas com nomes, placas e quilometragens variadas (ex: 3.500 km, 6.200 km, 4.100 km, 7.800 km e 5.000 km).
  3. Passo 3: Escolha a opção [2] e confira se a soma total (26.600 km) e a média (5.320 km) aparecem alinhadas.
  4. Passo 4: Escolha a opção [3] e valide se o motorista de 7.800 km é apontado como campeão.
  5. Passo 5: Escolha a opção [4], teste uma busca existente e uma inexistente.
  6. Passo 6: Digite 0 para encerrar com sucesso.

📤 Instruções de Entrega Final (Microsoft Teams)

  1. Salve o arquivo com o nome: PROJETO_FINAL_SeuNome_SeuSobrenome.alg.
  2. No Microsoft Teams, envie na tarefa “VisuAlg Cap 20 - Projeto Integrador Final”.
  3. Clique em Entregar (Turn In).

🎓 Mensagem de Encerramento e Próximos Passos

Parabéns! Você concluiu com louvor o curso de Lógica de Programação Estruturada com VisuAlg 3.0.

Você agora possui a base conceitual universal da ciência da computação:

  • Variáveis e Tipagem Estática
  • Controle de Fluxo e Álgebra Booleana
  • Iterações e Algoritmos de Repetição
  • Estruturas de Dados Lineares (Vetores) e Bidimensionais (Matrizes)
  • Modularização e Arquitetura de Software

Você está 100% preparado para dar o próximo passo rumo a linguagens industriais como Python, C#, Java, JavaScript e SQL!


📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. Segundo o Cenário Prático, quais são os quatro módulos que o sistema FastLog TMS deve oferecer aos operadores da torre de controle?
  2. Quantos vetores globais paralelos são declarados no projeto integrador, e quais são os seus nomes?
  3. No código-fonte, o que calcula a função SomarKmTotal(), o que calcula a função CalcularMediaKm(), e de que forma uma delas utiliza a outra?
  4. Qual procedimento é chamado no início de cada módulo para desenhar o cabeçalho padronizado do sistema, e qual parâmetro ele recebe?
  5. No procedimento CadastrarVeiculos(), qual estrutura de repetição garante que a quilometragem digitada nunca seja negativa?
  6. No procedimento IdentificarMotoristaDestaque(), qual é a lógica usada para encontrar o motorista com a maior quilometragem?
  7. No procedimento PesquisarMotorista(), qual técnica de controle é usada para saber se o motorista buscado foi ou não encontrado ao final da varredura?
  8. Segundo o Roteiro de Testes Obrigatório, o que deve acontecer se o usuário tentar acessar a opção [2] (Relatório) antes de cadastrar qualquer veículo?
  9. Segundo o Roteiro de Testes Obrigatório, com as quilometragens de exemplo (3.500, 6.200, 4.100, 7.800 e 5.000 km), qual deve ser a soma total e a média exibidas, e qual motorista deve ser apontado como campeão?
  10. Segundo a Mensagem de Encerramento, quais cinco áreas de base conceitual da ciência da computação o aluno consolidou ao longo do curso, e quais linguagens industriais são citadas como próximo passo?