Linux下程序设计综合实验-图书管理信息系统

图书管理信息系统的设计与实现

1. 问题描述

高校图书管理信息系统实现图书馆馆藏图书的信息管理与图书借阅。图书管理信息系统 包括用户管理、读者管理、图书管理、图书流通功能。

2. 整体要求

该系统应具有合理的界面设计,并易于操作;

编码风格良好;

该系统用控制台程序即可实现;

编程语言为 C 语言,编程环境为 Linux 下 GCC

3. 设计要求

实验设计报告

一、设计报告大纲

  1. 系统概述

开发图书馆管理系统是为了方便读者借阅书籍,图书管理员管理图书,实现图书馆的现代化信息化。图书管理系统的开发意味着读者和管理员可以通过线上的方式借还图书,大大减轻的工作人员的工作量和工作时间。图书管理系统共设计了四个子系统,用户管理,读者管理,图书管理,图书管理,每个子系统根据登陆者的身份不同,享有不同的权力。在用户管理子系统中设有用户信息输入、修改、删除、显示和密码修改。读者管理子系统中设有读者信息输入、修改、删除、查询、显示。图书管理子系统中设有图书信息输入、修改、查询和统计汇总。图书流通管理子系统中设有借还书处理。

2系统需求分析

(1)系统工作流程、系统运行环境要求

系统所需环境为Linux操作系统,在Linux操作系统下运行程序进入登录页面,若没有账号需要系统管理员进行用户信息输入,登录成功后进入主菜单,根据用户类型可区别普通读者、图书管理员和系统管理员,在用户管理中普通读者只可使用密码修改功能,图书管理员可使用用户管理中全部功能,而系统管理员也只可以使用用户密码修改功能。读者管理子系统只有图书管理员可以使用。在图书管理系统中普通读者和系统管理员只可以使用图书信息查询功能,图书管理员可使用全部功能。图书流通管理只有图书管理员可以使用。用户只能使用自己权限中的功能,若使用权限外的功能会提示权限不足。

(2)输入输出数据的类型、值的范围及输入的形式和非法字符

输入用户账号类型为字符型,输入的形式为连续的数字。输入用户密码类型为字符型,输入形式为数字或字母。输出用户信息查询与显示类型范围形式同输入相同。

输入读者信息时读者名类型为字符型,输入形式为中文或者英文。输入读者信息时读者号类型为整形,值得范围为0~1e10,输入形式为连续的数字。输入读者信息时读者单位类型为字符型,输入形式为中文或者英文。输入读者信息时读者联系方式类型为整形,值得范围为1e11~1e12,输入的形式为连续的数字。

输入读者信息时读者可借书数类型为整形,值得范围为1~10,输入形式为数字。

输入读者信息时读者已借书数类型为整形,值得范围为1~10,输入形式为数字。

输出同输入相同。部分非法输入提示重新输入。

3系统概要设计

3.1数据结构设计

typedef struct link

{

       char Username[MAX_number];

       char Password[MAX_number];

       int  Type;

       Struct link  *next;

}User;

用户信息:字符型用户名数组,字符型用户密码数组,整形用户类型,和指针域。

typedef struct link2

{

    char ReaderId[10];

    char ReaderName[10];

    char ReaderUnit[10];

    char ReaderPhone[12];

    int BorrowBooks;

    int ReturnBooks;

    struct link2 *next;

}Reader;

读者信息:字符型读者号数组,字符型读者名数组,字符型读者单位数组,字符型读者联系方式数组,整形借书数,整形可借书数和指针域。

typedef struct Booknumber

{

    int BookRecord;

    int BookNumber;

    char BookTitle[10];

    char BookWriter[10];

    char BookPublish[10];

    int CollectBooks;

    int LendBooks;

    int next1;

    int next2;

    int next3;

}Booker;

用书号查询的书号主索引:整形书记录号,整形书号,字符型书名数组,字符型作者数组,字符型出版社数组,整形藏书数,整形借书数,整形指针一,整形指针二,整形指针三.

3.2软件结构设计
1)、软件功能结构

图书管理系统根据需求分析中的功能分析,可以提炼出主要用户管理、读者管理、图书管理图书流通管理四个子系统。用户管理子系统主要提供给系统管理员使用,普通读者和图书管理员可以使用用户密码修改,读者管理子系统和图书管理子系统主要提供给图书管理员使用,其中普通读者和系统管理员可以使用图书数目查询和图书数目统计,图书流通管理子系统主要提供给图书管理员使用。图书管理员登录后可以对读者信息进行添加、删除、查询、显示、修改等功能,可以对图书信息进行输入、修改、查询等操作,并且可以进行借书处理还书处理操作。普通读者登录系统后可对自己的账号密码进行修改,可进行图书数目查询和图书数目统计功能。系统管理员登录后可以对用户信息进行删除修改添加等操作,可以进行图书信息查询功能。系统软件功能如图1所示:

图1 图书管理系统软件模块结构图

(2)、函数列表和函数之间调用关系。

函数列表:

//1.新建链表(用户)

User *AppendNode(User *head,User *pTemp)

//2.新建链表(读者)

Reader *AppendNode2(Reader *head,Reader *pTemp)

//3.新建链表(图书流通)

Bookdealer *AppendNode3(Bookdealer *head,Bookdealer *pTemp)

//1.将文件读入链表中(用户)

void Readfile()

//2.将文件读入链表中(读者)

void Readfile2()

//3.读出文件(图书)

void Readfile3()

//4.将文件读入链表中(流通)

void Readfile4()

//1.将链表写入文件中(用户)

void Writefile()

//2.将链表写入文件中(读者)

void Writefile2(Reader *head)

//3.将数组写入文件中(图书)

void Writefile3()

//4.将链表写入文件中(流通)

void Writefile4()

//1.用户信息输入

User *UserInfoInput(User *head)

//2.用户信息修改

User *UserInfoChange(User *head)

//3.用户信息删除

User *UserInfoDelete(User *head)

//4.用户信息显示

void UserInfoShow(User *head)

//5.用户密码修改

User *UserPasswdChange(User *head)

//用户管理

void UserManage()

//1.读者信息输入

Reader *ReaderInfoInput(Reader *head)

//2.读者信息修改

Reader *ReaderInfoChange(Reader *head)

//3.读者信息删除

Reader *ReaderInfoDelete(Reader *head)

//4.读者信息查询

Reader *ReaderInfoFind(Reader *head)

//5.读者信息显示

void ReaderInfoShow(Reader *head)

//读者管理

void ReaderManage()

//收集不同种的书名 作者 出版社

void SecondrykeyTable(int i)

//1.图书信息输入

void BookerInfoInput()

//2.图书信息修改

void BookerInfoChange()

//3.图书信息查询

void BookerInfoFind()

//4.汇总统计

void BookerCollect()

//图书管理

void BookManage()

//1.借书处理

void BorrowBooksdeal()

//2.还书处理

void ReturnBooksdeal()

//图书流通管理

void BookCirculationmanage()

//菜单

void LibraryInfoManage()

函数调用关系:

主函数调用登录函数,菜单函数函数、将文件写入链表(用户)函数,将链表写入文件函数(图书,图书流通),菜单函数调用用户管理函数、读者管理函数、将链表读出文件(读者)和将链表写入文件(读者)。用户登录函数可调用判断密码正误函数。用户管理函数可调用用户信息输入、修改、删除、显示函数、用户密码修改函数、将链表写入文件(用户)。读者管理函数可调用读者信息输入、修改、删除、查询、显示函数、将文件读入链表(读者)和将链表写入文件(读者)。图书管理函数可调用图书信息输入、修改、查询函数和汇总统计函数。图书流通函数可调用借书还书函数。

4.系统详细设计与实现

(1)用户信息输入设计与实现

先从用户管理函数调用其他函数创建链表并将文件中原有信息读入链表,在该函数中先判断是否输入用户信息,如果是则创建节点并将用户信息采用尾插法输入。该模块算法流程图如图2.1所示,用户信息输入截图如图2.2所示:                                      

图2.1用户信息输入算法流程图

           

图2.2用户信息输入截图。

(2)用户密码修改设计与实现

先输入想要修改密码的用户名,再在链表中对比找到该用户名,若找不到则退出该模块,然后确定修改密码,输入旧密码,输入错误重新输入,成功则输入新密码,若两次密码不同,则重新输入。成功后则将修改后的密码输入链表中。

该模块算法流程图如图3.1所示,用户信息输入截图如图3.2所示:                                   

图3.1用户密码修改算法流程图

        

图3.2用户密码修改截图。

(3)图书信息修改设计与实现

图书信息修改,输入想修改图书的图书号,在主索引表中进行查找,若找到图书号则输出1:修改藏书 2:修改借出数,输入相应指令,进行相应修改,修改后输出修改成功,若未找到该账号信息则输出未找到图书信息,请重新输入。该模块算法流程图如图4.1所示,图书信息修改截图如图4.2所示:

       

图4.1 图书信息修改算法流程图

    

      

图4.2 图书信息修改截图

5.系统测试

用户信息输入:由系统管理员输入八位数数字账号,八位数密码(可由数字和字母组成)对于用户信息输入功能模块的测试测试用例如表1所示:

表1 用户信息输入的测试用例

测试内容

测试用例

预期结果

实际结果

比对结果

用户名

  1. 输入八位数字”12345678”
  2. 输入汉字你好1234dfg”
  3. 输入数字不是八位
  4. 不输入

输入成功

输入失败

输入失败

输入失败

输入成功

输入失败

输入失败

输入失败

与预期相同

密码

1.输入由字母数字(八位)“a1234567”

2.输入汉字再见bbfber3456”

3.输入字符不是八位”qweasdzxc”

4.不输入

输入成功

输入失败

输入失败

输入失败

输入成功

输入失败

输入失败

输入失败

与预期相同

2)读者信息删除:由图书管理员输入八位数数字学号或教工号,在链表中查找删除,对于读者信息删除功能模块的测试测试用例如表2所示:

表2 读者信息删除的测试用例

测试内容

测试用例

预期结果

实际结果

比对结果

用户名

  1. 输入文件中有的学号”20219876”
  2. 输入文件中有的教工号”19971234”
  3. 输入文件中没有的学号”98765432”
  4. 输入不符合要求的学号或教工号”1w2w1”

删除成功

删除成功

删除失败

删除失败

删除成功

删除成功

删除失败

删除失败

与预期相同

6.结论

  • 完成的主要工作。

完成图书系统的代码编写,函数调用。

  • 系统优势、存在的问题与不足。

可以方便的应用于市场,但界面太过简陋,由于技术问题部分非法输入无法解决。

  • 调试过程中主要遇到的主要问题及解决方法。

由于文件编码问题导致由文件中读出的中文变成乱码,最后将UTF-8变更为ANSI,成功输出。

  • 感想与收获。

通过图书管理系统的编写,我了解了编程工作量,一个好的程序属实是来之不易。通过图书管理系统的编写,我学会了LinuxC语言程序的编写与调试,还有密码隐藏等小知识。

参考文献

无。

附录

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<assert.h>
//用户
typedef struct link
{
    char Username[10];
    char Password[10];
    int Type;
    struct link *next;
}User;
//读者
typedef struct link2
{
    char ReaderId[10];
    char ReaderName[10];
    char ReaderUnit[10];
    char ReaderPhone[12];
    int BorrowBooks;
    int ReturnBooks;
    struct link2 *next;

}Reader;
//日期
typedef struct dated
{
    int year;
    int month;
    int day;
}date;
//图书流通结构体链表
typedef struct link3
{
    char ReaderId[10];
    int BookNumber;
    date Borrowdate;
    date Returndate;
    char Remark[10];
    struct link3 *next;
}Bookdealer;
//书号主索引表
typedef struct Booknumber
{
    int BookRecord;
    int BookNumber;
    char BookTitle[30];
    char BookWriter[30];
    char BookPublish[30];
    int CollectBooks;
    int LendBooks;
    int next1;
    int next2;
    int next3;
}Booker;
//书名次索引表
typedef struct Booktitle
{
    char BookTitle[30];
    int Recordnext;
    int length;
}Title;
//作者次索引表
typedef struct Bookwriter
{
    char BookWriter[30];
    int Recordnext;
    int length;
}Writer;
//出版社次索引表
typedef struct Bookpublish
{
    char BookPublish[30];
    int Recordnext;
    int length;
}Publish;
//读者信息指针
Reader *ReaderInfoHead=NULL;
//用户信息指针
User *UserInfoHead=NULL;
int UserType;
//借还书文件指针
Bookdealer *Bookdealinfohead=NULL;
//记录号
int RecordNumber=1;
//书号数组
Booker Booked[1000];
//书名数组
Title Titled[1000];
//书名数
int Titlenumber=0;
//作者数组
Writer Writered[1000];
//作者数
int Writernumber=0;
//出版社数组
Publish Published[1000];
//出版社数
int Publishnumber=0;
//各记录数
int AllRecordNumber[4];
//1.新建链表(用户)
User *AppendNode(User *head,User *pTemp)
{
    struct link *p=NULL,*pr=head;
    p=(User *)malloc(sizeof(User));
    if(head==NULL)
    {
        head=p;
    }
    else
    {
        while(pr->next!=NULL)
        {
            pr=pr->next;
        }
        pr->next=p;
    }
    strcpy(p->Username,pTemp->Username);
    strcpy(p->Password,pTemp->Password);
    p->Type=pTemp->Type;
    p->next=NULL;
    return head;
}
//2.新建链表(读者)
Reader *AppendNode2(Reader *head,Reader *pTemp)
{
    Reader *p=NULL,*pr=head;
    p=(Reader *)malloc(sizeof(Reader));
    if(head==NULL)
    {
        head=p;
    }
    else
    {
        while(pr->next!=NULL)
        {
            pr=pr->next;
        }
        pr->next=p;
    }
    strcpy(p->ReaderId,pTemp->ReaderId);
    strcpy(p->ReaderName,pTemp->ReaderName);
    strcpy(p->ReaderUnit,pTemp->ReaderUnit);
    strcpy(p->ReaderPhone,pTemp->ReaderPhone);
    p->BorrowBooks=pTemp->BorrowBooks;
    p->ReturnBooks=pTemp->ReturnBooks;
    p->next=NULL;
    return head;
}
//1 将文件读入链表中(用户)
void Readfile()
{
    FILE *fp;
    User *pTemp=NULL,*head=NULL;
    pTemp=(User *)malloc(sizeof(User));
	if(pTemp==NULL)
	{
		printf("No enough memory to allocate!\n");
		exit(0);
	}
    if((fp=fopen("User.txt","rb"))==NULL)
	{
		printf("打开用户文件User.txt失败!\n");
		exit(0);
	}
	pTemp->next=NULL;
    while(1)
    {

        int i=fscanf(fp,"%s %s %d",pTemp->Username,pTemp->Password,&pTemp->Type);
        if(3==i)
        {
            head=AppendNode(head,pTemp);
        }
        else
        {
            break;
        }
    }
    free(pTemp);
    fclose(fp);
    UserInfoHead=head;
}
//将文件读入链表中(读者)
void Readfile2()
{
    FILE *fp;
    Reader *pTemp=NULL,*head=NULL;
    pTemp=(Reader *)malloc(sizeof(Reader));
	if(pTemp==NULL)
	{
		printf("No enough memory to allocate!\n");
		exit(0);
	}
    if((fp=fopen("Reader.txt","rb"))==NULL)
	{
		printf("打开Reader.txt失败!\n");
		exit(0);
	}
	pTemp->next=NULL;
     while(1)
    {

        int i=fscanf(fp,"%s %s %s %s %d %d",pTemp->ReaderId,pTemp->ReaderName,pTemp->ReaderUnit,pTemp->ReaderPhone,&pTemp->BorrowBooks,&pTemp->ReturnBooks);
        if(6==i)
        {
            head=AppendNode2(head,pTemp);
        }
        else
        {
            break;
        }
    }
    free(pTemp);
    fclose(fp);
    ReaderInfoHead=head;
}
//1 将链表写入文件中(用户)
void Writefile()
{
    FILE *fp;
    User *p=UserInfoHead;
    if((fp=fopen("User.txt","w"))==NULL)
	{
		printf("Failure to open User.txt!\n");
		exit(0);
	}
    while(p!=NULL)
    {
        fprintf(fp,"%s %s %d\n",p->Username,p->Password,p->Type);
        p=p->next;
    }
    fclose(fp);
}
//2 将链表写入文件中(读者)
void Writefile2()
{
    FILE *fp;
    Reader *p=ReaderInfoHead;
    if((fp=fopen("Reader.txt","wb"))==NULL)
	{
		printf("Failure to open Reader.txt!\n");
		exit(0);
	}
    while(p!=NULL)
    {
        fprintf(fp,"%s %s %s %s %d %d\n",p->ReaderId,p->ReaderName,p->ReaderUnit,p->ReaderPhone,p->BorrowBooks,p->ReturnBooks);
        p=p->next;
    }
    fclose(fp);
}
//判断账号密码是否正确
int Judge(char Username[10],char Password[10])
{
    User *p=UserInfoHead;
	while(p!=NULL)
	{
		if(strcmp(p->Username,Username)==0&&strcmp(p->Password,Password)==0)
		{
			printf("\n账户名和密码正确\n");
			UserType=p->Type;
			return 1;
		}
		else
		{
			p=p->next;
		}
	}
	return 0;
}
//登录
void Login()
{
    char str[10],str1[10];
    char username[10];
    char password[10];
    int UerType,result,k=0;
    do{
        printf("用户名:");
        scanf("%s",username);
        printf("密码:");
        //system("stty -echo");
        scanf("%s",password);
        //system("stty echo");
        //char *password=getpass("密码:");
        result=Judge(username,password);
        if(result==0)
        {
            printf("帐号或密码错误请再次尝试\n");
            k++;
            if(k==3)
            {
                printf("尝试次数过多,系统自动关闭\n");
                exit(0);
            }
        }
    }while(result==0);
}
//1.用户信息输入
User *UserInfoInput(User *head)
{
    char j;
    User *p=head,*pr=head;
    printf("是否输入用户信息?(是(Y|y),否(N|n)\n");
    scanf(" %c",&j);
    if(j=='Y'||j=='y')
    {
        while(j=='Y'||j=='y')
        {
            p=(User *)malloc(sizeof(User));
            if(p==NULL)
            {
                printf("No enough memory to allocate!\n");
                exit(0);
            }
            printf("请输入用户账号 密码 用户类型:\n");
            do{
                scanf("%s%s%d",p->Username,p->Password,&p->Type);
                p->next=NULL;
                if(p->Type==1||p->Type==2||p->Type==3)
                    continue;
                else
                    printf("输入用户类型错误!请重新输入:");
            }while(p->Type!=1&&p->Type!=2&&p->Type!=3);
            while(pr->next!=NULL)
            {
                pr=pr->next;
            }
            pr->next=p;
            printf("用户信息输入成功!\n");
            printf("是否再输入用户信息?(是(Y|y),否(N|n)\n");
            scanf(" %c",&j);
            if(j=='Y'||j=='y')
                continue;
            else if(j=='N'||j=='n')
                break;
            else
                printf("输入不合法,请重新输入:");
        }
             return head;
    }
    else if(j=='N'||j=='n')
    {
        return head;
    }
    else
        printf("输入不合法,请重新输入:");
}
//2.用户信息修改
User *UserInfoChange(User *head)
{
    char Username[10];
    char Password[10];
    int Type;
    int c;
    char k;
    User *p=head;
    if(head==NULL)
    {
        if(head==NULL)
        {
            printf("UserInfoDelete is empty!\n");
            return(head);
        }
    }
    printf("请输入需要修改用户信息的用户名:\n");
    scanf("%s",Username);
    while(strcmp(p->Username,Username)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if(strcmp(p->Username,Username)==0)
    {
        printf("1 修改用户账号\n2 修改用户密码\n3 修改用户类型\n4 退出修改\n");
        do
        {
            printf("请输入任务的序号:");
            scanf("%d",&c);
            switch (c)
            {
            case 1:
                printf("请输入修改后的用户名:\n");
                scanf("%s",Username);
                strcpy(p->Username,Username);
                break;
            case 2:
                printf("请输入修改后的密码:\n");
                scanf("%s",Password);
                strcpy(p->Password,Password);
                break;
            case 3:
                printf("请输入修改后的用户类型:\n");
                scanf("%d",&Type);
                p->Type=Type;
                break;
            case 4:
                break;
            }
            printf("用户信息修改成功!\n");
            printf("是否再次修改 是(Y||y) 否(N|n)\n");
            scanf(" %c",&k);
        }while(k=='Y'||k=='y');
    }
    else
    {
        printf("未找到要修改用户的用户名\n");
    }
    return head;
}
//3.用户信息删除
User *UserInfoDelete(User *head)
{
    char Username[10];
    User *p=head,*pr=head;
    if(head==NULL)
    {
        if(head==NULL)
        {
            printf("UserInfoDelete is empty!\n");
            return(head);
        }
    }
    printf("请输入要删除用户信息的用户名:\n");
    scanf("%s",Username);
    while(strcmp(p->Username,Username)!=0&&p->next!=NULL)
    {
        pr=p;
        p=p->next;
    }
    if(strcmp(p->Username,Username)==0)
    {
        if(p==head)
        {
            head=p->next;
        }
        else
        {
            pr->next=p->next;
        }
        free(p);
        printf("用户信息删除成功!\n");
    }
    else
    {
        printf("未找到要删除用户的用户名\n");
    }
    return head;
}
//4.用户信息显示
void UserInfoShow(User *head)
{
    User *p=head;
    int num,i;
    printf("      账号      密码  类型\n");
    while(p!=NULL)
    {
        printf("%10s   ",p->Username);
        num=strlen(p->Password);
        for(i=0;i<num;i++)
            printf("*");
        printf("%6d\n",p->Type);
        p=p->next;
    }
}

//5.用户密码修改
User *UserPasswdChange(User *head)
{
    char Username[10];
    char Password[10];
    char NewPassword[10];
    char TwoNewPassword[10];
    User *p=head;
    int c;
    if(head==NULL)
    {
        if(head==NULL)
        {
            printf("UserInfoDelete is empty!\n");
            return(head);
        }
    }
    printf("请输入你的用户名:\n");
    scanf("%s",Username);
    while(strcmp(p->Username,Username)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if(strcmp(p->Username,Username)==0)
    {
        printf("1 修改密码\n2 退出修改\n");
        scanf("%d",&c);
        if(c==1)
        {
            while(1)
            {
                printf("请输入你的旧密码:\n");
                scanf("%s",Password);
                if(strcmp(p->Password,Password)!=0)
                {
                    printf("输入的旧密码错误,请再次输入:\n");
                    continue;
                }
                break;
            }
            while(1)
            {
                printf("请输入你的新密码:\n");
                scanf("%s",NewPassword);
                printf("请再次输入你的新密码:\n");
                scanf("%s",TwoNewPassword);
                if(strcmp(NewPassword,TwoNewPassword)!=0)
                {
                    printf("两次输入的密码不符合,请再次输入:\n");
                    continue;
                }
                break;
            }
            printf("密码修改成功\n");
            strcpy(p->Password,NewPassword);
            return head;
        }
        else
        {
            return head;
        }
    }
    else
    {
        printf("未找到你的用户名\n");
    }
    return head;
}

//用户管理
void UserManage()
{
    User *head=UserInfoHead;
    int sum;
    printf("欢迎来到用户管理系统\n");
    do{
        printf("\n**************\n");
        printf("1.用户信息输入\n");
        printf("2.用户信息修改\n");
        printf("3.用户信息删除\n");
        printf("4.用户信息显示\n");
        printf("5.用户密码修改\n");
        printf("6.返回主菜单\n");
        printf("**************\n\n");
        printf("请选择;");
        scanf("%d",&sum);
        if(UserType==3)
        {
            if(sum==6)
                break;
            else if(sum==1)
                UserInfoInput(head);
            else if(sum==2)
                UserInfoChange(head);
            else if(sum==3)
                UserInfoDelete(head);
            else if(sum==4)
                UserInfoShow(head);
            else if(sum==5)
                UserPasswdChange(head);
            else
               printf("输入错误,请重新选择:");
        }
        else if(UserType==1||UserType==2)
        {
            if(sum==5)
                UserPasswdChange(head);
            else if(sum==6)
                break;
            else if(sum==1||sum==2||sum==3||sum==4)
                printf("对不起,您的权限不够!");
            else
                printf("输入错误,请重新选择:");
        }
    }while(sum!=EOF);
}
//1.读者信息输入
Reader *ReaderInfoInput(Reader *head)
{
    char c;
   // FILE *fp;
    Reader *p,*pr=head,*temp=NULL;
    printf("是否输入读者信息:\n");
    scanf(" %c",&c);
    if(c=='Y'||c=='y')
    {
        while(c=='Y'||c=='y')
        {
            p=(Reader *)malloc(sizeof(Reader));
            if(p==NULL)
            {
                printf("No enough memory to allocate!\n");
                exit(0);
            }
          //  fp=fopen("Reader.txt","a");
            printf("请输入读者号 读者名 单位 联系方式 可借书数 已借书数:\n");
            scanf("%s%s%s%s%d%d",p->ReaderId,p->ReaderName,p->ReaderUnit,p->ReaderPhone,&p->BorrowBooks,&p->ReturnBooks);
            p->next=NULL;
            if(head==NULL)
            {
                head=p;
            }
            else
            {
                while(strcmp(pr->ReaderName,p->ReaderName)<0&&pr->next!=NULL)
                {
                    temp=pr;
                    pr=pr->next;
                }
                if(strcmp(pr->ReaderName,p->ReaderName)>=0)
                {
                    if(pr==head)
                    {
                        p->next=head;
                        head=p;
                    }
                    else
                    {
                        pr=temp;
                        p->next=pr->next;
                        pr->next=p;
                    }
                }
                else
                {
                    pr->next=p;
                }
            }
            //fprintf(fp,"%s %s %s %s %d %d\n",p->ReaderId,p->ReaderName,p->ReaderUnit,p->ReaderPhone,p->BorrowBooks,p->ReturnBooks);
            printf("读者信息输入成功!\n");
            printf("是否再输入用户信息:");
            scanf(" %c",&c);
        }
        return head;
    }
    else
    {
        return head;
    }
}
//2.读者信息修改
Reader *ReaderInfoChange(Reader *head)
{
    char ReaderId[10];
    char ReaderName[10];
    char ReaderUnit[10];
    char ReaderPhone[12];
    int BorrowBooks;
    int ReturnBooks;
    int c;
    char k;
    Reader *p=head;
    if(head==NULL)
    {
        if(head==NULL)
        {
            printf("UserInfoDelete is empty!\n");
            return(head);
        }
    }
    printf("请输入需要修改读者信息的读者号:\n");
    scanf("%s",ReaderId);
    while(strcmp(p->ReaderId,ReaderId)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if(strcmp(p->ReaderId,ReaderId)==0)
    {
        printf("1 修改读者号\n2 修改读者名\n3 修改读者单位\n4 修改读者联系方式\n5 修改可借书数\n6 修改已借书数");
        do
        {
            printf("请输入任务的序号:");
            scanf("%d",&c);
            switch (c)
            {
            case 1:
                printf("请输入修改后的读者号:\n");
                scanf("%s",ReaderId);
                strcpy(p->ReaderId,ReaderId);
                break;
            case 2:
                printf("请输入修改后的读者名:\n");
                scanf("%s",ReaderName);
                strcpy(p->ReaderName,ReaderName);
                break;
            case 3:
                printf("请输入修改后的单位:\n");
                scanf("%s",ReaderUnit);
                strcpy(p->ReaderUnit,ReaderUnit);
                break;
            case 4:
                printf("请输入修改后的联系方式:\n");
                scanf("%s",ReaderPhone);
                strcpy(p->ReaderPhone,ReaderPhone);
                break;
            case 5:
                printf("请输入修改后的可借书数:\n");
                scanf("%d",&BorrowBooks);
                p->BorrowBooks=BorrowBooks;
                break;
            case 6:
                printf("请输入修改后的已借书数:\n");
                scanf("%d",&ReturnBooks);
                p->ReturnBooks=ReturnBooks;
                break;
            case 7:
                break;
            }
            printf("用户信息修改成功:\n");
            printf("是否再次修改 是(Y||y) 否(N|n)\n");
            scanf(" %c",&k);
        }while(k=='Y'||k=='y');
    }
    else
    {
        printf("未找到要修改读者信息的读者号\n");
    }
    return head;

}
//3.读者信息删除
Reader *ReaderInfoDelete(Reader *head)
{
    char ReaderId[10];
    Reader *p=head,*pr=head;
    if(head==NULL)
    {
        printf("UserInfoDelete is empty!\n");
        return(head);
    }
    printf("请输入要删除用户信息的用户名:\n");
    scanf("%s",ReaderId);
    while(strcmp(p->ReaderId,ReaderId)!=0&&p->next!=NULL)
    {
        pr=p;
        p=p->next;
    }
    if(strcmp(p->ReaderId,ReaderId)==0)
    {
        if(p==head)
        {
            head=p->next;
        }
        else
        {
            pr->next=p->next;
        }
        free(p);
        printf("用户信息删除成功!\n");
    }
    else
    {
        printf("未找到要删除用户的用户名\n");
    }
    return head;
}
//4.读者信息查询
Reader *ReaderInfoFind(Reader *head)
{
    char c;
    char ReaderId[10];
    Reader *p=head,*pr=head;
    printf("是否查询读者信息:\n");
    scanf(" %c",&c);
    if(c=='Y'||c=='y')
    {
        while(c=='Y'||c=='y')
        {
            if(head==NULL)
            {
                printf("UserInfoDelete is empty!\n");
                return(head);
            }
            printf("请输入要查询读者信息的读者号(用户名):\n");
            scanf("%s",ReaderId);
            while(strcmp(p->ReaderId,ReaderId)!=0&&p->next!=NULL)
            {
                pr=p;
                p=p->next;
            }
            if(strcmp(p->ReaderId,ReaderId)==0)
            {
                printf("    读者号    读者名      单位     联系方式 可借书数 已借书数\n");
                printf("%10s%10s%10s%11s%4d%4d\n",p->ReaderId,p->ReaderName,p->ReaderUnit,p->ReaderPhone,p->BorrowBooks,p->ReturnBooks);
            }
            else
            {
                printf("未找到要查询的读者信息\n");
            }
            printf("是否再查询读者信息:\n");
            scanf(" %c",&c);
        }
    }
    return head;

}

void ReaderInfoShow(Reader *head)
{
    Reader *p=head;
    printf("    读者号    读者名      单位     联系方式 可借书数 已借书数\n");
    while(p!=NULL)
    {
        printf("%10s%10s%10s%13s%9d%9d\n",p->ReaderId,p->ReaderName,p->ReaderUnit,p->ReaderPhone,p->BorrowBooks,p->ReturnBooks);

        p=p->next;
    }
}
//读者管理
void ReaderManage()
{
    Readfile2();
    Reader *head=ReaderInfoHead;
    int sum;
    if(UserType!=2)
    {
        printf("对不起,您的权限不足!");
            return;
    }
    else
    {
        printf("欢迎来到读者管理系统\n");
        do{
            printf("\n**************\n");
            printf("1.读者信息输入\n");
            printf("2.读者信息修改\n");
            printf("3.读者信息删除\n");
            printf("4.读者信息查询\n");
            printf("5.读者信息显示\n");//按读者姓氏排序
            printf("6.返回主菜单\n");
            printf("**************\n\n");
            printf("请选择;");
            scanf("%d",&sum);
            if(sum==1)
                head=ReaderInfoInput(head);
            else if(sum==2)
                head=ReaderInfoChange(head);
            else if(sum==3)
                head=ReaderInfoDelete(head);
            else if(sum==4)
                ReaderInfoFind(head);
            else if(sum==5)
                ReaderInfoShow(head);
            else if(sum==6)
                break;
            else
              printf("输入错误,请重新选择:");
        }while(sum!=EOF);
    }
    ReaderInfoHead=head;

}
//1.借书处理
void BorrowBooksdeal()
{
    int k,i;
    int BookNumber;
    date Borrowdate;
    Bookdealer *p1=NULL,*pr=Bookdealinfohead;
    Reader *p=ReaderInfoHead;
    char ReaderId[10];
    printf("请输入读者号\n");
    scanf("%s",ReaderId);
    while(p!=NULL)//检查是否为合法读者
	{
	    k=0;
		if(strcmp(p->ReaderId,ReaderId)==0)
		{
			k=1;
			break;
		}
        p=p->next;
	}
	if(k==0)
	{
        printf("用户非法\n");
        return;
	}
	if(p->ReturnBooks>=p->BorrowBooks)//判断借书量是否超限
    {
        printf("借书量超限\n");
        return;
    }
    printf("请输入书号 借书日期\n");
    scanf("%d%d%d%d",&BookNumber,&Borrowdate.year,&Borrowdate.month,&Borrowdate.day);
    for(i=0;i<RecordNumber;i++)//判断是否为合法图书
    {
        k=0;
        if(Booked[i].BookNumber==BookNumber)
        {
            k=1;
            break;
        }
    }
    if(k==0)
    {
        printf("非法书号\n");
        return;
    }
    if(Booked[i].CollectBooks==0)//判断有无藏书
    {
        printf("无藏书\n");
        return;
    }
    p1=(Bookdealer *)malloc(sizeof(Bookdealer));//将信息写入借还书文件
    if(p1==NULL)
    {
        printf("No enough memory to allocate!\n");
        exit(0);
    }
    strcpy(p1->ReaderId,ReaderId);
    p1->BookNumber=BookNumber;
    p1->Borrowdate.year=Borrowdate.year;
    p1->Borrowdate.month=Borrowdate.month;
    p1->Borrowdate.day=Borrowdate.day;
    p1->Returndate.year=0;
    p1->Returndate.month=0;
    p1->Returndate.day=0;
    p1->next=NULL;

    if(Bookdealinfohead==NULL)
        Bookdealinfohead=p1;
    else
    {
        while(pr->next!=NULL)
        {
            pr=pr->next;
        }
        pr->next=p1;
    }
    p->ReturnBooks+=1;
    Booked[i].LendBooks+=1;
    printf("借书成功\n");

    return;
}
//2.还书处理
void ReturnBooksdeal()
{
    int k,i;
    int BookNumber;
    date Returndate;
    Bookdealer *p1=Bookdealinfohead;
    Reader *p=ReaderInfoHead;
    char ReaderId[10];
    printf("请输入读者号\n");
    scanf("%s",ReaderId);
    while(p!=NULL)//检查是否为合法读者
	{
	    k=0;
		if(strcmp(p->ReaderId,ReaderId)==0)
		{
			k=1;
			break;
		}
        p=p->next;
	}
	if(k==0)
	{
        printf("用户非法\n");
        return;
	}
	printf("请输入书号与还书日期\n");
	scanf("%d%d%d%d",&BookNumber,&Returndate.year,&Returndate.month,&Returndate.day);
	while(p1!=NULL)//检查书号是否合法
	{
	    k=0;
		if(p1->BookNumber==BookNumber)
		{
			k=1;
			break;
		}
        p1=p1->next;
	}
	if(k==0)
	{
        printf("非法书号\n");
        return;
	}
	for(i=0;i<RecordNumber;i++)//判断是否为合法图书
    {
        k=0;
        if(Booked[i].BookNumber==BookNumber)
        {
            k=1;
            break;
        }
    }
    if(k==0)
    {
        printf("非法书号\n");
        return;
    }
    p->ReturnBooks-=1;
    Booked[i].LendBooks-=1;
    p1->Returndate.year=Returndate.year;
    p1->Returndate.month=Returndate.month;
    p1->Returndate.day=Returndate.day;
    p1->next=NULL;
    printf("还书成功\n");
    return;
}
//3 新建链表(图书流通)
Bookdealer *AppendNode3(Bookdealer *head,Bookdealer *pTemp)
{
    Bookdealer *p=NULL,*pr=head;
    p=(Bookdealer *)malloc(sizeof(Bookdealer));
    if(head==NULL)
    {
        head=p;
    }
    else
    {
        while(pr->next!=NULL)
        {
            pr=pr->next;
        }
        pr->next=p;
    }
    strcpy(p->ReaderId,pTemp->ReaderId);
    p->BookNumber=pTemp->BookNumber;
    p->Borrowdate.year=pTemp->Borrowdate.year;
    p->Borrowdate.month=pTemp->Borrowdate.month;
    p->Borrowdate.day=pTemp->Borrowdate.day;
    p->Returndate.year=pTemp->Returndate.year;
    p->Returndate.month=pTemp->Returndate.month;
    p->Returndate.day=pTemp->Returndate.day;
    strcpy(p->Remark,pTemp->Remark);
    p->next=NULL;
    return head;
}

//4.将文件读入链表中(流通)
void Readfile4()
{
    FILE *fp;
    Bookdealer *pTemp=NULL,*head=NULL;
    pTemp=(Bookdealer *)malloc(sizeof(Bookdealer));
	if(pTemp==NULL)
	{
		printf("No enough memory to allocate!\n");
		exit(0);
	}
    if((fp=fopen("Bookdealinfo.txt","rb"))==NULL)
	{
		printf("Failure to open Bookdealinfo.txt!\n");
		exit(0);
	}
	pTemp->next=NULL;
    while(1)
    {
        int i=fscanf(fp,"%s %d %d%d%d %d%d%d",pTemp->ReaderId,&pTemp->BookNumber,&pTemp->Borrowdate.year,&pTemp->Borrowdate.month,&pTemp->Borrowdate.day,&pTemp->Returndate.year,&pTemp->Returndate.month,&pTemp->Returndate.day);
        printf("%s %d %d %d %d %d %d %d\n",pTemp->ReaderId,pTemp->BookNumber,pTemp->Borrowdate.year,pTemp->Borrowdate.month,pTemp->Borrowdate.day,pTemp->Returndate.year,pTemp->Returndate.month,pTemp->Returndate.day);
        if(8==i)
        {
            head=AppendNode3(head,pTemp);
        }
        else
            break;
    }
    free(pTemp);
    fclose(fp);
    Bookdealinfohead=head;
}
//3 将链表写入文件中(流通)
void Writefile4()
{
    FILE *fp;
    Bookdealer *pTemp=Bookdealinfohead;
    if((fp=fopen("Bookdealinfo.txt","wb"))==NULL)
	{
		printf("Failure to open Bookdealinfo.txt!\n");
		exit(0);
	}
    while(pTemp!=NULL)
    {
        fprintf(fp,"%s %d %d %d %d %d %d %d\n",pTemp->ReaderId,pTemp->BookNumber,pTemp->Borrowdate.year,pTemp->Borrowdate.month,pTemp->Borrowdate.day,pTemp->Returndate.year,pTemp->Returndate.month,pTemp->Returndate.day);
        pTemp=pTemp->next;
    }
    fclose(fp);
}
//读出文件
void Readfile3()
{
    FILE *fp;
    FILE *ap;
    FILE *bp;
    FILE *cp;
    FILE *dp;
    int i;
    if((dp=fopen("RecordNumber.txt","rb"))==NULL)
	{
		printf("Failure to open RecordNumber.txt!\n");
	}
    if((fp=fopen("Bookerinfo.txt","rb"))==NULL)
	{
		printf("Failure to open Bookerinfo.txt!\n");
	}
	if((ap=fopen("Titleinfo.txt","rb"))==NULL)
	{
		printf("Failure to open Titleinfo.txt!\n");
	}
    if((bp=fopen("Writerinfo.txt","rb"))==NULL)
	{
		printf("Failure to open Writerinfo.txt!\n");
	}
	if((cp=fopen("Publishinfo.txt","rb"))==NULL)
	{
		printf("Failure to open Publishinfo.txt!\n");
	}
	for(i=0;i<4;i++)
    {
        fscanf(dp,"%d",&AllRecordNumber[i]);
    }
    RecordNumber=AllRecordNumber[0];
    Titlenumber=AllRecordNumber[1];
    Writernumber=AllRecordNumber[2];
    Publishnumber=AllRecordNumber[3];
    for(i=0;i<RecordNumber;i++)
    {
         fscanf(fp,"%d %d %s %s %s %d %d %d %d %d",&Booked[i].BookRecord,&Booked[i].BookNumber,Booked[i].BookTitle,Booked[i].BookWriter,Booked[i].BookPublish,&Booked[i].CollectBooks,&Booked[i].LendBooks,&Booked[i].next1,&Booked[i].next2,&Booked[i].next3);
    }
    for(i=0;i<Titlenumber;i++)
    {
        fscanf(ap,"%s %d %d",Titled[i].BookTitle,&Titled[i].Recordnext,&Titled[i].length);
    }
    for(i=0;i<Writernumber;i++)
    {
        fscanf(bp,"%s %d %d",Writered[i].BookWriter,&Writered[i].Recordnext,&Writered[i].length);
    }
    for(i=0;i<Publishnumber;i++)
    {
        fscanf(cp,"%s %d %d",Published[i].BookPublish,&Published[i].Recordnext,&Published[i].length);
    }
    fclose(fp);
    fclose(ap);
    fclose(bp);
    fclose(cp);
    fclose(dp);
}

//将数组写入文件中
void Writefile3()
{
    FILE *fp;
    FILE *ap;
    FILE *bp;
    FILE *cp;
    FILE *dp;
    int i;
    if((dp=fopen("RecordNumber.txt","wb"))==NULL)
	{
		printf("Failure to open RecordNumber.txt!\n");
	}
    if((fp=fopen("Bookerinfo.txt","wb"))==NULL)
	{
		printf("Failure to open Bookerinfo.txt!\n");
	}
	if((ap=fopen("Titleinfo.txt","wb"))==NULL)
	{
		printf("Failure to open Titleinfo.txt!\n");
	}
    if((bp=fopen("Writerinfo.txt","wb"))==NULL)
	{
		printf("Failure to open Writerinfo.txt!\n");
	}
	if((cp=fopen("Publishinfo.txt","wb"))==NULL)
	{
		printf("Failure to open Publishinfo.txt!\n");
	}
	AllRecordNumber[0]=RecordNumber;
	AllRecordNumber[1]=Titlenumber;
	AllRecordNumber[2]=Writernumber;
	AllRecordNumber[3]=Publishnumber;
	for(i=0;i<4;i++)
    {
        fprintf(dp,"%d ",AllRecordNumber[i]);
    }
    for(i=0;i<RecordNumber;i++)
    {
         fprintf(fp,"%d %d %s %s %s %d %d %d %d %d \n",Booked[i].BookRecord,Booked[i].BookNumber,Booked[i].BookTitle,Booked[i].BookWriter,Booked[i].BookPublish,Booked[i].CollectBooks,Booked[i].LendBooks,Booked[i].next1,Booked[i].next2,Booked[i].next3);
    }
    for(i=0;i<Titlenumber;i++)
    {
         fprintf(ap,"%s %d %d \n",Titled[i].BookTitle,Titled[i].Recordnext,Titled[i].length);
    }
    for(i=0;i<Writernumber;i++)
    {
        fprintf(bp,"%s %d %d \n",Writered[i].BookWriter,Writered[i].Recordnext,Writered[i].length);
    }
    for(i=0;i<Publishnumber;i++)
    {
        fprintf(cp,"%s %d %d \n",Published[i].BookPublish,Published[i].Recordnext,Published[i].length);
    }
    fclose(fp);
    fclose(ap);
    fclose(bp);
    fclose(cp);
    fclose(dp);
}

//收集不同种的书名 作者 出版社
void SecondrykeyTable(int i)
{
    int k,j,m;
    k=1;
    for(j=i-1;j>=0;j--)
    {
        if(strcmp(Booked[j].BookTitle,Booked[i].BookTitle)==0)
        {
            k=0;
            Booked[i].next1=Booked[j].BookRecord;
            for(m=0;m<Titlenumber;m++)
            {
                if(strcmp(Booked[i].BookTitle,Titled[m].BookTitle)==0)
                {
                    Titled[m].Recordnext=Booked[i].BookRecord;
                    Titled[m].length+=1;
                    break;
                }
            }
        }
        if(k==0)
            break;
    }
    if(k==1)
    {
        Booked[i].next1=0;
        strcpy(Titled[Titlenumber].BookTitle,Booked[i].BookTitle);
        Titled[Titlenumber].Recordnext=Booked[i].BookRecord;
        Titled[Titlenumber].length=1;
        Titlenumber++;
    }
    k=1;
    for(j=i-1;j>=0;j--)
    {
        if(strcmp(Booked[j].BookWriter,Booked[i].BookWriter)==0)
        {
            k=0;
            Booked[i].next2=Booked[j].BookRecord;
            for(m=0;m<Writernumber;m++)
            {
                if(strcmp(Booked[i].BookWriter,Writered[m].BookWriter)==0)
                {
                    Writered[m].Recordnext=Booked[i].BookRecord;
                    Writered[m].length+=1;
                    break;
                }
            }

        }
        if(k==0)
            break;
    }
    if(k==1)
    {
       strcpy(Writered[Writernumber].BookWriter,Booked[i].BookWriter);
       Writered[Writernumber].Recordnext=Booked[i].BookRecord;
       Writered[Writernumber].length=1;
       Writernumber++;
    }
    k=1;
    for(j=i-1;j>=0;j--)
    {
        if(strcmp(Booked[j].BookPublish,Booked[i].BookPublish)==0)
        {
            k=0;
            Booked[i].next3=Booked[j].BookRecord;
            for(m=0;m<Publishnumber;m++)
            {
                if(strcmp(Booked[i].BookPublish,Published[m].BookPublish)==0)
                {
                    Published[m].Recordnext=Booked[i].BookRecord;
                    Published[m].length+=1;
                    break;
                }
            }

        }
        if(k==0)
            break;
    }
    if(k==1)
    {
       strcpy(Published[Publishnumber].BookPublish,Booked[i].BookPublish);
       Published[Publishnumber].Recordnext=Booked[i].BookRecord;
       Published[Publishnumber].length=1;
        Publishnumber++;
    }
}
//*图书信息输入
void BookerInfoInput()
{
    Booker temp;
    char c;
    int i,j,f,k=0;
    i=RecordNumber;
    printf("请输入图书的书号 书名 作者 出版社 藏书量 借出数\n");
    scanf("%d%s%s%s%d%d",&Booked[i].BookNumber,Booked[i].BookTitle,Booked[i].BookWriter,Booked[i].BookPublish,&Booked[i].CollectBooks,&Booked[i].LendBooks);
    RecordNumber+=1;
    Booked[i].BookRecord=RecordNumber;
    SecondrykeyTable(i);

}
//2.图书信息修改
void BookerInfoChange()
{
    int i,c,k=0;
    int RealNumber;
    int CollectBooks;
    int LendBooks;
    printf("请输入要修改图书信息的书号\n");
    scanf("%d",&RealNumber);
    for(i=0;i<RecordNumber;i++)
    {
        if(Booked[i].BookNumber==RealNumber)
        {
            k=1;
            printf("1 修改藏书量\n2修改借出数\n");
            scanf("%d",&c);
            if(c==1)
            {
                printf("请输入修改后的藏书数\n");
                scanf("%d",&CollectBooks);
                Booked[i].CollectBooks=CollectBooks;
            }
            else if(c==2)
            {
                printf("请输入修改后的借出数\n");
                scanf("%d",&LendBooks);
                Booked[i].LendBooks=LendBooks;
            }
            else
            {
                printf("输入非法字符请重新输入\n");
            }
            break;
        }
    }
    if(k==0)
    {
        printf("未找到需要修改的图书号\n");
    }
}
//*图书信息查询
void BookerInfoFind()
{
    int z;
    int BookNumber,k,i,j,c,num;
    char BookTitle[10];
    char BookWriter[10];
    char BookPublish[10];
    while(1)
    {
        printf("1 按书号查询\n2 按书名查询\n3 按作者查询\n4 按出版社查询\n5 返回主菜单\n");
        printf("请输入任务序号:\n");
        scanf("%d",&c);
        switch(c)
        {
        case 1:
            while(1)
            {
                k=0;
                z=0;
                printf("请输入要查询的图书的书号\n");
                scanf("%d",&BookNumber);
                for(i=0;i<RecordNumber;i++)
                {
                    if(Booked[i].BookNumber==BookNumber)
                    {
                        printf("查找成功\n");
                        k++;
                        z++;
                        if(z==1)
                            printf("      书号                书名                作者              出版社    藏书量    借出数\n");
                        printf("%10d%20s%20s%20s%10d%10d\n",Booked[i].BookNumber,Booked[i].BookTitle,Booked[i].BookWriter,Booked[i].BookPublish,Booked[i].CollectBooks,Booked[i].LendBooks);
                        break;
                    }
                }
                if(k==0)
                    printf("查找失败,未有该图书,请检查书号是否正确\n");
                else
                    break;
            }
            break;
        case 2:
            while(1)
            {
                 z=0;
                printf("请输入要查询的图书的书名\n");
                scanf("%s",BookTitle);
                for(i=0;i<Titlenumber;i++)
                {
                    if(strcmp(Titled[i].BookTitle,BookTitle)==0)
                    {
                        printf("查找成功\n");
                        k=Titled[i].Recordnext-1;
                        for(j=0;j<Titled[i].length;j++)
                        {
                            z++;
                            if(z==1)
                                printf("      书号                书名                作者              出版社    藏书量    借出数\n");
                            printf("%10d%20s%20s%20s%10d%10d\n",Booked[k].BookNumber,Booked[k].BookTitle,Booked[k].BookWriter,Booked[k].BookPublish,Booked[k].CollectBooks,Booked[k].LendBooks);
                            k=Booked[k].next1-1;
                        }
                        break;
                    }
                }
                if(strcmp(Titled[i].BookTitle,BookTitle)!=0)
                    printf("未查询到该图书请检查输入的书名是否正确!\n");
                else
                    break;
            }
            break;
        case 3:
            while(1)
            {
                z=0;
                printf("请输入要查询的图书的作者\n");
                scanf("%s",BookWriter);
                for(i=0;i<Writernumber;i++)
                {
                    if(strcmp(Writered[i].BookWriter,BookWriter)==0)
                    {
                        printf("查找成功\n");
                        k=Writered[i].Recordnext-1;
                        for(j=0;j<Writered[i].length;j++)
                        {
                            z++;
                            if(z==1)
                                printf("      书号                书名                作者              出版社    藏书量    借出数\n");
                            printf("%10d%20s%20s%20s%10d%10d\n",Booked[k].BookNumber,Booked[k].BookTitle,Booked[k].BookWriter,Booked[k].BookPublish,Booked[k].CollectBooks,Booked[k].LendBooks);
                            k=Booked[k].next2-1;
                        }
                        break;
                    }
                }
                if(strcmp(Writered[i].BookWriter,BookWriter)!=0)
                    printf("未查询到该图书请检查输入的作者是否正确!\n");
                else
                    break;
            }
            break;
        case 4:
            while(1)
            {
                 z=0;
                printf("请输入要查询的图书的出版社\n");
                scanf("%s",BookPublish);
                for(i=0;i<Publishnumber;i++)
                {
                    if(strcmp(Published[i].BookPublish,BookPublish)==0)
                    {
                        printf("查找成功\n");
                        k=Published[i].Recordnext-1;
                        for(j=0;j<Published[i].length;j++)
                        {
                            z++;
                            if(z==1)
                                printf("      书号                书名                作者              出版社    藏书量    借出数\n");
                            printf("%10d%20s%20s%20s%10d%10d\n",Booked[k].BookNumber,Booked[k].BookTitle,Booked[k].BookWriter,Booked[k].BookPublish,Booked[k].CollectBooks,Booked[k].LendBooks);
                            k=Booked[k].next3-1;
                        }
                        break;
                    }
                }
                if(strcmp(Published[i].BookPublish,BookPublish)!=0)
                    printf("未查询到该图书请检查输入的出版设是否正确!\n");
                else
                    break;
            }
            break;
        case 5:
            return;
        default:
            printf("非法输入请重新输入任务序号!\n");
            break;
        }
    }
}
//*汇总统计
void BookerCollect()
{
    int i,j,k,Tmax,Wmax,Pmax;
    int LendBooks=0;
    int CollectBooks=0;
    int BookTnum[10]={0},BookWnum[10]={0},BookPnum[10]={0};
    for(i=0;i<RecordNumber;i++)
    {
        CollectBooks+=Booked[i].CollectBooks;
        LendBooks+=Booked[i].LendBooks;
    }
    printf("总藏书量 总借出数\n");
    printf("%8d%8d\n",CollectBooks,LendBooks);
    printf("记录号      书号                书名                作者              出版社    藏书量    借出数\n");
    for(i=0;i<RecordNumber;i++)
    {
        printf("%6d%10d%20s%20s%20s%10d%10d\n",Booked[i].BookRecord,Booked[i].BookNumber,Booked[i].BookTitle,Booked[i].BookWriter,Booked[i].BookPublish,Booked[i].CollectBooks,Booked[i].LendBooks);
    }
    printf("******************************************\n");
//    for(j=0;j<Titlenumber;j++)
//    {
//        for(i=0;i<RecordNumber;i++)
//        {
//            if(strcmp(Titled[j].BookTitle,Booked[i].BookTitle)==0)
//                BookTnum[j]+=Booked[i].LendBooks;
//        }
//    }
//    max=BookTnum[0];
//    for(i=1;i<Titlenumber;i++)
//    {
//        if(BookTnum[i]>max)
//        {
//            max=BookTnum[i];
//            k=i;
//        }
//    }
//    printf("       最受欢迎的图书是%s,共借出%d本!\n",Titled[k].BookTitle,max);
//    printf("******************************************\n");
//    for(j=0;j<Writernumber;j++)
//    {
//        for(i=0;i<RecordNumber;i++)
//        {
//            if(strcmp(Writered[j].BookWriter,Booked[i].BookWriter)==0)
//                BookWnum[j]+=Booked[i].LendBooks;
//        }
//    }
//    max=BookWnum[0];
//    for(i=1;i<Writernumber;i++)
//    {
//        if(BookWnum[i]>max)
//        {
//            max=BookWnum[i];
//            k=i;
//        }
//    }
//    printf("       最受欢迎的作者是%s,共借出%d本!\n",Writered[k].BookWriter,max);
//    printf("******************************************\n");
//    max=0;
//    for(j=0;j<Publishnumber;j++)
//    {
//        for(i=0;i<RecordNumber;i++)
//        {
//            if(strcmp(Published[j].BookPublish,Booked[i].BookPublish)==0)
//                BookPnum[j]+=Booked[i].LendBooks;
//        }
//    }
//    max=BookPnum[0];
//    for(i=1;i<Publishnumber;i++)
//    {
//        if(BookPnum[i]>max)
//        {
//            max=BookPnum[i];
//            k=i;
//        }
//    }
//    printf("       最受欢迎的出版社是%s,共借出%d本!\n",Published[k].BookPublish,max);
//
//
    Bookdealer *p1=Bookdealinfohead;
    while(p1!=NULL)
	{
	    for(i=0;i<RecordNumber;i++)
        {
            //if(strcmp(p1->BookNumber,Booked[i].BookNumber)==0)
            if(p1->BookNumber==Booked[i].BookNumber)
            {
                for(j=0;j<Titlenumber;j++)
                {
                    if(strcmp(Booked[i].BookTitle,Titled[j].BookTitle)==0)
                    {
                        BookTnum[j]+=1;
                    }
                }
                for(j=0;j<Writernumber;j++)
                {
                    if(strcmp(Writered[j].BookWriter,Booked[i].BookWriter)==0)
                    {
                        BookWnum[j]+=1;
                    }
                }
                for(j=0;j<Publishnumber;j++)
                {
                    if(strcmp(Published[j].BookPublish,Booked[i].BookPublish)==0)
                    {
                        BookPnum[j]+=1;
                    }
                }

            }
        }
        p1=p1->next;
	}
	Tmax=BookTnum[0];
    for(i=1;i<Titlenumber;i++)
    {
        if(BookTnum[i]>Tmax)
        {
            Tmax=BookTnum[i];
            k=i;
        }
    }
    printf("******************************************\n");
    printf("       最受欢迎的图书是%s,共借出%d本!\n",Titled[k].BookTitle,Tmax);
    printf("******************************************\n");
    Wmax=BookWnum[0];
    for(i=1;i<Writernumber;i++)
    {
        if(BookWnum[i]>Wmax)
        {
            Wmax=BookWnum[i];
            k=i;
        }
    }
    printf("       最受欢迎的作者是%s,共借出%d本!\n",Writered[k].BookWriter,Wmax);
    printf("******************************************\n");
    Pmax=BookPnum[0];
    for(i=1;i<Publishnumber;i++)
    {
        if(BookPnum[i]>Pmax)
        {
            Pmax=BookPnum[i];
            k=i;
        }
    }
    printf("       最受欢迎的出版社是%s,共借出%d本!\n",Published[k].BookPublish,Pmax);
}
//图书管理
void BookManage()
{
    int sum;
    printf("欢迎来到图书管理系统\n");
    do{
            printf("\n**************\n");
            printf("1.图书信息输入\n");
            printf("2.图书信息修改\n");
            printf("3.图书信息查询\n");
            printf("4.汇总统计\n");
            printf("5.返回主菜单\n");
            printf("**************\n\n");
            printf("请选择;");
            scanf("%d",&sum);
            if(UserType==2)
            {
                if(sum==1)
                    BookerInfoInput();
                else if(sum==2)
                    BookerInfoChange();
                else if(sum==3)
                    BookerInfoFind();
                else if(sum==4)
                    BookerCollect();
                else if(sum==5)
                    break;
                else
                     printf("输入错误,请重新选择:");
            }
            else if(UserType==1||UserType==3)
            {
                if(sum==1||sum==2)
                    printf("对不起,您的权限不足!");
                else if(sum==3)
                     BookerInfoFind();
                else if(sum==4)
                     BookerCollect();
                else if(sum==5)
                    break;
                else
                     printf("输入错误,请重新选择:");
            }
            else
                printf("输入错误,请重新选择:");
    }while(sum!=EOF);

}

//图书流通管理
void BookCirculationmanage()
{
    int sum;
    if(UserType!=2)
    {
        printf("对不起,您的权限不足!");
            return;
    }
    else
    {
        printf("欢迎来到图书流通管理系统\n");
        do{
            printf("\n**************\n");
            printf("1.借书处理\n");
            printf("2.还书处理\n");
            printf("3.返回主菜单\n");
            printf("**************\n\n");
            printf("请选择;");
            scanf("%d",&sum);
            if(sum==1)
                 BorrowBooksdeal();
            else if(sum==2)
                ReturnBooksdeal();
            else if(sum==3)
                break;
            else
                printf("输入错误,请重新选择:");
        }while(sum!=EOF);
    }
}

//菜单
void LibraryInfoManage()
{
    Readfile2();
    Readfile3();
    Readfile4();
    int sum=0;
    do{
        printf("\n*********************\n");
        printf("1.用户管理\n");
        printf("2.读者管理\n");
        printf("3.图书管理\n");
        printf("4.图书流通管理\n");
        printf("5.退出系统\n");
        printf("*********************\n\n");
        printf("请选择;");
        scanf("%d",&sum);
        switch(sum)
        {
            case 1:
                UserManage();
                break;
            case 2:
                ReaderManage();
                break;
            case 3:
                BookManage();
                break;
            case 4:
                BookCirculationmanage();
                break;
            case 5:
               break;
            default:
                break;
        }
        Writefile();
        Writefile2();
        Writefile3();
        Writefile4();
    }while(sum!=5);

}
int main()
{
    printf("欢迎来到图书管理系统!\n");
    printf("请输入账号密码:\n");
    Readfile();
    Login();
    LibraryInfoManage();
    //Writefile4();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值