圖書管理系統2

laal啦啦啦發表於2024-03-17
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
//構建學生類
class Student
{
public:
    Student()
    {
        memset(s_num, 0, sizeof(s_num));
        memset(s_name,0, sizeof(s_name));
        memset(s_name, 0, sizeof(college, 0, sizeof(college)));
        borrow_max = 0;
        borrow_quantity = 0;
        memset(borrow_books, 0, sizeof(borrow_books));
    }
    char s_num[15];   //學號
    char s_name[10];  //姓名
    char college[30]; //院系
    int borrow_max;     //最大借閱數量
    int borrow_quantity;     //借閱數量
    char borrow_books[10][30]; //借閱圖書
 
    bool S_SetInto();   //設定學生資訊
    friend istream& operator>>(istream& in, Student& cp);  //提取運算子過載
    friend ostream& operator<<(ostream& out, Student& cp); //插入運算子過載
    bool S_If_match(char p[30]);  //判斷學號是否匹配
    void s_display();  //顯示學生資訊
};
 
//設定學生資訊
bool Student::S_SetInto()
{
    char temp[15];
    cout << "請輸入學號:(輸入+退出)";
    cin >> temp;
    if (temp[0] == '+')
    {
        return false;
    }
    strcpy(s_num, temp);
    cout << "學生姓名:";
    cin >> s_name;
    cout << "院系:";
    cin >> college;
    do
    {
        cout << "最大借閱數量(1-10):";
        cin >> borrow_max;
    }
    while (borrow_max <= 0 || borrow_max > 10);
    return true;
}
 
//提取運算子過載
istream& operator>>(istream& in, Student& cp)
{
    in >> cp.s_num >> cp.s_name >> cp.college >> cp.borrow_max >> cp.borrow_quantity;
    for (int i = 0; i < cp.borrow_quantity; i++)
    {
        in >> cp.borrow_books[i];
    }
    return in;
}
 
//插入運算子過載
ostream& operator<<(ostream& out, Student& cp)
{
    out << cp.s_num << ' ' << cp.s_name << ' ' << cp.college << ' ' << cp.borrow_max << ' ' << cp.borrow_quantity << ' ';
    for (int i = 0; i < 10; i++)
    {
        out << cp.borrow_books[i] << ' ';
        if (i == 9)
        {
            out << '\n';
        }
    }
    return out;
}
 
//判斷學號是否匹配
bool Student::S_If_match(char p[30])
{
    return (!strcmp(s_num, p)||!strcmp(s_name, p));
}
 
//顯示學生資訊
void Student::s_display()                                        //顯示
{
    cout << setiosflags(ios::left) << "學號:" << setw(12) << s_num << "    " << setw(10) << s_name << "    " << setw(25) << college << endl
        << "最大借閱量" << borrow_max << endl;
}
 
//構建圖書類
class Book
{
public:
    char b_num[15]; //圖書號
    char b_name[30]; //書名
    char author[20];  //作者
    char p_house[30]; //Publishing House 出版社
    int b_quantity;   //圖書數量
 
    bool B_SetInto();     //設定圖書資訊
    friend istream& operator>>(istream& in, Book& cp);   //提取運算子過載
    friend ostream& operator<<(ostream& out, Book& cp);  //插入運算子過載
    bool B_If_match(char p[30]);
    void b_display();  //圖書資訊顯示
};
 
//設定圖書資訊
bool Book::B_SetInto()
{
    char temp[15];
    cout << "請輸入圖書號:(輸入+退出)";
    cin >> temp;
    if (temp[0] == '+')
        return false;
    strcpy(b_num, temp);
    cout << "書名:";
    cin >> b_name;
    cout << "作者:";
    cin >> author;
    cout << "出版社";
    cin >> p_house;
    cout << "數量:";
    cin >> b_quantity;
    return true;
}
 
//提取運算子過載
istream& operator>>(istream& in, Book& cp)
{
    in >> cp.b_num >> cp.b_name >> cp.author >> cp.p_house >> cp.b_quantity;
    return in;
}
 
//插入運算子過載
ostream& operator<<(ostream& out, Book& cp)
{
    out << cp.b_num <<' '<< cp.b_name <<' '<< cp.author <<' '<< cp.p_house <<' '<< cp.b_quantity<<'\n';
    return out;
}
 
//判斷圖書號是否匹配
bool Book::B_If_match(char p[30])
{
        return (!strcmp(b_num, p)|| !strcmp(b_name, p));
}
 
//顯示函式
void Book:: b_display()
{
    cout << setiosflags(ios::left) << setw(12) << b_num << "    " << setw(30) << b_name << "    " << setw(10) << author << endl
        << setw(20) << p_house << "    " <<"剩餘數量:"<< setw(3) << b_quantity << endl;
}
 
//構建管理類
class management
{
public:
    int s_sum=0;  //學生數
    int b_sum=0;  //圖書數
    string key;  //管理員密碼
    vector<Student> s_array;  //記錄學生類
    vector<Book> b_array; //記錄圖書類
 
    void S_clear();  //清理已有學生資訊
    void B_clear();  //清理已有圖書資訊
    void S_Read_file(); //讀取學生檔案
    void S_Save_file(); //儲存學生檔案
    void B_Read_file(); //讀取圖書檔案
    void B_Save_file(); //儲存圖書檔案
 
    bool Student_add(); //新增學生資訊
    bool Student_mod(); //修改學生資訊
    bool Student_del(); //刪除學生資訊
    bool Student_scan();  //檢視學生資訊
 
    bool Book_add();  //新增圖書資訊
    bool Book_mod();  //修改圖書資訊
    bool Book_del();  //刪除圖書資訊
    bool Book_scan(); //檢視圖書資訊
 
    bool s_login(Student& cp);    //學生憑學號登入
    bool borrow_scan(Student &cp);   //檢視借閱數目
    bool borrow_book(Student &cp);   //借書
    bool return_book(Student &cp);   //還書
 
    bool Student_System();   //學生登入
    bool Personnel_System();    //工作人員登入
    void login_init();    //登入介面初始化
};
 
//清理已有學生資訊
void management::S_clear()
{
    s_array.clear();
    s_sum = 0;
}
 
//清理已有圖書資訊
void management::B_clear()
{
    b_array.clear();
    b_sum = 0;
}
 
//讀取學生檔案
void management::S_Read_file()
{
    ifstream s_file;
    s_file.open("Student_Information.txt");
    if (!s_file.is_open())
    {
        cerr << "檔案\"Student_Information.txt\"無法開啟\n";
        exit(1);
    }
    while (!(s_file.eof()))
    {
        Student stu;
        s_file >> stu;
        s_array.push_back(stu);
        s_sum++;
    }
    s_sum--;
    s_file.close();
}
 
//儲存學生檔案
void management::S_Save_file()
{
    ofstream s_file("Student_Information.txt");
    if (!s_file)
    {
        cerr << "檔案\"Student_Information.txt\"無法開啟!\n";
        exit(1);
    }
    int i = -1;
    while (++i < s_sum)
    {
        s_file << s_array[i];
    }
    s_file.close();
}
 
//讀取圖書檔案
void management::B_Read_file()
{
    ifstream b_file;
    b_file.open("Book_Information.txt");
    if (!b_file.is_open())
    {
        cerr << "檔案\"Book_Information.txt\"無法開啟\n";
        exit(1);
    }
    while (!b_file.eof())
    {
        Book _book;
        b_file >> _book;
        b_array.push_back(_book);
        b_sum++;
    };
    b_sum--;
    b_file.close();
}
 
//儲存圖書檔案
void management::B_Save_file()
{
    ofstream b_file("Book_Information.txt");
    if (!b_file)
    {
        cerr << "檔案\"Book_Information.txt\"無法開啟!\n";
        exit(1);
    }
    int i = -1;
    while (++i < b_sum)
    {
        b_file << b_array[i];
    }
    b_file.close();
}
 
//新增學生資訊
bool management::Student_add()
{
    S_Read_file();
    Student _stu;
    cout << "請進行資訊錄入。按“+”結束!\n";
    do
    {
        s_array.push_back(_stu);
    }
    while (s_array[s_sum++].S_SetInto());
    s_sum--;
    s_array.pop_back();
    return true;
}
 
//修改學生資訊
bool management::Student_mod()
{
    char _s_num[15];
    S_Read_file();
    cout << "請輸入您要修改的學生資訊的學號或名字:";
    cin >> _s_num;
    int i = 0;
    for (; i < s_sum; i++)
    {
        if (s_array[i].S_If_match(_s_num))
        {
            cout << "該同學的原資訊為:\n";
            s_array[i].s_display();
            cout << "請輸入正確資訊! \n";
            s_array[i].S_SetInto();
            s_sum++;  //保持學生數
            return true;
        }
        if (i == s_sum)
        {
            cout << "抱歉!您要修改的資訊不存在! " << endl;
            return false;
        }
        break;
    }
}
 
//刪除學生資訊
bool management::Student_del()
{
    char _s_num[15];
    S_Read_file();
    cout << "請輸入您要刪除的學生資訊的學號:";
    cin >> _s_num;
    for (int i = 0; i < s_sum; i++)
    {
        if (s_array[i].S_If_match(_s_num))
        {
            cout << "該同學的原資訊為:\n";
            s_array[i].s_display();
            s_array.erase(s_array.begin() + i);
            s_sum--;
            return true;
        }
        if (i == s_sum)
        {
            cout << "抱歉!您要刪除的資訊不存在! " << endl;
            return false;
        }
    }
}
 
//檢視學生資訊
bool management::Student_scan()
{
    S_Read_file();
    if (s_sum == 0)
    {
        cout << "暫無資訊!請等待管理人員更新!";
        return false;
    }
    for (int i = 0; i < s_sum; i++)
    {
        s_array[i].s_display();
    }
    return true;
}
 
//新增圖書資訊
bool management::Book_add()
{
    B_Read_file();
    Book _book;
    cout << "請進行資訊錄入。按“+”結束!\n";
    do
    {
        b_array.push_back(_book);
    } while (b_array[b_sum++].B_SetInto());
    b_sum--;
    b_array.pop_back();
    return true;
}
 
//修改圖書資訊
bool management::Book_mod()
{
    char _b_num[30];
    B_Read_file();
    cout << "請輸入您要修改的圖書資訊的圖書號或書名:";
    cin >> _b_num;
    for (int i = 0; i < b_sum; i++)
    {
        if (b_array[i].B_If_match(_b_num))
        {
            cout << "該圖書的原資訊為:\n";
            b_array[i].b_display();
            cout << "請輸入正確資訊! \n";
            b_array[i].B_SetInto();
            b_sum++;  //保持總航線數不變
            return true;
        }
        if (i == b_sum)
        {
            cout << "抱歉!您要修改的資訊不存在! " << endl;
            return false;
        }
        break;
    }
}
 
//刪除圖書資訊
bool management::Book_del()
{
    char _b_num[15];
    B_Read_file();
    cout << "請輸入您要刪除的圖書資訊的圖書號:";
    cin >> _b_num;
    for (int i = 0; i < b_sum; i++)
    {
        if (b_array[i].B_If_match(_b_num))
        {
            cout << "該圖書的原資訊為:\n";
            b_array[i].b_display();
            b_array.erase(b_array.begin() + i);
            b_sum--;
            return true;
        }
        if (i == b_sum)
        {
            cout << "抱歉!您要刪除的資訊不存在! " << endl;
            return false;
        }
    }
}
 
//檢視圖書資訊
bool management::Book_scan()
{
    B_Read_file();
    if (b_sum == 0)
    {
        cout << "暫無資訊!請等待管理人員更新!";
        return false;
    }
    for (int i = 0; i < b_sum; i++)
    {
        b_array[i].b_display();
    }
    return true;
}
 
//學生憑學號登入
bool management::s_login(Student& cp)
{
    char _s_num[15];
    S_Read_file();
    cout << "請輸入您的學號:";
    cin >> _s_num;
    for (int i = 0; i < s_sum; i++)
    {
        if (s_array[i].S_If_match(_s_num))
        {
            cp=s_array[i];
            cout << "歡迎您," << cp.s_name << "同學!" << endl;
            S_clear();
            return true;
        }
    }
    S_clear();
    return false;
}
 
//檢視借閱數數目
bool management::borrow_scan(Student& cp)
{
    S_Read_file();
    B_Read_file();
    cout << "您已借閱圖書" << setw(3) << cp.borrow_quantity << "本" << endl;
    for (int i = 0; i < cp.borrow_quantity; i++)
    {
        cout << cp.borrow_books[i] << endl;
    }
    S_clear();
    B_clear();
    return true;
}
 
//借書
bool management::borrow_book(Student& cp)
{
    S_Read_file();
    B_Read_file();
    char _b_num[30];
    cout << "請輸入想借圖書的圖書號或書名:";
    cin >> _b_num;
    for (int i = 0; i < b_sum; i++)
    {
        if (b_array[i].B_If_match(_b_num))
        {
            cout << "該圖書的資訊為:\n";
            b_array[i].b_display();
            b_array[i].b_quantity--;
            if (cp.borrow_quantity > cp.borrow_max - 1)
            {
                cout << "抱歉,您已達借書最大上限!" << endl;
                return false;
            }
            strcpy(cp.borrow_books[cp.borrow_quantity++],b_array[i].b_name);
            for (int j = 0; j < s_sum; j++)
            {
                if (s_array[j].S_If_match(cp.s_num))
                {
                    s_array[j]=cp;
                    return true;
                }
            }
        }
        if (i == b_sum - 1)
        {
            cout << "抱歉!您想借的圖書未收錄! " << endl;
            return false;
        }
    }
 
}
 
//還書
bool management::return_book(Student& cp)
{
    S_Read_file();
    B_Read_file();
    char _b_num[30];
    cout << "請輸入想還圖書的圖書號或書名:";
    cin >> _b_num;
    for (int i = 0; i < b_sum; i++)
    {
        if (b_array[i].B_If_match(_b_num))
        {
            cout << "該圖書的資訊為:\n";
            b_array[i].b_display();
            b_array[i].b_quantity++;
            for (int k = 0; k < cp.borrow_quantity; k++)
            {
                if (!strcmp(cp.borrow_books[k],b_array[i].b_name))
                {
                    for (int m = k; m < cp.borrow_quantity-1; m++)
                    {
                        strcpy(cp.borrow_books[m], cp.borrow_books[m+1]);
                    }
                    strcpy(cp.borrow_books[--cp.borrow_quantity], "");
//                    cp.borrow_quantity--;
                    break;
                }
            }
            for (int j = 0; j < s_sum; j++)
            {
 
                if (s_array[j].S_If_match(cp.s_num))
                {
                    s_array[j] = cp;
                    return true;
                }
            }
        }
        if (i == b_sum)
        {
            cout << "抱歉!您想還的圖書未收錄! " << endl;
            return false;
        }
    }
}
 
//工作人員登入
bool management::Personnel_System()
{
    while (1)
    {
        int menu_options;
 
        cout << "請輸入登入密碼:";
        cin >> key;
        if (key == "123456")  //登入密碼
            while (1)
            {
                cout << endl
                    << "*****       主選單:                                          **********" << endl
                    << "*****    工作人員                          " << endl
                    << "*****    1——新增學生資訊                    "
                    << "2——修改學生資訊" << endl
                    << "*****    3——刪除學生資訊                    "
                    << "4——檢視學生資訊" << endl
                    << endl                                                //區分學生和圖書
                    << "*****    5——新增圖書資訊                    "
                    << "6——修改圖書資訊" << endl
                    << "*****     7——刪除圖書資訊                    "
                    << "8——檢視圖書資訊" << endl
                    << "*****    9——退出登入"<<endl
                    << "你需要做什麼?(1-9)" << endl;
                cin >> menu_options;
                switch (menu_options)
                {
                case 1:Student_add(); break;
                case 2:Student_mod(); break;
                case 3:Student_del(); break;
                case 4:Student_scan(); break;
                case 5:Book_add(); break;
                case 6:Book_mod(); break;
                case 7:Book_del(); break;
                case 8:Book_scan(); break;
                case 9:return false;
                default:cout << "輸入錯誤,請重新選擇" << endl; break;
                }
                if (!(menu_options == 4 || menu_options == 8))
                {
                    cout << "是否確認?        《確認/(Y/y)》    《取消/(N/n)》" << endl;
                    char yn;
                    do
                    {
                        cin >> yn;
                    } while (!(yn == 'Y' || yn == 'y' || yn == 'N' || yn == 'n'));
                    if (yn == 'Y' || yn == 'y')
                    {
                        if (menu_options == 1 || menu_options == 2 || menu_options == 3)
                        {
                            S_Save_file();
                        }
                        else if (menu_options == 5 || menu_options == 6 || menu_options == 7)
                        {
                            B_Save_file();
                        }
                        cout << "操作成功";
                    }
                }
                S_clear();
                B_clear();
            }
        else
        {
            cout << "密碼錯誤!" << endl;
            continue;
        }
    }
    return true;
}
 
//學生登入
bool management::Student_System()
{
    while (1)
    {
        Student cp;
        bool key = s_login(cp);
        while (key)
        {
            int menu_options;
 
            cout << "*****     主選單:                                             **********" << endl
                << "*****     學生:                            " << endl
                << "*****     1——檢視借閱數目" << endl
                << "*****     2——借閱圖書" << endl
                << "*****     3——歸還圖書" << endl
                << "*****    4——退出登入" << endl
                << "你需要做什麼?(選擇1-4)" << endl;
            cin >> menu_options;
            switch (menu_options)
            {
            case 1:borrow_scan(cp); break;
            case 2:borrow_book(cp); break;
            case 3:return_book(cp); break;
            case 4:return false;
            }
            if (menu_options == 2 || menu_options == 3)
            {
                cout << "是否確認?        《確認/(Y/y)》    《取消/(N/n)》" << endl;
                char yn;
                do
                {
                    cin >> yn;
                } while (!(yn == 'Y' || yn == 'y' || yn == 'N' || yn == 'n'));
                if (yn == 'Y' || yn == 'y')
                {
                    cout << "操作成功!" << endl;
                    S_Save_file();
                    B_Save_file();
                }
            }
            S_clear();
            B_clear();
        }
        cout << "未找到您的資訊!" << endl;
    }
    return true;
}
 
//介面初始化函式
void management::login_init()
{
    system("cls");
    cout << "\n>>>>>>>>>>歡迎進入圖書管理系統<<<<<<<<<<" << endl
        << "請輸入您的登入方式" << endl
        << "1——工作人員(需要認證)    2——學生 3——退出系統" << endl;
}
 
 
//主函式
int main()
{
    management xiangnan;
 
    //若檔案不存在,則新建檔案
    //存放學生資訊
    ofstream Student_Information("Student_Information.txt", ios::app);
    if (!Student_Information)
    {
        cerr << "檔案\"flight information.dat\"無法開啟!\n";
        exit(1);
    }
    Student_Information.close();
 
    //存放圖書資訊
    ofstream Book_Information("Book_Information.txt", ios::app);
    if (!Book_Information)
    {
        cerr << "檔案\"flight information.dat\"無法開啟!\n";
        exit(1);
    }
    Book_Information.close();
 
    int dlry;   //登陸人員
    while (1)
    {
        xiangnan.login_init();   //介面初始化
        cin >> dlry;
        if (dlry == 1)
        {
            xiangnan.Personnel_System();
        }
        else if (dlry == 2)
        {
            xiangnan.Student_System();
        }
        else if (dlry == 3)
        {
            return 0;
        }
        else
        {
            cout << "輸入錯誤,請重新選擇!" << endl;
        }
    }
    return 0;
}

  

相關文章