A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Linguagens de Programação Conceitos e Técnicas

Apresentações semelhantes


Apresentação em tema: "Linguagens de Programação Conceitos e Técnicas"— Transcrição da apresentação:

1 Linguagens de Programação Conceitos e Técnicas
Valores e Tipos de Dados Prof. Isabel Cafezeiro

2 Linguagens de Programação Valores & tipos de dados
Valor composto: formado a partir de valores mais simples Tipo composto: formado a partir de tipos mais simples

3 Linguagens de Programação Valores & tipos de dados
Tipo composto: seus valores são compostos Produtos Cartesianos Uniões Mapeamentos Tipos Recursivos ...

4 Linguagens de Programação Valores & tipos de dados
Tipo composto: seus valores são compostos Produtos Cartesianos Uniões Mapeamentos Potência Tipos Recursivos Ponteiros ... mas de que maneira estas construções matemáticas se manifestam nas linguagens???....

5 Linguagens de Programação Valores & tipos de dados
Produto Cartesiano Um valor do produto possui um componente de cada um dos tipos originais (S e T)‏ x= a b c d e (b,c) (b,d) (b,e)‏ (a,c) (a,d) (a,e)‏ S T S x T S × T = {(x, y) | x ∈ S e y ∈ T}

6 Linguagens de Programação Valores & tipos de dados
Produto Cartesiano Registros de PASCAL, MODULA 2, ADA e COBOL Estruturas de C, Classes de Linguagens OO

7 Linguagens de Programação Valores & tipos de dados
Produto Cartesiano Em PASCAL: type S = (a,b); T = (c,d,e); P = record prim: S; seg: T; end; var prod: P; Primeiro componente do produto: prod.prim Segundo componente do produto: prod.seg Exemplo de uso: prod.prim := a; prod.seg := c; Componentes nomeados: o programador não precisa lembrar a ordem! ... precisa lembrar o nome !!! Quantos valores distintos prod pode assumir?

8 Linguagens de Programação Valores & tipos de dados
Produto Cartesiano S × T = {(x, y) | x ∈ S; y ∈ T} Operações: Construção de um par a partir de dois valores Seleção de um componente do par Implementação: posições adjacentes de memória acesso pelo par (base, deslocamento)‏ A qualquer momento todos os componentes do valor residem na memória

9 Linguagens de Programação Valores & tipos de dados
Produto Cartesiano S × T = {(x, y) | x ∈ S; y ∈ T} Cardinalidade: #(S1 x S2 x ... x Sn) = #S1x #S2x ...x #Sn #(S x S x ... x S) = #Sn ... e se n = 0 ???.... n vezes o tipo S #S0 = 1 ! Void em C, C++, Java null em ADA

10 Linguagens de Programação Valores & tipos de dados
Uniões: apenas um valor é escolhido dentre os vários conjuntos União livre: o valor pode pertencer a mais de um conjunto União disjunta: o valor pertence a um único conjunto

11 Linguagens de Programação Valores & tipos de dados
União livre: Um valor da União é um valor de um dos tipos originais (S ou T)‏ a b c b c d a b c d S T S + T S + T = { x | x ∈ S ou x ∈ T }

12 Linguagens de Programação Valores & tipos de dados
União livre: Um valor da União é um valor de um dos tipos originais (S ou T)‏ a b c b c d a b c d S T S + T S + T = { x | x ∈ S ou x ∈ T } Admite interseção entre os tipos componentes

13 Linguagens de Programação Valores & tipos de dados
União livre: Em C: union Livre { int S; char T; }; char  int = char

14 Linguagens de Programação Valores & tipos de dados
União livre: Em C: union Livre { int a; float b; } m; int main (void) { m.a = 1; m.b = 1.1; printf("%f \n %d",m.a,m.b); } Erro! Só existe um componente a cada momento!

15 Linguagens de Programação Valores & tipos de dados
União livre S + T = { x | x ∈ S ou x ∈ T } Cardinalidade: #(S + T) = #S + #T - #( S  T ) Operações: Consulta e alteração de elementos Implementação: espaço para alocar o maior componente‏ Há possibilidade de violação do sistema de tipos

16 Linguagens de Programação Valores & tipos de dados
União disjunta: Um valor da União pertence apenas a um dos dos tipos originais (S ou T)‏ a b c b c d S.a S.b S.c T.b T.c T.d S T S + T S  T = { S.x | x ∈ S}  { T.x | x ∈ T }

17 Linguagens de Programação Valores & tipos de dados
União disjunta: Um valor da União pertence apenas a um dos dos tipos originais (S ou T)‏ S  T = { S.x | x ∈ S}  { T.x | x ∈ T } Tag Variante O Tag (rótulo) impede a interseção !!

18 Linguagens de Programação Valores & tipos de dados
União Disjunta: Em Haskell: tipo algébrico Em ADA: registros discriminados Em Pascal: registro variante

19 Linguagens de Programação Valores & tipos de dados
União Disjunta: Em Pascal: TYPE Representacao = (decimal, fracionaria); Numero = RECORD CASE Tag: Representacao OF decimal: (val: REAL); fracionaria: (numerador, denominador: INTEGER); END; var n: Numero; begin n.tag := fracionaria; n.numerador := 5; n.denominador := 10; n.val := 1.2; n.tag := decimal; end. Erro: parte decimal não existe! Perigo: pode destruir valores da parte fracionária!

20 Linguagens de Programação Valores & tipos de dados
União disjunta S  T = { S.x | x ∈ S}  { T.x | x ∈ T } Cardinalidade: #(S + T) = #S + #T Operações: Consulta e alteração de valores e seletor Implementação: espaço para alocar o tag e maior componente‏ Há possibilidade de violação do sistema de tipos

21 Linguagens de Programação Valores & tipos de dados
Mapeamentos: Valores são todas as possíveis maneiras de mapear um conjunto em outro Mapeamento finito: o conjunto domínio é finito Mapeamento através de funções: o conjunto domínio pode não ser finito

22 Linguagens de Programação Valores & tipos de dados
Mapeamentos S → T = { m | se x ∈ S então m(x) ∈ T } u v a b c S T Todas as possíveis maneiras de mapear S em T

23 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: O tipo domínio é finito e discreto Exemplos: arrays M: (S  T) Em Pascal: type M = array S of T; type A = array [1..50] of char; A: ([1,50]  char) a z d r s … f h w o

24 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: Operações: consulta e alteração de componentes, de todo mapeamento, de parte do mapeamento Pode-se escolher o elemento indexado em tempo de execução.

25 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Cardinalidade: Implementação: Cálculo do deslocamento em tempo de execução !!! #(S → T ) = #T #S Alocação contígua na memória Par base, deslocamento

26 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Implementação: Verificação de Índices é dinâmica: PASCAL e JAVA eficiência segurança ausente: C,C++,FORTRAN

27 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Categoria de Vetor Tamanho Tempo de Definição Alocação Local de Alocação Exemplos Estáticos Fixo Compilação Estática Base FORTRAN 77 Semi-Estáticos Dinâmica Pilha PASCAL, C, MODULA 2 Semi-Dinâmicos Execução ALGOL 68, ADA, C Dinâmicos Variável Heap APL, PERL

28 Linguagens de Programação Valores & tipos de dados
Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Estáticos (C) void f () { static int x[10]; } Semidinâmicos (Padrão ISO ) void f (int n) { int x[n]; } Semi-Estáticos (C) void f () { int x[10]; } Dinâmicos (APL) A  ( ) A  ( )

29 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Os valores são definidos pelos algoritmos Exemplos: Em Java: [int  boolean] boolean positivo (int n) { return n > 0; } Este é um valor do mapeamento !!!

30 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Os valores são definidos pelos algoritmos O conjunto S não necessita ser finito S → T = { m | se x ∈ S então m(x) ∈ T }

31 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Os valores são definidos pelos algoritmos Exemplos: Em Java: [int  boolean] palindromo, impar, par, primo Outros valores para o mapeamento [int → boolean]

32 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Funções como Valores de Primeira Classe Podem ser manipuladas como qualquer outro tipo: criar variáveis criar estrutura de dados atribuir valores passar como parâmetro retornar em função

33 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Funções como Valores de Primeira Classe > (conta negativo? '(-1 2 3) 0) 1 > (conta negativo? '() 0) > (conta negativo? '( ) 0) 3 Em Lisp: (define negativo? (lambda (n) (< n 0))) (define conta (lambda (p l c) (cond ((null? l) c ) ((p (car l)) (conta p (cdr l) (+ c 1))) (else (conta p (cdr l) c)))))

34 Linguagens de Programação Valores & tipos de dados
Mapeamentos através de funções: Em C: int negativo (int n) { return n < 0; } int conta (int x[], int n, int (*p) (int) ) { int j, s = 0; for (j = 0; j < n; j++) if ( (*p) (x[j]) ) s++; return s; } main() { int vet[5]; printf ("%d\n",conta(vet,5,negativo)); }

35 Linguagens de Programação Valores & tipos de dados No free Pascal !!!
Em Pascal: type TFuncao = function (x: integer): boolean; Tarray = array [1..5] of integer; function negativo(x: integer): boolean; ... var v: Tarray; begin v[1] := 1; ..., v[5] := -1; end. function Conta(vet:Tarray; n:integer; f:TFuncao): integer; var i,soma:integer; begin soma := 0; for i:=1 to n do if f(vet[i]) then soma := soma+1; Conta := soma; end; No free Pascal !!!

36 Linguagens de Programação Valores & tipos de dados
Potência: Valores são todos os subconjuntos de um dado conjunto a b c S {} {a} {b} {c} {a, b} {a, c} {b, c} {a, b, c} S S = {s | s  S}

37 Linguagens de Programação Valores & tipos de dados
Potência: Em Pascal: TYPE Carros = (corsa, palio, gol); ConjuntoCarros = SET OF Carros; VAR Carro: Carros; CarrosPequenos: ConjuntoCarros; BEGIN Carro:= corsa; CarrosPequenos := [palio, gol]; /*atribuicao*/ CarrosPequenos:= CarrosPequenos + [corsa]; /*uniao*/ CarrosPequenos:= CarrosPequenos * [gol]; /*intersecao*/ if Carro in CarrosPequenos THEN /*pertinencia*/ if CarrosPequenos >= [gol, corsa] THEN /*contem*/

38 Linguagens de Programação Valores & tipos de dados
Potência: S = {s | s  S} Cardinalidade: Operações: #(S ) = 2 #S Pertinência Contém Está contido União Diferença Interseção Atribuição Igualdade Desigualdade

39 Linguagens de Programação Valores & tipos de dados
Tipos Recursivos Valores são compostos por valores do mesmo tipo São definidos por uma equação recursiva Exemplo: Listas Tipo Lista  Tipo Lista Vazia + (Tipo Elemento x Tipo Lista) L = null + (T X L)

40 Linguagens de Programação Valores & tipos de dados
Tipos Recursivos Quais são os valores do tipo lista? L = null + (T X L) Seja t  T, null (t,null) (t,(t,null)) (t,(t,(t,null))) ... Qual é o resultado da equação recursiva? Cardinalidade infinita !!!!

41 Linguagens de Programação Valores & tipos de dados
Tipos Recursivos: Linguagens deveriam suportar a definição recursiva.... ... mas normalmente são definidos em termos de ponteiros Em C: struct no { int elem; struct no* prox; }; Em C++: class no { int elem; no* prox; }; Em Java: class no { int elem; no prox; };

42 Linguagens de Programação Valores & tipos de dados
Tipos Recursivos: Implementação: através de ponteiros Em C: struct no { int elem; struct no* prox; }; nil 1 10 100

43 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Valores são endereços de memória e o valor nil São valores de primeira classe !!!

44 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Valores são endereços de memória e o valor nil Conceito de baixo nível relacionado com a arquitetura dos computadores (endereçamento indireto do assembly) Considerados o “goto” das estruturas de dados Porque Ponteiros? Eficiência: evita alocação/desalocação automática

45 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Operações: Atribuição: um ponteiro recebe o endereço apontado por outro Alocação: um ponteiro é associado a uma área de memória Desalocação: a área de memória associada ao ponteiro é liberada Referenciamento: dada uma variável, retorna seu endereço Derreferenciamento: dado o endereço, retorna seu conteúdo

46 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Operações: Atribuição: um ponteiro recebe o endereço apontado por outro Alocação: Desalocação: Referenciamento: Derreferenciamento: p aponta pra onde q aponta ! Em C: int *p, *q; ... p = q;

47 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Operações: Atribuição: Alocação: um ponteiro é associado a uma área de memória Desalocação: Referenciamento: Derreferenciamento: Em C: int* p = (int*) malloc (10*sizeof(int));

48 Linguagens de Programação Valores & tipos de dados
Em C: main() { int *p, x; x = 10; if (x) { int i; p = &i; } Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: a área de memória associada ao ponteiro é liberada Referenciamento: Derreferenciamento: Em C: free(p); Desalocação explícita ! Desalocação implícita !

49 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: Referenciamento: dada uma variável, retorna seu endereço Derreferenciamento: Referenciamento explícito ! Em C: int *p; ... p = &x; a = a+1; Referenciamento implícito !

50 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: Referenciamento: Derreferenciamento: dado um endereço, retorna seu conteúdo Em C: int *p; ... *p = 12; Derreferenciamento explícito !

51 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Problemas com ponteiros: Baixa Legibilidade: Que estrutura está sendo atualizada? Qual o efeito deste comando? Em C: p->cauda = q; Alterar um ponteiro afeta a estrutura da variável (não somente o seu conteúdo !!!)

52 Linguagens de Programação Valores & tipos de dados p aponta para quê?
Tipos Ponteiros Problemas com ponteiros: Violação do sistema de tipos: Em C: int i, j = 10; int* p = &j; p++; p aponta para quê?

53 Linguagens de Programação Valores & tipos de dados
Tipos Ponteiros Problemas com ponteiros: Objetos Pendentes: Em C: int* p = (int*) malloc (10*sizeof(int)); int* q = (int*) malloc (5*sizeof(int)); p = q; Como acessar a área antes apontada por p?

54 Linguagens de Programação Valores & tipos de dados q aponta pra onde ?
Tipos Ponteiros Problemas com ponteiros: Referências Pendentes: Em C: int* p = (int*) malloc(10*sizeof(int)); int* q = p; free(p); q aponta pra onde ?

55 Linguagens de Programação Valores & tipos de dados p aponta pra onde ?
Tipos Ponteiros Problemas com ponteiros: Referências Pendentes: Em C: main() { int *p, x; x = 10; if (x) { int i; p = &i; } p aponta pra onde ?

56 Linguagens de Programação Valores & tipos de dados
Tipos Referência Valores são endereços das células de memória Em Java: Todas as variáveis que não são de tipos primitivos em JAVA são do tipo referência

57 Linguagens de Programação Valores & tipos de dados
Tipos Referência Reference Semantics: Em Java: class Data { int d, m, a; public Data (int d, int m, int a) { } } 25 12 2005 1 1 2000 dataR dataS Data dataR = new Data(25,12,2005); Data dataS = new Data(1,1,2000);

58 Linguagens de Programação Valores & tipos de dados
Tipos Referência Reference Semantics: comparação do endereço, e não do valor!!! Data dataR = new Data(25,12,2005); Data dataS = new Data(25,12,2005); 25 12 2005 25 12 2005 dataR = dataS ? dataR Não !!! dataS


Carregar ppt "Linguagens de Programação Conceitos e Técnicas"

Apresentações semelhantes


Anúncios Google