Escolar Documentos
Profissional Documentos
Cultura Documentos
matriz(Operações básicas)
Apresentação
A programação de computadores é uma tarefa de extrema importância na atualidade. Ao olhar para
todos os lados poderemos ver exemplos de computadores, Smartphones e outros dispositivos os
quais operam utilizando algum tipo de software. E é justamente por programas de computadores
serem tão comuns e tão importantes, que a programação precisa evoluir e estar preparada para
suportar a cada dia mais informações e dos mais variados tipos. Uma forma muito comum de
armazenar informações em programas de computadores é fazendo uso de variáveis. Contudo, uma
variável é um espaço na memória do computador que pode armazenar apenas um valor, sendo que,
quando outro valor é inserido o anterior é perdido. Além destas variáveis faz-se uso de estruturas
de dados. Estas estruturas permitem armazenar diversos valores ao mesmo tempo, na memória do
computador. Dentre as estruturas de dados mais populares encontram-se as matrizes. Estas
matrizes são também chamadas de Estrutura de Dados Homogêneas bidimensionais, porque
trabalham considerando sempre linha e coluna (assemelhando-se a uma tabela).
Nesta Unidade de Aprendizagem, você irá aprender como criar, manipular e resolver problemas
fazendo uso de matrizes.
Bons estudos.
algoritmos
e programação
com exemplos em Pascal e C
nina edelweiss
maria aparecida castro livi
as autoras
Nina Edelweiss é engenheira eletricista e doutora em Ciência da Computação pela Uni-
versidade Federal do Rio Grande do Sul. Durante muitos anos, lecionou em cursos de Enge-
nharia e de Ciência da Computação na UFRGS, na UFSC e na PUCRS. Foi, ainda, orientadora
do Programa de Pós-Graduação em Ciência da Computação da UFRGS. É coautora de três
livros, tendo publicado diversos artigos em periódicos e em anais de congressos nacionais
e internacionais. Participou de diversos projetos de pesquisa financiados por agências de
fomento como CNPq e FAPERGS, desenvolvendo pesquisas nas áreas de bancos de dados e
desenvolvimento de software.
Maria Aparecida Castro Livi é licenciada e bacharel em Letras, e mestre em Ciência da
Computação pela Universidade Federal do Rio Grande do Sul. Desenvolveu sua carreira pro-
fissional na UFRGS, onde foi programadora e analista de sistema, antes de ingressar na
carreira docente. Ministrou por vários anos a disciplina de Algoritmos e Programação para
alunos dos cursos de Engenharia da Computação e Ciência da Computação. Sua área de
interesse prioritário é o ensino de Linguagens de Programação, tanto de forma presencial
quanto a distância.
CDU 004.421
2
notas_turma
1
1 2 3 4 5 6
a
rm 1
tu
aluno nota 2
6 7,5
Observa-se, nesse exemplo, que para acessar uma determinada nota é necessário, além do
nome da matriz, três informações adicionais que permitam identificar o elemento em cada
uma das dimensões, ou seja, um índice para cada uma das três dimensões. Por exemplo, o
elemento assinalado na Figura 7.3 requer, para sua identificação, os índices 1, 6 e 4.
Outro problema exige que se armazene, ao longo de 12 meses, a quantidade de itens de um
total de 30 produtos que estão dispostos em 10 lojas, cada qual com 5 setores. A matriz para
resolver esse problema possuirá quatro dimensões e armazenará a quantidade de itens de
cada produto vendido em cada mês, por setor e por loja.
A declaração dessa matriz de quatro dimensões é a seguinte:
numitens (arranjo [1..10, 1..5, 1..30, 1..12] de inteiro)
As quatro dimensões são, nesta ordem: a loja, o setor, o produto e, finalmente, o mês.
Matrizes multidimensionais podem ter duas ou mais dimensões, embora a grande maioria
dos problemas não envolva mais do que três ou quatro. O número de dimensões de uma ma-
triz deverá ser definido em função das necessidades do problema que está sendo analisado e
das limitações eventuais da linguagem em uso. Isso porque, embora teoricamente não exista
limitação para o número de dimensões de uma matriz, uma implementação particular de
uma linguagem pode definir um limite para esse número.
202 Algoritmos e Programação com Exemplos em Pascal e C
então início
cont ← cont + 1
condens[cont,1] ← esparsa[i,j] {VALOR NÃO NULO}
condens[cont,2] ← i {LINHA DO VALOR NÃO NULO}
condens[cont,3] ← j {COLUNA DO VALOR NÃO NULO}
fim
{IMPRESSÃO DA MATRIZ CONDENSADA, CASO EXISTA}
se cont < 1
então escrever('Matriz não possui elemento não nulo')
senão para i de 1 incr 1 até cont faça
escrever(condens[i,1],condens[i,2],condens[i,3])
fim
exercício 7.2 Processar a população da capital e dos 10 outros municípios mais populo-
sos dos 26 estados brasileiros, armazenando esses dados em uma matriz bidimensional.
Determinar:
■ a média da população das capitais;
■ o município mais populoso (excetuando capitais) e em que estado se encontra;
■ os municípios que têm população maior que a média da população das capitais.
Passos básicos para solução:
1. leitura dos dados de população das capitais e municípios mais populosos;
2. cálculo e apresentação da média da população das capitais;
3. determinação e apresentação do município mais populoso e em que estado se encontra;
4. determinação e apresentação dos municípios que têm população maior que a média da
população das capitais.
Observar que nesse problema, assim como em vários outros, a ordem de um ou mais passos
pode ser alterada sem afetar a correção dos resultados. Por exemplo, o passo 3, poderia ser
realizado como passo 2, ou 4. Igualmente, o passo 4 poderia ser realizado como passo 3. No
entanto, o passo 1 deverá preceder todos os demais passos, e o passo 4 só poderá ser reali-
zado após o passo 2. Então, ao projetar uma solução para um problema, é importante verifi-
car se ela respeita as dependências existentes entre as várias atividades a serem realizadas, de
forma a atingir com correção os resultados desejados.
Algoritmo ProcPopulEst
{PROCESSA DADOS DE POPULAÇÃO DAS CAPITAIS E MUNICÍPIOS MAIS POPULOSOS
DOS 26 ESTADOS BRASILEIROS}
Constantes:
MAX_EST = 26
MAX_MUNIC = 11
Entradas: tabpop (arranjo [1.. MAX_EST, 1.. MAX_MUNIC] de inteiro)
Saídas: mediapopcap (real)
estadomaior, municipiomaior (inteiro)
204 Algoritmos e Programação com Exemplos em Pascal e C
Variáveis auxiliares:
i, j (inteiro) {ÍNDICES}
somapopcap (inteiro) {SOMATÓRIO POPULAÇÃO CAPITAIS}
primeiravez (inteiro) {CONTROLA APRESENTAÇÃO DE CABEÇALHO}
maior (inteiro) {AUXILIA DETERMINAÇÃO MUNICÍPIO MAIS POPULOSO}
início
{LEITURA DOS DADOS DE POPULAÇÃO}
para i de 1 incr 1 até MAX_EST faça
início
escrever('Estado', i)
para j de 1 incr 1 até MAX_MUNIC faça
se j = 1 {DADOS DE CAPITAIS NA COLUNA 1}
então repita
início
escrever('População da capital')
ler (tabpop[i,j])
fim
até tabpop[i,j] > 0
senão repita
início
escrever('População do município', j)
ler (tabpop[i,j])
fim
até tabpop[i,j] > 0
fim
{CÁLCULO DA MÉDIA DA POPULAÇÃO DAS CAPITAIS}
somapopcap ← 0
para i de 1 incr 1 até MAX_EST faça
somapopcap ← somapopcap + tabpop[i, 1]
mediapopcap ← somapopcap / MAX_EST
escrever ('Média de população das capitais: ', mediapopcap)
{DETERMINAÇÃO DO MUNICÍPIO MAIS POPULOSO E EM QUE ESTADO
SE ENCONTRA}
maior ← tabpop[1,2] {COLUNA 2 EM DIANTE: MUNICÍPIOS NÃO CAPITAIS}
estadomaior ← 1
municipiomaior ← 2
para i de 1 incr 1 até MAX_EST faça
para j de 2 incr 1 até MAX_MUNIC faça
se tabpop[i, j] > maior
então início
maior ← tabpop[i, j]
estadomaior ← i
municipiomaior ← j
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 205
fim
escrever ('O município mais populoso é o ' , municipiomaior – 1,
'do estado , estadomaior , 'com ', maior, 'habitantes');
{DETERMINAÇÃO E APRESENTAÇÃO DOS MUNICÍPIOS QUE TÊM POPULAÇÃO
MAIOR QUE A MÉDIA DA POPULAÇÃO DAS CAPITAIS}
primeiravez ← 1
para i de 1 incr 1 até MAX_EST faça
para j de 2 incr 1 até MAX_MUNIC faça
se tabpop[i, j] > mediapopcap
então início
se primeiravez = 1 {CABEÇALHO SÓ QUANDO FOR ESCREVER}
então início
escrever ('Municípios com população > do que ',
'população média das capitais')
primeiravez ← 0
fim
escrever('Município : ', j – 1, ' do Estado: ',
i, 'População: ', tabpop[i,j])
fim
se primeiravez = 1
então início
escrever ('Nenhum dos municípios mais populosos tem ',
'população superior à media da população das capitais. ')
fim
fim
exercício 7.3 Fazer um programa para registrar os acidentes de trânsito que acontecem na
ilha de Manhattan, na cidade de Nova York, e emitir um relatório com as 8 intersecções mais
perigosas. As ruas e avenidas da região devem ser representadas por uma matriz. As linhas na
matriz correspondem às avenidas, da Primeira à Décima (1 a 10, e as colunas correspondem
às ruas, da 30 à 58 (30 a 58). Em cada posição da matriz, deve ser registrado o número de
acidentes ocorridos, no período em processamento, nas proximidades do cruzamento corres-
pondente.
Considerar que um número desconhecido de dados de acidentes será lido. Definir uma marca
de parada para sinalizar o final da entrada de dados. O número de acidentes de um cruza-
mento deverá ser fornecido seguido de um par de números que descrevem sua localização.
Por exemplo, os valores 7, 5 e 54 significam 7 acidentes ocorridos nas vizinhanças da Quinta
Avenida com a Rua 54. Os valores lidos devem ser verificados quanto à sua correção e apenas
valores válidos devem ser aceitos.
estratégia de solução adotada: classificar os dados da matriz de acidentes e, depois, apre-
sentar os dados das intersecções desejadas. Para classificar os dados da matriz de acidentes,
gerar, a partir dessa matriz, a sua correspondente matriz condensada (Exercício de Fixação
206 Algoritmos e Programação com Exemplos em Pascal e C
7.1) que contenha apenas as intersecções com pelo menos um acidente. A classificação dos
dados acontecerá na matriz condensada. Essa solução exige um processamento elaborado
(geração da matriz condensada e classificação), mas é extremamente interessante, já que
pode atender inclusive outras solicitações, como, por exemplo, apresentação das intersecções
com menor número de acidentes, etc.).
Algoritmo AcidentesNovaYork
{PROCESSA ACIDENTES OCORRIDOS NA ILHA DE MANHATTAN}
Constantes:
MAXAVENIDAS = 10
MINRUAS = 30
MAXRUAS = 58
INTERSECPERIGO = 8
IND_AJUST = 29 {VALOR DE AJUSTE DO ÍNDICE DE RUAS}
Tipos:
mat = arranjo [1..MAXAVENIDAS, 1..((MAXRUAS – MINRUAS)+1)]
de inteiro
mat_condens = arranjo[1..MAXAVENIDAS *((MAXRUAS – MINRUAS) + 1),
1..3] de inteiro
Entradas: matriz (mat)
Saída: dados das intersecções mais perigosas ou mensagem
Variáveis auxiliares:
avenida, rua (inteiro)
{ÍNDICES}
linha, m, k (inteiro) {VARIÁVEIS GERAÇÃO DA MATRIZ CONDENSADA}
cont_com_acidentes (inteiro) {CONTADOR CRUZAMENTO COM ACIDENTES}
trocou (lógica)
aux1, aux2, aux3 (inteiro) {AUXILIARES DE CLASSIFICAÇÃO}
matriz_condensada (mat_condens)
início
{INICIALIZAÇÃO DA MATRIZ COM ZEROS}
para avenida de 1 incr 1 até MAXAVENIDAS faça
para rua de 1 incr 1 até MAXRUAS faça
matriz[avenida, rua] = 0
{PREENCHIMENTO DA MATRIZ COM OS ACIDENTES}
repita
início
escrever('Avenida de 1 a ', MAXAVENIDAS, 'ou -1 para parar: ')
ler (avenida)
se (avenida ≤ 0 ou avenida > MAXAVENIDAS) e avenida ≠ -1
então escrever('Avenida inválida')
fim
até (avenida > 0 e avenida ≤ MAXAVENIDAS) ou (avenida = −1)
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 207
7.5 em Pascal
Um tipo de dado matriz (arranjo de mais de uma dimensão) é declarado em Pascal de forma
semelhante ao tipo vetor, incluindo os limites para cada uma das dimensões:
array [<limite inferior>..<limite superior>,
<limite inferior>..<limite superior>, ...] of <tipo>
Os limites superior e inferior, índices do primeiro e do último elemento de cada dimensão,
devem ser do tipo inteiro, caractere ou enumeração (tipo que será visto no Capítulo 8).
Não existem restrições quanto aos valores que podem ser utilizados como índices. O tipo de-
clarado no final é o tipo de todos os elementos da matriz.
Exemplo de declarações de matrizes:
var
nota: array [1..7, 1..6] of real;
contagem_letras: array ['a'..'j', 1..20] of integer;
Em algumas situações, duas variáveis que tenham sido declaradas de forma independente,
com tipos não definidos explicitamente e aparentemente iguais, podem não ser reconhecidas
como variáveis de mesmo tipo pelo sistema. Por essa razão, recomenda-se que a declara-
ção de uma matriz em Pascal seja feita sempre como está a seguir, definindo primeiro a(s)
constante(s) usada(s) na declaração da matriz, em seguida o tipo definido para a matriz e,
finalmente, a variável do tipo matriz:
210 Algoritmos e Programação com Exemplos em Pascal e C
const
MAX1 = 6;
MAX2 = 8;
type
matriz = array [1..MAX1, 1..MAX2] of integer;
var
mat: matriz;
O acesso aos elementos de uma matriz em Pascal é feito definindo-se um índice para cada
uma das dimensões. Esse índice pode ser dado por um valor constante, pelo conteúdo de
uma variável ou pelo resultado de uma expressão, devendo ser do mesmo tipo definido para
cada um dos índices, na ordem em que foram definidos. Os comandos a seguir acessam ele-
mentos das matrizes definidas na seção anterior:
{PREENCHER POR LEITURA O ELEMENTO DA LINHA 3, COLUNA 5 DA MATRIZ nota:}
readln(nota [3, 5]);
{SUPONDO A VARIAVEL INTEIRA i = 2, INFORMAR VALOR CONTIDO NA LINHA 1,
COLUNA 4 DA MATRIZ contagem_letras}
writeln(contagem_letras['a', i+2]);
{COPIAR VALOR DA LINHA 2, COLUNA 1 PARA LINHA 1, COLUNA 2 DE mat}
mat[1,2] := mat[2,1];
O trecho a seguir imprime a matriz mat, linha por linha, separando seus valores adequada-
mente. São utilizadas as variáveis inteiras lin e col para percorrer respectivamente as linhas
e as colunas da matriz:
for lin := 1 to MAX1 do {PARA CADA LINHA DA MATRIZ}
begin
writeln; {INICIA NOVA LINHA PARA CADA LINHA DA MATRIZ}
for col := 1 to MAX2 do {PARA CADA COLUNA DESTA LINHA}
write(mat[lin, col]:5, ' ') {ESCREVE UM ELEMENTO}
end;
const
<nome da constante> : <tipo da constante> =
a a a
((valor1 da 1 linha, valor2 da 1 linha , ... , valorn da 1 linha),
a a a
(valor1 da 2 linha, valor2 da 2 linha , ... , valorn da 2 linha),
a
(valor1 da 3 linha, ...), (...));
O número de valores informados não pode ser nem menor nem maior que o número de
valores previstos para cada linha da matriz, caso contrário o código não será compilado sem
erros.
Exemplo de inicialização de uma matriz por meio de sua declaração como constante tipada:
const
MAXMERC = 5;
MAXMES = 12;
type
mt = array [1..MAXMERC , 1..MAXMES] of integer;
const
matriz : mt = ((0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1),
(50, 51, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5),
(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5),
(100, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10),
(0, 0, 0, 0, 10, 5, 10, 5, 5, 5, 5, 5));
Em Pascal é possível fazer uma atribuição em bloco de um arranjo a outro, desde que tenham
exatamente a mesma estrutura.
Supondo que matriz_original e matriz_copia tenham o mesmo número de dimensões e,
em cada uma das dimensões correspondentes (na ordem em que foram definidas), o mesmo
número de elementos, a atribuição a seguir copia todos os valores de uma para a outra:
matriz_copia := matriz_original;
7.6 em C
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Na prática
Pedro é programador de uma empresa de desenvolvimento de sistemas e, por isso, precisa estar
informado sobre as melhores práticas de desenvolvimento de sistemas.
Em um determinado dia, a empresa em que Pedro atua foi convidada a desenvolver um jogo. Este
jogo seria utilizado por uma escola de ensino fundamental, para realizar práticas pedagógicas com
seus alunos. O jogo solicitado foi o de campo minado. Por este jogo envolver um tabuleiro, onde
existem “bombas” escondidas, Pedro precisou utilizar matrizes.
CAMPOMINADO
Saiba +
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.