Структура массива C ++

0

Я сделал программу хранения книг в c++. Это программа, которая зацикливается более 3 раз, поэтому пользователь может ввести 3 книги, но теперь я хочу, чтобы пользователь выбирал количество пользователей книги, которые нужно ввести, и я не знаю, как это сделать. Было бы полезно, и вот мой код

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

struct Book{
    string name;
    int release;
}Issue[3];

int main(){
    //local variable
    int i;
    string release_dte;
    //interface
    cout << "Welcome to Book Storage CPP" << endl;
    //for handler
    for (i = 0; i < 3; i++){
        cout << "Book: ";
        getline(cin, Issue[i].name);
        cout << "Release Date: ";
        getline(cin, release_dte);
        Issue[i].release = atoi(release_dte.c);
    }
    cout << "These are your books" << endl;
    for ( i = 0; i < 3; i++){
        cout << "Book: " << Issue[i].name << " Release Date: " << Issue[i].release << endl;
    }
    system("pause");
    return 0;
}
Теги:
arrays
struct

3 ответа

2

Лучший способ - использовать std :: vector. Например

#include <vector>
//...

struct Book{
    string name;
    int release;
};

int main()
{
   size_t issue_number;

   std::cout << "Enter number of books: ";
   std::cin >> issue_number;

   std::vector<Book> Issue( issue_number );
//...    

В противном случае вы должны динамически распределять массив самостоятельно. Например

Book *Issue = new Book[issue_number];

и в конце программы вам нужно освободить выделенную память

delete []Issue;
0

Расширение (и критика) Влада отвечает, вам не понадобится количество книг заранее, если вы используете итераторы потоков. Вы также можете перегрузить извлечение потока для Book так, чтобы извлечение было правильно реализовано итераторами:

std::istream& operator>>(std::istream& is, Book & b)
{
    if (!is.good())
        return is;

    std::string release_date;

    if (std::getline(is >> std::ws, b.name) &&
        std::getline(is >> std::ws, release_date))
    {
        b.release = std::stoi(release_date);
    }

    return is;
}

И позже в main() вы все равно будете использовать std::vector<Book>, используя только перегрузку итератора конструктора для генерации объектов:

int main()
{
    std::vector<Book> Items(std::istream_iterator<Book>{std::cin},
                            std::istream_iterator<Book>{});

    ...
}

Для печати вы можете перегрузить вставку, которая реализует логику печати:

std::ostream& operator<<(std::ostream& os, const Book & b)
{
    return os << "Book: "          << b.name << '\n'
              << " Release Date: " << b.release;
}

И вызывая этот вставщик, используя std::copy:

std::copy(Items.begin(), Items.end(),
    std::ostream_iterator<Book>(std::cout << "These are your books: \n", "\n"));
0
   #include <iostream>
   #include <string>
   #include <vector>

   using namespace std;

   struct Book {
          string name;
          int release;
          Book(string _name, int _release) {
                 name = _name;
                 release = _release;
          }
   };

   int main() {
          vector<Book> books;
          string name;
          int release;

          while(cin >> name >> release) {
                 books.push_back(Book(name,release));
          }

          for(int i=0; i<(int)books.size(); ++i) {
                 cout << books[i].name << " - " << books[i].release << endl;
          }

          return 0;

   }
  • 0
    Этот код не будет работать для целей OP, поскольку он требует, чтобы release был целым числом, а не строкой. Кроме того, имя может также принимать фамилию, которую оператор >> не сможет извлечь. Ваш пример имеет много возможностей для улучшения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню