2014-02-02 4 views
0

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

#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; 
} 

ответ

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

EXTENDING (и критикуя) Ответ Влада, вам не нужно будет количество книг заранее, если вы используете итераторы потоков. Вы также можете перегрузить поток экстрактор для 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

Этот код не будет работать для целей ор, поскольку это требует, чтобы 'release' быть целым числом, а не строка. Кроме того, имя может также содержать имя, которое оператор '>>' не сможет извлечь. В вашем примере есть много возможностей для улучшения. – 0x499602D2

Смежные вопросы