c语言图书管理系统课程设计报告

沈航北方科技学院

课程设计说明书

      课程名称   c语言课程设计   

              机械工程系     

专    业     数控    

班    级     B042111     

学    号     B04211123    

          学生姓名    田文      

指导教师    赵小磊      _

                                                    

20##年6月

链表实现图书信息操作

田文

目录

摘  要........................................................................................................................... 1

1绪论............................................................................................................................ 1

2系统分析................................................................................................................... 1

2.1 功能需求............................................................................................................. 1

2.2数据需求.............................................................................................................. 2

2.3 性能需求............................................................................................................. 2

3总体设计................................................................................................................... 2

3.1功能模块设计...................................................................................................... 2

3.2系统设计方案...................................................................................................... 6

4详细设计................................................................................................................... 7

4.1登录模块.............................................................................................................. 7

4.2借书管理模块...................................................................................................... 8

4.3还书管理模块...................................................................................................... 9

5调试与测试............................................................................................................. 10

5.1 调试................................................................................................................... 10

5.2 测试.................................................................................................................... 11

6结论.......................................................................................................................... 12

结束语......................................................................................................................... 12

参考文献.................................................................................................................... 12

附录1-用户手册(另起一页)........................................................................... 13

附录2-源程序(另起一页)............................................................................... 15

摘  要

经过对程序设计题目的分析可知,整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是:图书信息输入函数input(),借阅图书函数(borrow),增加删除图书函数(adddelet),图书查询函数(search),以及归还图书信息函数(giveback)。在这些函数当中,这四个函数的实现严格按照题目的要求。

1、     图书信息输入函数 主要功能是从键盘输入图书信息并将其写入文件中,作为图书馆的书库,以便对下面的函数进行运行,此函数是基础.

2、     图书借阅函数  主要借阅图书的功能和录入学生应该还书的时间;

3、     图书归还函数 主要实现借阅图书后,归还图书的功能,并把应该还书的时间和实际还书的时间进行比较过期时输出学生的信息,也是该程序的的一个重点

4、     增加删除图书函数   实现的功能是实现对图书的删除;

5、     图书查询函数  允许按照图书编号,书名,作者,出版社进行查询,并将查询信息输出;

6、     退出函数   该函数主要实现退出运行界面的功能.

除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。

每一个图书记录都包含:图书编号,名称,出版社,作者,现有数量和总量在程序当中,将图书记录类型定义为结构体类型,并把它写入d:\\liuyan.txt中,其他函数每次对图书记录的访问,其数据来源都是d:\\liuyan.txt文件,这样做不但可以保证图书数据的一致性,而且可以对图书数据进行永久保存,保证每次运行程序都可以采用原来的数据。

1绪论

整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是:图书信息输入函数input(),借阅图书函数(borrow),增加删除图书函数(adddelet),图书查询函数(search),以及归还图书信息函数(giveback)。在这些函数当中,这四个函数的实现严格按照题目的要求。

2系统分析

2.1 功能需求

设计一个通过链表实现对图书信息进行管理的程序,要求完成以下功能:

  1. 建立一个链表,每个结点应包含以下信息:图书号、书名及出版社、价格、ISBN、作者、册数;
  2. 将输入信息按图书号进行从小到大的排序;
  3. 实现查询功能——输入书名,查询输出相关信息;
  4. 实现插入功能——输入图书信息并插入有序链表中;
  5. 实现删除功能——输入书名或书号,可将其信息从链表中删除;
  6. 统计链表中图书总价值,并在屏幕上输出;
  7. 统计该链表中价值超过某一数目的图书总数,并在屏幕上输出。

8. 有界面友好易于使用的菜单。

2.2数据需求

需要向系统输入图书号、书名及出版社、价格、ISBN、作者、册数

2.3 性能需求

在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。

3总体设计

3.1功能模块设计

根据分析整个系统主要划分为4个功能模块,分别执行要求中的功能。该系统需要有添加,删除,查询,修改,累加,循环显示主菜单,保存信息功能,能将会员卡进行注销,利用显示函数将会员卡内所有信息显示。要求有循环显示菜单工能。功能模块图如图1所示。(1)输入读者

输入相关读者信息至内存中;

(2) 输入书籍

输入书籍号,对已存的书籍信息进行查询;

(3) 书籍管理模块

输入相应代码,对相关信息进行查询;

(4) 退出管理模块

主菜单中输入0退出系统登录;

1图书管理系统流程图

2 管理员版图书管理系统流程图

3 图书查询主界面流程图

 

3.2系统设计方案

设计一个总菜单,1登录信息,2查询管理,3书籍管理系统,4退出系统。基本功能的实现都将体现在这几个菜单选项中。

struct reader *next;

}RD;

BK *h_book;

RD *h_reader;

void Login();              /*登陆*/

int Menu();                /*主菜单*/

void Menu_select();        /*主菜单选择函数*/

void Init();               /*初始化*/

void Init_reader();       /*初始化读者*/

void Init_book();         /*初始化图书*/

void Insert_New_Book();    /*新书入库*/

int Find();                /*查找菜单*/

void Find_Select();       /*查找菜单选择函数*/

void Find_Reader();       /*查找读者信息*/

void Find_Book();         /*查找图书信息*/

void Print_reader();      /*打印读者信息*/

void Print_book();        /*打印图书信息*/

void Borrow_Book();        /*借书函数*/

void Return_Book();        /*还书函数*/

void Save();               /*保存信息*/

void Save_Reader();       /*保存读者信息*/

void Save_Book();         /*保存图书信息*/

void Load();               /*加载信息*/

void Load_Reader();       /*加载读者信息*/

void Load_Book();         /*加载图书信息*/

void Login()/*登陆*/

{

system("cls");

printf("\n\n\n\t\t\t欢迎登陆本系统\n");

printf("\n\n\t\t      系统版权所有\n\n\n\n\n\n\n");

printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");

getchar(); system("cls");

}

int Menu() /*主菜单*/

{ int sn;

printf("\n\t\t图书管理系统主菜单\n");

printf("=================================================\n");

printf("*\t0----退出系统     *\n");

printf("*\t1----新书入库     *\n");

printf("*\t2----   查询      *\n");

printf("*\t3----借书登记     *\n");

printf("*\t4----还书管理     *\n");

printf("=================================================\n");

printf("请选择相应代码:");

4详细设计

4.1登录模块

图4:输入读者信息

图5:输入书籍信息

4.2借书管理模块

主菜单中输入读者和书籍信息后,对已存的书籍进行借阅,程序流程如图4所示。

图6 借书模块流程图

4.3还书管理模块

对于已还书籍进行管理,程序流程如图4所示。

图7 还书模块流程图

5调试与测试

5.1 调试

调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。调试的任务是及时改正测试过程中发现的软件错误。具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。然后仔细研究推断代码以确定问题的原因,并设法改正。

调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。本系统调试过程中遇到问题、原因和解决方法如下面介绍。

(1)  程序只能在当前运行时才能实现自动生成书籍信息,而关闭系统再次打开添加新读者又从0开始与之前的读者重复,导致借还信息程序管理混乱,无法正确运行。

原因:在执行后系统没有记录当前的读者信息,因为读者信息自动按1、2、3、4依次递增生成系统;应该记录最后所生成的读者信息,在下次运行程序时系统会接着上次记录的读者信息自动依次生成。

(2)       运行完程序一次有错误提醒

原因:上次运行程序后没有关闭操作界面当点击编译时会有一个错误提示,解决方法:将上一次运行时的操作界面关闭。

(3)设计过程中的想法与程序中的不足

总的来说这个程序大致实现了题目的要求,但是这套程序仍然存在着很多的问题与不足。比如,程序中主函数写的有点繁琐,有太多的嵌套,不是那么井然有序,条理清晰,程序注释也不是很完善,对信息处理功能还有些不足之处,提示信息不明确。还有就是没能做到模糊查询。

这个系统主要是参照课本手机通讯录模版编写的,同时也得到了老师和同学的一些帮助。我在做系统的过程中也遇到了很多问题,有的是知识不足,有的是考虑不够周全。事实证明,只靠自己的知识面还是很窄,独立处理问题能力不是很强,以后还要加强对c语言的学习。

我认为对于C语言编写的程序来说,使用方法大致都是一样的,所以如果要改进的话,就是要改进一些算法,尽量把界面编写清楚,提示信息全面,方便易用。

5.2 测试

软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了错误,然而付出了过高的代价。

测试数据过程如下。

(1) 登陆功能测试

输入数据1:读者编号:23,读者姓名:tianwen,书籍编号:01,书名:xyz作者:xxx,数量:10

预期结果:数据输入到系统中;

运行结果:出现图书管理系统主菜单

说明:登陆功能实现

(2) 借书功能测试

。。。

(3) 还书功能测试

。。。

6结论

计算机综合训练顺利完成,任务书中所提出的要求全部实现,可以对会员信息进行添加、修改、删除以及按各种信息查找,可将会员本次消费金额累加到会员卡上,能够自动生成会员卡号并且将各种信息保存到文本文件中。不过这个程序还有些不够完善,例如:在添加新会员时当会员信息全部输入之后系统中的全部会员信息自动显示,这样非常占用操作界面,使操作不是十分清晰;再一个就是系统无法正确识别身份证号和电话好码只能靠会员卡管理员的认真细心才能减少出错,改进方式:调用一个可以判断号码位数的函数,如果输入位数不合法则提出警告重新输入。

结束语

在这一个星期的实践中,通过编写这个图书管理系统,我体会到了c语言学习的实用性。将理论和实践结合在一起,用先进的计算机工具方便人们的生活。C语言程序的编写首先要从大局考虑,把自己编写整个程序的思想都写在草稿上,这样有助于自己编写程序,在编写时要完善注释,方便其他人理解程序。编写的程序从理论上来说并没有错,但一上机就问题不断。甚至有些课本上的知识照搬不变,也不能得到正确的结果。有时一个程序改了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单的程序题,在调试时却屡屡出错。经反复的修改后,结果正确了,这时所有的乏味都显得那么无力,一切都是值得的。

我认为,开发一套系统,最重要的是细心,并且思考要全面,结合实际,充分考虑到客户的需求和现实意义。不管什么系统,只用运用到实际应用中,才具有现实意义。 所以c语言程序的实用性很强,我们以后还要更加努力认真地学习编程语言。

参考文献

附录1-用户手册

点击运行,首先出现的是菜单界面,选择菜单选项进行操作,可进行如图8所示。

系统主界面(选择数字进入,退出系统)

8 菜单界面

选择1进入系统,然后出现功能菜单9 登陆功能

输入读者和书籍,然后出现功能菜单;

10 图书管理系统主菜单

附录2-源程序

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define Max 3    

typedef struct book

{

char book_num[10];

char book_name[20];

char book_writer[10];

int book_kc;

int book_xy;

struct book *next;

}BK;

typedef struct borrow

{

char borrow_book_num[10];

char limit_date[8];

}BO;

typedef struct reader

{

char reader_num[10];

char reader_name[10];

int right;

BO borrow[Max];

struct reader *next;

}RD;

BK *h_book;

RD *h_reader;

void Login();              /*登陆*/

int Menu();                /*主菜单*/

void Menu_select();        /*主菜单选择函数*/

void Init();               /*初始化*/

void Init_reader();       /*初始化读者*/

void Init_book();         /*初始化图书*/

void Insert_New_Book();    /*新书入库*/

int Find();                /*查找菜单*/

void Find_Select();       /*查找菜单选择函数*/

void Find_Reader();       /*查找读者信息*/

void Find_Book();         /*查找图书信息*/

void Print_reader();      /*打印读者信息*/

void Print_book();        /*打印图书信息*/

void Borrow_Book();        /*借书函数*/

void Return_Book();        /*还书函数*/

void Save();               /*保存信息*/

void Save_Reader();       /*保存读者信息*/

void Save_Book();         /*保存图书信息*/

void Load();               /*加载信息*/

void Load_Reader();       /*加载读者信息*/

void Load_Book();         /*加载图书信息*/

void Login()/*登陆*/

{

system("cls");

printf("\n\n\n\t\t\t欢迎登陆本系统\n");

printf("\n\n\t\t      系统版权所有\n\n\n\n\n\n\n");

printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");

getchar(); system("cls");

}

int Menu() /*主菜单*/

{ int sn;

printf("\n\t\t图书管理系统主菜单\n");

printf("=================================================\n");

printf("*\t0----退出系统     *\n");

printf("*\t1----新书入库     *\n");

printf("*\t2----   查询      *\n");

printf("*\t3----借书登记     *\n");

printf("*\t4----还书管理     *\n");

printf("=================================================\n");

printf("请选择相应代码:");

for(;;)

{ scanf("%d",&sn);

   fflush(stdin);

   if(sn<0||sn>4)

      printf("\n错误!请重新输入:");

   else break;

}

return sn;

}

void Menu_select()/*主菜单选择函数*/

{

for(;;) /*循环调用模式,保证能进行重复操作*/

{

switch(Menu()) /*功能选择*/

{ case 0:

     system("cls");/*清楚屏幕先前的显示内容*/

     Save();

printf("\n\n\t文件保存成功!\n");

printf("\n\n\t欢迎下次使用本系统!\n");

   getchar();

exit(0);

   case 1:Insert_New_Book();break;

   case 2:Find_Select();break;

   case 3:Borrow_Book();break;

   case 4:Return_Book();break;

   default:printf("\n错误!");exit(0);

   }

}

}

void Init() /*初始化*/

{

   Init_reader();

   Init_book();

}

void Init_reader() /*初始化读者信息*/

{

    RD *p0;

    int i;

    printf("\n读者初始化开始,请输入读者信息..\n包括编号.姓名..\n");

    p0=(RD*)malloc(sizeof(RD));

    h_reader=p0;

    printf("\n请输入读者的信息:\n");

    printf("ReaderNo.:");            /*输入读者编号(唯一)*/

    scanf("%s",p0->reader_num);

    printf("ReaderName:");           /*输入读者姓名(不唯一)*/

    scanf("%s",p0->reader_name);

    p0->right=0;

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

    {

strcpy(p0->borrow[i].borrow_book_num,"0"); /*所借图书直接置为0(即没有借书)*/

     strcpy(p0->borrow[i].limit_date,"0");

     }

      p0->next=NULL;

     printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n");

   getchar();

      system("cls");

}

void Init_book() /*初始化图书信息*/

{

BK *p0;

printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");

p0=(BK*)malloc(sizeof(BK));

h_book=p0;

   printf("\n请输入图书信息:\n");

   printf("BookNo.:");            /*输入图书编号(唯一)*/

    scanf("%s",p0->book_num);

   printf("BookName:");           /*输入图书名称*/

    scanf("%s",p0->book_name);

printf("BookWriter:");           /*输入图书作者*/

    scanf("%s",p0->book_writer);

   printf("Number:");             /*输入图书数量*/

    scanf("%d",&p0->book_kc);

     p0->book_xy=p0->book_kc;     /*开始时图书现有量和库存量相等*/

    p0->next=NULL;

   printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");

   getchar();

      system("cls");

}

void Insert_New_Book()/*新书入库*/

{

BK *p,*p0,*p1;

p=p1=h_book;

printf("\n新书入库模块...\n");

printf("\n请输入新书信息..\n包括书号.书名.数量..\n");

p0=(BK *)malloc(sizeof(BK));

   printf("BookNo.:");

    scanf("%s",p0->book_num);

    while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)

     p1=p1->next;

    if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/

    {

     printf("\n此编号图书已存在!!直接入库!\n");

           printf("Number:");

        scanf("%d",&p0->book_kc);

     p1->book_kc+=p0->book_kc;

    p1->book_xy+=p0->book_kc;

    }

    else/*若不存在,则需要输入其他的信息 ,然后在进行插入操作*/

    {

printf("BookName:");

     scanf("%s",p0->book_name);

printf("BookWriter:");

     scanf("%s",p0->book_writer);

     printf("Number:");

     scanf("%d",&p0->book_kc);

while(p->next)

    {

      p=p->next;

    }

     if(h_book==NULL) h_book=p0;   /*此处分两种情况,链表中没有数据,head直接指向p0处*/

     else p->next=p0;               /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/

     

p0->next=NULL;

    p0->book_xy=p0->book_kc;

   }

    printf("\n新书入库完毕!按任意键继续下一步操作..\n");

   getchar();

      system("cls");

}

int Find() /*查找菜单*/

{

int sn;

printf("\n\t\t信息查询菜单\n");

printf("=================================================\n");

printf("*\t0----返回上级                    \t*\n");

printf("*\t                                 \t*\n");

printf("*\t1----查找图书     2----查找读者 \t*\n");

printf("*\t                                 \t*\n");

printf("*\t3----打印图书     4----打印读者 \t*\n");

printf("=================================================\n");

printf("请选择相应代码:");

for(;;)   /*循环调用模式,保证能进行重复操作*/

{

   scanf("%d",&sn);

   fflush(stdin);

   if(sn<0||sn>4)

    printf("\n错误!请重新输入:");

   else break;

}

   return sn;

}

void Find_Select() /*查找菜单选择函数*/

{

system("cls");

for(;;)           /*循环调用模式,保证能进行重复操作*/

{

   switch(Find()) /*功能选择*/

{

   case 0:system("cls"); Menu_select(); break;

   case 1:Find_Book();break;

   case 2:Find_Reader();break;

   case 3:Print_book();break;

   case 4:Print_reader();break;

    default:printf("\n错误!");exit(0);

   }

}

}

void Find_Reader() /*查找读者信息*/

{

RD *p;

int i;

char find_reader[10];

p=h_reader;

printf("\n读者信息查询模块\n");

printf("\n请输入你要查询读者编号:");

scanf("%s",find_reader);

while(strcmp(p->reader_num,find_reader)!=0&&p->next)

   p=p->next;

if(strcmp(p->reader_num,find_reader)==0)

{

    printf("\n读者编号:%s的信息为:\n",find_reader);

    printf("ReaderNo.\tReaderName"); /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/ 

     printf("\n");

printf("\t%s\t\t%s",p->reader_num,p->reader_name);

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

{

   printf("\n");

   printf("BorrowBookNum%d",i+1);

   printf("\tReturn%dLimitDate",i+1);

   printf("\n");

      printf("\t%s",p->borrow[i].borrow_book_num);

   printf("\t\t%s",p->borrow[i].limit_date);

}

   printf("\n");

}

else

   printf("\n此读者编号不存在,请核对!按任意键返回...");

getchar();

system("cls");

}

void Find_Book() /*查找图书信息*/

{

BK *p;

char find_book[10]; /*功能很简单,读者编号唯一,查找只须一次遍历*/

p=h_book;

printf("\n图书信息查询模块\n");

printf("\n请输入你要查询图书编号:");

scanf("%s",find_book);

while(strcmp(p->book_num,find_book)!=0&&p->next)

   p=p->next;

if(strcmp(p->book_num,find_book)==0)  

/*找到了就打印,否则提示不存在,或出错*/

{

   printf("\n图书编号:%s的信息为:\n",find_book);

   printf("\nBookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");

   printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

}

   else

   printf("\n此图书编号不存在,请核对!按任意键返回...");

getchar(); system("cls");

}

void Print_reader()     /*打印读者信息*/

{

RD *p;

int i;

p=h_reader;

printf("\n读者信息如下:\n\n");

printf("ReaderNo.\tReaderName");   /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/

     printf("\n");

while(p!=NULL)   /*遍历链表一次就可以了*/

{

   printf("\t%s\t\t%s",p->reader_num,p->reader_name);

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

   {

   printf("\n");

   printf("BorrowBookNum%d",i+1);

   printf("\tReturn%dLimitDate",i+1);

   printf("\n");

      printf("\t%s",p->borrow[i].borrow_book_num);

   printf("\t\t%s",p->borrow[i].limit_date);

}

   printf("\n");

   p=p->next;

}

printf("\n读者信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Print_book() /*打印图书信息*/

{

BK *p;

p=h_book;

printf("\n图书信息如下:\n\n");

printf("BookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");

/*直接打印所有图书的信息,遍历链表一次就可*/

while(p!=NULL)

{

   printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

   p=p->next;

}

printf("\n图书信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Borrow_Book() /*借书模块*/

{

BK *p0; RD *p1;

char bo_num[10],rea_num[10],lim_date[8];

int i;

p0=h_book; p1=h_reader;

printf("\n借书模块...\n");

printf("\n请输入借书的读者编号:");   /*先输入借书的读者信息*/

scanf("%s",rea_num);

while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0)     /*遍历一次读者链表,判断读者是否存在*/

   p1=p1->next;

   if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0)      /*如果存在,则继续,不存在就、则提示错误!*/

    {

      printf("\n此读者编号不存在!按任意键返回..\n");

    goto END;

    }

   printf("\n请输入你要借的书的编号:");

   scanf("%s",bo_num);

   while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL)      /*遍历一次图书链表,判断此图书是否存在*/

    p0=p0->next;

     if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0)      /*如果存在,则继续,不存在就、则提示错误!*/

      {

       printf("\n此图书编号不存在!按任意键返回..\n");

      }

    else if(p0->book_xy<=0) /*判断此图书现在是否还有库存*/   

     {

      printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");

     }

   else if(p1->right>=Max) /*判断此读者借书权限是否已达最大*/

    {

      printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回....");

     }

     else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0)       /*此读者若已经借书,再判断此读者是否要借两本一样的书*/

     {

      for(i=0;i<Max;i++) /*遍历一次读者所借的书,如果发现有重复,则结束*/

       {

        if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)

         {

           printf("\n抱歉!同一个读者不能同借两本相同的书!\n");

     }

        else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0)     /*如果没有重复*/

           {

            printf("\n请输入你要归还图书的日期:");

             scanf("%s",lim_date);

             strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);     /*记录所借书号,并且借书数目加一,现存量减一*/

             strcpy(p1->borrow[p1->right-1].limit_date,lim_date);  

            p0->book_xy--;

             printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

           }

        }

     }

     else      /*此读者从未借过书*/

     {

       printf("\n请输入你要归还图书的日期:");

       scanf("%s",lim_date);

       strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);    /*记录所借书号,并且借书数目加一,现存量减一*/

       strcpy(p1->borrow[p1->right-1].limit_date,lim_date);

      p0->book_xy--;

       printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

     }

      END:getchar(); system("cls");

}

void Return_Book() /*还书模块*/

{

BK *p; RD *q;

int i,j,find=0;

char return_book_num[10],return_reader_num[10];

p=h_book; q=h_reader;

printf("\n还书模块...\n");

printf("\n请输入要还书的读者编号:");   /*基本同上*/

scanf("%s",return_reader_num);         /*注意:数组的输入没有&*/

while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)

    q=q->next;

if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)

   {

find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

    printf("\n此读者编号不存在!按任意键返回..\n");

     goto end;

   }

   printf("\n请输入读者还书的编号:");

    scanf("%s",return_book_num);

   while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)

         p=p->next;

   if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)

    {

    find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

      printf("\n错误!此图书编号不存在!按任意键返回..\n");

      goto end;

     }

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

    if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0)     /*如果此读者借了此书*/

      {

         find=1;   /*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

         for(j=i;j<Max-1;j++)

   {

            strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);

    strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);

   }

          strcpy(q->borrow[Max-1].borrow_book_num,"0");

   strcpy(q->borrow[Max-1].limit_date,"0");

          p->book_xy++;

          q->right--;

          printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);

       }

     if(find==0)      /*为什么有个find==0,因为遍历时循环Max次,如循环完毕还没有找到,则说明读者没有借此书,find用来保证只打印一次结果,否则每循环一次就会打印一个结果*/

      printf("\n错误!此读者未借此书!按任意键返回..\n");     /*如果遍历读者所借的书号,发现读者未借此书,则提示错误!*/

      end: getchar(); system("cls");

}

void Save() /*保存信息*/

{

Save_Reader();

Save_Book();

}

void Save_Reader()   /*保存读者信息*/

{

FILE *fp_reader;   /*创建文件型指针*/

RD *p,*p0;

p=h_reader;

if((fp_reader=fopen("Reader.dat","wb"))==NULL)   /*创建文件,进行保存*/

{

   printf("\n文件保存失败!\n请重新启动本系统...\n");

   exit(0);

}

while(p!=NULL)

{

   if(fwrite(p,sizeof(RD),1,fp_reader)!=1)   /*将链表中的信息写入文件中*/

    printf("\n写入文件失败!\n请重新启动本系统!\n");

   p0=p;

   p=p->next;

   free(p0); /*释放所有结点*/

}

h_reader=NULL;

fclose(fp_reader);    /*关闭文件*/

}

void Save_Book() /*保存图书信息*/

{

FILE *fp_book;     /*创建文件型指针*/

BK *p,*p0;

p=h_book;

if((fp_book=fopen("Book.dat","wb"))==NULL)      /*创建文件,进行保存*/

{

   printf("\n文件保存失败!\n请重新启动本系统...\n");

   exit(0);

}

while(p!=NULL)

{

   if(fwrite(p,sizeof(BK),1,fp_book)!=1)                /*将链表中的信息写入文件中*/

    printf("\n写入文件失败!\n请重新启动本系统!\n");

   p0=p;

   p=p->next;

   free(p0);

}

h_book=NULL;

fclose(fp_book);   /*关闭文件*/

}

void Load() /*加载信息*/

{

Load_Reader();

Load_Book();

}

void Load_Reader()   /*加载读者信息*/

{

   RD *p1,*p2,*p3;

   FILE *fp;           /*创建文件型指针*/

   fp=fopen("Reader.dat","rb");       /*打开文件*/

   p1=(RD *)malloc(sizeof(RD));

   fread(p1,sizeof(RD),1,fp);

   h_reader=p3=p2=p1;

   while(! feof(fp))   /*读出信息,重新链入链表*/

   { p1=(RD *)malloc(sizeof(RD));

      fread(p1,sizeof(RD),1,fp);

      p2->next=p1;

   p3=p2;

   p2=p1;

   }

   p3->next=NULL;

   free(p1);

   fclose(fp); /*关闭文件*/

}

void Load_Book() /*加载图书信息*/

{

BK *p1,*p2,*p3;

FILE *fp;            /*创建文件型指针*/

fp=fopen("Book.dat","rb");   /*打开文件*/

    p1=(BK *)malloc(sizeof(BK));

   fread(p1,sizeof(BK),1,fp);

    h_book=p3=p2=p1;

   while(! feof(fp))   /*读出信息,重新链入链表*/

   { p1=(BK *)malloc(sizeof(BK));

      fread(p1,sizeof(BK),1,fp);

      p2->next=p1;

   p3=p2;

   p2=p1;

   }

   p3->next=NULL;

    free(p1);

   fclose(fp);   /*关闭文件*/

}

void main()

{

    FILE *fp_book,*fp_reader;              /*创建文件型指针*/

     Login();

    if((fp_book=fopen("Book.dat","rb"))==NULL||(fp_reader=fopen("Reader.dat","rb"))==NULL)

      {

            Init();

       }

    else Load();

   Menu_select(); /*调用主菜单*/

}

相关推荐