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:

  1. Compreender o funcionamento e o fluxo de controle de Laços Aninhados.
  2. Dominar a coordenação das variáveis canônicas i (Linha / Laço Externo) e j (Coluna / Laço Interno).
  3. Compreender a noção intuitiva de Complexidade de Tempo ($O(N \times M)$).
  4. Mapear e desenhar matrizes visuais de coordenadas espaciais para centros de distribuição.

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


🏢 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 +1 quando 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:#fff

2. 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:

 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
algoritmo "Mapeador_Galpao"
var
   galpao, doca, totalPosicoes : inteiro

inicio
   totalPosicoes <- 0

   escreval("==================================================")
   escreval("    FASTLOG - MAPA DE DOCAS POR GALPÃO (3x4)      ")
   escreval("==================================================")
   escreval("")

   // Laço Externo (Galpões 1 a 3)
   para galpao de 1 ate 3 faca
      escreva("GALPÃO ", galpao, " -> ")
      
      // Laço Interno (Docas 1 a 4)
      para doca de 1 ate 4 faca
         escreva("[G", galpao, "-D", doca, "] ")
         totalPosicoes <- totalPosicoes + 1
      fimpara
      
      escreval("") // Quebra de linha ao fim de cada galpão
   fimpara

   escreval("")
   escreval("==================================================")
   escreval("Total de Docas Mapeadas na Rede: ", totalPosicoes, " posições ativas.")
fimalgoritmo

✅ Exemplo de Execução no Console (F9):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
==================================================
    FASTLOG - MAPA DE DOCAS POR GALPÃO (3x4)      
==================================================

GALPÃO 1 -> [G1-D1] [G1-D2] [G1-D3] [G1-D4] 
GALPÃO 2 -> [G2-D1] [G2-D2] [G2-D3] [G2-D4] 
GALPÃO 3 -> [G3-D1] [G3-D2] [G3-D3] [G3-D4] 

==================================================
Total de Docas Mapeadas na Rede: 12 posições ativas.

🛠️ 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):

1
2
3
4
5
6
7
8
=== TABUADA DA TARIFA 1 ===
1 x 1 = 1
...
1 x 10 = 10

=== TABUADA DA TARIFA 2 ===
2 x 1 = 2
...

🛠️ 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):

1
2
3
4
5
6
7
8
=== GRADE DE ARMAZENAGEM VERTICAL ===

NÍVEL 4 | [A4-V1] [A4-V2] [A4-V3] [A4-V4] [A4-V5] [A4-V6] 
NÍVEL 3 | [A3-V1] [A3-V2] [A3-V3] [A3-V4] [A3-V5] [A3-V6] 
NÍVEL 2 | [A2-V1] [A2-V2] [A2-V3] [A2-V4] [A2-V5] [A2-V6] 
NÍVEL 1 | [A1-V1] [A1-V2] [A1-V3] [A1-V4] [A1-V5] [A1-V6] 
---------------------------------------------
PISO / TÉRREO - DOCAS DE EXPEDIÇÃO

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_SeuNome_SeuSobrenome.alg.
  2. Verifique se as linhas e colunas pulam linha no momento exato no terminal.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 12 - Laços Aninhados”.
  4. 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
algoritmo "Tabuadas_Frete"
var
   base, mult : inteiro
inicio
   para base de 1 ate 5 faca
      escreval("")
      escreval("=== TABUADA DA TARIFA ", base, " ===")
      para mult de 1 ate 10 faca
         escreval(base:2, " x ", mult:2, " = ", (base * mult):3)
      fimpara
   fimpara
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
algoritmo "Grade_Vertical"
var
   andar, vaga : inteiro
inicio
   escreval("=== GRADE DE ARMAZENAGEM VERTICAL ===")
   escreval("")

   para andar de 4 ate 1 passo -1 faca // Do 4º andar para o 1º (Térreo)
      escreva("NÍVEL ", andar, " | ")
      para vaga de 1 ate 6 faca
         escreva("[A", andar, "-V", vaga, "] ")
      fimpara
      escreval("")
   fimpara

   escreval("---------------------------------------------")
   escreval("PISO / TÉRREO - DOCAS DE EXPEDIÇÃO")
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
algoritmo "Piramide_Caixas"
var
   linha, coluna : inteiro
inicio
   escreval("=== PIRÂMIDE DE PALETIZAÇÃO ===")
   para linha de 1 ate 5 faca
      para coluna de 1 ate linha faca // O laço interno vai até o número da linha atual!
         escreva("* ")
      fimpara
      escreval("")
   fimpara
fimalgoritmo

📝 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. 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?
  2. 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?
  3. 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?
  4. 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?
  5. No algoritmo Mapeador_Galpao, qual variável controla o laço externo (galpões) e qual controla o laço interno (docas)?
  6. 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)?
  7. 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?
  8. 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)?
  9. No código do Mapeador_Galpao, para que serve o comando escreval("") (vazio) logo após o fimpara do laço interno de docas?
  10. 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)?