Capítulo 15: Matrizes I: Arrays Bidimensionais (Tabelas em Memória)

🎯 Objetivo da Aula

Quando os dados corporativos possuem duas dimensões (como um relatório de estoque por filial e categoria, ou um mapa de assentos de um voo cargueiro), um vetor simples de uma dimensão não é suficiente. Precisamos de uma Matriz (Array 2D).

Nesta aula, você aprenderá a:

  1. Compreender a estrutura conceitual de uma Matriz Bidimensional (Linhas $\times$ Colunas).
  2. Dominar a sintaxe de declaração: tipo nomeMatriz[linhas][colunas] no Portugol Studio.
  3. Compreender a Indexação Base Zero Bidimensional ([0..L-1][0..C-1]).
  4. Utilizar Laços Aninhados para preencher e desenhar tabelas formatadas no console.

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


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

Situação: O sistema de WMS (Warehouse Management System) da FastLog gerencia o estoque de 3 Centros de Distribuição Regionais (CD 0: São Paulo, CD 1: Rio de Janeiro, CD 2: Curitiba). Cada CD armazena 3 categorias de mercadorias (Coluna 0: Eletrônicos, Coluna 1: Autopeças, Coluna 2: Farmacêuticos).

Missão: Construir o painel da Grade de Estoque Multirregional $3 \times 3$, permitindo que o gestor digite as quantidades em estoque e veja a tabela consolidada no console.


🧠 Fundamentos: A Estrutura de uma Matriz 2D

1. O que é uma Matriz?

Uma Matriz é uma tabela de elementos do mesmo tipo, organizada em Linhas Horizontais ($L$) e Colunas Verticais ($C$):

graph TD
    subgraph Matriz_3x3 ["Matriz: estoque[3][3]"]
        M00["[0][0] SP-Eletrônicos"] --- M01["[0][1] SP-Autopeças"] --- M02["[0][2] SP-Farma"]
        M10["[1][0] RJ-Eletrônicos"] --- M11["[1][1] RJ-Autopeças"] --- M12["[1][2] RJ-Farma"]
        M20["[2][0] PR-Eletrônicos"] --- M21["[2][1] PR-Autopeças"] --- M22["[2][2] PR-Farma"]
    end
    
    style M00 fill:#2980b9,stroke:#fff,color:#fff
    style M11 fill:#8e44ad,stroke:#fff,color:#fff
    style M22 fill:#27ae60,stroke:#fff,color:#fff

2. A Regra Mnemônica: “LC” (Linha primeiro, Coluna depois)

No Portugol Studio, assim como em C, C++, Java e C#:

  • O primeiro colchete [ l ] sempre indica a Linha.
  • O segundo colchete [ c ] sempre indica a Coluna.
1
2
3
inteiro estoque[3][3] // Matriz 3x3 (Linhas 0 a 2, Colunas 0 a 2)
estoque[0][0] = 1500  // Linha 0 (SP), Coluna 0 (Eletrônicos)
estoque[2][1] = 850   // Linha 2 (PR), Coluna 1 (Autopeças)

Assim como o vetor unidimensional (Capítulo 13), a matriz também pode ser inicializada diretamente com valores literais entre chaves — só que agora são chaves aninhadas: uma chave externa para o conjunto de linhas, e uma chave interna para cada linha:

1
2
3
4
real rotas[2][2] = {
	{0.0, 850.0},
	{850.0, 0.0}
}

Cada linha entre { } internas vira uma linha da matriz, na ordem: a primeira { } interna preenche rotas[0][0] e rotas[0][1]; a segunda preenche rotas[1][0] e rotas[1][1].


📖 Exemplo Guiado: Grade de Estoque dos CDs

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
30
31
32
33
34
35
36
37
38
39
40
programa 
{
	funcao inicio() 
	{
		inteiro estoque[3][3]
		cadeia cds[3] = {"São Paulo (SP)   ", "Rio de Janeiro (RJ)", "Curitiba (PR)    "}

		escreva("==================================================\n")
		escreva("      FASTLOG - MATRIZ DE ESTOQUE MULTI-CD        \n")
		escreva("==================================================\n\n")

		// 1. Entrada de Dados via Laços Aninhados
		para (inteiro l = 0; l < 3; l++) 
		{
			escreva(">>> Digite o estoque para: ", cds[l], "\n")
			para (inteiro c = 0; c < 3; c++) 
			{
				escreva("    Categoria [", c, "] - Qtd Paletes: ")
				leia(estoque[l][c])
			}
			escreva("\n")
		}

		// 2. Impressão Tabular da Matriz
		escreva("================ TABELA CONSOLIDADA ================\n")
		escreva(" UNIDADE REGIONAL    | ELETRÔNICOS | AUTOPEÇAS | FARMA \n")
		escreva("---------------------+-------------+-----------+-------\n")
		
		para (inteiro l = 0; l < 3; l++) 
		{
			escreva(" ", cds[l], " | ")
			para (inteiro c = 0; c < 3; c++) 
			{
				escreva("    ", estoque[l][c], " un  | ")
			}
			escreva("\n")
		}
		escreva("====================================================\n")
	}
}

🛠️ Prática Obrigatória 1: Matriz Identidade $3 \times 3$ Automatizada

Passo 1: O Desafio

Em computação gráfica e álgebra linear, a Matriz Identidade possui o valor 1 na Diagonal Principal (onde linha == coluna) e 0 em todas as demais posições. Crie um programa matriz_identidade.por que preencha automaticamente uma matriz $3 \times 3$ com essa regra usando um se (l == c) e exiba a grade na tela.

✅ Resultado Esperado (Prática 1):

1
2
3
1  0  0
0  1  0
0  0  1

🛠️ Prática Obrigatória 2: Tabuleiro de Ocupação de Doca (2×4)

Crie um programa ocupacao_docas.por que declare uma matriz $2 \times 4$ de inteiros (inteiro docas[2][4]) representando 2 turnos e 4 docas. Preencha com a quantidade de carretas atendidas e exiba a tabela final.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_15_SeuNome_SeuSobrenome.por.
  2. Certifique-se de que os laços utilizam l para linhas e c para colunas.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 15 - Matrizes Bidimensionais”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar Tabelas Relacionais e Tensors. O formato bidimensional [linha][coluna] é a exata representação de planilhas Excel, tabelas SQL e matrizes de pesos em Redes Neurais Artificiais (Inteligência Artificial).


🔥 Desafio de Fixação: Somatório Total de Matriz

Crie um programa que leia todos os valores de uma matriz $3 \times 3$ de números reais e calcule a Soma Total de todos os elementos armazenados na tabela.


🔑 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
programa {
	funcao inicio() {
		inteiro I[3][3]

		// Preenchimento com regra matemática
		para (inteiro l = 0; l < 3; l++) {
			para (inteiro c = 0; c < 3; c++) {
				se (l == c) {
					I[l][c] = 1
				} senao {
					I[l][c] = 0
				}
			}
		}

		// Exibição
		escreva("=== MATRIZ IDENTIDADE 3x3 ===\n")
		para (inteiro l = 0; l < 3; l++) {
			para (inteiro c = 0; c < 3; c++) {
				escreva(I[l][c], "  ")
			}
			escreva("\n")
		}
	}
}

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
programa {
	funcao inicio() {
		inteiro docas[2][4]

		escreva("=== REGISTRO DE ATENDIMENTO EM DOCAS ===\n")
		para (inteiro t = 0; t < 2; t++) {
			escreva(">> TURNO ", t+1, ":\n")
			para (inteiro d = 0; d < 4; d++) {
				escreva("   Doca [", d+1, "] Carretas: ")
				leia(docas[t][d])
			}
		}

		escreva("\n--- MAPA DE ATENDIMENTO FINAL ---\n")
		para (inteiro t = 0; t < 2; t++) {
			escreva("Turno ", t+1, ": ")
			para (inteiro d = 0; d < 4; d++) {
				escreva("[Doca ", d+1, ": ", docas[t][d], " carretas] ")
			}
			escreva("\n")
		}
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
programa {
	funcao inicio() {
		real m[3][3], somaTotal = 0.0

		escreva("Digite os valores da matriz 3x3:\n")
		para (inteiro l = 0; l < 3; l++) {
			para (inteiro c = 0; c < 3; c++) {
				escreva("Posição [", l, "][", c, "]: ")
				leia(m[l][c])
				somaTotal += m[l][c]
			}
		}

		escreva("\n========================================\n")
		escreva("SOMA TOTAL DE TODOS OS ELEMENTOS: ", somaTotal, "\n")
		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 é uma Matriz, segundo a definição apresentada nos Fundamentos deste capítulo?
  2. Qual é a sintaxe de declaração de uma matriz no Portugol Studio? Dê um exemplo de uma matriz 3x3 de inteiro.
  3. Explique a Regra Mnemônica “LC”: o que indica o primeiro colchete e o que indica o segundo colchete no acesso a uma matriz?
  4. No Cenário Prático da Grade de Estoque Multirregional, quais são os três Centros de Distribuição (linhas) e quais as três categorias de mercadoria (colunas)?
  5. No Exemplo Guiado, que tipo de estrutura de repetição é utilizada para preencher e depois exibir a matriz de estoque?
  6. O que é uma Matriz Identidade, segundo a Prática Obrigatória 1, e qual regra lógica (envolvendo linha e coluna) determina em quais posições deve ser colocado o valor 1?
  7. Na Prática Obrigatória 2 (Tabuleiro de Ocupação de Doca), quais são as dimensões da matriz criada e o que cada dimensão representa?
  8. Segundo o Checkpoint de Lógica & Engenharia de Software, a que estruturas do mundo real o formato bidimensional [linha][coluna] é comparado?
  9. Segundo a Regra Mnemônica LC, se você acessa estoque[2][1], qual linha e qual coluna estão sendo referenciadas?
  10. Dê um exemplo do dia a dia (fora da programação) de uma informação organizada em linhas e colunas, semelhante à grade de estoque multirregional da FastLog.