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

Para definir um TAD

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

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