Capítulo 14: Vetores II: Algoritmos de Pesquisa e Filtros (Busca Linear)
🎯 Objetivo da Aula
Guardar dados em vetores é apenas o primeiro passo. O valor real de um sistema reside na sua capacidade de pesquisar, filtrar e auditar esses dados de forma instantânea (como localizar o status de uma entrega pelo código de rastreio ou identificar o motorista com maior quilometragem rodada).
Nesta aula, você aprenderá a:
- Implementar o algoritmo clássico de Busca Linear (Linear Search) com complexidade $O(N)$.
- Dominar a técnica da Flag Booleana (
logico localizado = falso) para tratamento de itens inexistentes. - Desenvolver o algoritmo padrão de localização de Maior e Menor Elemento com retenção de índice.
- Trabalhar com Vetores Paralelos sincronizados pelo mesmo índice numérico.
📥 Material de Apoio e Código-Fonte da Aula:
- 📄 Arquivo Pronto (.por): Baixar Capitulo_14.por (abra diretamente no Portugol Studio)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_14.zip
🏢 O Cenário Prático (Seu Desafio)
Situação: A torre de controle da FastLog monitora 5 carretas pesadas. A central armazena os nomes dos 5 motoristas em um vetor (motoristas[5]) e a quilometragem rodada no mês em outro vetor (quilometragem[5]).
O supervisor precisa de duas ferramentas urgentes:
- Localizador Instantâneo: Digitar o nome de um motorista e descobrir imediatamente quantos KM ele rodou.
- Auditoria do Campeão: Apontar automaticamente quem é o motorista com a Maior Quilometragem Rodada no mês para receber o bônus de eficiência.
Missão: Programar o sistema de auditoria e pesquisa em vetores paralelos da FastLog.
🧠 Fundamentos: Os Algoritmos Clássicos em Vetores
1. O Algoritmo de Busca Linear (Linear Search)
A busca linear percorre o vetor da primeira posição (0) até a última (N-1), comparando cada elemento com a chave pesquisada:
graph TD
A["Chave de Busca: 'Carlos'"] --> B["Compara com vetor[0]: 'Ana' -> Não"]
B --> C["Compara com vetor[1]: 'Carlos' -> MATCH!"]
C --> D["1. Exibe Dados de Carlos<br/>2. Ativa Flag: localizado = verdadeiro<br/>3. Comando pare (Interrompe Busca)"]
D --> E[Fim da Busca]
style A fill:#8e44ad,stroke:#fff,color:#fff
style C fill:#27ae60,stroke:#fff,color:#fff
style D fill:#2980b9,stroke:#fff,color:#fff2. A Técnica da Flag Booleana
pare não é exclusivo do escolha-caso
Você já usou pare dentro de um escolha-caso (Capítulo 08) para encerrar um caso. Aqui ele cumpre o mesmo papel de “encerrar imediatamente”, mas dentro de um laço para: assim que o item é encontrado, não faz sentido continuar percorrendo o restante do vetor. pare funciona da mesma forma em para, enquanto e faca-enquanto.
3. Algoritmo de Maior e Menor Elemento
Para encontrar o maior valor sem errar:
- Assumimos que o primeiro elemento (
vetor[0]) é provisoriamente o campeão. - Percorremos do índice
1em diante: se encontrarmos alguém maior, atualizamos o recorde e a posição!
4. Vetores Paralelos
Quando duas ou mais entidades diferentes (o nome de um motorista, a sua quilometragem) precisam ficar associadas, usamos Vetores Paralelos: vetores separados, mas do mesmo tamanho, em que a mesma posição de índice representa sempre o mesmo registro. Por exemplo, motoristas[2] e quilometragem[2] juntos descrevem o terceiro motorista e sua respectiva quilometragem — os dois vetores “andam lado a lado”, sincronizados pelo índice i.
📖 Exemplo Guiado: Painel de Performance de Frota
Código do Programa:
🛠️ Prática Obrigatória 1: Filtro de Cargas Acima da Média
Passo 1: O Desafio
Crie um programa filtro_cargas.por com um vetor de 5 pesos de carga:
real pesos[5] = {1200.0, 4500.0, 800.0, 6200.0, 3100.0}.
- Calcule a média geral dos pesos.
- Em um segundo laço, liste apenas os pesos que estão estritamente acima da média.
✅ Resultado Esperado (Prática 1):
🛠️ Prática Obrigatória 2: Localizador de Menor Preço de Frete
Crie um programa menor_frete.por que receba 4 cotações de frete de transportadoras parceiras e informe qual transportadora ofereceu o Menor Preço.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_SeuNome_SeuSobrenome.por. - Teste a busca com nomes existentes e inexistentes para checar a flag booleana.
- No Microsoft Teams, envie na tarefa “Portugol Cap 14 - Algoritmos de Busca”.
- Clique em Entregar (Turn In).
💡 Checkpoint de Lógica & Engenharia de Software
Você acabou de aplicar o algoritmo de Busca Linear ($O(N)$). Em bancos de dados relacionais como PostgreSQL e MySQL, a busca linear corresponde ao famoso Full Table Scan, que é otimizado na indústria através de índices em árvores binárias (B-Trees).
🔥 Desafio de Fixação: Contador de Ocorrências em Vetor
Crie um programa que leia 10 números em um vetor. Peça ao usuário um número e conte quantas vezes esse número se repete dentro do vetor.
🔑 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.
- O que é o algoritmo de Busca Linear e qual é a sua complexidade, segundo os Fundamentos do capítulo?
- Para que serve a técnica da Flag Booleana (ex:
logico localizado = falso) dentro do algoritmo de busca? - O que faz o comando
paredentro do laço de busca linear apresentado nos Fundamentos? - Explique o algoritmo de localização do Maior Elemento: por que assumimos inicialmente que
vetor[0]é o “campeão” e a partir de qual índice começamos a comparar os demais valores? - O que são “Vetores Paralelos”, segundo o Exemplo Guiado do Painel de Performance de Frota? Cite os dois vetores usados no exemplo.
- Na Prática Obrigatória 1 (Filtro de Cargas Acima da Média), quais dois passos o programa deve realizar com o vetor de pesos?
- Na Prática Obrigatória 2 (Localizador de Menor Preço de Frete), quantas cotações de frete o programa deve receber e o que deve ser informado ao final?
- Segundo o Checkpoint de Lógica & Engenharia de Software, a que operação de bancos de dados relacionais (como PostgreSQL e MySQL) a busca linear corresponde?
- No algoritmo de busca linear apresentado nos Fundamentos, o que é exibido se, após percorrer todo o vetor, a flag
localizadopermanecerfalso? - Dê um exemplo do dia a dia em que você precisaria “procurar” um item específico dentro de uma lista, de forma parecida com a busca do motorista pelo nome no exemplo da FastLog.