Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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...
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)
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
Definio de TAD
Requer que operaes sejam definidas sobre os dados sem estarem atreladas a uma representao especfica
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
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
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?
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!
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 libera - Libera a memria de uma matriz */ void libera (Matriz* mat);
TADs em C: Exemplo
/* Continuao... */
*/
*/
*/
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... */
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];
}
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;
}
Arquivo matriz.c
20
/* 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; }
Um conjunto uma coleo de elementos Todos os elementos so diferentes entre si e a ordem entre eles irrelevante
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)
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:
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.