C语言实现图书馆里系统

C语言实现的图书馆里系统,用到了结构体相关知识,代码如下:

#include <stdio.h>
#include <string.h>
#include <time.h>

typedef struct StuInfo {
    char ID[11];
    char Faculty[32];
    char Profession[32];
    char Name[32];
    char Sex[8];
    char Phone[12];
    char Passwd[32];
    char Email[32];
    char BookList[3][64];
    int  flag;
} STUINFO;

typedef struct BookInfo {
    char ID[7];
    char Name[64];
    char Author[32];
    float Price;
    char PubHouse[64];
    char PubDate[64];
    char BookIntro[1024];
    int  Count;
    char Index[64];//书架
    char BrowDate[64];
    char RetDate[64];//还书日期
    int  ReBrowCount;//续借次数
    int  BrowCount;//借书次数
} BOOKINFO;

typedef struct BookManager {
    char ID[11];
    char Name[64];
    char Passwd[32];
    char Email[32];
} BOOKMANAGER;

typedef struct BroInfo {
    char ID[11];
    char Name[32];
    char Profess[64];
    char ReDate[64];
} BROINFO;

typedef struct BookInfoCount {
    char Name[64];
    int  count;
} BOOKINFOCOUNT;

typedef struct ProfessBookInfo {
    char Profession[32];
    BOOKINFOCOUNT  Book[1024];
} PROFESSBOOKINFO;

STUINFO      g_StuInfo[1024];
BOOKINFO     g_BookInfo[1024];
BROINFO      g_BroInfo[1024];
BOOKMANAGER  g_BookManager[1024];
PROFESSBOOKINFO g_ProfessBookInfo[1024];

char g_StuID[11];
char g_ManaID[11];
int  g_BookCount;

void UpdateStuInfo();
int CheckBookTime(int year, int month, int day, int hour, int min);
void UpdateBookInfo();
void Sort();
int CalSumDays(int year, int month, int day);
int CheckEmail(char *email);
void QueryAllBookBorrowInfo();
void QueryStuBorrowInfo();

int CheckBookTime(int year, int month, int day, int hour, int min)//验证输入的借书时间格式是否正确
{
    if (month < 1 || month > 12)
    {
        printf("输入错误!\n");
        return -1;
    }

    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
    {
        if (day < 1 || day > 31)
        {
            printf("输入错误!\n");
            return -1;
        }
    }

    if (month == 4 || month == 6 || month == 9 || month == 11)
    {

        if (day < 1 || day > 30)
        {
            printf("输入错误!\n");
            return -1;
        }
    }
    if (month == 2)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        {
            if (day < 1 || day > 29)
            {
                printf("输入错误!\n");
                return -1;
            }
        }
        else
        {
            if (day < 1 || day > 28)
            {
                printf("输入错误!\n");
                return -1;
            }
        }
    }

    if (hour < 0 || hour > 23)
    {
        printf("输入错误\n");
        return -1;
    }

    if (min < 0 || min > 59)
    {
        printf("输入错误\n");
        return -1;
    }

    return 0;
}

int ManagerLogin()//管理员登陆
{
    char t_ID[32] = {0};
    char t_Passwd[32] = {0};
    int  i = 0;
    FILE *fp = NULL;

    printf("\t\t\t\t管理员登录\n");
    printf("\n\t\t\t\t请输入账号:");
    scanf("%s", t_ID);
    printf("\n\t\t\t\t请输入密码:");
    scanf("%s", t_Passwd);

    fp = fopen("Manager.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }

    while (strlen(g_BookManager[i].ID) != 0)//当存在管理员ID时
    {
        if (!strcmp(t_ID, g_BookManager[i].ID) && !strcmp(t_Passwd, g_BookManager[i].Passwd))//密码和ID都对
        {
            strcpy(g_ManaID, g_BookManager[i].ID);//将此ID存入全局变量
            fclose(fp);
            return 0;
        }
        i++;
    }

    fclose(fp);

    return -1;
}

int LoadManagerInfo()//将manager文件里的内容存入到数组里
{
    int i = 0;
    FILE *fp = fopen("Manager.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }
    char str[1024] = {0};

    while(fgets(str, 1024, fp))//fgets读取一行内容
    {
        str[strlen(str)-1] = '\0';//方便解析字符串,去掉换行符
        sscanf(str, "%s %s %s %s", g_BookManager[i].ID, g_BookManager[i].Name, g_BookManager[i].Passwd, g_BookManager[i].Email);
        i++;
        memset(str, 0, 1024);
    }

    fclose(fp);

    return 0;
}

int LoadBrowInfo()
{
    int i = 0;
    FILE *fp = fopen("BrowRecord.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }
    char str[1024] = {0};
    while(fgets(str, 1024, fp))
    {
        str[strlen(str)-1] = '\0';
        sscanf(str, "%s %s %s %s", g_BroInfo[i].ID, g_BroInfo[i].Name, g_BroInfo[i].Profess, g_BroInfo[i].ReDate);
        i++;
        memset(str, 0, 1024);
    }

    fclose(fp);

    return 0;
}

int LoadStuInfo()
{
    FILE *fp = NULL;
    int  i = 0;
    fp = fopen("Student.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }
    while(fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s %d\n", g_StuInfo[i].ID, g_StuInfo[i].Faculty, g_StuInfo[i].Profession, g_StuInfo[i].Name, g_StuInfo[i].Sex, g_StuInfo[i].Phone, g_StuInfo[i].Passwd, g_StuInfo[i].Email, g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2], &g_StuInfo[i].flag) == 12)//12是为了结束读取文件
    {
        i++;
    }

    fclose(fp);
    return 0;
}

int CheckIndex(char *index)//检查是否同一个书架放了2本书
{
    int i = 0;
    for (i = 0; i < g_BookCount; i++)
    {
        if (strcmp(index, g_BookInfo[i].Index) == 0)//如果相同,返回-1
        {
            return -1;
        }
    }

    return 0;
}

int CheckSameID(char *ID)//检查书是否用了同一个编号
{
    int i = 0;
    for (i = 0; i < g_BookCount; i++)
    {
        if (strcmp(ID, g_BookInfo[i].ID) == 0)
        {
            return -1;
        }
    }

    return 0;
}

void AddBook()//添加图书
{
    int year, month, day;

    int i = 0;

    while(1)
    {
        printf("请输入图书编号: ");
        scanf("%s", g_BookInfo[g_BookCount].ID);//增加书的编号

        if (strlen(g_BookInfo[g_BookCount].ID) != 7)//判断编号长度是否为6位
        {
            printf("编号格式不正确!\n");
            continue;
        }
        if (CheckSameID(g_BookInfo[g_BookCount].ID) == -1)//判断是否用了同一个ID
        {
            printf("图书编号已存在!\n");
            continue;
        }
        break;
    }

    printf("请输入图书名称: ");
    scanf("%s", g_BookInfo[g_BookCount].Name);
    printf("请输入图书作者: ");
    scanf("%s", g_BookInfo[g_BookCount].Author);
    printf("请输入图书价格: ");
    scanf("%f", &g_BookInfo[g_BookCount].Price);
    printf("请输入图书出版社: ");
    scanf("%s", g_BookInfo[g_BookCount].PubHouse);
    while(1)
    {
        printf("请输入图书出版日期: ");
        printf("年 :  ");
        scanf("%d", &year);
        printf("月 :  ");
        scanf("%d", &month);
        printf("日 :  ");
        scanf("%d", &day);
        if (-1 == CheckBookTime(year, month, day, 5, 5))
        {
            continue;
        }
        sprintf(g_BookInfo[g_BookCount].PubDate, "%d年%d月%d日", year, month, day);
        break;
    }

    printf("请输入图书简介: ");
    scanf("%s", g_BookInfo[g_BookCount].BookIntro);
    printf("请输入图书数量: ");
    scanf("%d", &g_BookInfo[g_BookCount].Count);
    while(1)
    {
        int row, col;
        printf("请输入图书书架位置: \n");
        printf("排: ");
        scanf("%d", &row);
        printf("列: ");
        scanf("%d", &col);

        sprintf(g_BookInfo[g_BookCount].Index, "%d排%d列", row, col);
        if (CheckIndex(g_BookInfo[g_BookCount].Index) == -1)//判断书架位置
        {
            printf("书架位置已经有书!\n");
            continue;
        }
        break;
    }

    strcpy(g_BookInfo[g_BookCount].BrowDate, "xx");//将借书世界显示一下
    strcpy(g_BookInfo[g_BookCount].RetDate, "xx");
    g_BookInfo[g_BookCount].ReBrowCount = 0;//续借次数为0
    g_BookInfo[g_BookCount].BrowCount = 0;//借书次数也为0

    g_BookCount++;
    printf("添加成功!\n");
    UpdateBookInfo();
}

int DelBook()
{
    int i = 0;
    int j = 0;
    char t_BookID[7] = {0};
    printf("请输入要删除的图书ID: ");
    scanf("%s", t_BookID);

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(t_BookID, g_BookInfo[i].ID))//判断是否有这本书
        {
            if (g_BookInfo[i].BrowCount != 0)//如果这本书的借书次数不为0
            {
                printf("书已经借出!不能删除\n");
                return 0;
            }
            for (j = i; strlen(g_BookInfo[j].ID) != 0; j++)//后边的书的信息覆盖掉删除图书的信息
            {
                g_BookInfo[j] = g_BookInfo[j+1];
            }
            g_BookCount--;
            UpdateBookInfo();
            printf("删除成功!\n\n");
            return 1;
        }
    }

    printf("ID不存在!\n");

    return 0;
}

void ModifyBook()
{
    char t_BookID[7] = {0};
    printf("请输入要修改的图书ID: ");
    scanf("%s", t_BookID);
    int i = 0;
    int sel = 0;
    int t_Count = 0;
    char str[1024] = {0};

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(t_BookID, g_BookInfo[i].ID))
        {
            if (g_BookInfo[i].BrowCount == 0)//在这本书并没有借走的情况,可以修改三个选项
            {
                printf("\t\t\t\t请问你要修改什么 ?\n");
                printf("1、图书简介\n");
                printf("2、图书总数量\n");
                printf("3、图书书架位置\n");
                printf("4、返回\n");
                printf("请输入: ");
                scanf("%d", &sel);
                if (sel == 1)
                {
                    printf("请输入修改的内容:\n");
                    scanf("%s", g_BookInfo[i].BookIntro);
                }
                else if (sel == 2)
                {
                    printf("请输入修改的总数量:\n");
                    scanf("%d", &t_Count);
                    if (t_Count < 0)
                    {
                        printf("数量设置不正确!\n");
                        return;
                    }
                    g_BookInfo[i].Count = t_Count;
                }
                else if (sel == 3)
                {
                    printf("请输入修改的书架位置:\n");
                    int row, col;
                    printf("排: ");
                    scanf("%d", &row);
                    printf("列: ");
                    scanf("%d", &col);
                    sprintf(str, "%d排%d列", row, col);
                    if (CheckIndex(str) == -1)
                    {
                        printf("书架位置已经有书!\n");
                        return;
                    }
                    strcpy(g_BookInfo[i].Index, str);//修改书架位置
                }
                else
                {
                    return;
                }
            }
            else//当此书被别人借走的时候
            {
                printf("请输入修改的总数量:\n");
                scanf("%d", &t_Count);
                if (t_Count < 0)
                {
                    printf("数量设置不正确!\n");
                    return;
                }
                g_BookInfo[i].Count = t_Count;
            }
            printf("修改成功!\n\n");
            UpdateBookInfo();
            break;
        }
    }
}

void QueryBook()//查询图书
{
    int sel = 0;
    char str[512] = {0};
    int flag = 0;
    int i = 0;

    printf("请问你要根据什么查询? (1-出版社,2-书名, 3-返回):  ");
    scanf("%d", &sel);

    if (sel == 1)
    {
        printf("请输入出版社名称: ");
        scanf("%s", str);
        for (i = 0; i < g_BookCount; i++)
        {
            if (!strcmp(str, g_BookInfo[i].PubHouse))//当查询到这本书的时候
            {
                printf("编号:  %s\n", g_BookInfo[i].ID);
                printf("名称:  %s\n", g_BookInfo[i].Name);
                printf("作者:  %s\n", g_BookInfo[i].Author);
                printf("价格:  %.2f\n", g_BookInfo[i].Price);
                printf("出版社:  %s\n", g_BookInfo[i].PubHouse);
                printf("出版日期:  %s\n", g_BookInfo[i].PubDate);
                printf("简介:  %s\n", g_BookInfo[i].BookIntro);
                printf("数量:  %d\n", g_BookInfo[i].Count);
                printf("位置:  %s\n", g_BookInfo[i].Index);
                printf("借出日期:  %s\n", g_BookInfo[i].BrowDate);
                printf("归还日期:  %s\n", g_BookInfo[i].RetDate);
                printf("续借次数:  %d\n", g_BookInfo[i].ReBrowCount);
                printf("借书次数:  %d\n", g_BookInfo[i].BrowCount);
                flag = 1;
            }
        }
    }
    else if (sel == 2)
    {
        printf("请输入图书名称: ");
        scanf("%s", str);
        for (i = 0; i < g_BookCount; i++)
        {
            if (!strcmp(str, g_BookInfo[i].Name))
            {
                printf("编号:  %s\n", g_BookInfo[i].ID);
                printf("名称:  %s\n", g_BookInfo[i].Name);
                printf("作者:  %s\n", g_BookInfo[i].Author);
                printf("价格:  %.2f\n", g_BookInfo[i].Price);
                printf("出版社:  %s\n", g_BookInfo[i].PubHouse);
                printf("出版日期:  %s\n", g_BookInfo[i].PubDate);
                printf("简介:  %s\n", g_BookInfo[i].BookIntro);
                printf("数量:  %d\n", g_BookInfo[i].Count);
                printf("位置:  %s\n", g_BookInfo[i].Index);
                printf("借出日期:  %s\n", g_BookInfo[i].BrowDate);
                printf("归还日期:  %s\n", g_BookInfo[i].RetDate);
                printf("续借次数:  %d\n", g_BookInfo[i].ReBrowCount);
                printf("借书次数:  %d\n", g_BookInfo[i].BrowCount);
                flag = 1;
            }
        }
    }
    else
    {
        return;
    }

    if (flag == 0)
    {
        printf("没有此书信息!\n");
    }
}

void ManagerBooks()//图书管理
{
    int sel = 0;

    while(1)
    {
        system("cls");
        printf("\t\t\t请选择操作\n");
        printf("\t\t\t1、增加图书\n");
        printf("\t\t\t2、删除图书\n");
        printf("\t\t\t3、修改图书\n");
        printf("\t\t\t4、查询图书\n");
        printf("\t\t\t5、返回\n");
        printf("\n\t\t\t请输入你的选择:");
        scanf("%d", &sel);

        system("cls");//清屏
        switch (sel)
        {
            case 1:
                AddBook();
                break;
            case 2:
                DelBook();
                break;
            case 3:
                ModifyBook();
                break;
            case 4:
                QueryBook();
                break;
            case 5:
                return;
            default:
                break;
        }

        system("pause");//暂停程序
    }
}

void QueryAllBookBorrowInfo()//查询所有图书的借阅情况
{
    int i = 0;

    for (i = 0; i < g_BookCount; i++)
    {
        printf("编号:  %s\n", g_BookInfo[i].ID);
        printf("名称:  %s\n", g_BookInfo[i].Name);
        printf("作者:  %s\n", g_BookInfo[i].Author);
        printf("价格:  %.2f\n", g_BookInfo[i].Price);
        printf("出版社:  %s\n", g_BookInfo[i].PubHouse);
        printf("出版日期:  %s\n", g_BookInfo[i].PubDate);
        printf("简介:  %s\n", g_BookInfo[i].BookIntro);
        printf("数量:  %d\n", g_BookInfo[i].Count);
        printf("位置:  %s\n", g_BookInfo[i].Index);
        printf("借出日期:  %s\n", g_BookInfo[i].BrowDate);
        printf("归还日期:  %s\n", g_BookInfo[i].RetDate);
        printf("续借次数:  %d\n", g_BookInfo[i].ReBrowCount);
        printf("借书次数:  %d\n", g_BookInfo[i].BrowCount);
        //printf("%s\t\t%s\t\t%d\t\t%d\n", g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].BrowCount, g_BookInfo[i].Count);
    }
}

void QueryStuBorrowInfo()//查询借阅图书的学生信息
{
    int sel = 0;
    char str[64] = {0};
    char str1[64] = {0};
    int i = 0;
    int j = 0;
    int flag = 0;
    int flag1 = 0;

    system("cls");

    while(1)
    {
        system("cls");

        printf("1、根据学生姓名 \n");
        printf("2、根据书名 \n");
        printf("3、根据书名和学生姓名 \n");
        printf("4、返回 \n");
        printf("请问你根据什么查询: ");

        scanf("%d", &sel);

        system("cls");

        if (sel == 1)
        {
            printf("请输入学生姓名: ");
            scanf("%s", str);
            for (i = 0; strlen(g_StuInfo[i].Name) != 0; i++)
            {
                if (!strcmp(str, g_StuInfo[i].Name))
                {
                    printf("%s\t%s\t%s\t%s\n", g_StuInfo[i].Name, g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2]);
                    flag = 1;
                }
            }
        }
        else if (sel == 2)
        {
            printf("请输入书名: ");
            scanf("%s", str);
            for (j = 0; j < g_BookCount; j++)
            {
                if (!strcmp(g_BookInfo[j].Name, str))
                {
                    memset(str, 0, sizeof(str));
                    strcpy(str, g_BookInfo[j].ID);
                    flag1 = 1;
                    break;
                }
            }
            if (flag1 == 0)
            {
                printf("没有此书名!\n");
                continue;
            }
            for (i = 0; strlen(g_StuInfo[i].Name) != 0; i++)
            {
                if (!strcmp(str, g_StuInfo[i].BookList[0]) || !strcmp(str, g_StuInfo[i].BookList[1]) || !strcmp(str, g_StuInfo[i].BookList[2]))
                {
                    printf("编号:  %s\n", g_StuInfo[i].ID);
                    printf("学院:  %s\n", g_StuInfo[i].Faculty);
                    printf("专业:  %s\n", g_StuInfo[i].Profession);
                    printf("姓名:  %s\n", g_StuInfo[i].Name);
                    printf("性别:  %s\n", g_StuInfo[i].Sex);
                    printf("电话:  %s\n", g_StuInfo[i].Phone);
                    printf("密码:  %s\n", g_StuInfo[i].Passwd);
                    printf("邮箱:  %s\n", g_StuInfo[i].Email);
                    printf("书单:  《%s》,《%s》,《%s》\n", g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2]);
                    flag = 1;
                }
            }
        }
        else if (sel == 3)
        {
            printf("请输入学生姓名: ");
            scanf("%s", str);
            printf("请输入书名: ");
            scanf("%s", str1);
            for (j = 0; j < g_BookCount; j++)
            {
                if (!strcmp(g_BookInfo[j].Name, str1))
                {
                    memset(str1, 0, sizeof(str1));
                    strcpy(str1, g_BookInfo[j].ID);
                    flag1 = 1;
                }
            }
            if (flag1 == 0)
            {
                printf("没有此书名!\n");
                continue;
            }
            for (i = 0; strlen(g_StuInfo[i].Name) != 0; i++)
            {
                if (!strcmp(str, g_StuInfo[i].Name) && (!strcmp(str1, g_StuInfo[i].BookList[0]) || !strcmp(str1, g_StuInfo[i].BookList[1]) || !strcmp(str1, g_StuInfo[i].BookList[2])))
                {
                    printf("%s\t%s\t%s\t%s\n", g_StuInfo[i].Name, g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2]);
                    flag = 1;
                }
            }
        }
        else if (sel == 4)
        {
            return;
        }
        else
        {
            continue;
        }

        if (flag == 0)
        {
            printf("没有此信息! \n");
        }
        if(sel != 4)
            system("pause");
    }
}

void QueryOverDataBook()//查询超期未还的图书情况
{
    int i = 0;
    int SumDay = 0;
    int SumDay1 = 0;
    int year, month, day, min, hour;
    int flag = 0;
    time_t tt = time(NULL);//获取系统现在的时间
    struct tm* t= localtime(&tt);

    SumDay = CalSumDays(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);//计算一共有多少天,现在的时间

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(g_BookInfo[i].BrowDate, "xx"))
            continue;
        sscanf(g_BookInfo[i].BrowDate, "%d年%d月%d日%d时%d分", &year, &month, &day, &hour, &min);

        SumDay1 = CalSumDays(year, month, day);//借书

        if (SumDay1 - SumDay > 30)
        {
            flag = 1;
            printf("编号:  %s\n", g_BookInfo[i].ID);
            printf("名称:  %s\n", g_BookInfo[i].Name);
            printf("作者:  %s\n", g_BookInfo[i].Author);
            printf("价格:  %.2f\n", g_BookInfo[i].Price);
            printf("出版社:  %s\n", g_BookInfo[i].PubHouse);
            printf("出版日期:  %s\n", g_BookInfo[i].PubDate);
            printf("简介:  %s\n", g_BookInfo[i].BookIntro);
            printf("数量:  %d\n", g_BookInfo[i].Count);
            printf("位置:  %s\n", g_BookInfo[i].Index);
            printf("借出日期:  %s\n", g_BookInfo[i].BrowDate);
            printf("归还日期:  %s\n", g_BookInfo[i].RetDate);
            printf("续借次数:  %d\n", g_BookInfo[i].ReBrowCount);
            printf("借书次数:  %d\n", g_BookInfo[i].BrowCount);
            //printf("%s %s %s %.2f %s %s %s %d %s %s %s %d %d\n", g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, g_BookInfo[i].ReBrowCount, g_BookInfo[i].BrowCount);
        }
    }

    if (flag == 1)
    {
        printf("没有超期未还的图书\n");
    }
}

void QueryOverDataStu(int fl)//查询超期未还学生名单
{
    int i = 0, j = 0;
    int SumDay = 0;
    int SumDay1 = 0;
    int year, month, day;
    int flag = 0;
    time_t tt = time(NULL);
    struct tm* t= localtime(&tt);

    SumDay = CalSumDays(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(g_BookInfo[i].BrowDate, "xx"))
            continue;

        sscanf(g_BookInfo[i].BrowDate, "%d年%d月%d日", &year, &month, &day);
        SumDay1 = CalSumDays(year, month, day);

        if (SumDay - SumDay1 > 30)
        {
            for (j = 0; strlen(g_StuInfo[j].Name) != 0; j++)//循环学生姓名
            {
                if (!strcmp(g_BookInfo[i].ID, g_StuInfo[j].BookList[0]) || !strcmp(g_BookInfo[i].ID, g_StuInfo[j].BookList[1]) || !strcmp(g_BookInfo[i].ID, g_StuInfo[j].BookList[2]))
                {//如果这个学生有一本超期了
                    g_StuInfo[j].flag = 1;
                    if (fl == 0)
                    {
                        printf("编号:  %s\n", g_StuInfo[i].ID);
                        printf("学院:  %s\n", g_StuInfo[i].Faculty);
                        printf("专业:  %s\n", g_StuInfo[i].Profession);
                        printf("姓名:  %s\n", g_StuInfo[i].Name);
                        printf("性别:  %s\n", g_StuInfo[i].Sex);
                        printf("电话:  %s\n", g_StuInfo[i].Phone);
                        printf("密码:  %s\n", g_StuInfo[i].Passwd);
                        printf("邮箱:  %s\n", g_StuInfo[i].Email);
                        printf("书单:  《%s》,《%s》,《%s》\n", g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2]);
                    }
                    //printf("%s %s %s %s %s %s %s %s %s %s %s %d\n", g_StuInfo[j].ID, g_StuInfo[j].Faculty, g_StuInfo[j].Profession, g_StuInfo[j].Name, g_StuInfo[j].Sex, g_StuInfo[j].Phone, g_StuInfo[j].Passwd, g_StuInfo[j].Email, g_StuInfo[j].BookList[0], g_StuInfo[j].BookList[1], g_StuInfo[j].BookList[2], g_StuInfo[j].flag);
                    flag = 1;
                }
            }
        }
    }

    if (flag == 0)
    {
        printf("没有超期未还的学生\n");
    }
}

void QueryBorrow()//借阅管理
{
    int sel = 0;
    system("cls");
    while(1)
    {
        system("cls");
        printf("\t\t\t请选择操作\n");
        printf("\t\t\t1、查询所有图书借阅情况\n");
        printf("\t\t\t2、查询借阅图书的学生信息\n");
        printf("\t\t\t3、查询超期未还图书情况\n");
        printf("\t\t\t4、查询超期未还学生名单\n");
        printf("\t\t\t5、返回\n");
        printf("\n\t\t\t请输入你的选择:");
        scanf("%d", &sel);

        switch(sel)
        {
            case 1:
                QueryAllBookBorrowInfo();
                break;
            case 2:
                QueryStuBorrowInfo();
                break;
            case 3:
                QueryOverDataBook();
                break;
            case 4:
                QueryOverDataStu(0);
                break;
            case 5:
                return;
            default:
                break;
        }
        system("pause");
    }
}

void StuBorrow()//学生借阅管理
{
    int sel = 0;
    int j = 0;

    printf("1、冻结有超期未归还的账户\n");
    printf("2、解冻已还书没有超期的账户\n");

    scanf("%d", &sel);

    if (sel == 1)
        QueryOverDataStu(1);//超期时

    for (j = 0; strlen(g_StuInfo[j].ID) != 0; j++)
    {
        if(sel == 1 && g_StuInfo[j].flag == 1)//超期同学信息
        {
            printf("%s ,  %s\n", g_StuInfo[j].ID, g_StuInfo[j].Name);
            g_StuInfo[j].flag = 2;//冻结情况
        }
        else if (sel == 2 && g_StuInfo[j].flag == 2)
        {
            g_StuInfo[j].flag = 0;//回到正常状态
            printf("%s ,  %s\n", g_StuInfo[j].ID, g_StuInfo[j].Name);
        }
    }

    UpdateStuInfo();
}

int CheckProBook(char *Profess)
{
    int i = 0;
    for (i = 0; strlen(g_ProfessBookInfo[i].Profession) != 0; i++)
    {
        if (!strcmp(Profess, g_ProfessBookInfo[i].Profession))
        {
            return 1;
        }
    }

    return 0;
}

void CheckProStuBook(char *Name, int index)
{
    int i = 0;
    int flag = 0;

    for (i = 0; strlen(g_ProfessBookInfo[index].Book[i].Name) != 0; i++)
    {
        if (!strcmp(Name, g_ProfessBookInfo[index].Book[i].Name))
        {
            g_ProfessBookInfo[index].Book[i].count++;
            flag = 1;
            break;
        }
    }

    if (flag == 0)
    {
        strcpy(g_ProfessBookInfo[index].Book[i].Name, Name);
    }
}

void AddProfessBook(int index1, int index2)
{
    int i = 0;
    int j = 0;

    for (i = 0; i < 3; i++)
    {
        if (strcmp(g_StuInfo[index1].BookList[i], "*"))
            CheckProStuBook(g_StuInfo[index1].BookList[i], index2);
    }
}

void CountProfessLoveBook()
{
    int j = 0;
    int i = 0;
    int k = 0;
    int m = 0;

    memset(g_ProfessBookInfo, 0, 1024 * (sizeof(PROFESSBOOKINFO)));

    for (j = 0; strlen(g_StuInfo[j].ID) != 0; j++)
    {
        if (CheckProBook(g_StuInfo[j].Profession) != 1)
        {
            strcpy(g_ProfessBookInfo[i].Profession, g_StuInfo[j].Profession);
            i++;
        }
    }

    for (j = 0; strlen(g_ProfessBookInfo[j].Profession) != 0; j++)
    {
        for (k = 0; strlen(g_StuInfo[k].ID) != 0; k++)
        {
            if (!strcmp(g_StuInfo[k].Profession, g_ProfessBookInfo[j].Profession))
            {
                AddProfessBook(k, j);
            }
        }
    }

    int temp = 0;

    for (j = 0; strlen(g_ProfessBookInfo[j].Profession) != 0; j++)
    {
        for (k = 0; strlen(g_ProfessBookInfo[j].Book[k].Name) != 0; k++)
        {
            temp = temp > g_ProfessBookInfo[j].Book[k].count ? temp : g_ProfessBookInfo[j].Book[k].count;
        }
        for (i = 0; strlen(g_ProfessBookInfo[j].Book[i].Name) != 0; i++)
        {
            if (temp == g_ProfessBookInfo[j].Book[i].count)
            {
                for (m = 0; m < g_BookCount; m++)
                {
                    if (!strcmp(g_BookInfo[m].ID, g_ProfessBookInfo[j].Book[i].Name))
                    {
                        printf("%s  :  %s %s %s %.2f %s %s %s %d %s %s %s %d %d\n", g_ProfessBookInfo[j].Profession, g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, g_BookInfo[i].ReBrowCount, g_BookInfo[i].BrowCount);
                    }
                }
            }
        }
        temp = 0;
    }
}

void CountBorrow()
{
    int sel = 0;

    printf("1、按借阅时间长短排序所有图书\n");
    printf("2、按借阅次数排序所有在馆图书\n");
    printf("3、按专业统计学生最爱借阅的书目\n");

    printf("请输入你的选择: ");
    scanf("%d", &sel);

    if (sel == 1)
    {
        Sort(2);
    }
    else if (sel == 2)
    {
        Sort(3);
    }
    else if (sel == 3)
    {
        CountProfessLoveBook();
    }
    else
    {
        return;
    }
}

void ManagerBorrow()
{
    int sel = 0;
    system("cls");
    while(1)
    {
        system("cls");
        printf("\t\t\t请选择操作\n");
        printf("\t\t\t1、查看借阅情况\n");
        printf("\t\t\t2、借阅账户管理\n");
        printf("\t\t\t3、统计借阅信息\n");
        printf("\t\t\t4、返回\n");
        printf("\n\t\t\t请输入你的选择:");
        scanf("%d", &sel);

        if (sel == 1)
        {
            QueryBorrow();
        }
        else if (sel == 2)
        {
            StuBorrow();
        }
        else if (sel == 3)
        {
            CountBorrow();
        }
        else
        {
            return;
        }
        system("pause");
    }
}

void UpdateManaInfo()
{
    int i = 0;

    FILE *fp = fopen("Manager.txt", "w");
    if (fp == NULL)
    {
        printf("还没有图书管理员信息!\n");
        return;
    }

    while(strlen(g_BookManager[i].ID) > 0)
    {
        fprintf(fp, "%s %s %s %s\n", g_BookManager[i].ID, g_BookManager[i].Name, g_BookManager[i].Passwd, g_BookManager[i].Email);
        i++;
    }

    fclose(fp);
}

void ManaPerInfoMana()
{
    int sel = 0;
    char str[128] = {0};
    int i = 0;

    while(strlen(g_BookManager[i].ID) != 0)
    {
        if (!strcmp(g_ManaID, g_BookManager[i].ID))
        {
            break;
        }
        i++;
    }

    while(1)
    {
        system("cls");
        printf("\t\t\t1、修改密码\n");
        printf("\t\t\t2、修改邮箱\n");
        printf("\t\t\t3、返回\n");
        printf("\t\t\t请输入你的选项:");
        scanf("%d", &sel);
        system("cls");
        if (sel == 1)
        {
            printf("请输入新的密码: ");
            scanf("%s", str);
            strcpy(g_BookManager[i].Passwd, str);
        }
        else if (sel == 2)
        {
            printf("请输入新的邮箱: ");
            scanf("%s", str);
            if (CheckEmail(str) == -1)
            {
                printf("邮箱格式错误!\n");
                continue;
            }
            strcpy(g_BookManager[i].Email, str);
        }
        else
        {
            return;
        }

        UpdateManaInfo();
        printf("修改成功!\n");
        system("pause");
    }
}

int ShowManaMain()
{
    int sel = 0;
    system("cls");
    printf("\t\t\t请选择操作\n");
    printf("\t\t\t1、图书管理\n");
    printf("\t\t\t2、借阅管理\n");
    printf("\t\t\t3、个人信息管理\n");
    printf("\t\t\t4、返回\n");
    printf("\n\t\t\t请输入你的选择:");
    scanf("%d", &sel);
    system("cls");
    switch(sel)
    {
        case 1:
            ManagerBooks();
            break;
        case 2:
            ManagerBorrow();
            break;
        case 3:
            ManaPerInfoMana();
            break;
        case 4:
            return 4;
        default:
            break;
    }

    return 0;
}

void UpdateBookInfo()
{
    int i = 0;

    FILE *fp = fopen("Book.txt", "w");
    if (fp == NULL)
    {
        printf("还没有图书信息!\n");
        return;
    }

    for (i = 0; i < g_BookCount; i++)
    {
        fprintf(fp, "%s %s %s %.2f %s %s %s %d %s %s %s %d %d\n", g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, g_BookInfo[i].ReBrowCount, g_BookInfo[i].BrowCount);
    }

    fclose(fp);
}

int StuLogin()
{
    char n_ID[32] = {0};
    char n_Passwd[32] = {0};
    int  res = -1;
    FILE *fp = NULL;
    int  i = 0;

    printf("\t\t\t\t学生登录\n");
    printf("\n\t\t\t\t请输入账号:");
    scanf("%s", n_ID);
    printf("\n\t\t\t\t请输入密码:");
    scanf("%s", n_Passwd);
    fp = fopen("Student.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return res;
    }
    for (i = 0; strlen(g_StuInfo[i].ID) != 0; i++)
    {
        if (!strcmp(n_ID, g_StuInfo[i].ID) && !strcmp(n_Passwd, g_StuInfo[i].Passwd))
        {
            if (g_StuInfo[i].flag == 2)
            {
                printf("该账户已被冻结!\n");
                res  = -1;
                break;
            }
            memset(g_StuID, 0, 10);
            strcpy(g_StuID, n_ID);
            res = 0;
            break;
        }
    }

    fclose(fp);
    return res;
}

int CheckStuBookCount()
{
    int i = 0;

    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuID, g_StuInfo[i].ID))
        {
            if (strcmp(g_StuInfo[i].BookList[0], "*")
                && strcmp(g_StuInfo[i].BookList[1], "*")
                && strcmp(g_StuInfo[i].BookList[2], "*"))
            {
                return -1;
            }
        }
        i++;
    }

    return 0;
}

int CheckStuBookSame(char *BookID)
{
    int i = 0;

    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuID, g_StuInfo[i].ID))
        {
            if (!strcmp(g_StuInfo[i].BookList[0], BookID)
                || !strcmp(g_StuInfo[i].BookList[1], BookID)
                || !strcmp(g_StuInfo[i].BookList[2], BookID))
            {
                return -1;
            }
        }
        i++;
    }

    return 0;
}

int CalSumDays(int year, int month, int day)
{
    int days_on_month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    int sum = 0;
    int k, i;

    for (i = 0; i < year; i++)
    {
        if (((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0)))
            sum += 366;
        else
            sum += 365;
    }
    if (((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)))
        days_on_month[2]=29;
    else
        days_on_month[2]=28;
    for (k = 1; k < month; k++)
        sum += days_on_month[k];

    return sum + day;
}

void BorrowBooks()
{
    int i = 0;
    char res[11] = {0};
    int j = 0;
    int k = 0;
    int flag = 0;
    int year, month, day, hour, min;
    int year1, month1, day1, hour1, min1;
    int SumDay1 = 0;
    int SumDay2 = 0;
    int count = 0;

    while(1)
    {
        i = 0;
        flag = 0;
        printf("请问要借阅哪本书(编号)?(输入-1退出)");
        scanf("%s", res);

        if (!strcmp(res , "-1"))
        {
            break;
        }

        for (i = 0; i < g_BookCount; i++)
        {
            if (!strcmp(g_BookInfo[i].ID, res))
            {
                flag = 1;
                break;
            }
        }

        if (flag == 0)
        {
            printf("该书不存在!\n");
            continue;
        }

        if (CheckStuBookCount() == -1)
        {
            printf("你有三本图书在借未还,不能继续借阅!\n");
            return;
        }

        if (g_BookInfo[i].Count == 0)
        {
            printf("图书已经被借完了!\n");
            continue;
        }

        if (CheckStuBookSame(g_BookInfo[i].ID) == -1)
        {
            printf("你已经借了一本相同的书,不能继续借阅!\n");
            continue;
        }

        time_t tt = time(NULL);
        struct tm* t= localtime(&tt);

        memset(g_BookInfo[i].BrowDate, 0, 64);
        sprintf(g_BookInfo[i].BrowDate, "%d年%d月%d日%d时%d分", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);

        k = 0;
        while(strlen(g_StuInfo[k].ID) > 0)
        {
            if (strcmp(g_StuInfo[k].ID, g_StuID) == 0)
            {
                for (j = 0; j <3; j++)
                {
                    if (strcmp(g_StuInfo[k].BookList[j], "*") == 0)
                    {
                        strcpy(g_StuInfo[k].BookList[j], g_BookInfo[i].ID);
                        break;
                    }
                }
                break;
            }
            k++;
        }

        g_BookInfo[i].Count--;
        g_BookInfo[i].BrowCount++;
        count++;

        int m = 0;
        while(strlen(g_BroInfo[m].ID) != 0)
        {
            m++;
        }
        strcpy(g_BroInfo[m].ID, g_StuID);
        strcpy(g_BroInfo[m].Name, g_BookInfo[i].Name);
        strcpy(g_BroInfo[m].Profess, g_StuInfo[k].Profession);
        strcpy(g_BroInfo[m].ReDate, g_BookInfo[i].BrowDate);

        FILE *fp = fopen("BrowRecord.txt", "a+");
        fprintf(fp, "%s %s %s %s\n", g_StuID, g_BookInfo[i].Name, g_StuInfo[k].Profession, g_BookInfo[i].BrowDate);
        fclose(fp);

        if (count == 3)
        {
            printf("一次最多只能借3本书!返回系统......\n");
            break;
        }
    }
    printf("借书成功!\n\n");
    UpdateBookInfo();
    UpdateStuInfo();
}

void RenewBooks()
{
    int i = 0, j = 0;
    char res[10] = {0};
    int year, month, day, hour, min;
    int year1, month1, day1, hour1, min1;
    int SumDay1 = 0;
    int SumDay2 = 0;
    int count = 0;

    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuInfo[i].ID, g_StuID))
        {
            printf("%s %s %s\n", g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2]);
            break;
        }

        i++;
    }

    printf("请问要续借哪本书?(输入ID):");
    scanf("%s", res);

    if (strcmp(res, g_StuInfo[i].BookList[0]) &&
        strcmp(res, g_StuInfo[i].BookList[1]) &&
        strcmp(res, g_StuInfo[i].BookList[2]))
    {
        printf("你当前没有借阅这本书,不能续借!\n");
        return;
    }

    for (j = 0; j < g_BookCount; j++)
    {
        if (!strcmp(g_BookInfo[j].ID, res))
        {
            if (g_BookInfo[j].ReBrowCount == 2)
            {
                printf("续借超过2次,不能再续借!\n");
                return;
            }
            g_BookInfo[j].ReBrowCount++;
            break;
        }
    }

    time_t tt = time(NULL);
    struct tm* t= localtime(&tt);

    memset(g_BookInfo[i].BrowDate, 0, 64);
    sprintf(g_BookInfo[i].BrowDate, "%d年%d月%d日%d时%d分", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);

    g_BookInfo[j].BrowCount++;
    UpdateBookInfo();
    FILE *fp = fopen("BrowRecord.txt", "a+");
    fprintf(fp, "%s %s %s %s\n", g_StuID, g_BookInfo[j].Name, g_StuInfo[i].Profession, g_BookInfo[j].BrowDate);
    fclose(fp);
}

void QueryByName()
{
    char t_Name[64] = {0};
    int i = 0;
    int flag = 0;

    printf("请输入书名:");
    scanf("%s", t_Name);

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(t_Name, g_BookInfo[i].Name))
        {
            printf("%d %s %s %s %2.lf %s %s %s %d %s %s %s %d %d\n", i, g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, g_BookInfo[i].ReBrowCount, g_BookInfo[i].BrowCount);
            flag = 1;
            break;
        }
    }

    if (flag == 0)
    {
        printf("找不到此书!\n");
    }
}

void QueryByAuthor()
{
    char t_Author[64] = {0};
    int i = 0;
    int flag = 0;

    printf("请输入作者名:");
    scanf("%s", t_Author);

    for (i = 0; i < g_BookCount; i++)
    {
        if (!strcmp(t_Author, g_BookInfo[i].Author))
        {
            printf("%s %s %s %.2lf %s %s %s %d %s %s %s %d %d\n", g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, g_BookInfo[i].ReBrowCount, g_BookInfo[i].BrowCount);
            flag = 1;
        }
    }

    if (flag == 0)
    {
        printf("找不到此作者的书!\n");
    }
}

void Sort(int flag)
{
    BOOKINFO t_BookInfo[1024];
    int i = 0;
    int n = 0;
    int j = 0;
    int SumDay = 0;
    int SumDay1 = 0;
    int Sub = 0;
    int Sub1 = 0;
    int year, month, day;

    for (i = 0; i < g_BookCount + 1; i++)
    {
        if (flag == 2)
        {
            if (!strcmp(g_BookInfo[i].BrowDate, "xx"))
                continue;
        }
        memset(&t_BookInfo[i], 0, sizeof(BOOKINFO));
        strcpy(t_BookInfo[i].ID, g_BookInfo[i].ID);
        strcpy(t_BookInfo[i].Name, g_BookInfo[i].Name);
        strcpy(t_BookInfo[i].Author, g_BookInfo[i].Author);
        t_BookInfo[i].Price = g_BookInfo[i].Price;
        strcpy(t_BookInfo[i].PubHouse, g_BookInfo[i].PubHouse);
        strcpy(t_BookInfo[i].PubDate, g_BookInfo[i].PubDate);
        strcpy(t_BookInfo[i].BookIntro, g_BookInfo[i].BookIntro);
        t_BookInfo[i].Count = g_BookInfo[i].Count;
        strcpy(t_BookInfo[i].Index, g_BookInfo[i].Index);
        strcpy(t_BookInfo[i].BrowDate, g_BookInfo[i].BrowDate);
        strcpy(t_BookInfo[i].RetDate, g_BookInfo[i].RetDate);
        t_BookInfo[i].ReBrowCount = g_BookInfo[i].ReBrowCount;
        t_BookInfo[i].BrowCount = g_BookInfo[i].BrowCount;
    }

    n = g_BookCount;
    BOOKINFO temp;
    memset(&temp, 0, sizeof(temp));

    time_t tt = time(NULL);
    struct tm* t= localtime(&tt);

    for(i = 0; i < n - 1; i++)
    {
        for(j = 0; j < n - 1 - i; j++)
        {
            if (flag == 0)
            {
                if(t_BookInfo[j].BrowCount > t_BookInfo[j+1].BrowCount)
                {
                    temp = t_BookInfo[j+1];
                    t_BookInfo[j+1] = t_BookInfo[j];
                    t_BookInfo[j] = temp;
                }
            }
            else if (flag == 1)
            {
                if(t_BookInfo[j].Price > t_BookInfo[j+1].Price)
                {
                    temp = t_BookInfo[j+1];
                    t_BookInfo[j+1] = t_BookInfo[j];
                    t_BookInfo[j] = temp;
                }
            }
            else if (flag == 2)
            {
                if (strlen(t_BookInfo[j].RetDate) != 0)
                {
                    sscanf(t_BookInfo[j].RetDate, "%d年%d月%d日", &year, &month, &day);
                    SumDay = CalSumDays(year, month, day);
                }
                else
                {
                    SumDay = CalSumDays(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);
                }

                sscanf(t_BookInfo[j].BrowDate, "%d年%d月%d日", &year, &month, &day);
                SumDay1 = CalSumDays(year, month, day);
                Sub =     SumDay - SumDay1;

                if (strlen(t_BookInfo[j+1].RetDate) != 0)
                {
                    sscanf(t_BookInfo[j+1].RetDate, "%d年%d月%d日", &year, &month, &day);
                    SumDay = CalSumDays(year, month, day);
                }
                else
                {
                    SumDay = CalSumDays(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);
                }

                sscanf(t_BookInfo[j+1].BrowDate, "%d年%d月%d日", &year, &month, &day);
                SumDay1 = CalSumDays(year, month, day);
                Sub1 =     SumDay - SumDay1;

                if (Sub < Sub1)
                {
                    temp = t_BookInfo[j+1];
                    t_BookInfo[j+1] = t_BookInfo[j];
                    t_BookInfo[j] = temp;
                }
            }
            else if (flag == 3)
            {
                if(t_BookInfo[j].BrowCount < t_BookInfo[j+1].BrowCount)
                {
                    temp = t_BookInfo[j+1];
                    t_BookInfo[j+1] = t_BookInfo[j];
                    t_BookInfo[j] = temp;
                }
            }
        }
    }

    for(i = 0; i < n ; i++)
    {
        if (strlen(t_BookInfo[i].ID) == 0)
            continue;
        printf("%s %s %s %.2f %s %s %s %d %s %s %s %d %d\n", t_BookInfo[i].ID, t_BookInfo[i].Name, t_BookInfo[i].Author, t_BookInfo[i].Price, t_BookInfo[i].PubHouse, t_BookInfo[i].PubDate, t_BookInfo[i].BookIntro, t_BookInfo[i].Count, t_BookInfo[i].Index, t_BookInfo[i].BrowDate, t_BookInfo[i].RetDate, t_BookInfo[i].ReBrowCount, t_BookInfo[i].BrowCount);
    }
}

void QueryBooks()
{
    int sel = 0;

    while(1)
    {
        printf("请选择操作:\n");
        printf("1、根据书名查询\n");
        printf("2、根据作者查询\n");
        printf("3、根据借阅次数排序\n");
        printf("4、根据价格排序\n");
        printf("5、退出\n");
        printf("请输入选择:");
        scanf("%d", &sel);

        switch(sel)
        {
            case 1:
                QueryByName();
                break;
            case 2:
                QueryByAuthor();
                break;
            case 3:
                Sort(0);
                break;
            case 4:
                Sort(1);
                break;
            case 5:
                return;
            default:
                break;
        }
    }
}

int LoadBookFromFile()
{
    FILE *fp = NULL;
    int i = 0;

    fp = fopen("Book.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }
    while(fscanf(fp, "%s %s %s %f %s %s %s %d %s %s %s %d %d\n", g_BookInfo[i].ID, g_BookInfo[i].Name, g_BookInfo[i].Author, &g_BookInfo[i].Price, g_BookInfo[i].PubHouse, g_BookInfo[i].PubDate, g_BookInfo[i].BookIntro, &g_BookInfo[i].Count, g_BookInfo[i].Index, g_BookInfo[i].BrowDate, g_BookInfo[i].RetDate, &g_BookInfo[i].ReBrowCount, &g_BookInfo[i].BrowCount) == 13)
    {
        i++;
    }

    g_BookCount = i;

    fclose(fp);

    return 0;
}

int CheckBorrow()
{
    int i = 0;
    char ID[32] = {0};
    char Name[32] = {0};
    char Profess[32] = {0};
    char ReDate[32] = {0};
    FILE *fp = fopen("BrowRecord.txt", "r");
    if (fp == NULL)
    {
        printf("文件不存在!\n");
        return -1;
    }
    char str[1024] = {0};
    while(fgets(str, 1024, fp))
    {
        str[strlen(str)-1] = '\0';
        sscanf(str, "%s %s %s %s", ID, Name, Profess, ReDate);
        if (!strcmp(ID, g_StuID))
            printf("%s %s %s %s\n", ID, Name, Profess, ReDate);
        i++;
        memset(str, 0, 1024);
    }

    fclose(fp);

    if (i == 0)
    {
        printf("你还没有借书记录!\n");
    }

    fclose(fp);

    return 0;
}

void UpdateStuInfo()
{
    int i = 0;

    FILE *fp = fopen("Student.txt", "w");
    if (fp == NULL)
    {
        printf("还没有学生信息!\n");
        return;
    }

    while(strlen(g_StuInfo[i].ID) > 0)
    {
        fprintf(fp, "%s %s %s %s %s %s %s %s %s %s %s %d\n", g_StuInfo[i].ID, g_StuInfo[i].Faculty, g_StuInfo[i].Profession, g_StuInfo[i].Name, g_StuInfo[i].Sex, g_StuInfo[i].Phone, g_StuInfo[i].Passwd, g_StuInfo[i].Email, g_StuInfo[i].BookList[0], g_StuInfo[i].BookList[1], g_StuInfo[i].BookList[2], g_StuInfo[i].flag);
        i++;
    }

    fclose(fp);
}

void DelBorInfo()
{
    char t_BookName[64] = {0};
    int i = 0;
    int flag = 0;
    int j = 0;
    int k = 0;

    printf("请问你要删除哪条借书记录?输入书的名字:  ");
    scanf("%s", t_BookName);

    while(strlen(g_BroInfo[i].ID) > 0)
    {
        if (!strcmp(g_StuID, g_BroInfo[i].ID) && !strcmp(t_BookName, g_BroInfo[i].Name))
        {
            memset(&g_BroInfo[i], 0, sizeof(BROINFO));
            flag = 1;

            while(strlen(g_StuInfo[k].ID) > 0)
            {
                if (!strcmp(g_StuID, g_StuInfo[i].ID))
                {
                    for (j = 0; j <3; j++)
                    {
                        if (!strcmp(g_StuInfo[i].BookList[j], t_BookName))
                        {
                            memset(g_StuInfo[i].BookList[j], 0, 64);
                            strcpy(g_StuInfo[i].BookList[j], "*");
                            UpdateStuInfo();
                            break;
                        }
                    }
                    break;
                }
                k++;
            }
            break;
        }
        i++;
    }

    if (flag == 0)
    {
        printf("没有这条记录!\n");
        return;
    }

    FILE *fp = fopen("BrowRecord.txt", "w");
    if (fp == NULL)
    {
        printf("还没有借阅记录!\n");
        return;
    }

    i = 0;
    while(i < 1024)
    {
        if (strlen(g_BroInfo[i].ID) != 0)
            fprintf(fp, "%s %s %s %s\n", g_BroInfo[i].ID, g_BroInfo[i].Name, g_StuInfo[k].Profession, g_BookInfo[i].BrowDate);
        i++;
    }
    printf("删除成功!\n");
    fclose(fp);
}

int CheckPhone(char *phone)
{
    int i = 0;
    int len = strlen(phone);

    if (len != 11)
    {
        return -1;
    }

    for (i = 0; i < 11; i++)
    {
        if (phone[i] < '0' || phone[i] > '9')
        {
            return -1;
        }
    }

    return 0;
}

int CheckEmail(char *email)
{
    int i = 0;
    int len = strlen(email);

    if (!strstr(email, "@") && !strstr(email, "."))
    {
        return -1;
    }

    if (email[0] == '@' || email[len - 1] == '@' || email[0] == '.' || email[len - 1] == '.')
    {
        return -1;
    }

    return 0;
}

void PerInfoMana()
{
    int sel = 0;
    char str[128] = {0};
    int i = 0;

    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuID, g_StuInfo[i].ID))
        {
            break;
        }
        i++;
    }

    while(1)
    {
        system("cls");
        printf("\t\t\t1、修改电话\n");
        printf("\t\t\t2、修改密码\n");
        printf("\t\t\t3、修改邮箱\n");
        printf("\t\t\t4、返回\n");
        printf("\t\t\t请输入你的选项:");
        scanf("%d", &sel);

        if (sel == 1)
        {
            printf("请输入新的电话号码: ");
            scanf("%s", str);
            if (CheckPhone(str) == -1)
            {
                printf("电话号码格式错误!\n");
                continue;
            }
            strcpy(g_StuInfo[i].Phone, str);
        }
        else if (sel == 2)
        {
            printf("请输入新的密码: ");
            scanf("%s", str);
            strcpy(g_StuInfo[i].Passwd, str);
        }
        else if (sel == 3)
        {
            printf("请输入新的邮箱: ");
            scanf("%s", str);
            if (CheckEmail(str) == -1)
            {
                printf("邮箱格式错误!\n");
                continue;
            }
            strcpy(g_StuInfo[i].Email, str);
        }
         else
        {
            return;
        }

        printf("修改成功!\n");
        if (sel != 4)
            system("pause");
        UpdateStuInfo();
    }
}

void ReBooks()
{
    time_t tt = time(NULL);
    struct tm* t;
    char ID[32] = {0};
    int flag = 0;
    int j = 0;
    int k = 0;
    t = localtime(&tt);
    int year, month, day, hour, min;
    printf("请问你要还哪本书(输入ID)?:  ");
    scanf("%s", ID);
    int SumDay = 0;
    int SumDay1 = 0;
    int res = 0;

    int i = 0;
    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuID, g_StuInfo[i].ID))
        {
            for (j = 0; j < 3; j++)
            {
                if (!strcmp(ID, g_StuInfo[i].BookList[j]))
                {
                    strcpy(g_StuInfo[i].BookList[j], "*");
                    flag = 1;
                    break;
                }
            }
        }
        i++;
    }

    if (flag == 0)
    {
        printf("你没有借这本书!\n");
        return;
    }

    for (i = 0; i < g_BookCount; i++)
    {
        if (strcmp(ID, g_BookInfo[i].ID) == 0)
        {
            memset(g_BookInfo[i].RetDate, 0, 64);
            sprintf(g_BookInfo[i].RetDate, "%d年%d月%d日%d时%d分", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
            break;
        }
    }

    i = 0;
    while(strlen(g_StuInfo[i].ID) != 0)
    {
        if (!strcmp(g_StuID, g_StuInfo[i].ID))
        {
            for (k = 0; k < g_BookCount; k++)
            {
                for (j = 0; j < 3; j++)
                {
                    if (strcmp(g_StuInfo[i].BookList[j], g_BookInfo[k].ID) == 0)
                    {
                        sscanf(g_BookInfo[k].BrowDate, "%d年%d月%d日%d时%d分", &year, &month, &day, &hour, &min);
                        SumDay1 = CalSumDays(year, month, day);
                        SumDay = CalSumDays(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday);
                        if (SumDay - SumDay1 <= 30)
                        {
                            res = 1;
                        }
                    }
                }
            }
            break;
        }
        i++;
    }

    if (res == 0)
    {
        g_StuInfo[i].flag = 0;
    }

    printf("还书成功!\n\n");
    UpdateBookInfo();
    UpdateStuInfo();
}

int ShowStuMain()
{
    int sel = 0;
    system("cls");
    printf("\t\t\t请选择操作\n");
    printf("\t\t\t1、借阅图书\n");
    printf("\t\t\t2、续借图书\n");
    printf("\t\t\t3、查询图书\n");
    printf("\t\t\t4、查询借阅结果\n");
    printf("\t\t\t5、删除借阅信息\n");
    printf("\t\t\t6、个人信息管理\n");
    printf("\t\t\t7、还书\n");
    printf("\t\t\t8、返回\n");
    printf("\n\t\t\t请输入你的选择:");
    scanf("%d", &sel);
    system("cls");
    switch(sel)
    {
        case 1:
            BorrowBooks();
            break;
        case 2:
            RenewBooks();
            break;
        case 3:
            QueryBooks();
            break;
        case 4:
            CheckBorrow();
            break;
        case 5:
            DelBorInfo();
            break;
        case 6:
            PerInfoMana();
            break;
        case 7:
            ReBooks();
            break;
        case 8:
            return 8;
        default:
            break;
    }

    system("pause");
    return 0;
}

void Login()
{
    int sel = 0;

    while(1)
    {
        system("cls");
        printf("\t\t\t\t欢迎来到图书借阅系统\n\n");
        printf("\t\t\t\t======================\n\n");
        printf("\t\t\t\t1、管理员登录\n");
        printf("\t\t\t\t2、学生登录\n");
        printf("\t\t\t\t3、退出\n\n");

        printf("\t\t\t\t请输入你的选择:");

        scanf("%d", &sel);
        system("cls");
        if (sel == 1)
        {
            if (ManagerLogin() == -1)
            {
                printf("登录失败!\n");
                system("pause");
            }
            else
            {
                printf("登录成功!\n");
                system("pause");
                while(1)
                {
                    system("cls");
                    if (ShowManaMain() == 4)
                    {
                        break;
                    }
                }
            }
        }
        else if (sel == 2)
        {
            if (StuLogin() == -1)
            {
                printf("登录失败!\n");
                system("pause");
            }
            else
            {
                printf("登录成功!\n");
                system("pause");
                while(1)
                {
                    if (ShowStuMain() == 8)
                    {
                        break;
                    }
                }
            }
        }
        else if (sel == 3)
        {
            break;
        }
        else
        {
            continue;
        }
    }
}

int main()
{
    system( "color 90 ");
    LoadBrowInfo();
    if (LoadBookFromFile() == -1 || LoadManagerInfo() == -1 || LoadStuInfo() == -1)   //加载图书、学生、管理员信息
    {
        return -1;
    }
    Login();

    return 0;
}
 

  • 23
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2193410903

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

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

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

打赏作者

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

抵扣说明:

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

余额充值