Capítulo 14: Pesquisa em Listas (Onde Está o Produto no WMS?)

🎯 Objetivo da Aula

Armazenar dados em listas é apenas o primeiro passo: o verdadeiro valor de um software de armazém (WMS - Warehouse Management System) está na capacidade de Localizar uma Informação Rapidamente. Como saber se a peça "FILTRO-OLEO-10" está no estoque? Em qual prateleira ela se encontra? No Scratch, implementamos essa busca através do algoritmo clássico de Busca Linear (Linear Search).

Ao final desta aula, você será capaz de:

  1. Compreender a lógica do algoritmo de Busca Linear (Varredura de Vetor).
  2. Utilizar uma variável de controle [índice] para percorrer uma lista do item 1 até o último.
  3. Utilizar a técnica de Sinalizador Lógico (Boolean Flag) para identificar se o item foi ou não localizado.
  4. Conhecer o atalho nativo do sensor hexagonal <[lista] contém [coisa]?>.
  5. Construir o Localizador Eletrônico de Peças do Almoxarifado da FastLog.

📥 Material de Apoio e Roteiro de Blocos:


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

Situação: O almoxarifado de manutenção da frota da FastLog possui uma lista com centenas de códigos de peças (SKUs). Quando o mecânico chega ao balcão solicitando uma peça específica (ex: "PASTILHA-FREIO"), o sistema deve:

  1. Varrer a lista de itens cadastrados.
  2. Se encontrar: Informar em qual gaveta (número do índice) a peça está guardada.
  3. Se não encontrar após olhar a lista inteira: Emitir o alerta “Peça em falta no estoque ou código não cadastrado!”.

Missão: Programar o motor de busca linear no Scratch.


🧠 Fundamentos: O Algoritmo de Busca Linear

1. Como a Busca Linear Funciona Passo a Passo?

Imagine procurar uma pasta em um arquivo de aço:

  • Você abre a pasta 1. É o que procura? Não. Avança para a pasta 2.
  • É o que procura? Sim! Você avisa onde achou e para a busca.
  • Se chegar na última pasta e não achar, conclui que o documento não existe.
graph TD
    A["Início: Operador digita Peça Desejada"] --> B["Inicializa: Indice = 1 e Achou = 'nao'"]
    B --> C{"Indice <= Tamanho da Lista?"}
    C -- "SIM" --> D{"item (Indice) da Lista = Peça Desejada?"}
    D -- "SIM" --> E["Exibe Gaveta Encontrada e muda Achou para 'sim'"]
    D -- "NÃO" --> F["Incrementa: adicione 1 ao Indice"]
    E --> F
    F --> C
    C -- "NÃO (Varreu tudo)" --> G{"Achou = 'nao'?"}
    G -- "SIM" --> H["Alerta: Produto não localizado no armazém!"]
    G -- "NÃO" --> I["Fim com Sucesso"]
    
    style B fill:#e67e22,stroke:#fff,color:#fff
    style C fill:#f39c12,stroke:#fff,color:#fff
    style D fill:#3498db,stroke:#fff,color:#fff
    style E fill:#27ae60,stroke:#fff,color:#fff
    style H fill:#c0392b,stroke:#fff,color:#fff

2. O Sensor Rápido: <[lista] contém [item]?>

O Scratch possui um bloco hexagonal verde-azulado que faz uma verificação instantânea:

  • se <[Estoque v] contém (resposta)?> então: Retorna verdadeiro se a palavra estiver em qualquer posição da lista. É excelente para verificações rápidas de “Sim ou Não”!

📖 Exemplo Guiado: Motor de Busca do Almoxarifado

Passo a Passo no Scratch 3.0:

  1. Crie a lista Catalogo_Pecas.
  2. Crie as variáveis Item_Buscado, Indice e Localizado.
  3. Adicione o ator Atendente_Pecas e monte o script:
 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
quando clicar em 🏁
// 1. Cadastro inicial de 4 peças
apague todos de [Catalogo_Pecas v]
adicione [CORREIA-DENTADA] a [Catalogo_Pecas v]
adicione [PASTILHA-FREIO] a [Catalogo_Pecas v]
adicione [AMORTECEDOR-TRUCK] a [Catalogo_Pecas v]
adicione [FAROL-LED] a [Catalogo_Pecas v]

// 2. Pergunta ao operador
pergunte [Digite o código da peça que deseja localizar:] e espere
mude [Item_Buscado v] para (resposta)

// 3. Inicialização dos ponteiros de busca
mude [Indice v] para (1)
mude [Localizado v] para [nao]

// 4. Laço de varredura completa
repita (tamanho de [Catalogo_Pecas v]) vezes
    se <(item (Indice) de [Catalogo_Pecas v]) = (Item_Buscado)> então
        toque o som [Bell v]
        diga (junte (junte [ITEM LOCALIZADO: Disponível na gaveta #] (Indice)) [!]) por (3) segundos
        mude [Localizado v] para [sim]
    fim
    adicione (1) a [Indice v]
fim

// 5. Verificação da flag após o término do laço
se <(Localizado) = [nao]> então
    toque o som [Buzz v]
    diga [ITEM INEXISTENTE: Peça não cadastrada no almoxarifado.] por (3) segundos
fim

🛠️ Prática Obrigatória 1: Verificador Rápido com <lista contém>

O Desafio:

Crie uma validação expressa na portaria:

  1. Crie a lista Motoristas_Autorizados contendo os nomes: "Carlos", "Mariana" e "Roberto".
  2. Pergunte: [Qual é o seu primeiro nome?].
  3. Se <[Motoristas_Autorizados v] contém (resposta)?>:
    • Diga [Acesso Liberado à Área Restrita!] com semáforo verde.
  4. Senão:
    • Diga [ACESSO NEGADO: Motorista não possui cadastro ativo!] com som de erro.

🛠️ Prática Obrigatória 2: Contador de Ocorrências de Cargas Avariadas

O Desafio:

Crie uma lista chamada Status_Cargas contendo 5 status: Aprovado, Avariado, Aprovado, Avariado, Aprovado.

  1. Percorra a lista com uma variável Indice de 1 até o tamanho da lista.
  2. Conte quantas vezes a palavra "Avariado" aparece na lista, acumulando em Total_Avarias.
  3. Ao final, exiba: [Relatório de Qualidade: X cargas avariadas encontradas!].

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo do projeto com o nome: Atividade_14_SeuNome_SeuSobrenome.sb3.
  2. Teste buscando tanto uma peça que existe (ex: PASTILHA-FREIO) quanto uma inexistente para certificar-se de que ambas as mensagens funcionam.
  3. No Microsoft Teams, envie na tarefa “Scratch Cap 14 - Pesquisa em Listas”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o conceito de Varredura Sequencial e Complexidade $O(N)$. Em bancos de dados relacionais como Oracle e PostgreSQL, quando uma coluna não possui índice (Index), o banco executa essa mesma busca linear (Table Scan) linha por linha para localizar os registros.


🔥 Desafio de Fixação: Interrupção Imediata da Busca (Early Exit)

No exemplo guiado, o laço continua varrendo até o final mesmo depois de já ter achado a peça na posição 1. Modifique a lógica usando repita até que <<(Indice) > (tamanho de [Catalogo_Pecas])> ou <(Localizado) = [sim]>> para que a busca encerre no exato instante em que o item for encontrado, economizando processamento!


🔑 Gabarito de Código (Blocos do Scratch)

Prática 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Ator: Catraca_Acesso]
quando clicar em 🏁
apague todos de [Motoristas_Autorizados v]
adicione [Carlos] a [Motoristas_Autorizados v]
adicione [Mariana] a [Motoristas_Autorizados v]
adicione [Roberto] a [Motoristas_Autorizados v]

pergunte [Qual é o seu primeiro nome?] e espere
se <[Motoristas_Autorizados v] contém (resposta)?> então
    toque o som [Chime v]
    diga [Acesso Liberado à Área Restrita!] por (3) segundos
senão
    toque o som [Buzz v]
    diga [ACESSO NEGADO: Motorista não possui cadastro ativo!] por (3) segundos
fim

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[Ator: Auditor_Qualidade]
quando clicar em 🏁
mude [Total_Avarias v] para (0)
mude [Indice v] para (1)

repita (tamanho de [Status_Cargas v]) vezes
    se <(item (Indice) de [Status_Cargas v]) = [Avariado]> então
        adicione (1) a [Total_Avarias v]
    fim
    adicione (1) a [Indice v]
fim

diga (junte (junte [Relatório de Qualidade: ] (Total_Avarias)) [ cargas avariadas encontradas!]) por (4) segundos

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[Ator: Atendente_Pecas]
quando clicar em 🏁
pergunte [Digite o código da peça procurada:] e espere
mude [Item_Buscado v] para (resposta)
mude [Indice v] para (1)
mude [Localizado v] para [nao]

repita até que <<(Indice) > (tamanho de [Catalogo_Pecas v])> ou <(Localizado) = [sim]>>
    se <(item (Indice) de [Catalogo_Pecas v]) = (Item_Buscado)> então
        toque o som [Bell v]
        diga (junte [Encontrado com sucesso na gaveta #] (Indice)) por (3) segundos
        mude [Localizado v] para [sim]
    senão
        adicione (1) a [Indice v]
    fim
fim

se <(Localizado) = [nao]> então
    diga [Peça não encontrada no catálogo!] por (3) segundos
fim

📥 Download do Roteiro Completo desta Aula:
Baixe o arquivo consolidado Capitulo_14.txt ou o pacote compactado (.zip) com os scripts e desafios da aula.


📝 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. Como se chama o algoritmo, apresentado nos Fundamentos, que percorre uma lista item por item até encontrar (ou não) o valor procurado?
  2. Qual bloco hexagonal verde-azulado permite verificar rapidamente se um item existe em qualquer posição de uma lista, sem precisar montar um laço de busca?
  3. No Exemplo Guiado, qual é o nome da lista criada e quais são as quatro peças cadastradas nela no início do script?
  4. Além da lista, quais são os nomes das três variáveis criadas no Exemplo Guiado para controlar a busca?
  5. No Exemplo Guiado, qual valor inicial é atribuído à variável Localizado antes do laço de busca começar, e para que serve essa técnica de sinalizador?
  6. Na Prática Obrigatória 1, quais são os três nomes cadastrados na lista Motoristas_Autorizados?
  7. Na Prática Obrigatória 2, quais são os 5 status cadastrados na lista Status_Cargas, e qual variável acumula quantas vezes o status “Avariado” aparece?
  8. Segundo o Checkpoint de Lógica & Engenharia de Software, a que operação de bancos de dados (quando uma coluna não possui índice) a busca linear é comparada?
  9. Segundo os Fundamentos, o que se conclui quando o índice varre a lista inteira e a variável de sinalizador permanece igual a “nao”?
  10. Qual é a complexidade (notação matemática) associada à varredura sequencial, citada no Checkpoint de Lógica & Engenharia de Software?