题目中的意思是,模拟一个借还书的系统,告诉使用者书的摆放顺序:
———— 优先按照书的作者排序,否则按照书籍标题排序。
可以给每一个书籍建立一个struct,储存书籍标题,书籍作者。
(在结构体里重新定义了小于号“<”,便于sort排序)
首先在map中,保存书籍的在馆信息,负值表示需要归还,0表示未被归还,正数代表书籍的序列号,同时在馆。#include <bits/stdc++.h>
using namespace std;
map<string, int> word;
struct book {
string title;
string author;
bool operator < (const struct book & change)
{
if (author == change.author)
return (title < change.title);
else
return author < change.author;
}
}bk[5000];
int main()
{
//freopen("t.txt", "w", stdout);
string line;
int i = 0;
while (getline(cin, line))
{
if (line == "END")
break;
string x, y;
x = line.substr(0, line.find_last_of("\"") + 1);//copy
y = line.substr(line.find_last_of("\"") + 5);//copy
bk[i].title = x;
bk[i++].author = y;
}
sort(bk, bk + i);
for (int j = 0; j < i; j++)
{
word[bk[j].title] = j + 1;
//cout << bk[j].title<<endl;
}
string s,temp;
while (cin >> s)
{
if (s == "END")
break;
if (s == "BORROW")
{
getchar();//吃掉中间的一个空格符
getline(cin, temp);
word[temp] = 0;
}
if (s == "RETURN")
{
getchar();
getline(cin, temp);
word[temp] = -1;
}
if (s == "SHELVE")
{
for (int j = 0; j < i; j++)
{
if (word[bk[j].title] == -1)
{
if (j == 0)
{
cout << "Put " << bk[j].title << " first" << endl;
}
else
{
int k = j - 1;
while (word[bk[k].title] == 0)
{
k--;
if (k < 0)
break;
}
if (k < 0)
cout << "Put " << bk[j].title << " first" << endl;
else
cout << "Put " << bk[j].title << " after " << bk[k].title << endl;
}
word[bk[j].title] = j + 1;
}
}
cout << "END" << endl;
}
}
//system("pause");
return 0;
}
新东西
1.使用string的substr来取某一段复制,返回值是一个新的string,两个参数,起始位置,结束位置(省缺为str.size())。2.使用find来找到需要分割的地方,find_last_of("char"),找到最后一个出现char的地方,返回一个数值,若没有,返回负数。
对于输出:
输出的时候,对第一本需要归还单独处理,其余的,对于一本需要归还的书,查找他前面一个未在读者手中的书籍,如果找到,就把这本书放在已经存在的书籍的下面,否则的话,k应该返回一个负数,这个时候,表示没有满足条件的书籍,直接先放他就行了。
最后不要忘记更改图书的在馆信息,保证后来的书放置的时候,找得到他。