Buscar

Estrutura de Dados Homogêneas do tipo matriz(Operações básicas)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

s
é
r
ie
 liv
ro
s
 d
id
á
tic
o
s
 in
fo
r
m
á
tic
a
 u
fr
g
s
23
s é r i e l i v r o s d i d á t i c o s i n f o r m á t i c a u f r g s
volume 3 Linguagens Formais e Autômatos, 6.ed., 
de Paulo Blauth Menezes
volume 4 Projeto de Banco de Dados, 6.ed., 
de Carlos Alberto Heuser 
volume 5 Teoria da Computação: Máquinas Universais 
e Computabilidade, 3.ed, de Tiarajú Asmuz Diverio 
e Paulo Blauth Menezes
volume 6 Arquitetura de Computadores Pessoais, 
2.ed., de Raul Fernando Weber
volume 7 Concepção de Circuitos Integrados, 2.ed., 
de Ricardo Augusto da Luz Reis e cols.
volume 8 Fundamentos de Arquitetura de Computadores, 
4.ed., de Raul Fernando Weber
volume 10 Tabelas: Organização e Pesquisa, 
de Clesio Saraiva dos Santos e Paulo Alberto de Azeredo 
volume 11 Sistemas Operacionais, 4.ed., 
de Rômulo Silva de Oliveira, Alexandre da Silva Carissimi 
e Simão Sirineo Toscani 
volume 12 Teoria das Categorias para Ciência 
da Computação, 2.ed., de Paulo Blauth Menezes 
e Edward Hermann Haeusler
volume 13 Complexidade de Algoritmos, 3.ed., 
de Laira Vieira Toscani e Paulo A. S. Veloso 
volume 16 Matemática Discreta para Computação 
e Informática, 4.ed., de Paulo Blauth Menezes
volume 18 Estruturas de Dados, de Nina Edelweiss 
e Renata Galante
volume 19 Aprendendo Matemática Discreta com 
Exercícios, de Paulo Blauth Menezes, Laira Vieira Toscani 
e Javier García López
volume 20 Redes de Computadores, 
de Alexandre da Silva Carissimi, Juergen Rochol 
e Lisandro Zambenedetti Granville
volume 21 Introdução à Abstração de Dados, 
de Daltro José Nunes
volume 22 Comunicação de Dados, de Juergen Rochol
COMPUTAÇÃO
www.grupoa.com.br
A Bookman é um dos selos editoriais do Grupo A Educação, empresa que 
oferece soluções em conteúdo, tecnologia e serviços para a educação 
acadêmica e profissional.
algoritmos
e programação 
com exemplos em Pascal e C
nina edelweiss
maria aparecida castro livi
Material didático para professores
Visite www.grupoa.com.br
nina edelweiss
maria aparecida castro livi
 l i v r o s d i s p o n í v e i s
algoritm
os e program
ação
com
 exem
plos em
 P
ascal e C
23
edelw
eiss
livi
23
algoritmos
e programação 
com exemplos em Pascal e C
Aprender programação não é uma tarefa simples. 
Requer um entendimento perfeito do problema, a análise 
de como solucioná-lo e a escolha da forma de implementação 
da solução. algoritmos e programação apresenta 
o processo de construção de algoritmos e de programas, 
enfatizando as etapas de abstração, organização, análise 
e crítica na busca de soluções eficientes. Os elementos 
de um programa são introduzidos pouco a pouco ao longo 
do texto, inicialmente apresentados em pseudolinguagem e, 
em seguida, exemplificados nas linguagens de programação 
Pascal e C. Este é um livro-texto para disciplinas iniciais 
de programação de duração de um semestre. Pode ser 
utilizado sobretudo em cursos de bacharelado e licenciatura 
em ciência da computação, análise de sistemas e engenharia 
da computação. 
E22a Edelweiss, Nina.
 Algoritmos e programação com exemplos em Pascal e C 
 [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro 
 Livi. – Dados eletrônicos. – Porto Alegre : Bookman, 2014.
 Editado também como livro impresso em 2014.
 ISBN 978-85-8260-190-7
 1. Informática. 2. Algoritmos – Programação. I. Livi, 
 Maria Aparecida Castro. II. Título. 
CDU 004.421
 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.
Catalogação na publicação: Ana Paula M. Magnus – CRB 10/2052
Edelweiss_Iniciais_eletronica.indd iiEdelweiss_Iniciais_eletronica.indd ii 14/05/14 16:5114/05/14 16:51
200 Algoritmos e Programação com Exemplos em Pascal e C
e Somatório dos elementos da diagonal secundária. Observar que, a partir do índice da 
linha, é possível calcular o índice da coluna, o que, mais uma vez, permite resolver o pro-
blema usando apenas uma variável como índice:
 soma ← 0
 para i de 1 incr 1 até MAX faça
 soma ← soma + tabela[i,((MAX – i) + 1)]
 escrever('Somatório elementos da diagonal secundária = ', soma)
f Somatório de todos os elementos à esquerda da diagonal secundária:
 soma ← 0
 para i de 1 incr 1 até MAX faça
 para j de 1 incr 1 até MAX faça
 se j < (MAX – i)
 então soma ← soma + tabela[i,j]
 escrever
 ('Somatório dos elementos à esquerda da diagonal secundária = ', 
 soma)
g Geração de dois vetores, um com o somatório das linhas (som_lin[MAX]) e o outro com 
o das colunas (som_col[MAX]):
 para i de 1 incr 1 até MAX faça {INICIALIZA VETORES EM ZERO}
 início
 som_lin[i] ← 0
 som_col[i] ← 0
 fim
 para i de 1 incr 1 até MAX faça
 para j de 1 incr 1 até MAX faça
 início
 som_lin[i] ← som_lin[i] + tabela[i,j]
 som_col[j] ← som_col[j] + tabela[i,j]
 fim
7.3 matrizes com mais de duas dimensões
Estendendo um pouco mais o exemplo apresentado no início deste capítulo, o que se faria 
para armazenar as notas de todos os alunos de mais de uma turma em uma única matriz? 
Supondo que há 2 turmas, cada turma com 7 alunos, com 6 notas por aluno, a declaração da 
matriz para armazenar os dados correspondentes seria a seguinte:
notas_turma (arranjo [1..2, 1..7, 1..6] de real)
As três dimensões são, na ordem em que foi feita a declaração: as turmas, os alunos e, fi-
nalmente, as notas. A Figura 7.3 mostra a representação espacial da matriz tridimensional 
notas.
Edelweiss_07.indd 200Edelweiss_07.indd 200 12/03/14 09:0212/03/14 09:02
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 201
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úmerode dimensões de uma matriz, uma implementação particular de 
uma linguagem pode definir um limite para esse número.
1 2 3 4 5 6
7,5
1
2
3
4
5
6
7
notas_turma
al
u
n
o
tu
rm
a
nota
notas_turma[1,6,4] é a 4ª nota do 6º aluno da 1ª turma
1
2
figura 7.3 Matriz tridimensional para notas.
Edelweiss_07.indd 201Edelweiss_07.indd 201 12/03/14 09:0212/03/14 09:02
202 Algoritmos e Programação com Exemplos em Pascal e C
7.4 exercícios de fixação
exercício 7.1 Uma matriz esparsa é uma matriz que tem aproximadamente dois terços de 
seus elementos iguais a zero. Escrever um programa que leia uma matriz esparsa M de 10x10 
e que forme uma matriz condensada, de apenas 3 colunas, com os elementos não nulos da 
matriz original, de forma que, em cada linha:
a a primeira coluna contenha um valor não nulo de M;
b a segunda coluna contenha o índice da linha de M onde foi encontrado esse valor;
c a terceira coluna contenha o índice da coluna de M onde foi encontrado esse valor.
Escrever a matriz original e a matriz condensada em formato matricial.
Observar que a matriz condensada é declarada com um número de linhas igual ao número 
de elementos da matriz esparsa, para que não haja risco de faltar espaço de armazenamento 
durante o processamento.
Algoritmo MatrizEsparsa
{GERAÇÃO DE UMA MATRIZ CONDENSADA A PARTIR DE UMA MATRIZ ESPARSA}
 Constante: MAX = 3
 Entradas: esparsa (arranjo [1..MAX, 1..MAX] de inteiro)
 {MATRIZ ESPARSA}
 Saída: condens (arranjo [1..(MAX*MAX), 1..3] de inteiro)
 {MATRIZ CONDENSADA}
 Variáveis auxiliares:
 i, j (inteiro) {ÍNDICES}
 cont (inteiro) {CONTADOR}
início
 {PREENCHIMENTO DA MATRIZ ESPARSA POR LEITURA}
 para i de 1 incr 1 até MAX faça
 para j de 1 incr 1 até MAX faça
 ler (esparsa[i,j])
 {IMPRIME MATRIZ ESPARSA}
 para i de 1 incr 1 até MAX faça
 início
 para j de 1 incr 1 até MAX faça
 escrever (esparsa[i,j])
 {POSICIONAR EM NOVA LINHA}
 fim
 {CRIAÇÃO DA MATRIZ CONDENSADA}
 cont ← 0
 para i de 1 incr 1 até MAX faça
 para j de 1 incr 1 até MAX faça
 se esparsa[i,j] ≠ 0 {SE VALOR NÃO FOR NULO}
Edelweiss_07.indd 202Edelweiss_07.indd 202 12/03/14 09:0212/03/14 09:02
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 203
 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)
Edelweiss_07.indd 203Edelweiss_07.indd 203 12/03/14 09:0212/03/14 09:02
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
Edelweiss_07.indd 204Edelweiss_07.indd 204 12/03/14 09:0212/03/14 09:02
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 fornecidoseguido 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 
Edelweiss_07.indd 205Edelweiss_07.indd 205 12/03/14 09:0212/03/14 09:02
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)
Edelweiss_07.indd 206Edelweiss_07.indd 206 12/03/14 09:0212/03/14 09:02
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 207
 enquanto avenida ≠ −1 faça {MARCA DE PARADA: AVENIDA = -1}
 início
 repita
 início
 escrever('Rua de ', MINRUAS, ' a ', MAXRUAS)
 ler (rua)
 se rua < MINRUAS ou rua > MAXRUAS
 então escrever('Rua inválida')
 fim
 até rua ≥ MINRUAS e rua ≤ MAXRUAS
 repita
 início
 escrever ('Acidentes do cruzamento da avenida ',
 avenida, ' com a rua ', rua, ':')
 ler (matriz[avenida, rua – IND_AJUST])
 se matriz[avenida, rua – IND_AJUST] ≤ 0
 então escrever('Número de acidentes inválido')
 fim
 até matriz[avenida, rua – IND_AJUST] > 0
 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) e (avenida ≠ −1)
 fim
 {GERAÇÃO DA MATRIZ CONDENSADA}
 linha ← 0
 para i de 1 incr 1 até MAXAVENIDAS faça
 para j de 1 até MAXRUAS – IND_AJUST faça
 se matriz[i , j] > 0
 então início
 linha ← linha + 1
 cont_com_acidentes ← cont_com_acidentes + 1
 matriz_condensada[linha, 1] ← matriz[i , j]
 matriz_condensada[linha, 2] ← i
 matriz_condensada[linha, 3] ← j + IND_AJUST
 fim
 escrever('Cruzamentos com acidentes: ')
 escrever('Avenida Rua Acidentes')
 para i de 1 incr 1 até linha faça
Edelweiss_07.indd 207Edelweiss_07.indd 207 12/03/14 09:0212/03/14 09:02
208 Algoritmos e Programação com Exemplos em Pascal e C
 escrever(matriz_condensada[i , 1], matriz_condensada[i , 2],
 matriz_condensada[i , 3])
 {CLASSIFICAÇÃO DA MATRIZ CONDENSADA}
 trocou ← verdadeiro
 m ← linha – 1
 k ← 1
 enquanto trocou faça
 início
 trocou ← falso
 para i de 1 incr 1 até m faça
 se matriz_condensada[i, 1] < matriz_condensada[i+1, 1]
 então início
 aux1 ← matriz_condensada[i, 1]
 aux2 ← matriz_condensada[i, 2]
 aux3 ← matriz_condensada[i, 3]
 matriz_condensada[i, 1] ← matriz_condensada[i+1, 1]
 matriz_condensada[i, 2] ← matriz_condensada[i+1, 2]
 matriz_condensada[i, 3] ← matriz_condensada[i+1, 3]
 matriz_condensada[i+1, 1] ← aux1
 matriz_condensada[i+1, 2] ← aux2
 matriz_condensada[i+1, 3] ← aux3
 k ← i
 trocou ← verdadeiro
 fim
 m ← k
 fim
 {APRESENTAÇÃO DOS RESULTADOS}
 se cont_com_acidentes > 0
 então início
 i ← 1
 repita
 início
 escrever('Intersecção perigosa: ', i)
 escrever (' avenida ', matriz_condensada[i, 2] )
 escrever (' rua ', matriz_condensada[i, 3])
 escrever (' acidentes ', matriz_condensada[i, 1])
 i ← i + 1
 fim
 até i > linha ou i > INTERSECPERIGO
 se linha < INTERSECPERIGO
 então escrever('Não há mais intersecções com acidentes!')
 fim
Edelweiss_07.indd 208Edelweiss_07.indd 208 12/03/14 09:0212/03/14 09:02
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 209
 senão escrever('Nenhum acidente informado!')
fim
outra estratégia possível de solução: percorrer sucessivas vezes a matriz original. A cada 
varredura da matriz, fazer a determinação de uma intersecção mais perigosa. Apresentar este 
valor e, em seguida, substituí-lo na matriz por um valor inválido (-1, por exemplo), para que 
não seja mais considerado nas varreduras subsequentes. O processo encerra-se ou pela apre-
sentação de todas as intersecções mais perigosas solicitadas ou pelo término das intersecções 
com acidentes. Se nenhuma intersecção com acidentes for informada, uma mensagem é apre-
sentada. Essa solução só é possível nos casos em que os dados estejam dentro de um inter-
valo determinado de valores, de modo que um valor extra possa ser definido para inutilizar 
posições. Igualmente, ela exige a alteração da matriz original. Se a alteração não é possível, 
pode-se ainda considerar a geração de uma cópia da matriz que possa então sofrer alterações, 
mas, dependendo do tamanho da matriz original, essa opção pode ser pouco interessante.
7.5 em Pascal
7.5.1 declaração de uma matriz
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, definindoprimeiro 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:
Edelweiss_07.indd 209Edelweiss_07.indd 209 12/03/14 09:0212/03/14 09:02
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;
7.5.2 acesso aos elementos de uma 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;
7.5.3 inicialização de matriz na declaração
É possível inicializar matrizes na declaração, declarando-as como constantes tipadas. Cons-
tantes tipadas, apesar do nome, funcionam na realidade como variáveis, uma vez que seus 
valores iniciais podem ser alterados durante o processamento.
Declaração de uma matriz como constante tipada:
Edelweiss_07.indd 210Edelweiss_07.indd 210 12/03/14 09:0212/03/14 09:02
Capítulo 7 Variáveis Estruturadas: Arranjos Multidimensionais 211
const
 <nome da constante> : <tipo da constante> =
((valor1 da 1a linha, valor2 da 1a linha , ... , valorn da 1a linha),
 (valor1 da 2a linha, valor2 da 2a linha , ... , valorn da 2a linha),
 (valor1 da 3a 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));
7.5.4 atribuição em bloco
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
7.6.1 declaração de uma matriz
A declaração de uma matriz multidimensional em C é feita definindo-se, após o nome da 
matriz, o número de elementos em cada uma das suas dimensões, cada um entre colchetes:
Edelweiss_07.indd 211Edelweiss_07.indd 211 12/03/14 09:0212/03/14 09:02

Continue navegando