• Nenhum resultado encontrado

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
8
0
0

Texto

(1)

AED - 2009/10 1

• 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 ...

};

Um exercício

(pilhas, BST, ...)

• 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.

(2)

AED - 2009/10 3

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

Um exercício

(pilhas, BST, ...)

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)

(3)

AED - 2009/10 5

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();

};

Um exercício

(pilhas, BST, ...)

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();

}

(4)

AED - 2009/10 7

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); };

Um exercício

(pilhas, BST, ...)

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) {

(5)

AED - 2009/10 9 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); };

Um exercício

(pilhas, BST, ...)

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) {

(6)

AED - 2009/10 11

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();

} }

Um exercício

(pilhas, BST, ...)

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() ){

(7)

AED - 2009/10 13

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(); }

}

Um exercício

(pilhas, BST, ...)

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{

(8)

AED - 2009/10 15

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; }

Um exercício

(pilhas, BST, ...)

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 ) ); }

Referências

Documentos relacionados

É apresentada a diversidade não só de Apocynoideae na porção oriental da região Nordeste do Brasil, como também a flora de Apocynaceae de um trecho de Mata Atlântica do

O objetivo deste Parecer Consolidado é apresentar os resultados da análise da solicitação de reajuste dos valores das Tarifas de Água e Esgoto e dos Preços

Agrupamento de Escolas de Carnaxide Agrupamento de Escolas de Carnaxide Agrupamento de escolas de José Relvas Agrupamento de Escolas de Miraflores Agrupamento de Escolas

Pode ter alguma dificuldade para fazer contato com alguém que mora longe, mas não se preocupe à toa, apenas insista mais um pouco. À noite, uma discussão com parentes pode abalar

No primeiro grupo estão os materiais que tenderam, no início dos ciclos de imersão parcial e secagem, a um grau de corrosão “desprezível” e, ao fim do ensaio, encontravam-se com

Sendo a observação um processo contínuo e fulcral para o educador/professor, foi inevitável no início de ambas as intervenções a utilização da mesma, pois tivemos essa

Keywords: Glaucoma; Filtering surgery; Minimally invasive surgical procedures/methods; Anterior chamber.. RESUMO | Embora a cirurgia de glaucoma minimamente in- vasiva, que

Neste estudo, mostrou-se que tanto a frequência de portado- res quanto as frequências alélicas de mutac¸ões no gene MEFV não foram diferentes entre pacientes com artrite gotosa e