7

bookStructという構造化されたデータ型があり、booksはbookStructデータ型に関連付けられた変数の名前です。book [10]は、長さが10文字で、データが4文字の配列です。つまり、book[0]からbook[3]は、残りが空の場合(o値)にデータが含まれます。ここで、すでに配列にあるデータを出力し、空のデータは出力しないようにします。それ以外の場合は0です。運が悪かったので、以下のコードを試しました。ここで何が間違っているのでしょうか。

for (int i=0;i<MAX_BOOKS && books[i]!='\0';i++)
            {
                cout << "Book Title: " << books[i].bookTitle << endl;
                cout << "Total Pages: " << books[i].bookPageN << endl;
                cout << "Book Review: " << books[i].bookReview << endl;
                cout << "Book Price: " << books[i].bookPrice<< "\n\n" << endl;
            }

これが本の構造体の宣言です

struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
};

bookStruct books[10];
4

2 に答える 2

18

出力演算子をオーバーロードします。例えば:

struct Book {
    string title;
    int pageN;
    int review;
    float price;
};

ostream& operator<<(ostream& os, const Book& book) {
    return os << "Title: " << book.title << endl
              << "Pages: " << book.pageN << endl
              << "Review: " << book.review << endl
              << "Price:" << book.price << endl;
}

次に、任意のストリームに出力できます。

Book book;
ostringstream oss;
oss << book;

すべての本をループして、にコピーするstd::coutには、本にタイトルがある場合にのみ、次のものが必要ですstd::copy_if

bool bookHasTitle(const Book& book) {
    return book.title.empty() == false;
}

Book books[10];

copy_if(books, books+10, ostream_iterator<Book>(cout, "\n"),
        bookHasTitle);
于 2013-02-04T21:49:42.493 に答える
4

ここで何が求められているのかを判断するのは少し難しいです。ほら、保存した本の数を数えるのはとても簡単です。

int numBooks = 0;

本を追加すると、numBooksまでインクリメントされMAX_BOOKSます。

for( int i=0; i<numBooks; i++ ) ...

それをしたくない場合はbooks[i] != '\0'、単一の文字に対して構造体をテストしているため、テストすることはできません。

代わりに、テストすることをお勧めしますbooks[i].bookTitle.size() != 0

(または確かに!books[i].bookTitle.empty())。

for( int i=0; i<MAX_BOOKS && !books[i].bookTitle.empty(); i++ ) ...

もう1つの方法は、本をvector配列ではなく格納することです。これにより、最大数と現在の数について心配する必要がなくなります。ベクトルは縮小および拡大できます。

vector<bookStruct> books;

...

for( int i = 0; i < books.size(); i++ ) ...
于 2013-02-04T21:24:57.950 に答える