小白项目------图书管理系统

图书管理系统

前言

制作不易,欢迎点赞哦。
这是大一小白完成的第一个项目,所以难免有许多不到位的 地方,还有些bug,比如,文件操作时产生空行,但是程序中没有处理空行的方式。导致会导致出现异常中断。但是,毕竟自己一个项目,值得纪念一下吧。这是我花费10天的零碎时间完成的。(因为还要上网课)如果你也和我一样是小白,欢迎你借鉴我的思路,完成你的第一个项目。思路请跳转到实验设计一节。

实验题目

实验 7-1:设计并编写一个 C++风格应用程序,模拟一个图书管理系统应用程序,
支持系统用户的图书借阅、图书管理、用户管理等功能。图书借阅管理主要包括
图书借阅、图书归还、借阅信息查看等功能。图书管理主要包括图书的增加、删
除、修改、查看、统计等功能。用户管理主要包括用户注册、登录、修改密码、
修改个人信息、设置用户类型等功能。
具体要求:
1、定义图书管理系统中的 Book 书目类(还可以定义 User 用户类、Log 图书借
还日志类等)。
2、合理应用类的继承性进行馆藏资源的继承性定义,可分为书、碟片、电子资
源等(或将系统用户分为读者、图书管理员、系统管理员)。
3、根据不同类型用户,登录系统显示不同的用户功能菜单,实现不同的操作处
理,如学生与教师所借阅书的数量和天数均不相同(或考虑图书馆中多种馆藏资
源支持的用户操作有所区别)。
4、增加异处理,在借阅图书时,已到所能借阅图书数量的最大数量给予提示;
归还图书时,图书已超期需要缴纳罚款。
5、通过重载运算符“<<”和“>>”方便图书信息、读者信息录入等操作,并实
现将馆藏图书信息、借阅记录等保存到磁盘,形成图书借还日志文件。
6、扩展实验:可尝试使用 MFC 可视化界面提高用户操作方便性和友好性。

实验题目分析

题目要求我们制作图书管理系统,支持的功能有,图书借阅、图书管理、用户管理等功能。

图书借阅管理包括:图书借阅、图书归还、借阅信息查看等功能。

图书管理主要包括图书的增加,删除,修改,查看,统计等功能。

用户管理主要包括用户的注册,登录,修改密码,修改个人信息,设置用户类型等功能。

运用继承,多态,重载等知识进行设计。

实验设计

如图所示,由于我对文件操作相关操作不熟悉,所以我开始的想法是,把用户,图书管理员,系统管理员的基本文件相关操作进行封装,形成UserFileManageAdd,SysManage_FileManage,UserFileManage,LiaManage_FileManage四个类,所以,在我的设计中,主要是依靠从文件中获取和分割信息,很少存在对成员变量的操作,或者说成员变量只是在其中起辅助作用。LiaManage图书管理员类和User用户类,继承了文件操作的基础功能,进行进一步封装,并添加了自己的具体功能。系统管理员功能直接应用SysManage_FileManage类,完成全部功能。每种功能通过数字选项进行区分和调用。登录时,也是通过数字选项进入不同的界面(展示不同的功能选项)。普通用户可以进行注册和登录,图书管理员只能进行登录,其信息全部由系统管理员修改和增加,系统管理员通过特殊口令进入管理系统。文件中的信息,以空格和换行分割。代表的信息如图所示。

核心代码

//User_FileManageadd.h
#pragma once

class User_FileManageadd //该类只添加一个函数,进行普通用户注册时的信息遍历
    //确认该学号确实没有经过注册
{
public:
    bool Cek_for_registration();
};

//User_FileManageadd.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "User_FileManageadd.h"
#include<iostream>
#include<fstream>
using namespace std;
bool User_FileManageadd::Cek_for_registration()
{
    char info[10] = "";
    cout << "注册前,请输入学号确认,您曾经没有注册:";
    cin >> info;
    fstream file;
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return false;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(str, info) == 0)
        {
            cout << "您的账户已注册,若未注册,请联系系统管理员" << endl;
            file.close();
            return false;
        }
    }

    file.close();
    return true;
}
//UserFileManage.h
#pragma once
#include"User_FileManageadd.h"
class UserFileManage :public User_FileManageadd//该类实现了系统的一些基础功能
{
public:
    //进行文件路径初始化

    void LogFile_addlog(char*);//普通用户进行增加借还日志
    void UInfoFile_addinfo(char*);//普通用户进行增加个人信息(注册)(存在注册前的检查行为)
    void UInfoFile_change();//普通用户和图书管理员信息的修改
    void BInfoFile_searchbook(char* info);//普通用户和图书管理员进行找书
    //图书管理员的信息全部由系统管理员增加,不提供注册功能
};
//UserFileManage.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"UserFileManage.h"
#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
#include<stdlib.h>
using std::cin;
using std::cout;
using std::endl;
using std::fstream;
using std::ofstream;
using std::ios;
void UserFileManage::LogFile_addlog(char* info)//进行日志文件的增加
{
    fstream file;
    file.open("BorrowLog.txt", ios::app);
    if (!file.is_open())
    {
        cout << "文件打开失败!" << endl;
        return;
    }
    file << "\n";
    file << info;
    file.close();
    return;
}

void UserFileManage::UInfoFile_change()//进行个人信息的修改(包括密码)
{
    cout << "请输入您的学(工)号\n";
    char info[7] = "";
    scanf("%s", info);
    fstream file;
    char str[256] = "";
    char* token = new char[256];
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 100);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
        {
            break;
        }
    }
    char* id = token;
    token = strtok(NULL, " ");
    char* cord = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* sex = token;
    token = strtok(NULL, " ");
    char* phone = token;
    token = strtok(NULL, " ");
    char* number = token;
    token = strtok(NULL, " ");
    char* maxnum = token;
    token = strtok(NULL, " ");
    char* maxday = token;
    file.close();
    //得到各个信息
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);

        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("Userinfo.txt", ios::out);
    int judge;
    cout <<
        "请输入您将要改变的信息:(更改密码请按1/姓名请按2/性别请按3/联系方式请按4,结束请按0,修改学(工)号请联系系统管理员):";
    cin >> judge;
    if (judge == 0)
    {
        return;
    }
    cout << "更改前,请输入密码:" << endl;
    char fcord[20] = "";
    cin >> fcord;

    if (strcmp(fcord, cord) == 0)
    {
        cout << "密码正确" << endl;
        cout << "请重新确认您要修改的内容的编号:";
        while (judge != 0)
        {
            cin >> judge;
            switch (judge)
            {
            case 1:
                cout << "请输入更改后的密码(最多19位):" << endl;
                cin >> cord;
                cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
                break;
            case 2:
                cout << "请输入更改后的姓名:" << endl;
                cin >> name;
                cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
                break;
            case 3:
                cout << "请输入更改后的性别:" << endl;

                cin >> sex;
                cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
                break;
            case 4:
                cout << "请输入更改后的联系方式" << endl;
                cin >> phone;
                cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
                break;
            case 0:
                break;
            default:
                cout << "您输入的编号有误,请输入1-4的代码" << endl;
                break;
            }
        }
        cout << "已结束更改" << endl;
    }
    else
    {
        cout << "密码输入错误" << endl;
    }
    char result[1000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, cord);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, sex);
    strcat(result, " ");
    strcat(result, phone);
    strcat(result, " ");
    strcat(result, number);
    strcat(result, " ");
    strcat(result, maxnum);
    strcat(result, " ");
    strcat(result, maxday);
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void UserFileManage::BInfoFile_searchbook(char* info)
{
    fstream file;
    char str[256];
    char* token = NULL;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (file.getline(str, 100))
    {
        token = strtok(str, " ");
        if (strcmp(token, info) == 0)
        {
            break;
        }
    }
    printf("图书编号\t书名\t\t出版日期\t出版社\t\t页数\t作者\t\n");
    while (token != NULL)
    {
        printf("%s \t", token);
        token = strtok(NULL, " ");
    }
    file.close();
}
void UserFileManage::UInfoFile_addinfo(char* info)
{
    User_FileManageadd u;
    fstream file;
    file.open("Userinfo.txt", ios::app);
    if (file.is_open())
    {
        file << "\n";
        file << info;
        file.close();
    }
    else
    {
        cout << "文件打开失败" << endl;
        return;
    }
    file.close();
}
//LiaManage_FileManage.h
#pragma once
#include"UserFileManage.h"
class LiaManage_FileManage :public UserFileManage
{
public:
    void TranverseLog();
    void TranverseBook();
    void AddBook();
    void DeleteBook();
    void ChangeBook();
    void SearchLog(char* info);
    void SearchBook();
    ostream & operator<<(ostream & out);
};
#define _CRT_SECURE_NO_WARNINGS
#include "LiaManage_FileManage.h"
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;
void LiaManage_FileManage::TranverseLog()//图书管理员进行遍历输出借还日志输出
{
    fstream file;
    file.open("BorrowLog.txt", ios::in);
    char* str = new char[256];
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 100);
        cout << str << endl;
    }
    delete[] str;
    return;
}

void LiaManage_FileManage::TranverseBook()
{
    fstream file;
    file.open("BookInfo.txt", ios::in);
    if (file.is_open())
    {
        char* str = new char[256];
        while (!file.eof())
        {
            file.getline(str, 256);
            cout << str << endl;
        }
        delete[] str;
    }
    else
    {
        cout << "文件打开失败" << endl;
        return;
    }
}
void LiaManage_FileManage::AddBook()//图书管理员进行增书操作
{
    fstream file;
    file.open("BookInfo.txt", ios::app);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    cout << "请输入增加图书的信息:(按照:编号 书名 出版日期 出版社 页数 作者的格式输入)" << endl;
    char str[256] = "";
    cin.get();
    cin.get(str, 200);

    file << "\n";
    file << str;
    file << " 1";
    file.close();
    return;
}

void LiaManage_FileManage::DeleteBook()//图书管理员进行删除书操作
{
    cout << "请输入将要删除的书14位编号" << endl;
    char* info = new char[15];
    cin >> info;
    fstream file;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;

    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
            continue;
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("BookInfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    file << buffer;
    file.close();
    cout << "删除成功!" << endl;
    return;
}
void LiaManage_FileManage::ChangeBook()//图书管理员进行改变书信息操作
{
    cout << "请输入您将要修改信息的图书14位编号" << endl;
    char* info = new char[256];
    cin >> info;
    fstream file;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char* str = new char[256];
    char* token = new char[256];
    while (!file.eof())
    {
        file.getline(str, 256);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
            break;
    }
    //进行信息分割
    char* id = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* date = token;
    token = strtok(NULL, " ");
    char* Pubhouse = token;
    token = strtok(NULL, " ");
    char* page = token;
    token = strtok(NULL, " ");
    char* author = token;
    token = strtok(NULL, " ");
    char* state = token;
    file.close();

    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("BookInfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    cout << "请问您将修改该书的哪项信息." << endl <<
        "(编号请按1,书名请按2,出版日期请按3,出版社请按4 ,页数请按5,作者请按6,退出请按0" << endl;
    int judge1, judge2;
    judge1 = 1;
    while (judge1 != 0)
    {
        cin >> judge1;
        switch (judge1)
        {
        case 1:
            cout << "请输入更改后书的编号" << endl;
            cin >> id;
            cout << "您是否将编号改为" << id << endl;
            cout << "确认请按1,取消请按0;" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您将要改变的信息" << endl;
                continue;
            }
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 2:
            cout << "请输入更改后的书名" << endl;
            cin >> name;
            cout << "您是否将书名改为" << name << endl;
            cout << "确认请按1,取消请按0 ;" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您下一步将要更改信息的编号" << endl;
                continue;
            }
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 3:
            cout << "请输入更改后的出版日期" << endl;
            cin >> date;
            cout << "您是否将出版日期更改为" << date << endl;
            cout << "确认请按1,取消请按0" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您下一步将要更改信息的编号" << endl;
                continue;
            }
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 4:
            cout << "请输入更改后的出版社" << endl;
            cin >> Pubhouse;
            cout << "您是否将出版社更改为" << Pubhouse << endl;
            cout << "确认请按1,取消请按0" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您下一步将要更改信息的编号" << endl;
                continue;
            }

            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 5:
            cout << "请输入更改后的页数" << endl;
            cin >> page;
            cout << "您是否将页数更改问" << page << endl;
            cout << "确认请按1,取消请按0" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您下一步将要更改信息的编号" << endl;
                continue;
            }
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 6:
            cout << "请输入更改后的作者" << endl;
            cin >> author;
            cout << "您是否将作者改为" << author << endl;
            cout << "确认请按1,取消请按0" << endl;
            cin >> judge2;
            if (!judge2)
            {
                cout << "请重新选择您下一步将要更改信息的编号" << endl;
                continue;
            }
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 0:
            cout << "图书信息修改即将结束" << endl;
            cout << "图书信息修改结束" << endl;
            break;
        default:
            cout << "请输入0-6选项进行图书信息的修改" << endl;
            break;
        }
    }
    char result[10000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, date);
    strcat(result, " ");
    strcat(result, Pubhouse);
    strcat(result, " ");
    strcat(result, page);
    strcat(result, " ");
    strcat(result, author);
    strcat(result, " ");
    strcat(result, state);
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void LiaManage_FileManage::SearchLog(char* info)
{
    char str[256] = "";
    char* token = new char;
    fstream file;
    file.open("BorrowLog.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 255);

        token = strtok(str, " ");
        if (strcmp(token, info) == 0)
        {
            while (token != NULL)
            {
                printf("%s \t", token);
                token = strtok(NULL, " ");
            }
            cout << endl;
        }
    }
    
    file.close();
}

void LiaManage_FileManage::SearchBook()
{
    char info[50] = "";
    cout << "请输入您查找图书的编号" << endl;
    cin >> info;
    fstream file;
    char str[256];
    char* token = NULL;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (file.getline(str, 100))
    {
        token = strtok(str, " ");
        if (strcmp(token, info) == 0)
        {
            break;
        }
    }
    while (token != NULL)
    {
        printf("%s \t", token);
        token = strtok(NULL, " ");
    }
    file.close();
}
//User.h
#pragma once
#include "UserFileManage.h"
class User :public UserFileManage
{
protected:
    char* id = new char;
    char* passcord = (char*)"123456";
    char* name = new char;
    char* sex = new char;
    char* phone = new char;
    char* num = (char*)"0";
    char* maxnum = (char*)"5";
    char* maxday = (char*)"30";
public:
    User() = default;// ......
    
    void ChangeInfo();//成功,可能存在潜在问题
    void DisplayInfo();//成功
    void DisplayLog();//成功
    void SearchBook();//成功
    void judge();//成功
    void Register();//成功
    
    //修改用户信息文件中的借阅数量和编号
    //修改图书信息文件中的状态码
    

    void Borrow();//成功,需要实现用户借书数量的增加操作
    void Return();//需要实现用户借书数量的减小操作
    void ChangeBookinfob(char*);//成功
    void ChangeBookinfor(char*);//成功
    User(char* id, char* cord);//成功
    void Setnum(char*,int);//
};
void Login();//成功
//User.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "User.h"
#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
#include<sstream>
#include <stdexcept>
using namespace std;
enum ERROR { OverdueError };
using std::cout;
bool judgecord(char* id ,char* cord)
{
    fstream file;
    file.open("Userinfo.txt", ios::in);
    char str[256] = "";
    char* token = new char[256];
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return false;
    }
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(token, id) == 0)
        {
            break;
        }
    }
    token = strtok(NULL, " ");
    char* cord1 = new char[strlen(token) + 1];
    strcpy(cord1, token);
    file.close();
    if (strcmp(cord1, cord) != 0)
    {
        cout << "密码错误,请重新登入" << endl;
        exit(0);
    }
    return true;
}
User::User(char* id, char* cord)
{
    judgecord(id, cord);
    fstream file;
    file.open("Userinfo.txt", ios::in);
    char str[256] = "";
    char* token = new char[256];
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(token, id) == 0)
        {
            break;
        }
    }
    this->id = id;
    file.close();
}
void User::ChangeInfo()
{
    UserFileManage u;
    u.UInfoFile_change();
}
void User::DisplayInfo()
{
    fstream file;
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char* token = new char[100];
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(str, id) == 0)
            break;
    }
    while (token != NULL)
    {
        cout << token;
        cout << " ";
        token = strtok(NULL, " ");
    }
    cout << endl;
    file.close();
}




void User::Borrow()
{
    fstream file;
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char*token = new char[256];
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(token, id) == 0)
            break;
    }
    token = strtok(NULL, " ");
    token = strtok(NULL, " ");
    token = strtok(NULL, " ");
    token = strtok(NULL, " ");
    token = strtok(NULL, " ");
    char* num = token;
    if (strcmp(num,maxnum)==0)
    {
        cout << "您的借书数量已达上限" << endl;
        return;
    }
    cout << "请输入您借阅书籍的编号" << endl;
    char* info = new char;
    cin >> info;

    char* bookid = new char;
    char* bookname = new char;
    char* pubdate = new char;
    char* pubhouse = new char;
    char* page = new char;
    char* author = new char;
    char* state = new char;
    
    
    char* token1 = new char;
    file.close();
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char* str1 = new char[256];
    while (!file.eof())
    {
        file.getline(str1, 255);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            break;
        }
    }
    bookid = token1;
    token1 = strtok(NULL, " ");
    bookname = token1;
    token1 = strtok(NULL, " ");
    pubdate = token1;
    token1 = strtok(NULL, " ");
    pubhouse = token1;
    token1 = strtok(NULL, " ");
    page = token1;
    token1 = strtok(NULL, " ");
    author = token1;
    token1 = strtok(NULL, " ");
    state = token1;
    if (strcmp(state, "0") == 0)
    {
        cout << "该书已借出" << endl;
        return;
    }
    cout << "请输入借阅时间" << endl;
    char* date = new char;
    cin >> date;
    char result[256] = "";
    strcat(result,bookid);
    strcat(result, " ");
    strcat(result, bookname);
    strcat(result, " ");
    strcat(result, id);
    strcat(result, " ");
    strcat(result, date);
    strcat(result, " ");
    strcat(result, "0");
    file.close();
    UserFileManage u;
    
    u.LogFile_addlog(result);
    ChangeBookinfob(bookid);
    Setnum(id, 1);
}
void User::Return()
{
    char* info = new char;
    cout << "请输入您归还书籍的编号" << endl;
    cin >> info;
    fstream file;
    file.open("BorrowLog.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str,255);
        token = strtok(str, " ");
        if (strcmp(token, info) == 0)
            break;
    }
    char* bookid = token;
    token = strtok(NULL, " ");
    char* bookname = token;
    token = strtok(NULL, " ");
    char* ID = token;
    token = strtok(NULL, " ");
    char* date = token;
    string d = date;
    int a = atoi(d.c_str());
    int year = a / 10000;
    int month = a % 10000 / 100;
    int day = a % 10000 % 100;
    
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//闰年
    {
        

        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month || 12)
        {
            if (day == 1)
            {
                day = 31;
            }
            else
            {
                month++;
                day--;
            }
        }
        else if (month == 2)
        {
            month++;
            day++;
        }
        else if (month == 12)
        {
            if (day == 1)
                day = 31;
            else
            {
                year++;
                month = 1;
                day--;
            }
        }
        else
        {
            month++;
        }
    }
    else//平年
    {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month || 12)//一个月31天
        {
            if (day == 1)//大月的一号情况
            {
                day = 31;
            }
            else
            {
                month++;
                day--;
            }
        }
        else if (month == 2)//平年的二月
        {
            month++;
            day += 2;
        }
        else if (month == 12)
        {
            if (day == 1)
                day = 31;
            else
            {
                year++;
                month = 1;
                day--;
            }
        }
        else//一个月30天 的情况
        {
            month++;
        }
    }
    int curyear = 0;
    int curmonth = 0;
    int curday = 0;
    cout << "请输入当前年" << endl;
    cin >> curyear;
    cout << "请输入当前月" << endl;
    cin >> curmonth;
    cout << "请输入当前日" << endl;
    cin >> curday;
    try
    
    {
        if (curyear > year)
        {
            cout << "逾期请缴纳罚款" << endl;
            throw OverdueError;
            if (curmonth > month)
            {
                cout << "逾期,请缴纳罚款" << endl;
                throw OverdueError;
            }
            else if (curday > day)
            {
                cout << "逾期,请缴纳罚款" << endl;
                throw OverdueError;
            }
        }
        
    }
    
    catch (ERROR e)
    {
        cout << "这里是缴纳罚款设施" << endl;
    }
    ostringstream os; //构造一个输出字符串流,流内容为空
    os << curyear; //向输出字符串流中输出int整数i的内容
    string ling = "0";
    if (curmonth < 10)
        os << ling;
    os << month;
    os << curday;
    d = os.str();
    char *da = const_cast<char*>(d.c_str());
    file.close();
    file.open("BorrowLog.txt", ios::app);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char log[256] = "";
    strcat(log, "\n");
    strcat(log, bookid);
    strcat(log, " ");
    strcat(log, bookname);
    strcat(log, " ");
    strcat(log, ID);
    strcat(log, " ");
    strcat(log, da);
    strcat(log, " ");
    strcat(log, "1");
    file << log;
    file.close();
    ChangeBookinfor(bookid);
    Setnum(id, 2);
}
void User::DisplayLog()
{
    char* info = new char;
    
    cout << "请输入您借阅书籍的编号" << endl;
    cin >> info;
    fstream file;
    file.open("BorrowLog.txt", ios::in);
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 100);
        token = strtok(str, " ");
        if (strcmp(token, info) == 0)
            break;
    }
    while (token != NULL)
    {
        
        cout << token << "  ";
        token = strtok(NULL, " "); 
    }
    cout << endl;
    file.close();

}
void User::SearchBook()
{
    UserFileManage u;
    cout << "请输入您想要寻找书籍的编号" << endl;
    char* info = new char;
    cin >> info;
    u.BInfoFile_searchbook(info);
}
void User::Register()
{
    UserFileManage u;
    if (u.Cek_for_registration())
    {
        cout << "请输入您的学号" << endl;
        scanf("%s", id);
    }
    else
    {
        return;
    }

    cout << "注册成功,默认密码为123456" << endl;
    cout << "更改密码请您登入后,选择更改个人信息选项" << endl;

    char result[256] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, passcord);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, sex);
    strcat(result, " ");
    strcat(result, phone);
    strcat(result, " ");
    strcat(result, "0");
    strcat(result, " ");
    strcat(result, maxnum);
    strcat(result, " ");
    strcat(result, maxday);

    u.UInfoFile_addinfo(result);
    cout << "登入请按1,退出请按0" << endl;
    int judge;
    cin >> judge;
    if (judge)
        Login();
    else
        return;
}

void User::judge()
{

    while (1)
    {
        cout << "请进行选择" << endl;
        cout << "借阅资料请按1,归还资料请按2,修改个人信息请按3,查看个人信息请按4,查看借阅信息请按5,查看图书信息请按6,结束退出请按0" << endl;
        int pan;
        cin >> pan;
        if (pan == 0)
            break;
        switch (pan)
        {
        case 1:
            Borrow();
            break;
        case 2:
            Return();
            break;
        case 3:
            cout << "正在进入信息修改系统......." << endl;
            ChangeInfo();
            break;
        case 4:
            DisplayInfo();
            break;
        case 5:
            DisplayLog();
            break;
        case 6:
            SearchBook();
            break;
        default:
            cout << "请选择0-6的选项" << endl;
            break;
        }
    }
}

void Login()
{
    char* Id = new char;
    char* cord = new char;
    cout << "请输入学号" << endl;
    cin >> Id;
    cout << "请输入密码" << endl;
    cin >> cord;
    User u(Id, cord);
    u.judge();
    return;
}
void User::ChangeBookinfob(char* info)
{
    
    fstream file;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char* str = new char[256];
    char* token = new char[256];
    while (!file.eof())
    {
        file.getline(str, 256);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
            break;
    }
    //进行信息分割
    char* id = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* date = token;
    token = strtok(NULL, " ");
    char* Pubhouse = token;
    token = strtok(NULL, " ");
    char* page = token;
    token = strtok(NULL, " ");
    char* author = token;
    file.close();

    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("BookInfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char result[10000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, date);
    strcat(result, " ");
    strcat(result, Pubhouse);
    strcat(result, " ");
    strcat(result, page);
    strcat(result, " ");
    strcat(result, author);
    strcat(result, " ");
    strcat(result, "0");
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void User::Setnum(char* ID,int judge)
{
    fstream file;
    char str[256] = "";
    char* token = new char[256];
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 100);
        token = strtok(str, " ");
        if (strcmp(ID, token) == 0)
        {
            break;
        }
    }
    char* ID1 = token;
    token = strtok(NULL, " ");
    char* cord = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* sex = token;
    token = strtok(NULL, " ");
    char* phone = token;
    token = strtok(NULL, " ");
    char* number = token;
    token = strtok(NULL, " ");
    char* maxnum = token;
    token = strtok(NULL, " ");
    char* maxday = token;
    file.close();
    //得到各个信息
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);

        token1 = strtok(str1, " ");
        if (strcmp(token1, ID) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("Userinfo.txt", ios::out);
    
    char result[1000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, cord);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, sex);
    strcat(result, " ");
    strcat(result, phone);
    strcat(result, " ");
    if (judge == 1)//借书
    {
        if (strcmp(number, "0") == 0)
        {
            strcat(result, "1");
            
        }
        if (strcmp(number, "1") == 0)
        {
            strcat(result, "2");
            
        }
        if (strcmp(number, "2") == 0)
        {
            strcat(result, "3");
            
        }
        if (strcmp(number, "3") == 0)
        {
            strcat(result, "4");
            
        }
        if (strcmp(number, "4") == 0)
        {
            strcat(result, "5");
            
        }
    }
    if (judge == 2)//还书
    {
        if (strcmp(number, "5") == 0)
            strcat(result, "4");
        if (strcmp(number, "2") == 0)
            strcat(result, "1");
        if (strcmp(number, "3") == 0)
            strcat(result, "2");
        if (strcmp(number, "4") == 0)
            strcat(result, "3");
        if (strcmp(number, "1") == 0)
            strcat(result, "0");
    }
    strcat(result, " ");
    strcat(result, maxnum);
    strcat(result, " ");
    strcat(result, maxday);
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void User::ChangeBookinfor(char* info)
{
    fstream file;
    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char* str = new char[256];
    char* token = new char[256];
    while (!file.eof())
    {
        file.getline(str, 256);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
            break;
    }
    //进行信息分割
    char* id = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* date = token;
    token = strtok(NULL, " ");
    char* Pubhouse = token;
    token = strtok(NULL, " ");
    char* page = token;
    token = strtok(NULL, " ");
    char* author = token;
    file.close();

    file.open("BookInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("BookInfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char result[10000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, date);
    strcat(result, " ");
    strcat(result, Pubhouse);
    strcat(result, " ");
    strcat(result, page);
    strcat(result, " ");
    strcat(result, author);
    strcat(result, " ");
    strcat(result, "1");
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
//LiaManage.h
#pragma once
#include"LiaManage_FileManage.h"
class LiaManage
{
protected:
    char* id;
public:
    LiaManage(char* id);
    void  AddBook();//完成
    void DisplayInfo();//完成
    void DeleteBook();//完成
    void ChangeBook();//完成
    void DisplayLog();//完成
    void DisplayBook();//完成
    void SearchBook();//完成
    void Judge();//完成
};
bool JudgeExist(char* ID);
void Loginm();
//LiaManage.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "LiaManage.h"
#include<iostream>
#include<fstream>
#include<string.h>
#include<stdio.h>
using namespace std;
LiaManage::LiaManage(char* id)
{
    this->id = id;
}
void LiaManage::AddBook()
{
    LiaManage_FileManage l;
    l.AddBook();
}
void LiaManage::DeleteBook()
{
    LiaManage_FileManage l;
    l.DeleteBook();
}
void LiaManage::ChangeBook()
{
    LiaManage_FileManage l;
    l.ChangeBook();
}
void LiaManage::DisplayLog()
{
    LiaManage_FileManage l;
    l.TranverseLog();
}
void LiaManage::DisplayBook()
{
    LiaManage_FileManage l;
    l.TranverseBook();
}
void LiaManage::SearchBook()
{
    LiaManage_FileManage l;
    l.SearchBook();
    cout << endl;
}
void LiaManage::DisplayInfo()
{
    fstream file;
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(token, id) == 0)
            break;
    }
    while (token != NULL)
    {
        printf("%s ", token);
        token = strtok(NULL, " ");
    }
    cout << endl;
    file.close();
}
void LiaManage::Judge()
{
    
    int judge;
    while (1)
    {
        cout <<
            "请进行选择(增加书籍请按1,删除书籍请按2,修改书籍信息请按3,"
            << "查找书籍请按4,查看个人信息请按5,查看借还日志请按6,查看所有图书请按7,结束请按0)";
        cout << "(修改个人信息请联系图书管理员)" << endl;
        cin >> judge;
        if (judge == 0)
            break;
        switch (judge)
        {
        case 1:
            AddBook();
            break;
        case 2:
            DeleteBook();
            break;
        case 3:
            ChangeBook();
            break;
        case 4:
            SearchBook();
            break;
        case 5:
            DisplayInfo();
            break;
        case 6:
            DisplayLog();
            break;
        case 7:
            DisplayBook();
            break;
        case 0:
            exit(0);
        default:
            cout << "请输入0-6的选项" << endl;
            break;
        }
    }
}
bool JudgeExist(char* ID)
{
    fstream file;
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return false;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(token, ID) == 0)
        {
            return true;
        }
    }
    return false;
}
void Loginm()
{
    char* ID = new char;
    cout << "请输入您的工号" << endl;
    cin >> ID;
    if (JudgeExist(ID))
    {
        fstream file;
        file.open("ManageInfo.txt", ios::in);
        char str[256] = "";
        char* token = new char;
        while (!file.eof())
        {
            file.getline(str, 255);
            token = strtok(str, " ");
            if (strcmp(token, ID) == 0)
                break;
        }
        token = strtok(NULL, " ");
        char* psscord = new char;
        cout << "请输入密码" << endl;
        cin >> psscord;
        if (strcmp(psscord, token) != 0)
        {
            cout << "密码错误" << endl;
            exit(0);
        }
        cout << "密码正确" << endl;
        LiaManage l(ID);
        l.Judge();
    }
    else
        cout << "对不起,工号不存在,请联系系统管理员" << endl;
}
//SysManage_FileManage.h
#pragma once
class SysManage_FileManage
{
public:
    void TranverseUser();
    void AddUser();
    void AddManage();
    void DeleteUser();
    void ChangeUser();
    void SearchUser();
    void DeleteManage();
    void ChangeManage();
    void SearchManage();
    void judge();
    ostream & operator<<(ostream & out);
};
//SysManage_FileManage.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "SysManage_FileManage.h"
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;

void SysManage_FileManage::TranverseUser()
{
    char* filepath = new char;
    int judge;
    cout << "获得普通用户全部信息请按1,获得图书管理员的全部信息请按2" << endl;
    cin >> judge;
    if (judge == 1)
        filepath = { (char*)"Userinfo.txt" };
    else if (judge == 2)
        filepath = { (char*)"ManageInfo.txt" };
    else
        cout << "输入错误" << endl;
    fstream file(filepath, ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    while (!file.eof())
    {
        file.getline(str, 100);
        cout << str << endl;
    }
    file.close();
    return;
}
ostream & SysManage_FileManage::operator<<(ostream & out)
{
    TranverseUser();
}
void SysManage_FileManage::AddUser()
{
    fstream file;
    file.open("Userinfo.txt", ios::app);
    char str[256] = "";
    cout << "请输入用户信息" << endl;
    cout << "按照学号,密码,姓名,性别,联系方式,借阅数量,最大借阅数,最大借阅天数输入" << endl;
    cin.get();
    cin.getline(str, 100);
    file << "\n";
    file << str;
    file.close();
    return;
}
void SysManage_FileManage::AddManage()
{
    fstream file;
    file.open("ManageInfo.txt", ios::app);
    char str[256] = "";
    cout << "请输入图书管理员信息" << endl;
    cout << "按照工号,密码,姓名,性别,联系方式" << endl;
    cin.get();
    cin.getline(str, 100);
    file << "\n";
    file << str;
    
    file.close();
    return;
}
void SysManage_FileManage::SearchUser()
{
    char info[10] = "";
    cout << "请输入您将要查找用户的学号" << endl;
    cin >> info;
    fstream file;
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(str, info) == 0)
            break;
    }
    while (token != NULL)
    {
        printf("%s \t", token);
        token = strtok(NULL, " ");
    }
    file.close();
}
void SysManage_FileManage::DeleteUser()
{
    cout << "请输入将要删除的用户学号" << endl;
    char* info = new char[15];
    cin >> info;
    fstream file;
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;

    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
            continue;
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("Userinfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    file << buffer;
    file.close();
    cout << "删除成功!" << endl;
    return;
}

void SysManage_FileManage::ChangeUser()
{
    cout << "请输入您的修改用户的学号\n";
    char info[7] = "";
    cin >> info;
    fstream file;
    char str[256] = "";
    char* token = new char[256];
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 100);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
        {
            break;
        }
    }
    char* id = token;
    token = strtok(NULL, " ");
    char* cord = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* sex = token;
    token = strtok(NULL, " ");
    char* phone = token;
    token = strtok(NULL, " ");
    char* number = token;
    token = strtok(NULL, " ");
    char* maxnum = token;
    token = strtok(NULL, " ");
    char* maxday = token;
    file.close();
    //得到各个信息
    file.open("Userinfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);

        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("Userinfo.txt", ios::out);
    int judge;
    cout << "请输入您将要改变的信息:(更改密码请按1/姓名请按2/性别请按3/联系方式请按4,"
        << "借阅数量请按5/最大借阅数请按6/最大借阅天数请按7,学号请按8,结束更改请按0):";
    cin >> judge;
    if (judge == 0)
    {
        return;
    }
    cout << "请重新确认您要修改的内容的编号:";
    while (judge != 0)
    {
        cin >> judge;
        switch (judge)
        {
        case 1:
            cout << "请输入更改后的密码(最多19位):" << endl;
            cin >> cord;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 2:
            cout << "请输入更改后的姓名:" << endl;
            cin >> name;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 3:
            cout << "请输入更改后的性别:" << endl;

            cin >> sex;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 4:
            cout << "请输入更改后的联系方式" << endl;
            cin >> phone;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 5:
            cout << "请输入更改后的借阅数量" << endl;
            cin >> number;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 6:
            cout << "请输入更改后的最大借阅数" << endl;
            cin >> maxnum;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 7:
            cout << "请输入更改后的最大借阅天数" << endl;
            cin >> maxday;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 8:
            cout << "请输入更改后的学号" << endl;
            cin >> id;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 0:
            cout << "即将退出更改" << endl;
            break;
        default:
            cout << "您输入的编号有误,请输入0-8的代码" << endl;
            break;
        }
    }
    cout << "已结束更改" << endl;
    char result[1000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, cord);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, sex);
    strcat(result, " ");
    strcat(result, phone);
    strcat(result, " ");
    strcat(result, number);
    strcat(result, " ");
    strcat(result, maxnum);
    strcat(result, " ");
    strcat(result, maxday);
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void SysManage_FileManage::SearchManage()
{
    char info[10] = "";
    cout << "请输入您将要查找管理员的工号" << endl;
    cin >> info;
    fstream file;
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str[256] = "";
    char* token = new char;
    while (!file.eof())
    {
        file.getline(str, 255);
        token = strtok(str, " ");
        if (strcmp(str, info) == 0)
            break;
    }
    while (token != NULL)
    {
        printf("%s \t", token);
        token = strtok(NULL, " ");
    }
    file.close();
}

void SysManage_FileManage::ChangeManage()
{
    cout << "请输入您的修改图书管理员的工号\n";
    char info[7] = "";
    cin >> info;
    fstream file;
    char str[256] = "";
    char* token = new char[256];
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    while (!file.eof())
    {
        file.getline(str, 100);
        token = strtok(str, " ");
        if (strcmp(info, token) == 0)
        {
            break;
        }
    }
    char* id = token;
    token = strtok(NULL, " ");
    char* cord = token;
    token = strtok(NULL, " ");
    char* name = token;
    token = strtok(NULL, " ");
    char* sex = token;
    token = strtok(NULL, " ");
    char* phone = token;
    token = strtok(NULL, " ");
    file.close();
    //得到各个信息
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;
    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);

        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
        {
            continue;
        }
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("ManageInfo.txt", ios::out);
    int judge;
    cout << "请输入您将要改变的信息:(更改密码请按1/姓名请按2/性别请按3/联系方式请按4,"
        << "工号请按5,结束更改请按0):";
    cin >> judge;
    if (judge == 0)
    {
        return;
    }
    cout << "请重新确认您要修改的内容的编号:";
    while (judge != 0)
    {
        cin >> judge;
        switch (judge)
        {
        case 1:
            cout << "请输入更改后的密码(最多19位):" << endl;
            cin >> cord;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 2:
            cout << "请输入更改后的姓名:" << endl;
            cin >> name;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 3:
            cout << "请输入更改后的性别:" << endl;

            cin >> sex;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 4:
            cout << "请输入更改后的联系方式" << endl;
            cin >> phone;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 5:
            cout << "请输入更改后的工号" << endl;
            cin >> id;
            cout << "更改成功,请继续输入您下一步将要更改的信息" << endl;
            break;
        case 0:
            cout << "即将退出更改" << endl;
            break;
        default:
            cout << "您输入的编号有误,请输入0-5的代码" << endl;
            break;
        }
    }
    cout << "已结束更改" << endl;
    char result[1000] = "";
    strcat(result, id);
    strcat(result, " ");
    strcat(result, cord);
    strcat(result, " ");
    strcat(result, name);
    strcat(result, " ");
    strcat(result, sex);
    strcat(result, " ");
    strcat(result, phone);
    strcat(result, "\n");
    strcat(result, buffer);
    file << result;
    file.close();
    return;
}
void SysManage_FileManage::DeleteManage()
{
    cout << "请输入将要删除的图书管理员的工号" << endl;
    char* info = new char[15];
    cin >> info;
    fstream file;
    file.open("ManageInfo.txt", ios::in);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    char str1[256] = "";
    char* token1 = NULL;
    char buffer[10000] = "";
    token1 = new char;

    while (!file.eof())
    {
        file.getline(str1, 100);
        char* str2 = new char[strlen(str1) + 1];
        strcpy(str2, str1);
        token1 = strtok(str1, " ");
        if (strcmp(token1, info) == 0)
            continue;
        strcat(buffer, str2);
        strcat(buffer, "\n");
    }
    file.close();

    file.open("ManageInfo.txt", ios::out);
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
        return;
    }
    file << buffer;
    file.close();
    cout << "删除成功!" << endl;
    return;
}
void SysManage_FileManage::judge()
{
    while(1)
    { 
        cout << "请您进行选择" << endl;
        cout << "输出所有用户信息请按1,增加用户请按2,增加图书管理员请按3,删除用户请按4,更改用户信息请按5" << endl;
        cout << "查找用户请按6,删除图书管理员请按7,修改图书管理员信息请按8,查找图书管理员请按9,退出请按0" << endl;
        int judge;
        cin >> judge;
        if (judge == 0)
            break;
        switch (judge)
        {
        case 1:
            TranverseUser();
            break;
        case 2:
            AddUser();
            break;
        case 3:
            AddManage();
            break;
        case 4:
            DeleteUser();
            break;
        case 5:
            ChangeUser();
            break;
        case 6:
            SearchUser();
            break;
        case 7:
            DeleteManage();
            break;
        case 8:
            ChangeManage();
            break;
        case 9:
            SearchManage();
            break;
        default:
            cout << "请输入0-9的选项" << endl;
            break;
        }
    }

}
//login.cpp
#include<iostream>
#include"User.h"
#include"LiaManage.h"
using namespace std;
void login()
{
    char* SysManagekouling = (char*)"tianwanggaidihu";
    char* kouling = new char;
    cout << "普通用户请按1,图书管理员请按2,系统管理员请按3" << endl;
    int pan;
    cin >> pan;
    switch (pan)
    {
    case 1:
        int pan1;
        cout << "注册请按1,登入请按2" << endl;
        cin >> pan1;
        if (pan1 == 1)
        {
            User u;
            u.Register();
        }
        else if (pan1 == 2)
        {
            Login();
        }
        else
            cout << "请输入1,2中的一项" << endl;
        break;
    case 2:
        Loginm();
        break;
    case 3:
        cout << "请输入系统管理员口令" << endl;
        
        cin >> kouling;
        if (strcmp(kouling, SysManagekouling) != 0)
        {
            cout << "口令错误" << endl;
            exit(0);
        }
        SysManage_FileManage s;
        s.judge();
        break;
    default:
        cout << "请选择1-3的选项" << endl;
        break;
    }
}
int main()
{
    cout << "正在进入登入页面" << endl;
    cout << "-----------------------------------------------------" << endl;
    login();
    return 0;
}

实验结果截屏

实验成果分析

优点:大量熟练的使用了流和文件,类的结构还算清晰明了,实现的功能完整。所有程序由自己设计及完成。在实现过程中大量的查阅了资料,实现了能力的提升。

不足:在对文件进行处理时,可能会出现空行,导致执行其他操作时导致程序崩溃。多态和异常处理使用的较少。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值