2. Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular
7. Tipos
Diferentes linguagens suport diferente tipos de dados.
Ada: booleans, characters, enumerands, integers, real numbers, records, arrays,
discriminated records, objects (tagged records), strings, pointers to data, pointers to
procedures.
C: enumerands, integers, real numbers, structures, arrays, unions, pointers to variables,
pointers to functions.
Java: booleans, integers, real numbers, arrays, objects.
Haskell: booleans, characters, integers, real numbers, tuples, disjoint unions, lists, tipos
recursivos.
8. Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
9. Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
10. Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
11. Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
Boolean {true, false}, Operações: and, or, not, etc
12. Tipos
Tipo é um conjunto de valores:
v é um valor de tipo T se v Є T.
E é uma expressão de tipo T se E leva a um valor do tipo T.
Um tipo é um conjunto de valores que exibe um
comportamento uniforme sob operações associadas a este
conjunto.
Boolean {true, false}, Operações: and, or, not, etc
{15, true, azul} é um tipo?
15. Tipos primitivos
Valores primitivos são aqueles cujos valores são atômicos –
não podem ser decompostos em valores mais simples.
Tipo primitivo é onde os valores são primitivos.
Toda linguagem de programação possui tipos primitivos, e
algumas permitem definir novos.
17. Tipos primitivos - cardinalidade
#Boolean = 2
#Character = 128 (ASCII), 256 (ISO-Latin), or 32768 (Unicode)
#Integer = max integer – min integer + 1
Note: Em algumas linguagens (ex. C), booleans e characters
são inteiros.
18. Criando tipos primitivos
Em Ada é possível definir novos tipos .
●Declaração:
type Population is range 0 .. 1000;
●Conjunto de valores:
Population = {0, 1, …, 1000}
●Cardinalidade:
#Population = 1001
19. Criando tipos primitivos
Em diversas linguagens é possível definir tipos de dados
enumeráveis.
C:
enum Cor { VERMELHA, PRETA };
Ada:
type Color is (VERMELHA, PRETA );
Haskell
data Color = Vermelha | Preta
20. Tipos Compostos
Um valor composto ou estruturado é quando o seu valor é
composto a partir de valores mais simples.
Tipo composto é um tipo cujos valores são compostos.
Linguagens de programação (LP) suporta uma grande
variedade deles.
23. Produtos Cartesianos
struct Point {
x,y: double;
};
structures (C)
type Point is record
x: Double;
y: Double;
end record;
Records (Ada)
type Point = (Double,Double)
tuplas (Haskell)
class Point:
x = 0;y =0;
Class (Python)
24. Produtos Cartesianos - ADA
type Month is (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
type Day_Number is range 1 .. 31;
type Date is record
m: Month;
d: Day_Number;
end record;
someday: Date := (jan, 1);
…
put(someday.m+1); put("/"); put(someday.d);
someday.d := 29; someday.m := feb;
25. Produtos Cartesianos -Haskell
someday = (jan, 1)
(m,d) = someday
anotherday = (m + 1, d)
Valores:
data Month = Jan | Feb | Mar | Apr
| May | Jun | Jul | Aug
| Sep | Oct | Nov | Dec
type Date = (Month, Int)
Date = Month X Integer
= {Jan, Feb, …, Dec} X {…, –1, 0, 1, 2, …}
Uso:Declarações:
26. Produtos Cartesianos
class Point {
public:
Point (double x, double y);
double x() { .. }
double y() { .. }
private:
double x,y;
};
28. Uniões disjuntas
union {
int exact;
float inexact;
};
Union em C
data Number = Exact Int
Inexact Float
Tipos algébricos em Haskell
type Accuracy is (exact, inexact);
type Number (acc: Accuracy := exact) is record
case acc of
when exact => ival: Integer;
when inexact => rval: Float;
end case;
end record;
Ada
29. Unions e cartesianos
typedef enum { int_t, float_t ,string_t} TYPE;
union m_value {
int int_value;
float float_value;
char* str_value;
} ;
struct symbol {
const char* name;
union m_value* val;
TYPE t;
};
32. Array - Ada
type Color is (red, green, blue);
type Pixel is array (Color) of Boolean;
p: Pixel := (true, false, true);
c: Color;
…
p(c) := not p(c);
33. Array - Ada
Pixel = Color -> Boolean = {red, green, blue} -> {false, true}
viz: {red -> false, green -> false, blue -> false}
{red -> false, green -> false, blue -> true}
{red -> false, green -> true, blue -> false}
{red -> false, green -> true, blue -> true}
{red -> true, green -> false, blue -> false}
{red -> true, green -> false, blue -> true}
{red -> true, green -> true, blue -> false}
{red -> true, green -> true, blue -> true}
#Pixel = (#Boolean)#Color
= 23
= 8
38. Números Naturais - Haskell
data Nat = Zero | Succ Nat deriving (Show)
soma :: Nat -> Nat -> Nat
soma Zero n = n
soma (Succ m) n = Succ (soma m n)
mult :: Nat -> Nat -> Nat
mult Zero m = Zero
mult (Succ m) n = soma n (mult n m)
40. Tipos Recursivos - Lista - Haskell
data IntList = Nil | Cons Int IntList
>Nil
>Cons 2 (Cons 3 (Cons 5 (Cons 7 Nil)))
[Int] [String] [[Int]]
[] [2,3,5,7]["cat","dog"][[1],[2,3]]
41. Strings
● Seqüência de 0 ou mais caracteres.
● Não existe consenso sobre sua classificação.
● Strings são tipos primitivos ou compostos?
● Python, ML, Lua são tipos primitivos
● Em Haskell é uma lista de caracter
● Em C, vetor de caracter.
● Java trata strings como objetos da classe String.
48. Erro de tipos
●É a aplicação de um operador a um operando de um tipo
inapropriado
○Atribuir um int para uma função que espera um float nas
primeiras versões de C
●Se todas as vinculações de variáveis a tipos forem estáticas
na linguagem, a verificação de tipos pode ser feita toda em
tempo de compilação
●Em linguagens dinâmicas (JavaScript, PHP) isso só pode
ser feito em tempo de execução