习题5_8 uva230 图书管理系统 (小模拟)

这题主要相通几个点就行
首先是 存书和人名 ,然后分割字符串呢?
提示 中 书没有双引号 所以可以通过计算双引号的个数来确定书名,
而人名 不就在 ”by“ 之后吗 ,那么判断 出现”by“ 不就好了? 不行,因为书名中可能出现by !
所以再加个双引号个数为2的条件,就独一无二!
接下来是模拟管理,书名不同,我们可以用一个 map 储存书的状态 ! 当然,排序是必不可少的
然后对于 每次 的 输出
first 只需标记是否已有就行 , 然后不是第一本 每次顺便存个前面那本书不就好了? 注意你存进去之后状态得改
没啥了吧
上代码

#include <bits/stdc++.h>
using namespace std;
struct stu{
	string name;
	string book;
	bool operator < (const stu b) const
	{
		if(this->name == b.name) return this->book < b.book;
		return this->name < b.name;
	} 
}q;
vector <stu> jia;
map<string,int> f; // 1 为存着 -1 借出   0 窝着等待拯救
int main()
{
	string s,ss;
	while(getline(cin,s)) 
	{
		if(s=="END") break;
		int n = s.size(),yin = 0;
		for (int i = 0; i < n ; i++)
		{
			if(s[i]=='"') yin++;
			if(yin == 2)
			{
				q.book = s.substr(0,i+1);
				yin++; // 保证之进来一次 
			}
			if(s.substr(i,2) == "by" && yin >= 2) 
			{
				q.name = s.substr(i+3,n-i-3);
				break;
			}
		} 
		//cout<<endl<<q.book<<"  "<<q.name<<endl;
		f[q.book] = 1;
		jia.push_back(q); 
	}
	int n = jia.size();
	sort(jia.begin(),jia.end()); 
	// 初始化完成 
	while  (getline (cin,s))
	{
		int len = s.size();
		if(s[0]=='B')
		{
			ss = s.substr(7,len-7);
			f[ss] = -1;
			
		}
		else if(s[0]=='R')
		{
			ss = s.substr(7,len-7);
			f[ss] = 0;
		}
		else if(s[0]=='S')
		{
			int qian = 0,kk = 0;//qian 前面的书 kk表示是否有了第一本 
			for (int i = 0 ; i < n; i++)
			{
				ss = jia[i].book;
				if(f[ss] == 1 ) 
				{
					qian = i; kk = 1;
				}
				else	if(f[ss] == 0) 
				{
					if(!kk)  
					{
						kk = 1; f[ss] = 1; qian = i; 
						cout<<"Put "<<ss<<" first"<<endl;
					}
					else
					{
						f[ss] = 1; 
						cout<<"Put "<<ss<<" after "<<jia[qian].book<<endl;
						qian = i;
					}
				}
			}
			cout<<"END"<<endl;
		}
		else break; 	
	}
	return 0;
} 
发布了55 篇原创文章 · 获赞 1 · 访问量 2654

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/100098665
今日推荐