《C++ Primer》第四版,习题10.25
定义一个vector容器,存储你在未来6个月里要阅读的书,再定义一个set,用于记录你已经看过的书名。编写程序从vector中为你选择一本没有读过而现在要读的书。当它为你返回选中的书名后,应该将该书名放入记录已读书目的set中。如果实际上你把这本书放在一边没有看,则本程序应该支持从已读书目的set中删除该书的记录。在虚拟的6个月后,输出已读书目和还没有读的书目。
解答:可通过用户的输入数据来模拟读书及时间的流逝:如果用户希望选择一本书来阅读,则从vector容器中随机选择一本书提供给用户,从vector容器中删除该书并将该书放入set中;如果用户的输入表明最后没有读这本书,则从set中删除该书并将该书重新放入到vector容器中。
#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
vector<string> books;
set<string> readedBooks;
string name;
//建立保存未来6个月要阅读的书名的vector对象
cout << "Enter names for books you'd like to read (Ctrl+Z to end): "<<endl;
while(cin>>name)
books.push_back(name);
cin.clear(); //使流对象重新有效
bool timeOver = false;
string answer,bookName;
//用当前系统时间设置随机数发生器种子
srand( (unsigned)time(NULL) );
//模拟随时间的流逝而改变读书记录
while(!timeOver && !books.empty())
{
//时间未到6个月且还有书没有读过
cout << "Would you like to read a book? (Yes/No)" <<endl;
cin>>answer;
if(answer[0] == 'y' || answer[0] == 'Y')
{
//在vector中随机选择一本书
size_t i = rand() % books.size(); //产生一个伪随机数
bookName = books[i];
cout<< "You can read this book: "
<<bookName <<endl;
readedBooks.insert(bookName); //将该书放入已读集合
books.erase(books.begin()+i); //从vector对象中删除该书
cout<<"Did you read it?(Yes/No)" <<endl;
cin>>answer;
if(answer[0] == 'n' || answer[0] == 'N')
{
//没有读这本书
readedBooks.erase(bookName); //从已读集合中删除该书
books.push_back(bookName); //将该书重新放入vector中
}
}
cout<< "Time over?(Yes/No)"<<endl;
cin>>answer;
if(answer[0] == 'y' || answer[0] == 'Y')
{
//虚拟的6个月结束了
timeOver = true;
}
}
if(timeOver)
{
//虚拟的6个月结束了
//输出已读书目
cout << "book read: "<<endl;
for(set<string>::iterator sit = readedBooks.begin();
sit != readedBooks.end();++sit)
cout<< *sit <<endl;
}
else
cout<<"Congratulations! You have read all these books." <<endl;
return 0;
}