Você está na página 1de 31

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Tipo de dados, tipo abstrato de dados, estruturas de dados

Termos parecidos, mas com significados diferentes

Tipo de dado

Em linguagens de programao o tipo de dado de uma varivel, constante ou funo define o conjunto de valores que a varivel, constante ou funo podem assumir

p.ex., varivel boolean pode assumir valores true ou false

Programador pode definir novos tipos de dados em termos de outros j definidos

Tipos estruturados, p.ex., arrays, records

Estrutura de Dados

Um tipo estruturado um exemplo de estrutura de dados

Tipos estruturados so estruturas de dados j prdefinidas na linguagem de programao O programador pode definir outras estruturas de dados para armazenar as informaes que seu programa precisa manipular Vetores, registros, listas encadeadas, pilhas, filas, rvores, grafos, so exemplos de estruturas de dados tpicas utilizadas para armazenar informao em memria principal

Perspectivas para Tipos de Dados

Tipos de dados podem ser vistos como mtodos para interpretar o contedo da memria do computador Mas, podemos interpretar o conceito de tipo de dado sob outra perspectiva

no em termos do que um computador pode fazer (interpretar os bits...), mas em termos do que os usurios (programadores) desejam fazer (p.ex., somar dois inteiros...) O programador no se importa muito com a representao no hardware, mas sim com o conceito matemtico de inteiro Um tipo inteiro suporta certas operaes...

Tipo Abstrato de Dados (TAD)

Os tipos e estruturas de dados existem para serem usados pelo programa para acessar informaes neles armazenadas, por meio de operaes apropriadas Do ponto de vista do programador, muitas vezes conveniente pensar nas estruturas de dados em termos das operaes que elas suportam, e no da maneira como elas so implementadas Uma estrutura de dados definida dessa forma chamada de um Tipo Abstrato de Dados (TAD)

Tipo Abstrato de Dados (TAD)

TAD, portanto, estabelece o conceito de tipo de dado divorciado da sua representao Definido como um modelo matemtico por meio de um par (v,o) em que

v um conjunto de valores o um conjunto de operaes sobre esses valores Ex.: tipo real

v= o = {+, -, *, /, =, <, >, <=, >=}

Definio de TAD

Requer que operaes sejam definidas sobre os dados sem estarem atreladas a uma representao especfica

ocultamento de informao (information hiding)

Programador que usa um tipo de dado real, integer, array no precisa saber como tais valores so representados internamente

mesmo princpio pode ser aplicado a listas, pilhas, ... se existe uma implementao disponvel de uma lista, p. ex., um programador pode utiliz-la como se fosse uma caixa preta, acess-la por meio das operaes que ela suporta

Definio de TAD

O conceito de TAD suportado por algumas linguagens de programao procedimentais

Ex. Modula 2, Ada programador descreve o TAD em dois mdulos separados Um mdulo contm a definio do TAD: representao da estrutura de dados e implementao de cada operao suportada Outro mdulo contm a interface de acesso: apresenta as operaes possveis Outros programadores podem, por meio da interface de acesso, usar o TAD sem conhecer os detalhes representacionais e sem acessar o mdulo de definio

Para definir um TAD


Definio de TAD

Os mdulos (ou units) so instalados em uma biblioteca e podem ser reutilizados por vrios programas

A execuo do programa requer a linkedio dos mdulos de definio (que podem ser mantidos j pr-compilados em uma biblioteca) junto com o programa Mas o programador no precisa olhar o cdigo do mdulo de definio para usar o TAD! Basta conhecer a interface de acesso

Implementao de um TAD

Uma vez definido um TAD e especificadas as operaes associadas, ele pode ser implementado em uma linguagem de programao Uma estrutura de dados pode ser vista, ento, como uma implementao de um TAD

implementao do TAD implica na escolha de uma ED para represent-lo, a qual acessada pelas operaes que ele define

ED construda a partir dos tipos bsicos (integer, real, char) ou dos tipos estruturados (array, record) de uma linguagem de programao

Caractersticas de um TAD

Caracterstica essencial de TAD a separao entre a definio conceitual par (v, o) e a implementao (ED especfica)

O programa s acessa o TAD por meio de suas operaes, a ED nunca acessada diretamente "ocultamento de informao"

Caractersticas de um TAD

Programador tem acesso a uma descrio dos valores e operaes admitidos pelo TAD Programador no tem acesso implementao

Idealmente, a implementao invisvel e inacessvel Ex. pode criar uma lista de clientes e aplicar operaes sobre ela, mas no sabe como ela representada internamente

Quais as vantagens?

Vantagens do uso de TADs

Reuso: uma vez definido, implementado e testado, o TAD pode ser acessado por diferentes programas Manuteno: mudanas na implementao do TAD no afetam o cdigo fonte dos programas que o utilizam (decorrncia do ocultamento de informao)

mdulos do TAD so compilados separadamente uma alterao fora somente a recompilao do arquivo envolvido e uma nova link-edio do programa que acessa o TAD O programa mesmo no precisa ser recompilado!

Correo: TAD foi testado e funciona corretamente

TADs em C: Exemplo
/* TAD: Matriz m por n */ /* Tipo Exportado */ typedef struct matriz Matriz; /* Funes Exportadas */
Note que a composio da estrutura Matriz (struct matriz) no est explicita. Dessa forma, os demais mdulos que usarem esse TAD no podero acessar diretamente os campos dessa estrutura. Os clientes desse TAD s tero acesso s informaes que possam ser obtidas atravs das funes exportadas.

/* Funo cria - Aloca e retorna matriz m por n


Matriz* cria (int m, int n);

*/

/* Funo libera - Libera a memria de uma matriz */ void libera (Matriz* mat);

/* Continua... */ Arquivo matriz.h


15

TADs em C: Exemplo
/* Continuao... */

/* Funo acessa - Retorna o valor do elemento [i][j]


float acessa (Matriz* mat, int i, int j); /* Funo atribui - Atribui valor ao elemento [i][j]

*/

*/

void atribui (Matriz* mat, int i, int j, float v);


/* Funo linhas - Retorna o no. de linhas da matriz int linhas (Matriz* mat); /* Funo colunas - Retorna o no. de colunas da matriz */ int colunas (Matriz* mat); Arquivo matriz.h
16

*/

TADs em C: Exemplo
#include <stdlib.h> /* malloc, free, exit */ #include <stdio.h> /* printf */ #include "matriz.h struct matriz { int lin; int col; float* v; }; void libera (Matriz* mat){ free(mat->v); free(mat); }

Arquivo matriz.c

17

TADs em C: Exemplo
/* Continuao... */

Matriz* cria (int m, int n) {


Matriz* mat = (Matriz*) malloc(sizeof(Matriz));

if (mat == NULL) { printf("Memria insuficiente!\n");


exit(1); } mat->lin = m; mat->col = n; mat->v = (float*) malloc(m*n*sizeof(float));

return mat;
}

Arquivo matriz.c
18

TADs em C: Exemplo
/* Continuao... */

float acessa (Matriz* mat, int i, int j) { int k; /* ndice do elemento no vetor */ if (i<0 || i>=mat->lin || j<0 || j>=mat->col) { printf("Acesso invlido!\n"); exit(1);
} k = i*mat->col + j; {armazenamento por linha}

return mat->v[k];
}

int linhas (Matriz* mat) { return mat->lin;


}

Arquivo matriz.c

19

TADs em C: Exemplo
/* Continuao... */

void atribui (Matriz* mat, int i, int j, float v) { int k; /* ndice do elemento no vetor */ if (i<0 || i>=mat->lin || j<0 || j>=mat->col) { printf("Atribuio invlida!\n"); exit(1);
} k = i*mat->col + j; mat->v[k] = v;
}

int colunas (Matriz* mat) { return mat->col;


}

Arquivo matriz.c

20

Programa cliente que usa o TAD


#include <stdio.h> #include <stdlib.h> #include "matriz.h"
int main(int argc, char *argv[]) { float a,b,c,d; Matriz *M; // criao de uma matriz M = cria(5,5); // insero de valores na matriz atribui(M,1,2,40); atribui(M,2,3,3); atribui(M,3,0,15); atribui(M,4,1,21);

/* Continuao... */

// verificando se a insero foi feita corretamente a = acessa(M,1,2); b = acessa(M,2,3); c = acessa(M,3,0); d = acessa(M,4,1); printf ("M[1][2]: %4.2f \n", a); printf ("M[2][3]: %4.2f \n", b); printf ("M[3][0]: %4.2f \n", c); printf ("M[4][1]: %4.2f \n", d);

system("PAUSE"); return 0; }

Exerccio: TAD Conjuntos (SET)

Um conjunto uma coleo de elementos Todos os elementos so diferentes entre si e a ordem entre eles irrelevante

Ex: {1,4} = {4, 1} ok {1,4, 1} no ok

Operaes bsicas: unio, intereseco e diferena

Se A e B so conjuntos ento A B o conjunto de elementos que so membros de A ou B ou ambos Se A e B so conjuntos ento A B o conjuntos de elementos que esto em A e B Se A e B so conjuntos ento A B o conjunto de elementos em A que no esto em B. Ex: A = {a,b,c} B = {b,d} A B = {a,b,c,d} A B = {b} A B = {a,c}

Operaes usuais

Unio(A,B,C) Interseco(A,B,C) Diferena(A,B,C) Membro(x,A) Cria_Conj_Vazio(A) Insere(x,A) Remove(x,A) Atribui(A,B) Min(A) Max(A) Igual(A,B)

Definio das operaes


Unio(A,B,C): toma os argumentos A e B que so conjuntos e retorna A B variavel C Interseco(A,B,C): toma os argumentos A e B que so conjuntos e retorna A B variavel C Diferena(A,B,C): toma os argumentos A e B que so conjuntos e retorna A - B variavel C Membro(x,A): toma o conjunto A e o objeto x cujo tipo o tipo do elemento de A e retorna um valor booleano true se x A e false caso contrrio. Cria_Conj_Vazio(A): faz o conjunto vazio ser o valor para a varivel conjunto A

Insere(x,A): toma o conjunto A e o objeto x cujo tipo o tipo do elemento de A e faz x um membro de A. O novo valor de A = A {x}. Se x j um membro de A, ento a operao insere no muda A. Remove(x,A): remove o objeto x, cujo tipo o tipo do elemento de A, de A. O novo valor de A = A {x}. Se x no pertence a A ento a operao remove no altera A.

Atribui(A,B): Seta o valor da varivel conjunto A = ao valor da varivel conjunto B. Min(A): retorna o valor mnimo no conjunto A. Esta operao pode ser aplicada somente quando os membros do parmetro A so linearmente ordenados. Por exemplo: Min({2,3,1}) = 1 e Min({a,b,c}) = a. Max(A): Similar a Min(A) s que retorna o mximo do conjunto. Igual(A,B): retorna true se e somente se os conjuntos A e B consistem dos mesmos elementos.

Como Implementar?

Vetor de Booleanos

Opo para conjuntos de inteiros: 1..N ith bit true se o elemento est no conjunto Const N =... ; Type set = array [1..N] of boolean;

Exerccios

Desenvolva:

TAD Nmero Complexo (livro Sincovec & Wiener, Captulo 1)

Livros (na biblioteca)


Data Structures and algorithms.Addison Wesley. AHO, A.V.; HOPCROFT,J.E.; ULLMAN,J.D., 1982. Data structures using Modula 2. Richard F. Sincovec, Richard S. Wiener, Wiley 1986. Programando em Modula 2. N. Wirth, LTC ed. 1989.

Você também pode gostar