Tipos de Dados

Propaganda
LinguagensdeProgramação
TiposdeDados
AndreiRimsaÁlvares
Sumário
•  Introdução
•  TiposPrimi:vos
•  TiposCompostos
INTRODUÇÃO
LinguagensdeProgramação
Introdução
•  Valores:tudoaquiloquepodeseravaliado,armazenadoepassado
comoparâmetro
–  Valores são agrupados em tipos
•  Ex.:32.5'a'"Paulo"0x1F026false
•  Tipos:conjuntodevaloresedeoperaçõesqueestãodefinidas
paraosmesmos
–  Podemserclassificadoscomo:
•  Primi:vos
•  Compostos
TiposdeDados
•  UmApodedadosdefineumacoleçãodedadosdeobjetoseum
conjuntodeoperaçõespredefinidasnestesdadosdeobjetos
•  Umdescritoréumconjuntodeatributosdeumavariável
–  Ex.:nome,endereço,valor,:po,tempodevida,escopo
•  Umobjetorepresentaumainstânciadeum:po(dadosabstratos)
definidapelousuário
Quaisoperaçõessãodefinidase
comoelassãoespecificadas?
TIPOSPRIMITIVOS
LinguagensdeProgramação
TiposPrimi:vos
•  Pra:camentetodalinguagemprovêumconjuntode:pos
primi:vos
•  Tiposdedadossãodefinidosemtermosdeoutros:posoudele
mesmo
•  Nãopodemserdecompostosemvaloresmaissimples,ouseja,
sãoatômicos
•  Alguns:possãomeramentereflexosdohardware,outrosexigem
poucodesuporteforahardware
TiposPrimi:vos
•  Exemplosde:posprimi:vos
– 
– 
– 
– 
– 
– 
– 
– 
Inteiro
Pontoflutuante
Complexo
Decimal
Lógico(boolean)
Caractere
Cadeiadecaracteres(string)
TipoOrdinal(enumeradoeIntervalodeinteiros)
TipoInteiro
•  Correspondeaumintervalodoconjuntodosnúmerosinteiros
–  EmC,intervalossãodefinidosnaimplementaçãodocompilador
–  EmJAVA,ointervalodecada:pointeiroéestabelecidona
definiçãodaprópriaLP
•  Podemexis:rvários:posinteirosnumamesmaLP,comoemC:
–  Inteirocom/semsinal,inteirobasedecimal,inteirobasebinária,
precisãosimples,...
TipoInteiro
•  Tabelacomos:posprimi:vosinteirosdeJava
Tipo
Tamanho
(bits)
Intervalo
Início
Fim
byte
8
-128
127
short
16
-32,768
32,767
int
32
-2,147,483,648
2,147,483,647
long
64
-9,223,372,036,854,775,808
9,223,372,036,854,775,807
TipoPontoFlutuante
•  O:poprimi:vopontoflutuantemodelaosnúmerosreais,mas
somentecomoaproximações
•  LPsnormalmenteincluemdois:posdepontoflutuante
–  float(precisãode32bits)edouble(precisãode64bits)
PadrãoIEEE754(Precisãosimples)
PadrãoIEEE754(PrecisãoDupla)
TipoComplexo
•  Algumaslinguagenssuportamo:pocomplexo
–  Ex.:C99,FortranePython
•  Cadavalorconsistededoisnúmerosdeponto-flutuante(float),a
parterealeaparteimaginária
•  ExemplodenúmeroliteralemPython:7 + 3j
–  7:partereal
–  3j:parteimaginária
TipoDecimal
•  Armazenaumnúmerofixodedígitosdecimais
•  Ú:lparaaplicaçõesfinanceiras
–  EssencialparaCobol
–  Na:voemC#:decimal salario = 540.0m;
•  Vantagem:acurácia
•  Desvantagem:faixalimitada,desperdíciodememória
•  ExemploemCobol(representaçãointerna)
4bytes
00000010
Sinal
00100011
00110000
7casasinteiras
2bytes
10000110
01111001
10000011
4casasdecimais
TipoLógico(Boolean)
•  Tipomaissimples
–  Possuiapenasdoisvalores(verdadeiroefalso)
–  Pode ser implementado com 1 bit, mas normalmente é
implementadocom1byte
•  Vantagem:Legibilidade
•  Exemplos:
–  C++(bool),Java(boolean)
–  C: não possui o :po booleano, mas aceita expressões em
condicionais
•  ≠zero⇒verdadeiro
•  =zero⇒falso
TipoCaractere
•  Armazenadoscomocódigosnuméricos
–  TabelasEBCDIC,ASCIIeUNICODE
•  PASCALeMODULA2oferecemo:pochar
•  EmC,o:poprimi:vocharéclassificadocomoum:pointeiro
char a = 'a' + 3;
printf("%c\n", a);
printf("%d\n", a);
int d = 65;
printf("%c\n", d);
printf("%d\n", d);
TipoCadeiadeCaracteres(String)
•  Valoressãosequênciasdecaracteres
•  Decisõesdeprojeto
–  Tipoprimi:voouarranjo?
–  Tamanhodastringestá:caoudinâmica?
•  Operaçõescomstrings
–  Atribuição
–  Comparação(=,>,<,etc.)
–  Concatenação(junçãoaofimdastring)
–  Referênciaasubstring
–  Correspondênciadepadrão(Pa3ernmatching)
TipoCadeiadeCaracteres(String)
•  CeC++
–  Nãoéprimi:vo
–  Usaarranjosdecharebibliotecadefunçõesparaoperações
•  SNOBOL4(LPquemanipulastrings)
–  Éprimi:vo
–  Váriasoperações,incluindopa3ernmatching
•  Java
–  Primi:voatravésdaclasseString
TipoCadeiadeCaracteres(String)
•  Perl
–  Padrõessãodefinidosemtermosdeexpressõesregulares
–  Grandepoderdeexpressão
–  Exemplo:palavrascontendounicamenteletras
if ($dados =~ /[A-Za-z]+/)
print ‘Somente letras’;
ImplementaçõesdeStrings
•  Está:co(COBOL,classStringdeJava)
–  Descritordefinido/u:lizadoemtempodecompilação
•  Dinâmicolimitado(CeC++)
–  Umcaractereespecialéusadoparaindicarofimdastring,ao
invésdemanterotamanho
•  Dinâmico(SNOBOL4,PerleJavaScript)
–  Precisadeumdescritoremtempodeexecução
–  Reserva/liberaçãodememóriaéumproblema
Adasuportatodos
ostrês:pos
ImplementaçõesdeStrings
•  TamanhoestáAco:descritoremtempodecompilação
•  Tamanhodinâmicolimitado:podemprecisardeumdescritorem
tempodeexecução(emboranãoemC/C++)
•  Tamanhodinâmico:precisadedescritoremtempodeexecução;
alocação/liberaçãoéomaiorproblemadeimplementação
StringestáAca:descritor
emtempodecompilação
Stringdinâmicalimitada:descritor
emtempodeexecução
TipoCadeiadeCaracteres(String)
•  Avaliação
–  Ajudanaregibilidadedoprograma
–  O:poprimi:vodetamanhoestá:coéeficiente,porquenãoo
ter?
–  Tamanhodinâmicoébom,masmuitocaro,seráquevalea
pena?
TipoOrdinal
•  Tipocujaamplitudedepossíveisvalorespodemserassociadoscom
osinteirosposi:vos
–  Ex:integer,char,boolean
•  Muitaslinguagensdeprogramaçãopermitemosseguintes:pos
ordinais
–  TipoEnumerado
–  TipoIntervalodeInteiros
TipoOrdinal:Enumerado
•  Permiteenumerarvaloresatravésdeconstantessimbólicas
•  Exemplos
–  Pascal:
type cor = (vermelho, azul, branco, preto);
–  C,C++:
enumcor{vermelho,azul,branco,preto};
–  C#,Java>=5.0(Implementadocomoclasse)
enumcor{vermelho,azul,branco,preto};
TipoOrdinal:Enumerado
•  Consideraçõesdeprojeto
–  Podeumaconstantesimbólicapertenceramaisdeuma
definiçãode:po?Sesim,comoverificar?
–  Asenumeraçõespodemserconver:daseminteiros?
–  Algumoutro:popodeserconver:doparaumaenumeração
TipoOrdinal:Enumerado
•  Vantagens
–  Legibilidade
•  Ex:nãoprecisacodificarcorescomointeiros
–  Confiabilidade
•  Nãopermitequeseoperecores(soma)
•  Nãosepodedefinirvaloresforadafaixadaenumeração
•  Ada,C#eJava>=5.0nãofazemcoerçãoparainteiros
TipoOrdinal:IntervalodeInteiros
•  Subsequênciaordenadacon|nuadeum:poenumeradoordinal
•  Exemplo
–  Pascal:
type positivo = 0 .. MAXINT;
–  ADA:
type Days is (mon, tue, wed, thu, fri, sat, sun);
subtype Weekdays is Days range mon..fri;
TipoOrdinal:IntervalodeInteiros
•  Avaliação
–  Melhoralegibilidade
–  Podemguardarapenascertosvaloreslimitadosàfaixa
•  Melhoraconfiabilidade
–  Detecçãodeerrosedasamplitudesdosvalores
TipoOrdinal:IntervalodeInteiros
•  Implementação
–  Tiposenumeradosgeralmentesãoimplementadosassociando
númerosinteirosacadaconstante
–  Subfaixassãoimplementadosdamesmaformaqueos:pospais
•  Ocódigopararestringiratribuiçõesavariáveisdesubfaixasdeve
serinseridopelocompilador
TIPOSCOMPOSTOS
LinguagensdeProgramação
TiposCompostos
•  Aquelesquepodemsercriadosapar:rde:posmaissimples
–  Registros,vetores,listas,arquivos
•  Entendidosemtermosdosconceitos
–  Produtocartesiano,uniões(livresedisjuntas),mapeamentos,
conjuntospotênciae:posrecursivos
•  Cardinalidade
–  Númerodevaloresdis:ntosquefazempartedo:po
ProdutoCartesiano
•  Combinaçãodevaloresde:posdiferentesemtuplas
X
ab
S
cde
T
=
(a,c)(a,d)(a,e)
(b,c)(b,d)(b,e)
SxT
•  Cardinalidade
#(S1 x S2 x ... x Sn) = #S1 x #S2 x ... x #Sn
ProdutoCartesiano
•  SãoprodutoscartesianoosregistrosdePASCAL,MODULA2,ADAe
COBOLeasestruturasdeC
struct nome {
char primeiro[20];
char meio[10];
char sobrenome[20];
};
struct empregado {
struct nome nfunc;
float salario;
} emp;
•  EmLPsorientadasaobjetos,produtoscartesianossãodefinidosa
par:rdoconceitodeclasse(Javasótemclasses)
ProdutoCartesiano
•  Exemplo
struct data {
int dia, mes, ano;
};
–  Inicialização
struct data d = { 7, 9, 1999 };
–  Acessoaosmembros(atravésdeseletores)
printf("%02d\n", d.dia);
d.mes = 10;
–  Cardinalidade
#INTEGER x #INTEGER x #INTEGER
Uniões
•  Consiste na união de valores de :pos dis:ntos para formar um
novo:podedados
+
abc
S
bcd
T
=
abcd
S+T
•  Cardinalidade
#(S1 + S2 + ... + Sn) = #S1 + #S2 + ... + #Sn
Uniões
•  Uniõeslivres
–  Pode haver interseção entre o conjunto de valores dos :pos
queformamaunião
–  Hápossibilidadedeviolaçãonosistemade:pos
•  Exemplo
union medida {
int centimetros;
float
metros;
};
void funct() {
union medida medicao;
float altura;
}
medicao.centimetros = 180;
altura = medicao.metros;
printf("\naltura: %f m\n", altura);
Uniões
•  Uniõesdisjuntas
–  Não há interseção entre o conjunto de valores dos :pos que
formamaunião
–  RegistrosvariantesdePASCAL,MODULA2eADAeaunionde
ALGOL68
•  ExemploemPascal
TYPE
Representacao = (decimal, fracionaria);
END
Numero = RECORD CASE Tag: Representacao OF
decimal: (val: REAL);
fracionaria: (numerador, denominador: INTEGER);
var num of Numero;
Numero.Tag = decimal;
Numero.val = 1.5;
Uniões
•  Exemplo
TYPE TipoProduto = (musica, livro, video);
Compra = RECORD
valor: REAL;
CASE produto: TipoProduto OF
musica: (numeromusicas: INTEGER);
livro: (numeropaginas: INTEGER);
video: (duracao: INTEGER, colorido: BOOLEAN);
END;
–  Possíveisvalores
(25.00, musica(16))
(35.00, livro(257))
(40.00, video(121, TRUE))
–  Cardinalidade
#REAL x (#INTEGER + #INTEGER + (#INTEGER x #BOOLEAN))
Mapeamentos
•  Mapeamentospodemser
–  Finitos
–  Atravésdefunções
•  Tiposdedadoscujoconjuntodevalorescorrespondeatodos
ospossíveismapeamentosdeum:podedadosSemoutroT
u
v
S
a
b
c
u
v
T
S
a
b
c
•  Cardinalidade
#(S→T) = (#T)#S
T
MapeamentosFinitos
•  Oconjuntodomínioéfinito
•  Vetoresematrizes
–  array S of T;
–  array [1..50] of char;
(S → T)
([1,50] → char)
azdrs…fhwo
12345…47484950
•  Oconjuntoíndicedeveserfinitoediscreto
•  Verificação de índices em C vs. JAVA: verificação em tempo de
execuçãoaumentaaconfiabilidade,masperdeeficiência
int v[7];
v[13] = 198;
CategoriadeVetores
•  Está:cos(emC)
void f() {
static int x[10];
}
•  Semi-está:cos(emC)
void f() {
int x[10];
}
•  Semi-dinâmicos(emCISO/99)
void f(int n) {
int x[n];
}
•  Dinâmicos(emC++)
void f(int n) {
int x[] = new int [n];
}
CategoriadeVetores
•  Tabelacomascategoriasdevetores
Categoria
deVetor
Tamanho
Tempode
Definição
Alocação
Localde
Alocação
Exemplos
deLPs
Está:cos
Fixo
Compilação
Está:ca
Base
FORTRAN77
SemiEstá:cos
Fixo
Compilação
Dinâmica
Pilha
PASCAL,C,
MODULA2
SemiDinâmicos
Fixo
Execução
Dinâmica
Pilha
ALGOL68,
ADA,C
Dinâmicos
Variável
Execução
Dinâmica
Heap
APL,PERL
VetoresDinâmicos
•  Podem ser implementados em C, C++ e JAVA através do monte
(heap)
•  Necessário alocar nova memória e copiar conteúdo quando vetor
aumentadetamanho
•  Éencargodoprogramadorcontrolaralocaçãoecópia.EmCeC++,o
programador deve controlar liberação também. Isso torna a
programaçãomaiscomplexaesusce|velaerros
VetoresMul:dimensionais
•  Exemplo
int mat[5][4];
–  Representação
{0, …, 4} x {0, …, 3} → int
–  Conjuntodevalores
(#INT)#({0, …, 4} x {0,
(#INT)#{0, …, 4} x #{0,
(#INT)5 x 4 =
(#INT)20
…, 3})
…, 3}
=
=
mat[2][3]
VetoresMul:dimensionais
•  Elementossãoacessadosatravésdaaplicaçãodefórmulas
posição mat[i][j] = endereço de mat[0][0] +
i × tamanho da linha +
j × tamanho do elemento
= endereço de mat[0][0] +
(i × número de colunas + j) ×
tamanho do elemento
VetoresMul:dimensionais
•  Em JAVA vetores mul:dimensionais são vetores unidimensionais
cujoselementossãooutrosvetores
int [][]a = new int [5][];
for (int i = 0; i < a.length; i++) {
a[i] = new int [i + 1];
}
•  Omesmoefeitopodeserob:doemCcomousodeponteirospara
ponteiros
int** a = new int [5][];
for (int i = 0; i < 5; i++) {
a[i] = new int [i + 1];
}
OperaçõescomVetores
•  Vetorespodemsuportarasseguintesoperações
– 
– 
– 
– 
– 
Indexação
Inicialização
Atribuição
Comparação(igualdadeedesigualdade)
Concatenação
MapeamentosAtravésdeFunções
•  Umafunçãoimplementaummapeamento S → Tatravésdeum
algoritmo
•  OconjuntoSnãonecessariamenteéfinito
•  O conjunto de valores do :po mapeamento S → T são todas as
funçõesquemapeiamoconjuntoSnoconjuntoT
•  Valoresdomapeamento[ int → boolean ]emJava
boolean positivo(int n) {
return n > 0;
}
–  Outrosexemplos:palindromo,impar,par,primo
MapeamentosAtravésdeFunções
•  C u:liza o conceito de ponteiros para manipular endereços de
funçõescomovalores
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
int
int
int
int
impar(int n) { return n % 2; }
negativo(int n) { return n < 0; }
multiplo7(int n) { return !(n % 7); }
conta(int x[], int n, int (*p)(int)) {
int j, s = 0;
for (j = 0; j < n; j++)
if ((*p)(x[j]))
s++;
Javanãotrata
return s;
funçõescomovalores
}
void 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));
}
ConjuntosPotência
•  Tipos de dados cujo conjunto de valores corresponde a todos os
possíveissubconjuntosquepodemserdefinidosapar:rdeum:po
baseS: ϕS = {s | s ⊆ S}
{}{a}{b}{c}{a,b}{a,c}
{b,c}{a,b,c}
abc
S
•  Cardinalidade
#ϕS = 2#S
ϕS
ConjuntosPotência
•  Operaçõesbásicas
– 
– 
– 
– 
– 
– 
– 
Per:nência
Contém
Estácon:do
União
Diferença
Diferençasimétrica
Interseção
ConjuntosPotência
•  Poucas linguagens de programação oferecem o :po conjunto
potência,muitasvezesdeformarestrita
•  ExemploemPascal
TYPE Carros = (corsa, palio, gol);
ConjuntoCarros = SET OF Carros;
VAR Carro: Carros;
CarrosPequenos: ConjuntoCarros;
BEGIN
Carro:= corsa;
CarrosPequenos := [palio, gol]; /*atribuicao*/
CarrosPequenos:= CarrosPequenos + [corsa]; /*uniao*/
CarrosPequenos:= CarrosPequenos * [gol]; /*intersecao*/
if Carro in CarrosPequenos then /*pertinencia*/
if CarrosPequenos >= [gol, corsa] then /*contem*/
ConjuntosPotência
•  Restrições de PASCAL visam permi:r implementação eficiente,
atravésdemapasdebits
•  Exemplo
VAR
S: SET OF [ ’a’ .. 'h' ];
BEGIN
S := ['a', 'c', 'h'] + ['d'];
END;
1 0 1 1 0 0 0 1
['d’]
['a’,'c’, 'h’]
['a’,'c’,'d’,'h’]
:=
1 0 1 0 0 0 0 1
OR
0 0 0 1 0 0 0 0
Recursivos
•  Tipos recursivos são :pos de dados cujos valores são compostos
porvaloresdomesmo:po
–  R ::= <parte inicial> R <parte final>
–  Lista ::= Lista Vazia | (Elemento x Lista)
•  A cardinalidade de um :po recursivo é infinita; isto é verdade
mesmoquandoo:podoelementodalistaéfinito
•  O conjunto de valores do :po listas é infinitamente grande (não
podendoserenumerado)emboratodalistaindividualsejafinita
Recursivos
•  Tipos recursivos podem ser definidos a par:r de ponteiros ou
atravésdereferências
•  Exemplos
struct No {
int elem;
struct No* prox;
};
class No {
public:
int elem;
No* prox;
};
EmC
EmC++
class No {
int elem;
No prox;
};
EmJava
Ponteiros
•  Nãoserestringeaimplementaçãode:posrecursivosemboraseja
seuusoprincipal
•  Ponteiro é um conceito de baixo nível relacionado com a
arquiteturadoscomputadores
•  O conjunto de valores de um :po ponteiro são os endereços de
memóriaeovalornil
•  Sãoconhecidoscomoosgoto’sdasestruturasdedados
Ponteiros
•  Atribuição
int *p, *q, r; // dois ponteiros para int e um int
q = &r;
// atribui endereço de r a q
p = q;
// atribui endereço armazenado em q a p
•  Alocação
int* p = (int*) malloc(sizeof(int)); // em C
int* p = new int; // em C++
•  Liberação
free(p); // em C
delete p; // Em C++
Ponteiros
•  Dereferenciamentoexplícito
INTEGER, POINTER :: PTR
PTR = 10
PTR = PTR + 10
•  Dereferenciamentoimplícito
int *p;
*p = 10;
*p = *p + 10;
Ponteiros
•  Aritmé:cadeponteiros
p++;
++p;
p = p + 1;
p--;
--p;
p = p - 3;
•  Indexaçãodeponteiros
x = p[3];
PonteirosGenéricos
•  Aritmé:cadeponteiros
int f, g;
void* p;
f = 10;
p = &f;
g = *p; // erro: ilegal dereferenciar ponteiro p/ void
•  Servemparacriaçãodefunçõesgenéricasparagerenciarmemória
•  Servemparacriaçãodeestruturasdedadosheterogêneas(aquelas
cujoselementossãode:posdis:ntos)
ProblemascomPonteiros
•  Baixa legibilidade: Inspeção simples não permite determinar qual
estruturaestásendoatualizadaequaloefeito
p->cauda = q; •  Possibilitamviolarosistemade:pos
int i, j = 10;
int* p = &j;
// p aponta para a variavel inteira j
p++;
// p pode nao apontar mais para um inteiro
i = *p + 5;
// valor imprevisivel atribuido a i
•  Objetospendentes:provocavazamentodememória
int* p = (int*) malloc(10*sizeof(int));
int* q = (int*) malloc(5*sizeof(int));
p = q;
// área apontada por p torna-se inacessivel
ProblemascomPonteiros
•  ReferênciasPendentes
–  Exemplo1:
int* p = (int*) malloc(10*sizeof(int));
int* q = p;
free(p);
// q aponta agora para area de memoria desalocada
–  Exemplo2:
//
int *r;
*r = 0;
ponteiro não inicializado
–  Exemplo3:
int *p, x;
x = 10;
if (x) {
int i;
p = &i;
}
// p continua apontando para i, que nao existe mais
Referência
•  O conjunto de valores desse :po é formado pelos endereços das
célulasdememória
•  Todasasvariáveisquenãosãode:posprimi:vosemJAVAsãodo
:poreferência
•  Exemplo(emC++)
int x = 0;
int& ref = x;
ref = 100;
// ref passa a referenciar x
// x passa a valer 100
Strings
•  Valorescorrespondemaumasequênciadecaracteres
•  Nãoexisteconsensosobrecomodevemsertratadas
•  Podem ser consideradas :pos primi:vos, mapeamentos finitos ou
:porecursivolista
•  Trêsformascomunsdeimplementação
–  Está:ca
–  Semi-está:ca
–  Dinâmica
HierarquiadeTipos
Tipos
Primi:vos
Compostos
Enumerados
Inteiros
PontoFlutuantes
Caracteres
Booleanos
Decimais
Intervalos
Strings
Recursivos
ConjuntosPotência
Uniões
Mapeamentos
Ponteiros
Livres
Finitos
Disjuntas
ProdutosCartesianos
Funções
ISSOÉTUDOPESSOAL!
LinguagensdeProgramação
Download