Capítulo 16: Matrizes II: Processamento e Cálculos Complexos (Somas, Diagonais e Rotas)
🎯 Objetivo da Aula
Uma matriz no computador não serve apenas para armazenar números: ela é o motor de consolidação contábil e roteirização operacional. Em auditorias fiscais, precisamos somar o total faturado por cada filial (somatório de linhas) ou descobrir qual trimestre foi mais produtivo na empresa (somatório de colunas).
Nesta aula, você aprenderá a:
- Implementar o algoritmo de Somatório por Linha (Totalização de Filial).
- Implementar o algoritmo de Somatório por Coluna (Totalização por Período).
- Processar e isolar a Diagonal Principal ($L = C$).
- Construir e consultar uma Matriz de Cotação de Rotas Cruzadas $4 \times 4$ (Origem $\times$ Destino).
📥 Material de Apoio e Código-Fonte da Aula:
- 📄 Arquivo Pronto (.por): Baixar Capitulo_16.por (abra diretamente no Portugol Studio)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_16.zip
🏢 O Cenário Prático (Seu Desafio)
Situação: O sistema tarifário da FastLog possui uma Matriz de Custos de Frete $4 \times 4$ interligando 4 capitais estratégicas:
0: São Paulo (SP)1: Rio de Janeiro (RJ)2: Belo Horizonte (BH)3: Curitiba (PR)
A tarifa para transportar de uma cidade para ela mesma ([0][0], [1][1], etc.) é R$ 0,00 (Diagonal Principal). Para transportar de SP (0) para Curitiba (3), a tarifa é R$ 1.850,00 (rotas[0][3]).
Missão: Você deve programar a matriz de rotas, calcular a receita total por praça de origem e permitir a consulta instantânea de frete entre quaisquer duas capitais digitadas pelo operador.
🧠 Fundamentos: Algoritmos Avançados em Matrizes
graph TD
A["Matriz de Rotas rotas[4][4]"] --> B["1. Somatório por Linha: Total de Saídas da Origem"]
A --> C["2. Somatório por Coluna: Total de Chegadas no Destino"]
A --> D["3. Diagonal Principal (l == c): Origem == Destino (Custo R$ 0,00)"]
A --> E["4. Consulta Direta: rotas[origem][destino] -> O(1)"]
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 D fill:#f39c12,stroke:#fff,color:#fff
style E fill:#217346,stroke:#fff,color:#fff1. Padrão de Somatório por Linha
Para somar cada linha individualmente, o acumulador somaLinha deve ser zerado antes de iniciar o laço interno c. O laço externo controla a linha (l); o laço interno percorre as colunas daquela linha:
2. Padrão de Somatório por Coluna
Para somar por coluna em vez de por linha, basta inverter a ordem dos laços: o laço externo passa a controlar a coluna (c), e o laço interno percorre as linhas (l) daquela coluna. O acumulador é zerado a cada nova coluna:
Repare que a única diferença estrutural para o Somatório por Linha é qual variável (l ou c) fica no laço de fora e qual é usada para zerar o acumulador — o corpo do laço interno (+= rotas[l][c]) é idêntico nos dois casos.
3. A Diagonal Principal ($L == C$)
A diagonal principal contém os elementos cujos índices de linha e coluna são idênticos ([0][0], [1][1], [2][2], [3][3]). Podemos percorrê-la com um único laço para:
4. Consulta Direta e Complexidade O(1)
Diferente de percorrer a matriz inteira com laços (que custa tempo proporcional ao número de elementos), acessar uma posição específica já conhecida — como rotas[origem][destino] — é instantâneo: o computador calcula o endereço de memória exato daquela posição diretamente, sem precisar comparar ou percorrer nenhum outro elemento. Por isso essa operação tem complexidade O(1) (“tempo constante”): o tempo de acesso não depende do tamanho da matriz.
📖 Exemplo Guiado: Matriz de Rotas e Tarifas $4 \times 4$
Código do Programa:
🛠️ Prática Obrigatória 1: Somatório de Faturamento por Trimestre (Soma de Colunas)
Passo 1: O Desafio
Dada a matriz de faturamento de 3 filiais por 4 trimestres:
real faturamento[3][4]
Crie um programa soma_colunas.por que inverta a ordem dos laços (para c de 0 ate 3 por fora e para l de 0 ate 2 por dentro) para calcular o faturamento total da empresa em cada trimestre (T1, T2, T3, T4).
✅ Resultado Esperado (Prática 1):
🛠️ Prática Obrigatória 2: Verificador de Rota Local (Diagonal Principal)
Crie um programa diagonal_rotas.por que leia a matriz de rotas $4 \times 4$ e comprove que todas as posições da Diagonal Principal (rotas[i][i]) possuem custo 0.0. Se alguma for maior que zero, exiba um alerta de inconsistência tarifária.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_SeuNome_SeuSobrenome.por. - Certifique-se de que os acumuladores são zerados no local correto.
- No Microsoft Teams, envie na tarefa “Portugol Cap 16 - Cálculos em Matrizes”.
- Clique em Entregar (Turn In).
💡 Checkpoint de Lógica & Engenharia de Software
Você acabou de aplicar o conceito de Matrizes de Adjacência e Teoria dos Grafos. Algoritmos como o de Dijkstra (utilizado no Google Maps e no roteamento de pacotes TCP/IP na Internet) utilizam matrizes bidimensionais para encontrar a rota mais curta entre cidades.
🔥 Desafio de Fixação: Matriz Transposta
Crie um programa que leia uma matriz $2 \times 3$ e gere a sua Matriz Transposta $3 \times 2$ (onde as linhas viram colunas: transposta[c][l] = original[l][c]).
🔑 Gabarito de Código Completo
Prática 1:
Prática 2:
Desafio:
📝 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.
- No padrão de Somatório por Linha apresentado nos Fundamentos, por que o acumulador
somaLinhadeve ser zerado a cada nova linha, antes de iniciar o laço internoc? - O que caracteriza os elementos da Diagonal Principal de uma matriz, e com quantos laços
paraé possível percorrê-la? - No Cenário Prático, qual é a tarifa de frete entre uma cidade e ela mesma na Matriz de Custos de Frete, e em que posições da matriz essa tarifa se localiza?
- No Exemplo Guiado, qual é a tarifa (em R$) para transportar de São Paulo (código 0) para Curitiba (código 3), segundo a matriz
rotas? - Na Prática Obrigatória 1 (Somatório de Faturamento por Trimestre), como deve ser invertida a ordem dos laços para calcular o total por coluna (trimestre) em vez do total por linha (filial)?
- Na Prática Obrigatória 2 (Verificador de Rota Local), o que o programa deve verificar sobre a Diagonal Principal da matriz de rotas, e o que deve fazer se encontrar uma inconsistência?
- Segundo o Checkpoint de Lógica & Engenharia de Software, a que conceito da Teoria dos Grafos as matrizes bidimensionais são associadas, e qual algoritmo famoso é citado como exemplo de uso?
- No Exemplo Guiado, o que o programa faz quando o código de origem ou de destino digitado pelo operador está fora do intervalo de 0 a 3?
- Segundo os Fundamentos, qual é a complexidade de uma consulta direta a uma rota específica, como
rotas[origem][destino]? - Dê um exemplo do dia a dia em que uma tabela de custos ou distâncias entre pontos (como a matriz de rotas da FastLog) poderia ser útil fora do contexto de programação.