C++圖書館管理系統 [STL實現]

Leo-z發表於2018-06-13
//
//#系統主要功能 [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是真的很好用。
        通過這次模擬圖書館管理系統,讓我對程式設計有了一個更高層次的理解,整體的把握很重要,不要急於寫程式碼,先把實現的思路都在文件中梳理一遍,有了清晰的結構,才能把握全域性,不然,後來在變動,增加功能,修改一處,處處都要變,是很麻煩的。

相關文章