Matrizes (Arrays Bidimensionais)
Domine a criação e manipulação de tabelas estruturadas em linhas e colunas no Portugol Studio.
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).
| 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] |
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
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]) } } } }
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 } } }
Exercícios Práticos Resolvidos
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") } } }
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") } } }
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.") } } }
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") } } }
Dicas Úteis & Erros Comuns
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.
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.
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.
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.