图书管理系统

int loadone();                                         /*登陆*/

void managementone();                                  /*进入管理员的各种操作*/

struct readerinf *creat();                             /*初始化链表函数*/

struct readerinf *addperson(struct readerinf *head);   /*添加用户函数*/

struct readerinf *delperson(struct readerinf *head);   /*删除用户函数*/

void showperson(struct readerinf *head);               /*查看用户信息*/

void delsecret(struct readerinf *head);                /*清空用户密码*/

void storagereader(struct readerinf *p);            /*将链表信息存至文件*/

/*以下是对图书管理员模块使用函数的声明*/

int loadtwo();                                         /*登陆*/

void managementtwo();                                  /*进入管理员的各种操作*/

struct bookinf *addbook(struct bookinf *head);        /*添加图书*/

struct bookinf *delbook(struct bookinf *head);        /*删除图书*/

void rewritebook(struct bookinf *b);                /*修改图书信息*/

void recharge(struct readerinf *p);                 /*用户充值*/

/*以下是对读者模块函数使用的声明*/

struct readerinf *loadthree();                 /*登陆*/

void operation();                                      /*进入读者的各种操作*/

struct bookinf *begin();                               /*初始化链表函数*/

void borrowbook(struct bookinf *b1,struct readerinf *p);                 /*借书*/

void renewbook(struct readerinf *p);                  /*续借*/ 

void returnbook(struct readerinf *p);                 /*还书*/

void checkbook(struct bookinf *b);                  /*查找图书*/

void rewritereader(struct readerinf *p3);            /*修改读者信息*/

void storagebook(struct bookinf *b);                /*将链表信息存至文件*/

/*以下是对图书管理员模块使用函数的声明*/

int loadtwo();                                         /*登陆*/

void managementtwo();                                  /*进入管理员的各种操作*/

struct bookinf *addbook(struct bookinf *head);        /*添加图书*/

struct bookinf *delbook(struct bookinf *head);        /*删除图书*/

void rewritebook(struct bookinf *b);                /*修改图书信息*/

void recharge(struct readerinf *p);                 /*用户充值*/

/*以下是对读者模块函数使用的声明*/

struct readerinf *loadthree();                 /*登陆*/

void operation();                                      /*进入读者的各种操作*/

struct bookinf *begin();                               /*初始化链表函数*/

void borrowbook(struct bookinf *b1,struct readerinf *p);                 /*借书*/

void renewbook(struct readerinf *p);                  /*续借*/ 

void returnbook(struct readerinf *p);                 /*还书*/

void checkbook(struct bookinf *b);                  /*查找图书*/

void rewritereader(struct readerinf *p3);            /*修改读者信息*/

void storagebook(struct bookinf *b);                /*将链表信息存至文件*/

void statistic();                                    /*统计功能*/

void fine();                                          /*超期罚款函数*/

nt fh1=4;/*返回上层功能所需,方便修改*/

int zh=1000;/*系统管理员的账户、mima=(密码-20)*2*/

char a[5]={'<','@','D','H'},c;/*实际密码为2468*/

struct librarian/*图书管理员的账户、加密后密码=(密码-20)*2*/

{

   int z;

   char m[20];

}liber[5]={{1001,"<<<<"},{1002,"@@@@"},{1003,"DDDD"},{1004,"HHHH"},{1005,"<@DH"}};

/*

函数功能:选择用户类型,进入对应登陆界面

*/

void main()

{  

   int op;

   fine();

   printf(" +++++欢迎进入图书管理系统+++++ ");

   while(1)

   {

     printf(" *      系统管理员请按1         * ");

     printf(" *      图书管理员按2           * ");

     printf(" *      读者请按3               * ");

     printf(" *      查看最受欢迎的书请按4   * ");

     printf(" *      退出请按0               * ");

     printf(" *  请输入0--4,其他指令不可用。* ");

     printf(" ++++++++++++++++++++++++++++++++ ");

     scanf("%d",&op);

     switch(op)

     {

     case 1: if(loadone()==1)

             managementone();break;  

     case 2:if(loadtwo()==1)

             managementtwo();break;

     case 3:if((p1=loadthree())!=NULL)

             operation();break;

     case 0:exit(0);break;

     case 4:statistic();break;

     default : printf("没有对应的系统指令,请查证重输 ");

     }

   }

}

函数功能:系统管理员登陆

输出参数:1--登陆成功,0--返回上层

函数流程:

   1. 输入用户名,若返回上层输入4

   2. 若有这个用户,则继续输入密码。密码正确则返回1,

   3. 否则继续输入。

*/

int loadone()                                             

{

   int i,n=0,z1;

   char c;

   printf("返回上层请按4 ");

   printf("请输入用户名 ");

   scanf("%d",&z1);

   if(fh1==z1)

     return(0);

   while(zh!=z1)

{

     printf("该用户不存在 ");

     scanf("%d",&z1);

   };

   printf("请输入密码 ");

   while(n!=i)

   {

     n=0;

     for(i=0;a[i]!='';i++)

     {

        c=getch();

        if(a[i]==(c-20)*2)

          n++;

     }

     if(n!=i)

        printf("您输入的密码有误 ");

   }

   return(1);

}

/*

函数功能:系统管理员选择对应功能,进行操作

*/

void managementone()                                  

{

   int choice=0;

   head1=creat();

   while(choice!=fh1)

   {  

     printf("+++++++++++++++++++++++++++++++++++++++++ ");

     printf("添加用户请按0 ");

     printf("删除用户请按1 ");

     printf("查看用户信息请按2 ");

     printf("清空用户密码请按3 ");

     printf("返回上层请按4 ");

     printf("请输入0--4,其他指令不可用。 ");

     scanf("%d",&choice);

switch (choice)

     {

     case 0:head1=addperson(head1);break; /*添加用户*/

     case 1:head1=delperson(head1);break; /*删除用户*/

     case 2:showperson(head1);break;    /*查看用户信息*/

     case 3:delsecret(head1);break;     /*清空用户密码*/

     case 4:choice=4;break;             /*返回*/

     default: printf("没有对应的系统指令,请查证重输 ");break;

     } 

   } 

   storagereader(head1);

}

/*

函数功能:读取文件中的信息,存至链表中对应位置

输出参数:head--链表头指针

函数流程:

    1.打开文件

   2.文件没有结束则读取文件信息并存至链表

   3.文件结束则返回头指针

*/

struct readerinf *creat(void)       /*初始化读者信息链表函数*/

{

   int i;

   struct readerinf *head;

   pf=fopen("reader.txt","r+");

   if(pf==NULL)

   {

     printf("不能打开文件 ");

     exit(0);

   }

   if(pf==-1)                /*若文件为空文件*/

     head=NULL;

   else

   {

     p2=(struct readerinf*)malloc(LEN);

     fscanf(pf,"%s %s %s %s %s %d %s %d %d %d",

p2->name,p2->sex,p2->birthday,p2->college,p2->secretnum,

        &p2->ID,p2->type,&p2->balance,&p2->bornum,&p2->outdatenum);

     for(i=0;i<(p2->bornum);i++)

     {

        fscanf(pf,"%d%d%d%d%d",&p2->b[i].book,&p2->b[i].outyear,

          &p2->b[i].outmonth,&p2->b[i].outday,&p2->b[i].tim);

     }

     head=p2;

     while(!feof(pf))

     {

        p1=(struct readerinf*)malloc(LEN);          /*申请一块空间给P1*/

        fscanf(pf,"%s %s %s %s %s %d %s %d %d %d",

          p1->name,p1->sex,p1->birthday,p1->college,p1->secretnum,

           &p1->ID,p1->type,&p1->balance,&p1->bornum,&p1->outdatenum);/*读取信息*/

        for(i=0;i<(p1->bornum);i++)

        {

          fscanf(pf,"%d%d%d%d%d",&p1->b[i].book,&p1->b[i].outyear,

             &p1->b[i].outmonth,&p1->b[i].outday,&p1->b[i].tim);

        }

        p2->next=p1;

        p2=p1;

     }

     p2->next=NULL;

     fclose(pf);

   }

   return(head);

/*

函数功能:添加用户

输入/输出参数:均为链表指头针head

函数流程:

    1.若链表为空,申请一块空间给头指针

   2.否则申请一块空间给p

   3.输入用户的信息,并对密码加密

   4.将p指向的节点连到链表上

*/

*/

struct readerinf *addperson(struct readerinf *head)         

{

   int j;

   struct readerinf *p,*p3;

   printf("请输入要添加用户的信息 ");

   printf("姓名 性别 出生年月 学院  密码   学号/工号   读者类型 账户余额 借书数 超期图书数: ");

   if(head==NULL)

   { 

     head=(struct readerinf*)malloc(LEN);

     scanf("%s %s %s %s %s %d %s %d %d %d",

       head->name,head->sex,head->birthday,head->college,head->secretnum,

     &head->ID,head->type,&head->balance,&head->bornum,&head->outdatenum);

     head->next=NULL;

     for(j=0;head->secretnum[j]!='';j++)

        head->secretnum[j]=(head->secretnum[j]-20)*2;

     printf("添加成功! ");

   }

   else

   {

     p3=head;                    /*每次添加一本图书,不用多输入数据以判断添加是否结束*/

     while(p3->next!=NULL)

        p3=p3->next;            /*找到链表末尾节点*/

     p=(struct readerinf*) malloc(LEN);

     p->next=NULL;

     scanf("%s %s %s %s %s %d %s %d %d %d",

        p->name,p->sex,p->birthday,p->college,p->secretnum,

        &p->ID,p->type,&p->balance,&p->bornum,&p->outdatenum);

     for(j=0;p->secretnum[j]!='';j++)

        p->secretnum[j]=(p->secretnum[j]-20)*2;

     p3->next=p;                /*将p连接到链表末尾节点之后*/

     printf("添加成功! ");

   }

   return(head);                    /*因为有空链表的情况,头指针可能改变,所以需要返回值*/

}

/*

函数功能:删除用户

输入/输出参数:均为链表头指针head

输入/输出参数:均为链表头指针head

函数流程:

    1.输入要删除用户的ID

   2.若为头指针的用户,则使后一个节点为头节点

   3.否则寻找该用户

   4.若找到该用户,则删除该节点

   5.否则向用户输出“无此用户”

*/

struct readerinf *delperson(struct readerinf *head)         

{

   int n;

   struct readerinf *p,*p3;

   printf("请输入要删除用户的ID ");

   scanf("%d",&n);

   if(head->ID==n)

     head=head->next;

   else

   {

     p3=head;

     while(p3->ID!=n&&p3->next!=NULL)

     {

        p=p3;

        p3=p3->next;

     }

     if(p3->ID==n)

     {

        p->next=p3->next;

        printf("删除成功! ");

     }

     else

        printf("无此用户 ");

   }

   return(head);                     /*因为存在头指针改变的情况,所以需要返回值*/

}

/*

函数功能:查看用户信息

输入参数:head--链表头指针

输入参数:head--链表头指针

函数流程:

    1.输入要查看用户的ID

   2.寻找该户

   3.若找到该用户,则输出该用户信息

   4.查找所借图书信息并输出

   5.否则向用户输出“无此用户”

*/

void showperson(struct readerinf *head)        

{

   int n,m,i,j;

   char a[10];

   struct readerinf *p;

   struct bookinf *b,*b1;

   b=begin();

b=begin();

   p=head;

   printf("请输入要查看用户的ID ");

   scanf("%d",&n);

   while(p->ID!=n&&p->next!=NULL)

     p=p->next;

   if(p->ID==n)

   {

     strcpy(a,p->secretnum);

     for(j=0;a[j]!='';j++)

        a[j]=(a[j]/2+20);

     m=p->bornum;

     printf("姓名 性别 出生年月 学院  密码 学号/工号  读者类型 账户余额 借书数 超期图书数: ");

     printf("%s  %s  %s  %s %s  %d   %s       %d       %d       %d ",

        p->name,p->sex,p->birthday,p->college,a,p->ID,

        p->type,p->balance,p->bornum,p->outdatenum);

     printf("所借图书信息: ");

     printf("书名 作者 出版社 出版时间 价格 图书编号 分类 是否在架 借阅次数 超期时间 ");

     for(i=0;i<m;i++)

     {

        b1=b;

        while(b1->ISBN!=p->b[i].book&&b1->next!=NULL)

          b1=b1->next;

        printf("%s %s %s %s %d %d %s %d %d %d年%d月%d日 ",

          b1->name,b1->author,b1->pubcompany,

          b1->pubdate,b1->price,b1->ISBN,

          b1->category,b1->condition,b1->borrowednum,

          p->b[i].outyear,p->b[i].outmonth,p->b[i].outday);

     }

   }

   else

     printf("无此用户 ");

}

/*

函数功能:清空用户密码

输入参数:head--链表头指针

*/

void delsecret(struct readerinf *head)       

{

   int n;

   struct readerinf *p;

   p=head;

   printf("请输入清空密码用户的ID ");

   scanf("%d",&n);

   while(p->ID!=n&&p->next!=NULL)

     p=p->next;

   if(p->ID==n)

     strcpy(p->secretnum, "8888");/*实际密码为0000*/

   else

     printf("无此用户 ");

}

/*

函数功能:将链表中读者信息存至文件

*/

void storagereader(struct readerinf *p)         

{

   int n=1,i=0;

   pf=fopen("reader.txt","w+");

   while(p!=NULL)

   {

     if(n!=1)

        fprintf(pf," ");

     fprintf(pf,"%s %s %s %s %s %d %s %d %d %d",

        p->name,p->sex,p->birthday,p->college,p->secretnum,

        p->ID,p->type,p->balance,p->bornum,p->outdatenum);

     for(i=0;i<(p->bornum);i++)/*依据所借图书数目,将被借图书简单信息存至文件*/

     {

        fprintf(pf," %d %d %d %d %d",p->b[i].book,p->b[i].outyear,

          p->b[i].outmonth,p->b[i].outday,p->b[i].tim);/*此处输出格式前必须加个空格*/

     }

     n++;

     p1=p;

     p=p->next;

     free(p1);

   }

}

   fclose(pf);

}

/*以下是对图书管理员模块使用函数的定义*/

/*

函数功能:图书管理员登陆

输出参数:1--登陆成功,0--返回上层

函数流程:

   1. 输入用户名,若返回上层输入4

   2. 若有这个用户,则继续输入密码。密码正确则返回1,

   3. 否则继续输入。

*/

int loadtwo()                                        

{

   int i=0,j=1,n=0,z1;

   char c;

   printf("返回上层请按4 ");

   printf("请输入用户名 ");

   scanf("%d",&z1);

   if(fh1==z1)

     return(0);

   while(liber[i].z!=z1&&i<5)

     i++;

   if(liber[i].z==z1)

   {

     printf("请输入密码 ");

     while(n!=j)

     {

        n=0;

        for(j=0;liber[i].m[j]!='';j++)

        {

          c=getch();

          if(liber[i].m[j]==(c-20)*2)

             n++;

        }

        if(n!=j)

if(n!=j)

          printf("您输入的密码有误 ");

     }

     return(1);

   }

   else

   {

     printf("用户不存在 ");

     return(0);

   }

}

/*

函数功能:图书管理员选择对应功能,进行操作

*/

void managementtwo()                                 

{

   int choice=0;

   head2=begin();   

   while(choice!=fh1)

   {

     printf("+++++++++++++++++++++++++++++++++++++++++ ");

     printf("添加图书请按0 ");

     printf("删除图书请按1 ");

     printf("修改图书信息请按2 ");

     printf("用户充值请按3 ");

     printf("返回上层请按4 ");

     printf("请输入0--4,其他指令不可用。 ");

     scanf("%d",&choice);

     switch (choice)

     {

     case 0:head2=addbook(head2);break;

     case 1:head2=delbook(head2);break;

     case 2:rewritebook(head2);break;

     case 3:head1=creat();recharge(head1);storagereader(head1);break;

     case 4:choice=4;break;

     default : printf("没有对应的系统指令,请查证重输 ");break; 

     } 

}

   storagebook(head2);

}

/*

函数功能:添加图书

输入/输出参数:均为链表指头针head

函数流程:

    1.若链表为空,申请一块空间给头指针

   2.否则申请一块空间给p

   3.输入图书的信息

   4.将p指向的节点连到链表上

*/

struct bookinf *addbook(struct bookinf *head)     

{

   struct bookinf *b,*b3;

   printf("请输入要添加图书的信息 ");

   printf("书名 作者 出版社 出版时间 价格 图书编号 分类 是否在架 借阅次数: ");

   if(head==NULL)

   { 

     head=(struct bookinf*)malloc(LON);

     scanf("%s %s %s %s %d %d %s %d %d",

     head->name,head->author,head->pubcompany,head->pubdate,&head->price,

        &head->ISBN,head->category,&head->condition,&head->borrowednum);

     head->next=NULL;

     printf("添加成功! ");

   }

   else

   {

     b3=head;                 /*如此处理可以省去free语句,也不用多输入数据以判断添加是否结束*/

     b=(struct bookinf*) malloc(LON);

     b->next=NULL;

     scanf("%s %s %s %s %d %d %s %d %d",

        b->name,b->author,b->pubcompany,b->pubdate,&b->price,

        &b->ISBN,b->category,&b->condition,&b->borrowednum);

     while(b3->next!=NULL)

        b3=b3->next; 

     b3->next=b;

     printf("添加成功! ");

printf("添加成功! ");

   }

   return(head);/*因为有空链表的情况,头指针可能改变,所以需要返回值*/

}

/*

函数功能:删除图书

输入/输出参数:均为链表头指针head

函数流程:

    1.输入要删除图书的ISBN

   2.若为头指针的图书,则使后一个节点为头节点

   3.否则寻找该图书

   4.若找到该图书,则删除该节点

   5.否则向用户输出“无此图书”

*/

struct bookinf *delbook(struct bookinf *head)       

{

   int n;

   struct bookinf *b,*b3;

   printf("请输入要删除图书的ISBN ");

   scanf("%d",&n);

   if(head->ISBN==n)

     head=head->next;

   else

   {

     b3=head;

     while(b3->ISBN!=n&&b3->next!=NULL)

     {

        b=b3;

        b3=b3->next;

     }

     if(b3->ISBN==n)

     {

        b->next=b3->next;

        printf("删除成功! ");

     }

     Else

printf("无此图书 ");

   }

   return(head);/*因为存在头指针改变的情况,所以需要返回值*/

}

/*

函数功能:修改图书信息

输入参数:head--链表头指针

函数流程:

    1.输入要修改图书的ISBN

   2.寻找该图书

   3.若找到该图书,则输入修改信息

   4.否则向用户输出“无此图书”

*/

void rewritebook(struct bookinf *b)               

{

   int n;

   char a[31],au[21],c[30],d[20];

   printf("请输入要修改图书的ISBN ");

   scanf("%d",&n);

   while(b->ISBN!=n&&b->next!=NULL)

     b=b->next;

   if(b->ISBN==n)

   {

     printf("请输入要修改图书的全部信息 ");

     printf("书名 作者 出版社 出版时间 价格 图书编号 分类 是否在架 借阅次数: ");

     scanf("%s %s %s %s %d %d %s %d %d",

        a,b,c,d,&b->price,&b->ISBN,b->category,

        &b->condition,&b->borrowednum);

     strcpy(b->name,a);

     strcpy(b->author,au);

     strcpy(b->pubcompany,c);

     strcpy(b->pubdate,d);

   }

   else

     printf("无此图书 ");

}

/*

函数功能:用户充值

*/

/*

函数功能:用户充值

*/

void recharge(struct readerinf *p)                

{

   int n,m;

   printf("请输入要充值用户的ID ");

   scanf("%d",&n);

   while(p->ID!=n&&p->next!=NULL)

     p=p->next;

   if(p->ID==n)

   {

     printf("请输入要充值数额 ");

     scanf("%d",&m);

     p->balance=p->balance+m;

     printf("充值成功! ");

   }

   else

     printf("无此用户 ");

}

/*以下是对读者模块函数使用的定义*/

/*

函数功能:读者登陆

输出参数:1--登陆成功,0--返回上层

函数流程:

    1.打开用户信息文件,存至链表

   2. 输入用户名,若返回上层输入4

   3. 若有这个用户,则继续输入密码。密码正确则返回1,

   4. 否则继续输入。

*/

struct readerinf * loadthree()                

{

   int i=0,j=1,n=0;

   char c;

   struct readerinf *p;

   head1=creat();

   p=head1;

   printf("返回上层请按4 ");

   printf("请输入用户ID ");

   scanf("%d",&n);

   if(fh1==n)

     return(NULL);

   while(p->ID!=n&&p->next!=NULL)

     p=p->next;

   if(p->ID==n)

   {

     printf("请输入密码 ");

     while(n!=j)

     {

        n=0;

        for(j=0;p->secretnum[j]!='';)

        {

          c=getch();

          if(p->secretnum[j]==(c-20)*2)

             n++;

          j++;

        }

        if(n!=j)

          printf("您输入的密码有误 ");

     }

     return(p);

   }

   else

   {

     printf("用户不存在 ");

     return(NULL);

   }

   }

/*

函数功能:读者选择对应功能,进行操作

*/

void operation()                                  

{

   int choice=0;                                /*p1为读者登录后对应的指针*/

   while(choice!=fh1)

   {

     printf("+++++++++++++++++++++++++++++++++++++++++ ");

     printf("借书请按1 ");

     printf("续借请按2 ");

     printf("还书请按3 ");

     printf("返回请按4 ");

     printf("查寻图书请按5 ");

     printf("修改读者信息请按6 ");

     scanf("%d",&choice);

     switch (choice)

     {

     case 1:head2=begin();borrowbook(head2,p1);storagebook(head2);break;

     case 2:renewbook(p1);break;

     case 3:returnbook(p1);break;

     case 4:choice=4;break;

     case 5:head2=begin();checkbook(head2);storagebook(head2);break;

     case 6:rewritereader(p1);break;

     default : printf("没有对应的系统指令,请查证重输 ");break; 

     }

   }

   storagereader(head1);/*如果参数为p1则会出错,head1在loadthree()中已经被赋值*/

}

/*

函数功能:读取图书文件中的信息,存至链表中

输出参数:head--链表头指针

函数流程:

    1.打开文件

   2.文件没有结束则读取文件信息并存至链表

   3.文件结束则返回头指针

*/

struct bookinf *begin(void)                        

{  

   struct bookinf *head;

   pb=fopen("book.txt","r+");

   if(pb==NULL)

   {

     printf("不能打开文件 ");

     exit(0);

   }

   if(pb==-1)

     head=NULL;

   else

   {

     b2=(struct bookinf*)malloc(LON);

     fscanf(pb,"%s %s %s %s %d %d %s %d %d",

        b2->name,b2->author,b2->pubcompany,b2->pubdate,&b2->price,

        &b2->ISBN,b2->category,&b2->condition,&b2->borrowednum);

     head=b2;

     while(!feof(pb))

     {

        b1=(struct bookinf*)malloc(LON);

        fscanf(pb,"%s %s %s %s %d %d %s %d %d",

           b1->name,b1->author,b1->pubcompany,b1->pubdate,&b1->price,

          &b1->ISBN,b1->category,&b1->condition,&b1->borrowednum);

        b2->next=b1;

        b2=b1;

     }

     b2->next=NULL;

     fclose(pb);

   }

   return(head);

}

/*

函数功能:借书

输入参数:b1--图书头指针,p--登陆后读者指针

函数流程:

1.读取系统时间

   2.判断读者类型

   3.若为学生可以借10本,教师可以借30本

   4.判断所借图书数是否到达上限

   5.若没有则输入要借图书ISBN,否则不允许借

   6.查找图书

   7.若有该书则借阅,若没有则告诉读者没有该书

*/

void borrowbook(struct bookinf *b1,struct readerinf *p)                /*借书*/

{

   struct bookinf *b;

   int n,m;

   struct tm *t;

   time_t tt;

   time(&tt);

   t=localtime(&tt);

   tt=mktime(t);

   b=b1;

   if(strcmp(p->type,"学生")==0)

   {

     if(p->bornum<10)

     {

        printf("请输入要借图书的ISBN ");

        scanf("%d",&n);

        while(b->ISBN!=n&&b->next!=NULL)

          b=b->next;

        if(b->ISBN==n)

        {

          if(b->condition=1)

           {

             b->condition=0;

             b->borrowednum++;

             m=p->bornum;

             p->bornum++;

             p->b[m].book=n;

             p->b[m].tim=tt+2592000;

p->b[m].outday=t->tm_mday;

             if(t->tm_mon+1==12)

             {

               p->b[m].outyear=(t->tm_year+1901);

               p->b[m].outmonth=1;

             }

             else

             {

               p->b[m].outyear=(t->tm_year+1900);

               p->b[m].outmonth=t->tm_mon+2;

             }

             printf("借阅成功! ");

          }

          else

             printf("该图书已经被借 ");

        }

        else

          printf("无此图书 ");

     }

     else

        printf("您的借书书已达上限,不能再借 ");

   }

   else

   {

     if(p->bornum<30)

     {

        printf("请输入要借图书的ISBN ");

        scanf("%d",&n);

        while(b->ISBN!=n&&b->next!=NULL)

          b=b->next;

        if(b->ISBN==n)

        {

          if(b->condition=1)

          {

             b->condition=0;

             b->borrowednum++;

             m=p->bornum;

p->bornum++;

             p->b[m].book=n;

             p->b[m].outday=t->tm_mday;

             p->b[m].tim=tt+2592000*5;

             if(t->tm_mon+1>7)

             {

               p->b[m].outyear=t->tm_year+1901;

               p->b[m].outmonth=(t->tm_mon-6);/*经过数学推导得到的公式*/

             }

             else

             {

               p->b[m].outyear=t->tm_year+1900;

               p->b[m].outmonth=t->tm_mon+6;

             }

             printf("借阅成功! ");

          }

          else

             printf("该图书已经被借 ");

        }

        else

          printf("无此图书 ");

     }

     else

        printf("您的借书书已达上限,不能再借 ");

   }

}

/*

函数功能:续借

输入参数:p--登陆后读者指针

函数流程:

    1.读取系统时间

   2.判断读者类型

   3.若为学生则超期时间加1个月份,教师则超期时间加5个月份

   4.输入要续借图书ISBN号

   5.查找该图书

   6.若找到,则按3处理。

   7.否则输出“未借此书”

*/

void renewbook(struct readerinf *p)                 

{

   int n,d;

   time_t tt;

   struct tm *t;

   struct bookinf *b;

   b=begin();

   time(&tt);

   t=localtime(&tt);

   tt=mktime(t);

   if(strcmp(p->type,"学生")==0)

   {

     printf("请输入要续借借图书的ISBN ");

     scanf("%d",&n);

     for(d=0;p->b[d].book!=n&&d<p->bornum;d++);

     while(b->ISBN!=n&&b->next!=NULL)

        b=b->next;

     if(p->b[d].book==n)

     {

        if(b->condition==0)

        {

          b->condition=2;

          p->outdatenum--;

          if(p->b[d].outmonth==12)

          {

             p->b[d].outyear++;

             p->b[d].outmonth=1;

          }

else

             p->b[d].outmonth++;

          p->b[d].tim=tt+2592000;

          printf("续借成功! ");

        }

        else

          printf("已经续借过一次不能再借 ");

     }

     else

        printf("未借此图书 ");

   }

   else

   {

     printf("请输入要续借借图书的ISBN ");

     scanf("%d",&n);

     for(d=0;p->b[d].book!=n&&d<p->bornum;d++);

     while(b->ISBN!=n&&b->next!=NULL)

        b=b->next;

     if(p->b[d].book==n)

     {

        if(b->condition==0)

        {

          b->condition=2;

          if(p->b[d].outmonth>7)

          {

             p->b[d].outyear++;

             p->b[d].outmonth-=7;/*经过数学推导得到的公式*/

          }

          else

             p->b[d].outmonth+=5;

          p->b[d].tim=tt+2592000*5;

          printf("续借成功! ");

        }

        else

           printf("已经续借过一次不能再借 ");

     }

     Else

else

        printf("未借此图书 ");

   }

/*

函数功能:还书

输入参数:p--读者登陆后对应指针

函数流程:

    1.输入要还图书ISBN

   2.查找该图书

   3.若借了该书被借图书数减1,并判断是否超期

   4.若超期则使超期图书数减1

   5.调整被借图书数组b[30];

   6.若没借该书,则输出“未借此图书”

*/

void returnbook(struct readerinf *p)                

{

   int n,d,m;

   struct tm *t;

   struct bookinf *b;

   time_t tt;

   b1=b=begin();

   time(&tt);

   t=localtime(&tt);

   printf("请输入要还图书的ISBN ");/*因为有些书的数目不为一,防止出错*/

   scanf("%d",&n);

   for(d=0;p->b[d].book!=n&&d<p->bornum;d++);

   while(b->ISBN!=n&&b->next!=NULL)

     b=b->next;

   if(p->b[d].book==n)

   {

     b->condition=1;        /*若满足上述条件,该书肯定存在*/

     p->bornum=p->bornum-1;

   if((t->tm_year+1900+(t->tm_mon+1)/12.0)==(p->b[d].outyear+(p->b[d].outmonth)/12.0))  /*调整超期图书数*/

     {

        if(p->b[d].outday<t->tm_mday)

          p->outdatenum--;

}

   if((t->tm_year+1900+(t->tm_mon+1)/12.0)>(p->b[d].outyear+(p->b[d].outmonth)/12.0))

        p->outdatenum--;

     m=p->bornum;

     for(;d<m;d++)      /*调整被借图书数组*/

     {

        p->b[d].book=p->b[d+1].book;

        p->b[d].outday=p->b[d+1].outday;

            p->b[d].outmonth=p->b[d+1].outmonth;

        p->b[d].outyear=p->b[d+1].outyear;

        p->b[d].tim=p->b[d+1].tim;

     }

     p->b[m].book=0;

     p->b[m].outday=0;

     p->b[m].outmonth=0;

     p->b[m].outyear=0;

     p->b[m].tim=0;

      printf("还书成功! ");

   }

   else

     printf("未借此图书 ");

   storagebook(b1);

}

/*

函数功能:查找图书

*/

void checkbook(struct bookinf *b)                 

{

   char a[31],n=0;

   printf("请输入要查找图书的书名:");

   scanf("%s",a);

   while(b!=NULL)/*因为有某本书的数目大于1的情况*/

   { 

     if(strcmp(b->name,a)==0)

     {

        printf("书名 作者 出版社 出版时间 价格 图书编号 图书分类 是否在架 借阅次数 ");

        printf("%s %s %s %s %d %d %s %d %d ",

printf("%s %s %s %s %d %d %s %d %d ",

          b->name,b->author,b->pubcompany,

          b->pubdate,b->price,b->ISBN,

          b->category,b->condition,b->borrowednum);

        n=1;

     }

     b=b->next;

   }

   if(n==0)

     printf("无此图书 ");

}

/*

函数功能:修改读者信息

*/

void rewritereader(struct readerinf *p3)           

{

   struct readerinf *p;

   char a[30],b[4],c[20],d[20],e[10];

   long int n;

   p=p3;

   printf("请输入所要修改的信息 ");

   printf("姓名 性别 出生年月 学院 密码 学号: ");/*按实际情况读者只能修改一部分信息*/

   scanf("%s %s %s %s %s %s %d",a,b,c,d,e,&n);

   strcpy(p->name,a);

   strcpy(p->sex,b);

   strcpy(p->birthday,c);

   strcpy(p->college,d);

   strcpy(p->secretnum,e);

   p->ID=n;

}

/*

函数功能:将链表中的图书信息存至文件

*/

void storagebook(struct bookinf *b)               

{

   int n=1;

   pb=fopen("book.txt","w+");

pb=fopen("book.txt","w+");

   while(b!=NULL)

   {

     if(n!=1)

        fprintf(pb," ");

     fprintf(pb,"%s %s %s %s %d %d %s %d %d",

        b->name,b->author,b->pubcompany,

        b->pubdate,b->price,b->ISBN,

        b->category,b->condition,b->borrowednum);

     n++;

     b1=b;

     b=b->next;

     free(b1);

   }

   fclose(pb);

}

/*

函数功能:超期罚款函数

函数流程:

    1.调用函数打开文件

    2.读取系统时间

   3.若图书到期,将tt赋值给p->b[i].tim,超期图书数加1

   4.若图书超期,将tt赋值给p->b[i].tim,根据公式p->balance-=(tt-p->b[i].tim)/864000罚款

   5.调用函数,存储信息

*/

/*最好系统每天都能运行一次,如果在图书超期后才运行系统,则用户余额会出现一些小问题。

按实际情况不会时隔那么久才再次运行系统,故此隐性问题忽略*/

void fine()                    

{

   int i;

   struct readerinf *p,*p2;

   struct tm *t;

   time_t tt;

   time(&tt);

   t=localtime(&tt);

   p2=creat();

   p=p2;

tt=mktime(t);

   while(p!=NULL)

   {

     for(i=0;i<p->bornum;i++)

     {

     if((t->tm_year+1900+(t->tm_mon+1)/12.0)==(p->b[i].outyear+(p->b[i].outmonth)/12.0))

        {

          if(t->tm_mday==p->b[i].outday)/*到期了*/

          {

             p->outdatenum++;

             p->b[i].tim=tt;

          }

          if(t->tm_mday>p->b[i].outday)/*超期了*/

          {

             p->balance-=(tt-p->b[i].tim)/864000;

             p->b[i].tim=tt;

          }

        }

     if((t->tm_year+1900+(t->tm_mon+1)/12.0)>(p->b[i].outyear+(p->b[i].outmonth)/12.0))/*超期了*/

        {

          p->balance-=(tt-p->b[i].tim)/864000;

          p->b[i].tim=tt;

        }

     };

     p=p->next;

   }

   storagereader(p2);

}

/*

函数功能:统计最受喜欢图书

*/

void statistic()                                   

{

   int n=0;                                       

   struct bookinf *b,*b1,*bhead;

   bhead=b=begin();

   while(b!=NULL)

{

     for(i=0;i<p->bornum;i++)

     {

     if((t->tm_year+1900+(t->tm_mon+1)/12.0)==(p->b[i].outyear+(p->b[i].outmonth)/12.0))

        {

          if(t->tm_mday==p->b[i].outday)/*到期了*/

          {

             p->outdatenum++;

             p->b[i].tim=tt;

          }

          if(t->tm_mday>p->b[i].outday)/*超期了*/

          {

             p->balance-=(tt-p->b[i].tim)/864000;

             p->b[i].tim=tt;

          }

        }

     if((t->tm_year+1900+(t->tm_mon+1)/12.0)>(p->b[i].outyear+(p->b[i].outmonth)/12.0))/*超期了*/

        {

          p->balance-=(tt-p->b[i].tim)/864000;

          p->b[i].tim=tt;

        }

     };

     p=p->next;

   }

   storagereader(p2);

}

/*

函数功能:统计最受喜欢图书

*/

void statistic()                                   

{

   int n=0;                                       

   struct bookinf *b,*b1,*bhead;

   bhead=b=begin();

   while(b!=NULL)

   {

     if(b->borrowednum>n)

{

        n=b->borrowednum;/*记录最受欢迎图书的被借次数和地址*/

        b1=b;

     }

     b=b->next;

   }

   printf("以下是最受喜欢的图书的信息: ");

   printf("书名    作者    出版社     出版时间   价格  分类 借阅次数 ");

   printf("%s %s %s %s %d %s %d ",

     b1->name,b1->author,b1->pubcompany,

     b1->pubdate,b1->price,b1->category,n);

   storagebook(bhead);

}

/*因为考虑某本书的数目大于1的情况实在复杂,认为ISBN号不同即为不同的图书*/

原文地址:https://www.cnblogs.com/Abby0418/p/4646425.html