TIPOS ABSTRATOS DE DADOS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello Tipos de Dados Conjunto de valores que podem ser assumidos por uma variável ou expressão, atribuídos a uma constante, retornados por uma chamada, etc, em uma dada linguagem de programação Tipos de Dados Tipos primitivos Também denominados simples ou básicos, representam valores indivisíveis, como int, float, char, ... em C Tipos compostos São coleções ou agregados de tipos (simples ou compostos) possivelmente diferentes, como arranjos, strings e dados estruturados: Por exemplo: struct em C, record em Pascal, object em C++ Tipos de Dados: Pontos de vista Do computador Tipos de dados são vistos como métodos para interpretar o conteúdo da memória do computador como interpretar os bits/bytes Dos programadores: O que desejam fazer p. ex., somar dois inteiros O programador se importa mais com o conceito matemático de inteiro do que com a representação no hardware Um tipo inteiro ´suporta´certas operações... Tipos Abstratos de Dados (TAD) Um TAD: Descrição de alto nível que especifica quais operações são suportadas por uma estrutura de dados Mas que não fornece detalhes de como são realizadas (estruturas de dados e algoritmos) Exemplo: TAD: Conjunto Simples Tipos de Dados: Inteiros Operações: Interseção, União e Diferença Implementação em diferentes linguagens: Arquivos de Cabeçalho“.h”de C, Interfaces Java ... Estruturas de Dados Coleções de unidades (células) capazes de suportar diferentes tipos de dados e que podem se conectar e inter-relacionar de diferentes formas Arranjos e registros são exemplos de estruturas de dados elementares EDs são realizações de TADs, diferindo entre si pelas regras ou esquemas de disposição e manipulação dos dados: Um mesmo TAD pode ser realizado com estruturas de dados diferentes: fila com arranjo ou lista encadeada, grafo com lista de arestas ou matriz de adjacências, etc. Estruturas de Dados Descrevem de forma sistemática maneiras de organizar, acessar e manipular dados É um nível intermediário de descrição entre o TAD e a implementação concreta do código em alguma linguagem TAD Estrutura de Dados Programa Tipos Abstratos de Dados (TAD) estabelece o conceito de tipo de dado divorciado da sua representação Pode ser formalmente definido como um modelo matemático, por meio de um par (v,o) em que V é um conjunto de valores O é um conjunto de operações sobre esses valores x.: Número real v= ℜ o= {+, -, *, /, =, <, >, <=, >=} Tipos Abstratos de Dados (TAD) Ocultamento de informação (information hiding) Um TAD requer que operações sejam definidas sobre os dados sem uma representação específica Um programador que usa um tipo de dado float, int, etc não precisa saber como tais valores são representados internamente: Mesmo princípio pode ser aplicado a listas, pilhas, filas, ... Programador pode utilizar como uma “caixa preta” apenas por meio das operações que ela suporta Programando com TAD Programador descreve o TAD em dois módulos separados: Interface de acesso (TAD conceitual): apresenta as operações e valores possíveis Implementação contém a representação da estrutura de dados e a implementação de cada operação Programando com TAD Outros programadores: Usam a TAD por meio da interface de acesso Sem conhecer os detalhes de representação Não acessam o módulo de implementação Idealmente, a implementação é “invisível”: Programador usa TAD e cria uma lista de clientes e aplica operações sobre ela, Sem saber como ela é representada internamente Vantagens dos TAD Clareza: Estrutura interna do TAD é abstraída Corretidão: TAD foi testado e funciona corretamente Reuso: TAD pode ser usado por diferentes programas Manutenção: Mudanças na implementação do TAD não afetam o código fonte dos programas que o utilizam se a interface de acesso não mudar decorrência do ocultamento de informação Implementação de TAD em C Usando modularização: Interface: Arquivo de cabeçalhos, associado a cada módulo, com: cabeçalhos das funções oferecidas pelo módulo e, os tipos de dados que ele exporte typedef’s, Tem struct’s, etc. o mesmo nome do porém com a extensão .h Implementação arquivo .c com os programas Implementação de TAD em C /* Racionais.h: Interface de TAD Números Racionais */ /* Tipo Exportado */ Typedef struct{ intNum, Den; } Racional; /* Funções Exportadas */ Racional Define(intN, intD); /* Gera um número racional a partir de dois inteiros, sendo o segundo não nulo */ Racional Soma(Racional R1, Racional R2); /* Soma dois números racionais R1 e R2 e retorna o resultado */ Racional Multiplica(Racional R1, Racional R2); /* Multiplica dois números racionais R1 e R2 e retorna o resultado */ Int TestaIgualdade(Racional R1, Racional R2); /* Verifica se 2 números racionais R1 e R2 sao iguais */ Implementação de TAD em C #include <stdio.h> #include"Racionais.h" Void main(void){ /* Teste do TAD: Exercício... */ } /* Soma dois números racionais R1 e R2 e retorna o resultado */ Racional Soma(Racional R1, Racional R2) { … } Impementação do TAD em C++ TADs podem ser implementados como classes em C++ Os conceitos de programação orientada a objetos estendem os conceitos de TAD Checando Escrever um programa C que executa operações sobre números racionais, utilizando o TAD definido em aula Perguntas?