Capítulo 12: Laços Aninhados e Algoritmos de Varredura Bidimensional
🎯 Objetivo da Aula
O mundo físico e os armazéns logísticos não são linhas unidimensionais: eles possuem Linhas e Colunas, Ruas e Alturas, Corredores e Prateleiras. Para que um robô ou um operador automatizado consiga inspecionar todas as posições de um galpão, o computador precisa executar um Laço dentro de outro Laço (Nested Loops).
Nesta aula, você aprenderá a:
- Compreender o funcionamento e o fluxo de controle de Laços Aninhados.
- Dominar a coordenação das variáveis canônicas
i(Linha / Laço Externo) ej(Coluna / Laço Interno). - Compreender a noção intuitiva de Complexidade de Tempo ($O(N \times M)$).
- Mapear e desenhar matrizes visuais de coordenadas espaciais para centros de distribuição.
📥 Material de Apoio e Código-Fonte da Aula:
- 📄 Arquivo Pronto (.alg): Baixar Capitulo_12.alg (abra diretamente no VisuAlg 3.0)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_12.zip
🏢 O Cenário Prático (Seu Desafio)
Situação: O novo Centro de Distribuição Automatizado da FastLog possui 3 Galpões Principais. Cada galpão possui 4 Docas de Carregamento. O sistema de supervisão em tela precisa gerar o mapa completo de todas as 12 posições físicas de embarque (ex: [G1-D1], [G1-D2], etc.) e permitir que o operador marque quais posições estão livres ou ocupadas.
Missão: Você deve construir o Mapeador de Docas FastLog, utilizando laços aninhados para gerar a grade de coordenadas bidimensionais no console.
🧠 Fundamentos: Como Funcionam os Laços Aninhados?
1. O Princípio do Relógio (Horas e Minutos)
Pense em laços aninhados como os ponteiros de um relógio:
- O Laço Interno (os minutos) gira rapidamente de 1 até 60.
- O Laço Externo (as horas) só avança
+1quando o laço interno completa uma volta inteira!
graph TD
A["Laço Externo: para i de 1 ate 3 faca (Galpões)"] --> B["Laço Interno: para j de 1 ate 4 faca (Docas)"]
B --> C["Ação: Imprime coordenada [G{i}-D{j}]"]
C --> D{j < 4?}
D -- "Sim" --> B
D -- "Não (Terminou Docas)" --> E["Quebra de Linha (escreval)"]
E --> F{i < 3?}
F -- "Sim" --> A
F -- "Não (Terminou Galpões)" --> G[Fim do Mapeamento]
style A fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
style B fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
style C fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
style G fill:#217346,stroke:#fff,stroke-width:2px,color:#fff2. A Multiplicação de Iterações ($N \times M$)
Se o laço externo roda 3 vezes e o laço interno roda 4 vezes, o bloco central será executado exatamente: $$3 \times 4 = 12 \text{ execuções}$$
Nunca use a mesma variável para os dois laços!
Se você usar para i de 1 ate 3 por fora e para i de 1 ate 4 por dentro, a variável i será corrompida, gerando comportamentos imprevisíveis. Use sempre variáveis distintas (ex: i e j, ou linha e coluna).
📖 Exemplo Guiado: Mapeador de Posições do Centro Logístico
Código do Algoritmo:
✅ Exemplo de Execução no Console (F9):
🛠️ Prática Obrigatória 1: Tabuada Completa de Cotações (1 a 5)
Passo 1: O Desafio
Crie um algoritmo "Tabuadas_Frete" que utilize laços aninhados para gerar as tabuadas multiplicativas do fator de cálculo de frete de 1 até 5 (multiplicando de 1 a 10 cada uma).
- Laço externo: multiplicador base (1 a 5).
- Laço interno: multiplicando (1 a 10).
✅ Resultado Esperado (Prática 1):
🛠️ Prática Obrigatória 2: Grade de Ocupação de Paletes em Estantes
No armazém vertical, temos 4 Níveis de Altura (Andares) e 6 Vagas por Andar.
Crie um algoritmo "Grade_Vertical" que desenhe a grade de armazenagem completa utilizando colchetes [ ].
✅ Resultado Esperado (Prática 2):
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_12_SeuNome_SeuSobrenome.alg. - Verifique se as linhas e colunas pulam linha no momento exato no terminal.
- No Microsoft Teams, envie na tarefa “VisuAlg Cap 12 - Laços Aninhados”.
- Clique em Entregar (Turn In).
💡 Checkpoint de Lógica & Engenharia de Software
Você acabou de vivenciar o alicerce de Processamento de Imagens, Renderização 3D e Gráficos por Computador. Cada pixel de uma tela de computador ou textura de videogame em Full HD (1920×1080) é calculado através de laços aninhados que percorrem 2.073.600 pixels 60 vezes por segundo!
🔥 Desafio de Fixação: Desenho de Pirâmide de Carregamento
Crie um algoritmo que utilize laços aninhados para desenhar uma pirâmide de caixas com asteriscos *:
- Linha 1:
* - Linha 2:
* * - Linha 3:
* * * - Linha 4:
* * * * - Linha 5:
* * * * *
🔑 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.
- Na analogia do relógio usada para explicar laços aninhados, qual parte representa o laço interno e qual representa o laço externo?
- Segundo o aviso de atenção (CAUTION) do capítulo, por que nunca se deve usar a mesma variável de controle nos dois laços de uma estrutura aninhada?
- Se o laço externo roda 3 vezes e o laço interno roda 4 vezes, quantas vezes o bloco de comandos central é executado ao todo?
- Quantos galpões e quantas docas por galpão o Centro de Distribuição da FastLog possui, e qual o total de posições físicas mapeadas?
- No algoritmo
Mapeador_Galpao, qual variável controla o laço externo (galpões) e qual controla o laço interno (docas)? - Na Prática Obrigatória 1 (
Tabuadas_Frete), qual é o intervalo do laço externo (multiplicador base) e qual é o intervalo do laço interno (multiplicando)? - Na Prática Obrigatória 2 (Grade Vertical), quantos níveis de altura (andares) e quantas vagas por andar existem no armazém a ser mapeado?
- De acordo com o Checkpoint de Lógica, laços aninhados são o alicerce de qual área da computação, e quantos pixels possui uma tela Full HD (1920×1080)?
- No código do
Mapeador_Galpao, para que serve o comandoescreval("")(vazio) logo após ofimparado laço interno de docas? - Segundo os objetivos da aula, quais são os nomes convencionais dados às variáveis de controle do laço externo e do laço interno, e o que cada uma representa (linha/coluna)?