Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat...

26
Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat [email protected] Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática

Transcript of Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat...

Page 1: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Tipos Abstratos de Dados

Paradigmas de Programação

Prof. Gláucya Carreiro Boechat

[email protected]

Universidade Federal Rural de PernambucoDepartamento de Estatística e Informática

Page 2: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Abstração

Concentrar mais em idéias gerais do que em detalhes específicos.

Em Análise - concentrar em aspectos essenciais de um problema e ignorar detalhes irrelevantes.

Em Programação - distinguir entre “o que” um trecho de programa faz e “como” foi implementado.

Sempre que um novo procedimento ou função é inserido no programa, um novo nível de abstração é criado.

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 2

Page 3: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Abstração - Tipos Fundamentais Abstração de Processo

Oferece uma maneira do programa especificar que algum processo deve ser feito, sem oferecer os detalhes de como será feito

Todos subprogramas são abstrações de processo Exemplo

Ordena_int(lista, comp_lista); Sort_float(array, len);

Abstração de Dados Toda Abstração de Dado suas operações são definidas como

abstração de processo

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 3

Page 4: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Tipos primitivos: exemplo de abstração // float: abstração de um número em ponto flutuante

float a, b, c, s;// tipo de dados é associado a um domínio de valores

b = 1.0;c = 2.0;

// tipo de dados é associado a conjunto de operações

a = b + c; a+=; c++; // tipo de dados associado a uma representação interna

8 bits, 16 bits, 32 bits ...

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 4

Page 5: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Modulos Modulos são "containers" sintáticos contendo

subprogramas e grupos de dados relacionados logicamente

Modularização: processo de projetar os módulos de um programa

A compreensão do programa pelos mantenedores seria impossível sem organização modularizada

Ponto Crítico: Quando o projeto de um programa estende-se por milhares

de linhas, recompilá-lo totalmente a cada atualização do código é absolutamente inviável - daí a necessidade de modularizá-lo

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 5

Page 6: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Encapsulamento

Agrupamento de subprogramas e dados que é compilado separada/independentemente

Também chamado de unidade de compilação Muitas vezes são colocados em bibliotecas e postos

a disposição para serem reutilizados em outros programas

Exemplo: Linguagens que oferecem a capacidade de agrupar subprogramas e dados pode ser colocada em um arquivo, então compilado independentemente C, Fortran 90, Ada, Simula 67, C++

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 6

Page 7: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Abstração de Dados

Um Tipo Abstrato de Dados (TAD) é um encapsulamento que inclui somente um tipo específico de dado e os subprogramas que fornecem as operações para este tipo

Detalhes desnecessários da implementação do tipo podem ser ocultos das unidades fora do encapsulamento que o contém

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 7

dados

operações

Page 8: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Abstração de Dados

Um objeto é uma variável (instância) de um tipo abstrato de dados, declarada por alguma unidade de programa

Programação Orientada a Objetos consiste no uso de objetos no desenvolvimento do software

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 8

Page 9: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Tipos de Dados Abstratos Definidos pelo Usuário

Definição do tipo e as operações sobre objetos do tipo estão contidas numa única unidade sintática

Outras unidades de programa podem ter permissão para criar variáveis do tipo definido

A representação de objetos do tipo não é visível pelas unidades de programa que usam o tipo

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 9

Page 10: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Tipos de Dados Abstratos Definidos pelo Usuário As unidades de programa que usam um TAD

específico e chamado de Cliente

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 10

clientecliente

cliente TADusa

Page 11: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Exemplo - TAD - Pilha Operações Abstratas

Cria(pilha) Cria e inicializa um objeto na pilha Destroi(pilha) Desloca o armazenamento da pilha Vazia(pilha) Retorna (true) se a pilha estiver vazia Empilha(pilha, elemento) Empilha o elemento no topo da pilha Desempilha(pilha) Remove o elemento do topo da pilha Topo(pilha) Retorna uma copia do topo da pilha

Um Cliente do tipo pilha poderia ter uma seqüência de código...

Cria(pilha1);

Empilha(pilha1, cor1);

If ( !Vazia(pilha)

temp = Topo(pilha)...

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 11

Page 12: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

TAD SIMULA 67 Primeiras facilidades de linguagem para

suporte a TAD Oferece encapsulamento, mas não ocultacao

de informacao Forma Sintática

Class nome_da_classe

begin

-- declarações de variáveis da classe --

-- definições de subprogramas da classe –

-- seção de código da classe --

end nome_da_classeParadigmas de Programação -

prof Gláucya Carreiro Boechat 12

Page 13: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

TAD C++

Os Tipos Abstratos de Dados em C++ são as chamadas classes Variáveis são declaradas como instâncias de classes

Classes do C++ são baseadas SIMULA67 struct do C

Os dados definidos na classe são os membros de dados

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 13

Page 14: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Funções Membro

Funções-membro São as funções definidas na classe Compartilhadas por todas as instâncias de classe Cada instância tem seu próprio conjunto de

membros de dados Pode ter sua definição completa dentro da classe

("inlined") ou apenas seu cabeçalho #define

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 14

Page 15: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Ocultacao da Informacao em C++ Cláusula private:

para entidades ocultas na classe Cláusula public:

para as entidades visíveis aos clientes. Descreve a interface com objetos da classe

Cláusula protected: relacionada com herança

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 15

Page 16: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Construtores

Funções-membro usadas para inicializar os membros de dados de um objeto recém-criado

Possue o mesmo nome da classe Pode-se sobrecarregar construtores Não têm tipo de retorno, não usam return

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 16

Page 17: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Destrutores

Implicitamente chamados quando se encerra o tempo de vida de um objeto

O destrutor pode conter chamadas delete para desalocar membros de

Nome do destrutor: ~ <nome_da_classe> Não têm tipo de retorno, não usam return

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 17

Page 18: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Exemplo#include <iostream.h>

class pilha {

private:

int *ptr_pilha;

int tam_max;

int top_ptr ;

public:

pilha( ){ //** um construtor

ptr_pilha = new int [100];

tam_max = 99;

top_ptr = -1;

}

~pilha( ){ //** um destrutor

delete [ ] ptr_pilha;

}

void Empilha ( int elem) {

if (top_ptr = = tam_max)

cout << “Erro - pilha cheia\n”;

else ptr_pilha[ + + top_ptr ] = elem;

}

void Desempilha( ) {

if (top_ptr = = -1)

cout << “Erro - pilha vazia\n”;

else top_ptr -- ;

}

int Topo {

return ( ptr_pilha[top_ptr] );

}

}Paradigmas de Programação - prof Gláucya Carreiro

Boechat 18

Page 19: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Exemplo

Código no cliente:

void main ( ) {

int top_one;

pilha stk;

stk.Empilha(42);

stk.Empilha(17);

top_one = stk.topo( );

stk.pop( );

...

}Paradigmas de Programação -

prof Gláucya Carreiro Boechat 19

Page 20: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

“Objeto Matriz” x “Objeto Vetor”

Em qual classe essa operação deve ser definida?class Matriz {

friend Vetor mult(const Matriz&, const Vetor&);

...}

class Vetor {

friend Vetor mult(const Matriz&, const Vetor&);

...}

//** a função q usa os objetos Matriz e Vetor

Vetor mult(const Matriz& m1, const Vetor& v1){

..} Todos os membros privados da classe são visiveis a todos os membros da classe

amiga

Se Matriz e Vetor pudessem ser definidas num único pacote, evitaríamos esta construção pouco natural.

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 20

Page 21: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

TAD JAVA

Suporte para tipos abstratos similar a C++ Todos os tipos de dados definidos pelo

usuário são classes Todos os subprogramas (métodos) em Java

somente podem ser definidos em classes public e private são modificadores anexados

às definições de métodos/variáveis

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 21

Page 22: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Pacotes - JAVA

Pacotes podem conter mais de uma classe public e private são os chamados modificadores Os membros sem modificador (e os membros

public) de uma classe são visíveis a todas as classes do mesmo pacote (escopo de pacote)

Não há, portanto, necessidade de declarações friend explícitas em Java

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 22

Page 23: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Exemploimport java.io.*

class Pilha {

private int [ ] ref_pilha;

private int tam_max, top_index ;

public Pilha( ){//construtor

ref_pilha = new int [100];

tam_max = 99;

top_index = -1;

}

public void push ( int elem) {

if (top_index = = tam_max)

System.out.println(“Erro”);

else ref_pilha[ + + top_index ] = elem;

}

public void pop ( ) {

if (top_index = = -1)

System.out.println(“Erro”);

else --top_index ;

}

public int top {

return ( ref_pilha[top_index] );

}

} \\** fim da classe Pilha

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 23

Page 24: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Exemplopublic class Testa_Pilha {

public static void main (String [ ] args) {

Pilha p1 = new Pilha( );

p1.push(42);

p1.push(29);

p1.pop( );

p1.pop( );

p1.pop( ); // Produz msg de erro

... } Não há destrutor eliminado pela coleta de lixo implícita em

Java) Observe o uso de variável de referência em vez de ponteiro

Paradigmas de Programação - prof Gláucya Carreiro

Boechat 24

Page 25: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Classes Parametrizadas em C++Exemplo: suponha que o método construtor para a

classe pilha fosse:

pilha (int size ){

ptr_pilha = new int [size];

tam_max = size-1;

top_ptr = -1;

}

No cliente:

... pilha(150) p1; Paradigmas de Programação -

prof Gláucya Carreiro Boechat 25

Page 26: Tipos Abstratos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat glaucyacboechat@gmail.com Universidade Federal Rural de Pernambuco Departamento.

Classes genéricas em C++ #include <iostream.h>

template < class TIPO >

class pilha {

private:

TIPO *ptr_pilha;

int tam_max;

int top_ptr ;

public:

pilha( ){ //** um construtor

ptr_pilha = new TIPO [100];

tam_max = 99;

top_ptr = -1;

}

void desempilha ( )

{ top_ptr--; }

pilha (int size ){ // construtor sobrecarregado

ptr_pilha = new TIPO [size];

tam_max = size-1;

top_ptr = -1;

}

~pilha( ) { delete ptr_pilha; }

void empilhar( TIPO elem) {

if (top_ptr = = tam_max)

cout << “Erro - pilha cheia\n”;

else ptr_pilha[ + + top_ptr ] = elem;

}

TIPO topo {

return ( ptr_pilha[top_ptr] ); }

} \\** fim da classe pilhaParadigmas de Programação -

prof Gláucya Carreiro Boechat 26