Capítulo 14: Algoritmos de Pesquisa e Manipulação em Vetores
🎯 Objetivo da Aula
Armazenar dados em um vetor é apenas a primeira etapa. No dia a dia de uma empresa, a verdadeira utilidade de um banco de dados em memória é a capacidade de pesquisar rapidamente se um item existe, encontrar o maior valor faturado e filtrar registros que atendam a determinadas regras.
Nesta aula, você aprenderá a:
- Implementar o algoritmo clássico de Busca Sequencial / Linear (Linear Search).
- Utilizar a técnica da Flag Booleana (
encontrado <- FALSO) para evitar avisos falsos de “não encontrado”. - Desenvolver o algoritmo de localização do Maior e Menor Elemento com rastreamento de posição.
- Aplicar filtros estatísticos sobre vetores preenchidos.
📥 Material de Apoio e Código-Fonte da Aula:
- 📄 Arquivo Pronto (.alg): Baixar Capitulo_14.alg (abra diretamente no VisuAlg 3.0)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_14.zip
🏢 O Cenário Prático (Seu Desafio)
Situação: O almoxarifado central da FastLog armazena milhares de peças e pneus de reposição para caminhões. Quando um mecânico chega ao balcão solicitando a peça "PN-295-80", o atendente precisa digitar esse código no terminal. O sistema deve varrer todo o catálogo de estoque e responder imediatamente:
- Se a peça foi Localizada ou Não Cadastrada.
- Em qual Prateleira/Posição do armazém ela está guardada.
- Qual o Saldo Disponível em estoque.
Missão: Construir o Buscador de Peças FastLog, aplicando o algoritmo de Busca Linear com controle por flag booleana e localização de maiores saldos.
🧠 Fundamentos: O Algoritmo de Busca Linear
1. O Funcionamento da Busca Linear
A Busca Linear (Linear Search) é o método de pesquisa mais fundamental da computação: ela inspeciona o vetor elemento por elemento, do índice 1 até o índice N, comparando o valor guardado com a chave de busca digitada pelo usuário:
graph TD
A["Chave de Busca: 'PN-295-80'"] --> B["1. Compara com vetor[1]"]
B -- "Diferente" --> C["2. Compara com vetor[2]"]
C -- "Diferente" --> D["3. Compara com vetor[3]"]
D -- "IGUAL! (Encontrou)" --> E["1. Marca Flag: achou <- VERDADEIRO<br/>2. Exibe Dados da Peça<br/>3. Guarda Posição"]
D -- "Diferente" --> F["... até o final do vetor"]
F --> G{achou = FALSO?}
G -- "Sim" --> H["Exibe: 'Item Não Localizado!'"]
style A fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
style D fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
style E fill:#217346,stroke:#fff,stroke-width:2px,color:#fff
style H fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff2. O Padrão da Flag Booleana (Evitando o Erro Mais Comum!)
O Erro Clássico do Programador Iniciante:
Se você colocar escreval("Não encontrado") dentro do senao do laço de repetição, o programa imprimirá “Não encontrado” 100 vezes para cada elemento diferente antes de achar o correto!
A Solução Profissional:
- Inicialize uma flag antes do laço:
achou <- FALSO. - Se encontrar o item dentro do laço:
achou <- VERDADEIRO. - Depois que o laço terminar, teste:
se (nao achou) entao escreval("Não encontrado").
3. O Algoritmo para Encontrar o Maior e o Menor Valor
Para encontrar o maior valor em uma lista:
- Assuma provisoriamente que o primeiro elemento (
vetor[1]) é o maior de todos (maior <- vetor[1]). - Percorra do elemento 2 até N com o laço
para. - Se encontrar qualquer elemento maior que o atual (
se vetor[i] > maior), atualize a variávelmaiore guarde o índiceposicaoMaior <- i.
O algoritmo do menor valor é exatamente o mesmo raciocínio, só invertendo a comparação:
- Assuma provisoriamente que o primeiro elemento é o menor (
menor <- vetor[1]). - Percorra do elemento 2 até N.
- Se encontrar qualquer elemento menor que o atual (
se vetor[i] < menor), atualizemenore guardeposicaoMenor <- i.
📖 Exemplo Guiado: Localizador de Peças com Flag Booleana
Código do Algoritmo:
✅ Exemplo de Execução no Console (F9):
🛠️ Prática Obrigatória 1: Campeão de Quilometragem da Frota
Passo 1: O Desafio
Crie um algoritmo "Campeao_KM" que receba o nome e a quilometragem rodada no mês por 5 motoristas da empresa (usando dois vetores paralelos).
Ao final, o programa deve:
- Descobrir qual motorista rodou a maior quilometragem (o algoritmo do maior, visto nos Fundamentos).
- Descobrir também qual motorista rodou a menor quilometragem (o algoritmo do menor, visto nos Fundamentos).
- Exibir o nome e a quantidade exata de KM tanto do campeão quanto do motorista com menor produtividade.
✅ Resultado Esperado (Prática 1):
🛠️ Prática Obrigatória 2: Filtro de Cargas Super-Pesadas (> 10 Toneladas)
Crie um algoritmo "Filtro_Cargas_Pesadas" que leia o peso de 6 caminhões na balança e armazene em um vetor.
Em seguida, o programa deve:
- Contar quantos caminhões pesam mais de 10.000 kg.
- Exibir a listagem apenas dos caminhões que ultrapassaram esse peso de corte.
✅ Resultado Esperado (Prática 2):
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_SeuNome_SeuSobrenome.alg. - Teste o código buscando itens existentes e inexistentes para validar a flag.
- No Microsoft Teams, envie na tarefa “VisuAlg Cap 14 - Pesquisa em Vetores”.
- Clique em Entregar (Turn In).
💡 Checkpoint de Lógica & Engenharia de Software
Você acabou de aplicar o algoritmo fundamental de Busca Linear ($O(N)$). Em bancos de dados relacionais (SQL), quando uma coluna não possui um índice B-Tree criado, o motor do banco executa exatamente uma busca linear (Table Scan / Full Scan) percorrendo todas as linhas da tabela.
🔥 Desafio de Fixação: Menor Frete e Média da Frota
Modifique o algoritmo de quilometragem para encontrar simultaneamente o Motorista que mais rodou e o Motorista que menos rodou, exibindo também a média de KM de toda a equipe.
🔑 Gabarito de Código Completo
Prática 1:
Prática 2:
Desafio:
📝 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.
- Como funciona o algoritmo de Busca Linear (Linear Search), segundo a explicação dos Fundamentos deste capítulo?
- Qual é o erro clássico do programador iniciante descrito no aviso de atenção, ao colocar
escreval("Não encontrado")dentro dosenaode um laço de busca? - Descreva os três passos da solução profissional com flag booleana para evitar esse erro.
- Descreva o algoritmo para encontrar o maior valor em uma lista, conforme os passos apresentados nos Fundamentos.
- No Cenário Prático, quais três informações o sistema deve responder quando um mecânico busca uma peça no almoxarifado?
- No algoritmo
Buscador_Pecas_FastLog, quantos vetores paralelos são usados para armazenar os dados de cada peça, e quais são eles? - Na Prática Obrigatória 1 (
Campeao_KM), quantos motoristas são registrados, e o que o programa deve descobrir ao final? - Na Prática Obrigatória 2 (
Filtro_Cargas_Pesadas), qual é o peso de corte (em kg) usado para classificar um caminhão como “super-pesado”? - Segundo o Checkpoint de Lógica, a que operação de bancos de dados relacionais (SQL) a busca linear corresponde quando uma coluna não possui um índice B-Tree?
- No código
Buscador_Pecas_FastLog, por que o testese (encontrado) entaoe o uso da variávelpossão feitos depois que o laçoparatermina, e não dentro dele?