#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; }
相关文章: