2011-02-01 2 views
0

私はプロジェクトを終えましたが、唯一の問題は一度に1人の著者しか検索できないことです。私はそれを理解することができないようだ。著者の姓で複数の著者を持つ書籍リストクラスを検索するにはどうすればよいですか?

これは私が持っているものです。私は複数の著者の姓を見つけることができない何かを見逃していますか?

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

ご協力いただければ幸いです。

EDIT:基本的に私は複数の著者を見つけたいと思います。例えば、John HopkinsとWilson Greeneを入力した場合、同時に両方の著者の姓を同時に取りたいと思います。申し訳ありませんが、明確に説明していません。

私も同様に、この部分を持っている..

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

私の全体のプログラムは本当に長いので、私は全体のことを掲示することにより、あなたたちを圧倒したくない...

+0

他の場所で複数の著者を扱うにはどうすればよいですか? –

+1

あなたの質問は少し奇妙で、私の答えは - 'それを実装する ' – Elalfer

+1

これは私たちがあなたを助けてくれるほどの情報ではありません。私は 'コレクション'が何であるか、それがどのようにレイアウトされているか分かりません。また、一度に1人の著者だけを検索することはどういう意味ですか?あなたはAsimovとClarkeの本を見つけたいと思っていますか、またはSteeleで検索するときにHarbison&Steeleの本を載せたいですか? –

答えて

0

あなたはしないでください「本」とは何か、そしてCollectionとは何かに関する多くの情報を私たちに与えてください。 しかし、すでに1つの文字列(著者の姓)の期待される結果を返す関数を実装しているようです。

できることは、毎回異なる姓の関数FindBookAuthorLastを複数回使用することです。

または、パラメータで文字列のベクトルを受け取り、Book(またはその書籍を含むクラス)のベクトルを返す関数を実装します。

EDIT:

((これはそれを行うための唯一の解決策ではありませんがたくさんある、):あなたが投稿新しい情報で

、ここでそれを行う方法はあります(getlineの上で反復、機能FindBookAuthorLastに与えるvector<string>を構築するためのコードはコンパイルされません、テストされていない)

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

)。

+0

"Iterator"と "FindBookAuthorLast"でエラーが発生し続ける – Brian

+0

1) "Iterator"ではなく "iterator"(大文字ではありません)を入力しました 2)このコードでは十分ではありません。あなたはそれを回避する必要があります。 –

+0

ありがとう!私は試してそれを把握します – Brian

0

あなたは複数の著者を検索可能にするために、あなたの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を呼び出します述語またはファンクタを書くことです。

これはあなたの問題の1つの解決策です。あなたがそれをもっと考えてみると、おそらく他のものがあります。

0

たぶん、あなたが望むすべてはあなたの関数をループにある:

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

(テストされていません)。

関連する問題