Um exercício (pilhas, BST,...)

Documentos relacionados
Algoritmos e Estruturas de Dados 2007/2008

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

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

Programação 2. Trabalho Prático P4A. Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux.

Árvores binárias de pesquisa

Algoritmos e Estruturas de Dados 2006/2007

Algoritmos e Estruturas de Dados 2008/2009

//conteúdo do arquivo pacote.h

Algoritmos e Estruturas de Dados 2005/2006

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

Algoritmos e Estruturas de Dados

Redefinição de Operadores

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2. Trabalho Prático P2B

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

Tabelas de dispersão

Tipos de Dados Abstractos Estruturas Lineares Listas

Algoritmos e Estruturas de Dados 2008/2009. Conjunto de nós e conjunto de arestas que ligam pares de nós

Estruturas de Dados Encadeadas

f1 == f2 <=> n1 == n2 e d1 == d2 // Versão 1.0 class Fraction { private: public: Fraction (int, int); };

Listas Lineares Ordenadas

FICHA 8 PILHAS E FILAS

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

ESTRUTURAS DE DADOS E ALGORITMOS II ANTONIO RAMOS DE CARVALHO JÚNIOR PILHAS

Algoritmos e Estruturas de Dados 2009/2010

Aula 7 e 8 Filas e suas Aplicações. Prof. Leticia Winkler

Tipo de Dados Abstracto

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Algoritmos e Estruturas de Dados 2006/2007

U.C. (21093) Programação por Objetos. XX de Julho de INSTRUÇÕES --

Mestrado Integrado em Engenharia Electrotécnica e de Computadores 2006/2007. Programação 2

Algoritmos e Estruturas de Dados 2005/2006

Linguagem de Programação C++

Algoritmos e Estruturas de Dados

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Pilhas. Profa Morganna Diniz

Estruturas de dados e algoritmos fundamentais

Prova 2 PMR3201 1o. semestre 2016 Prof. Thiago Martins

Overloading de Operadores

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Linguagens de Programação Departamento de Engenharia Eletrônica e de Computação - DEL-Poli/UFRJ Prof.: Miguel Elias Mitre Campista

Árvores binárias: implementação

Tipo de Dados Abstractos: Pilha (stack)

Algoritmos e Estruturas de Dados 2005/2006

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Orientação a Objetos. Programação em C++

Linguagens de Programação Departamento de Engenharia Eletrônica e de Computação - DEL-Poli/UFRJ Prof.: Miguel Elias Mitre Campista

Template de classe. class vetor { int *arranjo; int limite; public: vetor(int=100); int & operator[ ](int n); };

Prova de Recuperação PMR3201/PMR2300 1o. semestre 2015 Prof. Thiago Martins

Departamento de Ciência de Computadores Estruturas de Dados (CC114)

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

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

PCS Laboratório de Programação Orientada a Objetos 1a. Prova. 02 de Setembro de 2015

Linguagem C++ Estruturas de controle Parte II Estruturas de repetição

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Estrutura de Dados II. Prof. Sérgio Portari

Departamento de Ciência de Computadores Estruturas de Dados (CC114)

Departamento de Ciência de Computadores Estruturas de Dados (CC114)

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Revisão: Tipo Abstrato de Dados Recursividade

Prof. Jesus José de Oliveira Neto

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

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

LEIA ATENTAMENTE AS INSTRUÇÕES PARA A RESOLUÇÃO DO

Algoritmos e Estruturas de Dados

Filas. Prof. Jesus José de Oliveira Neto

programas = estrutura de dados + algoritmos

Estruturas de Dados Filas

Prof. Jesus José de Oliveira Neto

Pilhas. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

Árvores Binárias de Busca

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Overloading de Operadores

Programação 2. Trabalho Prático P4B. Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux.

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

Estrutura de Dados I Bacharelado em Sistemas de Informação FACOM UFU Lista de Exercícios

2 Vectores de objectos

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Matrizes. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 67

if (umobjecto!= null && umobjecto instanceof CartaoFidelidade){ titular.equals(((cartaofidelidade) umobjecto).titular) &&

Orientação a Objetos e Java

Questão 1 Analise o trecho do código abaixo, escrito na linguagem C#:

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

Objectivos. Iniciar a programação de funções. Estudar a chamada de funções. Estudar a forma como são executadas as funções

Algoritmos e Estruturas de Dados 2005/2006. Algoritmo: conjunto claramente especificado de instruções a seguir para resolver um problema

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

Árvore Binária de Busca. Prof. César Melo

Algoritmos e Estruturas de Dados 2007/2008. Ajusta a estrutura da árvore à frequência de acesso aos dados

Física Computacional 15 Templates

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

Árvores & Árvores Binárias

Paradigmas de Programação

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

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

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

Construção de Classes

Transcrição:

No arquivo de uma Biblioteca, existem livros raramente requisitados para empréstimo. Estes livros ficam guardados num arquivo, dentro de caixas numeradas. Cada caixa contém um número máximo de livros, dependendo do tipo da caixa. Pretende-se, entretanto, facilitar a procura de um livro nas caixas do arquivo criando um registo numa árvore BST, sendo a ordenação realizada pelo título do livro. Esta árvore está inicialmente vazia, é construída à medida que novos empréstimos são efectuados, e contém objectos do tipo InfoLivro. class InfoLivro ; string titulo; int caixa; bool emrequisicao; // true se livro foi requisitado e ainda não devolvido... AED - 2009/10 1 Sempre que um livro é solicitado para empréstimo, deve: Procurar na árvore BST o seu registo. Se existir, e não estiver requisitado actualmente, ir para a caixa respectiva e procurar nessa caixa Senão, procurar em todas as caixas. Efectuar o registo na BST. Quando um livro é devolvido, é reposto na sua caixa original, no topo da pilha de livros da caixa, e actualizado o seu registo na BST para já devolvido. class ArquivoBiblioteca vector<caixa> caixas; BST<InfoLivro> livrosreg;... ; class Caixa stack<livro> livros; int capacidade;... ; AED - 2009/10 2

Implemente na classe ArquivoBiblioteca o construtor, sabendo que exitem 6 caixas de capacidades 5, 4, 6, 7, 8, 8. Implemente também o método: bool inserirlivro(string titulol) Este método insere no topo da primeira caixa disponível o livro de título titulol. Se não for possível inserir o livro em qualquer caixa por falta de capacidade, este método retorna false. Implemente na classe ArquivoBiblioteca o método: Livro& buscarlivro(string titulol, int caixan) Este método procura na caixa caixan o livro de titulo titulol, e retorna esse livro. Se o livro não estiver lá, gera uma excepção do tipo LivroNaoEncontrado. O procedimento de procura de um livro numa caixa é o seguinte: Na caixa, os livros são retirados um a um e empilhados numa mesa de apoio pela ordem em que são retirados. Após a procura numa caixa, a pilha é retornada para a caixa da mesma forma como se encontra na mesa de apoio, de uma só vez AED - 2009/10 3 Implemente na classe ArquivoBiblioteca o método: void verregistos() Este método imprime no monitor informação sobre os livros já registados (existentes na BST), sendo essa informação apresentada por ordem alfabética de título do livro. Implemente na classe ArquivoBiblioteca o método: bool emprestimo(string titulol) Este método efectua o empréstimo do livro de título TituloL. Devolve true se o empréstimo foi realizado e false caso contrário (isto é, se o livro não existe). Implemente na classe ArquivoBiblioteca o método: void devolucao(string titulol) Este método efectua a devolução do livro de título TituloL. AED - 2009/10 4

class Livro string titulo; public: Livro(string t): titulo(t) string gettitulo() return titulo; friend ostream& operator << ( ostream& os, const Livro& livro); ; class Caixa stack<livro> livros; int capacidade; public: Caixa(int c): capacidade(c) int getcapacidade() return capacidade; void push(const Livro& l) livros.push(l); int size() return livros.size(); bool empty() return livros.empty(); Livro& top() return livros.top(); void pop() livros.pop(); void print(); ; AED - 2009/10 5 ostream& operator <<(ostream& os, const Livro& livro) return os << "Titulo: " << livro.titulo; void Caixa::print() stack<livro> buffer; while(!livros.empty()) cout << livros.top() << endl; buffer.push( livros.top() ); livros.pop(); livros = buffer; AED - 2009/10 6

class InfoLivro string titulo; int caixa; bool emrequisicao; //true se livro foi requisitado e ainda não devolvido public: InfoLivro(string titulol): titulo(titulol) caixa = -1; emrequisicao = false; InfoLivro(string titulol, int caixan): titulo(titulol), caixa(caixan) emrequisicao = false; InfoLivro(string titulol, int caixan, bool requisitado): titulo(titulol), caixa(caixan), emrequisicao(requisitado) string gettitulo() return titulo; int getcaixa() return caixa; void setemrequisicao(bool r) emrequisicao = r; bool getemrequisicao() return emrequisicao; ; bool operator <(const InfoLivro &info1) const; bool operator ==(const InfoLivro &info1) const; bool operator!=(const InfoLivro &info1) const; friend ostream& operator <<(ostream& os, const InfoLivro& info); AED - 2009/10 7 bool InfoLivro::operator <(const InfoLivro &info1) const return (titulo < info1.titulo); bool InfoLivro::operator ==(const InfoLivro &info1) const return (titulo == info1.titulo); bool InfoLivro::operator!=(const InfoLivro &info1) const return (titulo!= info1.titulo); ostream& operator <<(ostream& os, const InfoLivro& info) os << "Livro " << info.titulo << ";\tcaixa No." << info.caixa; if(!info.emrequisicao ) os << ";\testado: disponivel"; else os << ";\testado: emprestado"; return os; AED - 2009/10 8

class LivroNaoEncontrado ; class ArquivoBiblioteca vector<caixa> caixas; BST<InfoLivro> livrosreg; public: ArquivoBiblioteca(): livrosreg( InfoLivro("") ) void verregistos(); void inserircaixa(const Caixa& caixa); void inserirlivro(string titulol); void vercaixas(); void inserirregisto(const InfoLivro& info); Livro& buscarlivro(string titulol, int caixan); bool emprestimo(string titulol); void devolucao(string titulol); ; AED - 2009/10 9 void ArquivoBiblioteca::inserirCaixa(const Caixa& caixa) caixas.push_back( caixa ); void ArquivoBiblioteca::inserirLivro(string titulol) for (int i = 0; i < caixas.size(); i++) if( caixas[i].size() < caixas[i].getcapacidade() ) caixas[i].push( Livro(tituloL) ); return; void ArquivoBiblioteca::inserirRegisto(const InfoLivro& info) livrosreg.insert(info); AED - 2009/10 10

void ArquivoBiblioteca::verCaixas() for(int i = 0; i < caixas.size(); i++) cout << "Caixa " << i << endl; caixas[i].print(); void ArquivoBiblioteca::verRegistos() BSTItrIn<InfoLivro> it(livrosreg); while (!it.isatend() ) cout << it.retrieve() << endl; it.advance(); AED - 2009/10 11 Livro& ArquivoBiblioteca::buscarLivro(string titulol, int caixan) Livro* ptlivro = 0; cout << titulol << endl; caixas[caixan].print(); queue<livro> mesadeapoio; while(!caixas[caixan].empty() ) if(caixas[caixan].top().gettitulo()!= titulol) mesadeapoio.push(caixas[caixan].top()); else cout << "ACHOU!!!" << endl; ptlivro = new Livro(caixas[caixaN].top().getTitulo()); caixas[caixan].pop(); while(!mesadeapoio.empty() ) caixas[caixan].push( mesadeapoio.front() ); mesadeapoio.pop(); if (ptlivro!= 0) return *ptlivro; else throw LivroNaoEncontrado(); AED - 2009/10 12

Livro& ArquivoBiblioteca::buscarLivro(string titulol, int* ptcaixan) for(int i = 0; i < caixas.size(); i++) Livro* ptlivro = 0; queue<livro> mesadeapoio; while(!caixas[i].empty() ) if(caixas[i].top().gettitulo()!= titulol) mesadeapoio.push(caixas[i].top()); else cout << "ACHOU!!!" << endl; ptlivro = new Livro(caixas[i].top().getTitulo()); *ptcaixan = i; caixas[i].pop(); while(!mesadeapoio.empty() ) caixas[i].push( mesadeapoio.front() ); mesadeapoio.pop(); if (ptlivro!= 0) return *ptlivro; else throw LivroNaoEncontrado(); AED - 2009/10 13 bool ArquivoBiblioteca::emprestimo(string titulol) InfoLivro info(titulol); BSTItrIn<InfoLivro> it(livrosreg); while (!it.isatend() && it.retrieve() < info) it.advance(); //Empresta um livro já registado... if (!it.isatend() && it.retrieve() == info ) cout << "encontrou!!!" << endl; if( it.retrieve().getemrequisicao() ) return false; else Livro livro = buscarlivro( it.retrieve().gettitulo(), it.retrieve().getcaixa() ); it.retrieve().setemrequisicao(true); return true; // continua... AED - 2009/10 14

bool ArquivoBiblioteca::emprestimo(string titulol) // continuação... //Empresta um livro não registado e regista o mesmo... else cout << "não encontrou" << endl; int i = -1; Livro livro = buscarlivro( titulol, &i ); cout << livro << " " << i << endl; livrosreg.insert(infolivro(livro.gettitulo(), i, true)); return true; return true; AED - 2009/10 15 void ArquivoBiblioteca::devolucao(string titulol) InfoLivro info(titulol, 0); BSTItrIn<InfoLivro> it(livrosreg); while (!it.isatend() && it.retrieve() < info) it.advance(); if (!it.isatend() && it.retrieve() == info ) it.retrieve().setemrequisicao(false); caixas[it.retrieve().getcaixa()].push(livro( titulol ) ); AED - 2009/10 16