Lista - em C

3 respostas
S

Ola pessoal estou tentando corrigir este código que peguei em um livro a fim de aprimorar meus conhecimentos porém esta dando inumeros erros dos quais desconheço as razões, será que alguem poderia me ajudar.

#include <iostream>
#include <string>
#include <list>

using namespace std;

class Pessoa; // declaração em avanço;

class Livro {
public:
	Livro() {
	    pessoa = 0;
}
bool operator== (const Livro& bk)const {
	return strcmp(titulo, bk.titulo) == 0;
}
private:
	char *titulo;
	Pessoa *pessoa;
	friend ostream& operator<< (ostream&,const Livro&);
    friend ostream& operator<< (ostream&,const Pessoa&);
	friend class livroRetirado;
	friend void incluiLivro();
	friend void retiraLivro();
	friend void devolveLivro();
};

class Autor {
public:
	Autor() {
	}
	bool operator== (const Autor& ar) const {
	    return strcmp(nome, ar.nome) == 0;
	}
private:
	char *nome;
	list<Livro*>livros;
	friend ostream& operator<< (ostream&,const Autor&);
	friend ostream& operator<< (ostream&,const Pessoa&);
	friend class LivroRetirado;
	friend void incluiLivro();
	friend void retiradLivro();
	friend void devolveLivro();
};

class LivroRetirado {
public:
	LivroRetirado(Autor *ar = 0, Livro *bk = 0) {
	     autor = ar; livro = bk;
	}
	bool operator== (const LivroRetirado& bk) const {
	   return strcmp(autor->nome,bk.autor->nome) == 0  &&
		   strcmp(livro->titulo,bk.livro->titulo) == 0;
	}
	bool operator!= (const LivroRetirado& bk) const {
	      return !(*this == bk);
	}
	bool operator< (const LivroRetirado& bk) const {
	    if (strcmp(autor->nome,bk.autor->nome) == 0)
	        return strcmp(livro->titulo,bk.livro->titulo) < 0;
	    return strcmp(autor->nome,bk.autor->nome)< 0;
        }
	bool operator> (const LivroRetirado& bk) const {
	     return !(*this == bk) && !(*this < bk);
	}
private:
	Autor* autor;
	Livro* livro;
	friend ostream& operator<< (ostream&, const Pessoa&);
	friend void retiraLivro();
	friend void devolveLivro();
};

class Pessoa {

public:
	Pessoa() {
	}
	bool operator== (const Pessoa& pn) const {
	    return strcmp(nome, pn.nome) == 0;
	}
private:
	char *nome;
	list<LivroRetirado> livros;
	friend ostream& operator<< (ostream&, const Livro&);
	friend ostream& operator<< (ostream&, const Pessoa&);
	friend void retiraLivro();
	friend void devolveLivro().
};

list<Autor*> catalogo['Z' +1];
list<Pessoa*> pessoas['Z' +1];

template<class T>
ostream& operator<< (ostream& out, const list<T>& lst) {
	for (list<T>::iterator ref = lst.begin(); ref != lst.end(); ref++)
	    out << **ref; //<<sobrecarregado
	return out;
}

ostream& operator<< (ostream& out, const Livro& bk) {
    out << "    *  " << bk.titulo;
    if (bk.pessoa != 0)
	out << " - retirado por " << bk.pessoa->nome; // sobrecarregado
    out << endl;
    return out;
}

ostream& operator<< (ostream& out, const Autor& ar) {
    out << ar.nome << endl << ar.livros; // sobrecarregado
    return out;
}

ostream& operator<< (ostream& out. const Pessoa& pr) {
     out << pr.nome;
     if (!pr.livros.empty() ) {
	 out <<  " tem os seguintes livros: \n";
	 list<LivroRetirado>::iterator bk = pr.livros.begin();
	 for ( ; bk != pr.livros.end(); bk++)
	      out << "     *   " << bk->autor->nome << ", "
		  << bk->livro->titulo << endl;
     }
     else out << " não tem livros\n";
     return out;
}

template<class T1, class T2>
list<T2>::iterator findIt(const list<T2>& lst, const T1& el) {
     for (list<T2>::iterator ref = lst.begin(); ref != lst.end(); ref++)
	  if (**ref == el) // sobrecarregado ==
	      break;
     return ref;
}
char* getString(char *msg) {
	char s[82], i, *destin;
	cout << msg;
	cin.get(s,80);
	while (cin.get(s[81]) && s[81] != '\n');
	destin = new char[strlen(s) +1;
	for (i = 0; destin[i] = toupper(s[i]); i++);
	return destin;
}

void status() {
	register int i;
	cout << "A biblioteca tem os seguintes livros: \n\n";
	for (i = 'A'; i <= 'Z'; i++)
	if (!catalog[i].empty())
	    cout << catalog[i];
	cout << "\nas seguintes pessoas estao usando a biblioteca:\n\n";
	for (i ='A'; i <= 'Z'; i++)
	    if (!people[i].empty())
	       cout << people[i];
}
void incluiLivro() {
	Autor *newAutor = new Autor;
	Livro *newLivro = new Livro;
	newAutor->nome = getString("Entre com o nome do autor: ");
	newLivro->titulo = getString ("Entre com o titulo do livro:");
	list<Autor*>::iterator oldAutor =
	    findIt (catalog[newAutor->nome[0]], *newAutor);
	if (oldAutor == catalog [newAutor->nome[0]].end()){
	    newAutor->livros.push_front(newLivro);
	    catalog[newAutor->nome[0]].push_front(newAutor);
}
else (*oldAutor)->livros.push_front(newLivro);

void retiraLivro() {
	Pessoa *pessoa = new Pessoa;
	Autor autor;
	Livro livro;
	list<Autor*>::iterator autorRef;
	list<Livro*>::iterator livroRef;
	pessoa->nome = getString("Entre com o nome da pessoa:  ");
	while (true) {
	    autor.nome = getString("Entre com o nome do autor: ");
	    autorRef = findIt(catalog[autor.nome[0]], autor);
	    if (autorRef == catalog[autor.nome[0]].end())
		cout << "Nome do autor esta errado \n";
	    else break;
}
while (true){
	livro.titulo = getString("Entre com o titulo do livro: ");
	livroRef = findIt((*autorRef)->livros,livro);
	if (livroRef == (*autorRef) ->livros.end())
	    cout << "Titulo errado\n";
	else break;
}
list<Pessoa*>::iterator pessoaRef;
pessoaRef = findIt(people[pessoa->nome[0]],*pessoa);
LivroRetirado LivroREtirado(*autorRef, *livroRef);
if (pessoaRef == people[pessoa->nome[0]].end()) { //uma nova pessoa
     pessoa->livros.push_front(LivroRetirado); //na biblioteca;
     people(pessoa->nome[0]].push_front(pessoa);
     (*livroRef)->pessoa = *pessoas[pessoa->nome[0]].begin();
}
else {
     (*pessoaRef)->livros.push_front(LivroRetirado);
     (*livroRef)->pessoa = *pessoaRef;
     }
}

void devolveLivro() {
	Pessoa pessoa;
	Livro livro;
	Autor autor;
	list<Pessoa*>::iterator pessoaRef;
	list<Livro*>::iterator livroRef;
	list<Autor*>::iterator autorRef;
	while (true) {
	     pessoa.nome = getString("Entre com o nome da pessoa: ");
	     pessoaRef = findIt(people[pessoa.nome[0]],pessoa);
	     if (pessoaRef == people[pessoa.nome[0]].end())
	  	cout <<"nome da pessoa errado\n";
	     else break;
}
while (true) {
	autor.nome = getString("Entre com o nome do autor: ");
	autorRef = findIt(catalog[autor.nome[0]], autor);
	if (autorRef == catalog[autor.nome[0]].end())
	    cout <<"nome do autor errado\n";
	else break;
}
While (true) {
	livro.titulo = getString("Entre com o titulo do livro:");
	livroRef = findIt((*autorREf)->livros,livro);
	if (livroRef ==(*autorRef)->livros.end())
	    cout << "Titulo errado\n";
	else break;
}
LivroRetirado LivroRetirado(*autorRef, *livroRef);
(*livroRef)->pessoa = 0;
(*pessoaRef)->livros.remove(LivroRetirado);
}
int menu() {
	int option;
	cout << "\nEntre com uma das seguintes opcoes:"<< endl;
	cout << "1. Incluir um livro no catalogo\n2. Retirar um livro"<< endl;
    cout << "3. Retornar um livro\n4. Status\n5.Sair"<< endl;
	cout << "Sua opcao?";
	cin >> option;
	cin.get(); //descarta '\n';
	return option;
}

int main(void) {
	While (true)
	switch (menu()) {
	    case 1: incluiLivro(); break;
	    case 2: retiraLivro(); break;
	    case 3: devolveLivro(); break;
	    case 4: status(); break;
	    case 5: return;
	    default: cout <<"Opcao errada, tente novamente:  ";
	}
}
}

3 Respostas

rmendes08

O primeiro erro é que essa linguagem não é C, é C++.

S

Consegui diminuir a quantia de erros, porém tem alguns dos quais infelizmente não estou dando conta, será que alguem poderia ajudar-me, segue o cód com algumas correções

#include <iostream>
#include <string>
#include <list>

using namespace std; 

class Pessoa;  //declaracao em avanço;

class Livro {
      public:
             Livro() {
                     pessoa = 0;
                     }
                     bool operator== (const Livro& bk) const {
                          return strcmp(titulo,bk.titulo) == 0;
                          }
                          char *titulo;
             private:                     
                     Pessoa *pessoa;
                     friend ostream& operator<< (ostream&, const Livro&);
                     friend ostream& operator<< (ostream&, const Pessoa&);
                     friend class LivroRetirado;
                     friend void incluiLivro();
                     friend void retiraLivro();
                     friend void devolveLivro();
                     };
                     
class Autor {
      public:
             Autor(){
                     }
                     bool operator== (const Autor& ar) const {
                          return strcmp(nome,ar.nome) == 0;
                          }
                     private:
                             char *nome;
                             list<Livro*>livros;
                             friend ostream& operator<< (ostream&,const Autor&);
                             friend ostream& operator<< (ostream&,const Pessoa&);
                             friend class LivroRetirado;
                             friend void incluiLivro();
                             friend void retiraLivro();
                             friend void devolveLivro();
                             };
                             
class LivroRetirado {
      public:
             LivroRetirado(Autor *ar = 0, Livro *bk = 0) {
                                 autor = ar; livro = bk;
                                 }
             bool operator== (const LivroRetirado& bk) const {
                  return strcmp(autor->nome,bk.autor->nome) == 0 &&
                         strcmp(livro->titulo,bk.livro->titulo) == 0;
                         
                         }
                         bool operator!= (const LivroRetirado& bk) const {
                              return !(*this == bk);
                              
                              }
                              bool operator< (const LivroRetirado& bk) const {
                                   if (strcmp(autor->nome,bk.autor->nome) == 0)
                                   return strcmp(livro->titulo,bk.livro->titulo) < 0;
                                   
                                   }
                                   bool operator> (const LivroRetirado& bk) const {
                                        return !(*this == bk) && !(*this < bk);
                                        }
                         private:
                                 Autor* autor;
                                 Livro* livro;
                                 friend ostream& operator<< (ostream&,const Pessoa&);
                                 friend void retiraLivro();
                                 friend void devolveLivre();
                                 };
                                 
class Pessoa{
      public:
             Pessoa() {
                      }
                      bool operator== (const Pessoa& pn) const {
                           return strcmp(nome,pn.nome) == 0;
                           }
                      private:
                              char *nome;
                              list<LivroRetirado> livros;
                              friend ostream& operator<< (ostream&,const Livro&);
                              friend ostream& operator<< (ostream&,const Pessoa&);
                              friend void retiraLivre();
                              friend void devolveLivro();
                              };
list<Autor*> catalogo['z'+1];
list<Pessoa*> pessoas['z'+1];

template<class T>
ostream* operator<< (ostream& out, const list<T>& lst) {
         for(list<T>::iterator ref = lst.begin(); ref != lst.end(); ref++)
         out << **ref; // << sobrecarregado
         return 0;
         }

ostream& operator<< (ostream& out, const Livro& bk) {
         out <<"    *"<<bk.titulo;
         if(bk.pessoa != 0)
         out << " - retirado por" << bk.pessoa->nome; // << sobrecarregado
         out << endl;
         return out;
         }
         
ostream& operator<< (ostream& out, const Autor& ar) {
         out << ar.nome << endl << ar.livros; // << sobrecarregado
         return out;
         }
         
ostream& operator<< (ostream& out, const Pessoa& pr) {
         out << pr.nome;
         if ( !pr.livros.empty()) {
              out << " Tem os seguintes livros:\n";
              list<LivroRetirado>::iterator bk = pr.livros.begin();
              for ( ; bk != pr.livros.end(); bk++)
              out << "    *" << bk->autor->nome << ", "
                  << bk->livro->titulo << endl;
                  }
                  else out << " nao tem livros\n";
                  return out;
                  }
                  
template<class T1, class T2>
list<T2>::iterator findIt(const list<T2>& lst, const T1& el) {
                   for (list<T2>::iterator ref = lst.begin(); ref != lst.end(); ref++)
                   if (**ref == el) // sobrecarregado ==
                   break;
                   return ref;
                   }
                   
char* getString(char *msg) {
      char s[82], i, *destin;
      cout << msg;
      cin.get(s,80);
      while (cin.get(s[81]) && s[81] != '\n'); // descarta caracteres
      destin = new char [strlen(s)+1];         // transbordo;
      for (i = 0; destin[i] = toupper(s[i]); i++);
      return destin;
      }
      
void status() {
	register int i;
	cout << "A biblioteca tem os seguintes livros: \n\n";
	for (i = 'A'; i <= 'Z'; i++)
	if (!catalog[i].empty())
	    cout << catalog[i];
	cout << "\nas seguintes pessoas estao usando a biblioteca:\n\n";
	for (i ='A'; i <= 'Z'; i++)
	    if (!people[i].empty())
	       cout << people[i];
        }
     
void incluiLivro() {
     Autor *newAutor = new Autor;
     Livro *newLivro = new Livro;
     newAutor->nome = getString("Entre com o nome do autor:  ");
     newLivro->titulo = getString("Entre com o titulo do livro:  ");
     list<Autor*>::iterator oldAutor = findIt(catalogo[newAutor->nome[0]],*newAutor){
                                                                    if (oldAutor == catalog[newAutor->nome[0]].end()) {
                                                                                 newAutor-livros.push_front(newLivro);
                                                                                 catalog[newAutor->nome[0]].push_front(newAutor);
                                                                                 }
                                                                                 else (*oldAutor)->livros.push_front(newLivro);
                                                                                 
void retiraLivro() {
     Pessoa *pessoa = new Pessoa;
     Autor autor;
     Livro livro;
     list<Autor*>::iterator autorRef;
     list<Livro*>::iterator livroRef;
     pessoa->nome = getString("Entre com o nome da pessoa:  ");
     while (true) {
           autor.nome = getString("Entre com o nome do autor:  ");
           autorRef = findIt(catalog[autor.nome[0]],autor);
           if (autorRef == catalog(autor.nome[0]].end())
           cout << "Nome do autor está errado\n";
           esle break;
           }
           while (true) {
                 livro.titulo = getString("Entre com o título do livro:  ")
                 livroRef = findIt((*autorRef)->livros,livro);
                 if (livroRef == (*autorRef)->livros.end())
                 cout << "Título errado\n";
                 else break;
                 }
                 list<Pessoa*>::iterator pessoaRef;
                 pessoaRef = findIt(people[pessoa->nome]],*pessoa);
                 LivroRetirado LivroRetirado(*autorRef,*livrorRef);
                 if (pessoaRef == people[pessoa->nome[0]].end()){ //uma nova pessoa
                 pessoa->livros.push_front(LivroRetirado); // na biblioteca;
                 people[pessoa->nome[0]].push_front(pessoa);
                 (*livroRef)->pessoa = *pessoas[pessoa->nome[0]].begin();
                 }
                 else {
                      (*pessoaRef)->livros.push_front(LivroRetirado);
                      (*livroRef)->pessoa = *pessoaRef;
                      }
                      }

void devolveLivro() {
     Pessoa pessoa;
     Autor autor;
     list<Pessoa*>::iterator pessoaRef;
     list<Livro*>::iterator livroRef;
     list<autor*>::iterator autorRef;
     
     while (true) {
           pessoa.nome = getString("Entre com o nome da pessoa:  ");
           pessoaRef = findIt(people[pessoa.nome[0]],pessoa);
           if (pessoaRef == people[pessoa.nome[0]].end())
           cout << "nome da pessoa errado\n";
           else break;
           }
           while (true) {
                 autor.nome = getString("Entre com o nome do autor:  ");
                 autorRef = findIt(catalog[autor.nome[0]],autor);
                 if (autorRef == catalog[autor.nome[0]].end())
                 cout << "nome do autor errado\n";
                 else break;
                 }
           while (true) {
                 livro.titulo = getString("Entre com o título do livro:  ");
                 livroRef = findIt((*autorRef)->livros,livro);
                 if (livroRef == (*autorRef)->livros.end())
                   cout << "Título errado\n";
                 else break;
                 }
           LivroRetirado LivroRetirado(*autorRef, *livroRef);
           (*livroRef)->pessoa = 0;
           (*pessoaRef)->livros.remove(LivroRetirado);
           }
           
int menu(){
    int option;
    cout << "\nEntre com uma das seguintes opcoes:\n"
         << "1. Incluir um livro no catalogo\n2. Retirar um livro\n"
         << "3. Retornar um livro\n4. Status\n5. Sair"
         << "Sua opcao? ";
         cin >> option;
         cin.get();   //descarta '\n';
         return option;
         }
         
void main(){
     while (true)
        switch (menu()){
               case 1: incluiLivro(); break;
               case 2: retiraLivro(); break;
               case 3: devolveLivro(); break;
               case 4: status(); break;
               case 5: return;
               default: cout << "Opcao errada, tente novamente: ";
               }
             }   
          } 
     }
rmendes08

Uma prática que ajuda muito é separar suas classes e o programa principal. Separe as suas classes em arquivos .h e .cpp diferentes e compile-as separadamente. Acho que fica mais fácil depois para procurar erros.

Criado 2 de abril de 2010
Ultima resposta 5 de abr. de 2010
Respostas 3
Participantes 2