Resumo Tipos de Dados - LP1

1,293 views

Published on

  • Be the first to comment

  • Be the first to like this

Resumo Tipos de Dados - LP1

  1. 1. Resumo de Linguagens deProgramação IParadigmas de Linguagens de Programação As linguagens adotam técnicas comuns de programação, desenvolvidas de formaindependente de uma linguagem conforme a área de Linguagens de Programaçãoevolui. As linguagens de programação podem ser classificadas de muitas formasdiferentes. Uma das formas de classificação é quanto ao paradigma de programação. No contexto de linguagens de programação, podemos dizer de maneira bemsimples que paradigma é um estilo. Porém estamos nos referindo a estilo numaconotação forte. Para serem chamados de paradigmas de programação, estilos precisamser suficientemente diferentes e completos para serem considerados uma forma de ver omundo. Autores diferentes classificam as linguagens de programação de formasdiferentes. Apesar disso, é geralmente aceito que existem dois tipos principais deprogramação: (a) Programação imperativa(ou procedural), de acordo com a qual osprogramas são construídos por meio de uma sequência de ordens - o programadorescreve um procedimento que leva à solução de um problema; (b) Programação declarativa (ou descritiva), de acordo com a qual osprogramas são construídos simplesmente pela descrição da solução de um problema -cabe ao compilador encontrar uma sequência de instruções que produz a soluçãodeclarada. Na programação declarativa, existem duas formas principais de se descreversoluções: 1 - Através de funções (conceito matemático de associação entre elementos deum conjunto domínio para um conjunto imagem) e 2 - Através de predicados (elementos sintáticos que permitem expressar relaçõesentre elementos de conjuntos). Vale lembrar que uma função é um tipo especial derelação de associação.São três os paradigmas de programação:• Programação imperativa (ou procedural) - em que programas são implementações dealgoritmos (sequência de instruções que levam à solução de um problema);• Programação funcional - em que programas são implementações de funções• Programação lógica - em programas são implementações de predicados (relações entreelementos de conjuntos diversos).
  2. 2. É comum encontrar autores que classificam a Programação Orientada a Objetoscomo sendo um paradigma de programação. Essa classificação considera que o projetode programas orientados a objetos segue conceitos de destaque suficiente para que esseestilo de programação seja classificado à parte da programação imperativa.Tipos de Dados Dizem o que os bits representam. O uso do tipo depende do problema. Algumas linguagens não tem o tipo de dado que você precisa, pode sernecessário implementá-lo. (Ex.: implementar listas ou árvores usando vetores). Um tipo primitivo de dados é aquele que não pode ser decomposto em partesmais simples. Para tal classificação, considera-se a linguagem propriamente dita (e nãosuas bibliotecas). Exemplo: Inteiros. Um fator importante para determinar a facilidade com que os computadorespodem executar uma tarefa é quão bem os tipos de dados coincidem com o espaço deproblema do mundo real. Portanto, é crucial que uma linguagem suporte uma variedadede tipos de dados e estruturas. Os tipos definidos pelos usuários oferecem uma melhor legibilidade pelo uso denomes de tipos significativos. Descritor É um conjunto de células de memória que armazenam atributos devariáveis. São construídos pelo compilador e são usados para a verificação de tipos epelas operações de alocação e de desalocação.Inteiros Os inteiros são infinitos, porém a capacidade de bits para inteiro é fixa. Atualmente, muitos computadores suportam diversos tamanhos de inteiros, eessas capacidades são refletidas em algumas linguagens de programação. Por exemplo,o Ada permite que as implementações incluam ate três tamanhos de inteiros: ShortInteger, Integer e Long Integer. Em outras linguagens, como o C++, incluem tiposinteiros sem sinal, usados frequentemente com dados binários. Em geral, short ocupa 16 bits, long ocupa 32 bits e int, 16 ou 32bits. Cada compilador é livre para escolher tamanhos adequados aopróprio hardware. A vantagem desses tamanhos diferentes é nãodesperdiçar memória. Um inteiro negativo poderia ser armazenado em uma notação de sinal-magnitude, na qual o bit de sinais é fixado para indicar o valor negativo, enquanto orestante da cadeia de bits representa o valor absoluto de número, entretanto, essanotação não se presta para a aritmética computadorizada. A maioria dos computadores atualmente usa uma notação chamadacomplemento de dois para armazenar inteiros negativos, o que é conveniente para aadição e para a subtração. Para converter a representação binária de umnúmero em seu decimal correspondente segundo a notação decomplemento a dois é um pouco mais trabalhoso. Primeiramente, énecessário verificar se o dígito mais à esquerda do número é um ouzero. Se for zero, o número será zero ou positivo. Se for um, o númerodecimal será negativo. Nesse caso, deve-se inverter a representaçãobinária do número e incrementá-lo de um. Assim, obtém-se a
  3. 3. representação do número na base binária. Basta, então convertê-lapara a base decimal levando em conta o seu sinal. Por exemplo:11111101 (representação na notação de complemento a dois)1 (dígito mais a esquerda –> número é negativo)00000010 (representação com inversão binária)00000001 (representação binária do número um)00000011 (adição binária do número invertido e um)00000011 = 0x27+0x26+0x25+0x24+0x23+0x22+1x21+1x20 = 311111101 = -3 (considerando o sinal) As principais vantagens da notação de complemento a dois sãoter uma representação única para o número zero e também poderutilizar os operadores aritméticos binários para implementar suaspróprias operações. Wrap Arround  quando é estourado o limite de um tipo de dado,o resultado possui uma parte da operação certa, pois o computadoropera até o número máximo de bits possível. Inteiros com sinal  possuem menos espaço do que os inteirossem sinais. Inteiros sem sinal  possuem mais espaço, pois não precisamrepresentar o caractere ‘’-‘’.Ponto Flutuante Modelam os números reais, mas as representações são somenteaproximações para a maioria dos números. A ideia parte da notaçãocientífica, que evidencia a parte mais importante do número. Issogera uma imprecisão do número representado, o que faz com quehaja uma perda de exatidão nas operações aritméticas. Se ocomputador tiver mais memória, haverá mais precisão e informação.A imprecisão aumenta quando o número é muito grande. Os pontos flutuantes são armazenados em dígitos binários. Amaioria dos computadores usam a norma IEEE 754, que estabelece23 bits de mantissa e 8 de expoente para precisão simples; 52 bits demantissa e 11 bits de expoente para precisão dupla. Ponto Flutuantenão é somente número, existe também o NaN (not a number,exemplo: operações impossíveis, tais como 0/0) e o Inf (mais oumenos infinito). A comparação de inteiro com real é altamente imprevisível,porque usam representações diferentes em bits. A comparação dereal com real é chamada de verificação de equivalência, como os doisnúmeros são aproximações, é imprevisível dizer se vão serconsiderados números iguais ou não.Decimais
  4. 4. A maioria dos grandes computadores projetados para suportaraplicações de sistemas comerciais tem suporte de hardware paratipos de dados decimais, que armazenam um número fixo de dígitosdecimais, com a vírgula decimal em uma posição fixa no valor. Vantagem  capacidade de armazenar com precisão valoresdecimais(dentro de uma faixa restrita), o que não pode ser feito emponto flutuante. Desvantagem  os números decimais usam códigos binários eocupam mais espaço do que as representações binárias. Essasrepresentações são chamadas decimais codificadas em binário (BCD). Não é presente nas linguagens modernas devido a ausência dacapacidade do hardware. Algumas máquinas tinham hardware próprio para essetipo e representavam números como strings de bits, desperdiçando um pouco de espaço.Hoje em dia, costuma-se usar emulação desse tipo no software.Booleanos Os tipos booleanos são, talvez, os mais simples de todos. Sua faixa de valorestem somente dois elementos: verdadeiro e falso. Algumas linguagens não possuem essetipo (exemplo: linguagem C, no qual expressões numéricas podem ser usadas comocondicionais. Nessas expressões, todos os operandos com valores diferentes de zero sãoconsiderados verdadeiros, e zero é considerado falso). Vantagem  aumentam a legibilidade. Um valor booleano poderia ser representado por um único bit, mas peladificuldade e pela falta de eficiência do acesso de um bit, geralmente os booleanos sãoarmazenados na menor célula de memória eficientemente endereçável: o byte.Caracteres Representa um símbolo com um número correspondente, a representação mudade acordo com a cultura e há problema de padronização. Nem sempre os símbolos gráficos possuem o mesmo tamanho. Tabela ASCII  um dos primeiros padrões (7 bits, 128 posições) UTF8  cada caractere = 4bits, é compatível com o ASCII, padrão de fato e dedireito. UNICODE  Lista com símbolos gráficos com objetivo de padronização, aindanão terminado. Geralmente supõe-se que o caractere tem 1 byte, pois a maioria doscodificadores da nossa cultura usa dessa forma, porem isso não é bom porque nemsempre será desse jeito nos outros países.Cadeias de caracteres Podem ser tipos primitivos (strings) ou não, depende da linguagem. Quando são representados como vetores de caracteres, frequentemente alinguagem fornece poucas operações. Operações com strings: atribuição, comparação, concatenação, conversão paramaiúsculo. Exemplo de concatenação name1 := name1 + name2;
  5. 5. A maior parte dos usos de cadeias e a maioria das funções de biblioteca usam aconvenção segundo a qual as cadeias de caracteres são finalizadas com um caractereespecial nulo (zero). Essa é uma alternativa para manter o tamanho da string. Para manter o tamanho variável num espaço estático de memória, é precisoalgum tipo de controle. FORTRAN usa strings sempre cheias. C usa o terminador zero,favorecendo em armazenamento. Pascal usa o tamanho no primeiro elemento do vetor(problemas de limite para o tamanho), eficiente em buscas na string. Algumas linguagens modernas possuem vários recursos para strings, tais comocasamento de padrão e interpolação [Writeln (‘Resultado =’ resultado);]. Tem um importante papel para a segurança de computadores (buffer overflow) Quanto as opções de tamanho da cadeia, existem 3: Cadeia de tamanho estático – usado no Pascal, Ada, FORTRAN 90  sãosempre cheias, se uma cadeia mais curta for atribuída a uma variável, os caracteresvazios normalmente serão ajustados como brancos (espaços). Cadeia de tamanho dinâmico limitado – usado no C e C++, as cadeias temtamanhos variáveis até um máximo declarado e fixo estabelecido pela definição davariável. Usam um caractere especial para indicar o final da string, em vez e manteremseu tamanho. Cadeia de tamanho dinâmico – usado no Java, Perl, SNOBOL4, as cadeias temtamanhos variáveis sem nenhum máximo, tal opção exige a sobretaxa de alocação edesalocação dinâmica de armazenamento, mas proporciona máxima flexibilidade. Tratar cadeia de caracteres como vetores pode ser mais incômodo do que lidarcom um tipo de cadeia primitivo. A sua adição como um tipo primitivo a umalinguagem não é custosa, tanto em termos de complexidade da linguagem como docompilador. OBS: Alocação é definida antes da execução do programa. (tempo decarregamento). Durante a compilação que se decide quanto espaço o programa precisapara os dados e como esse espaço será dividido entre os vários dados. (tempo decompilação).Enumerados Em algumas LPs, tais como PASCAL, ADA, C e C++, é permitido que oprogramador defina novos tipos primitivos através da enumeração dos identificadoresque denotarão os valores do novo tipo. Tipos enumerados são utilizados basicamente para aumentar a legibilidade econfiabilidade do código. A legibilidade é aumentada porque identificadores de valoressão mais facilmente reconhecidos do que códigos numéricos. Por exemplo, numprograma de processamento bancário é mais fácil identificar os bancos específicos se osdescrevemos por seu nome ao invés de usar seus códigos numéricos. A confiabilidade é aumentada porque valores fora da enumeração não sãoválidos. Além disso, operações aritméticas comuns não podem ser realizadas sobre estestipos, permitindo que o compilador identifique possíveis erros lógicos e tipográficos.Como C e C++ tratam enumerações como inteiros, estas duas vantagens deconfiabilidade não estão presentes. A repetição de constantes simbólicas pode gerar problemas, por exemplo:
  6. 6. Tipo flor  rosa Tipo cor  rosa Para solucionar esse problema, ou o programador exibe uma mensagem de erroou então ele cria uma variável para pegar o nome, ex: a := rosa;Subfaixas Aumentam a legibilidade ao tornar explícitos limites de um tipo numérico.Aumenta a confiabilidade porque a atribuição de um valor a uma variável de subfaixafora da faixa especificada é detectada como um erro pelo compilador ou pelo sistemaem tempo de execução.Ponteiros Um tipo ponteiro é aquele em que as variáveis têm uma faixa de valores queconsiste em endereços de memória e um valor especial, o nil. O nil/null não é umendereço válido e serve para indicar que um ponteiro não pode ser usado atualmentepara referenciar qualquer célula de memoria. Esse tipo foi projetado para dois usos distintos. Primeiro, eles apresentam partedo poder de endereçamento indireto, em segundo, fornecem um método degerenciamento de armazenamento dinâmico. Geralmente são usados para referenciar alguma outra variável, em vez dearmazenar dados de alguma espécie. Há duas operações com ponteiros: atribuição e desreferenciamento. A atribuiçãofixa o valor de uma variável de ponteiro em um endereço útil. Um ponteiro armazena um valor inteiro e sem sinal (ponteiros são númerosnaturais) que representa um endereço na memória, permitindo acessar os dados contidosnesse endereço de memória. Exemplo de flexibilidade de ponteiros: ‘’Agora vamos supor que seu programa precisa trabalhar com uma informação, do tipo número inteiro, mas pode ser também que essa informação não exista e o programa deve ser capaz de lidar com esse caso. Usando somente uma variável do tipo inteiro, não é possível representar a situação "não existe nenhum inteiro aqui". Porém, se o inteiro for na verdade um ponteiro para um inteiro, essa representação é possível. Podemos dizer que tal inteiro pode não ter valor. Nesse caso, o uso de um ponteiro para inteiro mais um inteiro aumentou a flexibilidade do programar ao lidar com inteiros. ‘’ Os ponteiros sempre existem nas linguagens de programação, às vezes eles são‘’escondidos’’. Em algumas linguagens, usam para acessar endereços de memoria, em outrasusam somente recursos. Em java, o compilador reconhece as variáveis como ponteiros.Vetores Agregado homogêneo e unidimensional de valores.
  7. 7. Possui dificuldade para mudar o seu tamanho, porém tem acesso em tempoconstante. Os valores estão em posições consecutivas, sendo que no pascal é possívelescolher o valor mínimo do índice. Ex: [10..15] Vetor dinâmico  troca o endereço da memoria, dando a impressão de que ovetor aumentou. O único vetor heterogêneo existente é o vetor de ponteiros, pois eles podemapontar para vários tipos de dados. Os vetores heterogêneos além de guardar a informação, também guardam osponteiros, por isso mais memória é gasta. Operadores: () e []Vetores Associativos São estruturas chaves-valor (associação) Quando é digitado determinada chave, retorna um valor. Não é organizado. Algumas linguagens só usam vetores associativos, porque podem ser usadoscomo vetores, listas ou registros. São implementados por árvores ou funções hash. Função hash  entra um monte de bytes e sai uma quantidade fixa de bytes Exemplo: CEP 123.456.779-15 _________ Operações desses números geram o número 15 Vetores associativos por árvores  são mais fáceis de inserir/remover porquegasta pouco recursos visto que é uma estrutura segmentada, porém o acesso não é emtempo constate. Vetores associativos por funções hash  o oposto do de árvores. O vetor associativo tem custo em questão de memória e processamento.Listas Aglomerado homogêneo, assim como vetores. São recursivas (lista é vazia ou é valor + uma lista) e segmentadas O acesso não é em tempo constante, requer que a estrutura seja percorrida paraacessar um valor. Inserir/Remover elementos de listas é muito fácil. São geralmente dinâmicas, mas podem ser estáticas.Vetores x ListasVetores são melhores em processamento, é mais fácil achar um elemento num vetor doque numa lista, pois nos vetores o acesso é em tempo constante.Listas são melhores para mudar a estrutura dos dados, já que é uma estruturasegmentada. É mais fácil de inserir/remover elementos de uma lista do que em vetores.Registros
  8. 8. É um agregado possivelmente heterogêneo de elementos de dados. Cadaelemento individual é identificado por seu nome. Os campos de um registro normalmente não são referenciados por índices. Areferência é feita por identificadores (que são nomeados). Registros em C, C++  são chamados de estruturas, não incluem registrosvariantes ou uniões.Referências a campos do registro: A maioria das linguagens usa uma notação de pontos para as referências acampos, cujos componentes da referência são conectados por pontos. Referência amplamente qualificada  é aquela que todos os nomes de registrointermediários, do maior registro envolvente ao campo específico, são nomeados areferência. Referência elíptica  nelas o campo é nomeado, mas qualquer um ou todos osnomes de registro envolventes podem ser omitidos, contanto que a referência resultantenão seja ambígua no ambiente de referência. As referências elípticas são prejudiciaispara a legibilidade.Operações em registros Atribuição  na maioria dos casos, os tipos dos dois lados devem ser idênticos. MOVE CORRESPONDING  no COBOL, essa instrução copia um campo doregistro-fonte especificado para o de destino somente se este tiver um campo com omesmo nome. O uso de registros é seguro, o único aspecto dos registros que não é claramentelegível são as referências elípticas permitidas pelo COBOL e PL/I. Os registros são usados quando um conjunto de valores de dados é heterogêneo eos diferentes campos não são processados da mesma maneira, além disso, os campos deum registro, muitas vezes, não precisam ser processados em uma ordem sequencialparticular. O acesso aos campos é muito eficiente.União É um tipo que pode armazenar diferentes valores de tipo durante a execução doprograma. Em alguns casos, as uniões limitam-se a fazer parte das estruturas de registro,mas, em outros, não. Uniões livres  é permitida completa liberdade aos programadores quanto averificação de tipos em seu uso. (exemplo de linguagens: FORTRAN, C e C++) Uniões discriminadas  cada construção de união inclui um indicador de tipo(discriminante) (exemplo de linguagens: Pascal, Ada, ALGOL 68). Também chamadade registro variante.
  9. 9. Desvantagem  As uniões são construções potencialmente inseguras em muitaslinguagens. Elas constituem um dos motivos pelos quais linguagens como oFORTRAN, Pascal, C, C++ não são fortemente tipificadas, pois não permitemverificação de tipos das referências a suas uniões. Vantagem  as uniões economizam memória e proporcionam flexibilidade deprogramação, em algumas linguagens permite a aritmética de ponteiros. Há algumaslinguagens, Ada por exemplo, que podem ser usadas com segurança. Um grande número de linguagens não inclui uniões. Isso talvez reflita a grandepreocupação com a segurança nas linguagens de programação.‘’O problema das uniões é a verificação de tipos, ou seja, garantir que as operações queusam uniões estão corretas em termos de tipos de dados. Essa dificuldade vem do fatode que o valor de uma união pode ser de mais de um tipo.’’Conjuntos Tipo cujas variáveis podem armazenar coleções não-ordenadas de valoresdistintos de algum tipo ordinal. Vantagens  Exemplo de vantagem: ‘’Se o conjunto de vogais fosse representadocomo um vetor char no Pascal, identificar se determinada variável armazenou umavogal exigiria um laço para procurá-la no vetor de vogais. Se estas fossem representadascomo um conjunto, a mesma determinação poderia ser feita com uma aplicação dooperador in ( if ch in [‘a’, ‘e’, ‘i’, ‘o’, ‘u’] ). Isso não somente é eficiente para oprogramador, mas, provavelmente, também será eficiente para o computador. Nessecaso é melhor lidar com o conjunto inteiro como sendo uma unidade.’’ Desvantagens não pode repetir os elementos num mesmo conjunto, limitaçõesde capacidades (no Pascal tem limite de 60 elementos) e operações. É complicadorealizar operações de união, intersecção, pertencente, etc, por não poder repetirelementos.Unidade Guarda um valor possível (zero). Void.

×