Professor Muniz Educação & Programação

Trilha: Portugol Studio

Voltar aos conteúdos
Apostila de Apoio Didático

Matrizes (Arrays Bidimensionais)

Domine a criação e manipulação de tabelas estruturadas em linhas e colunas no Portugol Studio.

MÓDULO 1

Introdução a Matrizes

Uma matriz (ou array bidimensional) é uma estrutura de dados homogênea e estática que armazena diversos valores do mesmo tipo sob um único nome, diferenciando-se dos vetores por possuir múltiplas dimensões (estruturadas em linhas e colunas).

Analogia Prática: Pense em uma matriz como uma planilha do Excel. Cada célula é identificada por uma linha e uma coluna específicas. Essa estrutura é fundamental na computação para representar mapas de assentos em cinemas, diagramas de aeronaves, tabuleiros de jogos e muito mais.
Representação Visual de uma Matriz 3x3 (Índices começam em 0):
Linha \ Coluna Coluna 0 Coluna 1 Coluna 2
Linha 0 Matriz[0][0] Matriz[0][1] Matriz[0][2]
Linha 1 Matriz[1][0] Matriz[1][1] Matriz[1][2]
Linha 2 Matriz[2][0] Matriz[2][1] Matriz[2][2]
MÓDULO 2

Declaração no Portugol Studio

Matrizes precisam ser declaradas antes do seu uso, definindo o tipo de dado, o nome da matriz e a quantidade de linhas e colunas dentro de colchetes separados.

Sintaxe Geral:

tipo_dado nome_matriz[quantidade_linhas][quantidade_colunas]

Exemplos de Declaração:

inteiro idades[10][2]     // Matriz de inteiros com 10 linhas e 2 colunas
real mediaFinal[3][5]     // Matriz de números reais com 3 linhas e 5 colunas
cadeia nomes[5][5]        // Matriz de texto com 5 linhas e 5 colunas
MÓDULO 3

Preenchimento de Matrizes

O preenchimento pode ser feito manualmente (posição por posição) ou de forma automatizada usando estruturas de repetição aninhadas.

Método 1: Preenchimento Manual

inteiro matriz[3][2]

matriz[0][1] = 10   // Linha 0, Coluna 1 recebe o valor 10
matriz[2][0] = 6    // Linha 2, Coluna 0 recebe o valor 6
matriz[2][1] = 8    // Linha 2, Coluna 1 recebe o valor 8

Método 2: Preenchimento Automatizado (Recomendado)

Para automatizar o processo, usamos duas estruturas de repetição para aninhadas: uma para controlar a linha e outra para a coluna.

programa {
    funcao inicio() {
        inteiro matriz[3][2]

        // O laço externo controla a linha; o interno as colunas
        para (inteiro linha = 0; linha < 3; linha++) {
            para (inteiro col = 0; col < 2; col++) {
                escreva("Digite o valor para [", linha, "][", col, "]: ")
                leia(matriz[linha][col])
            }
        }
    }
}
Regra de Execução Importante: O laço interno (colunas) roda por completo antes que o laço externo (linhas) mude de valor. Ou seja, o programa preenche toda a primeira linha, coluna por coluna, antes de avançar para a linha seguinte.
MÓDULO 4

Leitura e Exibição de Dados

Para exibir uma matriz de forma legível (com formatação de tabela), nós também usamos loops aninhados e inserimos uma quebra de linha após concluir cada linha de colunas.

programa {
    funcao inicio() {
        inteiro idades[3][2] = { {19, 23}, {45, 18}, {76, 87} }

        escreva("--- Exibindo Matriz ---\n")
        para (inteiro l = 0; l < 3; l++) {
            para (inteiro c = 0; c < 2; c++) {
                escreva(idades[l][c], " ")
            }
            escreva("\n") // Quebra de linha ao fim de cada linha da matriz
        }
    }
}
MÓDULO 5

Exercícios Práticos Resolvidos

Desafio 59

Matriz sem Diagonal Principal (3x3)

Enunciado: Leia uma matriz 3x3 e exiba todos os elementos, exceto os da diagonal principal (onde linha == coluna).

programa {
    funcao inicio() {
        inteiro mat[3][3]

        // Entrada de Dados
        para (inteiro l = 0; l < 3; l++) {
            para (inteiro c = 0; c < 3; c++) {
                escreva("Digite [", l, "][", c, "]: ")
                leia(mat[l][c])
            }
        }

        // Saída filtrando a diagonal principal (l != c)
        escreva("\nMatriz resultante (Diagonal Principal ocultada):\n")
        para (inteiro l = 0; l < 3; l++) {
            para (inteiro c = 0; c < 3; c++) {
                se (l != c) {
                    escreva(mat[l][c], "\t")
                } senao {
                    escreva("- ", "\t")
                }
            }
            escreva("\n")
        }
    }
}
Desafio 60

Elementos Acima da Diagonal Principal (5x5)

Enunciado: Leia uma matriz 5x5 e exiba apenas as posições acima da diagonal principal (onde coluna > linha).

programa {
    funcao inicio() {
        inteiro m[5][5]

        // Preenchimento
        para (inteiro l = 0; l < 5; l++) {
            para (inteiro c = 0; c < 5; c++) {
                escreva("Digite o elemento [", l, "][", c, "]: ")
                leia(m[l][c])
            }
        }

        // Exibição filtrada (c > l)
        escreva("\nElementos acima da Diagonal Principal:\n")
        para (inteiro l = 0; l < 5; l++) {
            para (inteiro c = 0; c < 5; c++) {
                se (c > l) {
                    escreva(m[l][c], "\t")
                } senao {
                    escreva(" ", "\t")
                }
            }
            escreva("\n")
        }
    }
}
Desafio 61

Validador de Quadrado Mágico (3x3)

Enunciado: Verifique se as somas de todas as colunas, linhas e diagonais são iguais de forma lógica.

programa {
    funcao inicio() {
        inteiro matriz[3][3]
        inteiro somaLinhas[3] = {0, 0, 0}
        inteiro somaColunas[3] = {0, 0, 0}
        inteiro somaDiagPrincipal = 0
        inteiro somaDiagSecundaria = 0
        logico ehMagico = verdadeiro

        // Entrada dos elementos
        para (inteiro l = 0; l < 3; l++) {
            para (inteiro c = 0; c < 3; c++) {
                escreva("Valor de [", l, "][", c, "]: ")
                leia(matriz[l][c])
            }
        }

        // Processamento das Somas
        para (inteiro l = 0; l < 3; l++) {
            para (inteiro c = 0; c < 3; c++) {
                somaLinhas[l] += matriz[l][c]
                somaColunas[c] += matriz[l][c]

                se (l == c) {
                    somaDiagPrincipal += matriz[l][c]
                }
                se (l + c == 2) {
                    somaDiagSecundaria += matriz[l][c]
                }
            }
        }

        inteiro ref = somaDiagPrincipal

        // Validação das somas
        se (somaDiagSecundaria != ref) {
            ehMagico = falso
        }

        para (inteiro i = 0; i < 3; i++) {
            se (somaLinhas[i] != ref ou somaColunas[i] != ref) {
                ehMagico = falso
            }
        }

        // Resultado final
        se (ehMagico) {
            escreva("\nA matriz É um Quadrado Mágico! Soma Constante = ", ref)
        } senao {
            escreva("\nA matriz NÃO é um Quadrado Mágico.")
        }
    }
}
Desafio 62

Distanciamento Social COVID-19 (N x N)

Enunciado: Modele uma sala de aula de tamanho N x N. Distribua carteiras de modo a ter espaçamento seguro. Regras: Ao usar uma fileira, a próxima é totalmente bloqueada. Na mesma fileira, carteiras adjacentes não podem ser utilizadas simultaneamente.

programa {
    // Definição do tamanho da sala por constante
    const inteiro N = 6 

    funcao inicio() {
        cadeia sala[N][N]

        // Aplicação de regras de distanciamento
        para (inteiro l = 0; l < N; l++) {
            para (inteiro c = 0; c < N; c++) {
                // Linhas pares podem ser usadas. Ímpares são bloqueadas por completo
                se (l % 2 == 0) {
                    // Colunas alternadas na mesma fileira para evitar contato lateral
                    se (c % 2 == 0) {
                        sala[l][c] = "L" // Liberado
                    } senao {
                        sala[l][c] = "X" // Bloqueado
                    }
                } senao0 {
                    sala[l][c] = "X" // Linha inteira bloqueada
                }
            }
        }

        // Exibição do Layout da Sala de Aula
        escreva("=== PLANTA DE DISPOSIÇÃO DA SALA DE AULA (", N, "x", N, ") ===\n")
        escreva("Legenda: [L] = Liberada  [X] = Bloqueada por segurança\n\n")

        para (inteiro l = 0; l < N; l++) {
            para (inteiro c = 0; c < N; c++) {
                escreva("[", sala[l][c], "] ")
            }
            escreva("\n")
        }
    }
}
MÓDULO 6

Dicas Úteis & Erros Comuns

Erro Comum: Índice Fora de Alcance (Out of Bounds)

Se você declarar uma matriz como inteiro m[3][2], as posições válidas de linha são 0, 1 e 2, e as colunas são 0 e 1. Tentar acessar m[3][2] causará um erro imediato de execução (OutOfBounds) no Portugol Studio.

Dica de Ouro: Identificando Coordenadas

O primeiro índice indica sempre a linha (horizontal), enquanto o segundo indica a coluna (vertical). Memorize o formato como M[L][C] (Matriz[Linha][Coluna]) para nunca trocar as variáveis no Portugol Studio!

Materiais Complementares de Apoio

Apostila Prática: Matrizes

Acesse o material de apoio didático estruturado em PDF/PowerPoint, contendo toda a parte teórica e resoluções adicionais.

Baixar Slides
Videoaula: Matrizes no YouTube

Assista à explicação didática do professor com foco na resolução de matrizes, laços encadeados e diagnósticos de erros.

Assistir Vídeo
Repositório de Código Fonte

Explore, acesse e faça o download de todos os códigos-fonte de exemplo e exercícios estruturados nesta trilha.

Abrir Repositório
Voltar aos conteúdos