INF 1007 Programação II



Documentos relacionados
Métodos Computacionais. Tipos Abstratos de Dados

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Programação II. Módulos, Encapsulamento e TADs. Bruno Feijó Dept. de Informática, PUC-Rio

Tipos Abstratos de Dados TADs

INF 1007 Programação II

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

INF 1620 P1-10/04/02 Questão 1 Nome:

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Linguagem C: Árvores Binarias

SCC 202 Prova 1. 28/9/2010 Resolução e Comentários

INF 1007 Programação II

Tipos Abstratos de Dados (TAD)

Métodos Computacionais. Fila

Guia Rápido: GCC, Makefile e Valgrind.

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

INF 1005 Programação I

INF 1007 Programação II

CIÊNCIA DA COMPUTAÇÃO PROVA PARA TRANSFERÊNCIA

Aula 3 Alocação Dinâmica

Introdução a Computação

INF 1005 Programação I

Filas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Métodos Computacionais. Árvores

Aula 1 Tipo Abstrato de Dados

Introdução a Programação de Jogos

Técnicas de Programação I

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Pilhas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

TAD: Tipo Abstrato de Dados (parte 2)

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

TAD: Tipo Abstrato de Dados (parte 2)

POO Programação Orientada a Objetos. Classes em Java

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

Exemplo Tipos Abstratos de Dados TADs Disciplina: Semestre: Turma: Professor: Renata de Matos Galante matricula nome

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Busca. Pesquisa sequencial

Registros. Técnicas de Programação. Rafael Silva Guimarães

Figura 13.1: Um exemplo de árvore de diretório.

struct LISTA item quant

Programação Orientada a Objetos em Java

10. Listas Encadeadas

Trabalho 3: Agenda de Tarefas

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

17 - Funções e Procedimentos em C Programação Modular

Fundamentos de Programação

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Técnicas de Programação II

INF 1007 Simulado P2 Nome: Instruções

Introdução a POO. Introdução a Linguagem C++ e POO

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Estruturas de Dados Aula 15: Árvores 17/05/2011

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Tipos de Dados Simples

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

Conceitos de Linguagens de Programação

INF 1620 P2-01/11/03 Questão 1 Nome:

Capítulo 2: Introdução à Linguagem C

Tipo de Dados em Linguagem C

Programação II. Tipos Estruturados. Bruno Feijó Dept. de Informática, PUC-Rio

DAS5102 Fundamentos da Estrutura da Informação

Introdução à Programação

Filas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Tipo Abstrato de Dados

Métodos Computacionais. Tipos Estruturados

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

2ª Lista de Exercícios

Pesquisa Sequencial e Binária

Estruturas (registros)

Programação científica C++

Orientação a Objetos com Java

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

9. Tipos Abstratos de Dados

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Estruturas de entrada e saída

Transcrição:

INF 1007 Programação II Aula 12 Tipos Abstratos de Dados Edirlei Soares de Lima <elima@inf.puc-rio.br>

Tipo Abstrato de Dados (TAD) Um TAD define: Um novo tipo de dado; O conjunto de operações para manipular dados desse tipo; Um TAD facilita: A manutenção e a reutilização de código; A implementação das operações de TAD não precisa ser conhecida; Para utilizar um TAD é necessário conhecer a sua funcionalidades, mas não a sua implementação; Um TAD possui: Uma interface definindo o nome e as funcionalidades do TAD; Uma implementação contendo a real implementação das funcionalidades do TAD;

Tipo Abstrato de Dados (TAD) Exemplo: TAD Ponto - Tipo de dado para representar um ponto no R 2 com as seguintes operações: cria - cria um ponto com coordenadas x e y; libera - libera a memória alocada por um ponto; acessa - retorna as coordenadas de um ponto; atribui - atribui novos valores às coordenadas de um ponto; distancia - calcula a distância entre dois pontos;

Tipo Abstrato de Dados (TAD) Interface do TAD Ponto: Define o nome do tipo e os nomes das funções exportadas; A composição da estrutura Ponto não faz parte da interface: Não é exportada pelo módulo; Não faz parte da interface do módulo; Não é visível para outros módulos; Os módulos que utilizarem o TAD Ponto: Não poderão acessar diretamente os campos da estrutura Ponto; Só terão acesso aos dados obtidos através das funções exportadas.

/* TAD: Ponto (x,y) */ /* Tipo exportado */ typedef struct ponto Ponto; Arquivo: ponto.h (interface do TAD Ponto) /* Funções exportadas */ /* Função cria - Aloca e retorna um ponto com coordenadas (x,y) */ Ponto* pto_cria(float x, float y); /* Função libera - Libera a memória de um ponto */ void pto_libera(ponto* p); /* Função acessa - Retorna as coordenadas de um ponto */ void pto_acessa(ponto* p, float* x, float* y); /* Função atribui - Atribui valores às coordenadas do ponto */ void pto_atribui(ponto* p, float x, float y); /* Função distancia - Retorna a distância entre dois pontos */ float pto_distancia(ponto* p1, Ponto* p2);

Tipo Abstrato de Dados (TAD) Implementação do TAD Ponto: Inclui o arquivo de interface de Ponto; Define a composição da estrutura Ponto; Inclui a implementação das funções externas;

#include <stdlib.h> #include <stdio.h> #include <math.h> #include "ponto.h" Arquivo: ponto.c (implementação do TAD Ponto) struct ponto float x; float y; ; Ponto* pto_cria(float x, float y) Ponto* p = (Ponto*) malloc(sizeof(ponto)); if (p == NULL) printf("memória insuficiente!\n"); exit(1); p->x = x; p->y = y; return p;

void pto_libera(ponto* p) free(p); void pto_acessa(ponto* p, float* x, float* y) *x = p->x; *y = p->y; void pto_atribui(ponto* p, float x, float y) p->x = x; p->y = y; float pto_distancia(ponto* p1, Ponto* p2) float dx = p2->x - p1->x; float dy = p2->y - p1->y; return sqrt(dx*dx + dy*dy);

Tipo Abstrato de Dados (TAD) Exemplo de utilização do TAD Ponto: #include <stdio.h> #include "ponto.h" int main(void) float x, y; Ponto* p = pto_cria(2.0,1.0); Ponto* q = pto_cria(3.4,2.1); float d = pto_distancia(p,q); printf("distancia entre pontos: %f\n",d); pto_libera(q); pto_libera(p); return 0;

Tipo Abstrato de Dados (TAD) Exemplo: TAD Circulo - Tipo de dado para representar um circulo com as seguintes operações: cria - cria um círculo com centro (x,y) e raio r; libera - libera a memória alocada por um círculo; area - calcula a área do círculo; interior - verifica se um dado ponto está dentro do círculo;

/* TAD: Círculo */ /* Dependência de módulos */ #include "ponto.h" Arquivo: circulo.h (interface do TAD Circulo) /* Tipo exportado */ typedef struct circulo Circulo; /* Funções exportadas */ /* cria - Aloca e retorna um círculo com centro(x,y) e raio r */ Circulo* circ_cria(float x, float y, float r); /* libera - Libera a memória de um círculo previamente criado */ void circ_libera(circulo* c); /* area - Retorna o valor da área do círculo */ float circ_area(circulo* c); /* interior - Verifica se um ponto p está dentro do círculo */ int circ_interior(circulo* c, Ponto* p);

#include <stdlib.h> #include "circulo.h Arquivo: circulo.c (implementação do TAD Circulo) #define PI 3.14159 struct circulo Ponto* p; float r; ; Circulo* circ_cria(float x, float y, float r) Circulo* c = (Circulo*)malloc(sizeof(Circulo)); c->p = pto_cria(x,y); c->r = r;...

void circ_libera(circulo* c) pto_libera(c->p); free(c); float circ_area(circulo* c) return PI*c->r*c->r; int circ_interior(circulo* c, Ponto* p) float d = pto_distancia(c->p,p); return (d<c->r);

Tipo Abstrato de Dados (TAD) Podemos utilizar um TAD sem precisarmos conhecer a sua implementação. Exemplo: TAD Matriz - Tipo de dado para representar matrizes com as seguintes operações: cria: operação que cria uma matriz de dimensão m por n; libera: operação que libera a memória alocada para a matriz; acessa: operação que acessa o elemento da linha i e da coluna j da matriz; atribui: operação que atribui o elemento da linha i e da coluna j da matriz; linhas: operação que devolve o número de linhas da matriz; colunas: operação que devolve o número de colunas da matriz.

/* TAD: matriz m por n */ Arquivo: matriz.h (interface do TAD Matriz) /* Tipo exportado */ typedef struct matriz Matriz; /* Funções exportadas */ /* cria - Aloca e retorna uma matriz de dimensão m por n */ Matriz* mat_cria(int m, int n); /* libera - Libera a memória de uma matriz previamente criada. */ void mat_libera(matriz* mat); /* acessa - Retorna o valor do elemento da linha i e coluna j */ float mat_acessa(matriz* mat, int i, int j); /* atribui - atribui o valor ao elemento da linha i e coluna j */ void mat_atribui(matriz* mat, int i, int j, float v); /* linhas - Retorna o número de linhas da matriz */ int mat_linhas(matriz* mat); /* colunas - Retorna o número de colunas da matriz */ int mat_linhas(matriz* mat);

Tipo Abstrato de Dados (TAD) Verificar se uma matriz é simétrica: retorna 1 se verdadeiro e 0 se falso: Uma matriz é simétrica se ela for igual a sua transposta; Uma matriz transposta é o resultado da troca de linhas por colunas da matriz original; int simetrica(matriz *mat) int i, j; for (i=0; i<mat_linhas(mat); i++) for (j=0; j<mat_colunas(mat); j++) if (mat_acessa(mat,i,j)!= mat_acessa(mat,j,i)) return 0; return 1;

Tipo Abstrato de Dados (TAD) Multiplicar uma matriz por um escalar: Matriz *mult_matriz_escalar(matriz *mat_a, float s) int i, j; Matriz *mat_b = mat_cria(mat_linhas(mat_a), mat_colunas(mat_a)) for (i=0; i<mat_linhas(mat_a); i++) for (j=0; j<mat_colunas(mat_a); j++) mat_atribui(mat_b, i, j, s * mat_acessa(mat_a,i,j)); return mat_b;

Leitura Complementar Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004). Capítulo 9 Tipos Abstratos de Dados

Exercícios Lista de Exercícios 11 Tipos Abstratos de Dados http://www.inf.puc-rio.br/~elima/prog2/