Tipos e valores

7.925 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.925
No SlideShare
0
A partir de incorporações
0
Número de incorporações
187
Ações
Compartilhamentos
0
Downloads
51
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Tipos e valores

  1. 1. Tipos e Valores Prof: Sergio Souza Costa Adaptado de © 2004, Programming Language Design Concepts D.A. Watt, University of Glasgow
  2. 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta http://www.slideshare.net/skosta/presentations?order=popular
  3. 3. Roteiro 1. Tipos e valores 2. Tipos primitivos 3. Tipos compostos 4. Sistema de tipos 5. Tipos abstratos de dados
  4. 4. Tipos Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles.
  5. 5. Tipos Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles. Diferentes linguagens suportam diferente tipos de dados.
  6. 6. Tipos Valores são agrupados por tipos de acordo com as operações poderão ser executadas sobre eles. Diferentes linguagens suportam 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.
  7. 7. Tipos Tipo é um conjunto de valores: v é um valor de tipo T se v Є T.
  8. 8. 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.
  9. 9. 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.
  10. 10. 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
  11. 11. 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?
  12. 12. Tipos A cardinalidade de um tipo T, escrito #T, e o número de valores do tipo T. ● #Boolean = 2
  13. 13. 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
  14. 14. Tipos Primitivos Valores primitivos são aqueles cujos valores são atômicos – não podem ser decompostos em valores mais simples.
  15. 15. 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.
  16. 16. 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.
  17. 17. Tipos primitivos - Comuns Boolean = {false, true} Character = {…, ‘A’, …, ‘Z’, …, ‘0’, …, ‘9’, …} Integer = {…, –2, –1, 0, +1, +2, …} Float = {…, –1.0, …, 0.0, +1.0, …}
  18. 18. 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.
  19. 19. 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.
  20. 20. 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
  21. 21. Criando tipos primitivos Em diversas linguagens é possível definir tipos de dados enumeráveis.
  22. 22. 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 ); Haskell data Color = Vermelha | Preta
  23. 23. 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 linguagens 3. Para casa: Pesquisem como fariamos isso em Ruby e Python
  24. 24. Tipos Compostos Um valor composto ou estruturado é quando o seu valor é composto a partir de valores mais simples.
  25. 25. 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.
  26. 26. 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.
  27. 27. 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.)
  28. 28. 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
  29. 29. 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),
  30. 30. 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;
  31. 31. Produtos Cartesianos -Haskell someday = (jan, 1) (m,d) = someday anotherday = (m + 1, d) Valores: data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec type Date = (Month, Int) Date = Month X Integer = {Jan, Feb, …, Dec} X {…, –1, 0, 1, 2, …} Uso: Declarações:
  32. 32. 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; };
  33. 33. 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}
  34. 34. 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
  35. 35. 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
  36. 36. 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).
  37. 37. Uniões Disjuntas - Haskell pi = Inexact 3.1416 rounded :: Number -> Integer rounded Exact i = i rounded Inexact r = round r >rounded pi >3 Uso:
  38. 38. 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; };
  39. 39. 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
  40. 40. 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.
  41. 41. 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.
  42. 42. 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);
  43. 43. 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
  44. 44. 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)
  45. 45. 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.
  46. 46. 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, …}
  47. 47. 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, …}
  48. 48. 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.
  49. 49. Tipos Recursivos - Naturais Peano, descreveu os axiomas dos números naturais, onde um número natural ou é Zero ou é o seu Succ.
  50. 50. Tipos Recursivos - Naturais Exemplos: 0 -> Zero 1 -> Succ (Zero) 2- > Succ ( Succ (Zero)) 3- > Succ ( Succ ( Succ (Zero))) ...
  51. 51. 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
  52. 52. 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))); }
  53. 53. 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 ()))
  54. 54. Numeros Naturais - Haskell data Nat = Zero | Succ Nat deriving (Show) soma :: Nat -> Nat -> Nat soma Zero n = n soma (Succ m) n = Succ (soma m n) mult :: Nat -> Nat -> Nat mult Zero m = Zero mult (Succ m) n = soma n (mult n m)
  55. 55. 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.
  56. 56. 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]]
  57. 57. 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 ?
  58. 58. Tipos Recursivos - Lista - Ada Declarações type 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)))
  59. 59. 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.
  60. 60. 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
  61. 61. 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).
  62. 62. 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 ?
  63. 63. 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 ?
  64. 64. 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.
  65. 65. 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
  66. 66. 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
  67. 67. 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.
  68. 68. 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")
  69. 69. 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;
  70. 70. 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
  71. 71. 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.
  72. 72. 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.
  73. 73. 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.
  74. 74. 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(); });
  75. 75. 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).
  76. 76. 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)
  77. 77. 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)
  78. 78. •TADs são implementadas através da combinação de: –Tipos primitivos –Tipos compostos. –Arrays –Ponteiros Tipo Abstrato de Dados (TAD)
  79. 79. •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)
  80. 80. Dados Operações (consultoras) Operações (construtoras) Operações (atualizadoras) Operações (destrutoras) Cliente TAD Tipo Abstrato de Dados (TAD)
  81. 81. Dados Operações (consultoras) Operações (construtoras) Operações (atualizadoras) Operações (destrutoras) Cliente TAD Tipo Abstrato de Dados (TAD) O exemplo mais simples de um cliente é a função main.
  82. 82. 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)
  83. 83. Referências Programming Language Design Concepts [Paperback]. David A. Wat Abstract Data Types and the Development of Data Structures

×