GOVERNO FEDERAL Presidência da Rebública Federativa do Brasil Dilma Vana Roussef Mininstério da Educação Fernando Haddad Secretaria de Educação a Distância Carlos Eduardo Bielschowsky
GOVERNO ESTADUAL Governo do Estado de Goiás Marconi Ferreira Perillo Júnior Secretaria Estadual de Educação Thiago Mello Peixoto da Silveira UNIVERSIDADE ESTADUAL DE GOIÁS – UEG PARCERIA COM UNIVERSIDADE UNI VERSIDADE ABERTA DO BRASIL BRASI L – UAB Reitoria UEG Luiz Antônio Arantes Vice-reitoria Eliana Maria França Carneiro
Coordenação de Tecnologia e Sistemas EaD Noeli Antônia Pimentel Coordenação de Produção Pedagógica Pollyana dos Reis Pereira Fanstone Coordenação de Análise de Consistência Gislene Lisboa de Oliveira Coordenação do Curso de Licenciatura em Informática Joyce Siqueira Coordenação de Tutoria Noeli Antonia Pimentel Diagramador Maelno Martins freitas Webdesigner Eder Coelho da Silva Instrucional Designer Leíze Oliveira Dias Bruno Carvalho Revisão de Texto Tiago Chaves Martins
Pró-reitoria de Graduação Maria Elizete de Azevedo Fayad Pró-reitoria de Extensão, Cultura e Assuntos Estudantis Pró-reitoria Danúsia Arantes Ferreira Batista de Oliveira Pró-reitoria de Planejamento, Gestão e Finanças Gerson Sant’Ana Núcleo de Seleção Eliana Machado Pereira Nogueira
UNIDADE UNIVERSITÁRIA DE EDUCAÇÃO A DISTÂNCIA Diretoria Francisco Alberto Severo de Almeida Coordenação Geral UnUEAD Diany Durães Rodrigues
CRÉDITOS DE AUTORIA Professor Conteusdista Francisco Ramos de Melo Revisão de Texto Nicolina Bollella Revisão de Conteúdo Noeli Antônia Pimentel Programação Visual Ana Flávia Batista Coelho Martins
Coordenação Adjunta UAB Valnides Araújo da Costa Coordenação Administrativa Ademilde Alves do Amaral Prado Coordenação de Projetos Especiais Neyde Maria Silva Coordenação Pedagógica de Tutoria Eude de Sousa Campos
© Copyright – UnUEAD 2011 É proibida a reprodução, mesmo que parcial, por qualquer meio, sem autorização escrita dos autores e do detentor dos direitos autorais.
Sore o Curso de Licenciatura em Informática O curso de Licenciatura em Informática na modalidade de Educação a Distância é um projeto piloto que visa oferecer gratuitamente à sociedade um curso de qualidade com a conveniência do estudo a distância, desenvolvido numa perspectiva centrada no aluno. Este curso faz parte do Projeto Universidade Aberta do Brasil – UAB – que foi criado pelo Ministério da Educação, em 2005, no âmbito do Fórum das Estatais pela Educação, para a articulação e integração de um sistema nacional de educação superior a distância, em caráter experimental, visando sistematizar as ações, programas, projetos e atividades denidas pelas políticas públicas voltadas para a de ampliação e a interiorização da oferta do ensino superior gratuito e de qualidade no Brasil. Tem como público alvo qualquer cidadão que concluiu a Educação Básica, e que foi aprovado no Processo Seletivo, atendendo aos requisitos exigidos pela instituição pública vinculada ao Sistema Universidade Aberta do Brasil – UAB. O curso tem como objetivo formar e aprimorar professores para atuar nas escolas de ensino fundamental, médio e prossional. Destina-se à formação de professores capazes de reunir não só conhecimentos especícos da área de informática, mas também do magistério em geral, oferecendo uma sólida formação básica, sempre articulada à prática pedagógica, no sentido de assegurar ao futuro professor uma visão de globalidade do processo educativo.
SUMÁRIO UNIDADE 1 FUNDAMENTOS DE DADOS 1 - CONCEITOS DE DADOS 1.1 - DADO 1.2 - INFORMAÇÃO 1.3 - ABSTRAÇÃO DE DADOS 1.4 - PROCESSAMENTO DE DADOS E ALGORITMOS 1.5 - DADOS CONSTANTES E VARIÁVEIS 2 - TIPOS DE DADOS 2.1 – Dados Primitivos 2.1.1 - TIPO NUMÉRICO 2.1.2 - TIPO ALFANUMÉRICO 2.1.3 - TIPO LÓGICO UNIDADE 2 ESTRUTURAÇÃO DE DADOS 1 - ESTRUTURAS DE DADOS 1.1 - PARA QUE ESTRUTURAR DADOS? 2 - ESTRUTURAS DE DADOS ESTÁTICAS 2.1 - Estruturas Homogêneas 2.1.1 - VETOR 2.1.1.1 - NOÇÃO INTUITIVA DE VETOR 2.1.1.2 - DEFINIÇÃO DE VETOR 2.1.1.3 - Manipulação de Vetores 2.1.1.4 - ATRIBUIÇÃO DE VALORES NO VETOR 2.1.1.5 - LEITURA DE VALORES DO VETOR 2.1.1.6 - OPERAÇÕES COM VALORES DO VETOR 2.1.2 - Noção Intuitiva de Matriz 2.1.2.1 - DECLARAÇÃO DA MATRIZ COMO VARIÁVEL 2.2 - Estruturas Heterogêneas 2.2.1 - REGISTRO 67 2.2.1.1 - DECLARAÇÃO DO REGISTRO COMO VARIÁVEL 2.2.1.2 - MANIPULAÇÃO DOS DADOS DO REGISTRO 2.2.1.3 - CONJUNTO DE REGISTROS 2.2.2 - ARQUIVOS 75 2.2.2.1 - DECLARAÇÃO DE ARQUIVOS 2.2.2.2 - ORGANIZAÇÃO DE ARQUIVOS 2.2.2.3 - MANIPULAÇÃO DE ARQUIVOS 3 - ESTRUTURAS DE DADOS DINÂMICAS 3.1 - LISTAS 3.2 - FILAS 3.3 - PILHAS 3.4 - ÁRVORES UNIDADE 3 APLICAÇÕES 1 - APLICAÇÕES DE ESTRUTURA DE DADOS 2 - ORDENAÇÃO 2.1 - Ordenação de vetores 3 - BUSCA 3.1 - MELHORANDO O PROCESSO DE BUSCA 3.2 - BUSCA EM LARGURA 3.3 - BUSCA EM PROFUNDIDADE
11 11 13 15 16 18 22 22 23 24 26
35 35 42 42 45 45 47 49 50 50 51 55 60 66 68 72 73 76 77 77 84 87 89 90 92
100 103 106 113 117 126 127
Caro estudante, vamos iniciar uma nova e importante disciplina para o nosso curso, a disciplina Estrutura de Dados. Esta disciplina tem como objetivo promover a compreensão das formas de organização de dados para atender as necessidades de fornecimento da informação. Apesar das técnicas parecerem complexas, na realidade elas buscam simplicar a manipulação dos dados para disponibilizar a informação. Para estabelecer o conhecimento necessário, a Unidade I fará uma breve revisão dos fundamentos de dados. Nesta unidade serão revisados alguns conceitos importantes para o entendimento da disciplina. A unidade terá a preocupação maior com os conceitos. As denições em algoritmos ou linguagem de programação não serão trabalhados neste momento. Qualquer duvida quanto a estas representações basta consultar o material já trabalhado nas disciplinas de Lógica Matemática e Programação de Computadores. Na Unidade II são apresentadas as técnicas de estruturação estática e uma introdução às técnicas de estruturação dinâmica. Finalmente, a Unidade III apresenta as aplicações que envolvem a organização estruturada de dados para prover a administração da informação. O material foi organizado em uma linguagem simples para facilitar o entendimento dos processos e técnicas. A medida que você sentir segurança no entendimento do material, recomendamos que você procure a bibliograa de referência para aprofundar seus conhecimentos. Esperamos que você aproveite o máximo possível o conhecimento e qualquer dúvida não hesite em buscar ajuda da equipe do Curso.
UNIDADE 1 Fundamentos de Dados
FUNDAMENTOS DE DADOS
1 Estrutura de Dados Curso de Licenciatura em Informática
9
UNIDADE 1 Fundamentos de Dados
INTRODUÇÃO Nesta unidade estamos iniciando o estudo dos fundamentos e tipos de dados. Os fundamentos de dados envolvem os conceitos que nos levam a compreender uma visão do mundo e estabelecer os parâmetros que definem esta visão. Os tipos de dados envolvem a classificação básica dos dados. Esta classificação envolve a definição dos tipos primitivos (básicos) dos dados. Nesta unidade iremos entender os conceitos básicos e essenciais para o nosso estudo. Muitos destes conceitos são abordados em disciplinas como Lógica de Programação. O correto entendimento dos conceitos apresentados nesta unidade é essencial para melhor representar a realidade problema e permitir estabelecer padrões que serão necessários para estabelecer a informação. Como estes conceitos são fundamentais e importantes para a compreensão das estruturas mais avançadas de dados, é necessário ter bem fundamentado estes conceitos. Assim, vamos dedicar uma parte do nosso estudo para termos firmeza no desenvolvimento dos conceitos mais complexos envolvidos na matéria. No nal da unidade há uma série de exercícios, por meio dos quais poderemos vericar o nosso grau de entendimento da matéria apresentada. Esta Unidade tem por objetivo: • Apresentar os conceitos e terminologias envolvendo estrutura de dados • Estudar os tipos primitivos de dados e sua utilização • Entender os conceitos básicos e tipos primitivos de dados por meio do estudo dos fundamentos
Estrutura de Dados Curso de Licenciatura em Informática
10
UNIDADE 1 Fundamentos de Dados
1 - CONCEITOS DE DADOS 1.1 - DADO Antes de iniciar o estudo de estrutura de dados é importante denir o que dado. Para construir esta denição vamos observar alguns exemplos: Eemplo 1.1 • Acasaqueestouprocurandoéazul • OrefrigerantecustaR$2,70.
No primeiro exemplo a casa tem uma característica: a cor azul. O segundo exemplo indica a característica preço do refrigerante: R$2,70. Cada um dos exemplos mostra algo que da um nome ou valor para um objeto, característica ou armação. Este algo é o dado. Assim podemos entender que o dado é uma característica de um objeto.
O dado é uma característica de um objeto.
Podemos observar no exemplo 1.1 que cada dado está relacionado com um objeto. Assim, podemos organizar o exemplo 1.1 e estabelecer o seguinte quadro:
Exemplo
Objeto
A casa que estou procurando é azul O refrigerante custa R$2,70
Dado Nome
Valor
Casa
Cor
Azul
Refrigerante
Preço
R$2,70
A partir deste quadro podemos estabelecer algumas conclusões que nos ajudarão na tarefa de denir como é o dado
Estrutura de Dados Curso de Licenciatura em Informática
11
UNIDADE 1 Fundamentos de Dados
• Um dado sempre está relacionado a alguma coisa (ojeto) de forma eplicita ou implícita. valor. • O dado é composto por dois componentes: nome e valor.
Na estruturação de um problema ou algoritmo denimos as coisas (objetos) que estarão presentes no problema. Após a denição do objeto passamos a estabelecer as características do objeto (nome do dado). Em seguida atribuímos valores para as características.
EXERCÍCIO RESOLVIDO 1 1) Estaeleça os dados para o seguinte prolema:
• Identicar os empregados e seus respectivos salários. Solução:
1º passo: Identicar o objeto a que estarão relacionados os dados Empregado 2º passo: Identicar as características e estabelecer nomes Nome, Salário 3º passo: Atribuir valores para os dados Nome = Chico Bento , Salario Salario = R$ 1200,00
EXERCÍCIOS DE FIXAÇÃO 1) Saer onde está localizada uma casa (Estado, cidade, rua e numero), qual o valor do aluguel, quantos cômodos ela tem e qual a cor da fachada. 2) Pr Preen eench cher er a do docu cumen menta taçã ção o de um ca carr rro o qu que e c car ará á em um uma a da das s va vaga gas s de estacionamento da loja (Qual vaga?; Modelo, cor, ano e faricante do carro; proprietário; hora que o carro entrou no estacionamento).
3) Venda de um produto. 4) Elaore um prolema e estaeleça e staeleça os dados.
Estrutura de Dados Curso de Licenciatura em Informática
12
UNIDADE 1 Fundamentos de Dados
1.2 - INFORMAÇÃO O dado de forma isolada não tem sentido algum ou utilidade. Para que o dado tenha alguma utilidade é necessário que ele esteja contextualizado. Contextualizar o dado signica avaliar o dado conforme um objetivo. O resultado desta avaliação é a informação.
Informação é o dado ou dados contetualizados conforme um ojetivo.
Observe a seguinte situação: • Vendas da Loja1 = R$5000,00 e Vendas da Loja2 = R$10.000,00
Os valores são apenas dados de venda ve nda de cada loja. Agora vamos estabelecer um quadro com objetivos para estes dados e ver as informações que os dados podem fornecer fornec er..
Objetivo
I n f o r maç ão
Qual loja teve o maior volume de vendas
Loja 2
Sendo a metas de venda da Loja1 = R$1000,00 e da loja2 R$20.000,00, quais lojas atingiram a meta
Apenas a Loja 1
Conforme as metas, qual loja tem melhor per formance
Loja1
Conforme as metas qual loja precisa ser reorganizada
Loja 2
Conforme pode ser observado no quadro, os mesmos dados podem fornecer diferentes informações conforme o objetivo na utilização dos dados. d ados. A informação é o dado transformado conforme o objetivo. Esta transformação pode resultar em novos dados ou no mesmo dado. Observe o exemplo:
Estrutura de Dados Curso de Licenciatura em Informática
13
UNIDADE 1 Fundamentos de Dados
Eemplo 1.2 • Vendas da Loja1 = R$5.000,00 e • Vendas da Loja2 = R$10.000,00 Ojetivo: Qual o valor vendido pela Loja1? Informação: R$ 5.000,00 (a informação é igual ao dado da Loja1) Ojetivo: Qual o valor total de vendas das lojas? Informação: R$ 15.000,00 (a informação é o resultado da soma dos dados) Ojetivo: Qual loja vendeu mais Informação: Loja2 (a informação retorna o objeto cujo dado foi comparado com o mesmo dado de outro objeto)
EXERCÍCIO RESOLVIDO 2
1) Estaeleça o que é dado e o que é informação nas frases: “Nestemodelodeautomóvelovermelhocamaisbonitodoqueoamarelo”e indique a relação de transformação dado/informação. Solução:
1º passo: Identicar o que é dado Vermelho e amarelo são características de cor, cor, portanto são dados d ados 2º passo: Identicar objetivos ou resultado de operações sobre os dados O objetivo é estabelecer qual cor do automóvel ca mais bonita no modelo. Para isto foi comparado os dados de cores de cada carro que retornou a informação “vermelho” 3º passo: Entender a relação de transformação A informação é igual ao dado. A transformação foi apenas uma comp aração
Estrutura de Dados Curso de Licenciatura em Informática
14
UNIDADE 1 Fundamentos de Dados
EXERCÍCIOS DE FIXAÇÃO 2) O noteook é mais leve do que o computador de mesa. 3) Mario é mais alto que Maria. 4) O telefone da Ana é 5555-1234 5) Faça um eemplo para dado/informação.
1.3 - ABSTRAÇÃO DE DADOS Em computação, um ponto importante na denição de um dado é a abstração do mesmo. A abstração do dado permite estabelecer uma relação de um ou mais conceitos com as coisas do mundo real. Um exemplo de abstração de dados é a nossa interação com o mundo. Isto quer dizer que percebemos o mundo com os nossos sentidos. Esta percepção é passada para o cérebro que irá processar cada estimulo e estabelecer uma resposta. Esta resposta pode ser a identicação de algo ou uma ação. A Figura 1 ilustra como isto acontece:
Figura 1: Abstração de dados
A operação realizada pelo cérebro humano é muito complexa e faz análise de muitos dados existentes no objeto visualizado para emitir uma resposta. Podemos dizer que você ao olhar o objeto pode identicar algumas características distintas, como por exemplo: que é uma casa (verdadeiro – lógica), tem quatro janelas (quantidade), a cor da casa é preta (nome da cor), etc. Estas características individuais são componentes que podemos chamar de dados do objeto: tamanho, cor, quantidade, nome, etc. Cada um destes dados podem ser utilizados ou não para um determinado objetivo. Assim, combinamos os dados para abstrair um novo dado ou informação. Estrutura de Dados Curso de Licenciatura em Informática
15
UNIDADE 1 Fundamentos de Dados
Por exemplo, se queremos saber se a casa é grande ou não. Para isto faremos a análise dos dados que identicam comprimento, largura, altura, quantidade de cômodos, etc. O resultado desta análise é comparado com um dado de referência. Se o resultado da análise for maior que a referência podemos armar que a casa é grande. Veja que no exemplo apresentado os diferentes dados existentes no mundo real são representados no nosso cérebro por um dado associado a uma grandeza. Como não podemos colocar o objeto real em nosso cérebro, fazemos uma representação do mesmo que permitirá descrever o objeto ou cada uma das características que o compõe. A esta representação damos o nome de abstração. Então podemos estabelecer a seguinte denição:
Astração de dados é uma representação conceitual de algo ou alguma coisa concreta ou astrata .
1.4 - PROCESSAMENTO DE DADOS E ALGORITMOS Podemos observar que a mecânica do conceito apresentado na Figura 1 é bem semelhante ao conceito de Processamento de Dados, representado na Figura 2. O conceito de Processamento de Dados é muito importante para o nosso curso. Ele mostra um caminho para reproduzir em um computador as coisas que acontecem no mundo real.
Figura 2: Processamento de dados
Podemos então perceber que o primeiro passo para reproduzir um problema no computador, é fazer a abstração do problema. Uma importante etapa na abstração do problema é a abstração de quais são e quais os tipos estão envolvidos no problema. Isto quer dizer que para resolver um problema devemos considerar os dados sobre três aspectos: • Dados de Saída:
Como serão os dados apresentados na saída? - É o objetivo ou solução do problema.
Estrutura de Dados Curso de Licenciatura em Informática
16
UNIDADE 1 Fundamentos de Dados
• Dados de Entrada:
Quais são os dados apresentados para produzir a saída? - São os recursos iniciais para solução do problema. • Processamento:
Quais dados são necessários e o que deve ser feito para transformar os dados da entrada nos dados de saída? - É o processo de organização e estruturação dos dados É o momento de estruturar os dados e realizar o tratamento dos dados para produzir a informação ou saída. A todo instante estamos realizando estas etapas. Observe o exemplo ilustrado na Figura 3. Diante de uma determinada gura geométrica foi vericada a necessidade de saber qual a área disponível para uma determinada atividade.
Figura 3: Resolução de problema
Estudando o problema, Chico (o personagem da Figura 3) vericou que o dado a ser apresentado na saída é a área da gura geométrica. Observando a gura geométrica constatou que ela tem quatro lados com dois tamanhos distintos: um com 2 metros e outro com 4 metros. Pesquisando o livro de geometria, Chico identicou a gura geométrica como sendo um retângulo e encontrou a fórmula para calcular a área do mesmo. Com a multiplicação dos lados (dados de entrada) encontrou o tamanho da área do retângulo (dado de saída). Para não ter que fazer o processo todo novamente, Chico resolveu escrever os passos para encontrar a área do retângulo. Para isto escreveu a seqüência ilustrada na Figura 4.
Estrutura de Dados Curso de Licenciatura em Informática
17
UNIDADE 1 Fundamentos de Dados
Figura 4: Seqüência para calculo da área do retângulo 2 x 4
A seqüência descrita é uma espécie de receita para calcular a área do retângulo com lados de 2 metros e 4 metros. É interessante observar que a seqüência descreve passos bem denidos e pode ser utilizada por qualquer outra pessoa. Ela inicia com a entrada dos dados, efetua o processamento e termina com a apresentação do resultado na saída. Esta seqüência para a resolução de problemas é conhecida como Algoritmo.
Algoritmo é uma sequência lógica de passos que conduzem a solução de um prolema.
1.5 - DADOS CONSTANTES E VARIÁVEIS Ao surgir um novo retângulo com lados diferentes daquele descrito no algoritmo inicial, foi vericado que o algoritmo não servia mais para calcular o resultado pois os valores eram diferentes. Então foi reescrito um novo algoritmo para as novas dimensões. Depois outro e mais outros. Logo havia um monte enorme de algoritmos para calcular retângulos com vários tamanhos. Surgiu um novo problema: entre tantos algoritmos como encontrar o algoritmo correspondente aos tamanhos apresentados? Chico observou melhor os algoritmos e percebeu que os algoritmos eram exatamente iguais, exceto nos valores dos lados e, consequentemente, o valor da área calculada. Viu que em cada algoritmo os dados de entrada e saída tinham um valor xo. De forma mais técnica, cada algoritmo tinha dados que eram constantes para cada lado e para a área.
Estrutura de Dados Curso de Licenciatura em Informática
18
UNIDADE 1 Fundamentos de Dados
Constanteéumvalorxoparaodadorepresentado.
Como os valores eram xos, Chico resolveu trocar cada um dos valores. Para cada tamanho de lado deu o nome de Lado1 e Lado2, respectivamente. Para o valor da área, resolveu dar o nome ÁREA mesmo. Após substituir os valores pelos nomes em cada um dos algoritmos, Chico percebeu que os algoritmos caram exatamente iguais. Com pequenos ajustes, conseguiu escrever uma sequência única que poderia calcular qualquer retângulo, conforme representado na Figura 5.
Figura 5: Algoritmo para calcular área do retângulo
Com o algoritmo apresentado verica-se que é possível apresentar a área de qualquer retângulo, independente do tamanho dos lados. Para isto, basta substituir cada lado do triângulo nos nomes Lado1 e Lado2. Para saber o tamanho da área é só vericar o valor que aparece no nome área. Desta forma, os nomes Lado1, Lado2 e ÁREA podem assumir qualquer valor, conforme o tamanho do retângulo. Dado com esta característica recebe o nome de variável.
VARIÁVELéumtipodedadoquenãotemvalorxo,istoépode assumir qualquer valor.
Estrutura de Dados Curso de Licenciatura em Informática
19
UNIDADE 1 Fundamentos de Dados
O conceito de variável é muito importante na área de computação, é através deste conceito que podemos dar exibilidade aos dados de forma a resolver problemas semelhantes com uma mesma ferramenta (programa). Se o objetivo é solucionar problemas de maneira geral, é necessário entender que deve ser mudada a forma de olhar e entender os problemas. Isto signica que devemos olhar a essência dos dados apresentados. Isto signica que ao ver um número, não devemos ver o número mas o que ele representa. Esta forma de ver as coisas e os problemas está representado na Figura 6. Compare com a Figura 3 para entender as diferenças na forma de visualizar dados e problemas
. Figura 6: Visão de dados de um problema
Conforme pode ser observado, o cenário é o mesmo o que mudou foi a forma de visualizar os dados. Na primeira situação é visualizado os valores especícos apresentados. Na segunda situação é estabelecido um nome para os dados e a partir disto são associados valores a estes nomes. A segunda situação é mais abrangente e útil do que a primeira, especialmente na área de computação. Os conceitos apresentados até o momento serão muito importantes tanto para o desenvolvimento de trabalhos na área de computação como para o estudo de estrutura de dados.
Estrutura de Dados Curso de Licenciatura em Informática
20
UNIDADE 1 Fundamentos de Dados
EXERCÍCIOS DE FIXAÇÃO 1) Analise a Figura 7 e circule os dados que você está visualizando.
• • • • • • • • •
Ana Maria Feminina Solteira 1,70 m 54 Kg Caelos castanhos Olhos verdes Formada em Direito Nasceu em 15 de janeiro de 1981
Figura 7: Visão de dados de um problema
2) Apresente um nome para cada dado da Figura 7 de tal forma que possa ser utilizadoparaidenticarqualqueroutrapessoa. 3) Oserve um automóvel e selecione 5 dados de tal forma que possam ser identicadoscomvaloresdiferentesemoutrostiposdecarros. 4) Oserve uma residência e selecione 5 dados de tal forma que possam ser identicadoscomvaloresdiferentesemoutrostiposderesidências. 5) Escolha alguma coisa da sua vida cotidiana e repita os mesmos procedimentos dos eercícios 3 e 4.
Estrutura de Dados Curso de Licenciatura em Informática
21
UNIDADE 1 Fundamentos de Dados
2 - TIPOS DE DADOS Conforme dito no inicio deste texto, o dado é composto de seu nome e seu valor. Até aqui aprendemos como descrever os problemas e objetos em termos de suas características essenciais. O valor deste dado foi tratado de forma secundária, sem maiores preocupações com o seu conteúdo. De forma mais simples, podemos dizer que a preocupação maior foi estabelecer o que era o dado no sentido existencial do que valorativo. O conteúdo do dado é importante para estabelecer que tipo de informação pode ser extraída do mesmo. Para isto é necessário estabelecer quais valores podem ser inseridos no dado. Ao estabelecer os valores que o dado pode assumir, estamos estabelecendo o domínio do dado.
O DOMÍNIO DO DADO especica quais valores o dado pode assumir.
O domínio de um dado estabelece os tipos de operações e combinações que podem ser realizadas sobre o mesmo durante o processamento de forma a processar e obter outro dado ou informação.
2.1 – Dados Primitivos Cada linguagem possui vários tipos de domínios e denominações para os mesmos. Independente da denominação utilizada os dados são organizados a partir dos tipos pr imitivos de dados. O tipo primitivo de dado é a parte atômica de um dado, podendo assumir um valor dentro de um determinado domínio.
O tipo de DADO PRIMITIVO é o dado na sua forma mais ásica: é composto de um valor nico dentro de um domínio ásico.
Os domínios básicos são domínios simples como números, letras e lógico. Ao estabelecer um tipo primitivo, estamos estabelecendo o seu escopo de atuação e manipulação para o nosso processamento. Por exemplo: ao denir um dado como numérico estamos estabelecendo os valores
Estrutura de Dados Curso de Licenciatura em Informática
22
UNIDADE 1 Fundamentos de Dados
que podem ser inseridos no mesmo e com quais dados pode realizar operações. Assim, ao estabelecer que o dado é numérico não podemos colocar letras no dado e nem efetuar contas com dados que não sejam numéricos. Isto reete os ensinamentos básicos de aritmética do ensino fundamental “não se pode efetuar contas com frutas diferentes: abacate com laranjas...”. Qualquer dado ou informação, por mais complexa que seja, é elaborado a p artir dos dados primitivos. Os dados primitivos são de três tipos de natureza: numérico, caracter e lógico. Vamos entender cada um destes tipos. Para não tornar a leitura extensa, o aluno poderá rever as formas de denir os dados primitivos bem como as operações possíveis. Este material já foi disponibilizado nas disciplinas de Algoritmos e programação do nosso curso.
2.1.1 - TIPO NUMÉRICO Como o próprio nome indica, são os dados formados por números. Esta categoria é utilizada quando precisamos representar grandezas, valores, realizar as operações matemáticas. Para saber quando devemos denir um dado como numérico podemos partir de um princípio bem simples: vericar se será necessário fazer alguma conta com ele.
Eemplo 1.3 a)OsaláriodeJoãoéR$600,00
Quanto sobra ao descontar as despesas do mês? Quanto ele receberá se ganhar um aumento de 20%? b)Acasatem3quartos.
Se eu transformar uma sala em quarto, quantos quartos existirão? Se construir mais 2 quartos? c)Ocarrotem4rodas.
Se quebrar uma roda quantas carão? Quanto será gasto para reformar as rodas?
No exemplo podemos observar que a denição de um dado numérico está relacionado diretamente com a manipulação de números no sentido matemático. Então Estrutura de Dados Curso de Licenciatura em Informática
23
UNIDADE 1 Fundamentos de Dados
os dados numéricos comportam as operações matemáticas. Isto quer dizer que podemos realizar desde operações simples (somar, subtrair, multiplicar, dividir, etc) até as operações matemáticas mais avançadas. Dentro desta categoria de dado ainda podem existir duas categorias de dados: INTEIRO: o domínio é o conjunto dos números inteiros positivos e negativos (sem casa decimal), incluindo o zero. Exemplos.: 1, 2, -1, 0, 400, etc. REAL: o domínio é o conjunto dos números Reais. São os números inteiros e mais os números fracionários. Entretanto, convém notar que mesmo os números inteiros são representados com casa decimal. Exemplos: 1.0, 22.7, 0.0, -654,890, 0.4862, etc.
2.1.2 - TIPO ALFANUMÉRICO O tipo primitivo alfanumérico pode ter letras, símbolos ou números. O tipo alfanumérico pode ser um caracter apenas ou vários caracteres. Quando ele é composto por vários caracteres é denominado de String, palavra ou cadeia de caracteres. Para efeitos práticos também são considerados nesta categoria as palavras (string). String é a junção de vários caracteres formando uma palavra qualquer. Na realidade a palavra é o primeiro exemplo de uma estruturação de dados a partir de um dado primitivo. Mesmo assim, para efeitos didáticos, iremos considerar como sendo a mesma coisa. Em muitos livros e linguagens os dados caracter e string são tratados como se fossem iguais. Por este motivo também pode ser encontrada a nomenclatura Dado Alfanumérico. O tipo alfanumérico (String ou caracter) é composto por dados que manipulam caracteres e nomes. Nestes dados podem ser armazenados caracteres (A-Z, a-z), símbolos ($,#,@,&, etc). Para o tipo alfanumérico, também podem ser utilizados números e símbolos matemáticos, desde que não tenham conotação matemática. Para entender este ponto em especial, vejamos alguns casos que ilustram bem a situação: • o número de uma casa; • o número de um apartamento; • o número da placa de um carro; • o número de documento, etc. Apesar dos dados apresentados na lista serem números, eles são representados como alfanumérico. Qual o motivo da diferença ou então, quando saberemos se um dado Estrutura de Dados Curso de Licenciatura em Informática
24
UNIDADE 1 Fundamentos de Dados
deve ser numérico ou alfanumérico? Revendo o conceito que utilizamos para denir dados numéricos ca mais fácil entender: não faz sentido fazer qualquer tipo de conta com estes tipos de dados. • Não faz sentido somar os números da identidade de funcionários diferentes para descobrir de quem é a identidade resultante; •
Não adianta diminuir o numero do apartamento 302 que ca no 3º andar do outro apartamento 708 para descobrir quantos andares de diferença existem entre eles.
• Não tem como anotar a placa de um carro para calcular qual será o número da placa do próximo carro após terem passado 250 carros. Então podemos ver que, apesar da representação ser numérica, estes números na realidade são caracteres. Bem, aí vem a questão: como saber diferenciar a diferença na representação? A resposta é simples: conforme já visto nas matérias de Algoritmos e na de Programação de Computadores, dados do tipo alfanumérico são representados entre aspas (“dado” ). Assim temos:
• “Casa”,“bola”,“Animal”,“
[email protected]”,etc. • “500”,“200-100”(quenãosignica200menos100),“2>5”, “3º”, “jorge1987”,etc. Basicamente, as operações de dados que podem ser realizados com o tipo alfanumérico são: CONCATENAÇÃO ( + )
Apesar do símbolo ser parecido com a soma, o resultado desta operação é a junção de dois ou mais dados para formar um terceiro. Exemplos: “ca” + “sa” = “casa” “Ap. nº ” + “205” + “- 3º andar” = “Ap. nº 205 – 3º andar” “20” + “11” = “2011” ( e não 31 que é o resultado da soma dos números 20 e 11)
Estrutura de Dados Curso de Licenciatura em Informática
25
UNIDADE 1 Fundamentos de Dados
SUbPALAVRA (esquerda, direita, meio)
Neste tipo de operação podemos separar partes da palavra do lado direito, esquerd o ou meio da palavra. Normalmente um dos comandos indica onde a subplavra inicia e quantos caracteres serão contados. Exemplos: esquerda(“casabonita”,4)=“casa”–foramseparados4caracteresdapalavra apartirdoladoesquerdo; direita(“casabonita”,4)=“nita”-foramseparados4caracteresdapalavraa partirdoladodireito;
“20” + “11” = “2011” ( e não 31 que é o resultado da soma) Assim podemos entender que: • osdados“421”e“123”sãodiferentesdosnúmeros421e123.
Os primeiros são palavras e os últimos são números. • aoperação“421”+“563”édiferentedaoperação421+563.
“421” + “563” = “421563” 421 + 563 = 984 •
equeaoperação“421”+123nãopodeserrealizada
o primeiro dado é alfanumérico e o segundo é um número.
2.1.3 - TIPO LÓGICO O tipo lógico é um tipo especialmente importante na área de processamento de dados. Ele é formado apenas por dois valores: Verdadeiro e Falso. O tipo lógico sempre testa uma condição sobre determinado dado, frase, número ou expressão. Por exemplo: no documento de um carro tem um tipo lógico cujo nome é Seguro Pago. Como ele é um tipo lógico, o dado só pode conter o valor verdadeiro (se o seguro foi pago) ou falso (não foi pago).
Estrutura de Dados Curso de Licenciatura em Informática
26
UNIDADE 1 Fundamentos de Dados
Também podemos usar o tipo lógico para responder: FRASES:
• Chove hoje? • O depósito foi efetuado? • Mário é alto? ExPRESSõES ARITMÉTICAS:
• (2+2) = 4 ? (verdadeiro) • (2+2) = (2 X 2) ? (verdadeiro) • 2+ 1 = 5 ? (falso) COMPARAR PALAVRAS OU NúMEROS (desde que sejam do mesmo tipo):
• 2 > 3 (verdadeiro) • 500 = 100 (falso) • “casa” = “casca” (falso) • “5” = “4+” (falso) Pelos exemplos mostrados e relembrando os conceitos apresentados na disciplina de Lógica Matemática, podemos ver o quanto os dados do tipo lógico são importantes. São estes tipos de dados e as operações possíveis sobre os mesmos que permitem estabelecer todo um raciocínio e/ou decisão no processo de gerar uma informação.
Estrutura de Dados Curso de Licenciatura em Informática
27
UNIDADE 1 Fundamentos de Dados
SISTEMATIZAÇÃO DE Aprendizagem 1-Qualalternativamelhordeneodado?
( a ) resultado da informação ( ) componente contetualizado e ojetivado no conteto ( c ) componente resultante do processo decisório ( d ) característica de um ojeto qualquer do processamento 2 - Qual a composição de um dado? ( a ) informação ( ) nome e valor ( c ) dimensão e tipologia ( d ) variável e constante 3-Sobreotipodedadoprimitivoécorretoarmar:
( a ) comporta apenas um domínio ( ) é um componente multivalorado ( c ) não tem utilidade prática ( d ) é um valor ásico e invariável 4-Qualdasalternativascorrespondeaoresultadode“45”+“54” a)99b)“99”c)4554d)“4554” 5-OnúmerodoCPFpodeserdenidocomodotipo
( a ) alfanumérico
( ) lógico
( c ) inteiro
( d ) numérico
6 - Para indicar se uma característica está presente no ojeto, o dado pode ser denidocomosendodotipo ( a ) alfanumérico
( ) lógico
Estrutura de Dados Curso de Licenciatura em Informática
( c ) inteiro
( d ) numérico
28
UNIDADE 1 Fundamentos de Dados
7-Namatemáticao“pi”éumvalorutilizadoemdiversosdeniçõesdocálculo trigonométrico.Dadosdestetiposãodenidoscomo:
( a ) Constante
( ) lógico
( c ) astrato
( d ) variável
8 - Qual a importância da astração de dados?
9-Emquaissituaçõesumnúmero deveserdenidocomodadotipoalfanumérico?
10 - Liste os tipos primitivos de dados e indique quais são os tipos correspondentes na linguagem C.
Estrutura de Dados Curso de Licenciatura em Informática
29
UNIDADE 1 Fundamentos de Dados
CONSIDERAÇÕES FINAIS Nesta unidade foram estudados os fundamentos de dados necessários para o nosso estudo de estrutura de dados. Os conceitos foram apresentados de forma a esclarecer duvidas quanto a sua utilização, denição e importância para o nosso estudo. Os conceitos foram apresentados na sua essência, sem aprofundar em detalhes de algoritmos, operações e outras atividades inerentes. Esta abordagem se deve ao fato de que tais aspectos já foram apresentados em outras disciplinas já trabalhadas no nosso curso. Com os conceitos desenvolvidos nesta unidade, estamos em condição de começar o estudo das estruturas de dados mais complexas, bem como as aplicações que serão apresentadas nas próximas unidades.
Estrutura de Dados Curso de Licenciatura em Informática
30
UNIDADE 1 Fundamentos de Dados
Abstração: Representação conceitual de algo. Alfanumérico: Compreende todos os símbolos possíveis para uma linguagem. Algoritmo: Sequência lógica de passos que conduzem a solução de um problema. Concatenação: Operação de união de duas palavras. Constante: Dado com valor xo. Dado: É a menor unidade de informação. Dado primitivo: Dado atômico, sem qualquer composição. É a forma mais simples de representação.
Domínio do dado : Valores que podem ser utilizados no dado. Explicito: Algo que é apresentado direto e claramente, bem denido. Implícito : Alguma coisa apresentado de forma indireta, sua denição não é clara mas leva a entender a existência do mesmo.
Informação: Dado contextualizado e organizado conforme um objetivo. Interação : Relacionamento. Lógico: Compreende denição de existência ou não, verdadeiro ou falso. Numérico: Compreende os números em suas diferentes formas de representação. Objeto: Qualquer coisa concreta ou abstrata a ser representada computacionalmente. String: Palavra. É uma composição de um ou mais caracteres, símbolos e /ou números. Subpalavra: Parte de uma palavra. Variável: Dado que pode assumir qualquer valor.
Estrutura de Dados Curso de Licenciatura em Informática
31
UNIDADE 1 Fundamentos de Dados
REFERÊNCIAS BIBLIOGRÁFICAS ASCENCIO, A.F.G. e CAMPOS, E.A.V. Fundamentos de programação de computadores. 2ª Ed. São Paulo, Pearson, 2007. FORbELLONE, A.L.V. e EbERSPACHER, H.F. Lógica de Programação – A construção de algoritmos e estruturas de dados. 3ª Ed. São Paulo, Pearson, 2005. TANENbAUM, A.M. Estruturas de dados usando C. São Paulo, Pearson, 2007. PUGA, S. e RISSETTI, G. Lógica de programação e estruturas de dados com aplicaçõesemJava.2ªEd.SãoPaulo,Pearson,2009.
Estrutura de Dados Curso de Licenciatura em Informática
32
UNIDADE 2 Estruturação de Dados
ESTRUTURAÇÃO DE DADOS
2 Estrutura de Dados Curso de Licenciatura em Informática
33
UNIDADE 2 Estruturação de Dados
INTRODUÇÃO Nesta unidade, estamos iniciando o estudo da Estruturação de Dados. A partir dos conceitos apresentados na Unidade I, poderemos entender como organizar os dados, de forma diferente. Veremos que a organização diferenciada dos dados possibilitara representar melhor as coisas e objetos do mundo real. A organização dos dados em diferentes formatos de estrutura possibilita maior poder de processamento para solucionar problemas no mundo real. Esta estruturação permite agrupar várias informações do mesmo tipo ou de tipos diferentes em uma única variável e podem ter uma estrutura de organização xa (estática) ou variável (dinâmica). Os conceitos de estrutura de dados têm uma complexidade considerada alta e talvez um dos mais difíceis no estudo de princípios computacionais que envolvem a manipulação e processamento de dados. Assim, é importante que você aumente o nível de concentração e atenção em cada ponto do estudo. Apesar desta diculdade, esta é uma disciplina de grande importância na área da computação. Por isto recomendamos maior dedicação e interação com os colegas e tutor para sanar as dúvidas o mais rápido possível. Aumente a disponibilidade para leitura e raciocínio sobre cada tópico apresentado. Procure compreender e criar conclusões sobre os temas, seguindo a sequência apresentada. Busque auxílio nas disciplinas de lógica e programação já apresentadas. Se, após ler e raciocinar muito, você não conseguir entender, procure sanar a dúvida com os colegas e tutores do curso. Não deixe que o comodismo e o medo atrapalhem o seu desenvolvimento. Lute, estude, pense e vença. Pense em nível superior! Esta Unidade tem por objetivo: • Compreender a estruturação de dados homogêneos unidimensionais e multidimensionais • Entender a organização e estruturação de dados heterogêneos • Apresentar as estruturas dinâmicas
Estrutura de Dados Curso de Licenciatura em Informática
34
UNIDADE 2 Estruturação de Dados
ESTRUTURAS DE DADOS 1.1 - PARA QUE ESTRUTURAR DADOS? Na Unidade I, aprendemos como estabelecer as características de um objeto e como fazer a representação destas características em um dado. Após ter superado esta etapa, chegamos à conclusão de que guardamos os valores para estes dados em um componente que pode ser constante ou variável. Até o momento esta representação pode ter sido satisfatória para os propósitos. Entretanto, à medida que a complexidade do problema aumenta, vericaremos que esta representação poderá não ser suciente ou aumentar a complexidade da tarefa de gerenciar o processamento. Para entender o motivo da complexidade do gerenciamento, façamos uma analogia com uma situação do nosso dia a dia: controlar as roupas que serão guardadas no armário. O armário é composto de varias gavetas numeradas de 1 a N, conforme o tamanho do armário. Como regra, ca estabelecido que cada gaveta só comporta uma peça de roupa, independente do tamanho da peça. Para simplicar e estabelecer a linha de raciocínio a ser desenvolvida nos exemplos, vamos utilizar apenas meias, camisas e calças para guardar no armário.
Figura 8: Armário
Num primeiro cenário, imagine um armário de roupas no qual serão guardadas as roupas do João. Cada peça de roupa será guardada em uma gaveta do armário. O vestuário de João é composto de uma calça azul, uma camisa amarela e uma meia preta. A Figura 9 ilustra o armário do João.
Estrutura de Dados Curso de Licenciatura em Informática
35
UNIDADE 2 Estruturação de Dados
Figura 9: Armário do João
Para organizar o armário, João colocou uma etiqueta com o nome das peças em cada gaveta. Assim, a gaveta 1 recebeu uma etiqueta com o nome de calça, a gaveta 2 com o nome de camisa e a gaveta 3 com o nome de meia. Para saber a cor da calça, João abre a gaveta com o nome calça e verica que lá existe uma calça de cor preta. A operação pode ser repetida de forma semelhante para as outras peças quando necessário. Transpondo este exemplo do armário para o nosso sistema computacional, podemos facilmente entender a função das variáveis e sua disposição na memória. A Figura 10 apresenta uma analogia quanto à organização da memória com o armário de gavetas.
Estrutura de Dados Curso de Licenciatura em Informática
36
UNIDADE 2 Estruturação de Dados
Figura 10: Analogia armário X memória
• O armário corresponde à memória; •
As gavetas correspondem a cada endereço na memória;
• As etiquetas das gavetas correspondem aos nomes atribuídos para as variáveis ou constantes utilizadas no processamento; e • A cor da calça ou o fato de ter ou não ter uma peça de roupa na gaveta, corresponde a um valor que colocamos na variável.
Ao ser denida uma variável ou constante, um espaço na memória é reservado para o seu armazenamento.
Para aplicações simples em que há envolvimento de uma pequena quantidade de dados, esta organização atende à maioria dos problemas. No nosso exemplo, João tem a opção de compor o vestuário com um conjunto de roupa apenas. Na vida real, esta é uma situação impraticável. As pessoas precisam de, pelo menos, um par de cada vestuário (de vez em quando tem que lavar a roupa, não é?). Supondo que João agora tenha duas peças de cada roupa, ele então irá ocupar outras gavetas. Para diferenciar uma peça de outra, ele irá colocar o nome da peça seguida de um número. Por exemplo, poderá colocar “calça 1” e “calça 2”. No caso de duas peças de cada roupa, o armário de João deve car como na Figura 11.
Estrutura de Dados Curso de Licenciatura em Informática
37
UNIDADE 2 Estruturação de Dados
Figura 11: Armário com dois exemplares de cada peça do vestuário
Com esta “grande quantidade” de opções, João poderá escolher entre uma das duas opções conforme a característica (dados) armazenada em uma ou outra gaveta. À medida que João adquire mais peças, a estratégia de numerar as gavetas e as peças tornará mais complicada a tarefa de gerenciar qual roupa está em qual gaveta, e outros detalhes. Imagine que João tenha 20 exemplares de cada tipo de peça do vestuário, ou, então, 50 ou ainda 800. Já imaginou 800 gavetas etiquetadas de calça 1 a calça 800, cada uma com pequenas diferenças. Como fazer para encontrar uma determinada calça? Para complicar a situação problema, ainda pode haver quantidades diferentes nas outras peças do vestuário. Por exemplo, pode ter 1200 pares de meias e 400 camisas. E se houver necessidade de controlar outras peças além das meias, camisas e calças? Já imaginou o tamanho da diculdade?
Aumentar a quantidade de dados aumenta a diculdade de gerenciamento .
Quanto ao armário, não fará diferença a quantidade de roupas e os tipos que q ue serão guardados nas gavetas. Caso não tenha gavetas sucientes, basta comprar outro armário (mais memória), ou então, trocar por um armário com maior quantidade de gavetas (maior capacidade de memória). Estrutura de Dados Curso de Licenciatura em Informática
38
UNIDADE 2 Estruturação de Dados
Maior quantidade de dados não é problema para a máquina, desde que não ultrapasse o espaço disponível para armazenamento na memória
Já para João, à medida em que forem colocadas mais peças de roupas, a manipulação e o gerenciamento carão mais complicados. Conforme a informação necessária de uma determinada peça, João terá maior diculdade para encontrar uma roupa especica ou gerenciar o armazenamento das roupas. A diculdade aumentará, proporcionalmente, ao aumento de roupas e variedades a serem gerenciadas.
Para os humanos, o aumento da quantidade de dados exige um aumento de atenção.
Esta diculdade acontece devido à limitação que o cérebro humano tem para controlar várias coisas ou processos simultâneos. Apesar de sua grande cap acidade, o cérebro humano consegue gerenciar poucos processos simultâneos. O aumento da quantidade de coisas a serem gerenciadas, causa dispersão e cria confusões. O que o cérebro faz é agrupar as características e, conforme a necessidade, buscar uma característica especíca. Assim, o cérebro vê uma pessoa e guarda na memória um nome, como: Maria, por exemplo. Se algum dia alguém perguntar a cor do cabelo de Maria, o cérebro “vai” até o lugar onde armazenou Maria e busca a característica da cor do cabelo.
O cérebro humano tem diculdades para controlar grandes quantidades de dados.
Desta forma, podemos perceber que é mais fácil gerenciar dados agrupados em um dado ou objeto maior do que gerenciar muitas características de forma individual. Por exemplo, no curso de Licenciatura, é melhor guardar o nome de cada estudante em uma pasta e depois ir colocando nesta pasta as notas de cada disciplina cursada. Quando precisarmos saber a nota de algoritmo do estudante Pedro, simplesmente buscamos a pasta do Pedro e consultamos a nota de algoritmo. Veja que esta forma é mais simples de administrar do que gerenciar “Nota_de_Algoritmo_Pedro”, “Nota_de_Algoritmo_Maria” e assim por diante. Voltando ao armário de João, é mais fácil gerenciar uma gaveta onde se podem guardar todas as meias. Quando precisar escolher uma meia, João abre uma única gaveta e escolhe a meia mais apropriada.
Estrutura de Dados Curso de Licenciatura em Informática
39
UNIDADE 2 Estruturação de Dados
Ao invés de ter que controlar 800 gavetas de calças, 1200 gavetas de meias e 400 gavetas de camisas, João só terá três gavetas para controlar. Não precisa ser nenhum gênio matemático para entender que é mais fácil controlar 3 gavetas do que 2400 gavetas. Qual gaveta está vazia para guardar a calça marrom? Onde está a camisa vermelha? Será que tem meia cinza?
A reestruturação do armário do João pode ser visualizada na Figura 12.
Figura 12: Armário com vários exemplares de cada peça do vestuário
Apesar de serem apenas 3 gavetas, todas as peças foram guardadas. Até a aparência do armário cou mais leve para os nossos olhos, não acha? Agora podemos completar o armário com outras peças e, ainda assim, cará mais fácil de gerenciar o vestuário. Podemos colocar sapatos, luvas, cintos, etc. Para cada tipo de peça do vestuário basta rotular a gaveta com o nome da peça e colocar todas na gaveta correspondente.
Ao agrupar dados, continuamos com a mesma quantidade de dados, porém os agrupamentos possibilitam concentrar características e reduzir a complexidade.
Em um problema qualquer, os dados a serem manipulados podem ser estruturados da mesma forma com que João organizou seu armário, a m de simplicar o gerenciamento de seu vestuário. Os dados permanecerão os mesmos, porém estão organizados de forma diferente. Não será ocupado menos espaço de memória, porém os dados carão m ais organizados para serem manipulados e fornecerem informação. Agora que tivemos a exemplicação quanto à estruturação de dados, temos uma nova
Estrutura de Dados Curso de Licenciatura em Informática
40
UNIDADE 2 Estruturação de Dados
questão: como agrupar e estruturar os dados? Agrupar e estruturar dados, obviamente, não é uma tarefa simples. Existem várias técnicas que dependerão dos objetivos e a informação pretendida a partir dos dados. Basicamente podemos dividir as técnicas em: estruturação estática e estruturação dinâmica. A estruturação estática de dados é algo parecido com algo que zemos ao montar o armário. Numeramos as gavetas de 1 até N e depois colocamos os respectivos objetos. Podemos trocar os conteúdos, mas as gavetas continuarão com o mesmo numero. Este número, muitas vezes, denominado de índice é o que permitirá efetuar a manipulação das gavetas. A gaveta 1; será sempre gaveta 1, o que pode mudar é o seu conteúdo. Assim, a estruturação é rígida, não mudamos o número ou forma de organização das gavetas, apenas o conteúdo das mesmas. A estruturação dinâmica de dados é mais exível, poderosa e complexa. Ela possibilita reorganizar as gavetas conforme a necessidade. Por exemplo, é possível estabelecer mecanismos para organizar uma sequência e depois alterar, excluir ou inserir outros dados entre os dados já existentes.
SAIbA MAIS SObRE ESTRUTURAS ESTÁTICAS E DINÂMICAS http://pt.wikipedia.org/wiki/Estrutura_de_dados http://www.din.uem.br/~ronaldo/LivroAED-Capitulos-7-Estruturas.pdf
Pelos exemplos e considerações realizadas, é possível vericar que a estruturação de dados oferece possibilidades de uma melhor manipulação dos dados para atender diferentes necessidades nas aplicações computacionais. Voltando nossa atenção ao conceito de dados e tipos de dados, podemos notar que zemos uma divisão dos tipos primitivos para tornar mais simples a classicação dos dados. Porém, notamos que os tipos primitivos não são sucientes para representar toda e qualquer informação que possa surgir. Assim, a representação com tipos primitivos, em muitas situações, é limitada e apresenta muitas diculdades. Isto nos leva a pensar se não existem mais tipos de dados ou se é possível criar outros tipos de dados à medida que forem necessários novos tipos. É neste ponto que entra o estudo da estrutura de dados. Veremos que é possível construir novos tipos de dados a partir da composição dos tipos primitivos. A estrutura de dados dene como os tipos primitivos estão organizados para representar um novo tipo de dado ou informação. Agora que entendemos o motivo e o que é estrutura de dados, vamos conhecer os conceitos e técnicas para realizar a estruturação. Estrutura de Dados Curso de Licenciatura em Informática
41
UNIDADE 2 Estruturação de Dados
2 - ESTRUTURAS DE DADOS ESTÁTICAS A forma mais simples de estruturar dados é agrupá-los em um conjunto, e, como tal, tratar cada dado como um componente do conjunto. As estruturas de dados estáticas se prestam a este m. Você pode manipular livremente os dados, mudar de lugar, mudar os valores, reordenar, etc. Só não pode mudar a estrutura denida, por este motivo estas são denominadas: estruturas de dados estáticas. Voltando ao exemplo de nossas gavetas, o que faremos é separar uma gaveta para guardar um determinado tipo de peça como meias, por exemplo. Dentro da gaveta estabeleceremos várias divisões para guardar as peças separadamente. Desta forma, os dados (meias) carão guardados em um conjunto (gaveta), em espaços especícos (divisão), para facilitar o manuseio. Ao estabelecer que a gaveta irá guardar meias, faremos a divisão para meias e poderemos guardar apenas meias. Não será possível colocar calças nesta divisão e nem será interessante. Após colocar o nome de meia para gaveta, é pouco provável que iremos procurar a calça nesta gaveta. No caso dos dados, denimos uma estrutura para guardar um determinado tipo de dado. Estabeleceremos o tipo, o espaço e a organização do espaço. Após a denição, a estrutura é xada e toda a manipulação será feita de acordo com a estrutura denida.
Na estrutura estática, após a denição, a estrutura é xa, porém, os dados podem ter valores alterados ou podem mudar de posição dentro da estrutura estabelecida.
A denição da estrutura pode conter um ou mais tipos de dados primitivos, o que irá denir a estrutura como sendo: homogênea ou heterogênea.
2.1 - Estruturas Homogêneas
Nas estruturas homogêneas, todos os dados são de um único tipo primitivo.
Estrutura de Dados Curso de Licenciatura em Informática
Há situações em que teremos que trabalhar com variáveis de mesmo tipo. São conjuntos de dados ou informações que têm o mesmo nome e o mesmo tipo de dado primitivo.
42
UNIDADE 2 Estruturação de Dados
Voltando ao exemplo da gaveta, temos o conjunto de meias na seguinte forma: Meia1 = verde, Meia2 = azul, Meia3 = amarela e assim por diante, conforme pode ser visualizado na Figura 13.
Figura 13: Conjunto de meias
Agrupando todas as meias em uma única gaveta com divisórias, a gaveta terá um único nome: MEIAS. A Figura 14 mostra que em cada divisória será colocada uma meia. Assim teremos a meia verde na divisória 1, a meia azul na divisória 2, a meia amarela na divisória 3 e assim por diante.
Figura 14: Gaveta com divisórias para guardar as meias
E o que mudou? Só deixamos de chamar de meia1 para chamar de divisória 1? Qual a diferença? Aparentemente não há diferença, mas observe que o “1” da meia1 é um caracter e não um número. Já em divisória, o 1 pode ser um número. Númer os são mais fáceis de serem manipulados matematicamente e, consequentemente, pelo computador. Se colocarmos um parênteses no número, teremos o seguinte formato: divisória(1). Apesar de não aparentar diferença, o recurso de colocar o número entre parênteses, possibilita-nos estabelecer uma série de recursos para manipular a estrutura. Este número tem um nome que será muito útil para nós: índice. O índice é uma referência que identica um componente dentro de um conjunto. Desta forma, poderemos ter o primeiro, segundo, terceiro elemento e, assim por diante.
Estrutura de Dados Curso de Licenciatura em Informática
43
UNIDADE 2 Estruturação de Dados
Como o índice é um número, podemos substituir o índice por uma variável e manipular, acessar, reordenar, etc., conforme a necessidade de trabalhar a informação. Para entender como isto acontece, vamos considerar dois conjuntos que até o momento entendemos serem iguais:
Conjunto A
Conjunto b
meia1 = verde,
meia(1) = verde,
meia2 = azul,
meia(2) = azul,
meia3 = preta
meia(3) = preta
No conjunto A, para saber a cor de cada meia, deveremos escrever o nome completo da variável: Escreva(meia1)
Escreva(meia2)
Escreva(meia2)
Se tentarmos substituir o número por “X” todos os componentes terão o mesmo nome: meiaX, pois o X é um caracter. Agora, se estabelecermos que X é uma variável numérica, o conjunto B passa a ter uma possibilidade interessante. De acordo com o valor que for atribuído para a variável X, poderemos acessar qualquer um dos valores do conjunto. Observe o exemplo no trecho de algoritmo apresentado na Figura 15:
Figura 15: Trecho do algoritmo para saber a cor da meia
Suponha que na primeira linha o usuário forneça o valor 3 para a variável X. Na segunda linha, o algoritmo irá apresentar “VERDE” que é a cor da meia1 no conjunto A. Na terceira linha será apresentado “PRETA” que é a cor da meia(3) no conjunto B, pois X assumiu o valor 3. Se for fornecido o valor 2 para X na primeira linha 1, a segunda linha continuará apresentando “VERDE” e a terceira linha passa a apresentar “AZUL”. Para mostrar a cor a cada uma das meias do conjunto A, o algoritmo deve ter uma linha para cada uma das meias. Caso o conjunto seja composto por 500 meias, serão
Estrutura de Dados Curso de Licenciatura em Informática
44
UNIDADE 2 Estruturação de Dados
necessárias 500 linhas. Já no conjunto B, é possível uma única linha para mostrar a cor de todas as meias, independente da quantidade de meias. Basta colocar a linha em um laço de repetição. A Figura 16 exemplica a situação para mostrar a cor de 500 meias.
Figura 16: Trecho do algoritmo para mostrar a cor das meias
Neste rápido exemplo é possível entender a exibilidade e as possibilidades na manipulação da informação com a estruturação homogêna de dados. As estruturas homogêneas são, basicamente, de dois tipos: vetore s e matrizes.
2.1.1 - VETOR Um vetor é uma estrutura composta unidimensional. Isto quer dizer que o vetor é um conjunto com apenas uma dimensão composta por vários elementos de um único tipo primitivo. Todos os elementos estão contidos em apenas uma variável e controlados por um único índice. Como o vetor não é um tipo primitivo, ele precisa ser denido para ser utilizado como variável. Para entender este processo, vamos inicialmente ilustrar o processo para depois apresentar sua implementação e manuseio em algoritmos.
2.1.1.1 - NOÇÃO INTUITIVA DE VETOR Vamos supor que queremos armazenar as quatro notas do período letivo de um estudante. Como as quatro notas são do mesmo tipo primitivo (dado numérico), podemos desenvolver um vetor de 4 posições. Cada um irá guardar uma nota que inicia na primeira prova e vai até a quarta prova. O primeiro passo é denir o nome e o tipo do dado que será armazenado. No nosso exemplo, iremos guardar notas, então é conveniente dar o nome de “Notas” para a variável. Como este dado é um número (podemos somar, calcular a média, etc.). Vamos denir a variável do tipo numérico. A partir destas denições iniciais devemos escolher uma caixa Estrutura de Dados Curso de Licenciatura em Informática
45
UNIDADE 2 Estruturação de Dados
para armazenar os dados e identicamos a caixa com o nome “Notas”. A Figura 17 ilustra estas denições iniciais.
Figura 17: Denição inicial do local para guardar as notas
Após a denição da caixa, devemos estabelecer quantos espaços (divisórias) que serão imprescindíveis para guardar os dados. Como o nosso problema envolve 4 notas, vamos criar 4 divisórias na caixa, uma para cada bimestre. A caixa deve car como na Figura 18.
Figura 18: Preparação para armazenar as notas
Após ter realizado a divisão da caixa, cada divisória será identicada por um número que é o índice da divisória. Assim, a primeira divisória terá o índice 1 e a ultima terá o índice 4. A identicação de cada divisória pelos seus índices está ilustrada na Figura 19.
Figura 19: Estrutura com identicação das divisórias
Após ter estabelecido o formato da caixa para armazenar as notas, o próximo p asso é colocar nas divisórias os valores de cada uma das notas. A Figura 20 mostra o aspecto de como cará a caixa de notas ao nal do processo.
Figura 20: Notas armazenadas em cada posição do vetor
Estrutura de Dados Curso de Licenciatura em Informática
46
UNIDADE 2 Estruturação de Dados
Nesta situação, podemos manipular as notas conforme a necessidade apresentada. Se quisermos alterar a primeira nota, basta ir na divisória Nota(1) e alterar o valor. Se for necessário calcular a média, é possível fazer um laço para calcular a média. Se precisarmos saber o valor da terceira nota, basta acessar a divisória 3 ou Notas(3).
2.1.1.2 - DEFINIÇÃO DE VETOR Computacionalmente, o vetor não é um tipo primitivo. Como não é um tipo pr imitivo, para ser usado no algoritmo, ele deve ser previamente denido. Só após sua denição é que o vetor pode ser declarado como qualquer outro tipo de dado. A denição do vetor também é denominada de construção do tipo ou estruturação do vetor. Em computação, algoritmos e programação , a denição do vetor é denominada de declaração do vetor.
Para ser utilizado em algoritmos ou programas, o vetor deve ser previamente declarado (denido).
Para declarar um vetor, é necessário estabelecer duas coisas: • Tipo primitivo dos dados que serão armazenados no vetor; e • O tamanho do vetor, isto é, a quantidade de “divisórias” que o vetor terá para guardar dados. • A partir do tamanho do vetor, será denido: • O índice inicial do vetor ( LI ); e • O índice nal do vetor ( LF ). Normalmente,, o índice inicial é o número 1, porém algumas linguagens estabelecem o índice 0 como inicial. Outras linguagens permitem estabelecer um número qualquer como inicial. Nos nossos estudos iremos utilizar o valor 1 como índice inicial. O índice nal é a soma do índice inicial mais o tamanho do vetor. Estabelecidos estes pontos, basta declarar o vetor da seguinte forma: Nome_variavel: VETOR [ LI : LF ] de Tipo_primitivo Onde:
Estrutura de Dados Curso de Licenciatura em Informática
47
UNIDADE 2 Estruturação de Dados
Nome_variável é o nome da variável para guardar os dados do vetor LI : início do vetor LF : final do vetor Tipo_primitivo: é o tipo de dado que será armazenado Eemplos de declaração de vetor:
Vetor para o nome dos alunos de uma sala de aula Sala : Vetor [ 1 : 40 ] de alfanumérico Vetor para as faltas do funcionário em cada mês do ano Falta_anual : Vetor [ 1 : 12 ] de inteiro Vetor para os dias que choveram no mês de janeiro Chuva_Janeiro : Vetor [ 1 : 31 ] de lógico A declaração do vetor é feita no mesmo local em que declaramos as variáveis do algoritmo: Área de declaração de variáveis. O algoritmo 2.1 mostra como pode ser utilizado um vetor para ler o nome de 4 candidatos e listar o nome dos candidatos.
Algoritmo 2.1
Algoritmo Exemplo_Vetor Variáveis Candidato: Vetor [ 1 : 4 ] de alfanumérico; I : inteiro; Inicio Para I 1 até 4 faça Escreva(“Digite o nome:”); Leia (Candidato [I]); Escreva (Candidato [I]); Fim_Para; Fim. f
Estrutura de Dados Curso de Licenciatura em Informática
48
UNIDADE 2 Estruturação de Dados
Conforme os nomes fornecidos, o vetor cará como mostrado a seguir VARIAVEL Candidatos Índice
g
1
2
3
4
Valor
g
“João”
“Ana”
“Maria”
“José”
Vejamos o que acontece se precisarmos mudar o Algoritmo 2.1 para que ele tenha a capacidade de armazenar o nome de 150.000 candidatos. Observe e compare os algoritmo 2.2 e 2.1 para descobrir qual foi a alteração realizada.
Algoritmo 2.2 Algoritmo Eemplo_Vetor Variáveis Candidato: Vetor [ 1 : 150000 ] de alfanumérico; I : inteiro; Inicio Para I 1 até 150000 faça Escreva(“Digite o nome:”); Leia (Candidato [I]); Escreva (Candidato [I]); Fim_Para; Fim. f
Percebeu a simplicidade que o vetor oferece quando o problema vai aumentando de tamanho? Para alterar o tamanho do problema, basta mudar o tamanho do vetor (LF) e o valor do laço. Esta é a diferença entre os algoritmos 2.1 e 2.2. Volte a comparar os algoritmos novamente para constatar esta diferença.
2.1.1.3 - Manipulação de Vetores As operações para manipulação de vetores exigem a informação da posição que se deseja manipular. Isto é, para alterar ou ler qualquer elemento de um vetor, é necessário saber o índice da posição do elemento que será manipulado.
Estrutura de Dados Curso de Licenciatura em Informática
49
UNIDADE 2 Estruturação de Dados
Por exemplo, se quisermos fazer qualquer operação no valor da nona posição de um vetor X de 40 elementos, devemos utilizar o índice 9 para acessar esta posição. Assim, teremos: Operação sore o elemento
x[9]
2.1.1.4 - ATRIBUIÇÃO DE VALORES NO VETOR A atribuição exige que seja informada em qual posição do vetor o valor será armazenado. Exemplo: Considere o vetor Tx denido a seguir Tx : vetor [ 1 : 100 ] de numerico
Para atribuir um valor a um elemento deste vetor, devemos selecionar a posição deste elemento. Supondo que queremos armazenar o número 27 na quinta posição do vetor. A quinta posição é o índice 5 do vetor. Assim temos que atribuir 27 na posição TX [5], da seguinte forma: Tx [ 5 ]
f
27
Também é possível preencher todo o vetor. Preencher um vetor signica atribuir valores a todas as posições do vetor. Para isto, podemos utilizar um laço e uma forma de controlar o índice. Vamos supor que queremos preencher o vetor TX com o valor 1. Para isto, podemos utilizar um laço PARA como mostrado a seguir: Para I
1 até 100 faça
f
Tx [ I ]
f
1
Fim_Para;
2.1.1.5 - LEITURA DE VALORES DO VETOR A operação acontece de maneira semelhante à operação de atribuição, só que neste caso iremos utilizar o comando ESCREVA para mostrar o valor da posição escolhida. Para mostrar o valor de uma posição especíca: Escreva ( Tx [ 5 ] );
Estrutura de Dados Curso de Licenciatura em Informática
50
UNIDADE 2 Estruturação de Dados
Para listar todos os valores guardados no vetor: Para I
1 até 100 faça Escreva ( Tx [ I ] ); Fim_Para; f
2.1.1.6 - OPERAÇÕES COM VALORES DO VETOR Conforme o processamento a ser realizado, podemos manipular o vetor, realizando operações entre seus elementos e armazenar o resultado em uma outra posição qualquer do próprio vetor. Podemos manipular cada posição como se fosse uma variável qualquer. A diferença é que esta variável tem o mesmo nome, porém é indexada. O índice é que diferencia uma posição de outra. Exemplo: Considerando o vetor TX com o valor 4 na sétima posição e o valor 15 na nona posição, conforme ilustrado na Figura 2.14.
Figura 21: Estado inicial do vetor.
Podemos somar os valores da posição 7 e 9 e armazenar o resultado na terceira posição do vetor. A Figura 22 ilustra a operação de soma e armazenagem.
Figura 22: Soma de elementos do Vetor TX e armazenamento
Ao executar o comando Escreva ( TX [ 3 ] ) será apresentado o valor 19, que é o resultado de 4 + 15 ( valores armazenados nas posições TX [ 7 ] e TX [ 9 ] ). A Figura 23 ilustra a estado nal do vetor após as operações realizadas.
Figura 23: Estado nal do vetor
Estrutura de Dados Curso de Licenciatura em Informática
51
UNIDADE 2 Estruturação de Dados
SAIbA MAIS SObRE VETORES LEITURA http://pt.wikibooks.org/wiki/Programar_em_C/Vetores
http://www.tiexpert.net/programacao/c/vetores.php VÍDEOS http://www.youtube.com/watch?v=UWb8jzl6XMw http://www.youtube.com/watch?v=BiQgbU7j8bE&feature=related http://www.youtube.com/watch?v=MWR37yk2uwo&feature=related http://www.youtube.com/watch?v=RbPVXr0mleE&feature=related
EXERCÍCIO RESOLVIDO COM VETORES O curso de programação da escola LICINF aplica 10 testes durante o período do curso. No nal do curso, é apresentado um relatório com a média do estudante e cada uma das notas individuais. Faça um programa para ler as notas do aluno e imprimir o relatório. SOLUÇÃO
O primeiro passo é resolver a leitura das notas. Como as notas são do mesmo tipo e pertencem a um mesmo estudante, podemos utilizar um vetor com 10 posições. Assim, para ler as notas, teremos o seguinte trecho de algoritmo Para 1 até 10 faça Escreva (“Forneça a nota: ” ); Leia ( nota [ ] ); Fim_Para; A próxima etapa é recuperar as notas para calcular a média e imprimir o relatório. Para imprimir cada uma das notas, basta recuperar cada posição do vetor f
Para
1 até 10 faça Escreva ( nota [ ] ); Fim_Para; f
Estrutura de Dados Curso de Licenciatura em Informática
52
UNIDADE 2 Estruturação de Dados
A média é calculada somando todas as posições e dividindo por 10 Para isto, podemos somar todas as notas Soma nota[1] + nota[2] + nota[3] + . . . + nota[10] ) f
Depois, calcular a média dividindo a soma por 10 Média Soma / 10 f
Ou, então, utilizar um laço Soma 0; Para 1 até 10 faça Soma Soma + nota[]; Fim_Para; Média Soma / 10; f
f
f
f
Juntando tudo, temos o algoritmo a seguir: Algoritmo boletim Variáveis nota: Vetor [ 1 : 10 ] de numerico; soma, média, : inteiro; Inicio // inserir notas no vetor Para 1 até 10 faça Escreva (“Forneça a nota: ” ); Leia ( nota [ ] ); Fim_Para; // calcular a média Soma 0; Para 1 até 10 faça Soma Soma + nota[]; Fim_Para; Média Soma / 10; // imprimir o oletim Para 1 até 10 faça Escreva (“Nota”, x , “ = ”); Escreva ( Nota [ ] ); Fim_Para; Escreva“Amédianalé”,Média); Fim. f
f
f
f
f
f
Estrutura de Dados Curso de Licenciatura em Informática
53
UNIDADE 2 Estruturação de Dados
Podemos ainda melhorar o algoritmo boletim para economizar processamento, algumas linhas e deixar mais organizado, para isto reescrever o algoritmo como apresentado a seguir:
Algoritmo boletim Variáveis nota: Vetor [ 1 : 10 ] de numerico; soma, média, : numerico; Inicio // inserir notas no vetor Para
f
1 até 10 faça
Escreva (“Forneça a nota: ” ); Leia ( nota [ ] ); Fim_Para; // calcular a média e imprimir o oletim Soma
f
Para
0;
f
1 até 10 faça
Soma
f
Soma + nota[];
Escreva (“Nota”, x , “ = ”); Escreva ( Nota [ ] ); Fim_Para; Média
f
Soma / 10;
Escreva“Amédianalé”,Média); Fim.
Analise os dois algoritmos e veja o que mudou e se o resultado do processamento continua sendo o mesmo com as modicações.
Estrutura de Dados Curso de Licenciatura em Informática
54
UNIDADE 2 Estruturação de Dados
EXERCÍCIOS DE FIXAÇÃO
1) Faça um algoritmo que leia a idade de2300 alunos e calcule a média entre as idades. 2) Faça um algoritmo que leia a nota de 100 alunos, calcule a média da turma e liste apenas os alunos cuja nota for maior que a média da turma. 3) Pesquise uma linguagem de programação (Linguagem C, por eemplo) e veriquecomoutilizarovetornestalinguagem.
2.1.2 - Noção Intuitiva de Matriz Uma matriz é uma estrutura composta multidimensional. Multidimensional signica que a matriz pode ter várias dimensões. Da mesma forma que o vetor, a matriz é composta por vários elementos de um único tipo primitivo. Nesta disciplina, iremos trabalhar com matrizes de duas dimensões. Entretanto as matrizes podem ter tantas dimensões quantas forem necessárias para a solução do problema. As matrizes bidimensionais são denidas como N x N, ou seja N colunas por N linhas. O vetor é um caso particular de matriz. O vetor é uma Matriz N x 1. Como já estudamos o vetor, será mais fácil entender as matrizes. Vamos começar com o vetor contendo 4 notas de um aluno.
Nota
g
1
2
3
4
Aluno 1
g
7,0
6,0
7,5
9,0
Com dois alunos, teremos que criar dois vetores Aluno1 e Aluno2. A medida que for aumentando a quantidade de alunos, teremos a mesma quantidade de vetores, um vetor para cada aluno. Isto parece bem com a situação inicial que nos levou a utilizar vetores. Teremos uma grande quantidade de vetores, o que irá aumentar a diculdade no processamento e gerenciamento. Imagine que precisamos mostrar apenas a terceira nota de todos alunos. Estrutura de Dados Curso de Licenciatura em Informática
55
UNIDADE 2 Estruturação de Dados
Para isto, teremos que acessar todos os vetores. Uma solução para voltar a simplicar o problema é o uso de matrizes. Só para ilustrar e facilitar vamos imaginar uma sala com 3 alunos. Neste caso, teremos uma matriz como está apresentada a seguir: Nota
g
1
2
3
4
Aluno 1
g
7,0
6,0
7,5
9,0
Aluno 2
g
6,0
6,5
5,0
7,0
Aluno 3
g
8,0
8,5
6,0
7,0
Na matriz, cada linha contém as notas de um determinado aluno e as colunas contém as notas referentes a uma determinada avaliação. Na forma em que os dados estão organizados na matriz, temos condições de fornecer diversos tipos de informação. Por exemplo, se o aluno2 deseja saber quais foram as suas notas, basta selecionar os dados da linha na qual está o aluno2, no caso a linha 2. Se um professor precisar saber as notas de todos alunos na terceira avaliação, podemos listar as notas que estão na terceira coluna. O aluno3 quer saber a sua segunda nota, então, selecionamos o dado que esta na terceira linha (linha do aluno3) com a coluna 2 (coluna referente a segunda avaliação). Vamos eliminar os dados e numerar as linhas e colunas da matriz apresentada. A Figura 24 ilustra a representação da matriz preparada para armazenar dados. Note que é uma matriz 3 x 4 (3 linhas e 4 colunas).
Figura 24: denição inicial de linhas e colunas da matriz
Nesta gura, para acessar cada um dos locais, devemos fazer uma referência à linha e à coluna de localização. Na Figura 25, para acessar o local que está com a cor cinza, devemos ir para a linha 2 e depois até a coluna 3. De forma abreviada, falamos Linha 2 – Coluna 3.
Estrutura de Dados Curso de Licenciatura em Informática
56
UNIDADE 2 Estruturação de Dados
Figura 25: denição inicial de linhas e colunas da matriz
Como o vetor tem apenas uma linha, ele tem apenas um índice que é a posição de cada elemento. De uma maneira diferente, podemos dizer que é a posição de cada coluna. Como todas as colunas do vetor estão na linha 1 (única linha), utilizamos apenas a coluna para localizar cada elemento do vetor. A matriz pode ter várias linhas e colunas. Então, o índice precisa ter um número para indicar a linha e um número para indicar a coluna. Assim, o quadrado cinza da Linha 2 – Coluna 3 na Figura 2.12 está na posição 2,3 (2 da linha e 3 da coluna). A matriz 3 x 4, utilizadas nas guras 2.17 e 2.18 pode ser mapeada conforme representado na Figura 26.
Figura 26: representação de indices da matriz
Dessa forma, podemos atribuir valor para um elemento que está situado em uma posição da tabela e orientar pelo seu índice. Na matriz apresentada, o índice é composto por dois números.
A atribuição de valores, leitura e escrita para uma matriz bidimensional é denida através de dois índices.
A inserção de dados na matriz pode ser efetuada da seguinte forma Nome_Variável [ índice_linha , índice_coluna ]
f
valor;
ou Leia (Nome_Variável [ índice_linha , índice_coluna ] ) Estrutura de Dados Curso de Licenciatura em Informática
57
UNIDADE 2 Estruturação de Dados
A apresentação de dados na matriz pode ser efetuada da seguinte forma Escreva (Nome_Variável [ índice_linha , índice_coluna ] )
Podemos observar algumas características interessantes: • Na linha 1, todos os índices começam com o valor 1, que é o número da linha. Esta observação vale também para as outras linhas. • Na coluna 1, todos os índices terminam com o número 1, que é o número da coluna. Esta observação vale também para as outras colunas, observando-se, no entanto, a sequência de linhas e colunas sucessivamente.
O primeiro número do índice de todas as posições de uma linha tem o número da própria linha. O segundo número do índice de todas as posições de uma coluna tem o número da própria coluna.
Vamos utilizar os conceitos apresentados até o momento para entender o que podemos fazer com a matriz Nota, que representa as notas de 3 alunos em quatro avaliações de uma disciplina. Nota
g
1
2
3
4
Aluno 1
g
7,0
6,0
7,5
9,0
Aluno 2
g
6,0
6,5
5,0
7,0
Aluno 3
g
8,0
8,5
6,0
7,0
Se quisermos mostrar a terceira nota do Aluno2, podemos utilizar o comando: Escreva ( nota [ 2,3 ] );
O Aluno2 está na segunda linha e a sua terceira nota na coluna 3. Para listar todas as notas do Aluno3, podemos utilizar a primeira observação “o primeiro número do índice de todos elementos de uma linha têm o número da própria linha”. Então, podemos entender que para listar os elementos de uma linha, podemos deixar constante o primeiro número e variar o segundo número do índice. Como aluno3 esta na linha 3, o índice será 3,X (sendo X uma variável). Então, usando um laço, poderemos listar todas as notas do aluno.
Estrutura de Dados Curso de Licenciatura em Informática
58
UNIDADE 2 Estruturação de Dados
Para x
f
1 até 4 faça
Escreva ( nota [ 3 , x ] ); Fim Para;
Após a execução deste laço serão apresentadas todas as notas do aluno 3 que estão armazenadas na linha 3. As notas impressas serão 8,0
8,5
6,0
7,0.
Para listar todas as notas da segunda avaliação, podemos utilizar a segunda observação “o segundo número do índice de todos elementos de uma coluna têm o número da própria coluna”. Então, podemos entender que para listar os elementos de uma coluna, podemos deixar constante o segundo número e variar o primeiro número do índice. Como a segunda avaliação está na coluna 2, o índice sera X,2 (sendo X uma variável). Então usando um laço, poderemos listar todas as notas da segunda avaliação. Para x
f
1 até 3 faça
Escreva ( nota [ x , 2 ] ); Fim Para;
Após a execução deste laço serão apresentadas todas as notas da segunda avaliação que estão armazenadas na lcoluna 2. As notas impressas serão 6,0
6.5
8,5
Para listar todas as notas para todos os alunos, basta juntar as duas coisas. Neste caso iremos aninhar os dois laços e utilizar duas variáveis. A variável L lista as linhas e a variável C lista as colunas. Para L
f
1 até 3 faça
Escreva(“Notasdoaluno:”,L); Para C
f
1 até 4 faça
Escreva ( nota [ L , C ] ); Fim Para; Fim Para;
Estes conceitos simples se aplicam a manipulação de qualquer outra matriz. O que vai variar é o tamanho da matriz. Assim temos que ter o cuidado de não deixar os valores do índice ultrapassarem o tamanho da matriz. Assim, se uma matriz tem tamanho M x N, o índice da linha não pode ser superior a M e o índice da coluna não deve ser superior a N.
Estrutura de Dados Curso de Licenciatura em Informática
59
UNIDADE 2 Estruturação de Dados
2.1.2.1 - DECLARAÇÃO DA MATRIZ COMO VARIÁVEL Estabelecidos estes pontos, basta declarar a matriz da seguinte forma: Nome_variavel: MATRIZ MATRIZ [ LI : LF , CI : CR ] de Tipo_primitivo Tipo_primitivo
Onde: Nome_variável é o nome da variável para guardar os o s dados da matriz LI : linha inicial LF: linha nal CI : coluna inicial CF: coluna nal Tipo_primitivo: é o tipo de dado que será armazenado
Os valores dos índices não podem ser menores do que o limite inferior (linha/coluna inicial) e nem maior do que o limite superior (linha/coluna nal).
Vetores e Matrizes são estruturas muito úteis para manipular dados de um mesmo tipo. Se for necessário manipular tipos de dados diferentes, mas com alguma relação, será necessário utilizar vetores ou matrizes adicionais e estabelecer a relação de alguma forma. Por exemplo, vamos supor que será necessário, além de ter as notas, ter os nomes de cada aluno. Como as notas são dados do tipo numérico e os nomes são do tipo alfanumérico, um único vetor ou matriz não pode armazenar dados diferentes. A solução é utilizar dois elementos diferentes. Como só teremos um grupo de alunos, podemos utilizar um vetor para isto. Já no caso das notas, haverá um grupo de notas para cada aluno, então, será necessário utilizar uma matriz. Vamos utilizar utilizar o vetor e a matriz a seguir: Vetor “aluno” para guardar o nome dos alunos 1
2
3
“João”
“Maria”
“Pedro”
Estrutura de Dados Curso de Licenciatura em Informática
60
UNIDADE 2 Estruturação de Dados
Matriz “nota” para guardar as notas dos alunos 1
2
3
4
1
7,0
6, 0
7,0
9, 0
2
6,0
6,0
5, 0
7,0
3
8,0
8,0
6, 0
7,0
Veja que o vetor tem o mesmo tamanho do número de linhas da matriz. Assim podemos dizer que cada linha da matriz corresponde a um nome no vetor. vetor. Veja como será o trecho de algoritmo para listar todos os alunos com suas respectivas notas.
Para L
f
1 até 3 faça
Escr Es crev eva a( (“N “Not otas asd do oal alun uno: o:” ”, ,al alun uno[ o[L L] ]) );; Para C
f
1 até 4 faça
Escreva ( nota [ L , C ] ); Fim Para; Fim Para;
Após a execução do algoritmo teremos tere mos o seguinte relatório: Notas do aluno João
7, 0
6, 0
7,0
9,0
Notas do aluno Maria
6, 0
6, 0
5,0
7,0
Notas do aluno Pedro
8, 0
8, 0
6,0
7,0
EXERCÍCIO RESOLVIDO Faça um algoritmo para ler o nome de 250 alunos com as 10 notas de cada um e, após a leitura de todas as notas, imprimir um relatório com o nome, notas e média de cada aluno. SOLUÇÃO
Neste algoritmo, temos algumas coisas a estabelecer inicialmente.
Estrutura de Dados Curso de Licenciatura em Informática
61
UNIDADE 2 Estruturação de Dados
Temos que armazenar o nome de 250 alunos. Para isto será necessário um vetor de 250 posições para dados alfanuméricos. Vamos chamar esta variável de aluno. Assim, podemos fazer a seguinte denição: aluno: Vetor [ 1 : 250 ] de alfanumérico;
Temos que armazenar 10 notas de 250 alunos. Para isto será necessário uma matriz de 250 linhas (uma para cada aluno) e 10 colunas (uma para cada nota). Como as notas são números, o tipo de dado é numérico. Vamos chamar esta variável de notas. Assim, podemos fazer a seguinte denição: nota: matriz [ 1 : 250 , 1 : 10 ] de numérico; nu mérico;
Para manipular os índices na matriz, precisaremos de uma variável para a linha e outra para a coluna. Vamos denominar estas variáveis de L e C, respectivamente. Como os índices são números, vamos denir a variável como numérica. L, C: numérico;
Precisaremos também de uma variável para somar as 10 notas e depois obter a média. Poderíamos utilizar uma variável apenas, mas para melhor visualização, vamos utilizar duas variáveis distintas: Soma e Média Soma, Média: numérico;
Agora que estabelecemos as variáveis, temos que q ue preparar as rotinas para solucionar o problema. a) Para ler e armazenar o nome dos alunos, podemos utilizar um laço de 250 repetições. Vamos utilizar o laço ante sua facilidade para controlar a contagem. Para L 1 até 250 faça Leia ( aluno [ L ] ); Fim_Para; f
b) Para ler e armazenar as notas de cada aluno, deveremos utilizar um laço de 250 repetições (para cada aluno) e um laço de 10 repetições ( para cada nota). Os laços de notas deverão estar aninhados (interno) no laço do aluno. Para L
f
1 até 250 faça
Para C
f
1 até 10 faça
Leia ( nota [ L , C ] ); Fim_Para; Fim_Para;
Estrutura de Dados Curso de Licenciatura em Informática
62
UNIDADE 2 Estruturação de Dados
c) Para simplicar o processo, podemos agrupar os passos “a” e “b”, na seguinte forma: Para L
f
1 até 250 faça
Leia ( aluno [ L ] ); Para C
f
1 até 10 faça
Leia ( nota [ L , C ] ); Fim_Para; Fim_Para;
d) Para calcular a média, deveremos recuperar as 10 notas, somar .e obter a média (dividir o total da soma por 10) para cada um dos 250 alunos Para L
f
1 até 250 faça
Soma
f
Para C
0;
f
1 até 10 faça
Soma
f
Soma + nota[ L , C ]
Fim_Para; Media
f
Soma / 10;
Fim_Para;
Estrutura de Dados Curso de Licenciatura em Informática
63
UNIDADE 2 Estruturação de Dados
e) Após estabelecer as soluções parciais, podemos agrupar tudo no algoritmo completo. Além das soluções parciais, podemos inserir mensagens para o usuário e comentários que facilitem a leitura do algoritmo. O algoritmo deve c ar da seguinte forma: Algoritmo Relatorio_Notas Variáveis aluno: Vetor [ 1 : 250 ] de alfanumerico; nota: matriz [ 1 : 250 , 1 : 10 ] de numerico; soma, media, L, C : numerico; Inicio // inserir nomes e notas Para L
f
1 até 250 faça
Escreva (“Digite o nome do aluno: ” ); Leia ( aluno [ L ] ); Para C
f
// insere o nome na posição L do vetor
1 até 10 faça
Escreva (“Forneça a nota: ”, C ); Leia ( nota [ L , C ] ); //insere uma nota do aluno na matriz Fim_Para; Fim_Para; // calcular as médias e imprimir o oletim Para L
f
1 até 250 faça
Escreva ( “Aluno: ” , aluno [ L ] ); Soma
f
Para C
0;
f
// zera o valor para não acumular com outra soma
1 até 10 faça
Soma
f
Soma + nota[ L , C ];
// soma as notas
Escreva ( nota [ L , C ] ); Fim_Para; Média
f
Soma / 10;
// calcula a média
Escreva “média nal: ”, Média); Fim_Para; Fim.
Estrutura de Dados Curso de Licenciatura em Informática
64
UNIDADE 2 Estruturação de Dados
Após a execução do algoritmo, o relatório deve ser semelhante à linha abaixo, só que com 250 nomes e 10 notas: Aluno:João
7,0
6,0
7,0
10,0
Médianal:7,5
SAIbA MAIS SObRE MATRIZ LEITURA http://pt.wikipedia.org/wiki/Matriz_%28matem%C3%A1tica%29 http://www.dee.feis.unesp.r/graduacao/disciplinas/langc/modulo_ linguagemc/modulo6.htm http://www.mtm.ufsc.r/~azeredo/cursoC/aulas/c530.html
VÍDEOS http://www.youtue.com/watch?v=cDhW8Pea7Y8&feature=related http://www.youtue.com/watch?v=UuTmEcy5rV0&feature=related http://www.youtue.com/watch?v=8VytdRFo6H4&feature=related http://www.youtue.com/watch?v=9nNyW4SSgo&feature=related http://www.youtue.com/watch?v=2udW8GV-jKM&feature=related
EXERCÍCIOS DE FIXAÇÃO 1) Faça um algoritmo para armazenar o nome e o valor mensal de 200 produtos no período de um ano. 2) Faça um algoritmo para armazenar o salário de 50 funcionários de cada uma das10liaisdaempresa.Apósaarmazenagem,deverásercalculadaamédiade saláriodecadalialeadicionar10%dereajusteparaossaláriosmenoresquea médiaemcadalial. 3) Pesquise uma linguagem de programação (Linguagem C, por eemplo) e veriquecomoutilizarmatrizesnestalinguagem. 4) Traduza os algoritmos dos eercícios 1 e 2 para a linguagem de programação pesquisada no eercício 3. Estrutura de Dados Curso de Licenciatura em Informática
65
UNIDADE 2 Estruturação de Dados
2.2 - Estruturas Heterogêneas Como foi vericado até agora, a estruturação de dados com vetores e matrizes é extremamente útil e facilita a manipulação de um grupo de variáveis do mesmo tipo. Podemos agrupar variáveis semelhantes num mesmo conjunto e manipular como se fosse uma única variável. Esta organização possibilita mecanismos mais simples para fornecer a informação. Vericamos que para trabalhar com conjuntos de tipos de dados diferentes temos que criar tantos vetores quantos forem necessários para descrever o objeto. Veja que para descrever as notas de um aluno, tivemos que criar um vetor para armazenar os nomes e uma matriz para armazenar as notas. O índice foi utilizado como referência para estabelecer a relação entre o vetor de nomes e a matriz de notas. A solução é interessante, porém a administração do controle de dados continua sendo do programador. Caso ele cometa algum erro ou perca o controle dos índices, a informação poderá car inconsistente, não correspondendo à realidade desejada. Por exemplo, os nomes dos alunos podem estar em uma determinada ordem e a lista de notas pode estar em uma ordem totalmente diferente, sem a indicação de qual aluno é a nota. Se os nomes e notas forem inseridas no vetor e na matriz na mesma ordem que estão, caso a ordem não corresponda à relação correta, as notas carão trocadas. No mundo real, os objetos e as informações podem ter diferentes tipos de dados para sua descrição. A Figura 27 mostra a análise dos dados do boletim que utilizamos no nosso exemplo.
Figura 27: estrutura de um boletim de notas
Nesta informação (boletim) podemos observar a existência de um grupo de dados do mesmo tipo (as notas) e um dado de tipo diferente (o nome dos alunos). Os dados precisam car juntos para que se possa controlar a informação do boletim do aluno João. Caso os dados estejam separados, em algum momento a secretária pode cometer algum erro e fornecer a informação errada. Esta forma de anotação no boletim do aluno é o que normalmente se faz nas escolas. O boletim é uma folha de papel que contem as notas de avaliação em uma única folha de papel para cada aluno. Para controlar isto em um computador, é interessante que possamos reproduzir o mesmo mecanismo. Estrutura de Dados Curso de Licenciatura em Informática
66
UNIDADE 2 Estruturação de Dados
Como os dados são de tipos diferentes, dizemos que são dados heterogêneos. ´ Devido ao fato das matrizes e vetores serem para dados homogêneos (de um mesmo tipo) não é possível armazenar o boletim nestas estruturas Então, será necessário criar um mecanismo que possibilite armazenar os diferentes tipos de dados em uma só variável. Este mecanismo resulta em novos tipos de estruturas denominadas de estruturas homogêneas.
2.2.1 - REGISTRO O registro é a estrutura básica para armazenar diferentes tipos de dados em uma única variável. Com o registro, podemos criar informações mais complexas que vão desde um simples arquivo (coleção de registros) até os mais complexos bancos de dados (coleção de vários arquivos e suas interligações). Um exemplo de registro é a folha de “registro do aluno” que as escolas utilizam para controlar os dados dos alunos. Nesta folha, são registrados os dados pessoais do aluno (nome, endereço, liação, etc.), suas notas, pagamentos e outras informações. Toda vez que for necessária alguma informação de um aluno especico é só consultar os dados do registro especico do aluno. Na folha de registro do aluno são colocados dados de diferentes tipos: dados pessoais (alfanumérico); notas das provas e pagamentos (numérico); se está matriculado, se tem pendências (lógico); e outras informações. Você pode pensar que isto é possível por ser uma folha de papel e, como dizem, no papel, podemos colocar o que quiser. Tudo bem, mas em um computador também podemos colocar muitas coisas, não é? Veja que, no papel, a cha não apareceu pronta. Alguém preparou (estruturou) a cha de tal forma a facilitar o manuseio das informações relativas ao aluno. Com esta estruturação, a secretaria, a diretora, a professora e o próprio aluno não têm que car procurando em diferentes locais as informações diversas sobre o mesmo aluno. Tudo está em uma única cha. Cada dado na cha pode ser de um tipo diferente dos outros dados, mas o conjunto foi estruturado para conter todos os dados necessários para o controle das informações do aluno. Dessa forma mais didática, ca bem mais fácil, concorda?. Se conseguimos fazer a organização em uma folha de papel, com certeza, é possível fazer em um computador. Isto pode ser feito de forma parecida com a que foi feita com os vetores e matrizes. Só que agora iremos utilizar uma estrutura heterogênea: o tip o Registro.
Estrutura de Dados Curso de Licenciatura em Informática
67
UNIDADE 2 Estruturação de Dados
Um tipo registro é uma variável heterogênea em que podemos armazenar os dados necessários para o problema, mesmo que sejam de tipos diferentes. Uma variável do tipo registro tem um nome como, por exemplo, aluno, carro, etc. Nesta variável é colocada uma lista de dados (campos) que serão armazenadas. Cada dado possui a denição do seu tipo. A Figura 28 ilustra a estruturação de uma variável do tipo registro.
Figura 28: estrutura de um boletim de notas
Os dados para compor o boletim do aluno são agrupados na variável Boletim que é do tipo registro. Agora que entendemos o conceito de um registro, vamos formalizar a sua denição em um algoritmo.
2.2.1.1 - DECLARAÇÃO DO REGISTRO COMO VARIÁVEL Para utilizar um registro no algoritmo, ele precisa ser declarado no campo de declaração de variáveis. Para declarar o registro, vamos seguir algumas etapas: • Estabelecer quais campos (dados) irão compor o registro; • Denir um nome para cada campo; • Denir o tipo de cada campo; • Fazer as listas de campos de um mesmo tipo; e • Declarar a variável tipo registro.
Estrutura de Dados Curso de Licenciatura em Informática
68
UNIDADE 2 Estruturação de Dados
A declaração do registro tem uma semântica. É colocado o nome da variável que será manipulada como registro. Dentro da declaração do registro são declarados os campos da mesma forma que fazemos a declaração de variáveis. A semântica da declaração do registro é apresentada no quadro a seguir.
Nome_variavel: Registro lista de campos 1: Tipo_primitivo 1; lista de campos 2: Tipo_primitivo 2; .
.
.
lista de campos n: Tipo_primitivo n; Fim_Registro
Onde: Nome_variável é o nome da variável para guardar os dados do registro Lista de campos : campos que serão utilizados no registro Tipo_primitivo: é o tipo de dado dos campos de cada lista
EXERCÍCIO RESOLVIDO Faça a declaração de uma variável para armazenar o boletim apresentado na Figura 28.
SOLUÇÃO Passo 1: Estaelecer os campos que irão compor o registro
Um campo para armazenar o nome do aluno e quatro campos para armazenar as notas
Passo2:Denirumnomeparacadacampo
Nome para armazenar o nome do aluno Nota1, Nota2, Nota3, Nota4 para armazenar as notas
Estrutura de Dados Curso de Licenciatura em Informática
69
UNIDADE 2 Estruturação de Dados
Passo3:Denirostiposdoscampos
Nome é alfanumérico Nota1 é numérico Nota2 é numérico Nota3 é numérico Nota4 é numérico
Passo 4: Fazer as listas de campos de um mesmo tipo
Alfanumérico: Nome Numérico: Nota1, Nota2, Nota3, Nota4
Passo 5: Declarar a variável tipo registro utilizando os campos do Passo 3
Boletim: Registro Nome : Alfanumérico; Nota1, Nota2, Nota3, Nota4: numérico; Fim_Registro
Estrutura de Dados Curso de Licenciatura em Informática
70
UNIDADE 2 Estruturação de Dados
SAIbA MAIS SObRE REGISTROS LEITURA http://www.esj.eti.r/Apostilas/EstruturasDeDados.pdf http://www.slideshare.net/regispires/linguagem-c-07-registrospresentation http://www.inf.pucrs.r/~cnunes/lapro/aulas/structs.pdf VÍDEOS http://www.youtube.com/watch?v=J16KeS8VL-g http://www.youtue.com/watch?v=dUdIeRE0F0
EXERCÍCIOS DE FIXAÇÃO
1) Declare uma variável para armazenar os dados de catalogação de um livro em uma livraria (titulo, autor, preço unitário, estilo, Disponível para venda, valor unitário e total). 2) Declare uma variável para cadastrar um vendedor, suas metas de venda no departamento para cada mês. 3) Pesquise uma linguagem de programação (Linguagem C, por eemplo) e veriquecomodeclarareutilizarRegistronestalinguagem. 4) Traduza os algoritmos dos eercícios 1 e 2 para a linguagem de programação pesquisada no eercício 3.
Estrutura de Dados Curso de Licenciatura em Informática
71
UNIDADE 2 Estruturação de Dados
2.2.1.2 - MANIPULAÇÃO DOS DADOS DO REGISTRO A manipulação dos dados de uma variável tipo registro pode ocorrer em duas situações: Quando for necessário acessar todo o registro. Para indicar que serão manipulados todos os campos, basta colocar o nome da variável denida como Registro. Neste caso, indica que serão fornecidos ou apresentados todos os campos do registro. Leia (oletim); Escreva (oletim);
Quando for necessário acessar apenas um dado do registro. Para apresentar um dado especico será necessário colocar o nome da variável, um ponto e o nome do campo que será especicado:
Leia (oletim.Nome); Escreva (oletim.Nota1); oletim.Nota3
f
oletim.Nome
f
8,0;
“JoãodaSilvaSauro”;
EXERCÍCIO RESOLVIDO Faça um algoritmo para armazenar os dados do aluno conforme mostrado no quadro a seguir, ler duas notas e depois mostrar o que foi armazenado.
Nome Buck Ramel
Matriculado sim
Conclusão do curso não
A solução é apresentada no algoritmo a seguir. Compare com o algoritmo desenvolvido por você. Estude e tente entender cada parte do algoritmo, conforme os conceitos apresentados até o momento.
Estrutura de Dados Curso de Licenciatura em Informática
72
UNIDADE 2 Estruturação de Dados
Algoritmo boletim_Aluno Variáveis boletim: Registro Nome : Alfanumérico; Nota1, Nota2 : numérico; Matricula, Conclusao : Lógico; Fim_Registro Inicio // inserção de dados no registro boletim.Nome
“BuckRamel”;
f
boletim.Matricula
f
boletim.Conclusao
V;
f
F;
Escreva (“Forneça a 1ª nota:”); Leia (boletim.Nota1); Escreva (“Forneça a 1ª nota:”); Leia (boletim.Nota2); // apresentação do Relatório Escreva(“RelatóriodoEstudante”); Escreva (boletim); Fim.
2.2.1.3 - CONJUNTO DE REGISTROS Se observarmos o algoritmo desenvolvido, poderemos concluir que ele não tem muita utilidade. Mesmo que o algoritmo seja modicado para ler os valores a serem armazenados, ainda assim, ele irá armazenar apenas um registro. A nalidade deste arquivo é totalmente didática, para demonstrar a manipulação de um registro. Para ter alguma utilidade, precisamos ter mais registros. Por exemplo, em uma sala de aula podemos precisar controlar o registro de vários alunos. Pelos motivos já apresentados anteriormente, não é nada viável criar uma variável Boletim para cada aluno. Uma solução para isto pode ser combinar vetores e registros como apresentado na Figura 29. A estrutura da gura apresenta um vetor de n posições. Cada posição do vetor contém um registro, ao invés de ser um valor primitivo de dado como estávamos utilizando até o momento.
Estrutura de Dados Curso de Licenciatura em Informática
73
UNIDADE 2 Estruturação de Dados
Figura 29: Vetor com registros como conteudo
EXERCÍCIO RESOLVIDO Faça um algoritmo para arquivar o registro individual dos estudantes de uma sala com 80 alunos. O controle precisa ter o nome dos alunos, duas notas, situação da matricula e da conclusão. SOLUÇÃO
Apesar do enunciado ser diferente, observe que os dados são os mesmos do exercício anterior. O que modica é a necessidade de ter 80 registros. Isto pode ser resolvido com a inserção de um vetor de 80 posições, conforme mostrado a seguir. Note que o dado do vetor agora é do tipo Registro. Algoritmo boletim_Sala Variáveis boletim: Registro Nome : Alfanumérico; Nota1, Nota2 : numérico; Matricula, Conclusao : Lógico; Fim_Registro Sala: Vetor [ 1 : 80 ] de boletim; x : numerico; Inicio //inserçãodedadosnoregistrodenindodiretamenteodado Para x 1 até 80 faça Leia (Sala [ x ] . Nome); Leia (Sala [ x ] . Matricula); Leia (Sala [ x ] . Conclusao); Leia (Sala [ x ] . Nota1); Leia (Sala [ x ] . Nota1); Fim_Para; // Apresentando os dados na forma de acesso geral Para x 1 até 80 faça Escreva (Sala [ x ]; Fim_Para; f
f
Estrutura de Dados Curso de Licenciatura em Informática
74
UNIDADE 2 Estruturação de Dados
No caso de uma escola com 10 salas, podemos utilizar uma matriz 10 linhas (uma para cada sala) por 80 colunas (uma para cada aluno da sala). Tente fazer o algoritmo para esta escola. Pense um pouco, você consegue. Se tiver diculdade, releia os conceitos apresentados até agora e busque os fundamentos para resolver este probleminha.
2.2.2 - ARQUIVOS Até o momento, utilizamos variáveis simples ou compostas para armazenar os dados necessários nos algoritmos desenvolvidos. Entretanto, esses algoritmos têm uma limitação: a quantidade de informação que pode ser armazenada.
Um arquivo pode armazenar vários registros
No mundo real, uma estrutura prática para armazenar informações é o arquivo. Sua principal nalidade é o armazenamento de grande quantidade de informações por um grande período de tempo. Um arquivo de aço escolar onde são armazenadas as chas de registro dos estudantes é um exemplo físico de arquivo. Os dados do aluno (nome, notas, etc) são colocados na cha do estudante. A cha é armazenada no arquivo, juntamente com as chas d outros estudantes. Em outras palavras, os dados ou campos são agrupados em um registro e os registros são armazenados em um arquivo, conforme ilustrado na Figura 30.
Figura 30: Estruturação de dados no arquivo
Estrutura de Dados Curso de Licenciatura em Informática
75
UNIDADE 2 Estruturação de Dados
É interessante notar que as informações nas chas dos estudantes podem ser manipuladas por diversas pessoas e independente da forma que cada pessoa utilize para obter informações. Assim como no arquivo de aço da escola, a estrutura computacional do tipo arquivo pode ser acessada por algoritmos (programas) diferentes com diferentes nalidades.
2.2.2.1 - DECLARAÇÃO DE ARQUIVOS Como o arquivo é um conjunto de registros, é necessário primeiro declarar o re gistro que irá compor o arquivo. Após a denição do registro, o arquivo poderá ser declarado. Recordando a declaração de registro:
Nome_variavel_REG: Registro lista de campos 1: Tipo_primitivo 1; lista de campos 2: Tipo_primitivo 2; .
.
.
lista de campos n: Tipo_primitivo n; Fim_Registro
Onde: Nome_variável_Reg é o nome da variável para o registro Lista de campos : campos que serão utilizados no registro Tipo_primitivo: é o tipo de dado dos campos de cada lista
A declaração de arquivo é da seguinte forma Nome_variavel_ARQ: Arquivo composto de Var_Reg;
Onde: Nome_variável_ARQ : é o nome da variável do arquivo Var_Reg : é a variável tipo registro que comporá o arquivo
Estrutura de Dados Curso de Licenciatura em Informática
76
UNIDADE 2 Estruturação de Dados
Juntando as duas declarações, teremos a forma correta de declarar um arquivo. Nome_variavel_REG: Registro lista de campos 1: Tipo_primitivo 1; lista de campos 2: Tipo_primitivo 2; .
.
.
lista de campos n: Tipo_primitivo n; Fim_Registro; Nome_variavel_ARQ: Arquivo composto de Var_Reg;
2.2.2.2 - ORGANIZAÇÃO DE ARQUIVOS Um arquivo contém um grupo de registros armazenados em alguma ordem, normalmente sequencial. Assim, o arquivo é composto do inicio do arquivo, um ou mais registros e do nal do arquivo. Para ver o conteúdo do arquivo, é necessário abrir o arquivo. Após abrir o arquivo, ele será posicionado no inicio do arquivo. Para ler os registros do arquivo, precisamos navegar no arquivo. A navegação no arquivo signica avançar para o próximo registro ou retornar para o registro anterior. O registro que está sendo acessado é denominado registro corrente. Estes conceitos serão muito importantes na manipulação de arquivos em aplicações pr áticas. A Figura 31 ilustra o conceito básico de organização para navegação no arquivo.
Figura 31: Organização do arquivo
2.2.2.3 - MANIPULAÇÃO DE ARQUIVOS Todo arquivo possui maneiras semelhantes de ser manipulado. Em outras palavras, existem operações comuns a todos os tipos de arquivos.
Estrutura de Dados Curso de Licenciatura em Informática
77
UNIDADE 2 Estruturação de Dados
Vamos, inicialmente, vericar as operações que podem ser realizadas com o arquivo de aço para guardar as chas de estudantes:
OPERAÇÃO
Consulta
Inserir dados •
PASSOS
•
Abrir gaveta
•
Buscar ficha
•
Copiar informação Fechar gaveta
•
• • •
Abrir gaveta Buscar ficha Inserir dado novo Fechar gaveta
Alterar dados Excluir dados •
Abrir gaveta
•
Buscar ficha
•
Alterar dados Fechar gaveta
•
•
Abrir gaveta
•
Buscar ficha
•
Retirar a ficha Fechar gaveta
•
Veja que nas diferentes operações, a ação começa com a abertura da gaveta e encerra com o fechamento. Após a abertura da gaveta, é realizada uma operação de localização da cha ou posição do dado para, então, realizar a operação desejada. Podemos generalizar nos seguintes passos: • Arir arquivo • Localizar registro ou dado • Ação desejada • Fechar arquivo
AbRINDO UM ARQUIVO
Não é possível obter nenhuma informação sem abrir a gaveta do arquivo. No nosso algoritmo, não é possível ler os dados do arquivo sem abrir o mesmo. Para abrir o arquivo utilizaremos o comando “abra” da seguinte forma: Ara ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
Estrutura de Dados Curso de Licenciatura em Informática
78
UNIDADE 2 Estruturação de Dados
FECHANDO UM ARQUIVO
Não é conveniente deixar a gaveta aberta após sua utilização. A gaveta fechada mantém protegido o seu conteúdo. Da mesma forma, após a utilização do arquivo, ele deve ser fechado para evitar algum dano ou acesso indesejado ao seu conteúdo. Para fechar o arquivo, utilizaremos o comando “Feche” da seguinte forma: Feche ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
COPIANDO UM REGISTRO
Ao consultar os dados de um arquivo, não é seguro manipular o registro do arquivo diretamente. Uma manipulação segura deve transferir os dados do registro para uma variável e manusear essa variável. Assim, devemos criar uma variável com uma estrutura igual à do registro utilizado no arquivo e copiar os dados para esta variável para manipular os dados de forma segura. Esta variável normalmente é denominada de variável auxiliar. Após denida a variável auxiliar, copiamos para ela os dados do registro corrente. Esta operação é realizada com o comando “copie” da seguinte forma: Copie ( Nome_ARQ , var_au ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo var_ au : é o nome da variável auxiliar para onde serão copiados os dados do
registro
GUARDANDO UM REGISTRO
Também podemos inserir dados no arquivo. Inicialmente, devemos ter uma variável auxiliar para receber os dados. Estrutura de Dados Curso de Licenciatura em Informática
79
UNIDADE 2 Estruturação de Dados
Após inserir os dados desejados na variável, podemos inserir um novo registro no arquivo a partir desta variável auxiliar. Basta inserir os dados da variável no arquivo. Ao utilizar o comando “guarde”, os dados da variável auxiliar são inseridos no arquivo. Guarde ( Nome_ARQ , var_au ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo var_ au : é o nome da variável auxiliar
ELIMINANDO UM REGISTRO
Quando um determinado registro não for mais necessário, o registro pode ser eliminado. O comando “Elimine” exclui o registro corrente do arquivo. Elimine ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
NAVEGANDO NO ARQUIVO
Para acessar e manipular os dados no arquivo, devemos navegar entre os registros. A navegação consiste em avançar ou retornar na seqüência de arquivos a partir da posição corrente. Para ir para o próximo registro do arquivo, após o registro corrente, utilizamos o comando “Avance”. Avance ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
Estrutura de Dados Curso de Licenciatura em Informática
80
UNIDADE 2 Estruturação de Dados
Para retornar para o um registro anterior ao registro corr ente, utilizamos o comando “Recue”. Recue ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
Durante a navegação no arquivo, podemos atingir o início ou nal do arquivo. Estando no início do arquivo não se pode recuar pelo fato de não haver para onde recuar. Da mesma forma, no nal do arquivo, não é possível avançar. Caso se tente uma das duas situações, haverá um erro no processamento. Para evitar esta situação, devemos fazer um teste para vericar se estamos em uma destas posições. Para testar se a posição corrente é o inicio do Arquivo, utilizamos o comando “IDA”. Este comando é especialmente útil quando estivermos fazendo uma pesquisa do nal para o inicio do arquivo. Também pode ser utilizado para testar se existem registros no arquivo. IDA ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
Outro comando importante na manipulação de arquivos e na procura de dados é o teste de nal de arquivo. Para testar se a posição corrente é o nal do Arquivo, utilizamos o comando “FDA”. FDA ( Nome_ARQ ) ;
Onde: Nome_ ARQ : é o nome da variável do arquivo
De maneira geral, os comandos básicos para manipulação dos arquivos permitem realizar a maioria das tarefas com arquivos. A combinação destes comandos com as técnicas de programação possibilitam a construção de aplicações com diferentes graus de complexidade, possibilitando o desenvolvimento de soluções e informações para diferentes necessidades.
Estrutura de Dados Curso de Licenciatura em Informática
81
UNIDADE 2 Estruturação de Dados
SAIbA MAIS SObRE ARQUIVOS
LEITURA http://www.esj.eti.br/Apostilas/EstruturasDeDados.pdf http://pt.wikipedia.org/wiki/Arquivo_de_computador http://pt.wikipedia.org/wiki/Formato_de_arquivo VÍDEOS http://www.youtube.com/watch?v=lHwHbr6umqY&feature=related http://www.youtube.com/watch?v=vSLR5Y6weAY&feature=related http://www.youtube.com/watch?v=WNNV60_x0lg&feature=related http://www.youtube.com/watch?v=Yitm-jyODVQ&feature=related http://www.youtube.com/watch?v=PsHbclSO_4k&feature=related
Os comandos de manipulação apresentados serão abordados com mais detalhes na Unidade III, onde iremos utilizar arquivos para estudar as aplicações com registros. Enquanto não chegamos na Unidade III, sugerimos pesquisar como estes comandos são denidos em uma linguagem de programação. Desta forma, quando estivermos trabalhando estes comandos, poderemos traduzir para a linguagem de programação e vericar o funcionamento e a aplicação em um computador.
Estrutura de Dados Curso de Licenciatura em Informática
82
UNIDADE 2 Estruturação de Dados
DICAS DE LINGUAGENS DE PROGRAMAÇÃO
Na Internet existe um vasto material sobre linguagens de programação. As linguagens C e JAVA possuem muito material especico para o estudo de estrutura de dados. Entre em algum site de busca, como o google (www.google.com. br) e digite a palavra chave “estrutura de dados”. A partir disto é só pesquisar e encontrar um Link onde você consiga entender melhor o material. A seguir segue alguns sites que tratam de Linguagens C e Java. - http://www.tiexpert.net/programacao/c/index.php - http://www.tiexpert.net/programacao/java/index.php - http://www.icmc.usp.br/manuals/ssce763/ - http://www.tiexpert.net/programacao/c/struct.php - http://pt.scribd.com/doc/18011326/Estruturas-de-Dados-Em-C - http://lampiao.ic.unicamp.br/maratona/?name=estruturas No momento, vamos ilustrar um algoritmo que demonstra a inserção do registro de um aluno no arquivo. Algoritmo Arquivo_Sala Variáveis boletim, x: Registro Nome : Alfanumérico; Nota1, Nota2 : numérico; Matricula, Conclusao : Lógico; Fim_Registro Sala: Arquivo composto de boletim; Inicio Leia ( x ); ara ( sala ); guarde ( sala , x ); Feche ( sala ); Fim.
Estrutura de Dados Curso de Licenciatura em Informática
83
UNIDADE 2 Estruturação de Dados
As aplicações com registros são muito úteis para a manipulação de d ados em aplicações para diversas nalidades. Entender estas técnicas é importante para o desenvolvimento de sistemas e o controle de dados e informações.
3 - ESTRUTURAS DE DADOS DINÂMICAS Como vimos, as estruturas estáticas (Vetor, Matriz e Registro), entre suas características, são utilizadas e armazenadas como uma única variável. Ao se denir um vetor, o sistema reserva um espaço na memória, proporcional ao tamanho denido pelo vetor e todos os dados do vetor são manipulados neste espaço reservado. O arquivo, apesar de não ter limitação de tamanho, também é armazenado em um espaço denido de memória, conforme o seu tamanho original. Ao inserir mais registros no arquivo, ele cara maior do que seu tamanho original. Caso o espaço reservado para o arquivo não seja suciente, ele deverá ser totalmente transferido para outro espaço de memória onde haja espaço suciente. Quanto à organização dos registros no arquivo, ele apresenta uma característica sequencial de armazenamento. Ao inserir um registro no arq uivo, ele sempre será posicionado após o ultimo registro existente. A sequência de apresentação e manipulação dos registros segue a ordem em que os mesmos foram inseridos no arquivo. Esta sequência nem sempre é adequada para manipulação dos dados, conforme o problema apresentado. Por exemplo, se precisarmos procurar um determinado registro no arquivo, deveremos percorrer os registros até encontrar o arquivo desejado. Uma solução interessante pode ser organizar o arquivo em ordem alfabética. Esta organização pode facilitar a localização do nome procurado. Estabelecer uma estrutura que ofereça liberdade na sua organização pode ser interessante para diferentes aplicações. Entretanto, mesmo com diferenças na forma de organizar o arquivo, é necessário que a manipulação continue em alto nível, sem a preocupação de saber onde o dado está armazenado sicamente. As estruturas dinâmicas oferecem um modo exível para estruturar os dados de tal forma que possibilite a organização desses dados conforme uma determinada orientação e sem preocupações quanto ao espaço onde o dado será armazenado. Para implementar uma estruturação dinâmica de dados, é necessário estabelecer alguns parâmetros para essa estruturação. Basicamente, vamos estabelecer dois parâmetros iniciais: ponteiro e organização do dado. O ponteiro é um dispositivo que possibilita posicionar a situação atual dentro da estrutura. A situação atual permite saber qual é o dado que está sendo acessado para sua Estrutura de Dados Curso de Licenciatura em Informática
84
UNIDADE 2 Estruturação de Dados
manipulação. Digamos que o ponteiro é uma espécie de referência, uma variável que contém o índice (endereço) do registro corrente. A Figura 32 ilustra o ponteiro. Na ilustração, o ponteiro está posicionado no registro 2, assim o valor da variável ponteiro contém o índice que indica a posição do ponteiro
Figura 32: ilustração do ponteiro
SAIbA MAIS SObRE PONTEIROS LEITURA http://pt.wikipedia.org/wiki/Ponteiro_%28programa%C3%A7%C3%A3o%29 http://pt.wikiooks.org/wiki/Programar_em_C/Ponteiros http://www.mspc.eng.r/info/cpp_ptr_10.shtml http://www3.di.ufp.r/liliane/aulas/ponteiros.html
VÍDEOS http://www.youtue.com/watch?v=eu9D2-cpPM&feature=related http://www.youtue.com/watch?v=j1MzkblsfI& feature=related
A organização do dado oferece condições de estabelecer o posicionamento do dado dentro da estrutura. Assim podemos saber, por exemplo, qual dado sucede o dado corrente.
Estrutura de Dados Curso de Licenciatura em Informática
85
UNIDADE 2 Estruturação de Dados
A referência de posicionamento possibilita, por exemplo, alterar a ordem de um dado dentro da sequência. Por exemplo, se temos a sequência ADF e quisermos inserir o dado B mantendo uma ordem alfabética, o B será posicionado entre o A e o D, e dessa forma a sequência nal será ABDF. Na estrutura de registro convencional, a seqüência caria ADFB, onde o dado B caria colocado na última posição. Para possibilitar a organização do dado, é necessário fazer uma pequena modicação na sua formatação. Para simplicar o processo, vamos estabelecer que toda informação contida na variável será chamada apenas de dado. Para estabelecer o mecanismo de posicionamento do dado, vamos dividir o dado em duas partes distintas: uma será a parte dos dados e a outra parte será utilizada para as referências de posicionamento do dado, conforme apresentado na Figura 33.
Figura 33: Organização de dados para estruturação dinâmica
As referências variam conforme a estrutura; normalmente há uma indicação do índice do dado e outras indicações como a posição do próximo dado e/ou do dado anterior, etc. A Figura 34 mostra um exemplo onde o dado tem o índice 7 e o próximo dado na sequência é o dado com índice 12.
Figura 34: Exemplo de um dado para estrutura dinâmica
Após ter estabelecido os parâmetros básicos para a estrutura dinâmica (ponteiro e a estruturação do dado), vamos conhecer algumas estruturas que implementam estes conceitos.
Estrutura de Dados Curso de Licenciatura em Informática
86
UNIDADE 2 Estruturação de Dados
3.1 - LISTAS Para entender o conceito de lista, vamos ilustrar com a brincadeira da caça ao tesouro. Nesta brincadeira, os participantes têm que seguir as pistas para encontrar um tesouro escondido. A primeira pista está em um cartão inicial que é mostrado a todos os participantes do jogo. Nesse cartão tem uma pista que indica o local onde está a próxima pista. O jogo segue nessa seqüência até encontrar o tesouro. Para ter direito ao tesouro, o vencedor deve apresentar uma lista com a sequência correta das pistas do início até o tesouro. Para exemplicar, vamos esconder o tesouro em uma árvore. No cartão inicial, colocaremos uma pista indicando o relógio. No relógio a pista indica uma mala. A Figura 35 mostra a sequência para o nosso jogo.
Figura 35: lista da caça ao tesouro
A sequência correta é: 1) cartão inicial, 2) relógio, 3) mala e 4) árvore. Para sistematizar o processo, podemos fazer uma anotação indicando cada local e a pista que há nesse local da seguinte forma:
ÍNDICE
LOCAL
PISTA (próximo índice)
1
Cartão inicial
2
2
Relógio
3
3
Mala
4
4
Árvore
fim
Estrutura de Dados Curso de Licenciatura em Informática
87
UNIDADE 2 Estruturação de Dados
Suponha agora que queremos acrescentar um fogão no jogo. Na sequência, o fogão deverá car entre a mala e a arvore. Como o fogão foi inserido depois, o índice dele é o 5. Assim, o índice da mala deverá indicar o fogão e o fogão deverá indicar a árvore. A tabela dos dados agora deve car da seguinte forma:
ÍNDICE
LOCAL
PISTA (próximo índice)
1
Cartão inicial
2
2
Relógio
3
3
Mala
5
4
Árvore
Fim
5
Fogão
4
Partindo do início, a nova sequência será ( 1 - 2 - 3 - 5 - 4 – Fim ). Observe que cada linha da tabela tem a estrutura de dado dinâmica apresentada na Figura 36. Neste caso, as referências são o índice e a pista. O índice identica o dado e a pista indica o próximo dado na sequência. Observe que com esta organização, também podemos mudar a ordem das pistas para fazer um nova sequência para o mesmo jogo. Uma lista é exatamente isto: uma sequencia organizada de alguma forma. Quando estabelecemos qual a ordem da sequencia dos elementos de uma lista, estamos fazendo o que se denomina uma lista encadeada. Uma lista encadeada estabelece a ordem dos elementos na lista. Cada elemento do conjunto de dados pode ser descrito como Indice (identicador do dado), Local (dado) e Pista (próximo dado na lista). Considerando esta estrutura a nossa lista pode ser representada como na Figura 36.
Figura 36: estruturação da lista da caça ao tesouro
Os dados podem estar em qualquer lugar mas, o encadeamento da lista irá assegurar que seja seguida a ordem estabelecida. Da mesma forma que foi inserido um novo componente entre dois componentes já existentes na lista, outras operações também podem ser realizadas. Pode-se alterar a ordem Estrutura de Dados Curso de Licenciatura em Informática
88
UNIDADE 2 Estruturação de Dados
da lista, excluir um elemento, etc. Para efeitos de organização da lista, o dado não é relevante. No mec anismo da lista os elementos importantes são o indice do dado e a referência do próximo elemento da lista. O indice não pode ser alterado, normalmente é um endereço da memória onde o dado está armazenado. As operações são realizadas na parte de referência do próximo elemento. A alteração desta referência altera a ordem da lista. A lista é um elemento básico para a organização de outras estruturas dinâmicas.
SAIbA MAIS SObRE LISTAS http://equipe.nce.ufrj.r/adriano/c/apostila/lista.htm http://pt.wikiooks.org/wiki/Programar_em_C/Listas_encadeadas http://www.dca.fee.unicamp.r/cursos/EA876/apostila/HTML/node31.html http://www.youtue.com/watch?v=N2RKr0xwcVM&feature=related
3.2 - FILAS Filas são estruturas de dados que se comportam como as las que conhecemos. Por exemplo, a la de atendimento num caixa bancário, como representado na Figura 37. Nesta la, o primeiro que chega é atendido e sai da la para que o segundo seja atendido e assim por diante.
Figura 37: Fila de atendimento
Uma la é uma lista encadeada, porém caracterizada por manter uma ordem: todos os elementos entram sempre no nal da la e o elemento que sai é sempre o primeiro da la, igual na la real. Devido a esta ordem o primeiro que entra é o primeiro que sai, a la é um dispositivo FIFO (First In, First Out – abreviação do inglês que signica primeiro que entra, primeiro que sai).
Estrutura de Dados Curso de Licenciatura em Informática
89
UNIDADE 2 Estruturação de Dados
Assim, uma la é uma lista em que as inserções são feitas no nal e as remoções são feitas no início. A nalidade principal de uma la é registrar a ordem de chegada dos componentes.
SAIbA MAIS SObRE FILAS http://www.ime.usp.br/~pf/algoritmos/aulas/la.html http://sdevlab.wordpress.com/2010/06/17/cc-las-fo/ http://www.youtue.com/watch?v=VWpurzEmj24&feature=related
3.3 - PILHAS Uma pilha é um mecanismo semelhante ao processo que utilizamos ao guardar coisas em uma caixa, por exemplo. Para retirar os objetos da caixa, temos que retirar na ordem inversa, ou seja, o ultimo objeto que colocamos é o primeiro a ser retirado. Não conseguimos retirar o primeiro objeto que colocamos, sem retirar os que foram colocados antes dele. Na Figura 36 temos um exemplo de pilha. O primeiro objeto colocado está no fundo do cesto e o ultimo a ser colocado no cesto, cara sobre os objetos, em cima de todos os objetos. Os objetos estão empilhados dentro do cesto. Se quiser tirar um objeto, será necessário retirar o que está em cima, depois o próximo e assim por diante até o nal.
Figura 38: Estruturação da Pilha
Assim como as las, as pilhas são uma lista na qual é aplicada uma disciplina de acesso denominada LIFO (Last In First Out – do inglês que signica último a entrar, primeiro a sair). Assim, na la, todas as inserções e remoções são feitas no nal da pilha.
Estrutura de Dados Curso de Licenciatura em Informática
90
UNIDADE 2 Estruturação de Dados
A nalidade principal deste mecanismo é tornar disponíveis primeiro os elementos mais recentes. Este dispositivo é útil em muitas aplicações computacionais, como, por exemplo, as funções recursivas, onde a rotina naliza o processamento a partir da ultima chamada de função até a chamada inicial.
RECURSIVIDADE EmCiênciadaComputação,arecursividadeéadeniçãode uma surotina (função ou método) que pode invocar a si mesma.
Veja mais sore recursividade nos links a seguir: http://pt.wikipedia.org/wiki/Recursividade_%28ci%C3%AAncia_da_ computa%C3%A7%C3%A3o%29 http://www.youtue.com/watch?v=fRQcu0vS_6Q&feature=related
Outra aplicação conhecida de pilha é no calculo do fatorial de um número qualquer. Como sugestão, verique como calcular o fatorial e compare com o processo da pilha.
SAIbA MAIS SObRE PILHAS http://pt.wikipedia.org/wiki/Pilha_(informática) http://www.ime.usp.r/~pf/algoritmos/aulas/pilha.html http://pt.wikipedia.org/wiki/LIFO http://www.youtue.com/watch?v=l-LW7OURs&feature=related http://www.youtube.com/watch?v=LWNgE2JnLjE&feature=related http://www.youtue.com/watch?v=9j_lrZvgrs&feature=related
Estrutura de Dados Curso de Licenciatura em Informática
91
UNIDADE 2 Estruturação de Dados
3.4 - ÁRVORES A arvore é uma lista na qual cada elemento possui dois ou mais sucessores, porém todos os elementos possuem apenas um antecessor, como pode ser observado na Figura 39.
Figura 39: Estrutura de dados em arvore
A idéia básica é a representação de uma árvore real, onde do tronco principal podem sair vários galhos, de cada galho podem sair outros galhos. Porém, cada galho só sai de um único galho anterior. O primeiro elemento que dá origem aos demais é chamado de raiz da árvore ou nóraiz. Na Figura 39, o elemento A é o nó-raiz. Qualquer elemento da árvore é chamado de nó. A quantidade de níveis a partir do nó raiz até o nó mais distante é denominado de altura da árvore. Os sucessores de um determinado nó são chamados de lhos ou nó lho. O antecessor de um nó é chamado de pai ou nó pai.O elemento nal de cada ramicação (elemento sem ramicação) é denominado de folha.
SAIbA MAIS SObRE ARVORES http://pt.wikipedia.org/wiki/Topologia_em_%C3%A1rvore http://pt.wikipedia.org/wiki/Árvore_(estrutura_de_dados) http://www.dep.ufmg.r/professores/miranda/InAlgol/Arvores.pdf http://equipe.nce.ufrj.r/adriano/c/apostila/arvore.htm http://pt.wikiooks.org/wiki/Programar_em_C/%C3%81rvores_inárias
Estrutura de Dados Curso de Licenciatura em Informática
92
UNIDADE 2 Estruturação de Dados
A árvore é uma estrutura útil em diversas aplicações computacionais. Tem aplicação para organização de sistemas de pesquisa e busca. Esta característica é especialmente empregada na área de computação com inteligência articial.
INTELIGÊNCIA ARTIFICIAL AInteligênciaArticial(IA)éumaáreadaComputação,dedicadaa uscar métodos ou dispositivos computacionais que possuam ou simulem a capacidade racional de resolver prolemas, pensar ou, de forma ampla, ser inteligente.
Saia mais sore IA em: http://pt.wikipedia.org/wiki/Inteligência_articial
SISTEMATIZAÇÃO DE Aprendizagem 1. Quais vantagens da estruturação de dados? 2. Qual a diferença entre vetor e matriz? 3. Escolha um local de sua convivência e selecione uma parte na qual você possa utilizar um vetor para representar os dados. 4. Estude a sua cidade e apresente uma situação para utilizar uma matriz para representar os dados. Dena claramente o tamanho e os dados a serem representados. 5. Escolha um documento que contenha várias informações e estruture sua representação com um registro. 6. Escreva um algoritmo que leia 100 nmeros quaisquer fornecidos pelo usuário. Após a inserção dos nmeros, deverá ser calculada a média e apresentar um relatório com os nmeros inferiores a média. Estrutura de Dados Curso de Licenciatura em Informática
93
UNIDADE 2 Estruturação de Dados
7. Faça um algoritmo para ler 500 nomes de funcionários. Depois deverá ser emitido um relatório com os nomes na ordem inversa em que foram digitados. 8. Construa um algortimo para inserir nmeros inteiros em uma matriz 8 x 4. Após a inserção de dados deverá ser calculada a soma total da matriz e as somas de cada linha e de cada coluna. 9. Elaore um algoritmo que leia dois vetores de 50 elementos cada. Depois deverá criar um terceiro vetor de 100 elementos. Neste vetor, deverão ser guardados os dois outros vetores, porem intercalados, um elemento de um vetor e um do outro vetor. 10. Faça um algoritmo para uma matriz 10 x 10 e calcule a soma dos nmeros de cada coluna e a soma de cada linha. 11. Faça um algoritmo para ler dados de uma matriz e apresentar o maior nmero de cada linha. 12. Faça um algoritmo para ler 20 notas dos 30 alunos de uma turma. Faça uma listagem onde deve ser relacionada a maior nota de cada coluna de notas. 13.
Eplique a diferença entre registro e arquivo.
14. Selecione uma nota scal e faça a estruturação de um registro para armazenar os dados. 15. Faça um algoritmo para armazenar a inscrição dos candidatos de um concurso.
Estrutura de Dados Curso de Licenciatura em Informática
94
UNIDADE 2 Estruturação de Dados
CONSIDERAÇÕES FINAIS Nesta unidade foram estudadas algumas técnicas para estruturação de dados. Os conceitos foram apresentados visando ao entendimento didático das estruturas, sem maior aprofundamento dos detalhes de programação. A programação das estruturas poderá ser implementada nas disciplinas de laboratório de programação. As estruturas estáticas tiveram maior atenção devido a sua maior familiarização; esse é o escopo de estudo do curso de Licenciatura. Os conceitos das estruturas dinâmicas foram apresentados de forma mais generalizada de maneira informativa, para que o estudante tenha conhecimento do mecanismo e sua potencial aplicabilidade. Como os conceitos foram apresentados visando ao entendimento dos mesmos, eles não foram esgotados em sua profundidade de possibilidades e exercícios. Sugerimos e incentivamos a busca de maior aprofundamento nos conhecimentos e exercícios dos tópicos apresentados na bibliograa de referência, pois julgamos ser essa a forma viável e mais prática para a xação da aprendizagem, anal aprende-se a fazer, fazendo, certo? Diante dos conceitos apresentados, podemos constatar as possibilidades oferecidas para solucionar os problemas reais e fazer uma representação computacional que atenda âs necessidades. A compreensão dos conceitos é essencial para entender a capacidade de solucionar computacionalmente a diversidade de desaos apresentados. Desta forma, podemos compreender a relevância do estudo de Estrutura de Dados para os cursos da área de Informática.
Estrutura de Dados Curso de Licenciatura em Informática
95
UNIDADE 2 Estruturação de Dados
Algoritmo : Sequência lógica de passos que conduzem a solução de um prolema Heterogêneo : Dados de tipos diferentes Homogêneo : Dados de um mesmo tipo Inconsistente : Diferentes, divergentes. O dado ou informação não está correto. Índice:Umnúmeroqueidenticaumelementodentrodeumasériedeelementos Laço : Estrutura que possiilita a repetição de um ou mais comandos
Manipular:Realizaroperações(alterar,recuperar,excluir,inserir,etc) Navegação no arquivo : Operação de percorrer os registros, avançando ou recuando. Ponteiro : Variável de sistema para indicar uma determinada posição. Semântica : Organização de comandos, estrutura ou frase. Simultâneo : Ao mesmo tempo Variável auxiliar : Uma variável que serve para receer dados de forma temporária. Variável composta : Variável com mais de um tipo de dado
Estrutura de Dados Curso de Licenciatura em Informática
96
UNIDADE 2 Estruturação de Dados
REFERÊNCIAS BIBLIOGRÁFICAS ASCENCIO, A.F.G. e CAMPOS, E.A.V. Fundamentos de programação de computadores. 2ª Ed. São Paulo, Pearson, 2007. FORbELLONE, A.L.V. e EbERSPACHER, H.F. Lógica de Programação – A construção de algoritmos e estruturas de dados. 3ª Ed. São Paulo, Pearson, 2005. TANENbAUM, A.M. Estruturas de dados usando C. São Paulo, Pearson, 2007. PUGA, S. e RISSETTI, G. Lógica de programação e estruturas de dados com aplicaçõesemJava.2ªEd.SãoPaulo,Pearson,2009.
Estrutura de Dados Curso de Licenciatura em Informática
97
UNIDADE 3 Aplicações
APLICAÇÕES
3 Estrutura de Dados Curso de Licenciatura em Informática
98
UNIDADE 3 Aplicações
INTRODUÇÃO Nesta unidade iremos estudar algumas aplicações que mostram a importância da estruturação de dados para agilizar o processo de desenvolvimento e organização da informação. Nesta unidade, poderemos entender como utilizar as estruturas para organizar os dados em uma determinada ordem desejada, empregando os conceitos apresentados na Unidade II. Também será discutido como as estruturas possibilitam encontrar um dado especico entre tantos outros dados. Nesta unidade, iremos aplicar conceitos já desenvolvidos nas unidades anteriores e nas disciplinas de Lógica Matemática e Programação de Computadores. Caso você não compreenda alguma estrutura, procure rever as unidades anteriores e as disciplinas já cursadas para que você possa acompanhar, sem maiores problemas os conteúdos e exercícios apresentados. Neste momento, é interessante você voltar um pouco no tempo e avaliar o seu desenvolvimento na disciplina. Reita, por certo, houve ganhos! Verique o quanto você tinha receio de complicar-se com algo que tivesse a aparência de um algoritmo, mesmo que fosse uma simples atribuição. Agora você está nalizando uma das áreas que muitos têm as maiores diculdades; você esta olhando e compreendendo as estruturas de dados. As aplicações que serão apresentadas nesta unidade têm a nalidade de mostrar a você que os conceitos não se aplicam apenas à teoria. Eles podem ser uma valiosa ferramenta para gerar e gerir a informação de forma mais eciente. Então, vamos aproveitar este ânimo e vencer mais esta pequena etapa! Esta Unidade tem por objetivo: • Vericar as formas de manipular a informação através do estudo das aplicações; • Apresentar as técnicas para ordenação e busca de dados.
Estrutura de Dados Curso de Licenciatura em Informática
99
UNIDADE 3 Aplicações
1 - APLICAÇÕES DE ESTRUTURA DE DADOS Antes de iniciar os nossos estudos, vamos voltar ao problema que nos levou a entender a importância da estrutura de dados: o controle de muitas variáveis com os mesmos objetivos. Já que passamos por esta fase, vamos utilizar apenas três variáveis para entender a complexidade dos problemas de busca e ordenação. Para os nossos estudos, vamos supor que vamos trabalhar com notas de provas: nota1, nota2 e nota3. Para nós humanos, é algo simples responder algumas questões sobre estas notas, como, por exemplo: Qual a maior e a menor nota? Qual a nota intermediária? Qual a ordem das notas? Transpor isto para um computador não é tão simples. Estabelecer a maior e a menor, não é complicado, mas a posição intermediária já é um problema mais complicado. Colocar as notas em ordem também não é nada simples. Vamos analisar o trecho do algoritmo para estabelecer qual é a maior nota. Considerando que as notas estão no intervalo de 0 a 10 e não sabemos qual o valor das notas, podemos estabelecer uma referência inicial para a nota maior como sendo zero. Qualquer valor a ser comparado inicialmente será maior que zero, exceto o próprio zero. Após a primeira comparação, iremos comparar nota a nota para vericar se existe alguma nota maior do que o valor considerado maior. No caso de três notas distintas, teremos: //inicialização da referência maior 0; f
// Compara cada nota com a referência // se for maior atriui o valor da nota como referência Senota1>maiorentão maior nota1; Fim_Se; f
Senota2>maiorentão maior nota2; Fim_Se; f
Senota3>maiorentão maior nota3; Fim_Se; Escreva(maior); f
Estrutura de Dados Curso de Licenciatura em Informática
100
UNIDADE 3 Aplicações
Para estabelecer a nota menor, basta seguir o mesmo raciocínio. Porém, a referência será o valor 10, assim qualquer valor lido deve ser menor. A comparação também muda o símbolo, porque deveremos utilizar a pergunta lógica se a nota é menor que a referência. Da mesma forma que no algoritmo anterior, iremos comparando nota a nota até ter lido todas as notas e estabelecido qual é o valor da menor nota. Observe que a diferença dos algoritmos será apenas a troca da referência de maior para menor e o símbolo da comparação. Assim, teremos o seguinte trecho de algoritmo para estabelecer qual o valor da menor nota: //inicialização da referência menor 10; f
// Compara cada nota com a referência // se for menor atriui o valor da nota como referência Se nota1 < menor então menor nota1; Fim_Se; f
Se nota2 < menor então maior nota2; Fim_Se; f
Se nota3 < menor então menor nota3; Fim_Se; f
Escreva(menor);
Estrutura de Dados Curso de Licenciatura em Informática
101
UNIDADE 3 Aplicações
Claro que podemos agilizar o processo e fazer um único algoritmo para estabelecer a maior e menor nota. Para isto, podemos fazer o seguinte: maior menor
f
0; 10
f
Senota1>maiorentão maior nota1; Fim_Se; Se nota1 < menor então menor nota1; Fim_Se; f
f
Ao nal de cada trecho, teremos testado cada nota em relação ao maior e menor valor. O algoritmo completo cará como segue: //inicialização das referências maior 0; menor 10; f
f
// Compara cada nota com as referências Senota1>maiorentão maior nota1; Fim_Se; Se nota1 < menor então menor nota1; Fim_Se; f
f
Senota2>maiorentão maior nota2; Fim_Se; f
Se nota2 < menor então maior nota2; Fim_Se; f
Senota3>maiorentão maior nota3; Fim_Se; Se nota3 < menor então f
Estrutura de Dados Curso de Licenciatura em Informática
102
UNIDADE 3 Aplicações
menor Fim_Se;
f
nota3;
Escreva(maior); Escreva(menor);
Após a execução do algoritmo, teremos os valores da nota maior e da nota menor. Mas qual das notas é a maior ou menor? Não temos como saber, pois serão apresentados apenas os valores. Para saber qual das notas é a maior ou menor, precisaremos utilizar uma variável auxiliar para guardar a referência da variável. Assim, dentro do teste fazer algum tipo de atribuição como O trecho de algoritmo apresentado a seguir. Se nota1 < maior então menor nota1; NotaMaior “nota1”; Fim_Se; f
f
Observe que a variável NotaMaior é do tipo alfanumérico e deve ser estabelecida para cada nota existente. Já imaginaram quantas linhas deverão ser escritas? Você está pensando que é muito trabalho, então imagine se existirem umas 20, 50, 100 notas ou mais. Acreditamos que agora você conseguiu entender a diculdade no problema. Mas ainda temos um probleminha: como estabelecer qual a nota intermediária? Para responder esta questão, e outras do mesmo tipo, nesta unidade será mostrado que a tarefa de estruturar dados pode facilitar as tarefas necessárias para o processo de prover a informação. A estruturação de dados tem uma série de aplicações práticas no mundo real. De uma forma geral, podemos dizer que existem duas aplicações básicas: ordenação e busca. Então, vamos ver como isto pode acontecer!
2 - ORDENAÇÃO Ordenação de dados é uma operação que visa estabelecer uma determinada ordem aos dados. Normalmente, os dados não são inseridos na ordem desejada. Conforme a aplicação, podemos querer que esteja em ordem crescente, decrescente, alfabética, etc. Assim, é desejável que seja estabelecida uma determinada ordem para organizar os dados.
Estrutura de Dados Curso de Licenciatura em Informática
103
UNIDADE 3 Aplicações
Ordenação é o processo de organização dos dados em uma determinada ordem.
Por exemplo, considere as vendas de um determinado departamento. Neste departamento, trabalham vários vendedores. Em um determinado período, a gerencia resolve fazer um levantamento para saber como estão as vendas. Para isto, a gerência verica o total de vendas de cada vendedor ao nal de um período e constrói o gráco de vendas do período. A Figura 40 mostra a montagem realizada pela gerência.
Figura 40: Dados de vendas
Pelo gráco é possível observar que o vendedor 3 foi o que mais vendeu e o vendedor 4 teve o menor volume de vendas. Mas qual seria a ordem de volume de vendas? Como saber a ordem por produção dos vendedores. É claro que aqui temos poucos vendedores, mas poderíamos ter mais. Neste caso organizar as vendas por volume de vendas pode ser importante para alguma tomada de decisão, ou seja, a ordem por quantidade de vendas pode ser uma informação importante e quanto melhor ela estiver ressaltada, mais fácil será para visualizar a informação e tomar uma decisão. A Figura 41 apresenta a mesma tabela Estrutura de Dados Curso de Licenciatura em Informática
104
UNIDADE 3 Aplicações
só que reorganizada em ordem crescente de volume de vendas. Compare as duas guras e observe que os dados são os mesmos, porém a ordenação dos dados já traz informações mais claras sobre os dados. Neste caso ca mais simples tomar algum tipo de decisão sobre as vendas; pois é mais simples vericar a ordem do volume de vendas.
Figura 41: Gráco ordenado de vendas
Vamos imaginar que a meta de vendas é o valor 500 no gráco. Se for necessário premiar um grupo de vendedores, não será bom para a empresa premiar todos. Também não será justo premiar apenas o que vendeu mais. Observando o gráco da Figura 40, podemos cometer algum erro na seleção dos vendedores que atingiram a meta. Já na Figura 41, que está ordenada é bem mais fácil vericar que os vendedores V1, V6 e V3 atingiram a meta e merecem o prêmio. De outra forma, pode-se armar que no gráco todos os vendedores após V1 atingiram a meta. É importante observar que esta ordem precisa fazer algum sentido e ser útil para a pessoa que vai analisar os dados; do contrário, mesmo ordenados os dados continuarão parecendo estar em desordem, ou então, não facilitam o processo da informação que leva a uma decisão. Como exemplo, imagine uma lista telefônica. Ela está em ordem alfabética, o que facilita encontrar um determinado “José”. Basta pular todos os nomes e começar a procurar a partir dos nomes que começam com a letra “J”.
Estrutura de Dados Curso de Licenciatura em Informática
105
UNIDADE 3 Aplicações
Agora imagine que ela estivesse ordenada por ordem numérica. Encontrar o João não será uma tarefa nada fácil, a não ser que, por coincidência, ele seja um dos primeiros na lista telefônica. Este é o conceito e a utilidade da ordenação: organizar os dados em determinada ordem para facilitar o processo de análise e decisão. Assim, a ordenação só será útil para fornecer a informação se o critério da ordem dos dados for inteligível para quem analisa os dados.
A ordenação dos dados facilita o processo de decisão.
Diante disto, vamos tentar entender algumas técnicas que possibilitam a orde nação de dados em um computador. Para isto, já vimos que é importante ter uma estrutura de dados como elemento fundamental no processo.
A estrutura de dados é importante para a ordenação de dados em computadores.
2.1 - Ordenação de vetores A primeira forma de ordenação que veremos é a ordenação de vetores. O entendimento da aplicação do conceito de ordenação de vetores se aplica em matrizes e será fundamental para entender outras estruturas. Antes de prosseguir, vamos rever o conceito de variável auxiliar. Uma variável auxiliar é uma espécie de memória ou rascunho no qual podemos guardar dados de forma temporária para alguma atividade no processamento. Um emprego interessante da variável auxiliar é servir como cópia de outra variável a ser manipulada. Esta cópia permite que manipulemos uma das variáveis sem perder a informação original. Na ordenação de vetores, o emprego da variável auxiliar é muito importante para não alterar diretamente os dados do vetor até o término da operação. Assim, podemos copiar o vetor para a variável auxiliar e fazer a manipulação necessária sem problemas de perda dos dados. Estrutura de Dados Curso de Licenciatura em Informática
106
UNIDADE 3 Aplicações
Para iniciar o entendimento, vamos começar com o exemplo de um vetor com nomes de pessoas, conforme ilustrado na Tabela 3.1. INDICE DO VETOR
VALOR
1
“Soa”
2
“Maria”
3
“Pedro”
4
“Duane”
5
“Emilie”
6
“José”
Tabela 3.1 – Vetor com nomes
Observando a tabela, é fácil constatar que os nomes não estão em ordem alfabética. Esta tabela contém apenas 6 nomes para simplicar o processo de entendimento da ordenação do vetor. De qualquer forma, já é possível visualizar que encontrar algum nome é necessário percorrer cada um dos elementos e vericar se é o nome desejado. Agora vamos fazer uma ordenação do vetor da Tabela 3.1 por ordem alfabética. Antes de fazer isto, que tal você ordenar manualmente o vetor para vericar como ele cará. Existem diversos métodos para ordenação que podem ser utilizados. Para o nosso exemplo, iremos utilizar uma técnica simples. Começaremos com o primeiro elemento do vetor. Iremos comparar com cada um dos outros elementos do vetor, se o outro elemento for menor, então trocamos de posição. A comparação é feita sequencialmente até o ultimo elemento do vetor. Ao nal o elemento com o menor valor estará na primeira posição. A Figura 42 ilustra a seqüência de ordenação para a primeira posição do vetor.
Figura 42: Sequência de ordenação do vetor
Como pode ser vericado, ao nal do ciclo da primeira posição, o menor valor estará ocupando a primeira posição. Após isto, passaremos para a segunda posição do vetor e a operação de comparação será repetida da terceira até a sexta posição.
Estrutura de Dados Curso de Licenciatura em Informática
107
UNIDADE 3 Aplicações
Ao terminar a segunda posição, passa para a terceira posição, sucessivamente até a penúltima posição. PENÚLTIMA posição? Será que não houve engano, pois deveria ser até a última posição, não é? Não houve engano. A vericação deve ocorrer até penúltima posição, pois ela será comparada com a ultima. Se o valor na ultima posição for menor do que na penúltima, eles serão trocados de posição, caso contrário permanecerá da mesma forma e naliza a ordenação do vetor. Vamos ver as partes do processo que serão necessárias para montar um algoritmo para ordenação do nosso vetor. Para auxiliar o processo de ordenação, vamos utilizar duas variáveis auxiliares: • uma variável auxiliar do tipo numérica para controlar o próximo índice na seqüência. Vamos estabelecer o identicador “P” (de Próximo índice) para esta variável; e • uma variável auxiliar do tipo alfanumérica para receber o nome te mporariamente. Vamos estabelecer o identicador “OrdTemp” para esta variável Para organizar cada uma das posições do vetor, iremos utilizar um laço da primeira até a penúltima posição. No nosso caso, este laço inicia no 1 e encerra na posição 5. Para L1 = 1 até 5 faça
Como iremos comparar a posição atual com cada um dos outros componentes até o nal, então utilizaremos a variável auxiliar do próximo índice para controlar o inicio do próximo laço que se inicia no próximo índice e termina no ultimo elemento. Este laço deverá car aninhado no primeiro laço. O trecho deverá car como a seguir: P L1 + 1 Para L2 = P até 6 faça f
Tendo os dois laços como referência dos índices atual e próximo, podemos fazer a comparação SeNome(L1)>Nome(L2)então
Caso a posição atual seja maior do que a posição em teste, então será necessário inverter os valores nas posições. Para isto, utilizaremos a variável auxiliar OrdTemp da seguinte forma: - Inicialmente, deveremos guardar o valor da posição atual em OrdTemp OrdTemp
f
Nome (L1)
Estrutura de Dados Curso de Licenciatura em Informática
108
UNIDADE 3 Aplicações
- Depois, colocaremos o valor menor na posição atual Nome (L1)
f
Nome (L2)
- O processo será concluído com a inserção do valor antigo que e stá em OrdTemp na posição do vetor que está em teste. Nome (L2)
f
OrdTemp
Juntando todas as partes, teremos o algoritmo completo representado no quadro a seguir. Neste algoritmo, também foi inserido um laço para possibilitar a leitura de cada um dos valores do vetor.
Algoritmo OrdenaVetor Variáveis Nome: Vetor [ 1 : 6 ] de alfanumerico; OrdTemp: alfanumerico; L1 , L2 : numerico; Inicio // inserir nomes no vetor Para L1 1 até 6 faça Escreva (“Digite o nome: ” ); Leia ( Nome [ L1 ] ); Fim_Para; // ordenação do vetor Para L1 1 até 5 faça P L1 + 1 Para L2 P até 6 faça Se Nome [ L1 ] > Nome [ L2 ] então OrdTemp Nome [ L1 ]; Nome [ L1 ] Nome [ L2 ]; Nome [ L2 ] OrdTemp; Fim_se; Fim_Para; Fim_Para; // Apresentação do vetor ordenado Para L1 1 até 6 faça Escreva ( Nome [ L1 ] ); Fim_Para Fim. f
f
f
f
f
f f
f
Estrutura de Dados Curso de Licenciatura em Informática
109
UNIDADE 3 Aplicações
Após executar o algoritmo com os nomes sugeridos, a saída deve apresentar a sequência a seguir: Duane–Emilie–José–Maria–Pedro-Soa
Com os conhecimentos que você possui, acreditamos que você consegue acomp anhar e testar o algoritmo. Se tiver alguma diculdade, procure ajuda com seus colegas e tutores. Faça testes com nomes diferentes para vericar que a saída sempre apresentará os nomes em ordem alfabética, independente da ordem com a qual você deu entrada nos nomes. O mais interessante é que você pode fazer pequenas modicações e organizar uma lista de amigos ou até uma lista telefônica a partir do algoritmo apresentado. Que tal tentar fazer sua lista telefônica e implementar em uma linguagem de programação? Existem outras técnicas de ordenação mais adequadas para diversos tipos de situação. Neste momento o mais importante é proporcionar o entendimento de como é possível organizar os dados de acordo com uma determinada nalidade. A título de exercício, sugerimos que você busque nos livros e na Internet um outro método de ordenação. Estude o método e faça uma comparação com o método apresentado no nosso estudo.
EXERCÍCIO RESOLVIDO Faça um algoritmo para ler 10 avaliações com as notas de um aluno. Ao nal, deve ser apresentado um relatório com as notas ordenadas em ordem crescente e relacionada com a avaliação correspondente. SOLUÇÃO
O primeiro passo é entender qual estrutura deve ser usada para armazenar os dados. Como teremos 10 avaliações e 10 notas, poderemos utilizar uma matriz de duas linhas e dez colunas. A primeira linha conterá o número de cada avaliação. A segunda linha o valor da nota. Assim, a matriz deverá car como a seguir: Avaliação
1
2
3
4
5
6
7
8
9
10
Nota
8,5
7
9,5
8
6
10
9
7,5
6,5
4
Estrutura de Dados Curso de Licenciatura em Informática
110
UNIDADE 3 Aplicações
Agora podemos executar os passos já descritos para ordenação. Entretanto será necessário um cuidado no momento da ordenação: manter a relação da nota com a avaliação. Para isto, será necessário adicionar mais uma variável auxiliar para copiar o número da avaliação. Lembrando que como é uma matriz, o primeiro índice equivale à linha e o segundo à coluna. Na primeira linha está o número da avaliação e, na segunda linha, a nota. AvaTemp NotTemp
f f
Nota [ 1 , 5 ]; Nota [ 2 , 5 ];
É importante lembrar que para manter a relação entre os dados, ao ser trocado de posição, todos elementos relacionados devem seguir o componente chave para ordenação. Nota [ 1,1 ] Nota [ 2,1 ]
f f
Nota [ 1,2 ]; Nota [ 2, 2 ];
Agora vamos juntar todos estes detalhes e montar um algoritmo que permite ler e ordenar as notas de acordo com a lógica que já estudamos. Algoritmo OrdenaNota Variáveis Nota: Vetor [ 1 : 2 , 1 : 10 ] de numerico; NotTemp, AvaTemp, L1 , L2, P : numerico; Inicio // inserir notas na matriz Para L1 1 até 10 faça Escreva (“Digite a nota: ” ); Nota [ 1 , L1 ] L1; // insere o numero da avaliação Leia ( Nota [ 2, L1 ] ); // insere o valor da nota Fim_Para; // ordenação do vetor Para L1 1 até 9 faça P L1 + 1 Para L2 P até 6 faça Se Nota [ 2 , L1 ] > Nota [ 2 , L2 ] então AvaTemp Nota [ 1 , L1 ]; NotTemp Nota [ 2 , L1 ]; Nota [ 1 , L1 ] Nota [ 1 , L2 ]; Nota [ 2 , L1 ] Nota [ 2 , L2 ]; Nota [ 1 , L2 ] AvaTemp; Nota [ 2 , L2 ] NotTemp; Fim_se; f
f
f
f
f
f
f
f f f f
Estrutura de Dados Curso de Licenciatura em Informática
111
UNIDADE 3 Aplicações
Fim_Para; Fim_Para; // Apresentação do vetor ordenado Para L1 1 até 6 faça Escreva ( Nota[ 1 , L1 ] , Nota[ 2 , L1 ] ); Fim_Para; f
Fim.
Faça o teste do algoritmo para vericar que no nal serão apresentadas as notas na seguinte ordem: Avaliação
10
5
9
2
8
4
1
7
3
6
Nota
4
6
6,5
7
7,5
8
8,5
9
9,5
10
Observe que as notas estão em ordem crescente, apesar da ordem da avaliação estar desordenada.
SAIbA MAIS SObRE ORDENAÇÃO EM VETORES http://pt.wikipedia.org/wiki/Ordena%C3%A7%C3%A3o_de_vector http://www.cultura.ufpa.br/ferreira/Disciplinas/EstDados2/OrdenPesq.htm
EXERCÍCIOS DE FIXAÇÃO 1) Faça um algoritmo para ler os nomes de 100 vendedores com seu respectivo valordevendas.Aonal,oalgoritmodeveapresentarumalistagemordenada pelo valor de vendas. Dica: Neste caso, você deve utilizar dois vetores. Um para os nomes e outro para as vendas. Uma solução mais avançada é utilizar um vetor com registros.
Estrutura de Dados Curso de Licenciatura em Informática
112
UNIDADE 3 Aplicações
3 - BUSCA Agora que entendemos o conceito de ordenação, vamos entender sua utilidade para uma dos principais aplicações de dados: a busca. Antes de iniciar os estudos, vamos entender o conceito e a importância de busca em processamento de dados. Quando colecionamos dados, estamos agrupando estes dados para atender alguma necessidade e responder algum problema. Esta resposta é uma informação. Por exemplo, imagine uma gaveta com meias. Para ir a uma festa, você quer utilizar uma meia preta. Então você abre a gaveta e começa a procurar uma meia preta entre as meias existentes na gaveta. Se você simplesmente tiver jogado as meias dentro da gaveta, terá que procurar uma a uma, sem qualquer estratégia ou ordem. Por outro lado, se você tiver organizado previamente as meias, por ordem de cores das mais claras para as mais escuras, então será mais fácil encontrar a meia preta. Basta ir até as últimas meias que, se houver uma meia preta na gaveta, ela estará mais ou menos nessa posição. Uma busca é isto, estabelecer uma forma para procurar e encontrar um dado especíco entre outros dados. O conjunto de todos os dados que fazem parte da pesquisa é denominado espaço de busca.
Busca é a procura de um determinado dado em um espaço de busca.
A forma mais simples de busca é a denominada busca sequencial. Para entender este tipo de busca, vamos imaginar uma la de pessoas em um caixa do banco. Em determinado momento, o operador do caixa foi orientado a encaminhar discretamente para a gerência uma pessoa da la cujo nome é Luzia do Carmo. Como o caixa não conhece a Luzia e tem que ser discreto, ele atende cada pessoa da la e verica se é a pessoa procurada. No momento em que ele encontra a Luzia, encaminha para a gerência e encerra a busca. A busca efetuada pelo operador de caixa é uma busca sequencial. Isto é, os dados no espaço de busca são pesquisados em uma seqüência, um após o outro.
Na busca sequencial a procura é realizada em sequência no espaço de busca.
Estrutura de Dados Curso de Licenciatura em Informática
113
UNIDADE 3 Aplicações
Vejamos algumas características da busca sequencial efetuada pelo operador de caixa. • No caso da pessoa procurada estar posicionada no início da la, a busca será mais rápida; • No caso da pessoa procurada estar posicionada no nal da la, a busca pode ser mais demorada. Esta busca é relativamente fácil de implementar. Vejamos como realizar esta busca em um vetor. Para realizar uma busca sequencial, basta colocar a busca dentro de um laço (para, enquanto etc.) como no trecho a seguir:
Para L 1 até Tamanho_Vetor faça Se Vetor ( L ) = Dado_procurado então; Achou L; Sai_do_laço; Fim_Se; Fim_Para; Escreva(“Odadoestánaposição:”,Achou); f
f
A partir do início do vetor, o laço percorre um a um cada elemento e verica se o dado do elemento é igual ao dado que está sendo procurado. Se for igual a posição do vetor é armazenada na variável No exemplo, foi apresentada a posição em que o dado está no vetor.
SAIbA MAIS SObRE bUSCA EM VETORES http://www.cultura.ufpa.br/ferreira/Disciplinas/EstDados2/OrdenPesq.htm http://www.ic.unicamp.br/~islene/mc102/aula16/aula16.pdf
Estrutura de Dados Curso de Licenciatura em Informática
114
UNIDADE 3 Aplicações
EXERCÍCIO RESOLVIDO 1)Faça um algoritmo para ler o nome e a nota de cada um dos 50 alunos de uma turma do curso de algoritmos. Após ter preenchido todas as notas, foi vericado que a nota de um aluno foi inserida com erro. Faça a rotina que permita encontrar e corrigir a nota do aluno. SOLUÇÃO
Para facilitar a compreensão da solução, neste exercício vamos utilizar dois ve tores, sendo um para os nomes e outro para as notas. Para este exercício poderia ser utilizada uma matriz ou um arquivo (sugerimos que você tente fazer com estas estruturas após entender a solução apresentada). Algoritmo CorrigeNota Variáveis Aluno: Vetor [ 1 : 50 ] de alfanumerico; Nota: Vetor [ 1 : 50 ] de numerico; NotaC, L , Pos : numerico; Nome : alfanumérico; Inicio // inserir nomes e notas na matriz Para L
f
1 até 50 faça
Escreva (“Digite o nome e a nota do aluno: ” ); Leia ( Aluno[ L ], Nota[ L ] );
// preenche os vetores Aluno e Nota
Fim_Para; // aluno que a nota está errada Escreva(“Qualonomedoalunoqueestácomanotaerrada?”); Leia ( Nome); // Valor da nota a ser corrigida Escreva(“Qualonotacorreta?”); Leia ( Nome);
Estrutura de Dados Curso de Licenciatura em Informática
115
UNIDADE 3 Aplicações
// busca do aluno no vetor Pos 0; Para L 1 até 50 faça Se Aluno[ L ] = Nome então Pos L; Sai_do_Laço; Fim_se; Fim_Para; f
f
f
// Processamento da usca Se Pos = 0 então Escreva(“Nãofoiencontradoalunocomestenome.”); Senão Escreva(“Anotaatualé:”,Nota[Pos]); Escreva(“Qualonotacorreta?”); Leia(NotaC); Nota [Pos ] NotaC; Escreva(“Anotadoalunofoicorrigidanosistema”); Fim_Se; Fim. f
EXERCÍCIOS DE FIXAÇÃO 1. Faça o algoritmo do eercício anterior utilizando uma matriz no lugar do vetor. 2. Faça o mesmo algoritmo utilizando um vetor com registros. 3. Faça o mesmo algoritmo utilizando a estrutura de arquivos. 4. Modiqueosexercíciosparapossibilitarcorrigirnotasde10alunos. 5. Modique os exercícios para possibilitar corrigir uma quantidade de notas denidaspelooperadordosistema. 6. Modique os exercícios para possibilitar corrigir quantas notas forem encontradas erradas.
Estrutura de Dados Curso de Licenciatura em Informática
116
UNIDADE 3 Aplicações
3.1 - MELHORANDO O PROCESSO DE BUSCA Agora que entendemos o conceito de busca na sua forma mais elementar, podemos estudar formas de otimizar este processo. Como já foi apresentada, a busca sequencial é uma estratégia simples na qual o tempo de busca é diretamente proporcional a distancia que o dado se encontra do início da la. Assim, a velocidade para encontrar uma informação será menor se o dado estiver mais próximo do início e será maior quanto mais distante o dado estiver do início. Toda estratégia de busca é composta por um ciclo que é repetido até encontrar o dado procurado. Na busca sequencial, vericamos se o dado apresentado é o dado que procuramos, se for encerra-se a busca, senão, avançamos para o próximo elemento da seqüência que é o espaço de busca. Um ciclo de busca consiste em testar o elemento encontrado e a ação para avançar para o próximo ciclo. A Figura 43 ilustra o ciclo de busca.
Figura 43: Ciclo de busca
CiclodeBuscaconsisteemvericarodadoeacionarapróximaação.
Para avaliar uma busca,vamos considerar que a busca tem um custo. O Custo da Busca é computado para cada passo ou ciclo na sequência de busca. Nos nossos exemplos vamos considerar que cada passo na sequência de busca tem custo de valor 1 (um).
Custo da busca é a quantidade de ciclos de usca utilizados para encontrar um dado.
Estrutura de Dados Curso de Licenciatura em Informática
117
UNIDADE 3 Aplicações
Uma busca tem dois parâmetros de custo: o custo mínimo e o custo máximo. O custo mínimo é a quantidade de ciclos necessários para encontrar o elemento mais fácil de ser encontrado e normalmente é igual a 1. O custo máximo é a quantidade de ciclos para encontrar o último elemento na estratégia de busca. O elemento máximo é um indicador da busca.
Custo Máimo da busca indica a quantidade de ciclos necessários para encontrar o elemento mais distante no espaço de usca.
Na busca sequencial, o custo máximo da busca pode ser estabelecido como sendo a quantidade de dados na sequência e o custo mínimo será 1. O custo dos componentes será proporcional a distância em que se encontram do primeiro ou do último elemento. Como exemplo, vamos realizar a busca de um determinado número numa sequência de 1 a 10. O custo mínimo será 1 se o dado buscado for o número 1. O custo máximo será 10 quando for o número 10. Desta forma, na busca sequencial, os valores acima da metade tem maior custo de busca. Para melhorar o processo de busca, precisamos reduzir o custo máximo de busca. Qualquer custo máximo de busca que seja inferior ao número total de elementos é considerado uma melhora no processo de busca. Assim, para reduzir o custo máximo é necessário estabelecer uma estratégia para reduzir o custo máximo. Esta estratégia é denominada de otimização da busca. Otimizar é reduzir o custo máimo da usca
Se os dados estiverem ordenados, é possível estabelecer estratégias que facilitem a busca, reduzindo o custo. É o que acontece na lista telefônica. Os dados estão ordenados em ordem alfabética. Quando for necessário encontrar um nome na lista telefônica, iremos diretamente no local com a inicial do nome, sem consultar os nomes anteriores. Para ilustrar uma otimização da busca, vamos utilizar um exemplo interessante que ilustra uma importante estratégia de busca: o jogo em que o mágico adivinha um número pensado por uma pessoa. No jogo de adivinhação, o “mágico” solicita que a pessoa pense em um número de 1 a 10 (vamos reduzir o espaço de busca, para facilitar o entendimento). Após algumas perguntas, o “mágico” consegue adivinhar o número pensado pela pessoa.
Estrutura de Dados Curso de Licenciatura em Informática
118
UNIDADE 3 Aplicações
Apesar de interessante, o truque não tem nada de fantástico, apenas uma lógica clara de busca. Vamos analisar alguns detalhes desta lógica: • Inicialmente os dados tem que estar ordenados, no caso os números estão em seqüência de 1 até 10; • Depois os dados são subdivididos sequencialmente em duas partes e é testado se o número é o elemento central; caso contrário, em qual dos conjuntos o dado “pensado” está. A Figura 44 apresenta um esquema que ilustra o processo de busca feito pelo “mágico” para adivinhar o número pensado no intervalo de 1 a 10.
Figura 44: Estratégia para encontrar um numero
Cada passo consiste em sugerir que o número pensado é o número do meio da sequência. Caso o número apresentado é questionado se o número é maior ou menor do que o apresentado. Conforme a resposta segue para uma ou para outra metade do conjunto até “adivinhar” o número pensado. Observando a gura, podemos vericar que o custo máximo da busca reduziu bastante em relação a uma busca sequencial. O custo máximo agora são 4 ciclos. O custo máximo, neste caso, será para adivinhar os números 1, 4, 7 ou 10. É possível melhorar o esquema da Figura 44, deixando apenas os números que testamos em cada ciclo (dentro dos círculos mais grossos). Desta forma, poderemos ter o esquema apresentado na Figura 45, que pode lembrar alguma coisa que já estudamos. Você lembra que estrutura é esta?
Estrutura de Dados Curso de Licenciatura em Informática
119
UNIDADE 3 Aplicações
Figura 45: arvore para encontrar o número pensado
A gura lembra uma arvore, estrutura apresentada no nal da unidade 3. A raiz da árvore está no número 5. Depois vão aparecendo os galhos que terminam nos nós, que por sua vez podem dar origem a outros galhos até terminar no nó folha, ou simplesmente folha. Como esta árvore tem no máximo dois galhos após cada nó, ela é conhecida como árvore binária. Relembrando o conceito de binário, que é um sistema utilizado em computação por ter apenas duas posições (verdadeiro ou falso, zero ou um).
NaÁrvoreBináriacadanópaipodeter,nomáximo,doisnóslhos.
Conforme já demonstrado no exemplo do “mágico”, a árvore binária permite organizar o espaço problema de tal forma que poderemos encontrar qualquer coisa deste espaço com um tempo menor. Para converter a nossa arvore binária numa estrutura computacional, vamos analisar a estrutura de cada nó. Cada nó origem é a raiz da qual saem dois galhos que vão para os nós do lado direito e do lado esquerdo, conforme ilustrado na Figura 46a. Como a árvore é uma estrutura dinâmica, podemos utilizar a estrutura da Figura 46b para representar cada nó da árvore.
Estrutura de Dados Curso de Licenciatura em Informática
120
UNIDADE 3 Aplicações
Figura 46: estrutura do nó da arvore binária
Com esta estrutura, voltamos a nossa árvore para organizar os índices ou endereços de cada nó conforme apresentado na Figura 47, onde os valores estão dentro do quadrado e o índice é o número externo.
Figura 47: indexação dos nós da arvore binária
Agora vamos inserir as informações dos índices dos nós lhos, conforme a estrutura do nó da árvore apresentada anteriormente. O nó então passa a ter 3 dados distintos. O dado do centro é o valor do dado propriamente dito. O valor nos quadrados laterais apontam para os índices dos nós dos galhos esquerdo e direito. Em 48, note que alguns quadrados não têm um índice, tem apenas uma barra.Esta barra signica que não está apontando para nenhum nó, normalmente é conhecido como valor nulo ou “nill”.
Estrutura de Dados Curso de Licenciatura em Informática
121
UNIDADE 3 Aplicações
Figura 48: representação completa da estrutura da árvore binária
Para efeitos de algoritmo, podemos representar o nó com a seguinte estrutura: • Nó.dado = valor do dado no nó; • Nó.dir = índice (endereço) do nó no galho direito; e • Nó.esq = índice (endereço) do nó no galho esquerdo. Agora que visualizamos a árvore estruturada e a formalização do nó, podemos estabelecer o trecho de algoritmo que fará o ciclo de busca na árvore. O ciclo deve vericar se o dado é o dado procurado. Se não for, vericar se o dado procurado é menor se a resposta for verdadeiro segue para o nó da esquerda, senão segue para o nó da direita. que é o valor atual. O trecho de algoritmo a seguir apresenta-se o ciclo de busca para encontrar o número pensado. Enquanto Achou = Falso faça Se Nó.dado = ValorPensado então Escreva (“dado encontrado”); Achou = Verdadeiro; Senão Se ValorPensado < Nó.dado então Va para o nó com Indice = Nó.esq; Senão Va para o nó com Indice = Nó.dir; Fim_se Escreva (“dado encontrado”); Fim_Se Fim_Enquanto
Estrutura de Dados Curso de Licenciatura em Informática
122
UNIDADE 3 Aplicações
Vamos testar este trecho de algoritmo com o nosso problema exemplo para tentar “adivinhar” o número pensado, que, no caso, será o número 3. Utilizando o algoritmo, o número 3 será armazenado na variável ValorPensado. Acompanhe cada linha do algoritmo juntamente com a Figura 49, onde é apresentado o caminho percorrido nos nós do espaço de busca. Então vamos executar o algoritmo. • 1º ciclo: O algoritmo começa a busca no nó com índice 1, cujo valor é o número 5 (Nó.dado). É realizada a comparação com o ValorPensado, como os valores não são iguais, segue para o teste do “senão”. Após a comparação (3 é menor que 5) vai para o nó com índice 2 (valor de Nó.esq). Com isto é completado um ciclo de busca. • 2º ciclo: O valor do dado (Nó.dado) agora é 2. Novamente, ele não é o número pensado. Como 3 é maior que 2, o algoritmo busca o valor que está em Nó.dir, no caso é 5. Completa mais um ciclo e o valor não foi achado, reinicia um novo ciclo. • 3º ciclo: O valor do dado (Nó.dado) agora é 3. Como ele é igual ao número pensado, é apresentada a mensagem, o valor lógico da variável achou é modicado para verdadeiro e encerra a busca.
Figura 49: teste do algoritmo para o número 3
Estrutura de Dados Curso de Licenciatura em Informática
123
UNIDADE 3 Aplicações
Apesar de parecer complicado, podemos vericar que esta estrutura é relativamente simples, porém muito poderosa. Nem todos os espaços de busca são tão comportados como este apresentado. Neste caso, a árvore foi organizada conforme a ordem maior ou menor.
SAIbA MAIS SObRE bUSCA bINÁRIA E bUSCA LINEAR http://pt.wikipedia.org/wiki/Pesquisa_in%C3%A1ria http://www.youtue.com/watch?v=GExVka4GlxU http://pt.wikipedia.org/wiki/Pesquisa_sequencial
Em muitos casos, temos simplesmente uma organização dos nós em uma árvore e precisamos fazer uma busca para encontrar o dado sem qualquer informação da sua posição. Simplesmente acreditamos que o dado pode existir no espaço de busca. O problema agora é como organizar esta busca, já que não temos nenhuma referência da posição dos dados. Para solucionar esta situação existem duas estratégias: Busca em Largura e Busca em Profundidade. Na Busca em Largura, o dado é procurado em todos os nós em um nível da árvore a partir da raiz. Se o dado não for encontrado nesse nível, a procura é feita no próximo nível e assim por diante até o último nível da árvore. Obviamente, a busca tem um custo menor se o dado procurado estiver nos níveis mais próximos da raiz e um custo maior a medida que se afasta da raiz. A Figura 50 ilustra a busca em largura. A seqüência da busca segue o caminho indicado pelas setas.
Figura 50: Busca em Largura
Estrutura de Dados Curso de Licenciatura em Informática
124
UNIDADE 3 Aplicações
Na Busca em Profundidade, o dado é procurado em um galho em sua totalidade. Se não for encontrado, a busca continua no próximo galho, e, assim por diante, até o último galho Esta busca tem custo menor para os galhos iniciais na busca e custo mais alto para os galhos nais. A Figura 3.12 ilustra a busca em largura. A sequência da busca segue o caminho indicado pelas setas.
Figura 51: teste do algoritmo para o número 3
As letras das Figuras 50 e 51 podem ser substituídas por qualquer c oisa para estruturar o problema. Por exemplo, vamos estruturar um problema simples onde deveremos ter alguns objetos de uma determinada cozinha. Os objetos da cozinha foram estruturados na árvore representada na Figura 51 para possibilitar a manipulação dos dados. Para não sobrecarregar a gura, foram colocados apenas os índices de cada nó, entretanto a estrutura continua a mesma: o nó tem a indicação do nó esquerdo e direito.
Figura 52: Teste do algoritmo para o número 3
A partir desta gura, vamos mostrar como é possível encontrar a geladeira utilizando a Busca em Largura e profundidade.
Estrutura de Dados Curso de Licenciatura em Informática
125
UNIDADE 3 Aplicações
3.2 - BUSCA EM LARGURA Para realizar a busca em largura precisamos denir alguns itens: • Para estabelecer a estratégia de Busca em Largura, vamos precisar de uma estrutura tipo la. A la é aquela em que os dados são lidos na mesma ordem em que são inseridos na la. • Os dados que serão colocados na la são os índices de cada nó; • Para cada índice da la é lido o seu dado, se ele for o objeto procurado a busca é encerrada. Se não for o dado procurado, os índices dos nós lhos são inseridos no nal da la e o índice atual é retirado do inicio da la. O ciclo é r epetido até encontrar o objeto procurado. Vamos iniciar colocando o índice 1 do nó inicial na la:
Agora testamos o valor do dado no índice 1 e vericamos que é “porta”. Como este não é o objeto procurado, colocamos na la os índices 2 (Nó.esq) e 3 (Nó.dir) ao mesmo tempo que retiramos o primeiro elemento da la.
Como o valor do dado no indice 2 não é o procurado, colocamos na la os índices 4 (Nó.esq) e 5 (Nó.dir) e retiramos o 2 do inicio da la.
O valor de 3 também não é o dado procurado. Seus índices (6 e 7) são colocados na la e o 3 é retirado também.
Estrutura de Dados Curso de Licenciatura em Informática
126
UNIDADE 3 Aplicações
O valor de 4 também não é o dado procurado. Como seus índices são vazios (nil), ele é simplesmente retirado da la.
Finalmente a geladeira foi encontrada no nó de indice 5 e a busca é encerrada.
SAIbA MAIS SObRE bUSCA EM LARGURA http://pt.wikipedia.org/wiki/busca_em_largura
3.3 - BUSCA EM PROFUNDIDADE Para realizar a busca em profundidade, precisamos denir alguns pontos: • Para estabelecer a estratégia de busca em largura vamos precisar de uma estrutura tipo pilha. A pilha é a estrutura, na qual, o último dado colocado é o primeiro a ser lido. Esta estrutura é necessária para estabelecer a memória do sistema, caso o dado não seja encontrado no galho atual; • Os dados que serão colocados na pilha são os índices de cada nó; • Para cada índice da pilha é lido o seu dado, se ele for o objeto procurado a busca é encerrada. Se não for o dado procurado, os índices dos nós lhos são inseridos na pilha; • Como a busca começa pelo lado esquerdo, a ordem de entrada na pilha é índice direito, e, depois o índice esquerdo.
Estrutura de Dados Curso de Licenciatura em Informática
127
UNIDADE 3 Aplicações
• Após a leitura o índice é retirado do topo da pilha. Vamos iniciar colocando o indice 1 do nó inicial na pilha:
Ao ler o dado do nó 1 não é o dado procurado. O índice 1 é retirado e seus nós lhos (2 e 3) são colocados na pilha.:
O dado do nó 2 também não é o dado procurado. Ele é retirado e seus nós lhos (4 e 5) são colocados na pilha.:
Estrutura de Dados Curso de Licenciatura em Informática
128
UNIDADE 3 Aplicações
Agora é a vez do nó 4. Como ele não contém o dado procurado e seus índices são vazios (nil), ele é simplesmente retirado da pilha. O próximo nó é o 5 onde está o dado procurado (geladeira) e a busca é encerrada.
SAIbA MAIS SObRE bUSCA EM PROFUNDIDADE http://pt.wikipedia.org/wiki/busca_em_profundidade
Estrutura de Dados Curso de Licenciatura em Informática
129
UNIDADE 3 Aplicações
EXERCÍCIOS DE FIXAÇÃO 1. Escolha um dado na árvore da Figura 51 e realize a usca em Largura. 2. Com o mesmo dado do eercício anterior faça a usca em profundidade. 3. Refaça os eercícios 1 e 2 para o dado do nó 2. 4. Refaça os eercícios 1 e 2 para o dado do nó 4. 5. Estudeosexercíciosde1a4eapresentesuasconclusões.
SISTEMATIZAÇÃO DE Aprendizagem 1. Pesquise (livros, Internet, etc.) e apresente uma técnica de ordenação diferente da apresentada. Compare com a técnica estudada nesta unidade e faça um relatório reve do estudo comparativo 2. Faça um algoritmo que leia o nome e a nota dos alunos que participaram do concursovestibularedepoisemitaumalistacomaclassicaçãonaldaprova. 3. Melhore o algoritmo proposto no eercício 2, incorporando usca sequencial paraemitironome,anotaeaclassicaçãodeumalunosolicitado. 4. Pesquise (livros, Internet, etc.) e apresente uma técnica de usca diferente das apresentadas. Compare com a técnica estudada nesta unidade e faça um relatório reve do estudo comparativo. 5. Estude um prolema do seu amiente de traalho, estudo, lar, etc. Estaeleça os dados que você pretende organizar e estaeleça o espaço de usca para estes dados. Finalmente, elaore um algoritmo que possiilite ordenar estes dados (estaeleça o critério) e possiilite uma usca com custo reduzido. Faça um relatório apresentando o algoritmo que deie claro as técnicas utilizadas para estruturar os dados e o motivo que você entende serem importantes para a escolha da técnica proposta. 6. Implemente o eercício 5 em uma linguagem de programação.
Estrutura de Dados Curso de Licenciatura em Informática
130
UNIDADE 3 Aplicações
CONSIDERAÇÕES FINAIS Nesta unidade, foram estudadas algumas aplicações para as técnicas de estruturação de dados. Os estudos foram realizados em nível conceitual, sem aprofundar em detalhes de algoritmos e linguagem de programação, com a intenção de concentrar a atenção no entendimento dos conceitos apresentados. Foram apresentados os conceitos e a importância de ordenação e busca. Em busca, além do conceito da própria busca, foi apresentado como as estruturas apresentadas na Unidade II (vetor, la e pilha) podem ser utilizadas para implementar diferentes tipos de busca. O estudo de estrutura de dados não se encerra nestas poucas páginas. Entretanto esperamos ter despertado o seu interesse para um tópico tão importante e, assim, incentivamos você a buscar, na bibliograa recomendada, e na Internet mais detalhes sobre o assunto. Esperamos ter apresentado o tema Estrutura de Dados da forma mais didática possível, para que você possa aplicar no contexto do seu curso. Ficamos muito felizes, se você conseguiu chegar até este ponto. Sua força de vontade e inteligência superaram seu receio para torná-lo um vencedor. Nossos mais sinceros parabéns e votos de muitas vitórias mais.
Estrutura de Dados Curso de Licenciatura em Informática
131
UNIDADE 3 Aplicações
Agrupamento de dados : Conjunto de dados semelhantes em tipo e nalidade. Algoritmo : Sequência lógica de passos que conduzem à solução de um problema. Arvore Binária : Árvore de dados onde cada nó pai possui no máximo dois nós lhos. Busca de dados : Processo que possibilita encontrar um determinado dado no espaço de busca.
Ciclo de busca : Ciclo que contém os passos a serem realizados no processo de busca. Coleção de dados : Agrupamento de dados. Custo da busca : Quantidade de Ciclos de busca necessários para encontrar um dado. Custo máximo da busca : Referência do método da busca que indica a pior situação que pode ser encontrada na busca.
Espaço de busca : Universo ou conjunto de todos os dados relacionados ao problema. Em termos práticos, pode ser um vetor, uma matriz, conjunto de registros, arquivos ou mesmo um conjunto pré-denido.
Estratégia de busca : Método estabelecido para a forma de procurar e encontrar o dado.
Estrutura aninhada : Uma estrutura dentro de outra estrutura. Inconsistente : Diferentes, divergentes. O dado ou informação não está correto. Índice : Um número que identica um elemento dentro de uma séries de elementos. Laço : Estrutura que possibilita a repetição de um ou mais comandos. Laço aninhado : Um laço que está dentro de outro laço. Manipular : Realizar operações (alterar, recuperar, excluir, inserir, etc). Ordenação de dados : Processo de organização de dados, conforme uma ordem estabelecida.
Otimização : Processo de melhorar algum processo, reduzindo custos, quantidade de passos de execução, etc.
Variável auxiliar : Uma variável que serve para receber dados de forma temporária.
Estrutura de Dados Curso de Licenciatura em Informática
132