Baixe o app para aproveitar ainda mais
Prévia do material em texto
ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 1 de 35 Índice Capítulo I ....................................................................................................................................... 2 1 – Estruturas de Dados homogêneas: Vetores. ......................................................................... 2 1.1 – Definição: ......................................................................................................................................................... 2 1.2 – O tipo vetor: ..................................................................................................................................................... 2 1.3 – Usando vetores: ................................................................................................................................................ 3 1.4 – Exercícios ......................................................................................................................................................... 5 Capítulo II ...................................................................................................................................... 6 2 – Estruturas de Dados homogêneas: Matrizes. ....................................................................... 6 2.1 – Definição: ......................................................................................................................................................... 6 2.2 – O tipo matriz: ................................................................................................................................................... 6 2.3 – Usando matrizes: .............................................................................................................................................. 7 2.4 – Exercícios ......................................................................................................................................................... 9 Capítulo III .................................................................................................................................. 10 3 – Estruturas de Dados heterogêneas: Registros. ................................................................... 10 3.1 – Definição: ....................................................................................................................................................... 10 3.2 – O tipo registro: ............................................................................................................................................... 10 3.3 – Usando registros: ............................................................................................................................................ 10 3.4 – Usando registros como elementos de vetores (Tabelas):................................................................................ 13 3.5 – Exercícios ....................................................................................................................................................... 14 Capítulo IV ................................................................................................................................... 15 4 – Métodos de Pesquisa. ............................................................................................................ 15 4.1 – Pesquisa sequêncial: ....................................................................................................................................... 15 4.2 – Pesquisa binária: ............................................................................................................................................ 16 4.3 – Pesquisa conclusões: ...................................................................................................................................... 18 4.5 – Exercícios ....................................................................................................................................................... 18 Capítulo V .................................................................................................................................... 19 5 – Métodos de Ordenaçaão. ...................................................................................................... 19 5.1 – Ordenação: ..................................................................................................................................................... 19 5.2 – Ordenação por inserção .............................................................................................................. 19 5.3 – Ordenação por troca .................................................................................................................. 21 5.4 – Ordenação por seleção ............................................................................................................... 21 5.5 – Exercícios ....................................................................................................................................................... 25 Capítulo VI ................................................................................................................................... 26 6 – Arquivos. ................................................................................................................................ 26 6.1 – Definição: ....................................................................................................................................................... 26 6.2 – Declarando um arquivo: ................................................................................................................................. 26 6.3 – Usando Arquivos:........................................................................................................................................... 27 6.3.1 – Novos comandos: .................................................................................................................................... 27 6.3.2 – Operações básicas: .................................................................................................................................. 28 6.3.3 – Organização sequêncial: .......................................................................................................................... 28 6.3.4 – Organização direta: ................................................................................................................................. 31 6.4 – Exercícios ....................................................................................................................................................... 34 Bibliografia .................................................................................................................................. 35 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 2 de 35 Capítulo I 1 – Estruturas de Dados homogêneas: Vetores. 1.1 – Definição: Um vetor é uma estrutura de dados homogênea, pois é formado por uma única variável, com um único nome, dividida em vários pedaços, denominados de elementos do vetor, onde podemos guardar valores de mesmo tipo e mesmo significado. Exemplo 1: Um vetor de notas só contém notas. Não podemos guardar nos elementos de um único vetor, notas e salários, pois apesar de terem o mesmo tipo, real, possuem significados diferentes Cada elemento de um vetor é identificado por um número: inteiro e seqüencial. Para o primeiro elemento podemos escolher qualquer número, podendo ser até um número negativo. Para os elementos seguintes somamos sempre um ao número do elemento anterior. Um vetorpode ser chamado de variável composta homogênea ou agregado homogêneo. Exemplo 2: Representamos graficamente um vetor como abaixo, onde “NOMES” é uma variável do tipo vetor: NOMES João Ana Luis Vanda ................ José Maria elementos 1 2 3 4 29 30 índices 1.2 – O tipo vetor: Até agora temos criado variáveis simples, cada variável guarda um só valor, com tipos básicos como: inteiro, real, caracter e lógico. Uma variável do tipo vetor pode ser definida com várias formatações diferentes, pode variar o número e o tipo dos elementos, por isso o tipo vetor tem de ser definido pelo programador como veremos abaixo: Formato: Tipo “identificador” = vetor [i1:in] “tipos”; Onde: i1 é o número do primeiro elemento do vetor ou primeiro índice. i2 é o número do último elemento do vetor ou último índice. tipos é um único tipo que caracteriza o conteúdo de cada elemento do vetor, pode ser um tipo: básico, vetor ou registro,como veremos mais adiante. Ao especificarmos um tipo vetor, estamos apenas criando um molde ou modelo. Para que a variável vetor passe a existir temos que criá-la usando este molde. Exemplo 3: Tipo x = vetor [1 : 30] caracter; x: NOMES; O número de elementos de um vetor é dado pela expressão: in - i1 + 1. Os elementos de um vetor são numerados a partir de i1, somando sempre 1 até in. Exemplo 4: Para o vetor “NOMES”, o número de elementos é: in - i1 + 1, onde in = 30 e i1 = 1 Temos: 30 - 1 + 1 = 30 elementos ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 3 de 35 1.3 – Usando vetores: Para melhor entendermos o funcionamento de um vetor faremos uma analogia com um armário que possua várias gavetas numeradas de 1 a n. Para termos acesso a um objeto que esteja em uma gaveta de um armário temos que identificar o armário (nome do vetor) e a gaveta (número do elemento) onde guardamos o objeto. Para termos acesso ao conteúdo de um elemento de um vetor precisamos do nome do vetor e do número do elemento que queremos acessar. Desta forma um elemento de um vetor funciona como uma variável simples. Exemplo 5: Seja o vetor do Exemplo 2: NOMES João Ana Luis Vanda ................ José Maria 1 2 3 4 29 30 Após serem executados os comandos abaixo: NOMES[3] “Rui”; Podemos usar uma variável do tipo inteiro como índice; I 4; NOMES[I] “Lu”; Podemos atribuir valor para um elemento de um vetor através da leitura: I 1; Leia(NOMES[I]); {digitamos o valor “Carla”} Temos: NOMES Carla Ana Rui Lu ................ José Maria 1 2 3 4 29 30 Ao executarmos o comando: Imprima (NOMES[4]); - será impresso o “Lu”. Exemplo 6: Usando um vetor com o comando “Para”: Algoritmo Vetor: Tipo v = vetor[1:5] inteiro; v: NUM; Inicio Para I de 1 até 5 faça; NUM[I] I; Fim-Para; Fim; Temos ao fim da execução: NUM 1 2 3 4 5 1 2 3 4 5 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 4 de 35 Exemplo 7: Quando precisamos processar um conjunto de dados lidos mais de uma vez, vemos que as variáveis simples não são suficientes. Temos que usar variáveis do tipo vetor, como no algoritmo abaixo: Temos o enunciado: Faça um algoritmo que lê 100 notas e imprime as notas maiores que a média. Sem usar vetor, conseguiremos só calcular a média, de uma maneira simples: Algoritmo Média; Real: NOTA, SOMA, MEDIA; Inteiro: I; Inicio Para I de 1 até 100 faça Leia(NOTA); SOMA SOMA + NOTA; Fim-Para; MEDIA SOMA / 100; Imprima(MEDIA); FIM; Para podermos comparar cada nota com a média temos que guardar as notas lidas para fazer as comparações após o cálculo da média: Algoritmo Notas_Maiores_que_Média; Tipo v = vetor[1 : 100] real; v: NOTAS; Real: SOMA, MEDIA; Inteiro: I; Inicio Para I de 1 até 100 faça Leia(NOTAS[I]); {cada nota lida fica guardada em uma posição do vetor} SOMA SOMA + NOTAS[I]; Fim-Para; MEDIA SOMA / 100; Imprima(MEDIA); Para I de 1 até 100 faça Se NOTAS[I] > MEDIA Então Imprima(NOTAS[I]); Fim-Para; FIM; Como vimos acima uma das utilizações mais comuns de um vetor é quando precisamos processar mais de uma vez um conjunto de dados. Para não perdê-los, guardamos em um vetor na memória. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 5 de 35 1.4 – Exercícios 1 – Faça um algoritmo que preencha totalmente um vetor com 10 números reais digitados pelo usuário. 2 – Faça um algoritmo que preencha totalmente um vetor com 10 números reais digitados pelo usuário e em seguida imprima a soma dos valores contidos em cada elemento do vetor. 3 – Faça um algoritmo que preencha totalmente um vetor com 10 números reais digitados pelo usuário e em seguida multiplique por 3 cada elemento do vetor e imprima o vetor com os novos valores. 4 – Faça um algoritmo que preencha totalmente um vetor com 10 números reais digitados pelo usuário e em seguida preencha um segundo vetor com os valores do primeiro na ordem inversa, do último para o primeiro. 5 – Faça um algoritmo que preencha totalmente um vetor com 10 números reais digitados pelo usuário e em seguida imprima os valores que estiverem nos elementos de índice impar, do maior para o menor. 6 – Faça um algoritmo que preencha cada uma das 80 posições de um vetor com uma letra, lida. Em seguida leia mais uma letra e imprima o número de vezes que esta letra aparece dentro do vetor. 7 – Faça um algoritmo que preencha cada uma das 80 posições de um vetor com uma letra, lida. Em seguida imprima quantos pares de letras existem no vetor, ou seja, quantas vezes aparecem duas letras repetidas uma após a outra. 8 – Faça um algoritmo que preencha cada uma das 50 posições de um vetor com um número inteiro, lido. Em seguida percorra o vetor e dobre o valor do conteúdo de cada elemento se for ímpar e menor que o último número lido e triplique o valor dos demais. 9 – Calculo do Digito verificador do número de matrícula de um aluno: O número de matrícula é formado por 5 dígitos, mais 1 dígito verificador que fica no final. Este dígito verificador é calculado de acordo com os outros 5 dígitos do número de matrícula. Apresentamos aqui uma forma simplificada para o calculo deste dígito: Somar os produtos de cada um dos dígitos do número de matrícula, pela sua respectiva posição, e pegar o resto da divisão inteira desta soma por 11. Este resultado será o digito verificador do número de matrícula. 10 – Faça um algoritmo que lê o número e as quatro notas de cada aluno de uma turma com 20 alunos. Imprima para cada aluno: nº do aluno, média do aluno, média da turma. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 6 de 35 Capítulo II 2 – Estruturas de Dados homogêneas: Matrizes. 2.1 – Definição: Uma matriz é uma estrutura de dados homogênea, pois é formada por uma única variável, com um único nome,dividida em vários pedaços, denominados de células ou elementos da matriz, onde podemos guardar valores de mesmo tipo e mesmo significado. Matrizes são estruturas de dados similares aos vetores, com a diferença que podem ter várias dimensões. Exemplo 1: Uma matriz de notas só contém notas, não podemos guardar nas células de uma mesma matriz notas e salários pois, apesar de terem o mesmo tipo, real, possuem significados diferentes. Cada célula de uma matriz fica identificada pelo “nome” da matriz e tantos índices, números inteiros, quanto forem as suas dimensões. Neste capítulo estudaremos as matrizes de duas dimensões, formada por linhas e colunas, por serem as mais utilizadas. Uma célula em uma matriz de duas dimensões fica identificada pelo nome da matriz e os números da linha e da coluna como veremos mais adiante. Uma matriz pode ser chamada de conjunto ou vetor multidimensional. Exemplo 2: Representamos graficamente uma matriz como abaixo, onde “LETRAS” é uma variável do tipo matriz com 4 linhas e 3 colunas. É uma matriz 4 x 3: Exemplo 3: LETRAS 1 2 3 1 C F E 2 D A B 3 H G I 4 L M J 2.2 – O tipo matriz: Uma variável do tipo matriz, assim como o vetor, pode ser definida com várias formatações diferentes, pode variar o número de linhas e de colunas e o tipo dos conteúdos das células, por isso o tipo matriz tem de ser definido pelo programador com veremos abaixo: Formato: Tipo “identificador” = matriz [L1:Ln , C1:Cn ] “tipo”; Onde: L1 é o número, índice, da primeira linha da matriz Ln é o número, índice, da última linha da matriz C1 é o número, índice, da primeira coluna da matriz Cn é o número, índice, da última coluna da matriz tipo é um único tipo que caracteriza o conteúdo de cada elemento da matriz, pode ser um tipo: básico, vetor, matriz ou registro, como veremos mais adiante. Ao especificarmos um tipo matriz, estamos apenas criando um molde ou modelo. Para que uma variável do tipo matriz passe a existir temos que criá-la usando este molde. Cada valor armazenado na matriz poderá ser acessado através do cruzamento de sua respectiva linha com a sua coluna. Exemplo 4: Imprima(LETRAS[3,2]); Imprime a letra: “G” Linhas Colunas ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 7 de 35 Exemplo 5: Tipo m = matriz [1 : 4 , 1 : 3] caracter; m: LETRAS; O total de dimensões de uma matriz é igual ao número de vírgulas da declaração mais 1. Os números de células, ou elementos, são iguais ao produto do número de células de cada dimensão, ou seja: Número de células = (Ln - L1 + 1) * (Cn - C1 + 1) Exemplo 6: Para a matriz LETRAS, o número dimensões é 2. Temos uma única vírgula o que caracteriza duas dimensões, que são identificadas pelas linhas, primeira dimensão, e as colunas, segunda dimensão. Para a matriz LETRAS, o número de células ou elementos é: Número de células = (Ln – L1 + 1) * (Cn – C1 + 1) = (4 – 1 + 1) * (3 – 1 + 1) = 12 2.3 – Usando matrizes: Para acessar o conteúdo de uma célula de uma matriz de 2 dimensões precisamos do nome da matriz, e dos números da linha e da coluna que correspondam à célula que queremos acessar. Desta forma um elemento de uma matriz funciona como uma variável simples. Exemplo 7: Seja a matriz abaixo: 1 2 3 1 7,8 5,5 8,7 2 5,8 7,9 8,0 3 9,7 7,6 8,4 4 6,4 5,8 8,7 5 4,5 7,4 8,0 Após serem executados os comandos abaixo: NOTAS[1 , 1] 9,0; Podemos usar uma variável do tipo inteiro como índice; I 4; J 3; NOTAS[I , J] 7,5; Podemos atribuir valor para um elemento de uma matriz através da leitura: I 3; J 2; Leia(NOTAS[I , J]); {digitamos a nota 8,2} Temos: 1 2 3 1 9,0 5,5 8,7 2 5,8 7,9 8,0 3 9,7 8,2 8,4 4 6,4 5,8 7,5 5 4,5 7,4 8,0 Ao executarmos o comando: Imprima (NOTAS[1,2]); - será impresso 5,5. NOTAS NOTAS ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 8 de 35 Exemplo 8: Percorrendo a matriz NOTAS por linha: Fixe a linha e varie a coluna. Algoritmo Matriz_Linha: Tipo m = matriz[5:3] real; m: NOTAS; Real: X; Inicio X 2,0; Para I de 1 até 5 faça; Para J de 1 até 3 faça; X X + 0,5; NOTAS[I , J] X; Fim-Para; Fim-Para; Fim; Exemplo 9: Percorrendo a matriz NOTAS por coluna: Fixe a coluna e varie a linha. Algoritmo Matriz_ Coluna: Tipo m = matriz[5:3] real; m: NOTAS; Real: X; Inicio X 2,0; Para J de 1 até 3 faça; Para I de 1 até 5 faça; X X + 0,5; NOTAS[I , J] X; Fim-Para; Fim-Para; Fim; Após executar o algoritmo, temos: NOTAS 1 2 3 1 2,5 3,0 3,5 2 4,0 4,5 5,0 3 5,5 6,0 6,5 4 7,0 7,5 8,0 5 8,5 9,0 9,5 Após executar o algoritmo, temos: NOTAS 1 2 3 1 2,5 5,0 7,5 2 3,0 5,5 8,0 3 3,5 6,0 8,5 4 4,0 6,5 9,0 5 4,5 7,0 9,5 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 9 de 35 2.4 – Exercícios 1 – Dada uma matriz 4 x 4 de inteiros faça um algoritmo que permita o preenchimento de toda a matriz, por linha, com os valores digitados pelo usuário. 2 – Dada a matriz 4x4 preenchida no exercício anterior, faça um algoritmo capaz de fazer a soma de todos os valores de cada coluna e apresente o resultado na tela. 3 – Escreva um algoritmo capaz de calcular a soma dos elementos que se encontram abaixo da diagonal principal de uma matriz de 10 x10 do tipo inteiro, cujos conteúdos serão digitados pelo usuário, e apresente o resultado no final do processamento. 4 – Faça um algoritmo capaz de somar todos os valores de cada linha de uma matriz 4 x 5 do tipo real, que deverão ser digitados pelo usuário, e apresente o resultado da soma de cada linha. 5 – Faça um algoritmo capaz de somar os valores de cada linha de uma matriz 4 x 5 do tipo inteiro, que deverão ser digitados pelo usuário. O total de cada linha será colocado no elemento de um vetor de índice igual ao número da linha e, em seguida soma os elementos do vetor em uma variável e imprime o resultado. 6 – Dada uma matriz 4 x 4 do tipo inteiro que deverá ser preenchida pelo usuário, faça um algoritmo capaz de criar uma nova matriz com as mesmas dimensões, baseada na primeira cujos elementos devem obedecer as seguintes regras: Quando o número da coluna for maior que o número da linha, o elemento deverá ser multiplicado pelo valor da coluna e colocado na mesma posição na nova matriz. Quando o número da linha for maior que o da coluna, o elemento deverá ser multiplicado pelo número da linha e colocado na mesma posição na nova matriz. Quando o número da coluna for igual ao da linha, o elemento deverá ser multiplicado por 10 e colocado na mesma posição na nova matriz. Após o processamento o algoritmo deverá imprimir a nova matriz elemento a elemento. 7 – Faça um algoritmo para gerar a seguinte matriz: 1 2 3 4 5 6 1 1 1 1 1 1 1 2 1 2 2 2 2 1 3 1 2 3 3 2 1 4 1 2 3 3 2 1 5 1 2 2 2 2 1 6 1 1 1 1 1 1 ESTRUTURAS DE DADOS I Roberto Luís M. P. CastroPágina 10 de 35 Capítulo III 3 – Estruturas de Dados heterogêneas: Registros. 3.1 – Definição: Em uma loja, em uma escola, no emprego, muitas vezes nos é solicitado o preenchimento de um cadastro com dados que identifique o cliente, o aluno ou o funcionário. Um cadastro é formado por vários registros, onde cada registro os dados de um: cliente, aluno, funcionário, contém como abaixo: O Registro de Clientes acima, que podemos chamar de registro (registra os dados de um cliente), é composto por um conjunto de dados relacionados, porém podendo ter tipos e significados diferentes, que denominamos de campos do registro: Código (inteiro), Nome (caracter), Data de Nascimento (caracter), Endereço (caracter), Telefone (inteiro), Sexo (caracter), Renda (real). Todos os dados pertencem ao cliente cujo “nome” estiver escrito no campo “Nome” do Cadastro. Registros ou agregados heterogêneos ou variáveis compostas heterogêneas ou estrutura de dados heterogêneos são compostos por campos que são dados relacionados entre si e que formam uma unidade que chamamos de registro. 3.2 – O tipo registro: Uma variável do tipo registro pode possuir tantos campos quantos forem necessários para a aplicação, podendo ser definido com várias formatações diferentes, por isso o tipo registro tem de ser definido pelo programador com veremos abaixo: Formato: Tipo “identificador” = registro “tipo do campo1” = “identificador do campo1”; “tipo do campo2” = “identificador do campo2”; .................................................................................... “tipo do campon” = “identificador do campon”; Fim-registro; 3.3 – Usando registros: Ao especificarmos um tipo registro, estamos apenas criando um molde ou modelo. Para que uma variável do tipo registro passe a existir temos que criá-la usando este molde. Exemplo 1: Registro de cliente Tipo rcli1 = registro Inteiro: Código, tel; Caracter: Nome, Nasc, Endereco, Sexo; Real: Renda; Fim-registro; rcli1: REGCLI1; Registro de Cliente Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Endereço: _____________________________ Telefone: _____________ Sexo: ___ Estado Civil: ______________ Renda: ____________ ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 11 de 35 Para termos acesso a cada campo de uma variável do tipo registro temos que escrever: “Nome da variável tipo registro.campo” “valor” ou “variável”; Para o REGCLI1 temos: REGCLI1.Nome “Luis”; {Luis fica no campo nome da variável REGCLI1} Leia (REGCLI1.Renda); {O valor digitado fica no campo Renda da variável REGCLI1} Imprima(REGCLI1.Nome); {Será impresso Luis} Exemplo 2: Em uma loja, em uma escola, no emprego, muitas vezes nos é solicitado o preenchimento de um formulário com dados que identifique o cliente, o aluno ou o funcionário, como abaixo: Na versão do Registro de Cliente acima, temos campos com os tipos básicos: Código (inteiro), Nome (caracter), Data de Nascimento (caracter), Sexo (caracter), Estado Civil (caracter), Renda (real), Telefone (inteiro), Celular (inteiro), Email (caracter); temos campos do tipo registro: Endereço, que possui os campos: Rua (caracter), Nº (inteiro), Complemento (caracter), CEP (inteiro) e temos campos do tipo vetor: Compras no trimestre que é formado por um vetor com três elementos cada um contendo o valor total gasto em compras pelo cliente em cada mês do trimestre. Todos os dados pertencem ao cliente cujo “nome” estiver escrito no campo “Nome” do Registro. Para criarmos a variável do tipo registro que contenha os campos acima temos que criar os tipos vetor e registro que compõem a variável antes, como abaixo: Exemplo 3: Registro de cliente Tipo rend = registro Inteiro: Número, Cep; Caracter: Rua, Complemento; Fim-registro; Tipo vcom = vetor [1 : 3] real; Tipo rcli2 = registro Inteiro: Código, Telefone, Celular; Caracter: Nome, Nasc, Sexo, EstCivil, Email; Real: Renda; rend: End; vcom: Compras; Fim-registro; rcli2: REGCLI2; Registro de Cliente Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Sexo: ___ Estado Civil: ______________ Renda: ____________ Endereço: Rua: _____________ Nº: _____ Complemento: ___________ CEP:______ Telefone: _____________ Celular: _____________ Email: _______________ Compras no trimestre: 1 2 3 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 12 de 35 Para o REGCLI2 temos: REGCLI2.Nome “Luis”; {Luis fica no campo nome da variável REGCLI2} REGCLI2.End.Rua “Rua A”; REGCLI2.Compras[1] 250,00; ”; {250,00 fica no elemento 1 do vetor “Compras” da variável REGCLI2} Leia (REGCLI2.End.Número, REGCLI2.Compras[3]); {O primeiro valor digitado fica no campo Número do campo End da variável REGCLI2 e o segundo valor digitado fica no terceiro elemento do vetor Compras da variável REGCLI2} Imprima(REGCLI2.End.Rua, REGCLI2.Compras[1]); {Imprime: Rua A 250,00} Exemplo 4: Modificamos o Registro de Cliente acima para conter as compras do cliente nos quatro trimestres do ano, trocando o vetor pela matriz “Compras nos trimestres de um ano” que é uma matriz 4 x 3 como abaixo: Para criarmos a variável do tipo registro que contenha os campos acima termos que criar os tipos matriz e registro que compõem a variável antes, como abaixo: Exemplo 5: Registro de cliente Tipo rend = registro Inteiro: Numero, Cep; Caracter: Rua, Complemento; Fim-registro; Tipo mcom = matriz [4 : 3] real; Tipo rcli3 = registro Inteiro: Codigo, Telefone, Celular; Caracter: Nome, Nasc, Sexo, EstCivil, Email; Real: Renda; rend: End; mcom: Compras; Fim-registro; Rcli3: REGCLI3; Cadastro de Cliente Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Sexo: ___ Estado Civil: ______________ Renda: ____________ Endereço: Rua: _____________ Nº: _____ Complemento: ___________ CEP:______ Telefone: _____________ Celular: _____________ Email: _______________ Compras nos trimestres: 1 1111 2 2 3 4 1 2 3 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 13 de 35 Para o REGCLI3 temos: REGCLI3.Compras[1 , 3] 350,00;Leia (REGCLI3.Compras[3 , 2]); {O valor digitado fica na célula identificada pelo cruzamento da linha 3 com a coluna 2 da matriz Compras da variável REGCLI3} Imprima(REGCLI3.Compras[1 , 3]); {Imprime: 350,00} 3.4 – Usando registros como elementos de vetores (Tabelas): Vamos representar uma agenda telefônica com 10 páginas contendo em cada página espaço para guardar o “nome” e o “número de um telefone” de uma pessoa. Para tal, criamos uma variável do tipo vetor e em cada um de seus elementos colocamos um registro com dois campos: Nome, Telefone, como abaixo: AGENDA Nome Tel Nome Tel Nome Tel ..................................... Nome Tel Nome Tel 1 2 3 9 10 Podemos ainda representar agenda como uma tabela na memória: AGENDA Nome Telefone 0 José Maria da Silva 23293454 1 Maria José da Silva 23236789 2 3 . . . . . . . . . 10 Exemplo 6: Agenda Telefônica: Tipo ragen = registro Caracter: Nome; Inteiro: Tel; Fim-registro; Tipo vagen = vetor [1 : 10] ragen; vagen: AGENDA; Para a AGENDA temos: AGENDA[3].Nome “Ana”; Leia(AGENDA[3].Tel) { o número do telefone da Ana, ex.: 22224554, ao ser digitado fica no campo “Tel” do terceiro elemento do vetor AGENDA}; Imprima(AGENDA[3].Nome, AGENDA[3].Tel) {Imprime: Ana 22224554} ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 14 de 35 3.5 – Exercícios 1 – Crie a variável do tipo registro correspondente ao Registro de Funcionário abaixo: 2 – Faça um algoritmo que cria uma variável do tipo registro correspondente ao Registro de Funcionário abaixo, leia o conteúdo de um registro e preencha cada um de seus campos com os valores lidos. Imprima os salários maiores que o último: 3 – Faça um algoritmo que cria uma variável do tipo registro correspondente ao Registro de Funcionário abaixo, leia o conteúdo de um registro e preencha cada um de seus campos com os valores lidos. Imprima o número do trimestre onde a soma dos salários é o maior: 4 – Faça um algoritmo que tome por base a “AGENDA” do exemplo 3, crie a tabela correspondente acrescentando mais dois campos da sua escolha. Preencha todos os 10 elementos do vetor “AGENDA” com os valores lidos. Em seguida leia o nome de uma pessoa, procure este nome na “AGENDA” e, se existir imprima os dados dessa pessoa ou imprima a mensagem: “Nome não existe” caso não encontre. Registro de Funcionário Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Departamento: ________ Profissão: ______________ Função: ____________ Ano: _____ Salário de Jan: _________ Salário de Fev:__________ Salário de Mar:_________ Registro de Funcionário Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Departamento: ________ Profissão: ______________ Função: ____________ Ano: _____ Salários no trimestre: 1 2 3 Registro de Funcionário Código: ___________ Nome: ____________ Data de Nascimento: ___/ ___/ ___ Departamento: ________ Profissão: ______________ Função: ____________ Ano: _____ Salário nos trimestres: 1 1111 2 2 3 4 1 2 3 ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 15 de 35 Capítulo IV 4 – Métodos de Pesquisa. 4.1 – Pesquisa sequêncial: É o método mais simples de pesquisa. Neste método o vetor é percorrido sequêncialmente do primeiro até o último elemento ou do último até o primeiro elemento até encontrar o valor pretendido ou chegar ao fim do vetor, caso o valor pretendido não seja encontrado. Pesquisa em vetor desordenado: Consideramos que os elementos do vetor não estão ordenados. Quando os valores no vetor não se repetem: Buscar a ocorrência do valor no vetor. Quando os valores no vetor se repetem: Buscar a primeira ocorrência de um valor no vetor. Buscar a última ocorrência de um valor no vetor. Buscar uma ocorrência qualquer de um valor no vetor. Buscar todas as ocorrências de um valor no vetor. Algoritmo de pesquisa ALGORITMO PesquisaLinearSimples_Desordenado; {Busca todas as ocorrências do valor procurado no vetor desordenado. Cada vez que encontrar imprime o índice. Caso não encontre, imprime uma mensagem.} Tipo v: vetor [1 : 50] caracter; v:VP; Inteiro: I; Lógico: ACHOU; Caracter: Procurado; INICIO Imprima(„Digite o nome do elemento a ser pesquisado:‟) Leia(Procurado); Para I de 1 até 50 faça //atribuição de valores para o vetor Leia ( VP[ I ] ); Fim-Para; ACHOU .F.; Para I de 1 até 50 faça Se VP[ I ] = Procurado Então Imprima(„o valor procurado foi encontrado na posição „, I) ACHOU .V.; Fim-Se; Fim-Para; Se ACHOU = .F. Então Imprima("Não encontrou"); Fim-Se; Fim. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 16 de 35 Pesquisa em vetor ordenado: Consideramos que os elementos do vetor estão ordenados. Quando os valores no vetor não se repetem: Buscar a ocorrência do valor no vetor. Quando os valores no vetor se repetem: Buscar a primeira ocorrência de um valor no vetor. Buscar a última ocorrência de um valor no vetor. Buscar uma ocorrência qualquer de um valor no vetor. Buscar todas as ocorrências de um valor no vetor. Algoritmo de pesquisa ALGORITMO PesquisaLinearSimples_Ordenado; {Busca a primeira ocorrência do valor procurado no vetor ordenado. Cada vez que encontrar imprime o índice. Caso não encontre, imprime uma mensagem.} Tipo v: vetor [1 : 50] caracter; v:VP; Inteiro: I; Lógico: ACHOU; Caracter: Procurado; INICIO Imprima(„Digite o nome do elemento a ser pesquisado:‟) Leia(Procurado); Para I de 1 até 50 faça //atribuição de valores para o vetor Leia ( VP[ I ] ); Fim-Para; I 1 Enquanto VP[I] < Procurado e I < 50 Faça i i + 1; Fim-Enquanto; Se VP[i] <> Procurado Então Imprima ('O valor não foi encontrado') Senão Imprima ('O valor foi encontrado na posição', i); FIM. 4.2 – Pesquisa binária: Comparar o valor que se encontra no meio do vetor com o valor procurado, podendo acontecer uma de três coisas: Encontrou: se é igual ao valor procurado Continuar procurando (do mesmo modo) no sub-vetor à esquerda da posição do “meio” Se é maior doque o valor procurado Continuar procurando (do mesmo modo) no sub-vetor à direita da posição do “meio” Se é menor do que o valor procurado Se o vetor inspecionado se reduzir a um vetor vazio, então o valor procurado não existe. Pesquisa em vetor ordenado: Consideramos que os elementos do vetor estão ordenados. Quando os valores no vetor não se repetem: Buscar a ocorrência de um valor no vetor. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 17 de 35 ALGORITMO PesquisaBinária; Tipo v = vetor [ 1 : 128] Inteiro; v: VP; Inteiro: I, Inicio, Fim, Meio; Inteiro: Procurado; INICIO Imprima(„Digite o nome do elemento a ser pesquisado:‟) Leia(Procurado); PARA i de 1 até 128 Faça //atribuição de valores para o vetor Leia ( VP[ I ] ); Fim-Para; Inicio 1; Fim 128; Enquanto Procurado <> VP[Meio] e Inicio <= Fim faça Meio (Inicio + Fim) div 2; Se Procurado < VP[Meio] Então Fim Meio – 1; Senão Então Inicio Meio + 1 Fim-Se; Fim-Enquanto; SE VP[Meio] <> Procurado Então Imprima("Não Encontrou") Senão Imprima("Encontrou na posição : ", Meio) Fim-Se; Fim. 20 30 40 50 60 70 80 9010 100 início fimmeio Chave de Busca = 60 1a. Iteração 20 30 40 50 60 70 80 9010 100 início fimmeio 2a. Iteração 20 30 40 50 60 70 80 9010 100 início fimmeio 3a. Iteração Exemplo: Algoritmo de pesquisa ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 18 de 35 4.3 – Pesquisa conclusões: Na pesquisa sequêncial simples, o número médio de comparações realizadas para encontrar um valor no vetor é N/2, onde N é o número de elementos do vetor. Para um vetor com 128 elementos temos: 128/2 = 64 comparações em média. Na pesquisa binária, o número máximo de comparações é log2 N. Para um vetor com 128 elementos temos: log2 128 = 7 comparações no máximo. 4.5 – Exercícios 1. Faça um algoritmo que leia 10 valores numéricos inteiros. Após a leitura emita um relatório com cada valor diferente e o número de vezes que o mesmo apareceu no vetor. 2. Dado uma relação de N nomes, faça um algoritmo que verifique se uma determinada pessoa está neste vetor. O nome da pessoa a ser pesquisada deverá ser lido, bem como os nomes a serem colocados no vetor. 3. Dado que para cada aluno de uma turma de N alunos se tenha, o seu nome, e as notas das 8 avaliações. Faça um algoritmo que: a) Imprima o nome a média de cada aluno; b) Para cada aluno imprima uma mensagem dizendo se o aluno tem ou não notas repetidas; c) Determine quantos alunos tem pelo menos duas notas acima de 7; 4. Dado um vetor contendo números inteiros faça um algoritmo que pesquise se um determinado valor existe dentro do vetor. Caso exista, deverá ser dada uma mensagem para o usuário informando a posição dentro do vetor onde o valor foi encontrado. Caso o valor não exista deverá ser dado uma mensagem informando o usuário da não existência do valor dentro do vetor. 5. Uma escola precisa de um algoritmo que controle a média das notas dos alunos de cada classe e a média das notas de todos os alunos da escola. Sabendo que essa escola possui 5 classes, e em cada classe tem N alunos, gerando um total de 5xN notas, crie um algoritmo que leia as notas de cada aluno de cada classe e no final apresente a média de cada classe e a média da escola em geral. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 19 de 35 Capítulo V 5 – Métodos de Ordenaçaão. 5.1 – Ordenação: Ordenação corresponde ao método de organizar um conjunto de objetos em uma ordem crescente ou decrescente. É uma atividade relevante e fundamental em processamento de dados. Tem como objetivo facilitar a recuperação dos itens do conjunto – Recuperação de nomes em um lista telefônica Identificamos duas formas de ordenação • Ordenação Interna: – O conjunto de dados é pequeno, cabe todo na memória principal. – O processo de ordenação é realizado internamente na memória principal. – Os dados a serem ordenados estarão em um vetor ou em uma tabela, quando a ordenação é feita por um campo chamado de chave que identifica cada elemento do vetor que forma a tabela. • Ordenação Externa: – O conjunto de dados não cabe completamente em memória principal, – Os dados a serem ordenados estarão em disco ou fita em arquivos no formato de registros que são acessados seqüencialmente ou em blocos Alguns métodos de ordenação interna que estudaremos: Ordenação por inserção: • Método de Inserção direta (Insertion Sort) Ordenação por troca • Método de Bollha (bubble sort) • Método de troca e partição (QuickSort) Ordenação por seleção • Método de Seleção direta (Selection Sort) 5.2 – Ordenação por inserção • Algoritmo: Método de Inserção Direta (Insertion Sort) • É um algoritmo simples • Procedimento 1. Os elementos são divididos em uma seqüência de destino a1, ..., ai-1 e em uma seqüência fonte ai, ..., an. 2. Em cada passo, a partir de i =2, o i-ésimo item da seqüência fonte é retirado e transferido para a seqüência destino sendo inserido na posição adequada • Exemplo ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 20 de 35 • A inserção do item em uma posição adequada na seqüência de destino é realizada com a movimentação das chaves maiores para a direita e o item é inserido na posição vazia • Vantagens: – O número mínimo de comparações e movimentos ocorre quando os itens já estão originalmente ordenados – O número máximo ocorre quando os itens estão originalmente em ordem reversa, o que indica um comportamento natural para o algoritmo Implementação do algoritmo Program Insercao_Direta; Type v=array[0..6] of string[1]; Var A: v; ITEM: String[1]; I, J: Integer; Begin For I := 1 to 6 do Begin Write('Digite uma letra: '); Readln(A[I]); End; For I := 1 to 6 do Write(I,':',A[I]:2,' '); writeln; For I := 2 to 6 do Begin ITEM := A[I]; J := I - 1; A[0] := ITEM; {sentinela} While ITEM < A[J] do Begin A[J+1] := A[J]; J := J - 1; End; A[J+1] := ITEM; End; For I := 1 to 6 do Write(I,':',A[I]:2,' '); readln; End. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 21 de 35 5.3 – Ordenação por troca • Algoritmo: Método de Bollha (bubble sort) • Um dos algoritmos mais simples • Princípio: 1. Em cada passo, cada elemento é comparado com o próximo e trocado se estiverer fora de ordem; 2. Repete-se o processo de comparação e troca até que não ocorram mais trocas • O nome Bolha é devido a: 1. Colocando o vetor a ordenar na vertical, com Item[n] em cima e Item[1] embaixo, em cada passo o menor elemento “sobe” até encontrar um elemento maior ainda, como se uma bolha subisse dentro de um tubo de acordo com sua densidade • Exemplo Implementação do algoritmo Program ORD1_Bolha; Typev = array[1..8] of Integer; Var ITEM: v; I, J,K: Integer; Begin For I := 1 to 8 do Begin Write('Digite um número: '); Readln(ITEM[I]); End; For I := 1 to 8 do Write(I,':',ITEM[I]:2,' '); writeln; For I:= 2 to 8 do {inicio da ordenação} For J:= 8 downto I do If ITEM[J-1] > ITEM[J] Then Begin AUX:= ITEM[J-1]; ITEM[J-1] := ITEM[J]; ITEM[J] := AUX; End; {fim da ordenasção} For I := 1 to 8 do Write(I,':',ITEM[I]:2,' '); readln; End. Melhorando o algoritmo: No exemplo, as três últimas iterações não afetam a ordem do vetor. Então, o algoritmo, apesar de correto, pode ser melhorado. Podemos melhorar, mantendo uma indicação para saber se houve ou não troca na última iteração: se não houve, o vetor já está ordenado ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 22 de 35 Algoritmo: Método de troca e partição (QuickSort) • O Quicksort é o algoritmo mais rápido para ordenação interna conhecido para uma grande quantidade de situações, sendo por isso o mais utilizado entre todos os algoritmos de ordenação • Princípio 1. Dividir o problema de ordenar um conjunto de n itens em dois problemas menores 2. Ordenar independentemente os problemas menores 3. Combinar os resultados para produzir a solução do problema maior • Procedimento Algoritmo QuickSort 1. Escolher arbitrariamente um item do vetor e colocar este valor em x 2. Percorrer o vetor a partir da esquerda até que um item A[i] x é encontrado; da mesma maneira, percorrer o vetor a partir da direita até que um item A[j] x é encontrado; 3. Como os itens A[i] e A[j] não estão na ordem correta no vetor final, eles devem ser trocados 4. Continuar o processo (de partição) até que os índices i e j se cruzem em algum ponto do vetor • Ao final do processo, o vetor A[Esq..Dir] está particionado em dois seguimentos: 5. Os itens em A[Esq], A[Esq+1],..., A[j] são menores ou iguais a x 6. Os itens em A[i], A[i+1],..., A[Dir] são maiores ou iguais a x • Após obter os dois segmentos do vetor pelo processo de partição, executamos este processo em cada segmento de forma recursiva até que todo o vetor esteja ordenado Exemplo de Partição • O pivô é escolhido como sendo A[(i+j) div 2] • Inicialmente, i=1 e j=6, e então x=A[3] = D • A varredura a partir da posição 1 pára no item O e a varredura a partir da posição 6 pára em A, sendo os dois itens trocados • A varredura a partir da posição 2 pára em R e a varredura a partir da posição 5 pára no item D, e então os dois itens são trocados • Neste instante i e j se cruzam (i=3 e j=2), o que encerra o processo de partição ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 23 de 35 Procedimento Ordena (após Partição) Implementação do algoritmo Program QuickSort; Type v = array[1..6] of String[1]; Var A: v; i, j: Integer; Procedure Particao(Esq,Dir: Integer); var MEIO, X: String[1]; Begin i := Esq; j:= Dir; MEIO:= A[(i+j) div 2]; {obtenção do meio} Repeat; while MEIO > A[i] do i:=i+1; while MEIO < A[j] do j:=j-1; If I <= j Then Begin X := A[i]; A[i]:= A[j]; A[j]:= X; i:=i+1; j:=j-1; End; until i>j; If Esq < j Then Particao(Esq,j); If i < Dir Then Particao(i,Dir); end; Begin For I := 1 to 6 do Begin Write('Digite um número: '); Readln(A[I]); End; For I := 1 to 6 do Write(I,':',A[I]:2,' '); writeln; Particao(1,6); For I := 1 to 6 do Write(I,':',A[I]:2,' '); readln; End. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 24 de 35 5.4 – Ordenação por seleção Algoritmo: Método de Seleção direta (Selection Sort) • Um dos algoritmos mais simples • Mais recomendado para conjuntos pequenos • Procedimento: o Selecione o elemento com a chave de menor valor o Troque-o com o com o primeiro elemento da sequencia o Repita essas operações com os n-1 elementos restantes, depois com os n-2 elementos e assim sucessivamente até restar um só elemento, o maior deles. Implementação do algoritmo Program Selecao_Direta; Type v=array[1..6] of string[1]; Var A: v; X: String[1]; I, J, K: Integer; Begin For I := 1 to 6 do Begin Write('Digite uma letra: '); Readln(A[I]); End; For I := 1 to 6 do Write(I,':',A[I]:2,' '); Writeln; For I:=1 to 6 do {Selecao_Direta} Begin K := I; {Posição a ser ordenada} X := A[I]; For J:=I+1 to 6 do If (A[J] < X) Then Begin K := J; {Posição a ser trocada} X := A[K]; End; A[K] := A[I]; {Troca} A[I] := X; End; For I := 1 to 6 do Write(I,':',A[I]:2,' '); Readln; End. • Exemplo ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 25 de 35 5.5 – Exercícios 1. Faça a ordenação do vetor abaixo com cada um dos quatro algoritmos de ordenação que estudamos. Vetor = { 4, 8, 2, 3, 7} Obs: Crie quatro programas Pascal, um para cada método. 2. Faça um programa Pascal que preencha um vetor com dez números inteiros, calcule e mostre o vetor resultante de uma ordenação decrescente. Exemplo: Números lidos: 3 5 4 2 1 6 8 7 11 9 Vetor Ordenado: 11 9 8 7 6 5 4 3 2 1 3. Faça um programa Pascal que preencha um vetor com vinte números inteiros, calcule e mostre o vetor resultante de uma ordenação crescente. Em seguida leia um número que exista no vetor e usando a pesquisa binária, imprima o seu índice no vetor. 4. Compare cada um dos métodos de ordenação que estudamos, quanto o seu desempenho e diga, em quais situações (em relação ao tamanho do conjunto de dados a ordenar) devemos escolher cada um. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 26 de 35 Capítulo VI 6 – Arquivos. 6.1 – Definição: No item 3.4 do capítulo anterior, criamos uma agenda colocando registros em cada um dos 10 elementos de um vetor, cada registro com 2 campos: “Nome” e “Telefone”. Assim, criamos uma tabela na memória principal onde podemos guardar dados de até 10 pessoas enquanto o programa estiver executando e o computador estiver ligado. Se guardarmos estes mesmos registros, de cada pessoa, em uma memória secundaria: HD, CD, DVD, Pen Drive, etc..., temos um “Arquivo”. Um arquivo é formado por um conjunto de registro e fica armazenado em uma memória secundária. As vantagens são: não possui número fixo de registros, o limite é o espaço disponível na memória secundária; quandoo programa termina a sua execução o arquivo continua a existir, podendo ser usado por outros programas e até em outros computadores. Temos ainda arquivos formados por textos ou por um único dado de um tipo básico, porém trabalharemos com Arquivos formados por registros por serem os mais utilizados. Exemplo 1: Representamos graficamente um arquivo como uma tabela formada por registros, semelhante as tabelas descritas no item 3.4, como abaixo. A diferença é que agora, este conjunto de registro ficará guardado em uma memória secundária, sendo chamado de “Arquivo”. Temos então o Arquivo “AGENDA”: AGENDA Nome Telefone 0 José Maria da Silva 23293454 1 Maria José da Silva 23236789 2 3 . . . . . . . . . n 6.2 – Declarando um arquivo: Um arquivo fica armazenado em uma memória secundária com seus dados guardados em forma de registros. Estes registros são chamados de registros físicos e o arquivo, de arquivo físico, possui um nome (nome do arquivo físico) e fica dentro de uma pasta do Sistema Operacional. Para criarmos uma independência entre o programa que usará o arquivo físico e próprio arquivo, criamos um nome para o arquivo dentro do programa, arquivo lógico, e associamos este nome ao nome do arquivo que está em memória secundária, arquivo físico. Então temos que criar o nome lógico para o arquivo associando este nome a um registro que ficará na memória principal e terá o mesmo formato do registro do arquivo físico. A cada operação de “Leitura” no arquivo, um registro físico será transferido para o correspondente registro lógico que está na memória e só a partir deste instante teremos acesso aos seus campos. O processador não enxerga um campo diretamente na memória secundária. O processo inverso será realizado para gravarmos um registro físico no arquivo, ou seja, transferimos um registro lógico, completo, da memória principal para o registro corrente do arquivo físico na memória secundária. Formato: Arquivo “Identificador 1”, ... , “Identificador n” de “nome do registro”; Identificador: é o nome lógico do arquivo no programa. 1 - Como vimos, a estrutura ao lado seria uma “Tabela” se guardarmos os registro em um vetor na memória principal. Porém como está guardada em uma memória secundária, chamamos de Arquivo. 2 - Em Banco de Dados, a estrutura que aqui chamamos de “Arquivo”, é chamada de “Tabela” ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 27 de 35 Exemplo 1: Declaração do Arquivo Agenda. Tipo ragen = registro Caracter: Nome; Inteiro: Tel; Fim-registro; Arquivo: AGENDA de ragen; 6.3 – Usando Arquivos: 6.3.1 – Novos comandos: Para que um programa possa usar um arquivo físico, temos que fazer a ligação entre os dois através do nome lógico criado pelo tipo “Arquivo”, que será o nome do arquivo, ou apelido, no programa. O comando que realizará esta tarefa é o comando “Abra”, no algoritmo só usamos o nome lógico do arquivo. Formato: Abra (“Identificador 1”, ... , “Identificador n”); Identificador: é o nome lógico do arquivo no programa. Após a execução do comando “Abra” o ponteiro do arquivo estará apontando para o primeiro registro do arquivo que é o registro “0”. Isto significa que podemos acessar os dados deste registro trazendo seus campos para o registro lógico que criamos na memória principal. O comando que realizará esta tarefa é o comando “Leia”. Este comando, ao ser executado, traz para memória o registro corrente do arquivo e em seguida faz com que o ponteiro passe a apontar o registro seguinte. Formato: Leia (“Identificador 1”, “Identificador 2”); Identificador 1: é o nome do arquivo lógico no programa. Identificador 2: é o nome do registro lógico no programa. O comando “Grave” faz o contrário do “Leia”, ele copia todos os campos do registro lógico que criamos na memória principal, para o registro físico corrente do arquivo, que está na memória secundária e em seguida faz com que o ponteiro dos registros físicos do arquivo passe a apontar o registro seguinte. Formato: Grave (“Identificador 1”, “Identificador 2”); Identificador 1: é o nome do arquivo lógico no programa. Identificador 2: é o nome do registro lógico no programa. O comando “Posição” move o ponteiro do arquivo físico para uma posição, registro físico, determinada no arquivo físico, já que cada registro físico possui um número, onde o primeiro registro tem o número “0” e o número dos demais vai crescendo de um em um até o último. Formato: Posição (“Identificador 1”, “Identificador 2”); Identificador 1: é o nome do arquivo lógico no programa. Identificador 2: contém o número do registro para o qual o ponteiro apontará. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 28 de 35 A função Fda, retorna verdadeiro quando o ponteiro está posicionado no fim do arquivo físico e falso em caso contrário. Formato: Fda (“Identificador”); Identificador: é o nome do arquivo lógico no programa. A função ArqPos, retorna o número do registro físico onde o ponteiro está posicionado. Formato: ArqPos (“Identificador”); Identificador: é o nome do arquivo lógico no programa. Após usar o arquivo o programa deve liberá-lo. O comando que realizará esta tarefa é o comando “Feche”. Formato: Feche (“Identificador 1”, ... , “Identificador n”); Identificador: é o nome do arquivo lógico no programa. 6.3.2 – Operações básicas: Temos quatro operações básicas: inclusão, alteração, exclusão e consulta. - Inclusão: Novos registros são incluídos no arquivo. - Alteração: Temos que encontrar o registro que queremos alterar e copiar para memória com o comando “Leia”. Estando na memória principal, podemos alterar os campos desejados e em seguida, com o comando “Grave”, gravar no arquivo sobre o registro que fora lido, que ficará com as alterações. - Exclusão: Um registro ao ser excluído, não sai fisicamente do arquivo. O que fazemos é marcar um campo com “*” para caracterizar a sua exclusão lógica, pois ele não será mais lido apesar de continuar no arquivo. O que fazemos é uma alteração. - Consulta: Encontramos o registro que queremos consultar e copiamos o seu registro físico para o registro lógico correspondente na memória usando o comando “Leia”. A forma de trabalhar com um arquivo depende, do modo como está organizado. As duas formas básicas de organizar um arquivo são as organizações: seqüencial e direta. 6.3.3 – Organização sequêncial: Um arquivo está organizado sequencialmente quando os seus registros são gravados continuamente, um após o outro. Este tipo de arquivo é normalmente acessado sequencialmente e os novos registros são incluídos sempre após o último ou em registro marcado como excluído. A exclusão de um registro é uma exclusão lógica, pois marcamos um campo com “*” para que ele não seja mais “lido”. Usando o nosso arquivo “AGENDA”, passamos a escrever os algoritmos que executam as operações básicas: ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 29 de 35 Exemplo 1: Inclusão Algoritmo Arq_Inclui; {Inclui um novo registro físico no final do arquivo a partir de dadosdigitados ou emite uma mensagem de erro caso o registro já exista no arquivo} Tipo ragen = registro Caracter: Exc, Nome; Inteiro: Tel; Fim-registro; Arquivo: AGENDA de ragen; ragen: AG; ragen: ENT; Inicio Abra(AGENDA); Leia(ENT.Nome); Leia (AGENDA, AG); Enquanto Não Fda(AGENDA) e (AGENDA.Nome <> ENT.Nome ou AGENDA.Exc = “*”) faça Leia (AGENDA, AG); Fim-Enquanto; Se AGENDA.Nome = ENT.Nome e AGENDA.Exc <> “*” Então Imprima(“Nome: “, ENT.Nome, “ já existe”); Senão Leia(ENT.Tel); AG.Tel ENT.Tel; AG.Exc “ “; Grave (AGENDA, AG); Fim-Se; Feche(AGENDA); Fim; Exemplo 2: Consulta Algoritmo Arq_Consulta; {Consulta o número do telefone se a pessoa está cadastrada, emite mensagem em caso contrário} Tipo ragen = registro Caracter: Exc, Nome; Inteiro: Tel; Fim-registro; Arquivo: AGENDA de ragen; ragen: AG; ragen: CON; Inicio Abra(AGENDA); Leia(CON.Nome); Leia (AGENDA, AG); Enquanto Não Fda(AGENDA) e (AGENDA.Nome <> CON.Nome ou AGENDA.Exc = “*”) faça Leia (AGENDA, AG); Fim-Enquanto; Se AGENDA.Nome = CON.Nome e AGENDA.Exc <> “*” Então Imprima (AG.Nome, AG.Tel); Fim-Se; Feche(AGENDA); Fim; ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 30 de 35 Exemplo 3: Alteração Algoritmo Arq_Altera; {Altera o número do telefone em um registro físico a partir de dados digitados, se a pessoa está cadastrada, emite mensagem em caso contrário} Tipo ragen = registro Caracter: Exc, Nome; Inteiro: Tel; Fim-registro; Arquivo: AGENDA de ragen; ragen: AG; ragen: ALT; caracter: SN; Inicio Abra(AGENDA); Leia(ALT.Nome); Leia (AGENDA, AG); Enquanto Não Fda(AGENDA) e (AGENDA.Nome <> ALT.Nome ou AGENDA.Exc = “*”) faça Leia (AGENDA, AG); Fim-Enquanto; Se AGENDA.Nome = ALT.Nome e AGENDA.Exc <> “*” Então Imprima (AG.Nome, AG.Tel); Imprima (“Deseja alterar o número do telefone? – S/N”); Leia (SN); Se SN = “S” or SN = “s” Então Leia(ALT.Tel); AG.Tel ALT.Tel; Posição(AGENDA, ArqPos(AGENDA) - 1); Grave (AGENDA, AG); Fim-Se; Senão Imprima(“Nome: “, ALT.Nome, “ não existe”); Fim-Se; Feche(AGENDA); Fim; ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 31 de 35 Exemplo 4: Exclusão Algoritmo Arq_Exclui; {Realiza uma exclusão lógica de um registro, marcando o registro como excluído, colocando um “*” no campo “Exc”} Tipo ragen = registro Caracter: Exc, Nome; Inteiro: Tel; Fim-registro; Arquivo: AGENDA de ragen; ragen: AG; ragen: ALT; Inicio Abra(AGENDA); Leia(ALT.Nome); Leia (AGENDA, AG); Enquanto Não Fda(AGENDA) e (AGENDA.Nome <> ALT.Nome ou AGENDA.Exc = “*”) faça Leia (AGENDA, AG); Fim-Enquanto; Se AGENDA.Nome = ALT.Nome e AGENDA.Exc <> “*” Então Imprima (AG.Nome, AG.Tel); Imprima (“Deseja excluir? – S/N”); Leia (SN); Se SN = “S” or SN = “s” Então AG.Exc “*”; Posição(AGENDA, ArqPos(AGENDA) - 1); Grave (AGENDA, AG); Fim-Se; Senão Imprima(“Nome: “, ALT.Nome, “ não existe”); Fim-Se; Feche(AGENDA); Fim; 6.3.4 – Organização direta: Os registros de um arquivo são numerados sequêncialmente a partir de “0”, ou seja, cada registro fica identificado por um número que representa a sua posição em relação ao primeiro registro mais 1. Exemplo: O registro de número 4 é o 5º registro do arquivo, já que o primeiro é o de número 0. Temos que 4 + 1 = 5 O comando Posição (“Identificador 1”, “Identificador 2”) posiciona o ponteiro do arquivo cujo nome esta em “Identificador 1” no registro cujo número esta em “Identificador 2”. Desta forma, podemos acessar diretamente um registro. Para acessarmos os registros de um arquivo da forma direta ou randômica, temos que projetá-lo para isto e dizemos que ele é um arquivo de organização direta. Ao projetarmos um arquivo de organização direta, temos que criar, para cada registro, uma chave que será formada por um número que o identifique e que será o mesmo número do registro físico onde se encontra. Exemplo: Tomemos por exemplo uma empresa que dá para os seus funcionário códigos seqüenciais a partir de 1, sem se repetir. O “código do Funcionário” será a chave do registro e sempre que o usarmos no comando “Posição” encontraremos os dados do funcionário no registro que possui número igual ao da chave. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 32 de 35 Exemplo 1: Inclusão Algoritmo Arq_Inclui; {Inclui um registro, todos os seus campos, em um arquivo de acesso direto} Tipo rfun = registro Caracter: Exc, Nome; Inteiro: Cod; Real: Salario; Fim-registro; Arquivo: FUNC de rfun; rfun: ENT; Inicio Abra(FUNC); Leia(ENT.Cod, ENT.Nome, ENT.Salário); ENT.Exc “ “; Se ENT.Cod > 0 Então Posição(FUNC, ENT.Cod); Guarde(FUNC, ENT); Fim-Se; Feche(FUNC); Fim; Exemplo 2: Consulta Algoritmo Arq_Consulta; {Consulta um registro em arquivo de acesso direto} Tipo rfun = registro Caracter: Exc, Nome; Inteiro: Cod; Real: Salário; Fim-registro; Arquivo: FUNC de rfun; rfun: FUN, CON; Inicio Abra(FUNC); Leia(CON.Cod); Posição(FUNC, CON.Cod); Leia (FUNC, FUN); Se FUN.Exc = “ “; Então Imprima(FUN.Cod, FUN.Nome, FUN.Salário); Senão Imprima(“Registro excluído”); Fim-Se; Feche(FUNC); Fim; Exemplo 3: Altera Algoritmo Arq_Altera; {Altera campos de um registro em arquivo de acesso direto} Tipo rfun = registro Caracter: Exc, Nome; Inteiro: Cod; Real: Salário; Fim-registro; Arquivo: FUNC de rfun; rfun: FUN, ALT; caracter: SN; ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 33 de 35 Inicio Abra(FUNC); Leia(ALT.Cod); Posição(FUNC, ALT.Cod); Leia (FUNC, FUN); Se FUN.Exc = “ “; Então Imprima(FUN.Cod, FUN.Nome, FUN.Salário);Imprima (“Deseja alterar? – S/N”); Leia (SN); Se SN = “S” or SN = “s” Então Leia(ALT.Nome, ALT.Salário); Se ALT.Nome <> “ “ Então FUN.Nome ALT.Nome; Fim-Se; Se ENT.Salário <> “ “! Então FUN. Salário ALT. Salário; Fim-Se; Posição(FUNC, FUN.Cod); Grave (FUNC, FUN); Fim-Se; Senão Imprima(“Registro excluído”); Fim-Se; Feche(FUNC); Fim; Exemplo 4: Exclui Algoritmo Arq_Exclui {Exclui logicamente um registro em arquivo de acesso direto} Tipo rfun = registro Caracter: Exc, Nome; Inteiro: Cod; Real: Salário; Fim-registro; Arquivo: FUNC de rfun; rfun: FUN, EXC; caracter: SN; Inicio Abra(FUNC); Leia(EXC.Cod); Posição(FUNC, EXC.Cod); Leia (FUNC, FUN); Se FUN.Exc “ “; Então Imprima(FUN.Cod, FUN.Nome, FUN.Salário); Imprima (“Deseja excluir? – S/N”); Leia (SN); Se SN = “S” or SN = “s” Então FUN.Exc “*”; Posição(FUNC, EXC.Cod); Grave (FUNC, FUN); Fim-Se; Senão Imprima(“Código: “,FUN.Cod, “ não existe”); Fim-Se; Feche(FUNC); Fim; ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 34 de 35 6.4 – Exercícios 1 – Acrescente o campo “Sexo” no Arquivo Agenda. Faça um algoritmo que lê sequencialmente cada registro do Arquivo Agenda e crie dois outros arquivos: um com as pessoas do sexo masculino e o outro com as do sexo feminino. 2 – Faça um algoritmo que imprima todos os registros de cada um dos arquivos criados no exercício anterior. 3 – Faça um algoritmo que lê sequencialmente um arquivo de clientes de uma loja que está desordenado e inclui cada registro lido, randomicamente, em um novo arquivo criado no programa. Ambos os arquivos têm o código do cliente como chave e possui os campos: Código (inteiro), Nome (caracter), Telefone (inteiro), Endereço (caracter). O novo arquivo estará ordenado pelo código do cliente. 4 – Faça um algoritmo que lê sequencialmente o arquivo criado no exercício anterior e cria um novo arquivo que conterá todos os registro do arquivo de Clientes mais os dados de um novo cliente que será lido pelo teclado. O novo arquivo continuará ordenado pelo código do cliente. 5 – Refaça o algoritmo do exercício anterior fazendo a inclusão do novo registro randomicamente. ESTRUTURAS DE DADOS I Roberto Luís M. P. Castro Página 35 de 35 Bibliografia FARRER, H. et al. Algoritmos Estruturados, Rio de Janeiro: L TC, 1999. FORBELLONE, André Luiz Villar, EBERSPACHER, Henri Frederico. Lógica de Programação. São Paulo, SP: Makron Books, 2000. GUIMARÃES, Angelo M., LAGES, Newton A.C. Algoritmos e Estrutura de dados. Rio de Janeiro, RJ: LTC, 1994. MANZANO, José Augusto N. G., YAMATUMI, Y. Wilson, Programando em Turbo Pascal 7.0: guia prático de orientação e desenvolvimento. São Paulo, SP: Érica, 2001 PINTO, Wilson S.. Introdução ao Desenvolvimento de Algoritmos e Estrutura de Dados. São Paulo, SP: Érica, 1990. SZWARCFITER, J. Luiz e MARKENZON, Lilian. Estrutura de Dados e seus Algoritmos. Editora LTC, 1997. VELOSO, Paulo. Estruturas de Dados. Editora Campus, 1998. VILLAS, M. V. et al. Estrutura de dados: conceitos e técnicas de implementação. Rio de Janeiro: Campus, 1993.
Compartilhar