UVa 230 图书管理系统 Borrowers

题目链接:Borrowers - UVA 230 - Virtual Judge (vjudge.net)icon-default.png?t=M0H8https://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)重载的用法要熟练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值