Uva230 Borrowers【map+sort】【习题5-8】

13 篇文章 0 订阅
12 篇文章 0 订阅
该博客介绍了一道名为'Borrowers'的编程题,涉及图书管理系统的模拟。文章阐述了如何处理BORROW(借书)、RETURN(还书)和SHELVE(上架)三种指令,通过使用结构体存储图书信息,并利用map建立索引。在处理指令前,首先对所有图书按作者和书名排序。当执行SHELVE指令时,会按顺序找到已归还图书的插入位置并输出相关信息。
摘要由CSDN通过智能技术生成

题目:Borrowers

题意:模拟一个图书管理系统,先给出书架上的书,然后有3种指令:BORROW指令表示借书,RETURN指令表示还书,SHELVE指令表示把所有已归还但还未上架的图书排序后依次插入书架并输出图书标题和插入位置(可能是第一本书或者某本书的后面)。图书排序的方法是先按作者从小到大排,再按标题从小到大排。在处理第一条指令之前,你应当先将所有图书按照这种方式排序。

思路:用结构体表示(书名,作者,是否在书架上),用map<书名,编号>建立个索引;然后处理指令即可:

BORROW:用索引找到本书位置,然后标记下架

RETURN:用索引找到本书的完整信息,存入容器中

SHELVE:用索引找到本书位置,然后向前遍历:当找到首个存在的书,即按要求输出即可,如果没找到,说明当前书为当前书架的第一本!

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct bookInfo{
    string title;//书名
    string author;//作者
    bool exist;//是否在书架上
};
vector<bookInfo>bookshelf;//书架
vector<bookInfo>noAvailavle;//借出去的书
map<string,int>index;//索引:给图书编号
bool cmp(bookInfo a,bookInfo b){//排序
    if(a.author == b.author)
        return a.title < b.title;
return a.author < b.author;}
int main()
{
    char str[100];
    while(cin.getline(str,100) && str[0] != 'E')
    {
        string temp; bookInfo book; int i;
        for(i=1;str[i]!='"';i++) temp += str[i];
        book.title = temp;
        temp.clear();
        for(int j=i+5;str[j]!='\0';j++) temp += str[j];
        book.author = temp;
        book.exist = true;
        bookshelf.push_back(book);
    }
    sort(bookshelf.begin(),bookshelf.end(),cmp);
    for(int i=0;i<bookshelf.size();i++) index[bookshelf[i].title] = i;//给图书添加编号,用于下边方便找书的位置
    while(cin.getline(str,100) && str[0]!='E')
    {
        string name;
        if(str[0] != 'S') for(int i=8;str[i]!='"';i++) name += str[i];
        if(str[0] == 'B') bookshelf[index[name]].exist = false;//标记图书借出
        if(str[0] == 'R') noAvailavle.push_back(bookshelf[index[name]]);//收集还的书
        if(str[0] == 'S')
        {
            sort(noAvailavle.begin(),noAvailavle.end(),cmp);//按题意需排序
            for(int i=0;i<noAvailavle.size();i++)
            {
                string temp = noAvailavle[i].title;
                int j,start = index[temp];
                for(j=start-1;j>=0;j--)//从当前归还的书往前找首个存在的图书
                {
                    if(bookshelf[j].exist)
                    {
                        cout << "Put \"" << temp << "\" after \"" << bookshelf[j].title << "\"\n";
                        break;
                    }
                }
                if(j < 0)//没有找到,说明此书为当前书架的第一本!
                    cout << "Put \"" << temp << "\" first\n";
                bookshelf[start].exist = true;//标记已归还上架
            }
            noAvailavle.clear();//清空借书容器,(没有END前还会再借书还书的!)
            cout << "END\n";
        }
    }
return 0;}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值