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