题目链接:Borrowers - UVA 230 - Virtual Judge (vjudge.net)https://vjudge.net/problem/UVA-230题目大意:
写一个图书管理系统,它的运行步骤如下:
(1)输入多个书名+作者,至END结束
(2)输入多个命令 BORROW、RETURN、SHELVE , 至END结束
(3)每次输入SHELVE之后,输出书籍的名称+它的位置
我的解题思路:
总体思路:定义两个不定长数组bks和now,先将所有的书存入bks中,当收到SHELVE命令的时候根据状态把当前的书籍存入now中,根据now中书籍的位置输出答案。
分布解析:
(1)设计一个book结构体。其中包含每本书的状态变量state,根据状态变量就可以判断出这本书的状态。
struct book
{
string tit , aut;//书名+作者
int state = 0;//这本书有没有被借,即状态变量
bool operator < (const book &b) const //重载< 供sort使用
{
return aut < b.aut || (aut==b.aut && tit < b.tit);
}
};
(2)搞定输入问题。因为数据当中书名和作者是在一行,中间用 by 隔开,所以要想办法分离出书名和作者,我这里借鉴了网上的一种做法,简单清晰易懂
struct book in;
while(getline(cin,s) && s[0]!='E')
{
int i = s.find('"',1);//找到第二个引号的位置,再分离书名和作者
in.tit = s.substr(1,i-1);
in.aut = s.substr(i+5);
bks.push_back(in);
}
(3)根据输入的不同的命令,对书籍的状态做出相应的改变。
if(s[0]=='B')
{
intit = s.substr(8,s.size()-9);
for(i=bks.begin();i!=bks.end();i++)
{
if(i->tit==intit) i->state = 1;//表示书已经被借出
}
}
if(s[0]=='R')
{
intit = s.substr(8,s.size()-9);
for(i=bks.begin();i!=bks.end();i++)
{
if(i->tit==intit) i->state = 2;//表示虽然书被借出,但已经归还
}
}
(4)最后处理SHELVE命令,输出。
if(s[0]=='S')
{
for(i=bks.begin();i!=bks.end();i++)
{
if(i->state==0||i->state==2) now.push_back(*i);
}
for(i=now.begin();i!=now.end();i++)
{
if(i->state==2)
{
if(i==now.begin()) cout<<"Put "<<"\""<<i->tit<<"\""<<" first\n";
else cout<<"Put \""<<i->tit<<"\" after \""<<(i-1)->tit<<"\"\n";
for(j=bks.begin();j!=bks.end();j++)
{
if(i->tit==j->tit) j->state = 0;
}
}
}
now.clear();
printf("END\n");
}
完整代码(代码有点长。。所以最后放,hhh)
#include <bits/stdc++.h>
using namespace std;
struct book
{
string tit , aut;
int state = 0;//有没有被借
bool operator < (const book &b) const //重载< 供sort使用
{
return aut < b.aut || (aut==b.aut && tit < b.tit);
}
};
vector<book> bks , now;
int main ()
{
//IN OUT
string s,intit;
book in;
while(getline(cin,s) && s[0]!='E')
{
int i = s.find('"',1);
in.tit = s.substr(1,i-1);
in.aut = s.substr(i+5);
bks.push_back(in);
}
vector<book>::iterator i,j;
sort(bks.begin(),bks.end());
while(getline(cin,s) && s[0]!='E')
{
if(s[0]=='B')
{
intit = s.substr(8,s.size()-9);
for(i=bks.begin();i!=bks.end();i++)
{
if(i->tit==intit) i->state = 1;//表示书已经被借出
}
}
if(s[0]=='R')
{
intit = s.substr(8,s.size()-9);
for(i=bks.begin();i!=bks.end();i++)
{
if(i->tit==intit) i->state = 2;//表示书已经被借出,但已经归还
}
}
if(s[0]=='S')
{
for(i=bks.begin();i!=bks.end();i++)
{
if(i->state==0||i->state==2) now.push_back(*i);
}
for(i=now.begin();i!=now.end();i++)
{
if(i->state==2)
{
if(i==now.begin()) cout<<"Put "<<"\""<<i->tit<<"\""<<" first\n";
else cout<<"Put \""<<i->tit<<"\" after \""<<(i-1)->tit<<"\"\n";
for(j=bks.begin();j!=bks.end();j++)
{
if(i->tit==j->tit) j->state = 0;
}
}
}
now.clear();
printf("END\n");
}
}
return 0;
}
笔记总结:
(1)string的find函数
string的find ()函数用于找出字母在字符串中的位置。
.find (str,position) find ()的两个参数:. str:是要找的元素. position:字符串中的某个位置,
表示从从这个位置开始的字符串中找指定元素。
(2)string的substr函数
substr(start, length)方法:返回一个从指定位置开始,并具有指定长度的子字符串。
参数:
1.start:必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
2.length:可选项。返回的子字符串中包含的字符数。
(3)重载的用法要熟练。