Linguagens de Programação Conceitos e Técnicas

Slides:



Advertisements
Apresentações semelhantes
Listas encadeadas Prof. Rosana Palazon.
Advertisements

1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Robson Godoi / Sandra Siebra
Ponteiros.
Ambiente de Execução - Rotinas
MATA56 Tipos, Verificação de Tipos Agenda Objetivo desta aula: Introduzir os principais aspectos semânticos de variáveis Palavras-chave – nomes.
INE5408 Estruturas de Dados Ponteiros, passagem de parâmetros e modelos de memória.
PROGRAMAÇÃO ORIENTADA A OBJETOS EM C++ Professor: Dilvan Moreira.
INE5408 Estruturas de Dados Alocação Dinâmica de Memória.
Linguagens de Programação Conceitos e Técnicas Valores e Tipos de Dados Prof. Isabel Cafezeiro
Linguagens de Programação Conceitos e Técnicas Comandos Prof. Isabel Cafezeiro
Linguagens de Programação Conceitos e Técnicas Amarrações Prof. Isabel Cafezeiro
Linguagens de Programação Conceitos e Técnicas Variáveis Prof. Isabel Cafezeiro
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Alocação Dinâmica de Memória.
Linguagens de Programação Conceitos e Técnicas Expressões Prof. Isabel Cafezeiro
Estrutura de Dados (DPADF 0056) Aula 7 – Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Linguagens de Programação Conceitos e Técnicas Valores e Tipos de Dados Prof. Isabel Cafezeiro
Linguagens de Programação Conceitos e Técnicas Definições e declarações Prof. Isabel Cafezeiro
Disciplina: Estrutura de Dados Professor: Jeovane Reges Caxias – MA 2015 ACULDADE DE CIÊNCIAS E TECNOLOGIA DO MARANHÃO.
Classes Objetos Atributos Métodos Coletor de Lixo (Garbage Collector ) Confraria do Java Nivelamento. Caroline, Marcelo e Luiz 12/05/2007.
Algoritmos e Programação utilizando Visualg
Estruturas de Dados Aula 2: Estruturas Estáticas
INF1007: Programação 2 8 – Listas Encadeadas
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
VARIÁVEIS EM C Dilvan Moreira.
Linguagens de Programação Conceitos e Técnicas
Vetores e Matrizes em C/C++
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
INF1007: Programação 2 2 – Alocação Dinâmica
INE5408 Estruturas de Dados
INE5408 Estruturas de Dados
INF1007: Programação 2 5 – Tipos Estruturados
Estrutura de Dados Revisão
Introdução à Computação para Engenharia MAC2166
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
INF1007 – Programação 2 9 – Pilhas
Algoritmos e Estruturas de Dados I
Prof. Wellington Franco
INF1007: Programação 2 6 – Ordenação de Vetores
Estruturas de Dados Aula 5: Matrizes
INF1007: Programação Funções Recursivas
Algoritmos e Estruturas de Dados I – Ponteiros
FUNDAMENTO DE PROGRAMAÇÃO
Algoritmos e Estruturas de Dados I
FUNDAMENTO DE PROGRAMAÇÃO
FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO
Departamento de Estatística e Informática
Algoritmos e Programação MC102
Programação de Computadores I – Ponteiros
Listas Encadeadas.
Aula 22 Modularização 22/10/08.
Fundamentos de Programação 1
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS
3.2 Sobrecarga de Métodos (Overloading)
Linguagem de Programação Aplicações Avançadas de Microprocessadores
Programação Orientada a Objetos
Programação Funcional
Programação de Computadores I – Ponteiros
MATEMÁTICA Módulo 08 Conjuntos Numéricos Dé.
Curso básico de PHP. 1 Vantagens: Gratuito Multiplataforma Estável Rapidez Comunicação.
Algoritmos e Estruturas de Dados I – Ponteiros
Estruturas de Dados em C
Estruturas definidas pelo programador
Programação de Computadores LINGUAGEM C – AULA 03 – PROF. WELLINGTON TELLES.
Estruturas de Dados Aula 5: Matrizes 16/03/2015. Matrizes Conjuntos bidimensionais declarados estaticamente float mat[4][3]; acesso de elemento: mat[2][0]
Compilação de Linguagens OO
Fundamentos de Programação 1
CALCULADORA CARACTERE E VARIÁVEIS COMPOSTAS OU VETORES EM JAVA
Compiladores – análise semântica
parâmetros e modelos de memória
Transcrição da apresentação:

Linguagens de Programação Conceitos e Técnicas Valores e Tipos de Dados Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br

Linguagens de Programação Valores & tipos de dados Valor composto: formado a partir de valores mais simples Tipo composto: formado a partir de tipos mais simples

Linguagens de Programação Valores & tipos de dados Tipo composto: seus valores são compostos Produtos Cartesianos Uniões Mapeamentos Tipos Recursivos ...

Linguagens de Programação Valores & tipos de dados Tipo composto: seus valores são compostos Produtos Cartesianos Uniões Mapeamentos Potência Tipos Recursivos Ponteiros ... mas de que maneira estas construções matemáticas se manifestam nas linguagens???....

Linguagens de Programação Valores & tipos de dados Produto Cartesiano Um valor do produto possui um componente de cada um dos tipos originais (S e T)‏ x= a b c d e (b,c) (b,d) (b,e)‏ (a,c) (a,d) (a,e)‏ S T S x T S × T = {(x, y) | x ∈ S e y ∈ T}

Linguagens de Programação Valores & tipos de dados Produto Cartesiano Registros de PASCAL, MODULA 2, ADA e COBOL Estruturas de C, Classes de Linguagens OO

Linguagens de Programação Valores & tipos de dados Produto Cartesiano Em PASCAL: type S = (a,b); T = (c,d,e); P = record prim: S; seg: T; end; var prod: P; Primeiro componente do produto: prod.prim Segundo componente do produto: prod.seg Exemplo de uso: prod.prim := a; prod.seg := c; Componentes nomeados: o programador não precisa lembrar a ordem! ... precisa lembrar o nome !!! Quantos valores distintos prod pode assumir?

Linguagens de Programação Valores & tipos de dados Produto Cartesiano S × T = {(x, y) | x ∈ S; y ∈ T} Operações: Construção de um par a partir de dois valores Seleção de um componente do par Implementação: posições adjacentes de memória acesso pelo par (base, deslocamento)‏ A qualquer momento todos os componentes do valor residem na memória

Linguagens de Programação Valores & tipos de dados Produto Cartesiano S × T = {(x, y) | x ∈ S; y ∈ T} Cardinalidade: #(S1 x S2 x ... x Sn) = #S1x #S2x ...x #Sn #(S x S x ... x S) = #Sn ... e se n = 0 ???.... n vezes o tipo S #S0 = 1 ! Void em C, C++, Java null em ADA

Linguagens de Programação Valores & tipos de dados Uniões: apenas um valor é escolhido dentre os vários conjuntos União livre: o valor pode pertencer a mais de um conjunto União disjunta: o valor pertence a um único conjunto

Linguagens de Programação Valores & tipos de dados União livre: Um valor da União é um valor de um dos tipos originais (S ou T)‏ a b c b c d a b c d S T S + T S + T = { x | x ∈ S ou x ∈ T }

Linguagens de Programação Valores & tipos de dados União livre: Um valor da União é um valor de um dos tipos originais (S ou T)‏ a b c b c d a b c d S T S + T S + T = { x | x ∈ S ou x ∈ T } Admite interseção entre os tipos componentes

Linguagens de Programação Valores & tipos de dados União livre: Em C: union Livre { int S; char T; }; char  int = char

Linguagens de Programação Valores & tipos de dados União livre: Em C: union Livre { int a; float b; } m; int main (void) { m.a = 1; m.b = 1.1; printf("%f \n %d",m.a,m.b); } Erro! Só existe um componente a cada momento!

Linguagens de Programação Valores & tipos de dados União livre S + T = { x | x ∈ S ou x ∈ T } Cardinalidade: #(S + T) = #S + #T - #( S  T ) Operações: Consulta e alteração de elementos Implementação: espaço para alocar o maior componente‏ Há possibilidade de violação do sistema de tipos

Linguagens de Programação Valores & tipos de dados União disjunta: Um valor da União pertence apenas a um dos dos tipos originais (S ou T)‏ a b c b c d S.a S.b S.c T.b T.c T.d S T S + T S  T = { S.x | x ∈ S}  { T.x | x ∈ T }

Linguagens de Programação Valores & tipos de dados União disjunta: Um valor da União pertence apenas a um dos dos tipos originais (S ou T)‏ S  T = { S.x | x ∈ S}  { T.x | x ∈ T } Tag Variante O Tag (rótulo) impede a interseção !!

Linguagens de Programação Valores & tipos de dados União Disjunta: Em Haskell: tipo algébrico Em ADA: registros discriminados Em Pascal: registro variante

Linguagens de Programação Valores & tipos de dados União Disjunta: Em Pascal: TYPE Representacao = (decimal, fracionaria); Numero = RECORD CASE Tag: Representacao OF decimal: (val: REAL); fracionaria: (numerador, denominador: INTEGER); END; var n: Numero; begin n.tag := fracionaria; n.numerador := 5; n.denominador := 10; n.val := 1.2; n.tag := decimal; end. Erro: parte decimal não existe! Perigo: pode destruir valores da parte fracionária!

Linguagens de Programação Valores & tipos de dados União disjunta S  T = { S.x | x ∈ S}  { T.x | x ∈ T } Cardinalidade: #(S + T) = #S + #T Operações: Consulta e alteração de valores e seletor Implementação: espaço para alocar o tag e maior componente‏ Há possibilidade de violação do sistema de tipos

Linguagens de Programação Valores & tipos de dados Mapeamentos: Valores são todas as possíveis maneiras de mapear um conjunto em outro Mapeamento finito: o conjunto domínio é finito Mapeamento através de funções: o conjunto domínio pode não ser finito

Linguagens de Programação Valores & tipos de dados Mapeamentos S → T = { m | se x ∈ S então m(x) ∈ T } u v a b c S T Todas as possíveis maneiras de mapear S em T

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: O tipo domínio é finito e discreto Exemplos: arrays M: (S  T) Em Pascal: type M = array S of T; type A = array [1..50] of char; A: ([1,50]  char) a z d r s … f h w o 1 2 3 4 5 … 47 48 49 50

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: Operações: consulta e alteração de componentes, de todo mapeamento, de parte do mapeamento Pode-se escolher o elemento indexado em tempo de execução.

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Cardinalidade: Implementação: Cálculo do deslocamento em tempo de execução !!! #(S → T ) = #T #S Alocação contígua na memória Par base, deslocamento

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Implementação: Verificação de Índices é dinâmica: PASCAL e JAVA eficiência segurança ausente: C,C++,FORTRAN

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Categoria de Vetor Tamanho Tempo de Definição Alocação Local de Alocação Exemplos Estáticos Fixo Compilação Estática Base FORTRAN 77 Semi-Estáticos Dinâmica Pilha PASCAL, C, MODULA 2 Semi-Dinâmicos Execução ALGOL 68, ADA, C Dinâmicos Variável Heap APL, PERL

Linguagens de Programação Valores & tipos de dados Mapeamentos finitos: S → T = { m | se x ∈ S então m(x) ∈ T } Estáticos (C) void f () { static int x[10]; } Semidinâmicos (Padrão ISO - 1999) void f (int n) { int x[n]; } Semi-Estáticos (C) void f () { int x[10]; } Dinâmicos (APL) A  (2 3 4) A  (2 3 4 15 )

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Os valores são definidos pelos algoritmos Exemplos: Em Java: [int  boolean] boolean positivo (int n) { return n > 0; } Este é um valor do mapeamento !!!

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Os valores são definidos pelos algoritmos O conjunto S não necessita ser finito S → T = { m | se x ∈ S então m(x) ∈ T }

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Os valores são definidos pelos algoritmos Exemplos: Em Java: [int  boolean] palindromo, impar, par, primo Outros valores para o mapeamento [int → boolean]

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Funções como Valores de Primeira Classe Podem ser manipuladas como qualquer outro tipo: criar variáveis criar estrutura de dados atribuir valores passar como parâmetro retornar em função

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Funções como Valores de Primeira Classe > (conta negativo? '(-1 2 3) 0) 1 > (conta negativo? '() 0) > (conta negativo? '(1 2 -3 -4 5 -6) 0) 3 Em Lisp: (define negativo? (lambda (n) (< n 0))) (define conta (lambda (p l c) (cond ((null? l) c ) ((p (car l)) (conta p (cdr l) (+ c 1))) (else (conta p (cdr l) c)))))

Linguagens de Programação Valores & tipos de dados Mapeamentos através de funções: Em C: int negativo (int n) { return n < 0; } int conta (int x[], int n, int (*p) (int) ) { int j, s = 0; for (j = 0; j < n; j++) if ( (*p) (x[j]) ) s++; return s; } main() { int vet[5]; printf ("%d\n",conta(vet,5,negativo)); }

Linguagens de Programação Valores & tipos de dados No free Pascal !!! Em Pascal: type TFuncao = function (x: integer): boolean; Tarray = array [1..5] of integer; function negativo(x: integer): boolean; ... var v: Tarray; begin v[1] := 1; ..., v[5] := -1; WriteLn(Conta(v,5,@negativo)); end. function Conta(vet:Tarray; n:integer; f:TFuncao): integer; var i,soma:integer; begin soma := 0; for i:=1 to n do if f(vet[i]) then soma := soma+1; Conta := soma; end; No free Pascal !!!

Linguagens de Programação Valores & tipos de dados Potência: Valores são todos os subconjuntos de um dado conjunto a b c S {} {a} {b} {c} {a, b} {a, c} {b, c} {a, b, c} S S = {s | s  S}

Linguagens de Programação Valores & tipos de dados Potência: 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*/

Linguagens de Programação Valores & tipos de dados Potência: S = {s | s  S} Cardinalidade: Operações: #(S ) = 2 #S Pertinência Contém Está contido União Diferença Interseção Atribuição Igualdade Desigualdade

Linguagens de Programação Valores & tipos de dados Tipos Recursivos Valores são compostos por valores do mesmo tipo São definidos por uma equação recursiva Exemplo: Listas Tipo Lista  Tipo Lista Vazia + (Tipo Elemento x Tipo Lista) L = null + (T X L)

Linguagens de Programação Valores & tipos de dados Tipos Recursivos Quais são os valores do tipo lista? L = null + (T X L) Seja t  T, null (t,null) (t,(t,null)) (t,(t,(t,null))) ... Qual é o resultado da equação recursiva? Cardinalidade infinita !!!!

Linguagens de Programação Valores & tipos de dados Tipos Recursivos: Linguagens deveriam suportar a definição recursiva.... ... mas normalmente são definidos em termos de ponteiros Em C: struct no { int elem; struct no* prox; }; Em C++: class no { int elem; no* prox; }; Em Java: class no { int elem; no prox; };

Linguagens de Programação Valores & tipos de dados Tipos Recursivos: Implementação: através de ponteiros Em C: struct no { int elem; struct no* prox; }; nil 1 10 100

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Valores são endereços de memória e o valor nil São valores de primeira classe !!!

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Valores são endereços de memória e o valor nil Conceito de baixo nível relacionado com a arquitetura dos computadores (endereçamento indireto do assembly) Considerados o “goto” das estruturas de dados Porque Ponteiros? Eficiência: evita alocação/desalocação automática

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Operações: Atribuição: um ponteiro recebe o endereço apontado por outro Alocação: um ponteiro é associado a uma área de memória Desalocação: a área de memória associada ao ponteiro é liberada Referenciamento: dada uma variável, retorna seu endereço Derreferenciamento: dado o endereço, retorna seu conteúdo

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Operações: Atribuição: um ponteiro recebe o endereço apontado por outro Alocação: Desalocação: Referenciamento: Derreferenciamento: p aponta pra onde q aponta ! Em C: int *p, *q; ... p = q;

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Operações: Atribuição: Alocação: um ponteiro é associado a uma área de memória Desalocação: Referenciamento: Derreferenciamento: Em C: int* p = (int*) malloc (10*sizeof(int));

Linguagens de Programação Valores & tipos de dados Em C: main() { int *p, x; x = 10; if (x) { int i; p = &i; } Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: a área de memória associada ao ponteiro é liberada Referenciamento: Derreferenciamento: Em C: free(p); Desalocação explícita ! Desalocação implícita !

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: Referenciamento: dada uma variável, retorna seu endereço Derreferenciamento: Referenciamento explícito ! Em C: int *p; ... p = &x; a = a+1; Referenciamento implícito !

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Operações: Atribuição: Alocação: Desalocação: Referenciamento: Derreferenciamento: dado um endereço, retorna seu conteúdo Em C: int *p; ... *p = 12; Derreferenciamento explícito !

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Problemas com ponteiros: Baixa Legibilidade: Que estrutura está sendo atualizada? Qual o efeito deste comando? Em C: p->cauda = q; Alterar um ponteiro afeta a estrutura da variável (não somente o seu conteúdo !!!)

Linguagens de Programação Valores & tipos de dados p aponta para quê? Tipos Ponteiros Problemas com ponteiros: Violação do sistema de tipos: Em C: int i, j = 10; int* p = &j; p++; p aponta para quê?

Linguagens de Programação Valores & tipos de dados Tipos Ponteiros Problemas com ponteiros: Objetos Pendentes: Em C: int* p = (int*) malloc (10*sizeof(int)); int* q = (int*) malloc (5*sizeof(int)); p = q; Como acessar a área antes apontada por p?

Linguagens de Programação Valores & tipos de dados q aponta pra onde ? Tipos Ponteiros Problemas com ponteiros: Referências Pendentes: Em C: int* p = (int*) malloc(10*sizeof(int)); int* q = p; free(p); q aponta pra onde ?

Linguagens de Programação Valores & tipos de dados p aponta pra onde ? Tipos Ponteiros Problemas com ponteiros: Referências Pendentes: Em C: main() { int *p, x; x = 10; if (x) { int i; p = &i; } p aponta pra onde ?

Linguagens de Programação Valores & tipos de dados Tipos Referência Valores são endereços das células de memória Em Java: Todas as variáveis que não são de tipos primitivos em JAVA são do tipo referência

Linguagens de Programação Valores & tipos de dados Tipos Referência Reference Semantics: Em Java: class Data { int d, m, a; public Data (int d, int m, int a) { . . . } } 25 12 2005 1 1 2000 dataR dataS Data dataR = new Data(25,12,2005); Data dataS = new Data(1,1,2000);

Linguagens de Programação Valores & tipos de dados Tipos Referência Reference Semantics: comparação do endereço, e não do valor!!! Data dataR = new Data(25,12,2005); Data dataS = new Data(25,12,2005); 25 12 2005 25 12 2005 dataR = dataS ? dataR Não !!! dataS