tipos e valores

83
Tipos e Valores Prof: Sergio Souza Costa Adaptado de © 2004, Programming Language Design Concepts D.A. Watt, University of Glasgow

Upload: sergio-souza-costa

Post on 23-Jun-2015

4.762 views

Category:

Technology


0 download

TRANSCRIPT

Page 2: Tipos e valores

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)

[email protected]

https://sites.google.com/site/profsergiocosta/home

https://twitter.com/profsergiocosta

http://gplus.to/sergiosouzacosta

http://www.slideshare.net/skosta/presentations?order=popular

Page 3: Tipos e valores

Roteiro

1. Tipos e valores2. Tipos primitivos3. Tipos compostos4. Sistema de tipos5. Tipos abstratos de dados

Page 4: Tipos e valores

Tipos

Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles.

Page 5: Tipos e valores

Tipos

Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles. Diferentes linguagens suportão diferente tipos de dados.

Page 6: Tipos e valores

Tipos

Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles. Diferentes linguagens suportão diferente tipos de dados.

Ada: booleans, characters, enumerands, integers, real numbers, records, arrays, discriminated records, objects (tagged records), strings, pointers to data, pointers to procedures.C: enumerands, integers, real numbers, structures, arrays, unions, pointers to variables, pointers to functions.Java: booleans, integers, real numbers, arrays, objects.Haskell: booleans, characters, integers, real numbers, tuples, disjoint unions, lists, tipos recursivos.

Page 7: Tipos e valores

Tipos

Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.

Page 8: Tipos e valores

Tipos

Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.

E é uma expressão de tipo T se E leva a um valor do tipo T.

Page 9: Tipos e valores

Tipos

Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.

E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto.

Page 10: Tipos e valores

Tipos

Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.

E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto. Boolean {true, false}, Operações: and, or, not, etc

Page 11: Tipos e valores

Tipos

Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.

E é uma expressão de tipo T se E leva a um valor do tipo T. Um tipo é um conjunto de valores que exibe um comportamento uniforme sob operações associadas a este conjunto. Boolean {true, false}, Operações: and, or, not, etc {15, true, azul} é um tipo?

Page 12: Tipos e valores

Tipos

A cardinalidade de um tipo T, escrito #T, e o número de valores do tipo T.● #Boolean = 2

Page 13: Tipos e valores

Tipos

A cardinalidade de um tipo T, escrito #T, e o número de valores do tipo T.● #Boolean = 2

Classificação de tipos:○ Primitivos○ Compostos○ Recursivos

Page 14: Tipos e valores

Tipos Primitivos

Valores primitivos são aqueles cujos valores são atômicos – não podem ser decompostos em valores mais simples.

Page 15: Tipos e valores

Tipos Primitivos

Valores primitivos são aqueles cujos valores são atômicos – não podem ser decompostos em valores mais simples.

Tipo primitivo é onde os valores são primitivos.

Page 16: Tipos e valores

Tipos Primitivos

Valores primitivos são aqueles cujos valores são atômicos – não podem ser decompostos em valores mais simples.

Tipo primitivo é onde os valores são primitivos.

Toda linguagem de programação possui tipos primitivos, e algumas permitem definir novos.

Page 17: Tipos e valores

Tipos primitivos - Comuns

Boolean = {false, true} Character = {…, ‘A’, …, ‘Z’, …, ‘0’, …, ‘9’, …} Integer = {…, –2, –1, 0, +1, +2, …} Float = {…, –1.0, …, 0.0, +1.0, …}

Page 18: Tipos e valores

Tipos primitivos - Comuns

Cardinalidades: #Boolean = 2 #Character = 128 (ASCII), 256 (ISO-Latin), or 32768 (Unicode) #Integer = max integer – min integer + 1

Note: Em algumas linguagens (ex. C), booleans e characters são inteiros.

Page 19: Tipos e valores

Criando tipos primitivos

Ada permite definir novos tipos numéricos. Ada, C, Haskell permite criar nos tipos enumerados, simplismente a partir da enumeração seus valores.

Page 20: Tipos e valores

Criando tipos primitivos

Em Ada é possível definir novos tipos númericos. ● Declaração:

type Population is range 0 .. 1000;● Conjunto de valores:

Population = {0, 1, …, 1000}● Cardinalidade:

#Population = 1001

Page 21: Tipos e valores

Criando tipos primitivos

Em diversas linguagens é possível definir tipos de dados enumeráveis.

Page 22: Tipos e valores

Criando tipos primitivos

Em diversas linguagens é possível definir tipos de dados enumeráveis.

C: enum Cor { VERMELHA, PRETA };

Ada:type Color is (VERMELHA, PRETA );

Haskelldata Color = Vermelha | Preta

Page 23: Tipos e valores

Criando tipos primitivos - Atividade

1. Em Haskell, ADA e C, implementem o tipo booleano:

Valores: {Verdadeiro, Falso}

Operações: E, Ou, OuEx, Nao

2. Descreva o que achou sobre cada uma das linguagens3. Para casa: Pesquisem como fariamos isso em Ruby e Python

Page 24: Tipos e valores

Tipos Compostos

Um valor composto ou estruturado é quando o seu valor é composto a partir de valores mais simples.

Page 25: Tipos e valores

Tipos Compostos

Um valor composto ou estruturado é quando o seu valor é composto a partir de valores mais simples. Tipo composto é um tipo cujos valores são compostos.

Page 26: Tipos e valores

Tipos Compostos

Um valor composto ou estruturado é quando o seu valor é composto a partir de valores mais simples.

Tipo composto é um tipo cujos valores são compostos.

Linguagens de programação (LP) suporta uma grande variedade deles.

Page 27: Tipos e valores

Tipos Compostos

Podem ser entendidos por poucos conceitos:● Cartesian products (tuples, structures, records)● mappings (arrays)● disjoint unions (algebraic data types, discriminated

records, objects)● recursive types (lists, trees, etc.)

Page 28: Tipos e valores

Produtos Cartesianos

● Por meio do produto cartesiano, valores de dois tipos (possivelmente diferentes) são emparelhados.

● Sejam S e T dois tipos quaisquer. O produto cartesiano SxT é definido como:

S x T = { (x,y) | x in S; y in T}

● Exemplo: boolean x integer = {..., (true, -1), (true, 0), (true, 1), ..., (false, -1), (false, 0), (false, 2), ...}

● Cardinalidade: #(SxT) = #S x #T

Page 29: Tipos e valores

Produtos Cartesianos

Records (Ada), structures (C), e tuplas (Haskell) são exemplos de Produtos Cartesianos:

struct Point { x,y: double;

};

structures (C)type Point is record x: Double;

y: Double;

end record;

Records (Ada),

type Point = (Double,Double)

tuplas (Haskell) class Point: x = 0;y =0;

Class (Python),

Page 30: Tipos e valores

Produtos Cartesianos - ADA

type Month is (jan, feb, mar, apr, may, jun,

jul, aug, sep, oct, nov, dec);

type Day_Number is range 1 .. 31;

type Date is record

m: Month;

d: Day_Number;

end record;

Declarações:

Uso:someday: Date := (jan, 1);

…put(someday.m+1); put("/"); put(someday.d);someday.d := 29; someday.m := feb;

Page 31: Tipos e valores

Produtos Cartesianos -Haskell

someday = (jan, 1)(m,d) = somedayanotherday = (m + 1, d)

Valores:

data Month = Jan | Feb | Mar | Apr| May | Jun | Jul | Aug| Sep | Oct | Nov | Dectype Date = (Month, Int)

Date = Month X Integer= {Jan, Feb, …, Dec} X {…, –1, 0, 1, 2, …}

Uso:

Declarações:

Page 32: Tipos e valores

Produtos Cartesianos - POO

Uma classe de objetos é um produto cartesiano de seus atributos. Os métodos são as operações válidas sobre este tipo.

class Point {public: Point (double x, double y); double x() { .. } double y() { .. }private: double x,y;};

Page 33: Tipos e valores

Produtos Cartesianos

Algumas linguagens como Lua, não "definimos" novos tipos, apenas valores e construtores. Os produtos cartesianos são representados por tabelas. Ponto é do tipo tabela, com dois campos, x e y.

ponto = {x= 10, y= 20}

Java Script, se comporta de modo similar, entretanto neste caso são chamado do tipo objeto.

ponto = {x: 10, y: 20}

Page 34: Tipos e valores

Uniões Disjuntas

Na união disjunta os valores são escolhidos de dois tipos (normalmente diferentes).

Sejam S e T dois tipos quaisquer. A união disjunta S+T é definida como:

S + T = {esquerda x | x in S} U {direita y | y in T} Exemplo:

S = {a,b,c} e T = {0,1} S + T = {esquerda(a), esquerda (b), esquerda(c), direita(0), direita(1)}

Cardinalidade:

#(S + T) = #S + #T

Page 35: Tipos e valores

Uniões Disjuntas

union {

int exact;

float inexact;

};

Union em C

data Number = Exact Int | Inexact Float

Tipos algébricos em Haskell

type Accuracy is (exact, inexact);type Number (acc: Accuracy := exact) is record case acc of when exact => ival: Integer; when inexact => rval: Float; end case;end record;

Ada

Page 36: Tipos e valores

Uniões Disjuntas - Haskell

Declaração data Number = Exact Int | Inexact Float

Valores: Number = Exact Integer + Inexact Float … Exact(–2) Exact(–1) Exact 0 Exact 1 Exact 2 …… Inexact(–1.0) … Inexact 0.0 … Inexact 1.0 …

Cardinalidade: #Number = #Integer + #Float

Cada valor consiste de uma tag, junto ou com um valor inteiro (se a tag is Exact) ou um valor Float (se a tag é Inexact).

Page 37: Tipos e valores

Uniões Disjuntas - Haskell

pi = Inexact 3.1416 rounded :: Number -> Integerrounded Exact i = i

rounded Inexact r = round r

>rounded pi >3

Uso:

Page 38: Tipos e valores

Unions e cartesianos - C

Descrição de um símbolo, em um interpretador.

typedef enum { int_t, float_t ,string_t} TYPE;

union m_value { int int_value; float float_value; char* str_value;} ;struct symbol { const char* name; union m_value* val; TYPE t;};

Page 39: Tipos e valores

Mapeamentos

Define uma função de um conjunto para outro (array e função).

Sejam S e T dois tipos quaisquer. Os mapeamentos S -> T são definidos como:

S -> T = {m(x) | x in S => m(x) in T} Exemplo:

Integer -> Char = ... U { ..., -1 -> ´#´, 0->´%´, 1-> ´&´, ...} U {..., -1 -> ´z´ 0->´y´, 1-> ´w´, ...} U ...

Cardinalidade de todos mapeamentos:

#(S -> T) = (#T)#S

Exemplo, {u, v} -> {a, b, c} existem 3^2 = 9 possibilidade

Page 40: Tipos e valores

Mapeamentos - Arrays

Arrays é um tipo de mapeamento finito de um index e valor.Se um array é do tipo T e seu index é do tipo S. Então o array é um

mapeamento do tipo S -> T.

Em C e Java, o indice deve estar na faixa entre {0, 1, …, n–1}.

Em Ada, pode ser qualquer tipo primitivo (excessão tipos reais)

Em Lua, os indices podem ser qualquer um dos tipos existentes.

Page 41: Tipos e valores

Mapeamentos - Arrays

Arrays é um tipo de mapeamento finito de um index e valor.Se um array é do tipo T e seu index é do tipo S. Então o array é um

mapeamento do tipo S -> T.

Em C e Java, o indice deve estar na faixa entre {0, 1, …, n–1}.

Em Ada, pode ser qualquer tipo primitivo (excessão tipos reais)

Em Lua, os indices podem ser qualquer um dos tipos existentes.

Esse tipo de

mapeamento so

existe em

linguagens

imperativas.

Page 42: Tipos e valores

Array - Ada

● Declaração: type Color is (red, green, blue);type Pixel is array (Color) of Boolean;

● Uso: p: Pixel := (true, false, true);c: Color;…p(c) := not p(c);

Page 43: Tipos e valores

Array - Ada

● Valores: Pixel = Color -> Boolean = {red, green, blue} -> {false, true} viz: {red -> false, green -> false, blue -> false} {red -> false, green -> false, blue -> true} {red -> false, green -> true, blue -> false} {red -> false, green -> true, blue -> true} {red -> true, green -> false, blue -> false} {red -> true, green -> false, blue -> true} {red -> true, green -> true, blue -> false} {red -> true, green -> true, blue -> true}

● Cardinalidade: #Pixel = (#Boolean)#Color = 23 = 8

Page 44: Tipos e valores

Tabelas - Lua

Tabelas com indices numéricos, 0 a N

t1 = {"maria", "joana"}

print (t1[1], t2[1])

Tabelas com indices não numéricos,

a1 = { nome = "maria", matricula = 123}

print (a1["nome"], a1["matricula"])

print (a1.nome, a1.matricula)

Page 45: Tipos e valores

Mapeamento - Função

Funções é outro tipo de mapeamento. Uma função mapea argumentos para resultado.

Se uma função tem um unico argumento do tipo S e o resultado é do tipos T, a função é um mapeamento do tipo S -> T.

Page 46: Tipos e valores

Mapeamento - Função - Ada

Definição: function is_even (n: Integer) return Boolean is begin return (n mod 2 = 0); end;

Tipo:Integer -> Boolean

Valores: {…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}

Page 47: Tipos e valores

Mapeamento - Função -Haskell

Definição: is_even n = (mod n 2 == 0)

Tipo

Integer -> Boolean

Valores: {…, 0 -> true, 1 -> false, 2 -> true, 3 -> false, …}

Page 48: Tipos e valores

Tipos Recursivos

Um tipo recursivo é definido em termos de si.

Exemplos de tipos recursivos:● listas● árvores● números naturais

A cardinalidade de tipos recursivos é infinita.

Page 49: Tipos e valores

Tipos Recursivos - Naturais

Peano, descreveu os axiomas dos números naturais, onde um número natural ou é Zero ou é o seu Succ.

Page 50: Tipos e valores

Tipos Recursivos - Naturais

Exemplos:

0 -> Zero

1 -> Succ (Zero)

2- > Succ ( Succ (Zero))

3- > Succ ( Succ ( Succ (Zero)))

...

Page 51: Tipos e valores

Numeros Naturais - C

typedef struct Nat {struct Nat* succ;

}* Nat;

Nat Zero () {return NULL;

}

Nat Succ (Nat a) {Nat n = malloc (sizeof (Nat));n->succ = a;return n;

}

Definição da estrutura. Observe a recursão.

Função que define o Zero

Função que define o seu Succ

Page 52: Tipos e valores

Numeros Naturais -C

Nat sum (Nat a, Nat b) {

if (a == Zero () )

return b;

else

return Succ ( sum (a->succ,b));

}

Nat mult (Nat a, Nat b) {

if (a == Zero () )

return Zero ();

else

return sum (b, (mult (b, a->succ)));

}

Page 53: Tipos e valores

Numeros Naturais -C

void show (Nat a) {

if (a == Zero ()) {

printf ("Zero ()");

}

else {

printf ("Succ (");

show (a->succ);

printf (")");

}

}

Uso:

Nat a = Succ (Succ (Zero ()));show (a) -> Succ (Succ (Zero ()))

Page 54: Tipos e valores

Numeros Naturais - Haskell

data Nat = Zero | Succ Nat deriving (Show)

soma :: Nat -> Nat -> Natsoma Zero n = nsoma (Succ m) n = Succ (soma m n)

mult :: Nat -> Nat -> Natmult Zero m = Zeromult (Succ m) n = soma n (mult n m)

Page 55: Tipos e valores

Tipos Recursivos - Lista

Uma lista é uma sequencia de 0 ou mais elementos.

O tamanho de uma lista é seu número de elementos. ● Uma lista vazia não possui nenhum elemento.

Uma lista não vazia consiste de uma cabeça (primeiro elemento) e a calda (todos elementos que não são cabeça).

Uma lista é homogenea se todos seus componentes são do mesmo tipo, caso contrário são homogeneas.

Page 56: Tipos e valores

Tipos Recursivos - Lista - Haskell

Declaração:data IntList = Nil | Cons Int IntList

Construções:>Nil

>Cons 2 (Cons 3 (Cons 5 (Cons 7 Nil)))

Haskell ja tem um tipo lista nativos[Int] [String] [[Int]]

Construções : [] [2,3,5,7]["cat","dog"][[1],[2,3]]

Page 57: Tipos e valores

Tipos Recursivos - Lista - Haskell

ATIVIDADE: Codifiquem as funções soma, produto e tamanho em Haskell.

O que se conclui com relação as funções soma e produto ?

Page 58: Tipos e valores

Tipos Recursivos - Lista - Ada

Declaraçõestype IntNode;

type IntList is access IntNode;

type IntNode is record

head: Integer;

tail: IntList;

end record;

Construtor new IntNode'(2,

new IntNode'(3,

new IntNode'(5,

new IntNode'(7, null)))

Page 59: Tipos e valores

Strings

● Seqüência de 0 ou mais caracteres.● Não existe consenso sobre sua classificação.● Strings são tipos primitivos ou compostos?● Python, ML, Lua são tipos primitivos● Em Haskell é uma lista de caracter● Em C, vetor de caracter.● Java trata strings como objetos da classe String.

Page 60: Tipos e valores

Sistema de tipos

●Agrupando valores em tipos, permite o programador descrever dados de forma efetiva. ○Uma disciplina de tipos também previne os

programas de operações sem sentido.●Checagem de tipos assegura que uma dada

operação é aplicada a operandos adequados.●As checagem de tipos podem ser executadas em

tempo de compilação ou em tempo de execução.●Um erro de tipo ocorre se o programa executa uma

operação com tipos incopativeis, tais como multiplicar uma string por um valor booleano

Page 61: Tipos e valores

Checagem de tipos

Classificação de Linguagens do sistema de tipos:● Estaticamente tipadas - toda variável e parâmetro tem um

tipo fixo escolhido pelo programador. (Pascal, C, C++, Haskell, Ada).

● Dinamicamente tipadas - apenas valores têm tipos fixos. Variáveis e parâmetros não possuem um tipo associado, mas podem assumir valores de diferentes tipos em diferentes trechos do programa. (Smalltalk, Clipper, SNOBOL).

Page 62: Tipos e valores

Linguagem estaticas

Exemplo em C:

int max (int a, int b) {

if (a > b) return a;

else return b

}

max (4, 5)

max (3.5,3.1)

Qual a principal limitação ?Conhecem algum recurso que pode diminuir essa limitação ?

Page 63: Tipos e valores

Linguagem dinâmicas

● Exemplo em Lua:

function max (a, b)

if a > b then return a

else return b end

end

print (max (3.2, 3.6))

print (max ("a","b"))

Qual a principal vantagem das linguagens dinâmicas ?Qual a principal desvantagem das linguagens dinâmicas ?

Page 64: Tipos e valores

Estáticos Vs Dinâmico

● Tipagem dinâmica implica em baixa performance em tempo de execução.

● Segurança é outra vantagem de linguagens estaticamente tipadas.

● A grande vantagem de linguagens dinamicamente tipadas é a flexibilidade.○ Ex: LUA, Python, JavaScript.

Page 65: Tipos e valores

Inferência de tipos

Haskell é uma linguagem estática, porém ela possui um recurso conhecido como "inferência de tipos"

Este recurso permite que o programador não explicite o tipo de uma função.

f x = 0.6 * x

Ao invés disso:

f :: Double-> Double

f x = 2 * x

Page 66: Tipos e valores

Erro de tipos

● É a aplicação de um operador a um operando de um tipo inapropriado○ Atribuir um int para uma função que espera um float nas

primeiras versões de C● Se todas as vinculações de variáveis a tipos forem estáticas

na linguagem, a verificação de tipos pode ser feita toda em tempo de compilação

● Em linguagens dinâmicas (JavaScript, PHP) isso só pode ser feito em tempo de execução

Page 67: Tipos e valores

Tipagem forte

● Uma das idéias de projeto de LPs surgida na década de 70○ é uma característica bastante apreciada em LPs

● Existe um pouco de subjetividade com relação a esta terminologia.

● Uma linguagem é dita fortemente tipada se os erros de tipo são sempre detectados○ seja em tempo de compilação quanto de execução

● Linguagens dinâmicas tendem a ter um tipo mais fraco que linguagens estáticas.

Page 68: Tipos e valores

Tipagem forte

● Fortran 95 não é fortemente tipada○ uso da funcionalidade Equivalence

● Ada é quase fortemente tipada○ uso da funcionalidade Unchecked_Conversion

● C e C++ não são fortemente tipadas● ML e Haskel são fortemente tipados● Java e C# são quase fortemente tipadas

○ Existem algumas coerções (conversões "automáticas")

Page 69: Tipos e valores

Tipagem forte e coerção

● Regras de coerção possuem um efeito importante no valor da verificação de tipos.○ o valor da tipagem forte é reduzido de acordo com as

coerções● LPs com muitas coerções (C, C++, Fortran) são menos

confiáveis que LPs com poucas (Ada, Java, C#)● Java e C# possuem cerca de metade das coerções de C++,

por exemplo.

// convertido implicitamente para inteiro

int a = 10.5;

Page 70: Tipos e valores

PRINCÍPIO DA COMPLETUDE DO TIPO

Em principio um valor de qualquer tipo pode:● atribuido● composto com outros valores● passado com um argumento ( procedure ou function)● retornado como resultado de uma função

Page 71: Tipos e valores

PRINCÍPIO DA COMPLETUDE DO TIPO

Em principio um valor de qualquer tipo pode:● atribuido● composto com outros valores● passado com um argumento ( procedure ou function)● retornado como resultado de uma função

Algumas linguagens restringem essas operações sobre alguns valores.

Page 72: Tipos e valores

PRINCÍPIO DA COMPLETUDE DO TIPO

Em principio um valor de qualquer tipo pode:● atribuido● composto com outros valores● passado com um argumento ( procedure ou function)● retornado como resultado de uma função

Algumas linguagens restringem essas operações sobre alguns valores.

Valores de primeira classe não possuem restrições.

Page 73: Tipos e valores

PRINCÍPIO DA COMPLETUDE DO TIPO

● Valores de segunda classe - podem ser passados como argumentos, mas não podem ser avaliados, atribuídos, ou fazer parte de valores compostos. (abstrações de função e procedimento em Pascal).

● Valores de primeira classe - podem ser passados com argumentos, avaliados, atribuídos e fazer parte de valores compostos. (tipos primitivos em Pascal)

● Em linguagens como Lua, Haskell, Python, JavaScript, Ruby, ML e Miranda, valores são tratados sem distinção.

Page 74: Tipos e valores

PRINCÍPIO DA COMPLETUDE DO TIPO

Funções como valores de primeira classe, exemplo JavaScript (JQuery). Passando função como parametro.

$(“button”).click(function(){

facaAlgo();

});

Page 75: Tipos e valores

Tipos de dados definem a forma como um dado deve ser armazenado ou recuperado, bem como os possíveis valores que ele pode assumir e as operações que podem ser efetuadas sobre os mesmos.

Um tipo abstrato de dados (TAD) é a especificação matemática de um conjunto de dados e das operações que podem ser executadas sobre esses dados.

O conceito de tipo de dado abstrato é dissociado do hardware.

Tipo Abstrato de Dados (TAD)

John Guttag, grande contribuição na formalização dos TAD.

J.V. Guttag, The Specification and Application to Programming of Abstract Data Types,Ph.D. Thesis, Dept. of Computer Science, University of Toronto (1975).

Page 76: Tipos e valores

Um tipo abstrato de dados (TAD) é a especificação matemática de um conjunto de dados e das operações que podem ser executadas sobre esses dados.

O conceito de tipo de dado abstrato é dissociado do hardware.

John Guttag, grande contribuição na formalização dos TAD.

J.V. Guttag, The Specification and Application to Programming of Abstract Data Types,Ph.D. Thesis, Dept. of Computer Science, University of Toronto (1975).

A expressão tipo abstrato de dados normalmente refere-se ao tipos definidos pelo usuário.

Tipo Abstrato de Dados (TAD)

Page 77: Tipos e valores

TAD define o que cada operação faz, mas não como faz.

Assim, um mesmo tipo abstrato de dados pode ser concretizado (ou implementado) de diversas formas.

Tipo Abstrato de Dados (TAD)

Page 78: Tipos e valores

•TADs são implementadas através da combinação de:

–Tipos primitivos

–Tipos compostos.

–Arrays

–Ponteiros

Tipo Abstrato de Dados (TAD)

Page 79: Tipos e valores

•Encapsulam e "protegem" os dados

•Foi o conceito básico para a definição de orientação a objetos.

•Quatro tipos diferentes de operações

–Construtoras

–Consultoras

–Atualizadoras

–Destrutoras

Tipo Abstrato de Dados (TAD)

Page 80: Tipos e valores

Dados

Operações(consultoras)

Operações(construtoras)

Operações(atualizadoras)

Operações(destrutoras)

ClienteTAD

Tipo Abstrato de Dados (TAD)

Page 81: Tipos e valores

Dados

Operações(consultoras)

Operações(construtoras)

Operações(atualizadoras)

Operações(destrutoras)

ClienteTAD

Tipo Abstrato de Dados (TAD)

O exemplo mais simples de um cliente é a função main.

Page 82: Tipos e valores

As operações em um tipo abstrato de dados protegem os dados da aplicação cliente.

Modificações nos dados não acarretará mudanças no código da aplicação cliente.

Mais a frente no curso, verão que o paradigma de programação orientado a objeto teve como base os tipos de dados abstratos.

Tipo Abstrato de Dados (TAD)