C++圖書館管理系統 [STL實現]
//
//#系統主要功能 [Ver 1.0 保留了字串選單]
//
//一、管理員許可權
// 1.對圖書的增刪查改
// 2.對使用者的增刪查改
// 3.修改管理員的密碼
//二、使用者許可權
// 1.查詢
// 2.借閱
// 3.續借
// 4.修改密碼
//三、程式檔案
// book.txt 存放圖書館資料 【編號 書名 作者 出版日期】
// user.txt 存放使用者資料 【學號 姓名 密碼】
// userborrow.txt 存放使用者借書資料【編號 書名 作者 出版日期】
// library.txt 存放修改後的書籍資料 【編號 書名 作者 出版日期】
//四、資料示例
// book : 1 JavaScript 祖克伯 2018 11
// user : 20176666 Leo 123456
//
//#各個功能實現方法原理
// 1.圖書的增刪查改 首先定義了book類,並過載輸入運算子,在增加圖書時,便於圖書資訊的整體輸入,然後在管理員類裡建立圖書Vector和索引Map,
// 便於存放圖書資料和查詢圖書。在查詢時,有三種方式:書名查詢、作者查詢、出版日期查詢。查詢之前,把不同的型別作為鍵值,分別存放Map。
// 刪除圖書和修改圖書之前,首先要找到圖書,然後在操作。對使用者的增刪查改同理。
// 2.使用者的查詢和管理員同理。在借閱之前,先定位該書,然後從書庫Vector壓入使用者借閱的Vector,每個使用者只能續借一次,所以續借就是修改0為1,
//
//#程式設計心得體會見末尾
//
/*
*Library Management System -By Leo
* Copyright © 2018.5 - 2018.6
* Leo.All Rights Reserved.
* Ver 1.0
*/
//主程式程式碼
#include<bits/stdc++.h>
using namespace std;
class date//日期類
{
private:
int year;//年
int month;//月
public:
//建構函式
date(){
year=0;
month=0;
}
date(int x,int y){
year=x;
month=y;
}
//get set 函式
int getYear(){return year;}
int getMonth(){return month;}
void setYear(int x){year=x;}
void setMonth(int x){month=x;}
//顯示日期函式
void dispdate(){
cout<<year<<"年"<<month<<"月";
}
//過載輸入運算子
friend istream &operator>>(istream & in, date &x){
in>>x.year>>x.month;
return in;
}
//過載輸出運算子
friend ostream &operator<<( ostream &output, const date &x )
{
output<<x.year<<" "<<x.month;
return output;
}
};
class book//書籍類
{
private:
int id;//圖書編號
string title;//書名
string author;//作者
date dat;//出版日期
int num;//庫存數量 副本為3
int renewnum;//續借次數 最多一次
string startdate;
string enddate;
public:
//建構函式
book(){
id=0;
title="NULL";
author="NULL";
dat;
num=3;
renewnum=0;
}
book(int x,string a,string b,date c){
id=x;
title=a;
author=b;
dat=c;
num=3;
renewnum=0;
}
//Get函式
int getId(){return id;}
string getTitle(){return title;}
string getAuthor(){return author;}
date getDate(){return dat;}
int getNum(){return num;}
int getRenewnum(){return renewnum;}
//Set函式
void setId(int x){id=x;}
void setTitle(string x){title=x;}
void setAuthor(string x){author=x;}
void setDate(date x){dat=x;}
void setNum(int x){num=x;}
void setRenewnum(int x){renewnum=x;}
//獲取系統時間作為借書時間
string getTime(){
time_t t = time(0);
char tmp[11];
strftime(tmp,sizeof(tmp),"%Y %m %d",localtime(&t));
return tmp;
}
void dispdate(){
string str=getTime();
int x=(str[6]-48)+2;
for(int i=0;i<=4;i++){
cout<<str[i];
}
cout<<str[5]<<x;//2018_08_08
for(int i=7;i<=9;i++){
cout<<str[i];
}
}
//顯示函式
void dispbook(bool x){
if(x){
cout<<setw(10)<<"編號"<<setw(10)<<"書名"<<setw(10)<<"作者"<<setw(10)<<"出版日期"<<setw(6)<<" 庫存 "<<setw(6)<<"續借"<<setw(12)<<"借閱時間"<<setw(10)<<"應還時間"<<endl;
cout<<setw(10)<<id<<setw(10)<<title<<setw(10)<<author<<setw(6)<<dat<<setw(6)<<num<<setw(6)<<renewnum<<" "<<setw(6)<<getTime()<<" ";dispdate();cout<<endl;
cout<<endl;
}
else{
cout<<setw(10)<<"編號"<<setw(10)<<"書名"<<setw(10)<<"作者"<<setw(10)<<"出版日期"<<setw(6)<<" 庫存 "<<setw(6)<<"續借次數"<<endl;
cout<<setw(10)<<id<<setw(10)<<title<<setw(10)<<author<<setw(6)<<dat<<setw(6)<<num<<setw(6)<<renewnum<<endl;
cout<<endl;
}
}
//過載輸入運算子
friend istream &operator>>(istream & in, book &x){
in>>x.id>>x.title>>x.author>>x.dat;
return in;
}
//過載輸出運算子
friend ostream &operator<<( ostream &output, const book &x )
{
output<<x.id<<" "<<x.title<<" "<<x.author<<" "<<x.dat<<" "<<x.num<<" "<<x.renewnum;
return output;
}
//過載賦值運算子
void operator=(const book &x){
id=x.id;
title=x.title;
author=x.author;
dat=x.dat;
num=x.num;
renewnum=x.renewnum;
}
};
class user//使用者類
{
private:
long long int id;//學號
string name;//姓名
string password;//密碼
int booknum;//借閱數目
public:
vector<book> b;//存放使用者借的圖書
vector<book>::iterator b1;//使用者借的圖書 迭代器
vector<book> b2;//檔案讀寫容器 相當於圖書館
vector<book>::iterator itb2;//檔案讀寫迭代器
multimap<string,int> m1;//根據書名查詢 First->書名 Second->下標
multimap<string,int>::iterator mit1;//根據書名查詢 對應迭代器
multimap<string,int> m2;//根據作者查詢 First->作者 Second->下標
multimap<string,int>::iterator mit2;//根據作者查詢 對應迭代器
multimap<int,int> m3;//根據出版日期查詢 First->出版日期 Second->下標
multimap<int,int>::iterator mit3;//根據出版日期查詢 對應迭代器
//建構函式
user(){
id=0;
name="NULL";
password="123456";
booknum=0;
}
user(long long int a,string b,string c){
id=a;
name=b;
password=c;
booknum=0;
}
//Get函式
long long int getId(){return id;}
string getName(){return name;}
string getPassword(){return password;}
int getBooknum(){return booknum;}
//Set函式
void setId(long long int x){id=x;}
void setName(string x){name=x;}
void setPassword(string x){password=x;}
void setBooknum(int x){booknum=x;}
//驗證密碼
bool isPassword(string x){
if(password==x) return true;
else return false;
}
//過載輸入運算子
friend istream &operator>>(istream & in, user &x){
in>>x.id>>x.name>>x.password;
return in;
}
//過載輸出運算子
friend ostream &operator<<( ostream &output, const user &x )
{
output<<x.id<<" "<<x.name<<" "<<x.password;
return output;
}
//顯示函式
void dispuser(){
if(booknum){//如果借閱數量不為0 則輸出借閱圖書
cout<<setw(10)<<"學號"<<setw(10)<<"姓名"<<setw(10)<<"密碼"<<setw(10)<<"借閱數量"<<endl;
cout<<setw(10)<<id<<setw(10)<<name<<setw(10)<<password<<setw(10)<<booknum<<endl;
for(b1=b.begin();b1!=b.end();b1++){
b1->dispbook(1); // cout<<*b1<<endl;
}
}
else{
cout<<setw(10)<<"學號"<<setw(10)<<"姓名"<<setw(10)<<"密碼"<<setw(10)<<"借閱數量"<<endl;
cout<<setw(10)<<id<<setw(10)<<name<<setw(10)<<password<<setw(6)<<booknum<<endl;
}
}
//顯示book檔案所有圖書
void dispallbook(){
for(itb2=b2.begin();itb2!=b2.end();itb2++){
itb2->dispbook(0); // cout<<*b1<<endl;
}
}
//借閱圖書
void borrowbook(int x){
b.push_back(b2[x-1]);//從檔案書籍Vector b2 到使用者書籍Vector b
b[booknum].setId(booknum+1);//重新設定下標
booknum++;//借閱數量 +1
int i=b2[x-1].getId()-1;//向量下標
int j=b2[x-1].getNum()-1;//庫存數量 -1
b[i].setNum(j);//修改庫存
}
//續借圖書
void reborrowbook(){
dispuser();
cout<<"請輸入你要續借的圖書編號:"<<endl;
int x;
cin>>x;
b[x-1].setRenewnum(1);
b[x-1].dispbook(1);
//cout<<b[x-1];
cout<<endl;
cout<<"續借成功!"<<endl;
}
//歸還圖書
void returnbook(int x){
if(b.empty()){//如果使用者借閱圖書為0
cout<<"該使用者沒有借閱任何書籍!\n";
}
else{
b1=b.begin()-1+x;
b.erase(b1);//刪除圖書
booknum--;//借閱數量 -1
int i=b2[x-1].getId()-1;//向量下標
int j=b2[x-1].getNum()+1;//庫存數量 +1
b[i].setNum(j);//修改庫存
save();
cout<<"成功歸還圖書!\n";
}
}
//查詢圖書 [圖書館中的圖書]
//按書名查詢
string seaBytitle(string x){
mit1=m1.find(x);//根據書名查詢 返回迭代器
int num=m1.count(x);// x 出現的次數
if(mit1==m1.end()){//如果沒找到 find() 會返回m2.end()
cout<<" 未找到該圖書!請檢查書名是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit1->second;//下標
b2[temp-1].dispbook(0);//顯示圖書資訊
mit1++;
}
}
}
//按作者查詢
string seaByauthor(string x){
mit2=m2.find(x);//根據書名查詢 返回迭代器
int num=m2.count(x);// x 出現的次數
if(mit2==m2.end()){//如果沒找到 find() 會返回m2.end()
cout<<" 未找到該圖書!請檢查作者名是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit2->second;//下標
b2[temp-1].dispbook(0);//顯示圖書資訊
mit2++;
}
}
}
//按出版日期查詢
string seaBydate(int x){
mit3=m3.find(x);//根據書名查詢 返回迭代器
int num=m3.count(x);
if(mit3==m3.end()){//如果沒找到 find() 會返回m3.end()
cout<<" 未找到該圖書!請檢查日期是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit3->second;//下標
b2[temp-1].dispbook(0);//顯示圖書資訊
mit3++;
}
}
}
//讀取檔案
void read()
{
b.clear();
b2.clear();
m1.clear();
m2.clear();
m3.clear();
ifstream infile;//只讀模式開啟book.txt
infile.open("book.txt",ios::in);
book temp;
if (!infile){cout<<"Error!讀取檔案失敗!\n";}
else{
while(infile>>temp){
b2.push_back(temp);//壓入圖書館
m1.insert(make_pair(temp.getTitle(),temp.getId()));//書名
m2.insert(make_pair(temp.getAuthor(),temp.getId()));//作者
m3.insert(make_pair(temp.getDate().getYear(),temp.getId()));//出版日期
}
}
infile.close();
}
//儲存使用者借閱圖書檔案
void save()
{
ofstream outfile;
outfile.open("userborrow.txt",ios::out);
if (!outfile){cout<<"Error!儲存檔案失敗!\n";}
else{
for(b1=b.begin();b1!=b.end();b1++){
outfile<<*b1<<endl;
}
}
outfile.close();
b.clear();
b2.clear();
m1.clear();
m2.clear();
m3.clear();
}
};
class admin//管理員類
{
public:
date d;
string password;//管理員密碼
vector<user> u;
vector<user>::iterator u1;
vector<book> b;
vector<book>::iterator b1;
//書籍map
multimap<string,int> m1;//根據書名查詢 First->書名 Second->下標
multimap<string,int>::iterator mit1;//根據書名查詢 對應迭代器
multimap<string,int> m2;//根據作者查詢 First->作者 Second->下標
multimap<string,int>::iterator mit2;//根據作者查詢 對應迭代器
multimap<int,int> m3;//根據出版日期查詢 First->出版日期 年 Second->下標
multimap<int,int>::iterator mit3;//根據出版日期查詢 對應迭代器
//使用者map
map<long long int,string> m4;//根據學號查詢 First->學號 Second->姓名
map<long long int,string>::iterator mit4;//根據學號查詢 對應迭代器
map<string,long long int> m5;//根據姓名查詢 First->姓名 Second->學號
map<string,long long int>::iterator mit5;//根據姓名查詢 對應迭代器
//建構函式
admin(){
password="123456";//預設密碼
}
admin(string x){
password=x;
}
//修改密碼
void setPassword(string x){password=x;}
//讀取user檔案
void readuser(){
u.clear();
m4.clear();
m5.clear();
ifstream infile;//只讀模式開啟user.txt
infile.open("user.txt",ios::in);
user temp;
if (!infile){cout<<"Error!讀取檔案失敗!\n";}
else{
while(infile>>temp){
u.push_back(temp);//加入user vector
m4.insert(make_pair(temp.getId(),temp.getName()));//根據學號查詢
m5.insert(make_pair(temp.getName(),temp.getId()));//根據姓名查詢
}
}
infile.close();
}
//儲存user檔案
void saveuser(){
ofstream outfile;
user x;
outfile.open("user.txt",ios::app);
if (!outfile){cout<<"Error!儲存檔案失敗!\n";}
else{
for(u1=u.begin();u1!=u.end();u1++){
outfile<<u1->getId()<<" "<<u1->getName()<<" "<<u1->getPassword()<<endl;
}
}
outfile.close();
u.clear();
m4.clear();
m5.clear();
}
//讀取book檔案
void readbook()
{
b.clear();
m1.clear();
m2.clear();
m3.clear();
ifstream infile;//只讀模式開啟book.txt
infile.open("book.txt",ios::in);
book temp;
if (!infile){cout<<"Error!讀取檔案失敗!\n";}
else{
while(infile>>temp){
b.push_back(temp);//加入圖書館書庫
m1.insert(make_pair(temp.getTitle(),temp.getId()));//書名
m2.insert(make_pair(temp.getAuthor(),temp.getId()));//作者
m3.insert(make_pair(temp.getDate().getYear(),temp.getId()));//出版日期
}
}
infile.close();
}
//儲存檔案
void savebook()
{
ofstream outfile;
outfile.open("library.txt",ios::out);
if (!outfile){cout<<"Error!讀取檔案失敗!\n";}
else{
for(b1=b.begin();b1!=b.end();b1++){
outfile<<b1->getId()<<" "<<b1->getTitle()<<" "<<b1->getAuthor()<<" "<<b1->getDate()<<endl;
}
}
outfile.close();
b.clear();
m1.clear();
m2.clear();
m3.clear();
}
//增加圖書
void addBook(){
book tem;
cout<<"請依次輸入書籍資訊: [編號 書名 作者 出版日期 xxxx年xx月]\n";
cin>>tem;//過載輸入運算子
b.push_back(tem);
cout<<"\n書籍新增成功!\n";
}
//刪除圖書
void delBook(){
if(b.empty()){cout<<" !!!Error!!!\n書籍容器為空!請先新增書籍!\n";}
else {
for(b1=b.begin();b1!=b.end();b1++){//輸出容器中所有圖書
b1->dispbook(0);
}
cout<<endl;
cout<<"\n\n請輸入要刪除書籍的編號:\n";
int x;
cin>>x;//輸入書籍編號
b1=b.begin()-1+x;
cout<<*b1<<endl;
b.erase(b1);
cout<<"刪除書籍成功!\n";
}
}
//查詢圖書 這裡暫時呼叫使用者裡的查詢圖書函式
//查詢圖書 [圖書館中的圖書]
//按書名查詢
string seaBytitle(string x){
mit1=m1.find(x);//根據書名查詢 返回迭代器
int num=m1.count(x);// x 出現的次數
if(mit1==m1.end()){//如果沒找到 find() 會返回m2.end()
cout<<" 未找到該圖書!請檢查書名是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit1->second;//下標
b[temp-1].dispbook(0);//顯示圖書資訊
mit1++;
}
}
}
//按作者查詢
string seaByauthor(string x){
mit2=m2.find(x);//根據書名查詢 返回迭代器
int num=m2.count(x);// x 出現的次數
if(mit2==m2.end()){//如果沒找到 find() 會返回m2.end()
cout<<" 未找到該圖書!請檢查作者名是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit2->second;//下標
b[temp-1].dispbook(0);//顯示圖書資訊
mit2++;
}
}
}
//按出版日期查詢
string seaBydate(int x){
mit3=m3.find(x);//根據書名查詢 返回迭代器
int num=m3.count(x);
if(mit3==m3.end()){//如果沒找到 find() 會返回m3.end()
cout<<" 未找到該圖書!請檢查日期是否正確!\n";
}
else{
cout<<"您要查詢的圖書資訊如下:\n\n";
for(;num>0;num--){//輸出所有結果
int temp=mit3->second;//下標
b[temp-1].dispbook(0);//顯示圖書資訊
mit3++;
}
}
}
//修改圖書
void setbook(){
int number;
book temp;
for( b1=b.begin();b1!=b.end();b1++){//輸出所有圖書讓使用者選擇編號
cout<<*b1<<endl<<endl;
}
cout<<"請輸入要修改的圖書編號:"<<endl;
cin>>number;
system("cls");
cout<<"您要修改的圖書資訊:"<<endl;
cout<<b[number-1]<<endl;//輸出該圖書資訊 確認修改
b.erase(b.begin()-1+number);//刪除該圖書
cout<<"請依次輸入要新增的書籍資訊: [編號 書名 作者 出版日期 xxxx年xx月]\n";
cin>>temp;//輸入新圖書資訊
b.insert((b.begin()-1+number),temp);
system("cls");
cout<<" \n修改圖書資訊成功!"<<endl;
savebook();//儲存到檔案
}
//建立使用者 增加使用者
void adduser(){
cout<<"請輸入要建立的使用者資訊: [學號 姓名 密碼]\n";
user temp;
cin>>temp;
u.push_back(temp);//加入user vector
m4.insert(make_pair(temp.getId(),temp.getName()));//根據學號查詢
m5.insert(make_pair(temp.getName(),temp.getId()));//根據姓名查詢
cout<<"建立使用者: "<<temp<<" 成功!\n";
}
//刪除使用者
void deluser(){
for(mit4=m4.begin();mit4!=m4.end();mit4++){//輸出所有user
cout<<" "<<mit4->first<<" "<<mit4->second<<endl;
}
cout<<"請輸入要刪除的使用者學號:\n\n";
long long int temp;
cin>>temp;
mit4=m4.find(temp);//學號查詢
if(mit4!=m4.end()){
cout<<"刪除使用者: ";
cout<<mit4->first<<" "<<mit4->second;
cout<<" 成功!\n";
m4.erase(mit4);
m5.erase(mit4->second);
}
else cout<<"\n未找到學號為 "<<temp<<" 的使用者!\n";
}
//查詢使用者 學號
void seaById(){
cout<<"請輸入要查詢的學號:\n";
int id;
cin>>id;
mit4=m4.find(id);//學號查詢
if(mit4!=m4.end()){
cout<<"您要查詢的使用者: \n";
cout<<" "<<mit4->first<<" "<<mit4->second<<endl;
}
else cout<<"\n未找到學號為 "<<id<<" 的使用者!\n";
}
//查詢使用者 姓名
void seaByName(){
cout<<"請輸入要查詢的姓名:\n";
string name;
cin>>name;
mit5=m5.find(name);
if(mit5!=m5.end()){
cout<<"您要查詢的使用者: \n";
cout<<" "<<mit5->second<<" "<<mit5->first<<endl;
}
else cout<<"\n未找到姓名為 "<<name<<" 的使用者!\n";
}
//修改使用者
void setuser(){
for(mit4=m4.begin();mit4!=m4.end();mit4++){//輸出所有user
cout<<" "<<mit4->first<<" "<<mit4->second<<endl;
}
cout<<"請輸入要修改的學號:\n";
int id;
cin>>id;
mit4=m4.find(id);//學號查詢
if(mit4!=m4.end()){
cout<<"您要修改的使用者: \n";
cout<<" "<<mit4->first<<" "<<mit4->second<<endl;
cout<<"您輸入修改後的 學號 姓名 密碼: \n";
user temp;
cin>>temp;
m4.erase(mit4);//刪除
m5.erase(mit4->second);//刪除
m4.insert(make_pair(temp.getId(),temp.getName()));//學號
m5.insert(make_pair(temp.getName(),temp.getId()));//姓名
cout<<"修改成功!\n";
}
else cout<<"\n未找到學號為 "<<id<<" 的使用者!\n";
}
//驗證密碼
bool isPassword(string x){
if(password==x) return true;
else return false;
}
//顯示所有使用者
void dispalluser(){
for(u1=u.begin();u1!=u.end();u1++){
u1->dispuser();
}
}
};
class menu//選單類
{
public:
date d;
book b;
user u;
admin a;
void welcome(){//主歡迎選單
system("color 0B");
cout << "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n";
cout << "■ ■\n";
cout << "■ ■\n";
cout << "■ ┏━━━━━━━━━━━━━━━━━━━━━━━┓ ■\n";
cout << "■ ┃ ┃ ■\n";
cout << "■ ┃ 圖書館管理系統 Ver 1.0┃ ■\n";
cout << "■ ┃ ┃ ■\n";
cout << "■ ┃ 山東農業大學 ┃ ■\n";
cout << "■ ┃ ┃ ■\n";
cout << "■ ┃ By Leo 2018.5 ┃ ■\n";
cout << "■ ┃ ┃ ■\n";
cout << "■ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ ■\n";
cout << "■ ■\n";
cout << "■ ■\n";
cout << "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n";
cout << "\n 按 任 意 鍵 清 屏 \n";
//Sleep(2000);
system("pause");
system("cls");
system("color 0F");
}
void selectmenu(){//選擇選單 管理員or使用者
cout << " [0] 退出系統\n";
cout << " [1] 管理員介面\n";
cout << " [2] 使用者介面\n";
cout << "請輸入要進入的頁面:\n" ;
int command;
cin>>command;
switch (command){
case 0:{
cout<<" - 感謝使用 - 正在退出系統 - \n";
system("pause");
system("cls");
exit(0); //exit(1)是異常退出 exit(0)是正常退出
break;
}
case 1:{
cout<<"請輸入管理員初始密碼: [123456] \n";
string pass;
rcin : while(cin>>pass)
{
if(u.isPassword(pass)){system("cls");a.readbook();a.readuser();Administrator();}
else{
cout<<"密碼輸入錯誤!請重新輸入:\n";
goto rcin;
}
}
break;
}
case 2:{
cout<<"請輸入使用者初始密碼: [123456] \n";
string pass;
recin : while(cin>>pass)
{
if(u.isPassword(pass)){
system("cls");
int a; string b,c;
cout<<"請輸入使用者資訊:[學號 姓名 密碼]\n";
cin>>a>>b>>c;
u.setId(a);u.setName(b);u.setPassword(c);
u.read();
cout<<"初始化使用者完成!進入使用者操作選單!\n";
useroperator();
}
else{
cout<<"密碼輸入錯誤!請重新輸入:\n";
goto recin;
}
}
break;
}
default:{
cout << "Command Error!請重新輸入!" << endl;
selectmenu();
}
}
}
void Administrator(){//管理員選單
amenu:cout << "■■■■■■■■■■■■管理員系統■■■■■■■■■■■■■\n";
cout << "■ ┏━━━━━━━━━━━━━━┓ ■\n";
cout << "■ ┃ [0] 退出系統 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [1] 增加圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [2] 刪除圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [3] 查詢圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [4] 修改圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [5] 建立使用者 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [6] 刪除使用者 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [7] 查詢使用者 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [8] 修改使用者 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [9] 修改密碼 ┃ ■\n";
cout << "■ ┗━━━━━━━━━━━━━━┛ ■\n";
cout << "■■■■■■■■■■■[-1]返回上一層■■■■■■■■■■■■\n";
cout << "輸入要進行的操作:" ;
int command;
cincom : cin >> command;
switch (command){
case -1:{
system("cls");
selectmenu();//返回上一層
}
case 0:{//退出系統
a.savebook();
a.saveuser();
cout<<" - 感謝使用 - 正在退出系統 - \n";
system("pause");
system("cls");
exit(0); //exit(1)是異常退出 exit(0)是正常退出
break;
}
case 1:{//增加圖書
system("cls");
a.addBook();goto amenu;//返回主選單
break;}
case 2:{//刪除圖書
system("cls");
a.delBook();goto amenu;//返回主選單
break;}
case 3:{//查詢圖書
system("cls");
chaxun:cout<<" [1]按書名查詢\n";
cout<<" [2]按作者查詢\n";
cout<<" [3]按出版日期查詢\n";
cout<<"請輸入查詢方式:\n";
int way;
cin>>way;
switch(way){
case 1:{
cout<<"請輸入要查詢的書名:\n";
string title;
cin>>title;
//u.seaBytitle(title);
a.seaBytitle(title);
system("pause");
system("cls");
goto amenu;
}
case 2:{
cout<<"請輸入要查詢的作者:\n";
string author;
cin>>author;
//u.seaByauthor(author);
a.seaByauthor(author);
system("pause");
system("cls");
goto amenu;
}
case 3:{
cout<<"請輸入要查詢的出版日期: [****年]\n";
int year;
cin>>year;
//u.seaBydate(year);
a.seaBydate(year);
system("pause");
system("cls");
goto amenu;
}
default:{
system("cls");
cout << " Command Error!請重新輸入!" << endl;
goto chaxun;
}
}
}
case 4:{//修改圖書
system("cls");
a.setbook();
goto amenu;
break;
}
case 5:{//建立使用者
system("cls");
a.adduser();
system("pause");
goto amenu;
break;
}
case 6:{//刪除使用者
system("cls");
a.deluser();
system("pause");
goto amenu;
break;
}
case 7:{//查詢使用者
system("cls");
cout<<" [1]按學號查詢\n";
cout<<" [2]按姓名查詢\n";
cout<<"請輸入查詢方式:\n";
int way;
cin>>way;
switch(way){
case 1:
a.seaById();
system("pause");
system("cls");
goto amenu;
break;
case 2:
a.seaByName();
system("pause");
system("cls");
goto amenu;
break;
}
}
case 8:{//修改使用者
system("cls");
a.setuser();
system("pause");
system("cls");
goto amenu;
break;
}
case 9:{//修改密碼
system("cls");
string pass;
cout<<"請輸入原密碼:\n";
cin>>pass;
cout<<endl;
if(a.isPassword(pass)) {
cout<<"請輸入新密碼:\n";
cin>>pass;
a.setPassword(pass);
cout<<endl;
cout<<"密碼修改成功!\n";
}
else cout<<"Error! 密碼輸入錯誤! 已返回主選單!\n";
goto amenu;//返回主選單
break;}
default:{
cout << "Command Error!請重新輸入!" << endl;
goto cincom;}
}
}
void useroperator(){//使用者選單
umenu:cout << "■■■■■■■■■■■■■使用者系統■■■■■■■■■■■■■\n";
cout << "■ ┏━━━━━━━━━━━━━━┓ ■\n";
cout << "■ ┃ [0] 退出系統 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [1] 借閱圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [2] 續借圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [3] 歸還圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [4] 查詢圖書 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [5] 顯示使用者 ┃ ■\n";
cout << "■ ┣━━━━━━━━━━━━━━┫ ■\n";
cout << "■ ┃ [6] 修改密碼 ┃ ■\n";
cout << "■ ┗━━━━━━━━━━━━━━┛ ■\n";
cout << "■■■■■■■■■■■[-1]返回上一層■■■■■■■■■■■■\n";
cout << "輸入要進行的操作:" ;
int command;
cin >> command;
switch (command){
case -1:{
system("cls");
selectmenu();//返回上一層
}
case 0:{//退出系統
u.save();
cout<<" - 感謝使用 - 正在退出系統 - \n";
system("pause");
system("cls");
exit(0); //exit(1)是異常退出 exit(0)是正常退出
break;
}
case 1:{//借閱圖書
int x;
if(u.b.size()>=10) cout<<"\n借閱數量已達10本上限!\n";
else {
u.dispallbook();//顯示所有圖書
cout<<"\n請輸入借閱的圖書編號:\n";
cin>>x;
u.borrowbook(x);
cout<<u.b2[x-1]<<endl;
cout<<"借閱成功!\n";
system("pause");
system("cls");
goto umenu;
}
break;
}
case 2:{//續借圖書
u.reborrowbook();
system("pause");
system("cls");
goto umenu;
break;
}
case 3:{//歸還圖書
if(u.b.empty()){
system("cls");
cout<<"\n該使用者未借閱任何圖書!"<<endl;
system("pause");
goto umenu;
}
else{
u.dispuser();//顯示使用者資訊 包括借閱的圖書資訊
int x;
cout<<"請輸入要歸還的圖書編號:\n";
cin>>x;
u.returnbook(x);
cout<<endl;
goto umenu;
}
break;
}
case 4:{//查詢圖書
system("cls");
chaxun:cout<<" [1]按書名查詢\n";
cout<<" [2]按作者查詢\n";
cout<<" [3]按出版日期查詢\n";
cout<<"請輸入查詢方式:\n";
int way;
cin>>way;
switch(way){
case 1:{
cout<<"請輸入要查詢的書名:\n";
string title;
cin>>title;
u.seaBytitle(title);
system("pause");
system("cls");
goto umenu;
}
case 2:{
cout<<"請輸入要查詢的作者:\n";
string author;
cin>>author;
u.seaByauthor(author);
system("pause");
system("cls");
goto umenu;
}
case 3:{
cout<<"請輸入要查詢的出版日期: [****年]\n";
int year;
cin>>year;
u.seaBydate(year);
system("pause");
system("cls");
goto umenu;
}
default:{
system("cls");
cout << " Command Error!請重新輸入!" << endl;
goto chaxun;
}
}
break;
}
case 5:{//顯示使用者
u.dispuser();
system("pause");
system("cls");
goto umenu;
break;
}
case 6:{//修改密碼
system("cls");
string pass;
cout<<"請輸入原密碼:\n";
cin>>pass;
cout<<endl;
if(u.isPassword(pass)) {
cout<<"請輸入新密碼:\n";
cin>>pass;
u.setPassword(pass);
cout<<endl;
cout<<"密碼修改成功!\n";
}
else cout<<"Error! 密碼輸入錯誤! 已返回主選單!\n";
goto umenu;//返回主選單
break;
}
default :{
system("cls");
cout<<" Error! Error! Error!\n";
cout<<" 輸入命令錯誤! 請重新輸入! \n";
cout<<" Error! Error! Error!\n";
goto umenu;
}
}
}
};
int main()
{
menu m;//選單類
m.welcome();//歡迎選單
m.selectmenu();//選擇 Administrator or useroperator 選單
}
//程式設計思維導圖 [點選圖片可以放大檢視]
程式設計心得體會
在老師剛佈置任務時,還是一頭霧水,不知道從何下手。後來,就想到先寫個文件再說,回想起自己在學校借書的經歷,把使用者應該有的功能都羅列一遍,使用者和管理員的差別就在管理員能增刪修改,而使用者是“只讀”的,瞭解了這些以後,就開始一步一步的實現每一個功能。
在剛開始寫的時候,並沒有遇到很多困難,把基本的資料類寫完整就行了,後來在寫操作類的時候,不能很好的統籌排程每一個資料類,沒有把握一個整體的巨集觀的思想。
實現管理員的功能時,增加書只在Vector中增加了,忘記了在Map中也同時增加,導致在查詢書的時候找不到,相似的問題還有刪除書和修改書,總之,資訊的調整沒有做到同步實現,好在當時就發現了問題,及時修改 了。還有一個忽略的問題,沒有繫結使用者,也就是說使用者的一系列操作,沒有繫結到相應的學號上,這個問題也在後來改正了。
這次設計圖書館管理系統,有之前的ATM作為基礎,而且使用了STL的內容,相比之下容易了很多,程式碼量也減少了很多,也瞭解到STL的強大之處,有了現成的模板函式,寫程式就簡單了好多,程式效率也提高了。總之,STL是真的很好用。
通過這次模擬圖書館管理系統,讓我對程式設計有了一個更高層次的理解,整體的把握很重要,不要急於寫程式碼,先把實現的思路都在文件中梳理一遍,有了清晰的結構,才能把握全域性,不然,後來在變動,增加功能,修改一處,處處都要變,是很麻煩的。
相關文章
- 圖書館系統(8)
- Evergreen 3.2.4 和 3.1.10 釋出,開源圖書館管理系統
- c語言圖書館管理系統----學會使用結構體C語言結構體
- python實現一個無介面的小型圖書管理系統Python
- 圖書管理系統2
- 通訊錄管理系統(C++實現)C++
- 實驗專案四:圖書管理系統
- 圖書管理系統(小程式)
- 校園圖書管理系統開發-中小學智慧圖書管理系統開發
- 智慧圖書館:構建高效影片智慧管理方案,提升圖書館個性化服務
- Jsp+SpringMVC+Mysql實現的Java Web圖書管理系統原始碼JSSpringMVCMySqlJavaWeb原始碼
- C++實現管理系統的示例程式碼C++
- Rails 實戰——圖書管理系統——基礎建設AI
- Python—簡單圖書管理系統Python
- C++實現控制檯學生學籍管理系統C++
- Django教程 —— 初步完善圖書管理系統Django
- 學舟圖書閱讀管理系統
- 圖書管理系統-專案介紹
- Django入門案例:圖書管理系統Django
- flask框架圖書管理系統客戶端Flask框架客戶端
- python實現圖書管理系統——通過excel檔案或者TXT檔案存放資料PythonExcel
- 圖書系統
- 作業系統——c++實現頁式虛擬儲存管理作業系統C++
- 從頭做一個基於B/S的 ASP.NET圖書館管理系統課設(開篇)ASP.NET
- Django學習筆記《二》圖書管理系統Django筆記
- flask框架圖書管理系統伺服器端Flask框架伺服器
- 學舟圖書閱讀管理系統簡介
- 3.18 去中心化圖書館中心化
- Java寫圖書管理系統(四、管理員功能許可權)Java
- 解讀圖書管理系統為書店帶來的好處
- C++ STL -- vectorC++
- C++ STL -- listC++
- C++ STL -- HashTableC++
- C++ STL stackC++
- C++ STL listC++
- C++標準模板庫(STL)迭代器的原理與實現C++
- 四川省圖書館暨全省公共圖書館2021年閱讀報告
- java大作業總結——圖書借閱管理系統Java