07 - tipos de dados
DESCRIPTION
Capitulo 7TRANSCRIPT
-
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