Tipos de Dados Paradigmas de Programação Prof. Gláucya Carreiro Boechat [email protected] Introdução Um tipo de dado define uma coleção de dados e um conjunto de operações prédefinidas sobre esses dados Um descritor é um conjunto de atributos de uma variável Um objeto representa uma instância de um tipo de dado abstrato definido pelo usuário Tipos de Dados Primitivos Tipos de dados não-definidos em termos de outros tipos são chamados tipos de dados primitivos Praticamente todas as linguagens de programação oferecem um conjunto de tipos de dados primitivos Tipos de Dados Primitivos Inteiro Quase sempre um reflexo da plataforma utilizada (hardware e/ou SO) Muitos computadores suportam diferentes tamanhos para inteiros Em Java, diferentes tamanhos para inteiros byte, short, int, long Existem vários tipos de números inteiros numa linguagem: inteiro com/sem sinal, inteiro base decimal, inteiro base binária, precisão simples, etc. Tipos de Dados Primitivos Ponto Flutuante Modelam os números reais, mas são aproximações Linguagens para fins científicos suportam pelo menos dois tipos ponto flutuante (float e double) IEEE Floating-Point Standard 754 Tipos de Dados Primitivos: Ponto Flutuante Formato: a) Precisão Única b) Precisão Dupla Tipos de Dados Primitivos Booleano Mais simples de todos Faixa de valores Dois elementos: um para “true” zero para “false” Pode ser implementado como bits, mas geralmente são como bytes Vantagem: legibilidade Tipos de Dados Primitivos Caracter Armazenados como codificações numéricas O código mais usado: ASCII Uma alternativa, codificação de 16-bit: Unicode Inclui caracteres da maioria das linguagens naturais Usado em Java C# e JavaScript também suportam Unicode Tipos cadeia de caracteres Valores consistem em seqüências de caracteres Questões de projeto: É um tipo primitivo ou apenas um tipo especial de vetores de caracteres? As cadeias devem ter tamanho estático ou dinâmico? Opções Operações típicas: Atribuição e cópia Comparação (=, >, etc.) Concatenação Referências a subcadeias Aplicação em Linguagens C e C++ SNOBOL4 (uma linguagem de manipulação de cadeias) Não primitivo Usam vetores char e uma biblioteca de funções que oferecem operações (string.h) Primitivo Java Primitivo através da classe String Opções de Tamanho Estático Tamanho dinâmico limitado: C e C++ COBOL, FORTRAN 90, Pascal, Ada e Java classe String Um caractere especial é usado para indicar o final da cadeia, em vez de manter seu tamanho Dinâmico (sem máximo): SNOBOL4, Perl, JavaScript Cadeias de Caracteres Avaliação São importantes para a capacidade de escrita de uma linguagem Como um tipo primitivo com tamanho estático, não é caro Por que não usá-las? Tamanho dinâmico é mais flexível Mas o custo compensa? Implementação de Cadeias de Caracteres Tamanho estático Tamanho dinâmico limitado Podem exigir um descritor em tempo de execução para armazenar tanto o tamanho máximo como o tamanho atual (mas não em C e C++) Tamanho dinâmico descritor em tempo de compilação Exigem um descritor em tempo de execução Exigem um gerenciamento de armazenagem mais complexo Alocação e desalocação Implementação de Cadeias de Caracteres Descritor em Tempo de Compilação para cadeias estáticas Semântica Axiomática: Instruções de atribuição Descritor em tempo de execução para cadeias dinâmicas limitadas Tipos Ordinários definidos pelo Usuário Um tipo ordinário é aquele cuja faixa de valores possíveis pode ser associada ao conjunto dos números inteiros positivos Tipos Enumeração Tipos Subfaixa Exemplos de tipos ordinários em Java integer char boolean Enumerações Todos os valores possíveis, os quais se tornam constantes simbólicas, são enumerados na definição Exemplo C# enum days {mon, tue, wed, thu, fri, sat, sun}; Enumerações Exemplo Pascal type tipocor = {vermelho, azul, amarelo, verde}; var cor : tipo cor; cor := verde; if (cor > amarelo) Enumerações Avaliação Vantagens em termos de legibilidade Não é necessário codificar uma cor como um número Vantagens em termos de confiabilidade Operações (não permite adicionar cores) Nenhum variável de enumeração será assinalada para valores fora de sua faixa Subfaixa É uma subsequência de um ordinal Exemplo: 12..18 é uma subfaixa dos inteiros Projeto em Ada type Days is (mon, tue, wed, thu, fri, sat, sun); subtype Weekdays is Days range mon..fri; subtype Index is Integer range 1..100; Day1: Days; Day2: Weekday; Day2 := Day1; Subfaixa Avaliação Legibilidade Informam ao leitor que as variáveis podem armazenar apenas uma faixa de valores Confiabilidade A atribuição de um valor a uma variável fora de sua faixa pode ser detectado pelo compilador como sendo um erro Outros Tipos especiais Vetores (array com uma dimensão) Matrizes (array com n dimensões) Ponteiros Referências Registros (estruturas)