2010-11-05 47 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的每一次迭代。