01 / 16
Lógica de Programação · Sem 10 · Aula 1/2

Loops Dentro
de Loops

Quando uma repetição não basta — o conceito de aninhar laços e o controle independente das variáveis de cada nível.

ProfessorGuilherme Antunes CursoEnsino Médio Técnico — Informática Duração100 minutos (2 aulas)
02 / 16
Objetivos da Aula

Ao final, você será capaz de.

01

Identificar situações que exigem repetição dupla e entender o conceito de loop dentro de loop

02

Reconhecer o papel do loop externo e do loop interno em estruturas bidimensionais

03

Gerir variáveis de cada nível sem conflito de escopo — usar i, j, k

04

Aplicar acumuladores e implementar padrões clássicos como calendário e pirâmide

03 / 16
Ponto de partida · Analogia

O Catálogo de Produtos 🛒

Imagine que você trabalha numa grande loja de departamentos e precisa criar etiquetas de preço para cada produto:

  • A loja tem 5 prateleiras
  • Cada prateleira tem 10 produtos
  • Você precisa imprimir a etiqueta de cada produto, em cada prateleira

Seria eficiente escrever 50 comandos individuais? E se a loja crescer para 20 prateleiras × 30 produtos?

CONSA SHOP · Catálogo
Prateleira 1
P1P2P3P10
Prateleira 2
P1P2P3P10
… Prateleira N
P1P2P3P10
04 / 16
Construindo o conceito

O que são loops aninhados?

Um loop aninhado é, basicamente, um laço dentro de outro. É uma estrutura poderosa que permite trabalhar com dados bidimensionais (linhas e colunas) ou executar uma ação repetitiva várias vezes — em camadas.

for prateleira in range(1, 6):
    for produto in range(1, 11):
        print(f"Etiqueta {prateleira}-{produto}")
Etiqueta 1-1
Etiqueta 1-2
Etiqueta 1-3

Etiqueta 1-10
Etiqueta 2-1
Etiqueta 2-2

Etiqueta 5-10
🧠 Anatomia: o loop externo percorre as linhas, e a cada iteração dele, o loop interno executa todo o seu ciclo.
05 / 16
A lógica do loop aninhado

Linha × Coluna

O loop externo controla a linha (a prateleira), enquanto o loop interno controla a coluna (o produto). A cada volta do externo, o interno percorre tudo de novo.

# 5 prateleiras × 10 produtos
for i in range(1, 6):           # linha
    for j in range(1, 11):      # coluna
        print(f"Etiqueta {i}-{j}")
Etiqueta 1-1
Etiqueta 1-2

Etiqueta 1-10
Etiqueta 2-1

Etiqueta 4-10
Etiqueta 5-1

Etiqueta 5-10

# 5 × 10 = 50 prints
⚠️ Conta rápida: 5 voltas do externo × 10 voltas do interno = 50 etiquetas impressas. Multiplicar é a chave para entender quanto trabalho um loop aninhado faz.
06 / 16
Em que contextos usamos?

Onde os loops aninhados aparecem de verdade?

🖼️

Imagens

Percorrer cada pixel de uma imagem, linha por linha e coluna por coluna.

📊

Planilhas

Acessar cada célula de uma planilha do Excel, mês a mês, produto a produto.

🎮

Jogos

Desenhar o mapa de um jogo estruturado em uma grade de elementos.

📈

Dados

Processar matrizes e outras estruturas bidimensionais em análises.

Em comum: dois eixos a percorrer — algo se repete dentro de algo que também se repete.

07 / 16
Prática guiada · Mão na massa

🟢 Praticando: Calendário de um Mês

Fácil

Objetivo: imprimir um calendário de 4 semanas × 7 dias, mostrando os dias numerados de 1 a 28 — uma linha por semana.

1

Abra o Python (VS Code, Replit ou IDLE) e crie um arquivo calendario.py

2

Antes dos loops, crie um contador: dia = 1 — ele vai crescer a cada dia impresso

3

Loop externo: for semana in range(1, 5) — controla as 4 semanas (linhas)

4

Loop interno: for d in range(1, 8) — imprima dia, some +1, e print() vazio quebra a linha ao fim do interno

08 / 16
Código completo

Calendário pronto

dia = 1
for semana in range(1, 5):           # 4 semanas
    for d in range(1, 8):            # 7 dias por semana
        print(f"{dia:2}", end=" ")
        dia = dia + 1
    print()                          # quebra de linha ao fim da semana

# Saída:
#  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
🧠 Três detalhes-chave: a variável dia é declarada fora dos dois loops (se ficasse dentro, zerava a cada volta); o end=" " mantém os números na mesma linha; e o print() vazio — fora do interno, dentro do externo — quebra a linha entre as semanas. Esse padrão de dia que cresce a cada iteração tem nome: acumulador — formalizamos daqui a pouco.
09 / 16
Construindo o conceito · Conceito 2

Cada loop, sua própria variável

Em loops aninhados, cada nível usa sua própria variável de controle. O avanço de uma não altera o valor da outra — elas são independentes.

Loop externo
i

Controla a linha (a "prateleira")

Loop interno
j

Controla a coluna (o "produto")

Próximo nível
k

Para um terceiro aninhamento, se necessário

🧠 Convenção: use i, j, k nessa ordem para os três primeiros níveis. É um padrão lido por qualquer programador no mundo.
10 / 16
Escopo aninhado

Quem enxerga quem?

A variável do loop externo é visível dentro do interno — pode ser usada em condições e cálculos. Esse é o "superpoder" dos loops aninhados.

Em Python, i e j continuam existindo mesmo depois do loop terminar (ficam com o último valor que tiveram). Mas não use a variável do interno fora dele — vira fonte de bug.

  • Externo é visível dentro do interno (pode usar nas condições)
  • Interno guarda o último valor, mas perde o contexto
  • Boa prática: trate cada variável apenas no nível em que ela faz sentido
for i in range(1, 4):
    for j in range(1, 6):
        print(f"{i}-{j}")     # ✅ usa i e j juntos

    # j ainda existe, mas o "sentido"
    # de iteração já acabou
    print(f"linha {i} ok")    # ✅ usa i

# i e j ficam com o ÚLTIMO valor
# evite usá-los aqui — confunde quem lê
11 / 16
Cuidado · Erro clássico

Evitando conflitos de escopo

O erro mais comum em loops aninhados é reutilizar a mesma variável nos dois níveis. Isso causa comportamento inesperado, loops infinitos ou erros de sintaxe.

❌ ERRADO
# Usando 'i' nos dois loops
for i in range(1, 6):
    for i in range(1, 6):   # 💥 sobrescreve o externo!
        print("*", end="")
✅ CORRETO
# Cada loop com sua variável
for i in range(1, 6):
    for j in range(1, 6):
        print("*", end="")
⚠️ Regra de ouro: em cada novo nível de aninhamento, declare uma nova variável. Nunca reaproveite o nome do loop externo no interno.
12 / 16
Acumuladores em loops aninhados

Coletando dados em camadas

Um acumulador é uma variável que "coleciona" ou "soma" valores a cada iteração. Em loops aninhados, ele permite somar todos os elementos de uma matriz ou contar itens que atendem a uma condição.

total = 0

for i in range(1, 6):
    for j in range(1, 6):
        total = total + (i * j)

print("Total:", total)
🧠 Atenção ao escopo: o acumulador (total) é declarado antes do loop externo e atualizado dentro do interno. Se inicializasse dentro, ele zeraria a cada volta!
13 / 16
Prática guiada · Mão na massa

🔴 Praticando: Padrão de Pirâmide

Desafio

Objetivo: desenhar uma pirâmide centralizada. Cada linha precisa de duas coisas: os espaços à esquerda (que recuam) e os asteriscos (que crescem em números ímpares: 1, 3, 5, 7, 9).

1

Loop externo: linha de 1 a 5

2

1º loop interno: imprime (5 − linha) espaços

3

2º loop interno: imprime (2 × linha − 1) asteriscos

4

Ao fim, print() vazio para quebrar a linha

Resultado esperado

* *** ***** ******* *********

Dois loops internos dentro do mesmo externo: um cuida do recuo, o outro do desenho.

14 / 16
Código completo · Pirâmide

Padrão pronto

for linha in range(1, 6):
    for c in range(5 - linha):       # espaços à esquerda
        print(" ", end="")
    for c in range(2 * linha - 1):   # asteriscos da linha
        print("*", end="")
    print()                           # quebra de linha
🧠 O truque: são dois loops internos em sequência, dentro do mesmo externo. O primeiro imprime os espaços (que diminuem), o segundo imprime os asteriscos (que aumentam em números ímpares). Os dois usam a variável linha do externo — prova de que o externo é visível dentro do interno.
15 / 16
Pause e responda

Tentamos desenhar um triângulo. O que vai sair?

# Esperávamos um triângulo crescente…
for linha in range(1, 6):
    for coluna in range(1, linha + 1):
        print("*")
ADesenha um triângulo crescente perfeito de 1 a 5 asteriscos
BDesenha um quadrado 5×5 preenchido
CImprime um asterisco por linha — 15 linhas no total (faltou end="")
DGera erro porque o limite do interno depende do externo
🧠 Detalhe-chave do Python: print por padrão pula linha. Para imprimir na mesma linha, use print("*", end=""). Esse é um dos bugs mais comuns de quem está começando.
16 / 16
Então ficamos assim…

O que aprendemos hoje

  • Loops aninhados → laço dentro de laço para resolver problemas bidimensionais
  • Loop externo × interno → o externo percorre "linhas", o interno percorre "colunas" para cada iteração do externo
  • Variáveis independentes (i, j, k) → cada loop com sua própria variável de controle
  • Escopo aninhado → externo é visível no interno; o contrário não
  • Conflito de escopo → reusar variável causa erro/loop infinito
  • Acumuladores → declarados fora e atualizados dentro do laço
📚 Próxima aula

Complexidade e otimização — você vai descobrir por que O(n²) assusta os programadores, aprender a medir o custo do código e fechar a semana com um laboratório prático de padrões geométricos.