1. 程式人生 > >資料結構課程設計--圖書館管理系統原始碼

資料結構課程設計--圖書館管理系統原始碼

#include <iostream>
#include <iomanip>
#include <string.h>
#include <string>
#include <fstream>//輸入/輸出檔案流類
using namespace std;
const int Maxr=100;//最多的讀者
const int Maxb=100;//最多的圖書
const int Maxbor=5;//每位讀者最多借五本書
//讀者類,實現對讀者的資訊的描述


class Reader
{
    private:
    int tag; //刪除標記 1:已刪 0:未刪
    int no; //讀者編號
    char name[10]; //讀者姓名
    int borbook[Maxbor];//所借圖書
    public:
    Reader() {}
    char *getname() {return name;} //獲取姓名
    int gettag() {return tag;} //獲取刪除標記
    int getno() {return no;} //獲取讀者編號
    void setname(char na[]) //設定姓名
    {
        strcpy(name,na);

    }
    void delbook()
    {

        tag=1;
    }//設定刪除標記 1:已刪 0:未刪
    void addreader(int n,char *na)//增加讀者
    {
        tag=0;
        no=n;
        strcpy(name,na);
        for(int i=0;i<Maxbor;i++)
        borbook[i]=0;
    }
void borrowbook(int bookid)//借書操作
{
    for(int i=0;i<Maxbor;i++)
    {
        if (borbook[i]==0)
        {
            borbook[i]=bookid;
            return;

        }
    }

}
int retbook(int bookid)//還書操作
{
    for(int i=0;i<Maxbor;i++)
    {
        if(borbook[i]==bookid)
    {
        borbook[i]=0;
        return 1;

    }
    }
    return 0;
}
void disp()//讀出讀者資訊
{
    cout << setw(5) << no <<setw(10) << name<<"借書編號:[";
    for(int i=0;i<Maxbor;i++)
    if(borbook[i]!=0)
    cout << borbook[i] << "|";
    cout << "]"<<endl;
}
};



//讀者類庫,實現建立讀者的個人資料
class RDatabase
{
    private:
    int top; //讀者記錄指標
    Reader read[Maxr];//讀者記錄
public:
RDatabase() //建構函式,將reader.txt讀到read[]中
{
    Reader s;
    top=-1;
    fstream file("reader.txt",ios::in);//開啟一個輸入檔案
    while (1)
    {
        file.read((char *)&s,sizeof(s));
        if (!file)break;
        top++;
        read[top]=s;
    }
    file.close(); //關閉 reader.txt
    }
    void clear()//刪除所有讀者資訊
    {
        top=-1;
    }
    int addreader(int n,char *na)//新增讀者時先查詢是否存在
    {
        Reader *p=query(n);
        if (p==NULL)
        {
        top++;
        read[top].addreader(n,na);
        return 1;
        }
        return 0;
    }
    Reader *query(int readerid)//按編號查詢
    {
        for (int i=0;i<=top;i++)
        if (read[i].getno()==readerid &&
        read[i].gettag()==0)
        {
            return &read[i];
        }
        return NULL;
    }
    void disp() //輸出所有讀者資訊
    {
        for (int i=0;i<=top;i++)
        read[i].disp();
    }
    void readerdata();//讀者庫維護
    ~RDatabase() //解構函式,將read[]寫到reader.txt檔案中
    {
        fstream file("reader.txt",ios::out);
        for (int i=0;i<=top;i++)
        if (read[i].gettag()==0)
        file.write((char *)&read[i],sizeof(read[i]));
        file.close();

    }
};
void RDatabase::readerdata()
{

char choice;
char rname[20];
int readerid;
Reader *r;
while (choice!='0')
{
    cout <<"\n\n\t\t\t讀 者 維 護\n\n\n\t\t 1 新 增\n\n\t\t 2 更改\n\n\t\t 3 刪 除\n\n\t\t 4 查 找\n\n\t\t 5 顯 示\n\n\t\t 6 全 刪\n\n\t\t 0 退出"<<endl;
    cin >> choice;
    switch (choice)
    {
    case '1':
        cout << "輸入讀者編號:";
        cin >> readerid;
        cout << "輸入讀者姓名:";
        cin >> rname;
        addreader (readerid,rname);
        break;
    case '2':
        cout << "輸入讀者編號:";
        cin >> readerid;
        r=query(readerid);
        if (r==NULL)
        {
        cout << " 該讀者不存在 "<<endl;
        break;
        }
        cout << "輸入新的姓名:";
        cin >> rname;
        r->setname(rname);
        break;
    case '3':
        cout << " 輸入讀者編號:";
        cin >> readerid;
        r=query(readerid);
        if (r==NULL)
        {
        cout <<" 該讀者不存在" << endl;
        break;
        }
        r->delbook();
    break;
    case '4':
        cout << "讀入讀者編號:";
        cin >> readerid;
        r=query(readerid);
    if (r==NULL)
    {
        cout <<"該讀者不存在"<< endl;
        break;
    }
    r->disp();
    break;
    case '5':
    disp();
    break;
    case '6':
    clear();
    break;
    default:cout<<"輸入錯誤,請從新輸入:";break;
}
}
}
//圖書類,實現對圖書的描述,圖書的編號,書名,借出,還入等
class Book
{
    private:
    int tag;//刪除標記 1:已刪 0:未刪
    int no;//圖書編號
    char name[20];//書名
    int onshelf;//是否再架 1:再架 2:已借
    public:
    Book(){}
    char *getname() { return name; }//獲取姓名
    int getno(){ return no; }//獲取圖書編號
    int gettag(){ return tag; }//獲取刪除標記
    void setname(char na[])//設定書名
    {
        strcpy(name,na);
    }
    void delbook(){ tag=1;}//刪除圖書
    void addbook(int n,char *na)//增加圖書
    {
        tag=0;
        no=n;
        strcpy(name,na);
        onshelf=1;
    }
    int borrowbook()//借書操作
    {
        if (onshelf==1)
        {
            onshelf=0;
            return 1;
        }
        return 0;
    }
    void retbook()//還書操作
    {
        onshelf=1;
    }
    void disp()//輸出圖書
    {
        cout << setw(6) << no << setw(18) << name << setw(10)
        <<(onshelf==1? "在架":"已借") <<endl;
    }
};

//圖書庫類,實現對圖書的維護,查詢,刪除等
class BDatabase
{
    private:
    int top; //圖書記錄指標
    Book book[Maxb]; //圖書記錄
    public:
    BDatabase()//建構函式,將book.txt讀到book[]中
    {
        Book b;
        top=-1;
        fstream file("book.txt",ios::in);
        while (1)
        {
        file.read((char *)&b,sizeof(b));
        if (!file) break;
        top++;
        book[top]=b;
        }
        file.close();
    }
    void clear()//全刪
    {
        top=-1;
    }
    int addbook(int n,char *na)//增加圖書
    {
        Book *p=query(n);
        if (NULL==p)
        {
            top++;
            book[top].addbook(n,na);
            return 1;
        }
        return 0;
    }
    Book *query(int bookid)//查詢圖書
    {
        for (int i=0;i<=top;i++)
        if (book[i].getno()==bookid &&book[i].gettag()==0)
        {
        return &book[i];
        }
        return NULL;
    }
    void bookdata();//圖書庫維護
    void disp()
    {
        for (int i=0;i<=top;i++)
        if (book[i].gettag()==0)
        book[i].disp();
    }
    ~BDatabase()//解構函式,將book[]寫到book.txt檔案中
    {
        fstream file("book.txt",ios::out);
        for (int i=0;i<=top;i++)
         if (book[i].gettag()==0)
            file.write((char *)&book[i],sizeof(book[i]));
        file.close();
    }
};
void BDatabase::bookdata()
{
    char choice;
    char bname[40];
    int bookid;
    Book *b;
    while (choice!='0')
    {
    cout <<"\n\n\n\t\t\t圖 書 維 護 "<<endl<<endl;
    cout<<"\t\t1 新 增\n \t\t2 更 改\n\t\t3 刪 除\n\t\t4 查 找\n\t\t5 顯示\n\t\t6 全 刪\n\t\t0 退 出"<<endl;
    cin >> choice;
switch (choice)
{
    case '1':
        cout << "輸入圖書編號:"<<endl;
        cin >> bookid;
        cout << "輸入圖書書名:"<<endl;
        cin >> bname;
        addbook(bookid,bname);
        break;
    case '2':
        cout << "輸入圖書編號:"<<endl;
        cin >> bookid;
        b=query(bookid);
        if (b==NULL)
        {
        cout << " 該圖書不存在 "<<endl;
        break;
        }
        cout << "輸入新的書名:"<<endl;
        cin >> bname;
        b->setname(bname);
        break;
    case '3':
        cout <<" 讀入圖書編號:"<<endl;
        cin >> bookid;
        b=query(bookid);
        if (b==NULL)
        {
        cout <<" 該圖書不存在" << endl;
        break;
        }
        b->delbook();
        break;
    case '4':
        cout << " 讀入圖書編號:"<<endl;
        cin >> bookid;
        b=query(bookid);
        if (b==NULL)
        {
            cout <<" 該圖書不存在"<< endl;
            break;
        }
        b->disp();
        break;
        case '5':
            disp();
            break;
        case '6':
            clear();
            break;
        default:cout<<"輸入錯誤,請從新輸入:";
}
}
}
//main() 函式的實現,程式的主介面的引導

int main()
{
    char choice;
    int bookid,readerid;
    RDatabase ReaderDB;
    Reader *r;
    BDatabase BookDB;
    Book *b;
    while(choice!='0')
    {
        cout <<endl<<endl<<"\t\t\t 圖 書 管 理 系 統\n\n\n";
        cout <<"\t\t\t1 借 書\n\n\t\t\t2 還 書 \n\n\t\t\t3 圖 書 維護\n\n\t\t\t4 讀 者 維 護\n\n\t\t\t0 離 開"<<endl;
        cin >> choice;
        switch (choice)
        {
        case '1':
            cout <<" 借書 讀者編號:";
            cin >>readerid;
            cout <<" 圖書編號: ";
            cin >>bookid;
            r=ReaderDB.query(readerid);//按編號查詢
            if (NULL==r)
            {
                cout <<" 不存在該讀者,不能借書"<< endl;
                break;
            }
            b=BookDB.query(bookid);
            if (b==NULL)
            {
                cout <<" 不存在該圖書,不能借書"<< endl;
                break;
            }
            if (b->borrowbook()==0)
            {
                cout << " 該圖書已借出,不能借書"<< endl;
                break;
            }
            r->borrowbook(b->getno());
            break;
        case '2':
            cout<<"還書\n 讀者編號:";
            cin >>readerid;
            cout << " 圖書編號:";
            cin >>bookid;
            r=ReaderDB.query(readerid);
            if (r==NULL)
            {
            cout <<" 不存在該讀者,不能還書" << endl;
            break;
            }
            b=BookDB.query(bookid);
            if (b==NULL)
            {
            cout <<" 不存在該圖書,不能還書" <<endl;
            break;
            }
            b->retbook();
            r->retbook(b->getno());
            break;
        case '3':
            BookDB.bookdata();
            break;
        case '4':
            ReaderDB.readerdata();
        break;
        default:cout<<"輸入錯誤,請從新輸入:";

        }
}
}