Baixe o app para aproveitar ainda mais
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
Compartilhar