Unidade05

54
Tipos de Dados Prof. Iális Cavalcante Engenharia da Computação – UFC/Sobral

Transcript of Unidade05

Page 1: Unidade05

Tipos de DadosProf. Iális Cavalcante

Engenharia da Computação – UFC/Sobral

Page 2: Unidade05

0. TópicosIntrodução

Tipos de Dados Primitivos◦ Inteiro

◦ Ponto‐flutuante

◦ Decimal

◦ Booleano

◦ Caractere

◦ Tipos Cadeia de Caracteres

Tipos Definidos pelo Usuário◦ Tipos Matriz

◦ Matrizes Associativas

◦ Tipos Registro

◦ Tipos União

◦ Tipos Ponteiro

Page 3: Unidade05

1. IntroduçãoUm tipo de dado define uma coleção de dados e um conjunto de operações pré‐definidas sobre esses dadosUm descritor é um conjunto de atributos de uma variávelUm objeto representa uma instância de um tipo de dado abstrato definido pelo usuárioUma questão fundamental de projeto:◦ Quais operações são fornecidas para variáveis do tipo e como elas são especificadas?

Page 4: Unidade05

2. Tipos de Dados PrimitivosTipos de dados não‐definidos em termos de outros tipos são chamados tipos de dados primitivosPraticamente todas as linguagens de programação oferecem um conjunto de tipos de dados primitivosAlguns tipos de dados primitivos são reflexos do hardware◦ Por exemplo: os inteiros

Outros exigem um pequeno suporte de software para sua implementação

Page 5: Unidade05

2.1. Tipo Inteiro

Quase sempre um reflexo do hardware◦ Assim, seu mapeamento é trivial

Muitos computadores suportam diferentes tamanhos para inteirosEm Java, diferentes tamanhos para inteiros◦ byte, short, int, long

Page 6: Unidade05

2.2. Ponto-flutuante

Modelam os números reais, mas são aproximaçõesLinguagens para fins científicos suportam pelo menos dois tipos ponto‐flutuante (float e double)IEEE Floating‐Point Standard 754

Page 7: Unidade05

2.3. DecimalPara aplicações comerciais (moeda)◦ Essencial para COBOL◦ C# oferece um tipo de dado decimal

Armazena um número fixo de dígitos decimaisVantagem◦ PrecisãoDesvantagens◦ Faixa de valores restrita◦ Desperdício de memória

Page 8: Unidade05

2.4. Booleano

Mais simples de todosFaixa de valores◦ Dois elementos, um para “true” e um para “false”

Pode ser implementado como bits, mas geralmente são como bytes◦ Vantagem: legibilidade

Page 9: Unidade05

2.5. Caractere

Armazenados como codificações numéricasO código mais usado: ASCIIUma alternativa, codificação de 16‐bit:  Unicode◦ Inclui caracteres da maioria das linguagens naturais◦ Usado em Java◦ C# e JavaScript também suportam Unicode

Page 10: Unidade05

2.6. Cadeia de Caracteres

Valores consistem em seqüências de caracteresQuestõ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?

Page 11: Unidade05

2.6. Cadeia de Caracteres

Operações típicas:◦ Atribuição e cópia◦ Comparação (=, >, etc.)◦ Concatenação◦ Referências a subcadeias◦ Pattern matching

Page 12: Unidade05

2.6. Cadeia de CaracteresC e C++◦ Não primitivo

◦ Usam vetores char e uma biblioteca de funções que oferecem operações (string.h)

SNOBOL4 (uma linguagem de manipulação de cadeias)◦ Primitivo

◦ Muitas operações, incluindo pattern matching elaborados

Java◦ Primitivo através da classe String

Page 13: Unidade05

2.6. Cadeia de Caracteres

Opções de Tamanho da Cadeia◦ Estático

COBOL, FORTRAN 90, Pascal, Ada e Java classe String

◦ Tamanho dinâmico limitado: C e C++Um caractere especial é usado para indicar o final da cadeia,em vez de manter seu tamanho

◦ Dinâmico (sem máximo): SNOBOL4, Perl, JavaScript◦ Ada suporta todas as opções acima

Page 14: Unidade05

2.6. Cadeia 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 é caroPor que não usá‐las?

◦ Tamanho dinâmico é mais flexívelMas o custo compensa?

Page 15: Unidade05

2.6. Cadeia de CaracteresImplementação◦ Tamanho estático

descritor em tempo de compilação

◦ Tamanho dinâmico limitadoPodem 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âmicoExigem um descritor em tempo de execução

Exigem um gerenciamento de armazenagem mais complexoAlocação e desalocação

Page 16: Unidade05

3. Tipos 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 SubfaixaExemplos de tipos ordinários em Java◦ integer◦ char◦ boolean

Page 17: Unidade05

3.1. Tipos Enumeração

Todos os valores possíveis, os quais se tornam constantes simbólicas, são enumerados na definiçãoExemplo C#◦ enum dias {seg, ter, qua, qui, sex, sab, dom};

Page 18: Unidade05

3.1. Tipos Enumeração

Questões de projeto◦ Deve‐se permitir que um literal constante apareça em mais de uma definição de tipo e, se assim for, como o tipo de uma ocorrência desse literal é verificado no programa?◦ É possível fazer coerção de valores de enumeração para inteiros?

Page 19: Unidade05

3.1. Tipos Enumeração

Avaliação◦ Vantagens em termos de legibilidade

Não é necessário codificar uma cor como um número

◦ Vantagens em termos de confiabilidadeOperações (não permite adicionar cores)

Nenhum variável de enumeração será assinalada para valores fora de sua faixa

Page 20: Unidade05

3.2. Tipos 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;

Page 21: Unidade05

3.2. Tipos Subfaixa

Avaliação◦ Legibilidade

Informam ao leitor que as variáveis podem armazenar apenas uma faixa de valores

◦ ConfiabilidadeA atribuição de um valor a uma variável fora de sua faixa pode ser detectado pelo compilador como sendo um erro

Page 22: Unidade05

3.3. Tipos Matriz

Uma matriz é um agregado homogêneode dados cujo elemento individual é identificado por sua posição no agregado em relação ao primeiro.

Page 23: Unidade05

3.3. Tipos MatrizQuais tipos são legais para os subscritos?As expressões de subscrito nas referências a elementos são verificados quanto à faixa?Quando as faixas de subscrito são vinculadas?Quando a alocação da matriz se desenvolve?Quantos subscritos são permitidos?Matrizes podem ser inicializadas quando têm seu armazenamento alocado?Quais tipos de fatiamento são permitidos, se for o caso?

Page 24: Unidade05

3.3. Tipos Matriz

Índices (ou subscritos) fazemmapeamento para elementos◦ array_name(index_value_list) → element

Sintaxe do Índice◦ FORTRAN, PL/I e Ada usam parênteses

Ada usa parênteses para mostrar uma uniformidade entre matrizes e chamadas de funções, pois ambos são mapeamentos

◦ Outras linguagens usam colchetes

Page 25: Unidade05

3.3. Tipos MatrizTipos dos Índices◦ FORTRAN, C: apenas inteiros◦ Pascal: qualquer tipo ordinário

inteiro, Boolean, Char, enumeração

◦ Ada: inteiro ou enumeração (incluindo Boolean e Char)◦ Java: apenas inteiros◦ C, C++, Perl e Fortran não especificam faixa para checagem◦ Java, ML e C# especificam a checagem da faixa

Page 26: Unidade05

3.3. Tipos MatrizVinculações de Subscritos e Categorias de Matrizes◦ Matriz Estática

As faixas de subscrito estão estaticamente vinculadas e a alocação de armazenamento é estática (feita antes da execução)

Vantagem: eficiência

◦ Matriz Fixa Dinâmica na PilhaFaixas de subscrito são estaticamente vinculadas, mas a alocação é feita no momento da declaração durante a execução

Vantagem: eficiência de espaço

Page 27: Unidade05

3.3. Tipos MatrizVinculações de Subscritos e Categorias de Matrizes◦ Matriz Dinâmica na Pilha

Faixas de subscritos estão dinamicamente vinculadas e a alocação de armazenamento é dinâmica (feita durante a execução)

Vantagem: flexibilidade (o tamanho de uma matriz não precisa ser conhecido antes da sua utilização)

◦ Matriz Dinâmica no MonteA vinculação das faixas dos índices e a alocação são dinâmicas e podem mudar várias vezes

Vantagem: flexibilidade (matrizes podem crescer ou encolher durante a execução do programa)

Page 28: Unidade05

3.3. Tipos Matriz

Vinculações de Subscritos e Categorias de Matrizes◦ Matrizes C e C++ que incluem static são estáticas◦ Matrizes C e C++ sem static são fixas dinâmicas na pilha◦ Matrizes Ada podem ser dinâmicas na pilha◦ C e C++ também oferecem matrizes dinâmicas (malloc e free)◦ Perl e JavaScript suportam matrizes dinâmicas

Page 29: Unidade05

3.3. Tipos MatrizInicialização de Matrizes◦ Algumas linguagens permitem a inicialização no momento em que o armazenamento é alocadoExemplos: C, C++, Java e C#int list [] = {4, 5, 7, 83}

Cadeias de caracteres em C e C++char name [] = “freddie”;

Matrizes de strings em C e C++char *names [] = {“Bob”,“Jake”,“Joe”];

Java inicialização de objetos StringString[] names = {“Bob”, “Jake”, “Joe”};

Page 30: Unidade05

3.3. Tipos MatrizOperações com Matrizes◦ APL permite poderosas operações para matrizes, como também operadores unáriosExemplo: inverte os elementos das colunas

◦ Ada permite atribuição e concatenação de matrizes◦ FORTRAN oferece operações elementares pois são operações entre pares de elementos de matrizExemplo: operador + entre duas matrizes resulta em uma matriz que é a soma dos pares de elementos das duas matrizes

Page 31: Unidade05

3.3. Tipos Matriz

Fatias◦ Uma fatia (slice) de uma matriz é alguma subestrutura desta◦ Fatias são úteis em linguagens que possuem operadores sobre matrizes

Page 32: Unidade05

3.3. Tipos Matriz

Fatias: ExemplosFortran 95

Vector (3:6) é um vetor de 4 elementos

Integer, Dimension (10) :: VectorInteger, Dimension (3,3) :: MatInteger, Dimension (3,3,3) :: Cube

Page 33: Unidade05

3.3. Tipos Matriz

Fatias: Exemplos

Page 34: Unidade05

3.3. Tipos Matriz

Acessando Matrizes (multidimensionais)◦ Duas maneiras comumente usadas

Ordem da linha maior (por linhas)Usado na maioria das linguagens

Ordem da coluna maior (por colunas)Usando em Fortran

Page 35: Unidade05

3.3. Tipos Matriz

Acessando Matrizes (multidimensionais)◦ Exemplo de matriz

◦ Ordem da linha maior (por linhas)3,4,7,6,2,5,1,3,8

◦ Ordem da coluna maior3,6,1,4,2,3,7,5,8

3 4 76 2 51 3 8

Page 36: Unidade05

3.3. Tipos Matriz

Localizando um elemento em uma matriz multidimensional◦ location (a[i,j]) = address of a[row_lb,col_lb] + (((I - row_lb)*n)

+ (j - col_lb)) * element_size

Page 37: Unidade05

3.4. Matrizes Associativas

Uma matriz associativa é um conjunto não‐ordenado de elementos indexados por um número igual de valores chamados chaves◦ Chaves definidas pelos usuários devem ser armazenadas

Questões de projeto◦ Qual é a forma de referência dos elementos?◦ O tamanho de uma matriz associativa é estático ou dinâmico?

Page 38: Unidade05

3.4. Matrizes Associativas

Em Perl◦ Nomes começam com %; literais são

delimitados por parênteses%hi_temps = ("Mon"=>77, "Tue"=>79, “Wed”=>65, …);

◦ Os nomes de variáveis escalares iniciam-se com $

$hi_temps{"Wed"} = 83;Elementos podem ser removidos

delete $hi_temps{"Tue"};

Page 39: Unidade05

3.5. Tipos Registro

Um registro é um agregado possivelmente homogêneo de elementos de dadosCada elemento individual é identificado por seu nomeQuestões de projeto◦ Qual é a forma sintática das referências a campos?◦ São permitidas referências elípticas?

Page 40: Unidade05

3.5. Tipos Registro

Definições de Registro◦ COBOL usa números para aninhar registros;

outras linguagens usam definições recursivas

01 EMP-REGISTER.02 EMP-NAME.

05 FIRST PIC X(20).05 MID PIC X(10).05 LAST PIC X(20).

02 HOURLY-RATE PIC 99V99.

Page 41: Unidade05

3.5. Tipos Registro

Definição de Registros em Ada

type Emp_Rec_Type is recordFirst: String (1..20);Mid: String (1..10);Last: String (1..20)Last: 20);Hourly_Rate: Float;

end record;Emp_Rec: Emp_Rec_Type;

Page 42: Unidade05

3.5. Tipos RegistroReferências a Campos do Registro◦ A maioria das linguagens usam um ponto na notaçãoEmp_Rec.Name

◦ Referências elípticas (exemplo em Pascal)empregado.nome := ‘Bob’;

empregado.idade := 42;

empregado.salario := 23750;

with empregado do

begin

nome := ‘Bob’;

idade := 42;

salario := 23750.0;

end;

Page 43: Unidade05

3.5. Tipos Registro

Avaliação e comparação com matrizes◦ O projeto de registros é direto e, seu uso,

seguro◦ Registros são usados quando os dados

formam uma coleção heterogênea

Page 44: Unidade05

3.6. Tipos União

Uma união é um tipo que pode armazenar diferentes valores de tipo durante a execução do programaQuestões de projeto◦ A verificação de tipos deve ser exigida?

Note que qualquer verificação de tipos deve ser dinâmica.

Page 45: Unidade05

3.6. Tipos União

Discriminantes vs. Uniões Livres◦ Fortran, C e C++ oferecem construções de união que não suportam verificação de tipos na linguagemA união nessas linguagens são chamadas de uniões livres

◦ A verificação de tipos em uniões exige que cada construtor de união inclua um indicador de tipo, chamado discriminanteSuportado por Pascal e por Ada

Page 46: Unidade05

3.6. Tipos União

Em Ada

type Shape is (Circle, Triangle, Rectangle);type Colors is (Red, Green, Blue);type Figure (Form: Shape) is record

Filled: Boolean;Color: Colors;case Form is

when Circle => Diameter: Float;when Triangle =>

Leftside, Rightside: Integer;Angle: Float;

when Rectangle => Side1, Side2: Integer;end case;

end record;

Page 47: Unidade05

3.6. Tipos União

Estrutura de um registro variante

Uma união discriminada de três variáveis de forma

Page 48: Unidade05

3.6. Tipos União

Avaliação◦ Construções potencialmente inseguras

Não permitem verificação de tipos das referências a uniões

Um dos motivos pelos quais FORTRAN, Pascal, C e C++ não são fortemente tipificadas

◦ Java e C# não suportam uniõesReflexo da crescente motivação por linguagens de programação mais seguras

Page 49: Unidade05

3.7. Tipos Ponteiro

Um tipo ponteiro é aquele em que as variáveis têm uma faixa de valores que consistem em endereços de memória e um valor especial, nilOferece o poder de endereçamento indiretoOferece uma alternativa para gerenciar endereçamento dinamicamente

Page 50: Unidade05

3.7. Tipos Ponteiro

Questões de projeto de ponteiros◦ Quais são o escopo e o tempo de vida de

uma variável de ponteiro?◦ Qual é o tempo de vida de uma variável

dinâmica no monte?◦ Os ponteiros são restritos quanto ao tipo de

valor para o qual eles apontam?

Page 51: Unidade05

3.7. Tipos PonteiroOperações com Ponteiros◦ Duas operações fundamentais

Atribuição e desreferenciamento

◦ Atribuição é usada para fixar o valor de uma variável de ponteiro em um endereço útil◦ Desreferenciamento referencia o valor da célula de memória (não apenas o endereço)Dereferenciamento pode ser implícito ou explícito

C++ usa uma operação explícita *j = *ptr

j terá o valor alocado em ptr

Page 52: Unidade05

3.7. Tipos Ponteiro

A operação de atribuição j = *ptr

Page 53: Unidade05

3.7. Tipos PonteiroProblemas com Ponteiros◦ Ponteiros Pendurados (Dangling pointers)

Um ponteiro que contém o endereço de uma variável dinâmica no monte desalocada

◦ Variáveis dinâmicas no monte perdidasUma variável dinâmica no monte alocada não mais acessível ao programa usuário (geralmente chamada de lixo)Ponteiro p1 é ajustado para apontar para uma variável dinâmica no monte recém‐criada

Mais tarde, ponteiro p1 é ajustado para outra variável dinâmica no monte recém‐criada

Vazamento de memória

Page 54: Unidade05

4. ResumoOs tipos de dados de uma linguagem são uma grande parte daquilo que determina o seu estilo e seu uso

Os tipos de dados primitivos da maioria das linguagens imperativas incluem os tipos numérico, caractere e booleano

Os tipos enumeração e a subfaixa definidos pelo usuário são convenientes e aumentam a legibilidade e a confiabilidade dos programas

Matrizes e registros estão presentes na maioria das linguagens de programação

Ponteiros são usados para dar flexibilidade de endereçamento e para controlar o gerenciamento de armazenamento dinâmica