1、 可查询读者姓名书证号,借了几本书,都是什么书和还书日期, 还可以借几本书。 h.退出: 退出读书管理系统并保存读者和图书信息。 设计的的初步思路:主要采取定义结构体,定义两个结构体分别为图书结构体和阅读者的结构体,将其数据存储到字符串中,然后逐个构建单链表,将其数据存储到单链表结点的数据域中,然后进行图书文件的读取或者可以选择图书的初始化,输入图书的编号,作者,书名,数量和一定的库存和现存量。新书入库创造新结点,定义指针,此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量,通过字符串的比较来判定,同理阅读者的添加是增加阅读者的单链表的结点,同时一个读者规定只能借阅5本书存储到数据域
2、的字符串中。分别定义还书和借书的函数,用字符串的比较功能判断读者借书不能同一种书借两次,同时采编新书要求如果书号相同只需要直接输入采编的本数和如果没有书时会返回等待新书到来,包括索书号以及读者的学号输入出现不存在会返回错误,还书函数也是通过字符串中存储的库存量和现存量增加,同时读者借书数量right减少。最后将图书的单链表和阅读者的单链表读写到文件中。三、问题求解的整体框架结构围绕求解目标给出具体的模块。1图书录入流程图: 2登记读者程图: N N Y Y3增添图书录入流程图: N Y4还书管理流程图: NN打印读者图书信息:四、 主要算法要求用自然语言描述算法。(1)首先首先定义图书,阅读者
3、,借书结构体;typedef struct book;typedef struct borrow;typedef struct reader;定义好各种说需要的数据:typedef struct book char book_num10;/图书编号 char book_name20;/图书名称 char book_writer10;/图书的作者 int book_xy;/现有量 int book_kc;/库存 struct book *next;BK;typedef struct borrowchar borrow_book_num10;/借书的总数char limit_date8;/还书日期
4、BO;typedef struct readerchar reader_num10;char reader_name10;int right;/读者所借的书的本数BO borrowMax;struct reader *next;RD;(1) 定义实现功能所需要的函数,包括图书的登记,读者的登记,图书的录用,以及读者的借阅,图书,读者信息的保存和读音等功能。int Menu();void Init();void Login();void Init_book();void Insert_New_Book();void Menu_select();void Find_Book();void add_
5、reader();void Print_reader();void Print_book();void Borrow_Book();void Return_Book();void Save();void Save_Book();void Save_Reader();void Load();void Load_Reader();void Load_Book();void Login()(3)通过字符串存储读者和图书的信息,然后进行图书文件的读取或者可以选择图书的初始化,输入图书的编号,作者,书名,数量和一定的库存和现存量。void Insert_New_Book()/*新书入库*/ BK *p,
6、*p0,*p1;p=p1=h_book;printf(n新书入库模块.n);n请输入图书信息.n包括书号.书名.数量.np0=(BK *)malloc(sizeof(BK); printf(图书编号: 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)=0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/ printf(n此编号图书已存在!直接入库!n图书数量:%d,&p0-book_kc); p1
7、-book_kc+=p0-book_kc;book_xy+=p0- else printf(图书名称:book_name);图书作者:book_writer);/库存数量while(p-next) p=p-if(h_book=NULL) h_book=p0; else p-next=p0;next=NULL; p0-book_xy=p0-n新书入库完毕!按任意键继续下一步操作.n getch(); system(clsvoid add_reader()/*添加读者*/ RD *p0; int i;n读者初始化开始,请输入读者信息.n包括书证号.姓名.np0=(RD*)malloc(sizeof
8、(RD);h_reader=p0;n请输入读者的信息:读者书证号:reader_num);读者姓名:reader_name);right=0; for(i=0;iborrowi.borrow_book_num,0 strcpy(p0-borrowi.limit_date,n读者信息初始化完毕!void Borrow_Book() /*借书模块*/ BK *p0; RD *p1;char bo_num10,rea_num10,lim_date8;int i;p0=h_book; p1=h_reader;n借书模块.nn请输入借书的读者书证号:scanf(,rea_num);while(p1-=N
9、ULL&strcmp(rea_num,p1-reader_num)!=0) if(p1-next=NULL&n此读者编号不存在!按任意键返回.n goto END; n请输入你要借的书的编号:,bo_num); while(strcmp(bo_num,p0-=NULL) p0=p0- if(p0-strcmp(bo_num,p0-n此图书编号不存在! else if(p0-book_xyrightMax|p1-right=Max) n不好意思,借书数目已满!不能借书! else if(strcmp(p1-borrow0.borrow_book_num,)! for(i=0;i+) if(str
10、cmp(p1-borrowi.borrow_book_num,bo_num)=0)n抱歉!同一读者不能同借两本相同的书!else if(strcmp(p1-)=0) n请输入你要归还图书的日期:,lim_date); strcpy(p1-borrowp1-right+.borrow_book_num,bo_num);right-1.limit_date,lim_date);book_xy-; p0-book_kc-;n读者编号%s借书完毕!按任意键继续下步操作.,p1-else right-1.limit_date ,lim_date ); END:getch(); void Return_B
11、ook() /*还书模块*/ BK *p; RD *q;int i,j,find=0;char return_book_num10,return_reader_num10;p=h_book; q=h_reader;n还书模块.nn请输入要还书的读者编号:,return_reader_num);while(q-strcmp(return_reader_num,q- q=q-if(q-=0) find=2; goto end;n请输入读者还书的编号:,return_book_num); while(p-strcmp(return_book_num,p- p=p- if(p-n错误!此图书编号不存在
12、! if(strcmp(return_book_num,q-borrowi.borrow_book_num)=0) /*如果此读者借了此书*/ find=1; for(j=i;jborrowj.borrow_book_num,q-borrowj+1.borrow_book_num); strcpy(q-borrowj.limit_date,q-borrowj+1.limit_date);borrowMax-1.borrow_book_num,borrowMax-1.limit_date, p-book_xy+; p-book_kc+; q-right-;n编号%s的读者已完毕! if(find
13、=0) 此读者未借此书! end:void Print_book() /*查询图书信息*/BK *p;n图书信息如下:nn图书编号t图书名称t图书作者t现有tt库存nwhile(p! printf(%stt%stt%stt%dtt%dn,p-book_num,p-book_name,p-book_writer,p-book_xy,p-n图书信息打印完毕!按任意键继续下一步操作.system(void Print_reader() /*查询读者信息*/RD *p;p=h_reader;n读者信息如下:读者书证号tt读者姓名nt%stt%sreader_num,p- printf(图书编号,i+1
14、);t还书日期t%sborrowi.borrow_book_num);tt%sborrowi.limit_date);n读者信息打印完毕!void Save() /*保存信息*/Save_Reader();Save_Book();void Save_Reader() /*保存读者信息*/(2) 通过创建文件将图书和读者的单链表和图书的单链表输入到文件里,再读取文件,关闭文件。FILE *fp_reader;RD *p,*p0;if(fp_reader=fopen(Reader.txt,wb)=NULL) /*创建文件,进行保存*/n文件保存失败!n请重新启动本系统.n exit(0); if(
15、fwrite(p,sizeof(RD),1,fp_reader)!=1) /*将链表中的信息写入文件中*/n写入文件失败!n请重新启动本系统! p0=p; free(p0); /*释放所有结点*/h_reader=NULL;fclose(fp_reader);void Save_Book() /*保存图书信息*/FILE *fp_book; /*创建文件型指针*/BK *p,*p0;if(fp_book=fopen(Book.txt if(fwrite(p,sizeof(BK),1,fp_book)!h_book=NULL;fclose(fp_book);void Load() /*加载信息*
16、/Load_Reader();Load_Book();void Load_Reader() /*加载读者信息*/ RD *p1,*p2,*p3; FILE *fp; fp=fopen(book.txtrb /*打开文件*/ p1=(RD *)malloc(sizeof(RD); fread(p1,sizeof(RD),1,fp); h_reader=p3=p2=p1; while(! feof(fp) /*读出信息,重新链入链表*/ p1=(RD *)malloc(sizeof(RD); p2-next=p1;p3=p2; p2=p1; p3- free(p1); fclose(fp);voi
17、d Load_Book() /*加载图书信息*/BK *p1,*p2,*p3;FILE *fp;fp=fopen( p1=(BK *)malloc(sizeof(BK); fread(p1,sizeof(BK),1,fp); h_book=p3=p2=p1; p1=(BK *)malloc(sizeof(BK); p3=p2; p3-5编写主函数,执行程序。void main() FILE *fp_book,*fp_reader; Login(); if(fp_book=fopen()=NULL|(fp_reader=fopen()=NULL) Init(); else Load(); Menu_select();五、测试细致测试。1)登入系统,进行文件初始化。2)进入主菜单,开始实现功能。3)选择功能1,输入采编图书信息。4)选择2,登记读者。5)执行3,开始借阅图书,输入借书编号,读者编号,以及还书日期。6)执行6,查询图书信息,发现图书的减少量,库存和预存。7)登记图书,采编新书,如果图书已存在,则直接输入数量。8)还书模块4,输入读者及图书的信息。9)执行5,查询读者信息。10)再查询图书信息,发现还书后,图书现有量改变。11)同一读者不能借同一种书两本。12)如果图书为零,则说明书库已经借完等待新书到来。13)执行0,退出系统,保存文件。六、总结说
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1