Escolar Documentos
Profissional Documentos
Cultura Documentos
Tipos de Dados
• Introdução
• Tipos Primitivos
• Tipos Compostos
INTRODUÇÃO
Linguagens de Programação
Introdução
Linguagens de Programação
Tipos Primi6vos
– Inteiro
– Ponto flutuante
– Complexo
– Decimal
– Lógico (boolean)
– Caractere
– Cadeia de caracteres (string)
– Tipo ordinal (enumerado e intervalo de inteiros)
Tipo Inteiro
Tamanho Intervalo
Tipo
(bits) 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
Tipo Ponto Flutuante
• Vantagem: acurácia
• Desvantagem: faixa limitada, desperdício de memória
• Vantagem: Legibilidade
• Exemplos
– C++ (bool), Java (boolean)
– C: não possui o tipo booleano, mas aceita expressões em
condicionais
• ¹ zero Þ verdadeiro
• = zero Þ falso
Tipo Caractere
• Decisões de projeto
– Tipo primitivo ou arranjo?
– Tamanho da string estática ou dinâmica?
• C/C++
– Não é primitivo
– Usa arranjos de char e biblioteca de funções para operações
• Java
– Primitivo através da classe String
Tipo Cadeia de Caracteres (String)
• Perl
– Padrões podem ser definidos em termos de expressões
regulares
– Grande poder de expressão
– Exemplo: palavras contendo unicamente letras
if ($dados =~ /[A-Za-z]+/)
print ‘Somente letras’;
Implementações de Strings
• Avaliação
• Exemplos
– Pascal
type cor = (vermelho, azul, branco, preto);
– C, C++
enum cor { vermelho, azul, branco, preto };
• Considerações de projeto
• Vantagens
– Legibilidade
• Ex: não precisa codificar cores como inteiros
– Confiabilidade
• Não permite que se opere cores (soma)
• Não se pode definir valores fora da faixa da enumeração
• Ada, C# e Java >= 5.0 não fazem coerção para inteiros
Tipo Ordinal: Intervalo de Inteiros
• Exemplo
– Pascal
type positivo = 0 .. MAXINT;
– ADA
type Days is (mon, tue, wed, thu, fri, sat, sun);
subtype Weekdays is Days range mon..fri;
Tipo Ordinal: Intervalo de Inteiros
• Avaliação
– Melhora legibilidade
– Podem guardar apenas certos valores limitados à faixa
• Melhora confiabilidade
– Detecção de erros e das amplitudes dos valores
Tipo Ordinal: Intervalo de Inteiros
• Implementação
– Tipos enumerados geralmente são implementados associando
números inteiros a cada constante
– Subfaixas são implementadas da mesma forma que os Spos pais
Linguagens de Programação
Tipos Compostos
• Cardinalidade
– Número de valores distintos que fazem parte do tipo
Produto Cartesiano
• Cardinalidade
#(S1 x S2 x ... x Sn) = #S1 x #S2 x ... x #Sn
Produto Cartesiano
struct nome {
struct empregado {
char primeiro[20];
struct nome nfunc;
char meio[10];
float salario;
char sobrenome[20];
} emp;
};
• Exemplo
struct data {
int dia, mes, ano;
};
– Inicialização
struct data d = { 7, 9, 1999 };
– Cardinalidade
#INTEGER x #INTEGER x #INTEGER
Uniões
a b c + b c d = a b c d
S T S+T
• Cardinalidade
#(S1 + S2 + ... + Sn) = #S1 + #S2 + ... + #Sn
Uniões
• Uniões livres
– Pode haver interseção entre o conjunto de valores dos tipos que
formam a união
– Há possibilidade de violação no sistema de tipos
• Exemplo
• Uniões disjuntas
– Não há interseção entre o conjunto de valores dos Spos que
formam a união
– Registros variantes de PASCAL, MODULA 2 e ADA e a union de
ALGOL 68
• Exemplo em Pascal
TYPE Representacao = (decimal, fracionaria);
Numero = RECORD
CASE tag: Representacao OF
decimal: (val: REAL);
fracionaria: (numerador, denominador: INTEGER);
END;
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íveis valores
(25.00, musica(16))
(35.00, livro(257))
(40.00, video(121, TRUE))
– Cardinalidade
#REAL x (#INTEGER + #INTEGER + (#INTEGER x #BOOLEAN))
Mapeamentos
a a
u u
• Cardinalidade
b b
#(S®T) = (#T)#S
v v
c c
S T S
T
Mapeamentos Finitos
a z d r s … f h w o
1 2 3 4 5 … 47 48 49 50
• Exemplo
int mat[5][4];
– Representação
{0, …, 4} x {0, …, 3} ® int
– Conjunto de valores
(#INT)#({0, …, 4} x {0, …, 3}) =
(#INT)#{0, …, 4} x #{0, …, 3} =
(#INT)5 x 4 =
(#INT)20
mat[2][3]
Vetores Multidimensionais
– Indexação
– Inicialização
– Atribuição
– Comparação (igualdade e desigualdade)
– Concatenação
Mapeamentos Através de Funções
• Cardinalidade
#jS = 2#S
Conjuntos Potência
• Operações básicas
– Pertinência
– Contém
– Está contido
– União
– Diferença
– Diferença simétrica
– Interseção
Conjuntos Potência
• Exemplo em Pascal
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*/
Conjuntos Potência
• Exemplo
VAR
S: SET OF [ ’a’ .. 'h' ];
BEGIN
S := ['a', 'c', 'h'] + ['d'];
END;
• Exemplos
class No {
struct No { class No {
public:
int elem; int elem;
int elem;
struct No* prox; No prox;
No* prox;
}; };
};
Em C Em C++ Em Java
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
• Liberação
free(p); // em C
delete p; // Em C++
Ponteiros
int *p;
*p = 10;
*p = *p + 10;
Ponteiros
• Aritmética de ponteiros
p++;
++p;
p = p + 1;
p--;
--p;
p = p - 3;
• Indexação de ponteiros
x = p[3];
Ponteiros Genéricos
• Aritmética de ponteiros
int f, g;
void* p;
f = 10;
p = &f;
g = *p; // erro: é ilegal dereferenciar ponteiro p/ void
• Referências pendentes
– Exemplo 1
int* p = (int*) malloc(10*sizeof(int));
int* q = p;
free(p); // q aponta agora para area de memoria desalocada
– Exemplo 2
int *r; // ponteiro não inicializado
*r = 0;
– Exemplo 3
int *p, x;
x = 10;
if (x) {
int i;
p = &i;
}
// p continua apontando para i, que nao existe mais
Referência
Tipos
Primitivos Compostos
Strings
Enumerados
Inteiros Recursivos
Conjuntos Potência
Ponto Flutuantes
Caracteres Uniões
Produtos Cartesianos
Booleanos Decimais Mapeamentos
Intervalos Ponteiros
Finitos Funções
Livres Disjuntas
ISSO É TUDO, PESSOAL!
Linguagens de Programação