Templates e Pilhas. 1. Introdução



Documentos relacionados
Implementação de Classe e Auto-Relacionamento em Java

Pilhas. Profa Morganna Diniz

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Introdução a Java. Hélder Nunes

2ª Lista de Exercícios

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

JSP - ORIENTADO A OBJETOS

Noções sobre Objetos e Classes

Componentes da linguagem C++

Implementando uma Classe e Criando Objetos a partir dela

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

RELACIONAMENTOS ENTRE CLASSES

Orientação a Objetos

ESTRUTURA BÁSICA DE UM PROGRAMA JAVA

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

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

CURSO DE PROGRAMAÇÃO EM JAVA

Unidade IV: Ponteiros, Referências e Arrays

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Algoritmos e Programação II. Sobrecarga

Linguagem de Programação III

2 Orientação a objetos na prática

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Programação Orientada a Objetos em Java

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

public void setdata(data d) { data = d;

Programação Orientada a Objetos em java. Polimorfismo

insfcanceof new public switch transient while byte continue extends for int null

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

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}

Aula 1 Tipo Abstrato de Dados

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Tipo Abstrato de Dados

Criar a classe Aula.java com o seguinte código: Compilar e Executar

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Encapsulamento de Dados

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

Persistência de Classes em Tabelas de Banco de Dados

Introdução a Computação

A Linguagem Java. Alberto Costa Neto DComp - UFS

NetBeans. Conhecendo um pouco da IDE

Orientação a Objetos. Conceitos Iniciais Introdução a Linguagem Java. Gil Eduardo de Andrade

Busca. Pesquisa sequencial

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Desenvolvimento OO com Java Orientação a objetos básica

Computação II Orientação a Objetos

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Programação de Computadores - I. Profª Beatriz Profº Israel

Algoritmia e Programação APROG. Linguagem JAVA. Básico. Nelson Freire (ISEP DEI-APROG 2012/13) 1/31

Universidade Federal de Uberlândia

Lógica de Programação

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Tipo de Dados em Linguagem C

Módulo 06 Desenho de Classes

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

Programação Orientada a Objeto

Técnicas de Programação II

Java. Marcio de Carvalho Victorino

UML Aspectos de projetos em Diagramas de classes

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Programando em C++ Histórico da Linguagem C

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

5 Caso de estudo O cartão fidelidade

Como construir um compilador utilizando ferramentas Java

EAD Árvore árvore binária

UNIVERSIDADE FEDERAL DO PARANÁ

Aula 04 Operadores e Entrada de Dados. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

UNIVERSIDADE FEDERAL DO PARANÁ

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Utilizem a classe Aula.java da aula passada:

Programação Orientada a Objetos: Lista de exercícios #1. Bruno Góis Mateus

2. O gerador de código estende DepthFirstAdapter implementando a interpretação que gerará código Jasmin a partir de Smallpascal.

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

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

RevISTa: Publicação técnico-científica do IST-Rio. nº 05 Data: Dezembro / 2012 ISSN

Sintaxe Básica de Java Parte 1

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação

E/S CPU. Memória (Instruções e dados) 2 PARADIGMA IMPERATIVO. Instruções e dados. Resultados das operações. Unidade lógica e aritmética

JavaScript 2.0X X

Listas Duplamente Encadeadas

Transcrição:

Templates e Pilhas 1. Introdução Templates ou Generics é considerado uma forma de polimorfismo [1]. É uma forma de programar onde o tipo do dado não é considerado. Programa-se para um tipo de dado indefinido. O foco do programador deverá estar no algoritmo e não no dado. O algoritmo gerado deverá ser capaz de ser executado para qualquer tipo de dado. Exemplo de seu emprego: Não seria interessante a existência de uma função max que retornasse o maior valor de dois números, independentemente do tipo do número? Se esse é o tipo de questão que precisa ser respondida, então utilizar templates é uma opção de solução. Uma outra aplicação bem interessante de templates é para a definição de Pilhas, Listas, Filas, Árvores e Grafos. Neste material, apenas Pilhas serão analisadas. Nas Figura 1a) e 1b), a seguir, dos exemplos de pilhas. Na Figura 1a), uma pilha de moedas de chocolate. Na Figura 1b), uma pilha de pratos. a) b) Figura 1 - Exemplos de Pilhas Curitiba, Thursday, April 24, 2014. page 1/12

Destaca-se que nas Figuras 1a) e 1b) o tipo de elemento que está na pilha não é o mesmo. Na Figura 1a) moedas de chocolate, na Figura 1b) pratos. Mesmo sendo elementos distintos, todos eles possuem a característica de estarem empilhados. Nesse contexto, poderíamos imaginar a existência de um template que represente uma pilha de elementos. Esse template se bem definido, deveria ser capaz de empilhar e desempilhar pratos, livros, jornais, moedas de chocolate, entre outros elementos. Nas próximas seções, apresenta-se o conceito de templates com implementações nas linguagens Java e C++. Na Seção 2, templates de função. Na Seção 3, apresenta-se como é a representação de Classes Templates na linguagem UML. Na Seção 4, por sua vez, representa-se o conceito de pilhas por meio de templates. 2. Templates de Função O Quadro 1, a seguir, apresenta um exemplo de implementação da função template max na linguagem C++. Essa função deverá retornar o maior valor entre dois números quaisquer. Esses números podem ser do tipo inteiro, double, float ou simplesmente char. Observe nesse quadro que: *Há a necessidade de iniciar o template com a instrução template <class ALIAS>. Nesse exemplo, o tipo do dado ou álias, foi definido apenas por T. *Qualquer referência a esse tipo de dado referenciado por T, deverá ser feita fazendo uma chamada a esse álias. Curitiba, Thursday, April 24, 2014. page 2/12

#include <iostream> Quadro 1 - Exemplo de função Template em C++ template <class T> T max(t left, T right) if (left < right) return right; else return left; int main()! std::cout << max(3,4) << std::endl;! std::cout << max(4.5, 6.7) << std::endl;! std::cout << max ('a', 'c') << std::endl;! return 0; O Quadro 2, por sua vez, apresenta um exemplo de implementação dessa função template na linguagem Java. Observe que: *Há a necessidade de inicar a declaração do template com a instrução <ALIAS> assinaturadafuncao( ). Nesse exemplo, o tipo do dado foi definido apenas por T. *Qualquer referencia a esse tipo de dado deverá ser feita fazendo uma chamada ao álias. public class Main Quadro 2 - Exemplo de função Template em Java! public static<n> N max(n left, N right)!! if (left.hashcode() > right.hashcode()) return left;! else return right;!! public static void main(string[] args)! System.out.println(">>" + max(3,4) ); System.out.println(">>" + max(9.8, 14.0) ); System.out.println(">>" + max('a','c') );! Curitiba, Thursday, April 24, 2014. page 3/12

Nas linguagens C++ e Java o nome do tipo do dado, ou álias, não possui significado associado algum. Por exemplo, em C++ e em Java, esse template, poderia também ser definido da seguinte maneira, mudando-se o álias de T para desconhecida : //CODIGO CPP template <class desconhecida> desconhecida max(desconhecida left, desconhecida right) if (left < right) return right; else return left; // CODIGO JAVA public static <desconhecida> desconhecida max(desconhecida left, desconhecida right) if (left.hashcode() > right.hashcode()) return left;! else return right; Apesar dessa liberdade na definição, [2] recomenda que a definição do tipo genérico seja feita iniciando-se com caracteres maiúsculos e que os seguintes caracteres sejam utilizados de acordo com o seu significado: * K : se for chave * N : se for número * T : se for um tipo * V : se for um valor 3 Representação UML de Templates A UML define uma maneira própria para representar graficamente um template. Na representação gráfica da classe deve-se adicionar um retângulo com o álias do template. A Figura 2, a seguir, ilustra esse representação. Esse diagrama informa que a classe deve ser definida como template e haverá um atributo denominado por Dado que armazenará esse tipo de dado. Figura 2 - Representação em UML de templates em Classe Curitiba, Thursday, April 24, 2014. page 4/12

4 Uso do Templates para implementar uma Pilha. Na Figura 3, a seguir, o Diagrama de Classes de um template que permite representar uma pilha de elementos. Na seção 4.1, esse diagrama é implementado em C++ e um pequeno exemplo é definido para testar as classes. Essas implementações e definições estão definidas nos Quadros 4, 5, 6 e 7. Na seção 4.2, o mesmo diagrama apresentado na Figura 3 é implementado na linguagem Java. Além disso, a seção 4.2 ainda apresenta um pequeno exemplo de uso desse template. Figura 3 - Diagrama UML de uma Pilha Genérica 4.1 Exemplo de Implementação em C++ do Diagrama da Figura 3 Nos Quadros 4, 5, 6 e 7, a seguir, um exemplo de template que implementa uma pilha que permite armazenar qualquer tipo de elemento. Curitiba, Thursday, April 24, 2014. page 5/12

Quadro 4 - Exemplo de Template que implementa a Pilha Genérica ilustrada na Figura 2 - C++ template <class N> class Pilha private: struct Node N *dado; Node *next; ; Node *topo; public: Pilha(N *v) topo=null; inserir(v); Pilha() topo = NULL; void inserir( N *v ) struct Node *novo = (struct Node*) malloc(sizeof(struct Node)); novo->dado = v; novo->next = topo; topo = novo; N givemetop() return *topo->dado; N retirar() if (this->quantidadedeelementos() > 0) N *saida = topo->dado; topo = topo->next; return *saida; else std::cerr << "Pilha Vazia! " << '\n'; throw std::out_of_range ("Pilha Vazia"); int quantidadedeelementos() Node* navegador = topo; int quantidade = 0; while (navegador!= NULL) quantidade ++; navegador = navegador->next; return quantidade; ; Curitiba, Thursday, April 24, 2014. page 6/12

#include <iostream> #include <stdexcept> #include "Ponto2D.h" Quadro 5 - Exemplo de Uso do Template Pilha - C++ /* template <class N> class Pilha... vide o código do Quadro 4 */ int main() /* primeiro exemplo: Pilha de Strings */ std::string t1 = "1 - oi"; std::string t2 = "2 - ola"; std::string t3 = "3 - como vai"; Pilha<std::string> pilha; pilha.inserir(&t1); pilha.inserir(&t2); pilha.inserir(&t3); std::string retirado; while( pilha.quantidadedeelementos() > 0) retirado = pilha.retirar(); std::cout << retirado << std::endl; /* segundo exemplo da Pilha: Pilha de Instancias de Classe */ Pilha<Ponto2D> pilhadepontos; Ponto2D *p1 = new Ponto2D(); p1->moveroponto(3,5); Ponto2D *p2 = new Ponto2D(); p2->moveroponto(7,8); Ponto2D *p3 = new Ponto2D(); p3->moveroponto(12,34); Ponto2D p4; p4.moveroponto(16,24); Ponto2D *aux = new Ponto2D(p4); pilhadepontos.inserir(aux); pilhadepontos.inserir(p1); pilhadepontos.inserir(p2);pilhadepontos.inserir(p3); Ponto2D pontoout; while( pilhadepontos.quantidadedeelementos() > 0) pontoout = pilhadepontos.retirar(); std::cout << pontoout << std::endl; std::cout << "fim";! return 0; Curitiba, Thursday, April 24, 2014. page 7/12

Quadro 6 - Arquivo auxiliar ao exemplo: Ponto2D.h /* * Ponto2D.h * * Created on: Apr 19, 2014 * Author: robinsonnoronha */ #ifndef PONTO2D_H_ #define PONTO2D_H_ #include <ostream> class Ponto2D private:! int coordenada_x;! int coordenada_y; public:! Ponto2D();! virtual ~Ponto2D();! void moveroponto(int,int);! double calcularadistancia(ponto2d *);! friend std::ostream & operator <<( std::ostream &, Ponto2D &);! bool operator ==(Ponto2D &); ; #endif /* PONTO2D_H_ */ Curitiba, Thursday, April 24, 2014. page 8/12

#include "Ponto2D.h" #include <cmath> Quadro 7 - Arquivo auxiliar ao exemplo: Ponto2D.h Ponto2D::Ponto2D() this->coordenada_x = 0; this->coordenada_y = 0; Ponto2D::~Ponto2D() void Ponto2D::moverOPonto(int nx, int ny) this->coordenada_x = nx; this->coordenada_y = ny; double Ponto2D::calcularADistancia(Ponto2D *outro)! int DeltaX = this->coordenada_x - outro->coordenada_x;! int DeltaY = this->coordenada_y - outro->coordenada_y; return sqrt( (double) (DeltaX*DeltaX + DeltaY*DeltaY)); bool Ponto2D::operator ==(Ponto2D &v) bool saida = false; if ( (v.coordenada_x == this->coordenada_x) && (v.coordenada_y == this->coordenada_y) ) saida = true;! return saida; std::ostream & operator <<( std::ostream &out, Ponto2D &v)! out << "(" << v.coordenada_x << ", " << v.coordenada_y << ")";! return (out); Figura 4 - Resultado da Execução dos Códigos C++ apresentados nos Quadros 4, 5, 6 e 7. Curitiba, Thursday, April 24, 2014. page 9/12

4.2 Implementação em Java Quadro 8 - Exemplo de Template que implementa a Pilha Genérica ilustrada na Figura 2 - Código Java class Pilha <T>! private class Node public T valor; public Node next; Node( T v) valor = v; next = null; ; Node topo; Pilha() topo=null; Pilha(T v) topo = null; inserir(v); public void inserir(t dado)! Node novo = new Node(dado);! novo.next = topo;! topo = novo; public T retirar()! T saida = topo.valor;! topo = topo.next;! return saida; public int quantidadedeelementos()! int saida = 0;! Node andarilho = topo;! while (andarilho!= null)! andarilho = andarilho.next; saida++;!! return saida; Curitiba, Thursday, April 24, 2014. page 10/12

Quadro 9 - Exemplo de Uso do Template Pilha - Java class NumeroComplexo! int real, imaginario;! NumeroComplexo(int r, int i) real = r; imaginario = i;! public String tostring() return "(" + real + ") + j(" + imaginario + ")"; public class Main! public static void main(string[] args) String nome[] = new String[5]; nome[0]= "Ana"; nome[1]= "Pedro"; nome[2]= "Carlos"; nome[3]= "Egberto"; nome[4] = "Maria"; Pilha <String> amigos = new Pilha(); for (int i = 0; i < nome.length; i++) amigos.inserir(nome[i]);! System.out.println("Nomes inseridos na Pilha. + Quantidade de elementos na pilha=" + amigos.quantidadedeelementos() ); for (int i = 0 ; i < nome.length; i++) System.out.println("> retirei " + amigos.retirar() + ". Resultado, pilha com " + amigos.quantidadedeelementos() + " elementos armazenados."); /* segundo exemplo de uso: Pilha de Numeros Complexos */ System.out.println("\n\n Segundo Exemplo da Pilha: Numeros Complexos."); // definicao da pilha de numeros complexos Pilha <NumeroComplexo> numeros = new Pilha(); // criacao dos elementos que serao guardados na pilha // definicao de array de objetos NumeroComplexo aux[] = new NumeroComplexo[3]; // instancias dos elementos do array aux[0] = new NumeroComplexo(4,5); aux[1] = new NumeroComplexo(7,8); aux[2] = new NumeroComplexo(9,13); for (int i = 0; i < aux.length; i++) numeros.inserir(aux[i]); System.out.println("Numeros Complexos inseridos na Pilha. + Quantidade de elementos na pilha=" + amigos.quantidadedeelementos()); for (int i = 0 ; i < aux.length; i++) System.out.println("> retirei " + numeros.retirar() + ". Resultado, pilha com " + numeros.quantidadedeelementos() + " elementos armazenados."); Curitiba, Thursday, April 24, 2014. page 11/12

Figura 5 - Resultado da Execução dos Códigos Java apresentados nos Quadros 8 e 9. Referências: [1] Budd, T. (2002). An introduction to Object-Oriented Programming. Third Edition. Addison Wesley. [2] Site: http://docs.oracle.com/javase/tutorial/java/generics/types.html consultado em 19 de abril de 2014. Curitiba, Thursday, April 24, 2014. page 12/12