Vous êtes sur la page 1sur 45

Linguagens de Programao

Captulo V Tipos de Dados


Baseado em Conceitos de Linguagens de Programao 4 Edio Robert W. Sebesta Bookman

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 1

Tpicos
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Evoluo dos tipos de dados Tipos de Dados Primitivos Tipo String de caracteres Tipo Ordinal definido pelo programador Tipo Array Tipo Array Associativo Tipo Registo Tipo Unio Tipo Conjunto Tipo Apontador
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 2

1. Evoluo dos tipos de dados

Evoluo de Tipos de Dados:


FORTRAN I (1956) - INTEGER, REAL, arrays Ada (1983) - Utilizadores podem criar novos tipos de dados.

Um descritor um conjunto de atributos de uma varivel (Nome, Endereo, Valor, Tipo, Tempo de vida, Escopo). Questes de Projecto para tipos de dados:

Como especificar variveis? Quais as operaes que esto definidas sobre determinada varivel?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 3

2. Tipos de Dados Primitivos

Tipos Primitivos de Dados so todos os tipos que no so definidos em termos de outros tipos. Inteiro (integer)

Em geral reflete a situao do hardware (registros) Existem vrios tipos de nmeros inteiros numa linguagem:
inteiro com/sem sinal, inteiro base decimal, inteiro base binria, preciso simples, etc.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 4

Tipos Primitivos

Ponto Flutuante

Ponto Flutuante (Floating Point)


Aproximao ao conjunto dos nmeros reais Linguagens cientficas suportam pelo menos dois tipos de pf: preciso simples e estendida Relao prxima com o hardware. Algumas linguagens permitem expressar preciso, como por exemplo em Ada:

type SPEED is digits 7 range 0.0..1000.0; type VOLTAGE is delta 0.1 range -12.0..24.0;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 5

Tipos Primitivos

Ponto Flutuante

Formatos de Representao de Pontos Flutuantes:


(a) Preciso Simples, (b) Preciso Estendida

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 6

Tipos Primitivos

Decimal

Decimal (Base 10)


Para aplicaes comerciais Armazena um nmero determinado de dgitos decimais (codificado na base binria) Vantagem:

Preciso. Amplitude limitada (range), grande gasto de memria.


Engenharia Informtica Linguagens de Programao 2002/2003

Desvantagens:

Pg. 7

Tipos Primitivos

Lgico

Lgico (Boolean)

S permite dois valores: Verdadeiro ou Falso (true or false); Pode ser implementado num bit, mas geralmente implementado num byte. Vantagem:

Legibilidade.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 8

3. Tipo String de caracteres

String

Valores so sequncias de caracteres Consideraes de Projecto:


Tipo primitivo ou tipo especial de sequncia? Dimenso esttica ou dinmica? Atribuio; Comparao (=, >, <, etc.); Concatenao (juno ao fim da string); Referncia a substring; Correspondncia de padro (Pattern matching).
Engenharia Informtica Linguagens de Programao 2002/2003

Operaes:

Pg. 9

Tipo String de caracteres

(cont.)

Exemplo do Pascal:

tipo no primitivo; operao de atribuio e comparao somente (em packed arrays).

Exemplo do Ada, FORTRAN 77, FORTRAN 90 and BASIC


Mais ou menos primitivo; Atribuio, comparao, concatenao, referncia a substring; FORTRAN possui correspondncia de padro intrnseco.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 10

Tipo String de caracteres

(cont.)

Exemplo em Ada:
N := N1 & N2 (concatenao) N(2..4) (referncia a substring)

Exemplo do C, C++:

No primitivo; Usa char arrays e biblioteca de funes para as operaes.


(Ling. para tratamento de string)

Exemplo do SNOBOL4

Primitivo; Muitas operaes, incluindo um elaborado mtodo para correspondncia de padro (Pattern matching).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 11

Tipo String de caracteres

(cont.)

Exemplo em Perl:
Padres so definidos em termos de expresses regulares; Grande poder de expresso!; Ex. de expresso regular: /[A-Za-z]+/ Palavras contendo unicamente letras.

Exemplo do Java:

String class (no arrays de char).


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 12

Tipo String de caracteres

(cont.)

Opes na definio do tamanho da String: Esttico - FORTRAN 77, Ada, COBOL


Ex. FORTRAN 90: CHARACTER (LEN = 15) NAME;

Dinmico Limitado C e C++:


Tamanho real indicado por um carcter nulo Ex. C++: char * buffer; buffer = new char[512];

Dinmico SNOBOL4, Perl


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 13

Tipo String de caracteres

(cont.)

Avaliao:
Ajuda a escritabilidade do programa O tipo primitivo de tamanho esttico eficiente. Porque no o ter? Tamanho dinmico bom, mas muito caro. Ser que no vale a pena implementa-lo?

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 14

Tipo String de caracteres

(cont.)

Implementao:
Tamanho esttico - Descritor definido e utilizado em tempo de compilao. Tamanho dinmico limitado - pode necessitar de um descritor em tempo de execuo para o tamanho (no acontece em C e C++). Dinmico - precisa de um descritor em tempo de execuo; Reserva/liberao de memria o grande problema da implementao.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 15

4. Tipo Ordinal

Tipo Ordinal

Um tipo ordinal um tipo em que a amplitude de dos possveis valores podem facilmente ser associados com os inteiros positivos; Em muitas linguagens os programadores podem definir os seguinte tipos ordinais: Tipo Enumerado; Tipo Subfaixa.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 16

Tipo Ordinal

Enumerado

Tipos enumerados - tipo onde o programador enumera todos os possveis valores atravs de constantes simblicas.

Exemplo em Pascal:
type cor = (vermelho, azul, branco, preto);

Exemplo em C e C++:
enum cor {vermelho, azul, branco, preto};

Consideraes de Projecto:

Pode uma constante simblica pertencer a mais de uma definio de tipo?


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 17

Tipo Ordinal

Enumerado

(cont.)

Exemplos do Pascal:
Constantes no podem ser reutilizadas. Podem ser usadas em subscritos de arrays, como varivel de ciclo for e seleco case, podem ser comparadas mas no podem ser usadas em E/S. Ex.:
type tipocor = (Vermelho, Azul, Verde, Amarelo); Var cor : tipocor; ... cor := Azul; if (cor > Vermelho)then ...
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 18

Tipo Ordinal

Enumerado

(cont.)

Exemplo em C and C++ :


Como em Pascal, excepto que podem participar de E/S como inteiro. Ex.: enum tipocor Tipo enumerado {Vermelho, Azul, Branco, Preto} casaco, camisola; Variveis casaco = Azul;

Exemplo do Java

No possui tipo enumerado


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 19

Tipo Ordinal

Enumerado

(cont.)

Avaliao:

Melhora a legibilidade, uma vez que, no necessrio modelar cor como um nmero inteiro; Melhora a confiabilidade, dado que o compilador pode verificar a validade das operaes e amplitude dos valores em tempo de compilao.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 20

10

Tipo Ordinal

Subfaixa

Tipo Subfaixa (Subrange) - Subsequncia ordenada de um tipo enumerado ordinal.

O tipo subfaixa foi introduzido pelo Pascal, e posteriormente, foram includos tambm em Ada e Modula-2. Ex.: os nmeros 12..14 so uma subfaixa dos ns inteiros. Como os valores podem ser usados?
Engenharia Informtica Linguagens de Programao 2002/2003

Deciso de Projecto:

Pg. 21

Tipo Ordinal

Subfaixa (cont.)

Exemplo em Pascal :

Subfaixa comporta-se como o seu tipo pai. Podem ser usados em arrays, comparao, ciclos, etc.. ex. type positivo = 0 .. MAXINT; type maiusculas = 'A'..'Z'

Exemplo em Ada:
Subfaixa um subconjunto do tipo pai (no um tipo novo), logo so compatveis. Podem ser usados como em Pascal. Ex.: subtype positivo is INTEGER range 0..INTEGER'LAST;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 22

11

Tipo Ordinal

(cont.)

Avaliao de tipos enumerados:


Melhor legibilidade; Melhor confiabilidade - deteco de erros e das amplitudes dos valores. Tipos enumerados geralmente so implementados associando nmeros inteiros a cada constante. Subfaixas so implementados da mesma forma que os tipos pais. O cdigo para restringir atribuies a variveis de subfaixas deve ser inserido pelo compilador.
Engenharia Informtica Linguagens de Programao 2002/2003

Implementao:

Pg. 23

5. Tipos Array

homognea, em que cada elemento uma varivel e pode ser acedido por sua posio relativa, a partir da origem (primeiro elemento).

Array - uma sequncia de dados

uma estrutura de dados fundamental e existente em todas as linguagens.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 24

12

5. Tipos Array

Consideraes de Projecto:

Que tipo correcto para ndices? Haver verificao de ndices? Quando as amplitudes dos ndices so vinculadas? Quando reservar espao? Qual o nmero mximo de elementos? Sequncias podem ser inicializadas? Arrays podem ser divididos em subfaixas?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 25

Tipos Array

(cont.)

Indexao

Associao entre ndices e elementos de um array. map(nome-array, valor-ndice) elemento Sintaxe para os ndices:

FORTRAN, PL/I, Ada - parnteses curvos. Ex.: A(i)

Em Fortran os parnteses so ambguos: SOMA = SOMA + A(i) -->A(i) pode ser a invocao de uma funo ou acesso a um elemento de um array.

Maioria das outras linguagens utilizam parnteses rectos. ex.:A[i]


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 26

13

Tipos Array

(cont.)

Tipo de ndices:

FORTRAN, C - somente nmeros inteiros; Pascal - qualquer tipo ordinal escalar: int, boolean, char, enum; Ada - int, enum, boolean e char; Java - unicamente nmeros inteiros. C/C++ e Java = 0; Fortran, Basic = 1; Outras linguagens = deve ser especificado.
Engenharia Informtica Linguagens de Programao 2002/2003

Limite inferior dos ndices:


Pg. 27

Tipos Array

(cont.)

Categorias de Arrays os arrays podem ser classificados segundo o tipo de vinculao de ndices (subscritos) e armazenamento:
I. Array Esttico; II. Array Pilha-dinmico de Tamanho Fixo; III. Array Pilha-dinmico; IV. Array Heap-dinmico. Nota: Nomes indicam onde e quando so alojados.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 28

14

Tipos Array I. Array Esttico


Categorias de Arrays

Armazenamento do array esttico; Tamanho do array esttico; ndices e armazenamento so vinculados em tempo de compilao; Tipo de ndice vinculado em tempo de projecto da linguagem (ex. Fortran = INTEGER). Vantagem: eficincia de execuo (no h reserva nem liberao de memria).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 29

Tipos Array

Categorias de Arrays (cont.)

Ex. em FORTRAN 77:


INTEGER INTLISTA(99) // ndices (1 .. 99) Armazenamento alojado estaticamente.

Ex. em C:
int bufferGlobal[50]; // ndices (0 .. 50) void funcaoX() { static int buffer[99]; // ndices (0 .. 99) //... } Tempo de vida dos 2 buffer = tempo de vida da aplicao.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 30

15

Tipos Array

Categorias de Arrays (cont.)

II. Pilha dinmica de Tamanho fixo


ndices com vinculao esttica; Armazenamento vinculado em tempo de execuo na pilha dinmica; Dimenso esttica; Tempo de vida do array = tempo do bloco ou funo; Vantagem: eficincia de espao de memria
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 31

Tipos Array

Categorias de Arrays (cont.)

Ex. em C:
void funcaoX() { int buffer[99]; // ndices (0 .. 99) //... } Notas: Tamanho do array fixo. Armazenamento do array efectuado em tempo de execuo ao iniciar a funo. Tempo de vida do buffer = tempo de vida da funo.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 32

16

Tipos Array -

Categorias de Arrays (cont.)

III. Dinmico de pilha Dimenso e armazenamento so dinmicos porm assim que forem definidos so fixos durante o tempo de vida do array. Ex. em Ada: (declare blocks)
declare STUFF : array (1..N) of FLOAT; begin ... end;

Vantagem: flexibilidade - tamanho no precisa ser conhecido at que o array seja utilizado.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 33

Tipos Array

Categorias de Arrays (cont.)

IV. Dinmico de Heap


Dimenso e armazenamento so dinmicos (e podem mudar qualquer nmero de vezes durante o seu tempo de vida). Tempo de vida controlado explicitamente pelo programador, ou implicitamente pelo Garbage Collection. Vantagem: flexibilidade O tamanho pode crescer ou diminuir conforme a necessidade.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 34

17

Tipos Array

Categorias de Arrays (cont.)

Ex. em FORTRAN 90:


INTEGER, ALLOCATABLE, ARRAY (:,:) :: MAT // MAT array dinmico de 2-dimenes ALLOCATE (MAT (10, N_COLS)) // Alojar MAT para 10 linhas e N_COLS colunas DEALLOCATE MAT // Libertar espao alojado para MAT

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 35

Tipos Array

Categorias de Arrays (cont.)

Ex. de Array Heap-dinmico em C:


Arrays dinmicos so apontadores; No existe verificao de dimenso; Funes padro: malloc, free void main( ) { char *string; /* Define pointer for name */ string = malloc(1024); /* Allocate space */ free( string ); /* free memory space */ }
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 36

18

Tipos Array

Categorias de Arrays (cont.)

Ex. de Array Heap-dinmico em C++:


Arrays dinmicos so apontadores; No existe verificao de dimenso; Funes padro: new, delete template <class T> void String<T>::operator=(const T & s) { T * array; /* Define pointer for array */ array = new T[s.size()](); /* Allocate space */ delete [] array; /* free memory space */ }
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 37

Tipos Array

(cont.)

Nmero de ndices:
FORTRAN I => 1 a 3 dimenses;

Ex.: buffer(5)(3)(1)

FORTRAN 77 => at 7 dimenses; C, C++, Java => somente uma dimenso, porem elementos podem ser arrays;

Ex.: int matriz[5][4]; // array de arrays

Outras Linguagens => sem limite.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 38

19

Tipos Array

Inicializao de arrays

Inicializao de arrays
Em geral os arrays so inicializados atravs de uma lista de valores, respeitando a ordem em que os elementos so armazenados Ex. em Fortran:

Utilizao do comando DATA e colocao dos valores entre / ... / na declarao INTEGER LISTA(3) DATA LISTA /0, 5, 5/

Ex. em Pascal e Modula-2

No permitem inicializao de arrays


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 39

Tipos Array

Inicializao de arrays

(cont.)

Ex. em C, C++: Valores sero dados entre { } separados por virgulas, e o compilador calcular a dimenso para o array. int stuff[] = {2, 4, 6, 8};
/* array de 4 nmeros inteiros */

char nome[] = "Jos";


/* array 4 caracteres finalizado com elemento nulo (zero) */

char *nomes[] = {" jose", "pedro", "Maria"};


/* array de string */
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 40

20

Tipos Array

(cont.)

Ex. em Ada:

Posio dos valores pode ser especificada Operador => usado para inicializao com especificao de posio. Clusula others utilizada para inicializar restantes elementos.

Lista : array (1..5) of integer := (1,3,5,7,9); Score : array (1..14, 1..2) := (1 => (24, 10), 2 => (10, 7), 3 =>(12, 30), others => (0, 0)); Nota: linhas 1, 2 e 3 so inicializadas com valores. As restantes "other" linhas sero inicializadas com o par ordenado (0, 0).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 41

Tipos Array - Operaes com arrays

Operaes com Arrays


Uma operao de array uma operao que opera na estrutura como uma unidade. Ex. em APL:
APL contm muitas operaes definidas tanto para vectores como para matrizes. A + B, A * B, A B

(*, +, -, etc)) operaes definidas para qualquer tipo (escalar, vector e matrizes).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 42

21

Tipos Array - Operaes com arrays (cont.)


Ex. em APL (cont.): outras operaes:

inverter elementos de um vector inverter colunas de uma matriz inverter linhas de uma matriz transpor uma matriz inverter uma matriz etc.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 43

Tipos Array - Operaes com arrays (cont.)

Ex. em Ada:

Atribuio ':='; lado direito pode ser um array; Concatenao '&'; Operao relacional (igual '=' e diferente '/=');

Ex. em FORTRAN 90:

Vrias operaes (multiplicao de matrizes, produto escalar de vectores, etc.)

Ex. em PL/I:

Varias operaes. Semelhante a fortran.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 44

22

Tipos Array

Fatias

Fatias (slices)

Uma fatia uma referncia a uma parte de um array de qualquer dimenso. Em geral as linguagens no suportam fatias de um array. PL/I foi a primeira linguagem a introduzir este conceito em 1965.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 45

Tipos Array

Fatias (cont.)

Exemplo em FORTRAN 90: INTEGER MAT (1 : 4, 1 : 4) MAT(1 : 4, 1) - primeira coluna MAT(2, 1 : 4) - segunda linha Ex. em Ada:

Somente em array unidimensional

lista(1..100) original lista(4..10) faixa de 7 elementos


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 46

23

Tipos Array

Implementao

Implementao de Arrays
Transformao de ndices (expresso) para o endereo de um elemento; Armazenamento dos elementos do array por linha (ordem lexicogrfica) ou por coluna (ordem anti-lexicogrfica); Complexidade de Acesso (1).

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 47

Tipos Array

Implementao (cont.)

Implementao Ordem Lexicogrfica os elementos so armazenados em termos de linhas. Ex. Array de 1-dimenso: Seja A: array[LB1..UB1] of T endereo(A[i]) = Base + (i - LB1) * sizeof(T) Em tempo de compilao podemos calcular: B = Base - LB1*sizeof(T) donde endereo(A[i]) = B + i *sizeof(T)
Onde: Base: endereo do primeiro elemento (i-LB1): n de Engenharia elemento a serem saltados Informtica Linguagens de Programao sizeof(T): tamanho do tipo T 2002/2003

Pg. 48

24

Tipos Array

Implementao (cont.)

Ex. Array de 2 dimenses: A: array[LB1 .. UB1 , LB2 .. UB2] of T endereo(a[j,k]) = Base + { (j - LB1) * ( UB2 - LB2 + 1 ) + (k - LB2) } * sizeof(T) Onde:

Base: endereo inicial (j - LB1): numero linhas a serem saltadas (k - LB2): elemento da coluna k sizeof(T): tamanho do tipo T
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 49

Tipos Array

Implementao (cont.)

Ex. Array de 3 dimenses:


A : array[LB1..UB1, LB2..UB2, LB3..UB3 ] of T

endereo(A[i,j,k]) = base + { (i - LB1)* ( (UB2 - LB2+ 1) * (UB3 - LB3 + 1) ) + (j - LB2)* ( UB3 - LB3 + 1 ) + (k LB3) } * sizeof(T)
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 50

25

Tipos Array

Implementao (cont.)

Ex. Array Multi-dimensional:


A : array[LB1 .. UB1, LB2 .. UB2 , ... , LBn .. UBn ] of T endereo(A[i,j,k,l, ,z]) = base + { ... } * sizeof(T)

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 51

6. Tipo Arrays Associativos

Array Associativo (Associative Array) - uma coleco no ordenada de elementos indexados por chaves.

Problemas de projecto:

Qual o esforo para referenciar um elemento? O tamanho do array esttico ou dinmico? O ndice precisa ser armazenado.

OBS: Em arrays normais os ndices so calculados, e por isso, no so armazenados.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 52

26

Arrays Associativos (cont.)

Ex. Array Associativo em Perl:


Perl utiliza hash para associar um literal ao seu ndice chave; Array dinmico; Nomes de arrays comeam com %; Elementos so literais seguido de uma chave, delimitado por parnteses. %hi_temps = ( "Monday"=>77, "Tuesday"=>79, );

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 53

Arrays Associativos (cont.)

Ex. Array Associativo em Perl (cont.):


Indexao feita pelo literal entre { } e varivel (array) precedida por $ $hi_temps{"Wednesday"} = 83; Elementos podem ser removidos via delete delete $hi_temps{"Tuesday"}; Operadores: @, keys, values, etc. @ hi_temps = () esvazia array inteiro keys - retorna os valores das chaves

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 54

27

7. Tipo Registo

Um registo um conjunto, possivelmente heterogneo de elementos, onde cada elemento designado por campo e identificado por um nome e seus atributos. Consideraes de projecto:

Qual a forma de referenciar cada campo?


qualificao por ponto; uso de parnteses; total ou parcialmente qualificado

Que operaes so definidas para o registo?


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 55

Tipo Registo

(cont.)

Ex. de registro em COBOL:


Sintaxe: COBOL, PL/I utilizam nmeros de nveis para aninhamento de registros.

01 Registro-empregado 02 Nome-Empregado 05 Primeiro Picture is X(20). 05 Meio Picture is X(10). 05 Ultimo Picture is x(20). 02 Salario Picture is 99v99.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 56

28

Tipo Registo

(cont.)

Ex. de registro em Pascal, Modula-2:


Sintaxe: Pascal, Modula-2 utilizam definies recursivas com aninhamento de declaraes.
Reg_Emp : record Nome: record Apelido : string(1..10); nproprio : string(1..10); end; Salario : real; end; Pg. 57

Reg_Emp: record
Primeiro: string(1..20); Meio : string(1..10); Ultimo: string(1..20); Salario : real; end;
Engenharia Informtica Linguagens de Programao 2002/2003

Tipo Registo

(cont.)

Ex. de registro em C, C++:


Sintaxe: C, C++ no permite aninhamento.
class Reg_Emp { public char Primeiro(20); public char Meio(10); public char Ultimo(20); public double Salario; };

struct Reg_Emp { char Primeiro(20); char Meio(10); char Ultimo(20); double Salario; };

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 58

29

Tipo Registo

(cont.)

Referncias a campos do registro sintaxe para especificar e aceder a cada um dos campos de um registo.

Sintaxe do COBOL field_name OF record_name_1 OF ... OF record_name_n Sintaxe das outras L.P. (notao ponto) record_name_1.record_name_2. ... record_name_n.field_name
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 59

Tipos Registo

(cont.)

Tipos de referncias:
Referncias totalmente qualificadas devem incluir todos os nomes de registros aninhados, finalizando com o nome do campo. Referncias parcialmente qualificadas (elptica) permitem descrever apenas alguns nomes de registros, desde que no exista ambiguidade de referncia. Pascal e Modula-2 possuem clusula with para simplificar referncias
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 60

30

Tipos Registo

(cont.)

type reg_empregado = record nome : string (40); sexo: (Masculino, Feminino); end; var empregado : reg_empregado with empregado do begin nome := Jos; sexo := Masculino; end;
Engenharia Informtica Linguagens de Programao 2002/2003

Ex. registo e clusula with em Pascal:

Pg. 61

Tipos Registo

Operaes sobre registos

Operaes com o tipo Registro


Atribuio

Pascal, Ada, C: Se os tipos forem idnticos; Em Ada, o lado direito pode ser um constante agregada (tipo especial de constante); Cobol: instruo move corresponding para atribuio a campos de mesmo nome. Permitido em Ada, usando constantes agregadas.
Engenharia Informtica Linguagens de Programao 2002/2003

Inicializao

Pg. 62

31

Tipos Registo

Operaes sobre registos (cont.)

Comparao

Ada: '=' e '/=' (diferente); operando pode ser constante agregada COBOL: Copia todos os campos de um registro fonte para os campos de mesmo nome de um registro destino.

MOVE CORRESPONDING

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 63

8. Tipo Unio

Uma unio um tipo cujas variveis podem armazenar tipos de dados diferentes em tempos diferentes da execuo. Tipos de unio:

Unio livre: Linguagens no oferece qualquer suporte para verificao dos tipos de dados (responsabilidade do programador). Unio discriminada: Linguagem inclui um identificador dos tipos de dados.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 64

32

Tipo Unio

(cont.)

Considerao de Projecto:
Existe verificao de tipos? Qual?

C, C++, Pascal, Fortran: no possui verificao. ML possui verificao. Pascal: sim; C, C++: no.

Union podem ser integradas num registro?


Ex. do FORTRAN:

Unio livre; Comando EQUIVALENCE especifica unies.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 65

Tipo Unio

(cont.)

Ex. do Algol 68:


Unio discriminada; Etiqueta (tag) escondida (no acessvel) contm o tipo corrente; O tipo da "tag" colocado implicitamente pela atribuio; Referncias so legais se compatveis; Verificao em tempo de execuo um mtodo seguro para aceder aos campos de unies.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 66

33

Tipo Unio

(cont.)

Ex. em Algol 68: union (int, real) ir1, ir2; // ir1 e ir2 podem conter os tipos: int ou real ir1 := 50; // o.k. real soma; int cont := ir1; /* erro - no h como verificar o tipo de ir1 estaticamente */ case ir1 in (int ir1) : cont := ir1; (real ir1) : soma := ir1 esac;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 67

Tipo Unio

(cont.)

Ex. em Pascal:

Unies livres e Unies discriminadas.

type intreal = record tag : boolean of true : (blint : integer); false : (blreal : real); end;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 68

34

Tipo Unio

(cont.)

Ex. em Ada:

Unio discriminada;

type figura (aspecto : forma) is record preenchido : boolean; case aspecto is when circulo => diametro : float; when retangulo => lado_1 : integer; lado_2 : integer; end; end record;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 69

Tipo Unio

(cont.)

Ex. de C, C++:

Unies livres; No parte do tipo registro (struct); No existe verificao de tipo nas referncias. No possui o tipo registro nem unio.

Ex. de Java:

Avaliao - potencialmente no seguro na maior das linguagens, excepto em Ada.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 70

35

Tipo Unio
figura: Descritor para implementao da seguinte unio em Ada

Implementao

type VERTICE (TAG : BOOLEAN) is record case TAG is when true => count : integer; when false => soma : float; end; end record;

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 71

9. Tipo Conjunto

Um conjunto um tipo de dados cujas variveis podem armazenar uma coleco no ordenada de valores distintos de algum tipo ordinal, designado de tipo bsico. Consideraes de projecto:

Qual o mximo nmero de elementos? Quais as operaes disponveis sobre o conjunto?

Ex. de Java - possui uma classe para operaes sobre conjuntos.


Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 72

36

Tipo Conjunto

(cont.)

Ex. em Pascal:

Sem tamanho mximo na definio da linguagem; Implementaes geralmente impe um limite. Operaes sobre conjuntos:

unio '+', interseco '*', diferena '-', comparao '=, superconjunto '>=', subconjunto '<=', pertinncia 'in.

type cores = ( azul, verde, amarelo, branco); conjcores = set of cores; var c1, c2 : conjcores; if azul in c1 then if ch in ['a', 'e', 'i', 'o', 'u'] then
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 73

Tipo Conjunto

(cont.)

Avaliao:

Aumenta a legibilidade; Se uma linguagem no possui o tipo conjunto, este pode ser simulado. Arrays so mais flexveis que conjuntos, dado disponibilizarem muitas mais operaes.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 74

37

Tipo Conjunto

(cont.)

Implementao:

Geralmente armazenados como string de bits e usando operaes lgicas para operaes de conjunto. Ex.: Dado o conjunto ['a' .. 'p']
As variveis deste conjunto, podem ocupar 16 bits (correspondente aos 16 valores diferentes). Assim, o conjunto ['a', 'd', 'g'] pode ser representado pelos seguintes bits: 1001001000000000 (1=char presente, 0=ausente)
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 75

10. Tipo Apontador

Um apontador um tipo cujos valores consistem em endereos de memria e um valor especial nil (ou null).

Principais utilidades:

Flexibilidade de endereamento; Reserva dinmica de memria.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 76

38

Tipo Apontador

(cont.)

Consideraes de projecto:
Qual o escopo e o tempo de vida de uma varivel do tipo apontador? Qual o tempo de vida de uma varivel dinmica de heap? ( alojada/liberada pelo programador) Apontares so restritos a tipos especficos? Podem ser utilizados para gesto dinmica de memria? Pode ser utilizado para endereamento indirecto? A linguagem deve suportar o tipo apontador, o tipo referncia ou ambos?
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 77

Tipo Apontador

(cont.)

O processo de perder variveis heapdinmicas chamado de "vazamento de memria" (memory leakage). Operaes fundamentais de apontadores:

Atribuio de um endereo a um apontador; Referncia (diferenciao entre referncia explcita e implcita).

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 78

39

Tipo Apontador

(cont.)

Problemas com apontadores:


Referncia oscilante (Dangling pointers):

Um apontador pode conter um endereo de uma varivel heap-dinmica que j foi liberada. Uma varivel heap-dinmica quando no mais referenciada por nenhum apontador, deixa de ser acessvel.
Engenharia Informtica Linguagens de Programao 2002/2003

Gerao de lixo (perca do endereo):

Pg. 79

Tipo Apontador

(cont.)

Ex. de referncia oscilante em C: int *apt1, *apt2; apt1 = (int *) maloc(sizeof( int )); apt2 = apt1; free(apt1); /* neste ponto qualquer referencia a ptr2 ser danosa pois o endereo para onde esta aponta deixou de existir */
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 80

40

Tipo Apontador

(cont.)

Ex. de gerao de lixo em C:

char *apt1; apt1 = (char *) maloc(sizeof( char )); apt1 = (char *) maloc(sizeof( char )); /* primeira reserva de memria deixa de ser referenciada, logo lixo */
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 81

Tipo Apontador

(cont.)

Ex. tipo apontador em Pascal:


Apontadores so utilizados unicamente para gesto dinmica de memria; Reserva de memria 'new' e libertao explicita 'dispose'; Possibilidade de referncia perigosas (Dangling pointers), atravs da operao 'dispose'; Possibilidade de gerao de lixo.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 82

41

Tipo Apontador

(cont.)

Ex. em Ada:

Um pouco melhor que Pascal e Modula-2; Algumas referncias perigosas so inibidas pois objectos dinmicos so libertados automaticamente no final do escopo do apontador; Todos apontadores so inicializados a null; Lixo pode ser gerado de forma similar a Pascal e C.
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 83

Tipo Apontador

(cont.)

Ex. de C, C++:

Apontadores so utilizados principalmente para gesto dinmica de memria e endereamento; Existncia de operador para desreferncia '*' e para endereo-de '&'; Pode-se efectuar aritmtica de apontadores, em forma restrita; Podem ser definidos apontadores genricos 'void *' com ausncia de tipo (no podem ser desrefernciados).
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 84

42

Tipo Apontador

(cont.)

Ex. de definio de apontadores em C, C++: int soma; float stuff[100], * goods; goods = stuff; // *(goods+5) equivalente a stuff[5] e goods[5] void * apt; // pode apontar qualquer tipo apt = & soma; // ok - aponta para float apt = goods; // ok - aponta para int cout << *apt; /* erro apt no pode ser desrefernciado */
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 85

Tipo Apontador

(cont.)

Tipo referncia em C++ um apontador que implicitamente denota o "endereosde" varivel/objecto.

Usado para passagem de parmetros no modo de transmisso por referncia (varivel de entrada e/ou sada). Referncias vem simplificam a utilizao de apontadores.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 86

43

Tipo Apontador

(cont.)

Ex. de referncias em C++:

int result = 0; int &ref_result = result; // neste caso: result e ref_result so aliases ref_result = 100; equivalente a: int result = 0; int *ref_result ; ref_result = &result; *ref_result = 100;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 87

Tipo Apontador

(cont.)

Ex. de referncias em Java:


Programador no manipula apontadores; No existe aritmtica de apontador; No h liberao explcita de memria, colector de lixo (garbage collection) utilizado; No existe referncias ambguas; Desreferenciao sempre implcita;
Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 88

44

Tipo Apontador

(cont.)

Avaliao dos apontadores:


Referncias perigosas e lixos so problemas assim como a gesto do heap; Apontadores so como goto's para posies de memria - geram vrios modos de acesso a uma clula de memria; Apontadores so necessrios - no possvel projectar uma linguagem sem eles.

Engenharia Informtica Linguagens de Programao 2002/2003

Pg. 89

45

Vous aimerez peut-être aussi