sexta-feira, 27 de março de 2009

Dados Primitivos


Tipo de dados

(Por: Daniel Max Costa e Wagner Geniplo Parreiras)


Sao tipos de variáveis ou dados, é uma combinação de valores e de operações que uma variável pode executar, o que pode variar conforme o sistema operacional e a linguagem de computador. São utilizados para indicar ao compilador ou interpretador as conversões necessárias para obter os valores em memória durante a construção do programa. Por outro lado, ajudam também o programador a detectar eventuais erros (maioritariamente sintáticos).

Dependendo da
linguagem de programação, o tipo de um dado é verificado diferentemente, de acordo com a análise léxica, sintática e semântica do compilador ou interpretador da linguagem. Os tipos têm geralmente associações com valores na memória ou com objetos (para uma linguagem orientada a objeto) ou variáveis.
Tipos de dados não-definidos em termos de outros tipos são chamados tipos de dados primitivos. Praticamente todas as linguagens de programação oferecem um conjunto de tipos de dados primitivos.Alguns tipos de dados primitivos são reflexos do hardware


Por exemplo: os inteiros

Outros exigem um pequeno suporte de software para sua implementação.
Os tipos de dados primitivos são aqueles que não podem ser decompostos, por exemplo: inteiro, real, lógico e caracter.

Dados Primitivos

Dados primitivos típicos incluem caracter, inteiro (representa um sub-conjunto dos números inteiros, com largura dependente do sistema; pode possuir sinal ou não), ponto flutuante (representa o conjunto dos números reais), booleano (lógica booleana, verdadeiro ou falso) e algum tipo de referência (como ponteiro ou handles).
Dados primitivos mais sofisticados incluem
tuplas, listas ligadas, números complexos, números racionais e tabela hash, presente sobretudo em linguagens funcionais.
Espera-se que operações envolvendo tipos primitivos sejam as construções mais rápidas da linguagem.

Por exemplo, a adição de inteiros pode ser feita com somente uma instrução de máquina, e mesmo algumas CPUs oferecem instruções específicas para processar sequências de caracteres com uma única instrução. A maioria das linguagens não permite que o comportamento de um tipo nativo seja modificado por programas. como exceção, Smalltalk permite que tipos nativos sejam estendidos, adicionando-se operações e também redefinindo operações nativas.


A cada variável está associado um Tipo de Dados. O tipo de dados define quais os valores que a variável pode conter. Se, por exemplo, dissermos que uma variável é do tipo Inteiro, não poderemos colocar um valor Real ou um Caracter.
Antes de começarmos a utilizar uma variável, temos que declarar qual o seu tipo. Tal é feito do seguinte modo:

: Tipo;

Neste caso estamos a declarar que a variável var, é do tipo Tipo. Se tivermos várias variáveis do mesmo tipo podemos junta-las numa só declaração:

, var2, var3: Tipo;

Ao declararmos o tipo de dados de uma variável, estamos a definir, não só, o tipo de valores que esta pode conter, mas também quais as operações que com elas podemos realizar.
Para já vamos considerar os seguintes tipos de dados: Flutuande, STR, Inteiro, Real, Caractere, Lógico

Tipos de dados primitivos:


Ponto Flutuante - Modelam os números reais, mas são aproximações
Linguagens para fins científicos suportam pelo menos dois tipos ponto flutuante (float e double)

Tipo de dados STR - tipo de dados STR corresponde a seqüências de caracteres e é utilizado para representar texto. Os valores do tipo STR são representados entre apóstrofes ou entre aspas:

Exemplo: 'Ola Mundo!' / ``Ola! Como passa?''


Inteiro - Qualquer valor pertencente ao conjunto dos números inteiros Z: { ..., -2, -1, 0,1, 2, ...


Exemplo: Ele tem 15 irmãos. / A temperatura desta noite será de -2 graus centígrados.

Real - Qualquer valor pertencente ao conjunto dos números reais R: { ..., -2, ..., -1.9, ..., 0, ..., 1.4,..., 12.5, ...}


Exemplo: Ela tem 1.73 metro de altura. / Meu saldo bancário é de R$ 121,07.

Caractere - Qualquer conjunto de caracteres (A, B, ..., !, &, ' , +, \, ?, ^,... ) entre aspas.:


Exemplo: Constava na prova: "Use somente caneta!". / O parque municipal estava repleto de placas: "Não pise na grama".


Lógico - Representa dois estados possíveis: V (Verdadeiro) ou F (Falso).


Exemplos: A porta pode estar aberta ou fechada. / A lâmpada pode estar acesa ou apagada.

Aplicação EmLinguagens:


C e C++
- Não primitivo
Usam vetores char e uma biblioteca de funções que oferecem operações (string.h)

SNOBOL4 - (uma linguagem de manipulação de cadeias)
Primitivo
Muitas operações, incluindo pattern matching elaborados

Java - Primitivo através da classe String

Pascal - A linguagem Pascal oferece 6 tipos de dados abstratos[1][1] primitivos. Para cada um destes tipos, há um limite de valores que eles podem assumir e um conjunto de operadores que os manipulam ou permitem que eles sejam convertidos ou utilizados em conjunto com os outros tipos.

Os tipos que a linguagem oferece são: INTEGER, BYTE, REAL, BOOLEAN, CHAR e STRING. Destes, os tipos Byte e String não constavam na definição inicial do Pascal e podem não ser encontrados em alguns compiladores.

Integer: armazenam números inteiros (naturais) cujos valores estejam entre –(MAXINT+1) e MAXINT. MAXINT é uma constante predefinida que pode variar de sistema para sistema ou de compilador para compilador. No ambiente Turbo Pascal, por exemplo, MAXINT vale 32768. Isto significa que os números neste compilador variam entre -32767 a 32768 e ocupam dois bytes (16 bits, que geram 65536 combinações possíveis de armazenamento);

Byte: subconjunto do tipo Integer que armazena valores entre 0 e 255. Este tipo ocupa 1 byte (8 bits, que geram 256 combinações);

Real: esse tipo armazena números reais positivos e negativos (incluindo frações). No turbo Pascal este tipo ocupa 6 bytes de memória (48 bits), mas o número não é armazenado como nos outros tipos. Neste caso, o número é armazenado num formato conhecido por formato científico, onde ele é dividido em duas partes: a mantissa e o expoente. A mantissa contém números significativos do numero real automaticamente normalizadas pelo computador para um valor fracionário na faixa entre 1 e 10. O expoente é um valor inteiro positivo ou negativo que indica a posição da vírgula no número. Para calcular o número armazenado, deve-se aplicar a seguinte fórmula (isso é feito automaticamente pelo computador):
número = mantissa * 10expoente

Veja o exemplo de alguns números:

10.45 = 0.1045*10^+2 ou 1.0450000000E+01
0.00056993 = 0.56993*10^-3 ou 5.6993000000E-04

Esse tipo de representação pode ocasionar alguns erros ou perdas, principalmente quando se está calculando números com muitas casas decimais
ou muito grandes, pois se o número de casas de uma soma, por exemplo, ultrapassar o número máximo de casas que o computador usa para armazenar o número, ele será arredondado.

Char: abreviação da palavra inglesa “character”, que significa caractere. Como o próprio nome indica, serve para armazenar um único caractere (uma letra, dígito ou símbolo). Ocupa 1 byte de memória, o que significa que pode armazenar 256 combinações de bits. Esse é exatamente o tamanho da tabela Americana de Códigos Padrão para a Troca de Informações (ASCII), que contém uma lista de 256 caracteres que variam entre caracteres de controle, letras, dígitos e símbolos. Cada um deles possui um código (um número) fixo. Através do número é possível se descobrir o caractere correspondente na tabela e vice-versa.

String: Armazena cadeias de caracteres. No fundo é o mesmo que um vetor de Chars, cujo tamanho máximo é o de 255 caracteres. Possui um byte (na posição 0) que indica quantas letras a string possui armazenada dentro dela;

Boolean: armazena valores lógicos que variam entre “true” (verdadeiro) ou “false” (falso). São muito utilizadas em variáveis do tipo flag e em testes condicionais.

Um tipo é dito abstrato quando sua faixa de valores e seus operadores (ou relações) com os outros tipos (ao menos primitivos) são definidos. Desta forma, podemos através do tipo pensar em todas as suas propriedades sem que ele (o objeto) realmente exista. Podemos assim, usá-los ou raciocinar sobre eles sem precisarmos saber como eles e suas operações são realmente implementados no computador.

Opções de Tamanho:

Estático
COBOL, FORTRAN 90, Pascal, Ada e Java classe String

Tamanho dinâmico limitado: C e C++
Um caractere especial é usado para indicar o final da cadeia, em vez de manter seu tamanho

Dinâmico (sem máximo): SNOBOL4, Perl, JavaScript

Implementação de Cadeias de Caracteres:
Tamanho estático
descritor em tempo de compilação
Tamanho dinâmico limitado
Podem exigir um descritor em tempo de execução para armazenar tanto o tamanho máximo como o tamanho atual (mas não em C e C++)
Tamanho dinâmico
Exigem um descritor em tempo de execução
Exigem um gerenciamento de armazenagem mais complexo
Alocação e desalocação




Outros Tipo Especiais:

Vetores (array com uma dimensão)

Matrizes (array com n dimensões)

Ponteiros

Referências

Registros (estruturas)


Referências Bibliográficas:


http://www.di.uminho.pt/~jfc/ensino/SebentaLEP/node12.html
http://www.leandro.wives.nom.br/pascal/Apostila/Tipos%20primitivos.htm
http://200.136.79.4/informatica/alunos/tutoriais/Algoritmos_Programacao/tipos_primitivos.html
http://www.pawfal.org/fluxus/docs/0.15/pt/dados-primitivos.html
http://www.macoratti.net/net_tpdt.htmhttp://si.uniminas.br/~mauro/SIS05/Tipos-JAVA.pdf

8 comentários:

  1. Gostaria de saber o que é pattern matching.
    A postagem ficou bem explicativa.
    Parabéns

    ResponderExcluir
  2. Respondendo a sua curiosidade Rafael ai vai uma breve explicaçao de Pattern Matching
    Quando falamos de pattern matching, o segredo por trás é a decomposição estrutural, pela qual os casamentos são realizados. Erlang e Scala são exemplos de linguagens que suportam esse recurso. Sua principal utilidade está em expressar uma série de condicionais de maneira muito mais simples e clara que usando operadores tradicionais. O porém fica pelo fato de sua operação ser muito mais interessante quando usamos tipos algébricos que para objetos, então não é nada simples integrar com um linguagem OO.O pattern-matching, este é usado dentro de módulos, isolado do programa principal, ou até mesmo no próprio programa principal, mas como um meio de organizar dados obtidos por entrada e os dados de módulos: não há problema de flexilidade nem de extensibilidade, e a técnica se ajusta muito bem para este uso.

    ResponderExcluir
  3. bakana postagem...bem explicativa..só fiquei com uma dúvida o ponteiro é um tipo primitivo de dado ou não?
    vlw galera
    ^^

    ResponderExcluir
  4. Legal a postagem de vocês, foi direto ao assunto mesmo. Mas também tnho a mesma dúvida que Henrique tem, em relação do ponteiro ser ou não um tipo primitivo, e ainda também em relação ao vetor, onde tenho a mesma dúvida!!!
    Mas no mais, bacana demais.....

    ResponderExcluir
  5. Tbm achei que a postagem foi bastante explicativa, mas fiquei com a mesma dúvida do Henrique e do André...sobre o ponteiro..
    Parabens!

    ResponderExcluir
  6. bom agora deu pra entender
    melhor sobre alguns erros.

    ResponderExcluir
  7. Muito boa a postagem, então podemos comparar dados primitivos a tipificaçãod de variáveis?
    Parabens!!

    ResponderExcluir
  8. Como o próprio título diz Dados Primitivos,primitivos mesmo, onde se iniciou as dúvidas lá em ATP. Mas muito tranquilo, e depois de uma postagem dessa ficou mais o que já estava tranquilo ficou mais tranquilo ainda.
    Parabéns Galera pela postagem!!!

    ResponderExcluir