题目说明:输入图书馆中所有书的信息,并给出检索类别和关键字,输出所检索到的书ID。
算法:简单的顺序查找。
注意点:主要是输入的格式
cin>>以空格、回车、TAB结束,getline()默认以回车结束,cin.get()无参数,读取一个字符
取子字符串,用substr(),或用copy()结尾加上'\0'。
代码:
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
struct Book{
string ID;
string title;
string author;
string keyword[8];
int keywordnum;
string publisher;
string year;
};
vector<Book> book;
int N,M;
bool cmpbyID(const Book &a,const Book &b){
return a.ID<b.ID;
}
void printsearchID(string str);
int main(){
cin>>N;
cin.get();//舍弃输入缓冲区的回车
for(int i=0;i<N;i++){
Book temp;
temp.keywordnum=0;
getline(cin,temp.ID);
getline(cin,temp.title);
getline(cin,temp.author);
int j=0;
do {
cin>>temp.keyword[j++];
temp.keywordnum++;
}while(cin.get()!='\n');
getline(cin,temp.publisher);
getline(cin,temp.year);
book.push_back(temp);
}
sort(book.begin(),book.end(),cmpbyID);
cin>>M;
cin.get();
string str;
for(int i=0;i<M;i++){
getline(cin,str);
printsearchID(str);
}
return 0;
}
void printsearchID(string str){
char s1;
char s2[100];
s1=str[0];
int length=str.copy(s2,str.size(),3);
s2[length]='\0';
cout<<str<<endl;
bool flag=false;
switch(s1){
case '1':
for(int i=0;i<N;i++){
if(book[i].title==s2){
cout<<book[i].ID<<endl;
flag=true;
}
}
break;
case '2':
for(int i=0;i<N;i++){
if(book[i].author==s2){
cout<<book[i].ID<<endl;
flag=true;
}
}
break;
case '3':
for(int i=0;i<N;i++){
for(int j=0;j<book[i].keywordnum;j++){
if(book[i].keyword[j]==s2){
cout<<book[i].ID<<endl;
flag=true;
break;
}
}
}
break;
case '4':
for(int i=0;i<N;i++){
if(book[i].publisher==s2){
cout<<book[i].ID<<endl;
flag=true;
}
}
break;
case '5':
for(int i=0;i<N;i++){
if(book[i].year==s2){
cout<<book[i].ID<<endl;
flag=true;
}
}
break;
default:break;
}
if(!flag)
cout<<"Not Found"<<endl;
}