Как найти класс списка книг по фамилии автора, но с несколькими авторами? - PullRequest
0 голосов
/ 02 февраля 2011

Итак, я закончил свой проект, но моя единственная проблема в том, что я могу искать только одного автора за раз. Кажется, я не могу понять это.

Это то, что у меня есть ... мне не хватает чего-то, что не позволяет мне найти более чем фамилию одного автора?

void BookRecordUI::FindBookLast()   //allows us to search a book by the last name of the author from the book record...
{       
    string Last;

    cout << "Enter Book by Last Name of Author: " << endl;
    getline(cin, Last);
    Collection.FindBookAuthorLast(Last);
}

Любая помощь будет высоко ценится!

РЕДАКТИРОВАТЬ: Итак, в основном я хочу найти нескольких авторов .. например, если я ввел Джона Хопкинса и Уилсона Грина, я хочу получить фамилию обоих авторов одновременно. Извините за непонятное объяснение.

У меня тоже есть эта часть ..

void BookRecordList::FindBookAuthorLast(string Last)
{
    int K;
    for(K = 0; K < (int)List.size(); K++)
        if(List[K].GetAuthorLast() == Last)
        cout << List[K].GetTitle() << " " << List[K].GetAuthorFirst() << " " << List[K].GetAuthorLast() << " " << List[K].GetPublisher() << " " << List[K].GetPublisherAddress() << " " << List[K].GetPublisherPhone() << "  "
             << List[K].GetPublisherContact() << " "<< List[K].GetCategory() << "  " << List[K].GetDate() << endl;
};

Вся моя программа действительно длинная, поэтому я не хочу вас перегружать, публикуя все это ..

Ответы [ 3 ]

0 голосов
/ 02 февраля 2011

Вам может необходимо изменить определение Book, чтобы включить поиск нескольких авторов:

struct Author
{
  std::string& get_name() const;
};

struct Book
{
  std::vector<Author> m_authors; // A book can have 1 or more authors
  bool has_author(std::string author_name) const
  {
    std::vector<Author>::const_iterator iter;
    for (iter = m_authors.begin();
         iter != m_authors.end();
         ++iter)
    {
       if (iter.get_name() == author_name)
       {
         return true;
       }
    }
    return false;
};

Цель сейчас - написать предикат или функтор, который будет вызывать Book::has_author.

Это одно из решений вашей проблемы, возможно, есть и другие, когда вы больше об этом думаете.

0 голосов
/ 05 февраля 2012

Может быть, все, что вам нужно, это циклически перебрать вашу функцию:

void BookRecordUI::FindBookLast()   //allows us to search a book by the last name of the author from the book record...
{       
    string Last;

    do { 
        cout << "Enter Book by Last Name of Author: " << endl;
        getline(cin, Last);
        Collection.FindBookAuthorLast(Last);
    }
    while(!Last.empty());
}

(не тестировалось).

0 голосов
/ 02 февраля 2011

Вы не даете нам много информации о том, что такое "книга" и что такое Collection.Но, похоже, вы уже внедрили функцию, которая возвращает ожидаемый результат для одной строки (фамилия автора).

Что вы можете сделать, это использовать кратную вашей функции FindBookAuthorLast с другойфамилия каждый раз.

Или реализуйте функцию, которая принимает вектор строки в параметрах и возвращает вам вектор Book (или любой другой класс, содержащий книги).

EDIT:

С помощью новой информации, которую вы разместили, вот способ сделать это:

(Это не единственное решение, есть много)

(код не скомпилирован,не проверено)

void BookRecordList::FindBookAuthorLast(vector<string> Last)
{
  int K;
  vector<string>::iterator author_it = Last.begin();
  for ( ; author_it != Last.end(); ++author_it)
  {
      for(K = 0; K < (int)List.size(); K++)
         if(List[K].GetAuthorLast() == *author_it)
         cout << List[K].GetTitle() << " " << List[K].GetAuthorFirst() << " " << List[K].GetAuthorLast() << " " <<    List[K].GetPublisher() << " " << List[K].GetPublisherAddress() << " " << List[K].GetPublisherPhone() << "  "
           << List[K].GetPublisherContact() << " "<< List[K].GetCategory() << "  " << List[K].GetDate() << endl;
  }
};

Чтобы построить vector<string> для функции FindBookAuthorLast, выполните итерацию по getline ().

...