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