13
8/11/2009 1 Linguagens de Programação Conceitos e Técnicas Valores e Tipos de Dados Prof. Jairo Francisco de Souza Introdução Tipo de dados (TDs): conjunto de valores (de dados) e de operações pré-definidas sobre esses valores; Importância dos TDs nas LPs: Os conceitos do mundo real (universo de discurso ou espaço do problema) devem ser representados através de valores e operações da LP (espaço representacional); Quanto mais próxima estiver a LP do espaço do problema, melhor (menor o “gap conceitual”); Isso determina a aplicabilidade da LP aos diferentes domínios de aplicação. Linguagens de Programação 2 Introdução Evolução: As primeiras LPs tinham um conjunto muito reduzido de TDs; Fortran pré-90’s: matrizes (arrays) para implementar listas encadeadas e árvores binárias; COBOL: tipo estrutura para registros de informações e especificação da precisão de tipos decimais. PL/I: acrescentou muitos TDs (primitivos ou pré-definidos). Especificação para precisão de inteiros e reais. Algol 68: inovou com um conjunto reduzido de TDs básicos e operações de definição de estruturas de dados pelo programador. ADA 83: tipos de dados abstratos (definidos pelo usuário) Linguagens de Programação 3 Introdução TD`s definidos pelo usuário trazem muitas vantagens: Nomes significativos no espaço do problema (diminuição do “gap conceitual”); Aumenta o poder da verificação de tipo; Facilita a manutenção dos programas Cardinalidade Quantidade de valores possíveis para o TD Por exemplo: cardinalidade do tipo boolean é 2. Linguagens de Programação 4 Tipos Primitivos Não são definidos usando outro TD Não podem ser decompostos em valores mais simples Costumam ser definidos na implementação da LP Sofrem influência direta do hardware Podem ser usados para definir TD estruturados Categorias de TD primitivos: Numéricos Booleanos Caracter Linguagens de Programação 5 Tipo Inteiro Corresponde a um intervalo do conjunto dos números inteiros Sinalizados e não-sinalizados (p.ex: C++ e C#) Vários tipos inteiros numa mesma LP Normalmente, intervalos são definidos na implementação do compilador Em JAVA, o intervalo de cada tipo inteiro é estabelecido na definição da própria LP Linguagens de Programação 6

07 - Tipos de Dados

Embed Size (px)

DESCRIPTION

Capitulo 7

Citation preview

  • 8/11/2009

    1

    Linguagens de ProgramaoConceitos e Tcnicas

    Valores e Tipos de DadosProf. Jairo Francisco de Souza

    Introduo

    Tipo de dados (TDs): conjunto de valores (de dados)e de operaes pr-definidas sobre esses valores;

    Importncia dos TDs nas LPs:

    Os conceitos do mundo real (universo de discurso ouespao do problema) devem ser representados atravs devalores e operaes da LP (espao representacional);

    Quanto mais prxima estiver a LP do espao do problema,melhor (menor o gap conceitual);

    Isso determina a aplicabilidade da LP aos diferentesdomnios de aplicao.

    Linguagens de Programao 2

    Introduo

    Evoluo: As primeiras LPs tinham um conjunto muito reduzido de

    TDs;

    Fortran pr-90s: matrizes (arrays) para implementar listasencadeadas e rvores binrias;

    COBOL: tipo estrutura para registros de informaes eespecificao da preciso de tipos decimais.

    PL/I: acrescentou muitos TDs (primitivos ou pr-definidos).Especificao para preciso de inteiros e reais.

    Algol 68: inovou com um conjunto reduzido de TDs bsicose operaes de definio de estruturas de dados peloprogramador.

    ADA 83: tipos de dados abstratos (definidos pelo usurio)

    Linguagens de Programao 3

    Introduo

    TD`s definidos pelo usurio trazem muitasvantagens:

    Nomes significativos no espao do problema (diminuiodo gap conceitual);

    Aumenta o poder da verificao de tipo;

    Facilita a manuteno dos programas

    Cardinalidade

    Quantidade de valores possveis para o TD

    Por exemplo: cardinalidade do tipo boolean 2.

    Linguagens de Programao 4

    Tipos Primitivos

    No so definidos usando outro TD

    No podem ser decompostos em valores maissimples

    Costumam ser definidos na implementao da LP Sofrem influncia direta do hardware

    Podem ser usados para definir TD estruturados

    Categorias de TD primitivos: Numricos

    Booleanos

    Caracter

    Linguagens de Programao 5

    Tipo Inteiro

    Corresponde a um intervalo do conjunto dosnmeros inteiros

    Sinalizados e no-sinalizados (p.ex: C++ e C#)

    Vrios tipos inteiros numa mesma LP

    Normalmente, intervalos so definidos naimplementao do compilador

    Em JAVA, o intervalo de cada tipo inteiro estabelecido na definio da prpria LP

    Linguagens de Programao 6

  • 8/11/2009

    2

    Tipos Inteiros em JAVA

    Linguagens de Programao 7

    Tipo Tamanho(bits)

    Intervalo

    Incio Fim

    byte 8 -128 127

    short 16 -32768 32767

    int 32 -2.147.483.648 2.147.483.647

    long 64 -9223372036854775808 9223372036854775807

    Tipo Inteiro

    Representao de inteiros

    Sinal-magnitude

    1 bit para sinal e os demais para a magnitude (nmero)

    Em 8 bits, sobram 7 para a magnitude. Assim, possvel representar de -127 a +127

    Duas formas de representar o Zero: 00000000 (+0) e10000000 (-0)

    Exemplo: Nmero -5 = 1101

    Linguagens de Programao 8

    Tipo Inteiro Representao de inteiros

    Complemento a um O negativo de um nmero dado pelo seu complemento (sua

    negao bit a bit bitwise NOT)

    Em 8 bits, sobram 7 para a magnitude. Assim, possvelrepresentar de -127 a +127

    Duas formas de representar o Zero: 00000000 (+0) e11111111 (-0)

    Exemplo: Nmero -5 = (NOT) 1101 = 0010.

    Para somar dois nmeros, necessrio carregar 1:11111110 (-1) complemento a um

    + 00000010 (+2) complemento a um1 00000000 (0) resposta errada

    1 (+1) carregando 100000001 (1) resposta correta

    Linguagens de Programao 9

    Usado no algoritmo de verificao (checksum) do IPv4, ICMP, UDP, TCP.

    Tipo Inteiro Representao de inteiros

    Complemento a dois (mais comum) O negativo de um nmero dado pelo seu complemento (sua

    negao bit a bit bitwise NOT) somado de 1.

    Em 8 bits, sobram 7 para a magnitude. Assim, possvel representarde -128 a 127

    Zero: nica representao (00000000). No preciso carregar 1

    Exemplo: Nmero -5 = (NOT) 1101 + 1= 0010 + 1 = 0011.

    Mtodo prtico:

    Encontre o primeiro 1.

    Inverta o bit de todos os nmeros anteriores ao primeiro 1.

    Binrio 0101001 1010111 (complemento a 2)

    Binrio 0101100 1010100 (complemento a 2)

    Linguagens de Programao 10

    Tipo Ponto (ou vrgula) Flutuante

    Modela os nmeros reais em uma representao finita e utilizando o sistema de numerao binrio;

    Consequncia: conseguem representar somente aproximaes Nmero ou e: aproximao devido representao finita

    Nmero decima 0,1: aproximao devido utilizao do sistema binrio

    Problemas de compatibilidade com aplicaes financeiras.

    LPs normalmente incluem dois tipos de ponto flutuante: float e double

    Linguagens de Programao 11

    Tipo Ponto Flutuante

    A representao interna de um PF se divide em parte fracionria e expoente (como na notao cientfica);

    Caracterizao: preciso (nmeros de bits na parte fracionria) e faixa de valores representveis (frao e expoente)

    Linguagens de Programao 12

    expoente frao

    expoente frao

    Padro IEEE 754 - Preciso Simples

    bit de sinal 8 bits 23 bits

    bit de sinal 11 bits 52 bitsPadro IEEE 754 - Preciso Dupla

  • 8/11/2009

    3

    Tipo Decimal

    Armazena um nmero fixo de dgitos decimais COBOL possui Representao BCD (Binary coded decimal)

    No usa notao cientfica

    Ocupa mais espao de memria Pra armazenar o nmero 18 em BCD, ocupa-se 8 bits. Em binrio, somente 5.

    Operaes so realizadas por hw ou emuladas por sw

    Faixas restritas de valores (no so usados expoentes)

    Linguagens de Programao 13

    0010 0011 0011 0000 1000 0110 0111 10010000 0010 1000 0011

    2 bytes4 casas decimais

    4 bytes7 casas inteiras

    1 sinalsinal

    Tipo Caractere

    Armazenados como cdigos numricos Tabelas

    ASCII (American Standard Code for Information Interchange): 8 bits

    ISO 8859-1 (ADA 95): 8 bits. Extenso da ASCII. Caracteres acentuadose gregos

    UNICODE (Java, JavaScript, C#): 16 bits. Caracteres da maioria daslinguagens naturais, como do Japo, Srvia, Tailndia, Rssia, etc.

    PASCAL e MODULA 2 oferecem o tipo char

    Em C, o tipo primitivo char classificado como um tipo inteiro

    char d;

    char *p, *q;

    d = 'a' + 3;

    Linguagens de Programao 14

    Tipo Caractere

    Linguagens de Programao 15

    Tipo Caractere

    Linguagens de Programao 16

    Tipo String Valores correspondem a uma seqncia de caracteres

    No existe consenso sobre como devem ser tratadas Tipo primitivo em Fortran 95.

    Vetor de caracteres em C e C++

    Operaes em strings: concatenao, substring, padres

    Operao (nativas) de casamento de padres Fornecido por algumas linguagens como SNOBOL, PERL, JavaScript

    Linguagens de Programao 17

    Exemplo em SNOBOL4:ALPHA = ABCDEFGHIJKLMNOPQRSTUVWXUZREAD INSTR = INPUTINSTR C | (LEN(6) BREAK(ALPHA) (INTEGER |

    FUNCTION | SUBROUTINE)) :S(READ)Exemplo em Perl (expresses regulares):$String =~ /\d+\,?d*|\,0\d+/

    Tipo String Tamanho dos strings (da menor para a maior flexibilidade e do menor para

    o maior overhead de execuo): Fixo: strings de tamanho esttico (Java -classe String)

    Varivel at um limite mximo: strings de tamanho dinmico limitado (C, C++);

    Varivel sem limite mximo: strings de tamanho dinmico (SNOBOL,JavaScript,Perl);

    Em Ada 95: String -fixo; Bounded_String - varivel com limite mximo; Unbounded_String(varivel sem limite mximo)

    Avaliao: No justifica LPs atuais no terem um TD primitivo para cadeias de caracteres (ou pelo

    menos atravs de uma biblioteca-padro da LP);

    O custo de se ter cadeias de caracteres sem limite de tamanho alto; normalmente, estodisponveis apenas em LPs interpretadas

    Implementao: Na maioria dos casos: via software;

    Strings com tamanho varivel sem limite mximo: lista encadeada (no heap) ou blococontguo de memria.

    Linguagens de Programao 18

  • 8/11/2009

    4

    Tipo Booleano

    Tipo mais simples Possui apenas dois valores

    C no possui o tipo de dado booleano, masqualquer expresso numrica pode ser usada comocondicional

    Valores zero verdadeiroValores = zero falso

    Abordagem de C pode provocar errosif (c += 1) x = 10;

    JAVA inclui o tipo de dado boolean

    Linguagens de Programao 19

    Tipo Enumerado

    So TDs ordinais com todos os valores possveis elencadoscomo constantes nomeadas, na sua definio;

    Exemplo em C++:

    enum dias {Seg, Ter,Qua,Qui,Sex,Sab, Dom};dias meuDiaPref = Dom, seuDiaPref= Seg;

    As constantes nomeadas (enumeradas) so tipicamenteassociadas implicitamente aos inteiros 0, 1, ... (mas tambmpodem ser associadas a qualquer outro literal inteiro nadefinio);

    Linguagens de Programao 20

    Tipo Enumerado So TDs ordinais com todos os valores possveis elencados como

    constantes nomeadas, na sua definio;

    Exemplo em C++:

    enum dias {Seg,Ter,Qua,Qui,Sex,Sab,Dom};dias meuDiaPref = Dom, seuDiaPref= Seg;

    As constantes nomeadas (enumeradas) so tipicamente associadasimplicitamente aos inteiros 0, 1, ... (mas tambm podem serassociadas a qualquer outro literal inteiro na definio);

    Em LPs sem essa categoria de TD, os programadores podem simul-los com valores inteiros. Em Fortran 77:

    INTEGER VERMELHO, AZULDATA VERMELHO, AZUL/0, 1/

    Problema: nenhuma verificao de tipo especfica realizada (p.ex: ser possvel somar duas cores!)

    Linguagens de Programao 21

    Tipo Enumerado C e Pascal foram as duas primeiras LPs mais populares a incluir um

    TD enumerao; Em C++ (exemplo):

    enum cores {vermelho, azul, verde, amarelo, preto};cores minhaCor = azul; suaCor = vermelho;

    Usa internamente os valores inteiros 0, 1, ... para representar asconstantes enumeradas (default);

    O programador pode atribuir outro valor inteiro a cada constanteenumerada;

    Tem coero para o TD int (e portanto, as constantes enumeradas podemser utilizadas em qualquer expresso numrica):minhaCor++ vlido! (se minhaCor tiver valor azul, aps a execuodesta instruo, passar a ter valor verde)

    No tem coero de outro TD para um TD enumerado:

    minhaCor= 4; no vlido Uma constante enumerada s pode aparecer em uma nica definio de

    TD (no mesmo ambiente de referenciamento);

    Linguagens de Programao 22

    Tipo Enumerado Em Ada:

    Literais sobrecarregados (overloaded literals): constantes enumeradasque aparecem em mais de uma declarao de TD no mesmoambiente de referenciamento;

    O tipo do literal determinado pelo contexto de sua utilizao:

    aCor= verde; (verde considerado do tipo Cor)

    oSinal= verde; (verde considerado do tipo Sinal)

    No tem coero para o TD int

    Em Java 5.0 (2004): Todos os TDs enumerao so implicitamente subclasses da classe

    predefinida Enum.

    No tem coero para qualquer outro TD;

    Linguagens de Programao 23

    Tipo Enumerado Em C#:

    Como em C++, exceto que constantes ou variveis de TD enumeraonunca sofrem coero para o TD int;

    Avaliao: Os TDs enumerao trazem ganhos em legibilidade e confiabilidade;

    Legibilidade: nomes valores;

    Confiabilidade: Ada, C# e Java 5.0 > C++ > C

    Linguagens de Programao 24

  • 8/11/2009

    5

    Tipos Subfaixas

    uma subseqncia contgua de um TD ordinal; Introduzido pelo Pascal;

    Exemplo (Ada):typeDias is(Seg, Ter,Qua,Qui,Sex,Sab, Dom);subtypeDiasSemanaisDias rangeSeg..Sex;subtypeIndexisIntegerrange1..100; (uma das utilizaes

    mais comuns: ndices de arrays)...

    Dia1: Dias; Dia2:DiasSemana;Dia2 := Dia1; (vlido, a menos que o valor de Dia1 seja Sab ou

    Dom)Linguagens de Programao 25

    Tipos Subfaixas

    Avaliao:

    Os TDs subfaixa trazem ganhos em legibilidade e confiabilidade;

    Legibilidade: deixam claro que variveis esto restritas a certas faixas de valores;

    Confiabilidade: a atribuio de um valor fora da faixa detectada como erro;

    Linguagens de Programao 26

    Tipos Subfaixas Implementao dos TDs ordinais enumerao e

    subfaixa: TDs enumerao so usualmente implementados como

    inteiros (sem restries sobre o conjunto de valores e operaes, no h ganho de confiabilidade);

    TDs subfaixa so implementados exatamente como seus TDs-pai, exceto que a verificao de valor dentro da faixa deve ser implicitamente includa pelo compilador em cada atribuio de uma varivel ou expresso a uma varivel subfaixa.

    Isso custoso (gasto de memria e tempo de execuo), mas normalmente considera-se que compensa.

    Linguagens de Programao 27

    Tipos Compostos

    Tipos compostos so aqueles que podem sercriados a partir de tipos mais simples

    registros, vetores, listas, arquivos

    Entendidos em termos dos conceitos

    produto cartesiano, unies, mapeamentos, conjuntospotncia e tipos recursivos

    Cardinalidade

    nmero de valores distintos que fazem parte do tipo

    Linguagens de Programao 28

    Produto Cartesiano

    Combinao de valores de tipos diferentes em tuplas

    Linguagens de Programao 29

    x= a b c d e(b,c) (b,d) (b,e)

    (a,c) (a,d) (a,e)S T

    S x T

    Produto Cartesiano So produtos cartesiano os registros de PASCAL, MODULA 2,

    ADA e COBOL e as estruturas de C

    Registros so agregados possivelmente heterogneos identificados por nomestruct nome {

    char primeiro [20];

    char meio [10];

    char sobrenome [20];

    }

    struct empregado {

    struct nome nfunc;

    float salario;

    } emp;

    Linguagens de Programao 30

  • 8/11/2009

    6

    Produto Cartesiano

    Uso de seletoresemp.nfunc.meio

    Inicializao em Cstruct data { int d, m, a; };

    struct data d = { 7, 9, 1999 };

    Em LPs orientadas a objetos, produtos cartesianos sodefinidos a partir do conceito de classe JAVA s tem class

    Cardinalidade#(S1 x S2 x ... x Sn) = #S1x #S2x ...x #Sn

    Linguagens de Programao 31

    Produto Cartesiano

    Implementao Os campos dos registros so armazenados em

    posies adjacentes de memria;

    O endereamento dos campos feito a partirdo endereo de incio de registro acrescido deum offset;

    A figura ao lado mostra a forma geral dodescritor de um registro em tempo decompilao;

    Linguagens de Programao 32

    Unies

    Consiste na unio de valores de tipos distintos paraformar um novo tipo de dados

    Podem ser livres ou disjuntas

    Linguagens de Programao 33

    Unies

    Unies Livres

    Pode haver interseo entre o conjunto de valores dostipos que formam a unio

    Linguagens de Programao 34

    a b c b c d a b c d S T S + T

    Unies

    Unies Livres

    Pode haver interseo entre o conjunto de valores dostipos que formam a unio

    Disponveis no FORTRAN, C e C++ (union)

    H possibilidade de violao no sistema de tipos

    union medida {

    int centimetros;

    float metros;

    };

    Linguagens de Programao 35

    union medida medicao;float altura;medicao.centimetros=180;altura = medicao.metros;printf("\n altura : %f metros\n", f);

    Unies

    Unies Livres: implementao

    Reserva de espao de memria capaz de armazenar omaior espao necessrio

    Cardinalidade dependente das possveis interseesexistentes entre os conjuntos de valores dos componentes

    Linguagens de Programao 36

    101010010110100 101010010110100centmetros

    metros

  • 8/11/2009

    7

    Unies

    Unies Disjuntas no h interseo entre o conjunto de valores dos tipos que formam a

    unio

    registros variantes de PASCAL, MODULA 2 e ADA e a union de ALGOL68 , redefines do COBOLTYPE Representacao = (decimal, fracionaria);

    Numero = RECORD CASE Tag: Representacao OFdecimal: (val: REAL);fracionaria: (numerador, denominador: INTEGER);

    END;

    Valores possveis para Numero:(..., decimal(-0,33), ..., decimal(1.5), ... )

    U

    (..., fracionario(-1,3), ..., fracionario(4,6), ...)

    Linguagens de Programao 37

    Unies

    Unies Disjuntas Cardinalidade

    #(S1 + S2 + ... + Sn) = #S1 + #S2 ... + #Sn

    Linguagens de Programao 38

    + + +a b c

    & & & d e f

    + + + & & &a b c d e fS T S + T

    Unies

    Exemplo em Pascal

    Linguagens de Programao 39

    type forma = (circulo, triangulo, retangulo);cores = (vermelho, verde, azul);figura = record

    preenchido : Boolean;cor: cores;case aspecto : forma of

    circulo: (diamentro : real);triangulo: (lado_esquerdo : integer; lado_direito : integer; angulo : real);retangulo: (lado1 : integer; lado2 : integer)

    end;var minha_figura : figura;...

    case minha_figura.aspecto ofcirculo: writeln( um crculo; seu dimetro : , minha_figura.diametro);triangulo: writeln( um tringulo; seus lados so: , minha_figura.lado_esquerdo,

    minha_figura.lado_direito);

    Obs: repare o uso conjunto de produto cartesiano e unies no cdigo Pascal

    Unies

    Avaliao Unies so construes potencialmente inseguras em

    muitas LPs

    Elas constituem um dos motivos pelos quais Fortran,Pascal, C e C++ no so fortemente tipadas, pois nopermitem a verificao de tipo na referncia a unies;

    Proporcionam flexibilidade de programao

    LPs como Java e C# no tem o TD unio (reflexo dapreocupao crescente com a confiabilidade dalinguagem);

    Linguagens de Programao 40

    Mapeamentos

    Tipos de dados cujo conjunto de valores corresponde a todosos possveis mapeamentos de um tipo de dados S em outro T

    Cardinalidade: #(S T) = (#T)#S

    Linguagens de Programao 41

    u

    v

    a

    b

    c

    u

    v

    a

    b

    cS T S T

    Mapeamentos Finitos

    Linguagens de Programao 42

    O conjunto domnio finito

    Vetores e matrizesarray S OF T; (S T)

    A: array [1..50] of char; A: ([1,50] char)

    O conjunto ndice deve ser finito e discreto (inteiros)

    Verificao de ndices em C (falta de confiabilidade) e JAVA(perda de eficincia)

    int v[7];

    V[13] = 198;

    a z d r s f h w o1 2 3 4 5 47 48 49 50

  • 8/11/2009

    8

    Categorias de Vetores

    Linguagens de Programao 43

    Categoria de Vetor

    Tamanho Tempo de Definio

    Alocao Local de Alocao

    Exemplos

    Estticos Fixo Compilao Esttica Base FORTRAN 77

    Semi-Estticos

    Fixo Compilao Dinmica Pilha PASCAL, C, MODULA 2

    Semi-Dinmicos

    Fixo Execuo Dinmica Pilha ALGOL 68, ADA, C

    Dinmicos Varivel Execuo Dinmica Monte APL, PERL

    Categorias de Vetores

    Estticos (C)

    Vantagem: eficincia, pois no requerem alocao e desalocao dememria.

    Desvantagem: consomem mais memria do que o necessrio, vistoque vetores usados apenas em algumas regies do programa tm deficar alocados durante toda a execuo.

    void f () { static int x[10]; }

    Semi-Estticos (C)

    Vantagem: Mais econmicos pois s alocam memria no bloconecessrio do programa

    Desvantagem: Reduo da eficincia, pois preciso alocar e desalocarmemria.

    void f () { int x[10]; }

    Linguagens de Programao 44

    Categorias de Vetores

    Linguagens de Programao 45

    Semidinmicos

    Vantagem: aumenta a flexibilidade para o programador

    void f (int n) { int x[n]; }

    Dinmicos (APL)

    Vantagem: flexibilidade para o programador

    Desvantagem: reduo da eficincia e possvel reduo daconfiabilidade

    A (2 3 4)

    A (2 3 4 15)

    Vetores Semi-dinmicos

    Podem ser implementados em C, C++ e JAVA atravsdo monte

    Necessrio alocar nova memria e copiar contedoquando vetor aumenta de tamanho

    encargo do programador controlar alocao ecpia. Em C e C++, o programador deve controlardesalocao tambm. Isso torna a programao maiscomplexa e suscetvel a erros

    Linguagens de Programao 46

    Vetores Semi-dinmicos

    Exemplo em C:void f (int a) {

    int *p;p = (int *)

    malloc (a * sizeof(int));p[0] = 10;free(p)

    }

    Linguagens de Programao 47

    Exemplo em C++:void f (int a) {

    int *p;p = new int[a];p[0] = 10;delete[] p;

    }

    Exemplo em Java:void f (int a) {

    int p[];p = new int[a];p[0] = 10;

    }

    Vetores Multidimensionais

    Elementos so acessados atravs da aplicao defrmulas

    posio mat [i] [j] =

    endereo de mat [0][0] + i tamanho da linha + j tamanhodo elemento =

    endereo de mat [0][0] + (i nmero de colunas + j) tamanho do elemento

    Linguagens de Programao 48

  • 8/11/2009

    9

    Vetores Multidimensionais

    Na maioria das LPs, as matrizes so regulares

    Mesmo nmero de colunas em todas as linhas

    Em JAVA vetores multidimensionais so vetoresunidimensionais cujos elementos so outros vetoresint [] [] a = new int [5] [];

    for (int i = 0; i < a.length; i++) {

    a [i] = new int [i + 1];

    }

    O mesmo efeito pode ser obtido em C com o uso deponteiros para ponteiros

    Linguagens de Programao 49

    Vetores Multidimensionais

    Cardinalidade

    int mat [5][4];

    Conjunto de valores{0, , 4} x {0, , 3} int

    (#int) # ({0, , 4} x {0, .., 3}) =

    (#int)(# {0, , 4} x #{0, .., 3}) =

    (#int)5 x 4 =

    (#int)20

    Linguagens de Programao 50

    Vetores Multidimensionais Operaes

    Uma operao de array aquela que afeta o array como um todo;

    Exemplos em Ada:

    Atribuio (de um array a outro array);

    Concatenao (de dois vetores; de um escalar com um vetor);

    Comparao entre arrays;

    So o corao da linguagem APL (a LP mais poderosa paraprocessamento de matrizes). Por exemplo:

    A + B (se A e B forem matrizes, calcula a sua soma);

    V inverte os elementos de V;

    M inverte as linhas de M;

    M transpe a matriz M (as linhas se tornam colunas e vice-versa);

    Possui operadores especiais (formas funcionais). Por exemplo, o operadorproduto interno (.): A +. B (soma do produto interno de A e B).

    Linguagens de Programao 51

    Arrays associativos Um array associativo uma coleo desordenada de

    elementos de dados que so indexados por um nmero igualde valores denominados chaves;

    Cada elemento de um array associativo um par (chave,valor).

    Exemplo em Perl:%salarios = (Pedro => 7500, Jose => 2500, Maria => 3400);

    So denominados tambm de hashes porque naimplementao seus elementos so armazenados erecuperados com funes hash;

    Linguagens de Programao 52

    Mapeamentos Atravs de Funes

    Uma funo implementa um mapeamento ST atravs de um algoritmo

    O conjunto S no necessita ser finito

    O conjunto de valores do tipo mapeamento ST so todas as funes que mapeiam o conjunto S no conjunto T

    Valores do mapeamento [int boolean] em JAVAboolean positivo (int n) {

    return n > 0;

    }

    Outros valores do mapeamento: impar, par, primo

    Linguagens de Programao 53

    Mapeamentos Atravs de Funes C utiliza o conceito de ponteiros para manipular endereos de

    funes como valoresint impar (int n){ return n%2; }int negativo (int n) { return n < 0; }int multiplo7 (int n) { return !(n%7); }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 [10];

    printf ("%d\n", conta (vet, 10, impar));printf ("%d\n", conta (vet, 10, negativo));printf ("%d\n", conta (vet, 10, multiplo7));

    }

    Linguagens de Programao 54

  • 8/11/2009

    10

    Conjuntos Potncia

    Tipos de dados cujo conjunto de valorescorresponde a todos os possveis subconjuntos quepodem ser definidos a partir de um tipo base S

    S = {s | s S}

    Linguagens de Programao 55

    a b cS

    {} {a} {b} {c} {a, b} {a, c} {b, c} {a, b, c}

    S

    Conjuntos Potncia

    Cardinalidade#S = 2#S

    Operaes bsicasPertinnciaContmEst contidoUnioDiferenaDiferena simtricaInterseo

    Linguagens de Programao 56

    Conjuntos Potncia

    Poucas LPs oferecem. Muitas vezes de forma restrita PASCAL:

    TYPECarros = (corsa, palio, gol);ConjuntoCarros = SET OF Carros;

    VARCarro: Carros;CarrosPequenos: ConjuntoCarros;

    BEGINCarro:= 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*/

    Linguagens de Programao 57

    Conjuntos Potncia

    Em Pascal s permitido construir conjuntos de tiposdiscretos primitivos pequenos

    Conjuntos so implementados como cadeias de bits

    Restries de PASCAL visam permitir implementao eficiente

    VAR S: SET OF [ 'a .. 'h' ];

    BEGIN

    S := ['a', 'c', 'h'] + ['d'];

    END;

    Linguagens de Programao 58

    1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0ORS['a', 'c', 'h' ] [ 'd' ]

    =

    ['a', 'c','d', 'h' ]

    Conjuntos Potncia

    LPs que no possuem tipos conjunto necessitam criarabstraes de dados para os implementar. Programao mais trabalhosa e menos eficiente

    C: no possui tipos conjuntos, mas fornece operaes bit a bitque facilitam a implementao atravs de vetores

    Em LPs orientadas a objetos, comum a existncia de umaclasse Set Java e Smalltalk

    Contudo, nem todas as operaes de conjuntos costumam serdisponibilizadas

    Linguagens de Programao 59

    Tipos Recursivos

    Tipos recursivos so tipos de dados cujos valores socompostos por valores do mesmo tipo

    R ::= < parte inicial > R < parte final >

    Tipo Lista ::= Tipo Lista Vazia | (Tipo Elemento x Tipo Lista)

    A cardinalidade de um tipo recursivo infinita Isto verdade mesmo quando o tipo do elemento da lista finito

    O conjunto de valores do tipo listas infinitamente grande (nopodendo ser enumerado) embora toda lista individual seja finita

    Linguagens de Programao 60

  • 8/11/2009

    11

    Tipos Recursivos

    Tipos recursivos podem ser definidos a partir deponteiros ou diretamente

    Linguagens de Programao 61

    Em Cstruct no {

    int elem;struct no* prox;

    };

    Em C++class no {

    int elem;no* prox;

    };

    Em JAVAclass no {

    int elem;no prox;

    };

    Tipos Ponteiros

    No se restringe a implementao de tiposrecursivos embora seja seu uso principal

    Ponteiro um conceito de baixo nvel relacionadocom a arquitetura dos computadores

    O conjunto de valores de um tipo ponteiro so osendereos de memria e o valor nil

    Proporcionam flexibilidade ao programador

    PL/I: Primeira LP de alto nvel a incluir variveisponteiro

    Linguagens de Programao 62

    Tipos Ponteiros

    Linguagens de Programao 63

    #define nil 0typedef struct no* listaint;struct no {

    int cabeca;listaint cauda;

    };listaint anexa (int cb, listaint cd) {

    listaint l;l = (listaint) malloc (sizeof (struct no));l->cabeca = cb;l->cauda = cd;return l;

    }void imprime (listaint l) {

    printf("\nlista: ");while (l) {

    printf("%d ",l->cabeca);l = l->cauda;

    }}

    Tipos Ponteiros: Operaes Atribuio

    int *p, *q, r; // dois ponteiros para int e um int

    q = &r; // atribui endereco de r a q

    p = q; // atribui endereco armazenado em q a p

    Alocaoint* p = (int*) malloc (sizeof(int));

    Desalocaofree(p);

    Linguagens de Programao 64

    Tipos Ponteiros Derreferenciamento implcito (Fortran 90, ALGOL68)

    INTEGER, POINTER :: PTR

    PTR = 10

    PTR = PTR + 10

    Derreferenciamento explcito (C++, C, PASCAL)int *p;

    *p = 10;

    *p = *p + 10;

    Linguagens de Programao 65

    Exemplo de desreferenciamento explcito (em C++, utilizando o operador *): sendo ptr uma varivel ponteiro,

    j = *ptr (pela figura ao lado, podemos concluir que este comando far com que j receba o valor 206).

    Tipos Ponteiros Aritmtica (C)

    Se p aponta para uma rea de memria de 2 bits, ento p++ desloca 2bits adiante na memria

    p++;

    ++p;

    p = p + 1;

    p--;

    --p;

    p = p - 3;

    Indexao (C) Atalho para sinttico para a combinao da operao de adio em

    ponteiro com a operao de derreferenciamento

    x = p[3]; equivale a *(p + 3)

    Linguagens de Programao 66

  • 8/11/2009

    12

    Ponteiros Genricos

    Podem apontar para qualquer tipoint f, g;void* p;f = 10;p = &f;g = *p; // erro: ilegal derreferenciar ponteiro p/ void

    Servem para criao de funes genricas para gerenciarmemria

    Servem para criao de estruturas de dados heterogneas(aquelas cujos elementos so de tipos distintos)

    Linguagens de Programao 67

    Problemas Com Ponteiros

    O TD Ponteiro tende a reduzir a confiabilidade das LPs que oincluem

    Baixa Legibilidadep->cauda = q;

    Inspeo simples no permite determinar qual estrutura est sendoatualizada e qual o efeito

    Possibilitam violar o sistema de tiposint i, j = 10;

    int* p = &j; // p aponta para a varivel inteira j

    p++; // p pode no apontar mais para um inteiro

    i = *p + 5; // valor imprevisvel atribudo a i

    Linguagens de Programao 68

    Problemas Com Ponteiros Objetos Pendentes

    int* p = (int*) malloc (10*sizeof(int));

    int* q = (int*) malloc (5*sizeof(int));

    p = q; // rea apontada por p torna-se inacessvel

    Provoca vazamento de memria

    Referncias Pendentesint* p = (int*) malloc(10*sizeof(int));

    int* q = p;

    free(p); // q aponta agora para rea de memria desalocada

    int* p;

    *p = 0; p no foi alocado, ento aponta para uma rea desconhecida

    Linguagens de Programao 69

    Problemas Com Ponteiros

    Referncias Pendentesmain() {

    int *p, x;x = 10;

    if (x) {int i;p = &i;

    }// p continua apontando para i, que no existe mais

    }

    Linguagens de Programao 70

    Ponteiros - ADA

    Aliviou o problema de ponteiros pendurados: A varivel apontada implicitamente desalocada na

    sada do escopo do seu ponteiro;

    Com isso os programadores so induzidos a no fazerdesalocao explcita;

    No resolve completamente, pois os programadoresainda podem fazer desalocao explicita utilizandoUnchecked_Deallocation;

    No resolve o problema de variveis perdidas;

    Linguagens de Programao 71

    Ponteiros C e C++

    Manipulao de ponteiros muito flexvel (p. ex:aritmtica de ponteiros) e perigosa!

    Um ponteiro em C e C++ pode apontar paraqualquer posio de memria, e no apenas paravariveis do heap (como o caso de Ada);

    Ponteiros podem apontar para funes, o que utilizado para passar funes como parmetrospara outras funes;

    No oferece qualquer soluo para os problemasde ponteiros e objetos pendentes;

    Linguagens de Programao 72

  • 8/11/2009

    13

    Ponteiros Avaliao

    O efeito do uso livre de ponteiros nas LPs j foicomparado ao uso de gotos: O goto aumenta o conjunto das instrues que podem

    ser executadas aps ele;

    O ponteiro aumenta o conjunto de clulas de memriaque podem ser referenciadas por uma varivel;

    Hoare (1973), sobre ponteiros: Sua introduoem LPs de alto-nvel tem sido um passo para trs,do qual talvez jamais possamos nos recuperar;

    Linguagens de Programao 73

    Tipo Referncia em C++

    um ponteiro constante, sempre implicitamentederreferenciado

    inicializado com o endereo de alguma varivel nasua declarao

    O derreferenciamento implcito impede a atribuioao endereo da varivel referncia;

    int res = 0;

    int& ref = res; // ref passa a referenciar res

    ref = 100; // res passa a valer 100

    Linguagens de Programao 74

    Tipo Referncia em Java Estende o conceito de varivel-referncia do C++,

    possibilitando assim a substituio completa de ponteiros;

    Objetivo: aumentar a confiabilidade da linguagem;

    Diferena fundamental: enquanto que C++ referenciaendereos de memria, Java referencia instncias de classes(objetos);

    Caractersticas: No faz sentido a aritmtica de variveis-referncia;

    possvel atribuir um novo valor (endereo de uma nova instncia daclasse) a uma varivel-referncia;

    Todas as instncias de classes em Java so referenciadas atravs devariveis-referncia (alis, isso a nica forma de uso desse tipo devarivel);

    Linguagens de Programao 75

    Tipo Referncia em Java

    Exemplo:

    String str1; (str1 uma varivel-referncia, j que String uma classe Java; inicializada com null)...

    str1 = Este um string Java; (str1 aponta p/ oobjeto da classe String)

    Todas as variveis de tipos no primitivos em Javaso variveis-referncia.

    Linguagens de Programao 76

    Tipo Referncia em Java e C# Java resolveu o problema de referncias denpentes, j que

    toda desalocao implcita;

    O problema de variveis perdidas (lixo) resolvido, em parte,pelo coletor de lixo;

    Em C#: Inclui ambas as formas de variveis-referncia: de C++ e de Java;

    Desencoraja vigorosamente o uso de variveis-referncia a la C++(todo mtodo que as utiliza deve ser declarado com o modificadorunsafe);

    Essas variveis-referncia foram includas em C# para permitir queprogramas feitos na linguagem possam interoperar com cdigo C eC++;

    Linguagens de Programao 77

    Hierarquia de Tipos

    Linguagens de Programao 78

    Tipos

    Primitivos Compostos

    Booleanos

    Inteiros

    Caracteres

    Decimais

    Ponto Flutuantes

    Enumerados

    Intervalos

    Unies

    StringsRecursivos

    Mapeamentos

    Conjuntos Potncia

    Produtos Cartesianos

    Ponteiros

    Livres Disjuntas

    Finitos Funes