Capítulo 15: Matrizes Bidimensionais (Tabelas e Grades em Memória)

🎯 Objetivo da Aula

Uma lista unidimensional (vetor) resolve problemas simples, mas a maioria das informações empresariais é inerentemente bidimensional: planilhas do Excel, relatórios de vendas por filial e mês, tabuleiros de xadrez e posições de paletes em armazéns verticais.

Nesta aula, você aprenderá a:

  1. Compreender o conceito de Matriz Bidimensional (Array 2D / Tabela em Memória).
  2. Dominar a sintaxe de declaração: nomeMatriz : vetor [1..Linhas, 1..Colunas] de tipo.
  3. Acessar e alterar elementos utilizando o par de coordenadas cartesianas matriz[linha, coluna].
  4. Percorrer e imprimir tabelas completas com Laços Aninhados (i e j).

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


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

Situação: O Diretor de Operações da FastLog administra 3 Filiais (SP, RJ, PR). Cada filial comercializa 3 Categorias de Produtos (Insumos, Peças, Embalagens). Ele precisa de um sistema no terminal que permita digitar o saldo de estoque de cada categoria em cada filial e exiba uma Matriz Consolidada de Estoques 3×3 perfeitamente alinhada em formato de tabela.

Missão: Você deve construir a Grade de Estoque Multirregional FastLog, utilizando uma matriz bidimensional de números inteiros preenchida interativamente pelo teclado.


🧠 Fundamentos: A Estrutura de uma Matriz 2D

1. Linhas e Colunas na Memória

Uma Matriz é um vetor de vetores: uma grade bidimensional organizada em Linhas Horizontais ($L$) e Colunas Verticais ($C$):

graph TD
    subgraph Matriz_Estoque ["Matriz 3x3: estoque[linha, coluna]"]
        E11["[1,1]: SP/Insumos"] --- E12["[1,2]: SP/Peças"] --- E13["[1,3]: SP/Embalagens"]
        E21["[2,1]: RJ/Insumos"] --- E22["[2,2]: RJ/Peças"] --- E23["[2,3]: RJ/Embalagens"]
        E31["[3,1]: PR/Insumos"] --- E32["[3,2]: PR/Peças"] --- E33["[3,3]: PR/Embalagens"]
    end
    
    style E11 fill:#2980b9,stroke:#fff,color:#fff
    style E12 fill:#2980b9,stroke:#fff,color:#fff
    style E13 fill:#2980b9,stroke:#fff,color:#fff
    style E21 fill:#27ae60,stroke:#fff,color:#fff
    style E22 fill:#27ae60,stroke:#fff,color:#fff
    style E23 fill:#27ae60,stroke:#fff,color:#fff
    style E31 fill:#8e44ad,stroke:#fff,color:#fff
    style E32 fill:#8e44ad,stroke:#fff,color:#fff
    style E33 fill:#8e44ad,stroke:#fff,color:#fff

2. A Sintaxe de Declaração no VisuAlg

Na seção var:

1
2
3
4
var
   estoque : vetor [1..3, 1..3] de inteiro // 3 linhas e 3 colunas
   tabelaPrecos : vetor [1..4, 1..6] de real // 4 linhas e 6 colunas
   l, c : inteiro // Índices para Linha e Coluna

A Regra Mnemônica Clássica: “LC” (Linha primeiro, Coluna depois):
matriz[2, 3] refere-se à Linha 2, Coluna 3. Nunca inverta a ordem das coordenadas!


3. Preenchimento e Exibição de Matrizes com Laços Aninhados

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 1. Leitura da Matriz (Preenchendo célula por célula)
para l de 1 ate 3 faca
   para c de 1 ate 3 faca
      escreva("Digite o valor para [Linha ", l, ", Coluna ", c, "]: ")
      leia(estoque[l, c])
   fimpara
fimpara

// 2. Impressão Tabular (Formato de Grade)
para l de 1 ate 3 faca
   para c de 1 ate 3 faca
      escreva(estoque[l, c]:5) // escreva sem pular linha
   fimpara
   escreval("") // Quebra de linha ao fim de cada linha da tabela!
fimpara

📖 Exemplo Guiado: Grade de Estoque Multirregional (3×3)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
algoritmo "Matriz_Estoque_Regional"
var
   estoque : vetor [1..3, 1..3] de inteiro
   l, c, totalGeral : inteiro

inicio
   totalGeral <- 0

   escreval("==================================================")
   escreval("       FASTLOG - MATRIZ DE ESTOQUES 3x3           ")
   escreval(" [1] SP | [2] RJ | [3] PR                         ")
   escreval(" Categorias: 1-Insumos | 2-Peças | 3-Embalagens   ")
   escreval("==================================================")
   escreval("")

   // 1. Entrada de Dados na Matriz
   para l de 1 ate 3 faca
      escreval("--- CADASTRANDO DADOS DA FILIAL #", l, " ---")
      para c de 1 ate 3 faca
         escreva("Qtd Categoria ", c, " (unidades): ")
         leia(estoque[l, c])
         totalGeral <- totalGeral + estoque[l, c]
      fimpara
   fimpara

   // 2. Exibição Tabular Formatada
   escreval("")
   escreval("============== TABELA CONSOLIDADA ==============")
   escreval(" FILIAL   | CAT 1 (Ins) | CAT 2 (Pçs) | CAT 3 (Emb) ")
   escreval("----------+-------------+-------------+-------------")
   para l de 1 ate 3 faca
      escreva(" Filial ", l, " | ")
      para c de 1 ate 3 faca
         escreva(estoque[l, c]:8)
         se (c < 3) entao
            escreva("    | ")
         fimse
      fimpara
      escreval("")
   fimpara
   escreval("================================================")
   escreval("Saldo Total Consolidado na Rede: ", totalGeral, " unidades.")
fimalgoritmo

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

1
2
3
4
5
6
7
8
============== TABELA CONSOLIDADA ==============
 FILIAL   | CAT 1 (Ins) | CAT 2 (Pçs) | CAT 3 (Emb) 
----------+-------------+-------------+-------------
 Filial 1 |      120    |       45    |      300
 Filial 2 |       80    |       20    |      150
 Filial 3 |      210    |       90    |      420
================================================
Saldo Total Consolidado na Rede: 1435 unidades.

🛠️ Prática Obrigatória 1: Mapa de Ocupação de Posições no Galpão (3×3)

Passo 1: O Desafio

Crie um algoritmo "Mapa_Galpao_3x3" que declare uma matriz de inteiros 3×3 representando as 9 posições físicas de armazenagem do galpão:

  • Digite 0 para Posição Vazia e 1 para Posição Ocupada por Palete.
  • Ao final, imprima a grade visual com colchetes [0] e [1] e conte quantas posições estão ocupadas e quantas estão livres.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
GRADE VISUAL DO GALPÃO:
[ 1 ] [ 0 ] [ 1 ]
[ 0 ] [ 1 ] [ 1 ]
[ 1 ] [ 1 ] [ 0 ]

Posições Ocupadas: 6 | Posições Livres: 3

🛠️ Prática Obrigatória 2: Matriz de Faturamento Semestral de 2 Unidades (2×3)

Crie um algoritmo "Faturamento_2x3" que declare uma matriz de real de dimensão 2x3 (2 Filiais × 3 Meses do Trimestre). O programa deve:

  1. Receber os valores de faturamento de cada filial mês a mês.
  2. Imprimir a tabela formatada com moeda (R$).

✅ Resultado Esperado (Prática 2):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
=== ENTRADA DE FATURAMENTO (2 Filiais x 3 Meses) ===
Filial 1 - Mês 1 (R$): 150000.00
Filial 1 - Mês 2 (R$): 180000.00
Filial 1 - Mês 3 (R$): 210000.00
Filial 2 - Mês 1 (R$): 95000.00
Filial 2 - Mês 2 (R$): 110000.00
Filial 2 - Mês 3 (R$): 130000.00

============ FATURAMENTO TRIMESTRAL ============
 UNIDADE  |   MÊS 1 (R$)  |   MÊS 2 (R$)  |   MÊS 3 (R$)  
----------+---------------+---------------+---------------
 Filial 1 | R$ 150000.00 | R$ 180000.00 | R$ 210000.00
 Filial 2 | R$  95000.00 | R$ 110000.00 | R$ 130000.00
================================================

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_SeuNome_SeuSobrenome.alg.
  2. Verifique se o desenho da tabela no console mantém o alinhamento das colunas com espaçadores (:8).
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 15 - Matrizes 2D”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar Tabelas Relacionais em Memória. Softwares de planilhas eletrônicas (como o Microsoft Excel e Google Sheets) e bancos de dados SQL armazenam suas tabelas de dados exatamente sob o modelo matricial de linhas e colunas bidimensionais.


🔥 Desafio de Fixação: Matriz Identidade de Ordem 3

Crie um algoritmo que preencha automaticamente uma matriz 3×3 com a Matriz Identidade (colocando o valor 1 onde a linha for igual à coluna l = c, e 0 em todas as outras posições), imprimindo a grade na tela sem pedir digitação ao usuário.


🔑 Gabarito de Código Completo

Prática 1:

 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
32
33
algoritmo "Mapa_Galpao_3x3"
var
   galpao : vetor [1..3, 1..3] de inteiro
   l, c, livres, ocupadas : inteiro
inicio
   livres <- 0
   ocupadas <- 0

   escreval("=== LEITURA DE SENSORES DO GALPÃO (0-Livre, 1-Ocupado) ===")
   para l de 1 ate 3 faca
      para c de 1 ate 3 faca
         escreva("Posição [", l, ",", c, "]: ")
         leia(galpao[l, c])
         se (galpao[l, c] = 1) entao
            ocupadas <- ocupadas + 1
         senao
            livres <- livres + 1
         fimse
      fimpara
   fimpara

   escreval("")
   escreval("=== GRADE VISUAL DO GALPÃO ===")
   para l de 1 ate 3 faca
      para c de 1 ate 3 faca
         escreva("[ ", galpao[l, c], " ] ")
      fimpara
      escreval("")
   fimpara

   escreval("------------------------------")
   escreval("Posições Ocupadas: ", ocupadas, " | Posições Livres: ", livres)
fimalgoritmo

Prática 2:

 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 "Faturamento_2x3"
var
   faturamento : vetor [1..2, 1..3] de real
   l, c : inteiro
inicio
   escreval("=== ENTRADA DE FATURAMENTO (2 Filiais x 3 Meses) ===")
   para l de 1 ate 2 faca
      para c de 1 ate 3 faca
         escreva("Filial ", l, " - Mês ", c, " (R$): ")
         leia(faturamento[l, c])
      fimpara
   fimpara

   escreval("")
   escreval("============ FATURAMENTO TRIMESTRAL ============")
   escreval(" UNIDADE  |   MÊS 1 (R$)  |   MÊS 2 (R$)  |   MÊS 3 (R$)  ")
   escreval("----------+---------------+---------------+---------------")
   para l de 1 ate 2 faca
      escreva(" Filial ", l, " | ")
      para c de 1 ate 3 faca
         escreva("R$ ", faturamento[l, c]:9:2)
         se (c < 3) entao
            escreva(" | ")
         fimse
      fimpara
      escreval("")
   fimpara
   escreval("================================================")
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
algoritmo "Matriz_Identidade_3x3"
var
   matrizIdentidade : vetor [1..3, 1..3] de inteiro
   l, c : inteiro
inicio
   // Preenchimento Lógico Automático
   para l de 1 ate 3 faca
      para c de 1 ate 3 faca
         se (l = c) entao
            matrizIdentidade[l, c] <- 1 // Diagonal Principal
         senao
            matrizIdentidade[l, c] <- 0
         fimse
      fimpara
   fimpara

   escreval("=== MATRIZ IDENTIDADE DE ORDEM 3 ===")
   para l de 1 ate 3 faca
      para c de 1 ate 3 faca
         escreva(matrizIdentidade[l, c]:4)
      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. O que é uma Matriz, segundo a definição apresentada nos Fundamentos deste capítulo?
  2. Escreva a sintaxe de declaração, na seção var, de uma matriz de inteiros com 3 linhas e 3 colunas.
  3. O que diz a regra mnemônica “LC” apresentada no aviso importante, e o que representa exatamente matriz[2, 3]?
  4. No trecho de preenchimento e exibição com laços aninhados, para que serve o comando escreval("") colocado logo após o fimpara do laço interno, na etapa de impressão tabular?
  5. No Cenário Prático, quantas filiais e quantas categorias de produtos a FastLog administra, e qual é a dimensão resultante da matriz de estoques?
  6. No algoritmo Matriz_Estoque_Regional, o que a variável totalGeral acumula, e dentro de qual dos dois laços aninhados ela é incrementada?
  7. Na Prática Obrigatória 1 (Mapa_Galpao_3x3), o que significam os valores 0 e 1 digitados para cada posição da grade?
  8. Na Prática Obrigatória 2 (Faturamento_2x3), qual é a dimensão da matriz de faturamento (quantas filiais por quantos meses)?
  9. Segundo o Checkpoint de Lógica, quais dois tipos de software citados armazenam suas tabelas de dados sob o modelo matricial de linhas e colunas?
  10. Segundo os objetivos da aula, qual é o par de coordenadas usado para acessar e alterar um elemento específico dentro de uma matriz?