#include <bits/stdc++.h>
using namespace std;
fstream in,out;
int n=0;
string temp[4];
struct book
{
    string isbn;
    string name;
    double price;
}b[205];
inline bool Check()//时间O(n),空间O(1)。检查是否读入图书信息
{
    if(n==0)
    {
        cout<<"请先选择1读取图书信息\n";
        return false;
    }
    return true;
}
inline void Input()//时间O(n),空间O(1)。读入图书信息
{
    in.open("book.txt",ios::in);
    if(!in)
    {
        cout<<"未找到book.txt\n";
        return;
    }
    n=1;
    for(int i=1;i<=4;++i)in>>temp[i];
    while(!in.eof())
    {
        in>>b[n].isbn>>b[n].name>>b[n].price;
        n++;
    }
    in.close();
}
inline void Output()//时间O(n),空间O(1)。输出图书信息
{
    if(Check())
    {
        cout<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
        for(int i=1;i<n;++i)
        {
            cout<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
        }
    }
}
inline void Length()//时间O(1),空间O(1)。输出图书总册数
{
    if(Check())cout<<""<<n-1<<"本书"<<endl;
}
inline void Find()//时间O(n),空间O(1)。遍历查找图书
{
    if(Check())
    {
        cout<<"请输入要查找的图书名字\n";
        bool flag=false;
        string str;
        cin>>str;
        for(int i=1;i<n;++i)
        {
            if(str==b[i].name)
            {
                flag=true;
                cout<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
            }
        }
        if(flag==false)cout<<"没有收录该图书\n";
    }
}
inline void Get()//时间O(1),空间O(1)。直接访问图书
{
    if(Check())
    {
        cout<<"请输入你要查看的序号\n";
        int num;
        cin>>num;
        if(num<1||num>n-1)
        {
            cout<<"输入非法\n";
            return;
        }
        cout<<left<<setw(15)<<b[num].isbn<<"\t"<<left<<setw(50)<<b[num].name<<"\t"<<left<<setw(5)<<b[num].price<<"\n";
    }

}
inline void Update()//时间O(n),空间O(1)。将图书信息存入book_out.txt文件里
{
    out.open("book_out.txt",ios::out);
    out<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
    for(int i=1;i<n;++i)
    {
        out<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
    }
    out.close();
}
inline void Insert()//时间O(n),空间O(1)。在数组中插入新元素
{
    if(Check())
    {
        int num;
        cout<<"请输入要插入图书的位置\n";
        cin>>num;
        if(num<1||num>n)
        {
            cout<<"输入非法\n";
            return;
        }
        for(int i=n;i>num;--i)
        {
            b[i].isbn=b[i-1].isbn;
            b[i].name=b[i-1].name;
            b[i].price=b[i-1].price;
        }
        cout<<"请依次输入要插入的图书ISBN号,书名,价格\n";
        cin>>b[num].isbn>>b[num].name>>b[num].price;
        n++;
        Update();
    }
}
inline void Delete()//时间O(n),空间O(1)。在数组中删除元素
{
    if(Check())
    {
        int num;
        cout<<"请输入要删除图书的位置\n";
        cin>>num;
        if(num<1||num>n-1)
        {
            cout<<"输入非法\n";
            return;
        }
        for(int i=num;i<n-1;++i)
        {
            b[i].isbn=b[i+1].isbn;
            b[i].name=b[i+1].name;
            b[i].price=b[i+1].price;
        }
        n--;
        Update();
    }
}
inline void BubbleSort()//时间O(n^2),空间O(1)。冒泡排序
{
    if(Check())
    {
        for(int i=1;i<n-1;++i)
        {
            for(int j=1;j<n-i;++j)
            {
                if(b[j].price>b[j+1].price)
                {
                    swap(b[j],b[j+1]);
                }
            }
        }
        Update();
    }
}
inline void QuickSort(int left,int right)//时间O(nlog2n),空间O(nlogn)。快速排序
{
    if(left>=right)return;
    int i=left,j=right;
    double temp=b[left].price;
    while(i<j)
    {
        while(b[j].price>=temp&&i<j)--j;
        swap(b[i],b[j]);
        while(b[i].price<=temp&&i<j)++i;
        swap(b[i],b[j]);
    }
    QuickSort(left,i-1);
    QuickSort(i+1,right);
    return;
}
inline void QueryMax()//时间O(n),空间O(1)。查询最大值
{
    if(Check())
    {
        double mmax=b[1].price;
        int flag=1;
        for(int i=2;i<n;++i)
        {
            if(b[i].price>mmax)
            {
                flag++;
                mmax=b[i].price;
            }
        }
        for(int i=1;i<n;++i)
        {
            if(b[i].price==mmax)
            {
                cout<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
            }
        }
    }
}
inline void Inverse()//时间O(n),空间O(1)。逆序存储图书信息
{
    if(Check())
    {
        for(int i=1;i<=n/2;++i)
        {
            swap(b[i],b[n-i]);
        }
    }
}
int main()
{
    while(1)
    {
        int opt;
        printf("欢迎使用图书管理系统,请输入整数来实现你需要的功能\n"
               "1.图书数据加载,使用数组进行存储\n"
               "2.输出所有图书信息\n"
               "3.总图书册数\n"
               "4.输入要查找图书的名字\n"
               "5.输入要查找图书的序号\n"
               "6.插入一本图书\n"
               "7.删除一本图书\n"
               "8.按价格冒泡排序\n"
               "9.按价格快速排序\n"
               "10.查询价格最大的图书\n"
               "11.逆序存储数据\n"
               "0.退出\n");
        scanf("%d",&opt);
        switch(opt)
        {
            case 1:Input();break;
            case 2:Output();break;
            case 3:Length();break;
            case 4:Find();break;
            case 5:Get();break;
            case 6:Insert();break;
            case 7:Delete();break;
            case 8:BubbleSort();break;
            case 9:if(Check()){QuickSort(1,n-1),Update();}break;
            case 10:QueryMax();break;
            case 11:Inverse();break;
            case 0:return 0;break;
        }
    }
    return 0;
}
array

相关文章:

  • 2022-12-23
  • 2021-04-13
  • 2021-10-29
  • 2021-07-19
猜你喜欢
  • 2022-12-23
  • 2021-08-29
  • 2021-06-06
  • 2021-09-24
  • 2021-09-04
相关资源
相似解决方案