比较输入值到向量中的值

时间:2009-07-18 00:52:50

标签: c++

我正在尝试输入一种数据验证形式,当用户输入图书的ISBN编号时,如果已经存储了该编号,则会输出错误信息。但是,我在做这件事时遇到了麻烦。我不确定我是否正确地重载了​​==运算符,而且我不确定如何比较store_ISBN()函数中的向量值。

以下是代码:

#include "std_lib_facilities.h"

// Classes ---------------------------------------------------------------------

class Book{
public:
       vector<Book> books; // stores book information
       Book() {}; // constructor
       friend ostream& operator<<(ostream& out, const Book& b);
       bool operator==(const Book& d);
       string what_title();
       string what_author();
       int what_copyright();
       void store_ISBN();
       void is_checkout();
private:
        char check;
        int ISBNfirst, ISBNsecond, ISBNthird;
        char ISBNlast;
        string title;
        string author;
        int copyright;
};

// Class Functions -------------------------------------------------------------

string Book::what_title()
{
       cout << "Title: ";
       getline(cin,title);
       cout << endl;
       return title;
}

string Book::what_author()
{
       cout << "Author: ";
       getline(cin,author);
       cout << endl;
       return author;
}

int Book::what_copyright()
{
    cout << "Copyright Year: ";
    cin >> copyright;
    cout << endl;
    return copyright;
}

void Book::store_ISBN()
{
     bool test = false;
     cout << "Enter ISBN number separated by spaces: ";
     while(!test){
     cin >> ISBNfirst >> ISBNsecond >> ISBNthird >> ISBNlast;
     for(int i = 0; i < books.size(); ++i)
             if(ISBNfirst == books[i]) cout << "test"; // no idea how to implement this line            
     if((ISBNfirst<0 || ISBNfirst>9) || (ISBNsecond<0 || ISBNsecond>9) || (ISBNthird<0 || ISBNthird>9))
                   error("Invalid entry.");
     else if(!isdigit(ISBNlast) && !isalpha(ISBNlast))
          error("Invalid entry.");
     else test = true;}     
     cout << endl;
}

void Book::is_checkout()
{
     bool test = false;
     cout << "Checked out?(Y or N): ";
     while(!test){
     cin >> check;
     if(check == 'Y') test = true;
     else if(check == 'N') test = true;                                
     else error("Invalid value.");}
     cout << endl;
}

// Operator Overloading --------------------------------------------------------

bool Book::operator==(const Book& d){ // is this right???
     if((ISBNfirst == d.ISBNfirst) && (ISBNsecond == d.ISBNsecond) 
             && (ISBNthird == d.ISBNthird) && (ISBNlast == d.ISBNlast)) return true;
     else return false;
}

ostream& operator<<(ostream& out, const Book& b){
         out << "Title: " << b.title << endl;
         out << "Author: " << b.author << endl;
         out << "ISBN: " << b.ISBNfirst << "-" << b.ISBNsecond << "-" << b.ISBNthird << "-" << b.ISBNlast << endl;
         out << endl;
         return out;
}

// Main ------------------------------------------------------------------------     

int main()
{
    Book store;
    string question;
    while(true){
        store.what_title();
        store.what_author();
        store.what_copyright();
        store.store_ISBN();
        store.is_checkout();
        store.books.push_back(store);
        cout << "Are you finished?(Y or N): ";
        cin >> question;
        if(question == "Y") break;
        else if(question == "N"){
              cout << endl;
              cin.ignore();}
        else error("Invalid value.");
        }
    cout << endl;
    cout << "Books stored -\n" << endl;
    for(int i = 0; i < store.books.size(); ++i)
            cout << store.books[i];
    keep_window_open();
}

请注意,在store_ISBN函数中,我只包含了对一个变量的测试,因为在我弄清楚如何做之前我不想输出整个变量。

正如您所看到的,每当一本书通过main中的循环时,就会存储该书的数据。然后我可以通过重载&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;运营商打印标题,作者和ISBN。所以我认为我应该能够访问向量中的个别数据以与用户输入ISBN进行比较,但我不知道如何。我感到困惑的部分已经被评论过了。

2 个答案:

答案 0 :(得分:4)

我不确定用户希望为ISBN输入的内容。

从流读取到int将读取一个空格的数字,并将结果转换为int(如果一切顺利,无论如何)。读入char将存储char值。所以,在你验证的那一刻,ISBN看起来像三位数(0-9),然后是下一个字符。这不是我认为的ISBN的样子。

您的operator==看起来不错,但请注意,对于bool返回值,

if (X) return true;
else return false;

可以替换为

return X;

因为条件已经是bool类型。

设置ISBN值(以及您计划在operator==中使用的任何其他字段后,如果尚未完成),在商店中查找匹配图书的方式是:

for(int i = 0; i < books.size(); ++i)
    if(*this == books[i]) cout << "test";

换句话说,找一本与本书相同的书。或者您可以使用std::find中的<algorithms>,尽管在这种情况下它不会更简洁。

顺便说一下,使用同一个班级(Book)代表一本书和整个商店是很不寻常的。但是,取消这是一组相当复杂的变化和决定,所以我只是说一个类应该代表一种事物,而类的一个对象代表了这种类型的一个例子。所以通常书店和书店都是不同的东西。 Book中的向量是一个实例变量,意味着每本书都有自己的Books向量。这没有多大意义。

答案 1 :(得分:1)

书籍是指Book类的向量。您正在将Book与整数进行比较,这是未定义的行为。在访问其数据成员之前,需要取消引用Book对象。

首先,不要使用下标[]表示法访问向量。它效率低下,使生活变得困难。使用迭代器(类似的,不确定如何实现):

for (std::vector::iterator it = books.begin(); it != books.end(); ++it)
{
}

然而,这不是你的问题。您使用->运算符取消引用对象以获取其成员。但是,您将您的成员设为私有,因此您需要一个像

这样的get函数
ISBNf() { return ISBNfirst; }

或者让您的会员公开,但这是一个坏主意(人们可以愚弄您的数据)。但是,为简单起见,假设它们是公开的,这就是你想要的:

for (std::vector::iterator it = books.begin(); it != books.end(); ++it)
{
    if (*this == *it) cout << "test"; 
}

这里没有好的解决方案,因为我不知道你想要实现什么。我想你试图比较整数的位数,但这不是如何实现的。如果您只是想确保正确分配ISBNfirst,请让我放心:你是。但是,您没有正确访问它们,这是 - &gt;运营商进来。

接下来,这段代码有点过分了:

else if(!isdigit(ISBNlast) && !isalpha(ISBNlast)

相反,使用isalphnum()函数:

else if (!isalphnum(ISBNlast));

发布;我将编辑我的帖子以指出代码中的所有缺陷。