Capítulo 12: Laços Aninhados e Varredura Bidimensional

🎯 Objetivo da Aula

O espaço físico dos centros de distribuição e as telas de computadores são bidimensionais: possuem Linhas e Colunas, Corredores e Prateleiras. Para que um sistema varra todas as posições de uma estrutura desse tipo, precisamos de Laços Aninhados (Nested Loops).

Nesta aula, você aprenderá a:

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

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


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

Situação: O novo Centro Logístico Automatizado da FastLog possui 3 Galpões de Armazenagem. Cada galpão possui 4 Docas de Carregamento. O painel supervisor precisa gerar o mapa de todas as 12 posições físicas de carga ([G1-D1], [G1-D2], etc.) de forma automatizada no console.

Missão: Você deve construir o Mapeador de Docas FastLog, utilizando laços aninhados para gerar a grade de coordenadas bidimensionais.


🧠 Fundamentos: Como Funcionam os Laços Aninhados?

1. A Dinâmica dos Ponteiros de Relógio

Pense em laços aninhados como os ponteiros de um relógio:

  • O Laço Interno (j) gira rapidamente de 1 até o fim a cada ciclo.
  • O Laço Externo (i) só avança +1 quando o laço interno completa todas as suas repetições!
graph TD
    A["Laço Externo: para (inteiro i = 1; i <= 3; i++) [Galpões]"] --> B["Laço Interno: para (inteiro j = 1; j <= 4; j++) [Docas]"]
    B --> C["Ação: escreva('[G', i, '-D', j, '] ')"]
    C --> D{j <= 4?}
    D -- "Sim" --> B
    D -- "Não (Fim das Docas)" --> E["escreva('\n') - Quebra Linha"]
    E --> F{i <= 3?}
    F -- "Sim" --> A
    F -- "Não (Fim dos Galpões)" --> G[Fim do Mapeamento]
    
    style A fill:#8e44ad,stroke:#fff,color:#fff
    style B fill:#2980b9,stroke:#fff,color:#fff
    style C fill:#27ae60,stroke:#fff,color:#fff
    style G fill:#217346,stroke:#fff,color:#fff

2. Complexidade de Execução ($N \times M$)

Se o laço externo roda 3 vezes e o laço interno roda 4 vezes, o comando central dentro das chaves será executado exatamente: $$3 \times 4 = 12 \text{ vezes}$$

Atenção às Variáveis de Controle:
Nunca declare a mesma variável i para o laço externo e para o interno. Use sempre nomes distintos (como i e j, ou linha e coluna).


📖 Exemplo Guiado: Mapeador de Posições do Centro Logístico

Código do Programa:

 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
programa 
{
	funcao inicio() 
	{
		inteiro totalPosicoes = 0

		escreva("==================================================\n")
		escreva("    FASTLOG - MAPA DE DOCAS POR GALPÃO (3x4)      \n")
		escreva("==================================================\n\n")

		// Laço Externo: Galpões 1 a 3
		para (inteiro i = 1; i <= 3; i++) 
		{
			escreva("GALPÃO ", i, " -> ")
			
			// Laço Interno: Docas 1 a 4
			para (inteiro j = 1; j <= 4; j++) 
			{
				escreva("[G", i, "-D", j, "] ")
				totalPosicoes++
			}
			
			escreva("\n") // Pula linha ao fim de cada galpão
		}

		escreva("\n==================================================\n")
		escreva("Total de Docas Mapeadas na Rede: ", totalPosicoes, " posições ativas.\n")
	}
}

✅ Exemplo de Execução no Console (Shift + F6):

 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: Gerador de Tabuadas de Tarifas (1 a 5)

Passo 1: O Desafio

Crie um programa tabuadas_tarifas.por que utilize laços aninhados para gerar as tabuadas multiplicativas de tarifas de 1 até 5 (multiplicando de 1 a 10 cada uma).

  • Laço externo: Tarifa 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 Vertical de Armazenagem

No armazém vertical, temos 4 Níveis de Altura (Andares) e 6 Vagas por Andar. Crie um programa grade_vertical.por que desenhe a grade de armazenagem completa utilizando colchetes [ ].


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_12_SeuNome_SeuSobrenome.por.
  2. Verifique se o \n é disparado no final do laço interno.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 12 - Laços Aninhados”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o alicerce de Computação Gráfica e Processamento de Matrizes. Cada pixel de uma tela de alta definição Full HD (1920 $\times$ 1080) é renderizado através de laços aninhados que percorrem linhas e colunas 60 vezes por segundo!


🔥 Desafio de Fixação: Pirâmide de Paletização

Crie um programa 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
programa {
	funcao inicio() {
		para (inteiro base = 1; base <= 5; base++) {
			escreva("\n=== TABUADA DA TARIFA ", base, " ===\n")
			para (inteiro mult = 1; mult <= 10; mult++) {
				escreva(base, " x ", mult, " = ", (base * mult), "\n")
			}
		}
	}
}

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
programa {
	funcao inicio() {
		escreva("=== GRADE DE ARMAZENAGEM VERTICAL ===\n\n")

		para (inteiro andar = 4; andar >= 1; andar--) {
			escreva("NÍVEL ", andar, " | ")
			para (inteiro vaga = 1; vaga <= 6; vaga++) {
				escreva("[A", andar, "-V", vaga, "] ")
			}
			escreva("\n")
		}

		escreva("---------------------------------------------\n")
		escreva("PISO TÉRREO - DOCAS DE EXPEDIÇÃO\n")
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
programa {
	funcao inicio() {
		escreva("=== PIRÂMIDE DE PALETIZAÇÃO ===\n")
		para (inteiro linha = 1; linha <= 5; linha++) {
			para (inteiro col = 1; col <= linha; col++) {
				escreva("* ")
			}
			escreva("\n")
		}
	}
}

📝 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. O que caracteriza um Laço Aninhado, segundo a analogia dos ponteiros de relógio usada no capítulo?
  2. Por convenção adotada no capítulo, qual variável representa o laço Externo (Linha) e qual representa o laço Interno (Coluna)?
  3. Se o laço externo executa 3 vezes e o laço interno executa 4 vezes, quantas vezes o comando dentro das chaves do laço interno será executado ao todo? Explique com base na fórmula apresentada no capítulo.
  4. Segundo o aviso de atenção do capítulo, por que nunca se deve declarar a mesma variável de controle para o laço externo e para o laço interno?
  5. No Exemplo Guiado do Mapeador de Docas, quantos Galpões e quantas Docas por galpão são mapeados, e qual é o total de posições geradas ao final?
  6. Na Prática Obrigatória 1 (Gerador de Tabuadas de Tarifas), o que representa o laço externo e o que representa o laço interno?
  7. Na Prática Obrigatória 2 (Grade Vertical de Armazenagem), quantos Níveis de Altura (Andares) e quantas Vagas por Andar existem no armazém a ser mapeado?
  8. Segundo o Checkpoint de Lógica & Engenharia de Software, qual exemplo do cotidiano tecnológico o capítulo usa para ilustrar a aplicação de laços aninhados em Computação Gráfica?
  9. No diagrama de fluxo do capítulo, o que acontece com a execução quando a condição do laço interno (j <= 4) é avaliada como “Não”?
  10. Dê um exemplo do dia a dia, fora da programação, de uma estrutura organizada em linhas e colunas que poderia ser percorrida com laços aninhados, de forma parecida com o mapeamento de galpões e docas da FastLog.