首頁 > 軟體

C++實現小型圖書管理系統

2022-03-12 13:00:13

本文範例為大家分享了C++實現小型圖書管理系統的具體程式碼,供大家參考,具體內容如下

因為課程設計的原因,需要實現一個小型圖書管理系統

包含功能:

問題描述:

設計一個系統,對圖書資訊進行管理,資訊描述:有關該系統基本資訊的描述,如:圖書名稱、圖書編號、單價、作者、存在狀態、借書人姓名、性別、學號等。

基本要求:

基本功能:

1、新進圖書基本資訊的輸入。
2、圖書基本資訊的查詢。
3、對撤消圖書資訊的刪除。
4、為借書人辦理註冊。
5、辦理借書手續(非註冊會員不能借書)。
6、辦理還書手續。
7、統計圖書庫存、已借出圖書數量。

需要建立三個文字檔案:record.txt  book.txt reader.txt

operating.h的標頭檔案:

#include <iostream>
#include <fstream>
#include <string>
#include <time.h> 
#include<sstream>
#include<vector>
#include <iomanip>
 
using namespace std;
 
 
int all_stock = 0;
int out_stock = 0;
int times=0;
void outData(vector<string> res,int n)  // n為txt中 每行資料個數
{
    for(int i=0;i<res.size();i+=n){
        for(int j=0;j<n;j++)
            cout<<setw(12)<<res[i+j]<<" ";
        
        cout<<endl;
    }
}
 
void BookEntry()
{
    double price;
    string bookname,writer;
    fstream out;
    out.open("book.txt",ios::app);
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
 
    time_t tt = time(NULL);//這句返回的只是一個時間cuo
    
    cout<<"請輸入書籍名稱"<<endl;
    cin>>bookname;
    cout<<"請輸入書籍作者"<<endl;
    cin>>writer;
    cout<<"請輸入書籍價格"<<endl;
 
 
    while(! (cin>>price)  || price <= 0 )
    {
        cin.clear();
        cin.ignore(100,'n');
        cout<<"請輸入正確的價格"<<endl;
    }
    
    out<<tt<<" "<<bookname<<" "<<writer<<" "<<price<<" "<<"0"<<"n";
    
    out.close();
    
}
 
 
void BookMes()
{
    fstream in;
    string line;
    //用於存放分割後的字串 
    vector<string> res;
    string temp; //暫存字串
    
    in.open("book.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    all_stock = 0;
    while(getline(in,line))
    {
        all_stock++;
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        while(input>>temp)
        {
            
            res.push_back(temp);
        }
    }
    // 0 書籍編號 1 書籍名稱 2作者 3價格 4書籍狀態
    //輸出res 
    cout<<endl<<setw(12)<<"書籍編號"<<" "<<setw(12)<<"書籍名稱"<<" "<<setw(12)<<"作者"<<" "<<setw(12)<<"價格"<<" "<<setw(12)<<"在館0,不在1"<<"n";
    outData(res,5);
    in.close();
}
 
 
void DelBook()
{
    string del_book;
    string line;
    vector<string>res;
    string temp;
    bool flag=false;
 
 
    fstream in;
    in.open("book.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }
 
 
    cout<<"請輸入需要刪除的圖書ID"<<endl;
    cin>>del_book;
    
        while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        times=0;
        while(input>>temp)
        {
            if(del_book == temp && times==0)
            {
                
                for(int i=0;i<3;i++)  //因為一共五個 第一個temp已經是del_book 所以這裡取得是四個
                {
                    input>>temp;
                }
                input>>temp;
                if(temp != "0")
                {
                    cout<<"書籍狀態不對";
                    in.close();
                    return ;
                }
                flag=true;
                cout<<"n找到了喔,應該刪除成功了n";
                continue;
            }
            res.push_back(temp);
            times++;
            
        }
    }
    
    //outData(res,5);
    in.close();
    
    if(!flag)
    {
        cout<<"n錯誤的書籍IDn";
        return ;
    }
    fstream out;
 
 
    out.open("book.txt",ios::out);
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    
    for(int j=0;j<res.size();j+=5)
    {
        line = res[j] + " " + res[j+1] + " " + res[j+2] + " " + res[j+3] + " " + res[j+4] + "n";
        out<<line;
    }
    out.close();
    
}

void ReaderEntry()
{
    
    string readername,sex_str;
    int sex;
    fstream out;
 
 
    out.open("reader.txt",ios::app);
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }

    time_t readerid = time(NULL);//這句返回的只是一個時間cuo
    
    cout<<"請輸入讀者姓名"<<endl;
    cin>>readername;
    
    do
    {
        cout<<"請輸入讀者性別:0為女,1為男"<<endl;
        while(! (cin>>sex) )
        {
            cin.clear();
            cin.ignore(100,'n');
            cout<<"請輸入正確的0或1"<<endl;
        }
    }while(sex != 0 && sex!=1);
 
 
    if(sex == 1)
    {
        sex_str = "男";
    }else if (sex == 0){
        sex_str = "女";
    }else{
        out.close();
        return ;
    }

    out<<readerid<<" "<<readername<<" "<<sex_str<<"n";
    
    out.close();
    
}
/*讀者資訊*/
void ReaderMes()
{
    fstream in;
    string line;
    //用於存放分割後的字串 
    vector<string> res;
    string temp; //暫存字串
    in.open("reader.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    
    while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        while(input>>temp)
        res.push_back(temp);
    }
    // 0讀者學號 1讀者姓名 2讀者性別
    //輸出res 
    cout<<endl<<setw(12)<<"讀者編號"<<" "<<setw(12)<<"讀者"<<" "<<setw(12)<<"性別"<<"n";
    outData(res,3);
    in.close();
}

 
/* 借閱書籍 */
void BorrowBook()
{
    string book[5];
    string readerid;
    string readername;
    string line;
    vector<string>res; //取書籍狀況,並且更新
 
 
    string temp;
    bool flag_book = false; //用於判斷書籍是否存在  讀者是否存在
    bool flag_reader = false;
 
 
    /* 取book的圖書情況,並判斷是否在館*/
    fstream in;
    in.open("book.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }

    cout<<"請輸入需要借的圖書ID"<<endl;
    cin>>book[0];
    
    while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        times=0;
        while(input>>temp)
        {
            if(book[0] == temp && times ==0)
            {
                res.push_back(temp);
                for(int i=0;i<3;i++)  //從書籍名稱開始取,一直取到價錢
                {
                    input>>temp; //讀取了書籍編號,要及時寫入res,以後要寫進文字
                    book[1+i]=temp;
                    res.push_back(temp);
                }
                input>>temp;  //取書籍狀態,如果0在館 如果1不在館
                if(temp == "0")
                {
                    book[4]="1";
                    temp="1";
                    res.push_back(temp);
                    flag_book=true;
                }else{
                    cout<<"n書籍不在館n";
                    in.close();
                    return ;
                }
                continue;  //繼續取
            }
            res.push_back(temp);
            times++;
            
        }
    }

    in.close();
    if(!flag_book)
    {
        cout<<"錯誤的書籍ID"<<endl;
        return ;
    }
    
    in.open("reader.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }
    cout<<"n請輸入讀者IDn";
    cin>>readerid;
 
 
    while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        times=0;
        while(input>>temp)
        {
            if(readerid == temp && times==0)
            {
                input>>temp;
                readername=temp;
                flag_reader=true;
                break;
 
 
            }
            times++;
            
        }
    }
    if(!flag_reader)
    {
        cout<<"錯誤的讀者ID"<<endl;
        in.close();
        return ;
    }
 
    in.close();
       
    fstream out;
    out.open("record.txt",ios::app);
    if(!out)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }
    line = book[0] + " " + book[1] + " " + readername + 'n';
    out<<line;
    cout<<"n辦理借書成功n";
    out.close();
    out.open("book.txt",ios::out);
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    
    for(int j=0;j<res.size();j+=5)
    {
        line = res[j] + " " + res[j+1] + " " + res[j+2] + " " + res[j+3] + " " + res[j+4] + "n";
        out<<line;
    }
    out.close();
}
 
void BorrowMes()
{
    fstream in;
    string line;
    //用於存放分割後的字串 
    vector<string> res;
    string temp; //暫存字串
    in.open("record.txt",ios::in);
    if(!in)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    out_stock=0;
    while(getline(in,line))
    {
        out_stock++;
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        while(input>>temp)
        res.push_back(temp);
    }
    // 0書籍編號 1書籍名稱 2讀者姓名
    //輸出res 
    cout<<endl<<setw(12)<<"書籍編號"<<" "<<setw(12)<<"書籍名稱"<<" "<<setw(12)<<"讀者"<<"n";
    outData(res,3);
    
    in.close();
}
 
void RtnBook()
{
    string rtn_book;
    string line;
    vector<string>res;
    string temp;
    bool flag=false;
 
 
    fstream in;
    in.open("record.txt",ios::in);  //先開啟record 檢視是否有借這本書
    if(!in)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }

    cout<<"請輸入需要歸還的書籍ID"<<endl;
    cin>> rtn_book;
        
    while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        times=0;
        while(input>>temp)
        {
            if(rtn_book == temp && times==0) //如果有的話
            {
                flag=true;
                
                for(int i=0;i<2;i++)  //因為一共三個 第一個temp已經是del_book 所以這裡取得是兩個
                {
                    input>>temp;// 將刪除的東西不輸出到向量中
                }
                continue;
            }
            res.push_back(temp);
            times++;
            
        }
    }
    
    //outData(res,3);
    in.close();
    if(!flag)
    {
        cout<<"該圖書不存在或者沒有被外借"<<endl;
        return ;
    }
 
    fstream out;
 
    out.open("record.txt",ios::out); //record已經刪除成功
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    
    for(int j=0;j<res.size();j+=3)
    {
        line = res[j] + " " + res[j+1] + " " + res[j+2]  + "n";
        out<<line;
    }
    out.close();
 
    vector<string>res_book;

    in.open("book.txt",ios::in); //開始取 被修改的書籍
    if(!in)
    {
        cerr<<"開啟錯誤檔案"<<endl;
    }    
    
    while(getline(in,line))
    {
        //cout<<line<<endl;
        //將字串讀到input中 
        stringstream input(line); //將line切割 通過input存入temp,然後存入res中
        times=0;
        while(input>>temp)
        {
            if(rtn_book == temp && times==0)
            {
                res_book.push_back(temp);
                for(int i=0;i<3;i++)  //因為一共五個 第一個temp已經是rtn_book 所以這裡取得是四個
                {
                    input>>temp;
                    res_book.push_back(temp);
                }
                input>>temp;//最後一個取得是書籍狀態,需要修改書籍狀態
                temp = "0";
                res_book.push_back(temp);
                continue;
            }
            res_book.push_back(temp);
            times++;
        }
    }
    
    //outData(res,5);
    in.close();
    
    out.open("book.txt",ios::out); //再存入文字中;
    if(!out)
    {
        cerr<<"開啟檔案失敗!"<<endl;
    }
    
    for(int j=0;j<res_book.size();j+=5)
    {
        line = res_book[j] + " " + res_book[j+1] + " " + res_book[j+2] + " " + res_book[j+3] + " " + res_book[j+4] + "n";
        out<<line;
    }
    out.close();
 
 
    cout<<"n找到了喔,應該還書成功了n";
}
 
 
void CountBook()
{    
    cout<<"n圖書館書籍情況";
    BookMes();
    cout<<"圖書館一共有:"<<all_stock<<" 本書nnn";
    cout<<"n圖書館書籍外借情況";
    BorrowMes();
    cout<<"圖書館目前外借:"<<out_stock<<" 本書nn";
    cout<<"nn圖書館當前在館書籍還有:"<<all_stock - out_stock<<" 本書n";
}

main.cpp的主函數

#include "operating.h"
 
int main()
{
    int order;
    do
    {
        order = -1;
        cout<<"n";
        cout<<"----------------------------------------------------------n";
        cout<<"| 1. 圖書資訊錄入    2. 圖書資訊查詢    3. 圖書資訊刪除  |n";
        cout<<"| 4. 讀者辦理註冊    5. 讀者資訊查詢    6. 辦理借書手續  |n";
        cout<<"| 7. 辦理還書手續    8  已借出圖書      9.統計圖書庫存  |n";
        cout<<"|                                        按 "0"退出    |n";
        cout<<"----------------------------------------------------------n";
        cout<<"  請輸入相應序號進行相應操作:";
        cin>>order;
        cin.clear();//清除緩衝區中後面的字元
        cin.ignore(100,'n');
 
        switch(order)
        {
        case 1:
            BookEntry();
            break;
        case 2:
            BookMes();
            break;
        case 3:
            DelBook();
            break;
        case 4:
            ReaderEntry();
            break;
        case 5:
            ReaderMes();
            break;
        case 6:
            BorrowBook();
            break;
        case 7:
            RtnBook();
            break;
        case 8:
            BorrowMes();
            break;
        case 9:
            CountBook();
            break;
        case 0:
            break;
        default:
            cout<<"錯誤的命令列"<<endl;
            break;
        }
        
    }while(order != 0);
 
    system("pause");
    return 0;
 
    
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com