1.Aula01_Estrut_Dados-TAD

download 1.Aula01_Estrut_Dados-TAD

of 6

Transcript of 1.Aula01_Estrut_Dados-TAD

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    1/13

     

    Estrutura de dados

    Tipo abstrato de dados

    (TAD)

    Estrutura de Dados

     Tipo Abstrato de Dados

    (TAD)

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    2/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 2

    Introdução

    Um tipo de dados é um conjunto de valores e de operações sobre

    esses valores, por exemplo, o tipo de dado inteiro. Ele define um conjunto de

    números inteiros (dentro de um intervalo que depende damáquina/implementação) e um conjunto de operações que pode ser feita

    sobre esse conjunto (somar, subtrair, multiplicar, dividir etc.).

    Já um tipo abstrato de dados (TAD) refere-se ao conceito de definição

    de um tipo de dado. A definição de TAD leva à criação de um novo tipo de

    dados. Para facilitar o entendimento, vamos imaginar a criação de um TAD

    para armazenar os números racionais: neste TAD, os valores armazenados

    têm a forma 1/2, 2/3 etc. Sobre esse conjunto podem ser especificadas

    operações, como somar, subtrair, multiplicar, dividir etc.

     A criação de um TAD facilita a manipulação das aplicações, já que seconsegue armazenar valores no formato que precisar.

    Basicamente, um TAD é:

      Uma ESTRUTURA para armazenar valores; e

      Um conjunto de OPERADORES para manipular os valores

    armazenados.

     A tabela 1 mostra alguns exemplos de abstrações do mundo real que

    podem ser realizadas. Estas abstrações se transformam em tipos abstratosde dados para facilitar a representação do mundo real. 

    Tabela 1. Exemplos de abstrações do mundo real 

    Mundo realAbstração

    (informações que interessam)

    Estrutura de

    armazenamentoAlgumas operações

    Pessoa Idade Inteiro

    Somar

    Subtrair

    Multiplicar

    Dividir

    Cadastro de

    funcionário

    Para cada funcionário: nome,

    cargo e salário

    Lista ordenada (em

    ordem alfabética)

    Incluir funcionárioExcluir funcionário

     Alterar cargo

     Alterar salário

    File de esperaNome de cada pessoa e posição

    na filaFila

    Sai da fila (o primeiro)

    Entra na fila (em último)

    Sub-rotinasPara cada sub-rotina: até onde

    executou e variáveis locaisPilha

    Push (entrar no topo)

    Pop (sair do topo)

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    3/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 3

    Na tabela 1, percebemos que TADs novos aparecem como lista, pilha

    e fila. Estes tipos são utilizados com grande frequência pelos

    desenvolvedores de aplicações e serão detalhados ao longo da disciplina.

    Objetivo

     A principal característica de um TAD é que os valores armazenados

    em sua estrutura só podem ser manipulados por meio de operadores

    definidos.

     A ideia de se criar um TAD é análoga à caixa-preta existente nos

    aviões: para que o técnico tenha acesso aos dados gravados, ele não

    necessita abrir o equipamento, apenas acionar os comandos para extrair os

    relatórios.

     A manipulação de um TAD deve partir do mesmo princípio: a aplicaçãoque utiliza um TAD não precisa saber como é sua estrutura interna, basta

    apenas saber quais são as operações existentes e qual sua função.

    Objeto

    Um objeto é um conceito de programação que reúne características

    (informações) e seu comportamento (operações ou, ainda, métodos).

    Um determinado objeto deve representar uma entidade do mundo real

    em um sistema computacional. Deve ser descrito através de suas

    características desejáveis (atributos) e as operações que são realizadas nele

    (métodos).

     As principais características de um objeto são:

      Independência;

      Encapsulamento (agrupamento) de atributos (dados) e

    comportamento (métodos, operações);

      Detalhes de implementação são ocultados; e

      Herança (objetos podem herdar características de outros).

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    4/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 4

     Abstração

    LEMBRE-SEAbstração:

    1. Considerar isoladamente um ou mais elementos de um todo;

    separar, apartar.

    2. Separar mentalmente para tomar em consideração (propriedade

    que não pode ter existência fora do todo, concreto ou intuitivo, em que

    aparece): abstrair a cor ou a forma de um objeto.

    Abstrato:  diz-se de representação à qual não corresponde nenhum dado

    sensorial ou concreto.

    Abstração:  ato de separar mentalmente um ou mais elementos de uma

    totalidade complexa (coisa, representação, fato), os quais só mentalmente

    podem subsistir fora dessa realidade.

    FERREIRA, 1996

    No contexto de software:

      Abstrair (considerar isoladamente, representar) elementos do

    mundo real;

      Separação (mental) entre representações e implementações; e

      Separação entre funcionalidade e implementação.

    LEMBRE-SEDeve-se abstrair uma representação de sua implementação, pois cada

    implementação varia de acordo com a linguagem de programação  –  ao

    contrário da representação, que é a mesma  –, e deve-se definir como uma

    funcionalidade será disponibilizada para utilização; seus detalhes de

    implementação não são interessantes para quem as utiliza.

    Exemplo

    Para facilitar o entendimento e a utilização de um TAD, vamos estudar

    a criação de um TAD chamado Vetor, utilizando alocação estática

    (TAMASSIA; GOODRICH, 2007) de memória, ou seja, a quantidade máxima

    de itens presentes do vetor será determinada na criação, e não poderá sermodificada.

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    5/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 5

    Em vetores, os itens de dados são relacionados e do mesmo tipo.

     Além disso, os vetores permanecem com o mesmo tamanho, desde sua

    criação até deixarem de existir.

     A figura 1 ilustra a representação de um vetor com 12 (doze)

    elementos, em que a posição 0 (zero) representa a primeira posição e aposição 11  (onze) representa a décima segunda e última posição. No

    exemplo da figura 1, o vetor tem nome c.

    Figura 1. Exemplo de um vetor de 12 posições

    LEMBRE-SEOs vetores são objetos que ocupam espaço de memória, sendo que

    cada posição do vetor ocupa um espaço diferente na memória e as posições

    são armazenadas sequencialmente (LORENZI; MATTOS; CARVALHO,

    2007).

     A figura 2 mostra o código para a criação do TAD Vetor. Os códigos

    apresentados nesta disciplina foram elaborados utilizando a linguagem Java

    (DEITEL; DEITEL, 2010).

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    6/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 6

    Figura 2. Estrutura e código do TAD Vetor

    O nome do TAD criado é exatamente o nome da classe. Isso pode ser

    visualizado na linha 1 da figura 2.

     As linhas 3 e 4 da figura 2 representam a estrutura de armazenamento

    para o TAD Vetor. A linha 3 declara um vetor a de inteiros e a linha 4 declara

    uma variável, denominada nElems, que armazena a quantidade de

    elementos do vetor.

     As linhas de 6 a 10 representam o construtor do TAD Vetor. Quando

    um objeto do TAD Vetor for criado, o construtor do TAD deverá ser chamado.

    O construtor do TAD possui um argumento, que é a quantidade máxima deelementos que o vetor armazenará.

    Dentro do construtor, duas operações são realizadas:

      O vetor a interno é iniciado, e, neste instante, informa-se o seu

    tamanho, ou seja, a quantidade máxima de elementos que

    podem ser armazenados;

      Inicia-se a variável nElems, que armazena a quantidade de

    elementos do vetor, com o valor zero. Ou seja, o vetor,inicialmente, encontra-se vazio.

    1 public class Vetor 

    2 {

    3 private int a[];

    4 private int nElems;

    56 public Vetor(int max)7 {

    8 a = new int[max];

    9 nElems = 0;

    10 }

    11 // Operação de busca

    12 // Operação de inserção

    13 // Operação de remoção

    14 // Operação de impressão

    15 } 

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    7/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 7

     As linhas de 11 a 14 representam as operações existentes neste TAD,

    no caso, as operações de busca, inserção, remoção e impressão,

    respectivamente. O código destas operações é visualizado nas próximas

    figuras.

     A figura 3 mostra o código para a operação de busca.

    Figura 3. Código para a operação de busca no TAD Vetor  

    Na figura 3, a linha 1 mostra que o método de busca recebe um

    argumento como parâmetro, que é o valor a ser pesquisado, e retorna um

    valor booleano como resposta. Se for true, este valor pertence ao vetor, e se

    for false, não.

     A linha 4 possui uma estrutura de repetição que é utilizada para

    percorrer o vetor e pesquisar se o valor pertence ao vetor. A estrutura de

    repetição tem a variável contadora  j , que é utilizada para percorrer o vetor a,

    iniciada com o valor 0 (zero) e incrementada em 1 (um) a cada iteração, e a

    repetição ocorre enquanto a variável  j   for menor do que a quantidade de

    elementos do vetor (nElems).

     A linha 5 verifica se o valor armazenado na posição j  do vetor a é igual

    ao valor pesquisado. Caso seja, a linha 6 mostra a instrução break , que

    “força” a saída da estrutura de repetição. Isso ocorre porque, como o valor já

    foi encontrado, não é necessário que o vetor seja percorrido até o final.

     Após ter percorrido o vetor, está na hora de retornarmos a informação

    se o elemento pesquisado pertence ou não ao vetor. A linha 7 verifica se a

    variável contadora  j   é igual à nElems. Caso seja igual, isso significa que o

    // Operação de busca

    1 public boolean busca(int searchKey)2 {

    3 int j;

    4 for(j=0; j

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    8/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 8

    vetor foi percorrido até o final e não se encontrou o valor pesquisado. Com

    isso, nós retornamos false, como mostra a linha 8. Caso a variável  j   seja

    diferente de nElems, o valor pesquisado foi encontrado e a linha 10 mostra o

    retorno true.

     A figura 4 mostra o código para a operação de inserção.

    Figura 4. Código para a operação de inserção no TAD Vetor

    Na figura 4, a linha 1 mostra que o método de inserção recebe um

    argumento como parâmetro, que é o valor a ser inserido, e não retorna

    nenhuma informação para a aplicação.

     A linha 3 verifica se a quantidade de elementos do vetor (nElems) é

    menor do que o tamanho do vetor a (a.length). Caso esta verificação dê falso,

    o valor não é inserido no vetor, pois isso significa que o vetor está cheio.

    Entendeu esta validação? Isso é fundamental para nós não inserirmos mais

    elementos do que a capacidade do vetor.

    Caso o vetor não esteja cheio, as linhas 4 e 5 são executadas. Na

    linha 4 é feita a inserção do valor na primeira posição livre do vetor, que é a

    posição nElems. A linha 5 faz o incremento da variável nElems  em uma

    unidade.

     A figura 5 mostra o código para remoção de um elemento no TAD

    Vetor.

    // Operação de inserção

    1 public void insere(int value)

    2 {

    3 if( nElems < a.length ) {

    4 a[nElems] = value;

    5 nElems++;

    6 }

    7 }

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    9/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 9

    Figura 5. Código para a operação de remoção no TAD Vetor

    Na figura 5, a linha 1 mostra que o método de remoção recebe um

    argumento como parâmetro, que é o valor a ser removido, e retorna um valor

    booleano como resposta. Se for true, o valor foi removido do vetor, e se for

    false, não.

     A linha 4 possui uma estrutura de repetição, que é utilizada para

    percorrer o vetor e pesquisar se o valor pertence ao vetor. A estrutura de

    repetição tem a variável contadora  j , que é utilizada para percorrer o vetor a,

    iniciada com o valor 0 (zero) e incrementada em 1 (um) a cada iteração, e a

    repetição ocorre enquanto a variável  j   for menor do que a quantidade de

    elementos do vetor (nElems).

     A linha 5 verifica se o valor armazenado na posição j  do vetor a é igual

    ao valor pesquisado. Caso seja, a linha 6 mostra a instrução break , que

    “força” a saída da estrutura de repetição. Isso ocorre porque, como o valor já

    foi encontrado, não é necessário que o vetor seja percorrido até o final.

     Após ter percorrido o vetor, verificamos se o valor foi encontrado. A

    linha 7 verifica se a variável contadora  j  é igual à nElems. Caso seja igual, o

    vetor foi percorrido até o final e não se encontrou o valor pesquisado. Com

    isso, nós retornamos false, como mostra a linha 8. Caso a variável  j   seja

    diferente de nElems, o valor pesquisado foi encontrado e nós podemos

    remover o valor do vetor a.

    // Operação de remoção

    1 public boolean remove(int value)2 {3 int j;

    4 for(j=0; j

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    10/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 10

     A linha 11 mostra a variável nElems  sendo decrementada em uma

    unidade. Isso ocorre porque o valor foi encontrado e será removido.

     A linha 12 mostra a estrutura de repetição for . Esta estrutura é

    utilizada para percorrer o vetor da posição a ser removida até o fim do vetor.

    LEMBRE-SEPrecisamos desta estrutura para evitar que o vetor fique

    “desconfigurado” e cheio de “buracos” nas posições intermediárias do vetor. 

     A linha 13 faz o deslocamento dos valores do vetor uma posição à

    esquerda. Fazemos isso para eliminar os “buracos” que podem aparecer

    devido às remoções dos valores do vetor. Vamos supor que o valor a ser

    removido está na quarta posição do vetor. Para não ficar um buraco nesta

    posição, deslocamos o elemento da quinta posição para a quarta posição, oelemento da sexta para a quinta posição, e assim sucessivamente.

     Após os deslocamentos, retornamos true para a aplicação, informando

    que a remoção foi realizada com sucesso.

     A figura 6 mostra o código da operação de impressão.

    Figura 6. Código para a operação de impressão no TAD Vetor

    Na figura 6, a linha 1 mostra que o método de impressão não recebe

    argumentos como parâmetro e não retorna nenhuma informação para a

    aplicação.

     A linha 3 mostra a estrutura de repetição que é utilizada para percorrer

    as posições preenchidas do vetor a. A cada iteração, uma posição do vetor é

    impressa, como mostra a linha 4. Após o término da impressão, pula-se uma

    linha, através de um enter , conforme mostra a linha 5.

     Após explicar o código do TAD Vetor, vamos criar uma aplicação que

    utilize as operações do TAD explicado. A figura 7 mostra o código de uma

    aplicação que cria um objeto do TAD Vetor.

    // Operação de impressão

    1 public void imprime()

    2 {

    3 for(int j=0; j

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    11/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 11

    Figura 7. Código da aplicação que utiliza o TAD Vetor

    Por meio do código apresentado na figura 7, vemos que:

      A linha 4 cria um objeto arr   do TAD Vetor, chama o seu

    construtor, passando maxSize como o tamanho do vetor.

      As linhas de 6 a 9 inserem valores no vetor, e os valores

    inseridos são passados por parâmetro.

      A linha 10 chama a operação de impressão do vetor, e gera

    como saída: 77 99 44 55 .

      A linha 12 chama a operação de busca, passando o valor 35

    como parâmetro. Ou seja, queremos verificar se o elemento 35

    pertence ao vetor. Caso ele pertença ao vetor, imprimimos

    “Encontrado 35”. Caso contrário, imprimimos “Não encontrado

    35”. Neste exemplo, imprimiremos que ele não foi encontrado.

      A linha 17 chama a operação para remover o elemento 99 do

    vetor. Caso chamemos a operação de impressão após estaremoção, como será a impressão? A saída será a seguinte:

    // Código da Aplicação

    1 public static void main(String[] args)

    2 {3 int maxSize = 100;

    4 Vetor arr = new Vetor(maxSize);

    5

    6 arr.insere(77);

    7 arr.insere(99);

    8 arr.insere(44);

    9 arr.insere(55);

    10 arr.imprime();

    11

    12 if( arr.busca( 35 ) )13 System.out.println("Encontrado " + 35);

    14 else

    15 System.out.println("Nao encontrado " + 35);

    16

    17 arr.remove(99);

    18 }

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    12/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 12

    77 44 55 .

    Com isso, encerramos um exemplo de TAD. Para mais informações

    sobre TAD, leia:

    LEITURA COMPLEMENTARParte conceitual de TAD

    http://code.sejadiferente.net/?q=pt-br/node/50

    http://code.sejadiferente.net/sites/default/files/book/oo/TiposAbst

    ratosDeDados.pdf

     Vantagens

     Algumas vantagens importantes na utilização de TAD são:

      Maior facilidade para programar (sem a necessidade de se

    preocupar com detalhes de implementação);

      Maior segurança para programar (apenas as operações podem

    alterar o conteúdo armazenado na estrutura);

      Maior independência e portabilidade de código (alterações na

    implementação de um objeto não implicam alterações de suas

    funcionalidades) –

     operações possuem a mesma sintaxe; e

      Maior potencial de reutilização de código (pode-se alterar a

    lógica de um programa sem a necessidade de reconstruir

    objetos). Diferentes aplicações com diferentes propósitos

    podem utilizar o mesmo TAD.

  • 8/19/2019 1.Aula01_Estrut_Dados-TAD

    13/13

    Estrutura de dados – Tipo abstrato de dados (TAD) 13

    Bibliografia

    DEITEL, Paul; DEITEL, Harvey. Java  – Como programar. 8. ed. São

    Paulo: Prentice Hall, 2010.

    FERREIRA, Aurélio B. de Hollanda. Novo Dicionário da Língua

    Portuguesa. Rio de Janeiro: Nova Fronteira, 1996.

    LORENZI, Fabiana; MATTOS, Patrícia Noll de; CARVALHO, Tanisi

    Pereira de. Estrutura de dados. São Paulo: Thomson Learning, 2007.

    TAMASSIA, Roberto; GOODRICH, Michael T. Estruturas de dados e

    algoritmos em Java. 4. ed. São Paulo: Bookman, 2007.