Paradigmas de
Linguagens de Programação
Valores e Tipos
(Values and Types)
Rodrigo Rocha
[email protected] http://cin.ufpe.br/~rgcr
Universidade Federal da Paraíba – Campus IV (Rio Tinto – PB)
PLP – Valores e Tipos
00 - 30
Um valor é qualquer entidade que pode ser manipulada por
um programa.
Valores podem ser:
Avaliados; Armazenados;
Passados como parâmetros;
Retornados como resultado de funções; Etc.
PLP – Valores e Tipos
00 - 30
Diferentes Linguangens suportam diferentes tipos de valores:
C suporta inteiros, numeros reais, estruturas, arrays, uniões,
ponteiros de variáveis e ponteiros de funções;
C++ os valores de C e mais objetos;
Java suporta booleanos, inteiros, reais, arrays, objetos; Ada suporta booleanos, caracteres, enumeração, inteiros,
reais,
PLP – Valores e Tipos
O que é um tipo?
a resposta mais óbvia, talvez, é que um tipo é um conjunto de
valores.
Um tipo é um conjunto de valores que exibem um comportamento
uniforme sob operações que podem ser realizadas sobre estes valores.
{15, true, azul} é um tipo?
PLP – Valores e Tipos
Classificação de Tipos
Primitivos Compostos Recursivos
PLP – Valores e Tipos
00 - 30
Tipos Primitivos
São aqueles cujos valores são atômicos– não podem ser
decompostos em valores mais simples.
São aqueles tipos de informação mais usuais e básicos. Exemplos:
– boolean = {true, false} – integer = { ..., -2, -1, 0, 1, 2, ... } – real = { ..., -1.0, ..., 0.0, ... –1 .0, ... } – char = { ..., ́a ́, ́b ́, ..., ́* ́, ... }
PLP – Valores e Tipos
00 - 30 Tipos PrimitivosOs tipos primitivos já são definidos na própria LP. Em Java – byte: {-128, ... ,127} – short: {-32768, ... ,32767} – int: {-2 147 283 648, ... ,2 147 283 647} – long: {-9 223 372 036 854 775 807, ... ,9 223 372 036 854 775 807}
PLP – Valores e Tipos
00 - 30 Tipos Primitivos Linguagens diferentes podem usar sintaxes diferentes:
Boolean, Integer, Real (PASCAL) bool, int, real (ML)
boolean, int, double, char (JAVA)
PLP – Valores e Tipos
00 - 30
Tipos Compostos:
Um tipo composto pode ser construído em uma linguagem de
programação a partir de tipos primitivos e de outros tipos compostos, em um processo chamado composição.
Tipos compostos ou estruturados são tipos cujos valores são compostos a partir de valores mais simples
Classificação:
– Produto cartesiano (tuplas e registros) – Mapeamentos (arrays e funções)
– Uniões disjuntas (registros variantes e objetos) – Conjuntos potência (conjuntos)
– Tipos recursivos (estruturas de dados dinâmicas, listas)
PLP – Valores e Tipos
Produto cartesiano :
Por meio do produto cartesiano, valores de dois tipos (possivelmente
diferentes) são emparelhados.
Sejam S e T dois tipos quaisquer. O produto cartesiano S x T é
definido como:
S x T = { (x,y) | x in S; y in T }
PLP – Valores e Tipos
Produto cartesiano :
Na Matemática, dados dois conjuntos X e Y, o produto cartesiano (ou produto direto) dos dois conjuntos (escrito como X × Y) é o conjunto de todos os pares ordenados cujo primeiro elemento pertence a X e o segundo, a Y.
Por exemplo, se o conjunto X é o dos treze elementos do baralho inglês X = {A,K,Q,J,10,9,8,7,6,5,4,3,2}
e o Y é o dos quatro naipes: Y = {♠, ♥, ♦, ♣}
Então o produto cartesiano desses dois conjuntos será o conjunto com as 52 cartas da baralha:
00 - 30 Produto cartesiano : 00 - 30 Produto cartesiano :
PLP – Valores e Tipos
00 - 30 type Dia : 1..31;type Mês = (jan, fev, mar, abr, mai, jun, jul, ago, set,out, nov, dez);
type Data = record d : Dia; m : Mes; end
var niver : Data; niver.d = 18; niver.m := jul;
Produto cartesiano em Pascal :
PLP – Valores e Tipos
00 - 30
enum mes{jan, fev. mar, abr, mai, jun, jul, ago, set,out,nov, dez}; typedef struct { Mes m; byte d; } Tdata; Main() { Tdata.mes = jan; Tdata.dia = 3; } Produto cartesiano em C :
PLP – Valores e Tipos
typedef struct { Dia dia; Mês mes } Tdata; Main() { tloja.dia = 3; tloja.mes = fev; } Produto cartesiano em C :PLP – Valores e Tipos
Produto cartesiano, exemplos :
//C/C++/C# struct Racional{
int numerador, denominador; }
{ Pascal} Racional: record
numerador, denominador: integer; end;
//C++/Java class Racional{
int numerador, denominador; }
PLP – Valores e Tipos
00 - 30
Mapeamento:
Define uma função de mapeamento de um conjunto para outro. Aplica uma função no domínio A para obter um valor de um domínio B Arrays são encontradas em todas as linguagens OO e Imperativas (C,
Pascal, etc.)
Mapeamento também podem ser representados por funções.
PLP – Valores e Tipos
00 - 30
Mapeamento:
m : S→ T
Nós escrevemos que m é um mapeamento de S para T. Em outras palavras, m mapeia cada valor de S para os valores de T
S = {u, v} to T = {a, b, c}
PLP – Valores e Tipos
00 - 30
Mapeamento
Quantos mapeamentos acima?
PLP – Valores e Tipos
00 - 30
type Cor = (vermelho, verde, azul); Pixel = array [Integer] of Cor; var x : pixel; ... x[0] := azul; x[1] := verde; x[2] := vermelho; array [S] of T Integer -> cor Mapeamento em Pascal :
PLP – Valores e Tipos
Mapeamento em Pascal :function par (n : integer) : boolean; begin
par := (n mod 2 = 0) end;
integer -> boolean
function qualquer(b : Real, n : integer) boolean; begin
... end;
Real x integer -> boolean
PLP – Valores e Tipos
Uniões Disjuntas:
Na união disjunta os valores são escolhidos de dois tipos
(normalmente diferentes).
Um valor é escolhido de entre um dos vários (normalmente diferentes)
conjuntos.
Os valores da união disjunta consiste em uma tag em conjunto com
uma variante escolhida a partir de qualquer conjunto S ou conjunto T.
00 - 30
Uniões Disjuntas:
00 - 30
Uniões Disjuntas:
Exemplo de com Ada, registros discriminados:
type Media = (exata, aprox); AlunoPLP = record
nome : String; matricula : Integer; case med : Media of
exata : (notaInt : integer); aprox : (notaReal : real) end;
{..., exata (–1), exata 0, exata 1, ...} U { aprox (-1.0), ..., aprox (0.0), ..., aprox (1.0), ...}
var valor : Integer; var joao : AlunoPLP; ...
joao.med = exata; joao.notaInt = 7;
PLP – Valores e Tipos
00 - 30
Uniões Disjuntas:
Exemplo com Objetos em Java: Class Point {
Private float x,y; ... //métodos }
Class Circulo extends Point { Private float r; ... //métodos }
Class Retangulo extends Point { Private float w,h; ... //métodos }
PLP – Valores e Tipos
00 - 30 Uniões Disjuntas:Exemplo com Objetos em Java:
A classe Circulo é uma subclasse da Classe Point, então os objetos circulos herdam os componentes x e y, além, de ter normalmente o seu próprio componente r.
A classe retângulo é outra subclasse da Classe Point, então os objetos circulos herdam os componentes x e y, além, de ter normalmente os seu próprios componentes w e h.
PLP – Valores e Tipos
Uniões Disjuntas:
Exemplo com Objetos em Java: O conjunto de objetos desse programa é:
- Point (Float X Float) - Circulo (Float X Float X Float) - Retangulo (Float X Float X Float X Float)
PLP – Valores e Tipos
Conjunto Potência
Conjunto potência é o conjunto de todos os subconjuntos de
determinado conjunto.
Permite a geração de subconjuntos de valores, a partir de um conjunto
PLP – Valores e Tipos
00 - 30
Conjunto Potência
Pascal é a única LP que suporta diretamente conjuntos. Exemplo:
type Cor = (vermelho, verde, azul); matiz = set of Cor; ... var c : matiz; c := {vermelho}; c := {verde,azul};
PLP – Valores e Tipos
00 - 30 Tipos Recursivos:Um tipo recursivo é aquele cujos valores são compostos por valores
do mesmo tipo.
Um tipo recursivo é definido em termos dele próprio
Exemplo: Listas
PLP – Valores e Tipos
00 - 30
Tipos Recursivos:
Um exemplo é uma lista em Haskell:
data List a = Nil | Cons a (List a)
Isso indica que uma lista de a ou é uma lista vazia ou um elemento a
(a cabeça da lista) seguido de uma lista de a (a cauda da lista).
PLP – Valores e Tipos
00 - 30
Tipos Recursivos:
Em linguagens como PASCAl e C, tipos recursivos são implementados
através de apontadores. Exemplo: Struct nodo { Int elemento; Struct nodo* ptr; }
PLP – Valores e Tipos
Strings Sequência de carateresNão existe consenso sobre sua classificação
Tipos primitivos (ML, Java)
Arrays de Caracteres (Adam Pascal e C) Lista de Caracteres (Miranda e Prolog)
PLP – Valores e Tipos
Expressões:
Trecho do programa que pode ser avaliado resultando num valor. Expressões podem ser formadas de várias formas
Tipos de expressão: - Literal - Agregado - Chamada de Função - Expressão Condicional - Constante e variáveis de acesso
00 - 30
Expressões:
Literais
- Valores fixos de algum tipo. Exemplo: 0,1, 'a', 'Joao', 3.14 (Constantes)
Construções (Agregados)
- Expressão que constrói um valor composto a partir de seus valores componentes.
Em ML, um registro:
- { y = esseano +1, m =“jan”, d = 1}
00 - 30
Expressões:
Em Pascal, não existem construções para registros e arrays, só para
conjuntos - Em Pascal: novodia.a := esseano + 1; novodia.m := jan; novodia.d := 1; - Em ADA:
novodia := (a => esse ano + 1, m => jan, d => 1);
PLP – Valores e Tipos
00 - 30
Expressões:
Chamadas de Funções
- Computa um valor aplicando uma função a argumentos - f(P)– P é um parâmetro real (pode ser uma expressão)
Em ML:
- (if ... then sin else cos) (x)
Em C - soma (5,5); Em Java - p.inserir(20); Em Python - soma(3,4)
PLP – Valores e Tipos
00 - 30 Expressões: Expressões Condicionais- São formadas por várias sub-expressões, das quais apenas uma é escolhida para ser avaliada.
- f(P)– P é um parâmetro real (pode ser uma expressão)
Linguagens como ML: - if x > y then x else y case mes of “Fev” => ... | “Mar” => ... | “Abr” => ... | “Dez” => ...
PLP – Valores e Tipos
Expressões: Expressões Condicionais- C, C++, Java e Python utilizam expressões-if
PLP – Valores e Tipos
Expressões:
Acessos a constantes e variáveis
em Pascal
const pi = 3.1416; - var r: real; em C:
#define max 40 - int a = 3; em Java:
public final int dez=10; - int z = 0; Em Python
PLP – Valores e Tipos
00 - 30
Expressões:
Acessos a constantes e variáveis
em Python: z = "global" def func_1(): global x x = "global" y = "local" def func_2(): print x print z func_1() func_2()
PLP – Valores e Tipos
00 - 30 Overview:Tipoes de valores que são usados como dados nas linguagens de
programação
Tipos primitivos, compostos e recursivos
Expressões, que são construtores de programas que computam novos
valores.
Próximo passo, verificar como valores podem ser armazenados.
PLP – Dúvidas
00 - 30