2010-11-05 71 views
0
class Catalog { 


bool BookCopy; 

public: 
string BookTitle; 
Catalog() 
{ 

    BookCopy = false; 

} 

Catalog(string Title, bool Copy) 
{ 
BookTitle = Title; 
BookCopy = Copy; 
} 


void SetTitle(string Title) {BookTitle = Title; } 

void SetBookCopy(bool Copy) {BookCopy = Copy; } 

string GetTitle() { return BookTitle; } 

bool GetCopy() { return BookCopy; } 

}; 

class BookList { 
    vector<Catalog> List; 
vector<Catalog>::iterator Transit; 




public: 


void Fill(); 

void Show(); 


}; 

void BookList::Fill() //Create book record 
    { 
string Title; 
    bool Copy; 


Catalog Buffer; 

cout << "Enter book information, Stop To quit" << endl; 
cout << "-------------------------- " << endl; 
while(true) 
{ 
    cout << "Title: "; 
    getline(cin, Title); 
    if(Title == "Stop") 
    break; 

    for(Transit = List.begin() ; Transit != List.end() ; Transit++) { 
    if(Transit->GetTitle() == Title) { 
     Copy = true; 
    } 
     else 
     Copy = false; 
    } 

我想檢查是否存在一個相同的標題時,創造一個新的記錄。如果存在,則將1分配給複製,否則將其保留爲0.當我製作具有相同標題的記錄時1不會分配給複製。檢查現有記錄

+0

似乎代碼不完整。 – 2010-11-05 18:25:55

+0

請顯示列表來自哪裏。它是否已經有數據或者你應該在輸入時添加每個標題到列表。 – 2010-11-05 18:26:53

+0

你也可以粘貼'GetTitle'函數嗎? – Leonid 2010-11-05 18:28:11

回答

1

除非這是家庭作業,否則應該幾乎完全重寫它。

首先,你應該定義「書」爲一類,並定義它的提取操作:

class Book { 
    string title; 
    string additional; 
public: 
    friend std::istream &operator>>(std::istream &is, Book &b) { 
     std::getline(is, b); 
     return is; 
    } 

    // see reason for this below 
    bool operator<(Book const &other) const { 
     return title < other.title; 
    } 
}; 

我不過注意的是,「複製」似乎並不爲這本書本身的一個特點。大多數情況下,你真正擁有的是書籍清單,以及任何特定標題的一些副本(可能是一個)。對於這一點,我會做一些事情,如:

std::map<Book, int> BookList; 

要使用map,但是,你的「鑰匙」(Book秒,在這種情況下)必須是可比較的 - 即operator<必須返回一個有意義的結果給他們(這就是爲什麼我在上面定義的原因)。

現在,而不是在書類「複製」的成員,我們只是有一些圖書清單中給定標題的副本:

std::cout << "Please enter book title:"; 
Book b; 
std::cin >> b; // User enters book data 

// Increment the number of copies of this title. 
// Basically works out to: 
// If the title wasn't in the list, 
//  inserts it with a value of 0, then increments it to 1. 
// else 
//  increment # of copies of title already in list 
// 
++BookList[b];  

注意,這也明顯地比更有效你在做什麼 - 它爲每個現有書本進行(對數)樹搜索,而不是線性搜索。

1

要解決原始程序中的問題:for(Transit)循環應該在找到重複標題時終止,而是繼續比較其他已記錄的標題。因此,除非重複標題是列表中最後一個,否則副本始終爲假。

這是我不願意給出答案的問題之一,因爲我認爲OP會從如何找到問題的建議中學到更多東西 - 即使用調試器(或cout)來打印Copy和Transit的每一次迭代。