Olá, caro aluno! Nesta lição, vamos continuar estudando as estruturas de dados homogêneas, que são estruturas que agrupam diversas informações de um mesmo tipo em uma única variável que aponta para uma cadeia de dados na memória.
Essas estruturas são divididas em duas categorias, a primeira estudamos na lição anterior que são os vetores também conhecidos como estrutura unidimensional. Nesta aula, vamos conhecer a segunda categoria que são as estruturas multidimensionais chamadas de matrizes.
Os conceitos que vamos estudar nesta aula, em um primeiro momento podem parecer um tanto quanto complexos, entretanto serão de extrema importância no seu futuro como desenvolvedor(a), pois matrizes são amplamente utilizados em alguns tipos de aplicações. Se você sonha em trabalhar com desenvolvimento de jogos, é muito importante dar uma atenção especial nesta lição, pois em matrizes são utilizadas em jogos para a construção e programação de cenários e dados dinâmicos. Outra aplicação muito comum de matrizes está presente no processamento de imagens, internamente no computador todas as imagens que visualizamos são tratadas como matrizes de dados.
Na lição anterior, você aprendeu como definir uma variável unidimensional (vetor), que representa uma sequência de valores do mesmo tipo. Agora você conhecerá como definir um arranjo de duas dimensões. Mais especificamente como definir uma variável de dados do mesmo tipo conhecida como matrizes, essa estrutura apresenta os dados em forma de tabelas com “m” linhas e “n” colunas.
Matrizes são estruturas de dados amplamente utilizadas, um exemplo de utilização de matrizes está no processamento de imagens. Internamente no seu computador, celular e smartwatch, as imagens são representadas como matrizes de valores de cores que formam as figuras que você vê na tela. Como você vai ver no case, essa estrutura também pode ser utilizada em algoritmos de caminhos mínimos que são os algoritmos, e eles são utilizados em aplicativos de mapas.
As matrizes estão presentes em muitos tipos de algoritmos que utilizamos diariamente e, muitas vezes, nem imaginamos como. Um exemplo de aplicação de matrizes pode ser observado em aplicativos de mapas. Quando um app define qual é a melhor rota para sair de um ponto A até um ponto B, ele utiliza-se de matrizes para realizar os cálculos.
No app, visualizamos apenas o mapa com a rota definida. Porém internamente esse mapa é representado por valores armazenados em uma matriz, em que é realizado os cálculos para definir qual caminho tem o menor custo, ou seja, qual é o caminho mais rápido para chegar até o destino.
Cada par de valores de uma matriz pode representar o custo de passar por aquele ponto, assim o algoritmo realiza a soma dos custos, escolhe o de menor valor e apresenta no mapa de forma gráfica para o usuário.
Conforme define Manzano e Oliveira (1997), uma matriz é o conjunto de dados do mesmo tipo alocados sequencialmente na memória representados em algoritmos por tabelas com “m” linhas e “n” colunas. Cada elemento de uma matriz deve armazenar apenas um único valor. A Figura 1 apresenta uma matriz de 3 linhas e 4 colunas.
Figura 1 - Matriz 3x4 / Fonte: o Autor (2022).
#PraCegoVer: a figura apresenta uma matriz com 12 posições amarelas. Na parte superior da matriz estão os valores 1, 2, 3, 4 representando o número das colunas. Na lateral esquerda, valores 1, 2 ,3 representando o número das linhas.
Uma matriz é como vários vetores um abaixo do outro. Vamos conhecer como é a sintaxe de declaração de uma matriz:
SINTAXE:
<nome> [<num. linhas>, <num. colunas>] : <tipo>
Em que:
<nome> representa o nome da matriz, este número será utilizado para referenciá-la.
<num. linhas> número de linhas da matriz.
<num. colunas> número de colunas da matriz.
<tipo> tipo dos dados.
Cada uma das posições da matriz é identificada por um par de números, sendo o número da linha e a coluna da posição. Por exemplo, vamos declarar uma matriz de 4 linhas e 3 colunas de inteiros.
matriz[1..4 , 1..3 ] : inteiro
A declaração anterior corresponde a uma matriz de 12 posições de números inteiros, o número de posições é dado pela multiplicação do número de linhas pelo número de colunas, neste caso, 4 linhas x 3 colunas = 12. A Figura 2 apresenta a matriz que acabamos de declarar, note que dentro de cada posição, temos um par de valores entre colchetes [] esses valores representam os índices da posição, isso é, o “endereço” daquela posição.
Figura 2 - Matriz com índices / Fonte: o Autor (2022).
#PraCegoVer: a figura apresenta uma matriz com 12 posições amarelas. Na parte superior da matriz estão os valores 1, 2, 3, 4 representando o número das colunas. Na lateral esquerda, valores 1, 2 ,3 representando o número das linhas. Na primeira linha e primeira coluna, há o índice [1,1], primeira linha segunda coluna [1,2], primeira linha terceira coluna [1,3], primeira linha quarta coluna [1,4]. Na segunda linha e primeira coluna o índice [2,1], segunda linha segunda coluna [2,2], segunda linha terceira coluna [2,3], quarta linha quarta coluna [2,4]. Na terceira linha e primeira coluna o índice [3,1], terceira linha segunda coluna [3,2], terceira linha terceira coluna [3,3], terceira linha quarta coluna [1,4].
Para realizar a gravação ou leitura de um dado em uma matriz é necessário informar o nome da matriz seguido do índice da posição na qual a operação será realizada, por exemplo, para gravar o valor 5 na primeira posição da matriz utilizamos a seguinte sintaxe.
matriz[1 , 1] <- 5
Nesta linha, estamos declarando que queremos armazenar o valor 5 na posição com o índice [1, 1], ou seja, na célula da linha 1 na primeira coluna, como mostra a Figura 3.
Figura 3 - Atribuição de valor / Fonte: o Autor (2022).
#PraCegoVer: a figura apresenta uma matriz com 12 posições amarelas. Na parte superior da matriz estão os valores 1, 2, 3, 4 representando o número das colunas. Na lateral esquerda, valores 1, 2 ,3 representando o número das linhas. Na primeira linha e primeira coluna, há o índice [1,1] com o valor 5, primeira linha segunda coluna [1,2], primeira linha terceira coluna [1,3], primeira linha quarta coluna [1,4]. Na segunda linha e primeira coluna, o índice [2,1], segunda linha segunda coluna [2,2], segunda linha terceira coluna [2,3], quarta linha quarta coluna [2,4]. A terceira linha primeira coluna o índice [3,1], terceira linha segunda coluna [3,2], terceira linha terceira coluna [3,3], terceira linha quarta coluna [1,4].
Para realizar a leitura, utilizamos a mesma ideia, por exemplo, se queremos escrever na tela o valor que acabamos de gravar, basta fazer:
ESCREVA(matriz[1, 1])
Neste exemplo, estamos indicando para o algoritmo que ele deve escrever na tela e o valor que está armazenado na célula da primeira linha na primeira coluna.
Para percorrer todas as posições de uma matriz de forma automatizada é necessário utilizar dois laços de repetição aninhados, pois o primeiro laço será responsável por percorrer as linhas e o segundo laço (mais interno) será responsável por percorrer todas as colunas. Vejamos um exemplo.
Considere que queremos escrever na tela todos os nomes que estão armazenados na matriz representada na Figura 4. Cada posição da matriz contém um nome e queremos escrever um algoritmo que percorre cada posição e escreve na tela o nome que está armazenado na posição em questão. Veja a Figura 4, ela apresenta uma matriz [3, 2], sendo assim 6 posições.
Figura 4 - Matriz Nomes / Fonte: o Autor (2022).
#PraCegoVer: a figura apresenta uma matriz com 6 posições amarelas. Na parte superior da matriz estão os valores 1 e 2 representando o número das colunas. Na lateral esquerda, valores 1, 2 ,3 representando o número das linhas. Na primeira linha e primeira coluna, há o índice [1,1] com o valor Luiz, primeira linha segunda coluna [1,2] o valor Guilherme. A segunda linha primeira coluna o índice [2,1] o valor Lucas, segunda linha segunda coluna [2,2] o valor Matheus. A terceira linha primeira coluna o índice [3,1] o valor Paula, terceira linha segunda coluna [3,2] o valor Beatriz.
O algoritmo pode ver escrito da seguinte forma:
VARIÁVEIS
nomes[1..3 ,1..2] : caractere
INÍCIO
nomes[1,1] <- “Luiz”
nomes[1,2] <- “Guilherme”
nomes[2,1] <- “Lucas”
nomes[2,2] <- “Matheus”
nomes[3,1] <- “Paula”
nomes[3,2] <- “Beatriz”
PARA inteiro i DE 1 ATÉ 3 PASSO 1 FAÇA
PARA inteiro j DE 1 ATÉ 2 PASSO 1 FAÇA
ESCREVA(nomes[i , j])
FIM_PARA
FIM_PARA
FIM
Vamos analisar linha a linha:
Linha 1: abertura do bloco de variáveis.
Linha 2: declaração da matriz com 6 posições do tipo caractere.
Linha 3: início do algoritmo.
Linhas 4 a 9: atribuição dos nomes nas posições da matriz. Isto é, em cada posição está armazenado um nome.
Linha 10: início do primeiro laço de repetição PARA. Este laço de repetição será responsável por percorrer todas as linhas da matriz.
Linha 11: início do segundo laço de repetição PARA. Este laço será responsável por percorrer todas as colunas de cada linha.
Linha 12: comando ESCREVA para imprimir os nomes da tela. Dentro dos parênteses, indicamos a posição que queremos ler pelos índices i e j, onde i representa a linha e j a coluna. Na primeira iteração do laço, a variável contadora i = 1, e a variável contador j do segundo laço será j= 1. Sendo assim o comando ESCREVA estará imprimindo o valor contido na posição [1, 1], na segunda iteração j =2 deste modo será impresso a posição [1,2] e assim por diante até percorrer toda a matriz.
Linha 13: Fim do laço para.
Linha 14: Fim do laço para.
Linha 15: Fim do algoritmo.
É importante você saber que assim como os vetores, as matrizes devem ter um tamanho fixo, que é indicado na declaração. Este tamanho não pode ser alterado no decorrer do algoritmo ou durante a execução.
Agora que você já sabe o que é e como utilizar matrizes, que tal colocar em prática? Vimos no exemplo da lição como fazer um algoritmo que lê e escreve na tela os valores que estão armazenados em um vetor. Que tal você tentar escrever um algoritmo que realiza a gravação de 6 nomes em uma matriz?
Objetivo do algoritmo: solicitar ao usuário que digite 6 nomes e armazenar os nomes em uma matriz 3x2.
Entrada: ler 6 nomes.
Processamento: ler os nomes digitados pelo usuário e gravar em cada posição da matriz.
Saída: escrever na tela os nomes digitados pelo usuário.
VARIÁVEIS
nomes[1..3 ,1..2] : caractere
INÍCIO
PARA inteiro i DE 1 ATÉ 3 PASSO 1 FAÇA
PARA inteiro j DE 1 ATÉ 2 PASSO 1 FAÇA
ESCREVA(“Digite um nome”)
LEIA(nome[i, j])
FIM_PARA
FIM_PARA
PARA inteiro i DE 1 ATÉ 3 PASSO 1 FAÇA
PARA inteiro j DE 1 ATÉ 2 PASSO 1 FAÇA
ESCREVA(nomes[i , j])
FIM_PARA
FIM_PARA
FIM
Por enquanto esses conceitos estudados podem parecer um pouco “sem utilidades”, porém quando você começar a trabalhar em grandes projetos irá se deparar com a necessidade de utilizar esse tipo de estrutura para representar diferentes tipos de dados.
MANZANO, J.; OLIVEIRA, F. Estudos dirigidos de algoritmos. São Paulo: Érica, 1997.