数据结构课程设计图书管理系统一需求分析该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。
此程序规定:(1) 管理员能够向系统中输入每种书的基本信息,包括书号、书名、作者、现存量和库存量、借阅记录,并保存记录;(2) 用户(读者)能够按书号、书名、作者查询图书信息;(3) 管理员能够实现图书采编入库(新购入一本书,经分类和确定书号之后登记到图书账目中去。
如果这种书在帐中已有,则只将总库存量增加)、借阅(如果书的现存量大于0,则借出一本,登记借阅者的图书证号和归还期限)、归还(删除对借阅者的登记,改变该书的现存量)、销毁(将图书从账目中删除)等操作。
二概要设计系统用到的抽象数据类型定义:1、ADT LinearList{数据元素:D={a i|a i∈D0,i=1,2,…,n,n≥0,D0为某一数据对象}关系:S={<a i,a i+1>|a i,a i+1∈D0,i=1,2,…,n-1}基本操作:(1)InitList(L)(2)DestroyList(L)(3)ClearList(L)(4)EmptyList(L)(5)ListLength(L)(6)Locate(L,e)(7)GetData(L,i)(8)InsList(L,i,e)(9)DelList(L,i,&e)}ADT LinearList2、ADT String{数据对象:D={a i|a i∈CharacterSet,i=1,2,…,n;n≧0}数据关系:R={<a i-1,a i>|a i-1,a i∈D,i=2,…,n;n≧0}基本操作:(1)StrAsign(S,chars)(2)StrInsert(S,pos,T)(3)StrDelete(S,pos,len)(4)StrCopy(S,T)(5)StrEmpty(S)(6)StrCompare(S,T)(7)StrLength(S)(8)StrClear(S)(9)StrCat(S,T)(10)SubString(Sub,S,pos,len)(11)StrIndex(S,pos,T)(12)StrReplace(S,T,V)(13)StrDestroy(S)}ADT String系统中的子程序和功能说明:InitBo(Book &boo);初始化图书信息 InitRe(lend &Lin);初始化借阅者信息BinarySearch(Book boo,char SearchNum[]);二分法查找比较书号 Buy(Book &boo, char BuyNum[]);新书采编入库系统Delete(Book &boo,char DeleteNum[]);清除图书信息系统Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[]);借阅图书处理系统 Return(Book &boo,lend &Lin,char ReturnNum[],char BorrowerNum[]);归还图书系统 SearchByNum(Book &boo,char SeaNum[]);按书号查找系统 SearchByName(Book &boo);按书名查找系统 SearchByAuth(Book &boo);按作者查询系统 Menu();主菜单显示系统 Search();查询系统子菜单 main();主函数系统程序功能结构图三 详细设计功能实现过程bool BinarySearch(Book boo,char SearchNum[]) //二分法查找比较书号 { w hile(low<=high) { 计算中间点; if(查找到书号相同的) { 返回值true; } if (查找书号不相同)图书馆管理图书信息录查询图书信处理图书信基本信息借阅记录按书号查询按书名查询按作者查询图书采编入库 图书借阅情况 图书归还情况 图书销毁情况用二分法进一步进行查找;}i f(库中没有所要查找的书)返回值false;}void Buy(Book &boo, char BuyNum[])/*采编入库*/{if(书库中有此书){总库存加1;现库存加1;}if(书库中无此书){for(i=total;i>mid&&total;i--)/*将新采购的书插在适合位置,保持有序*/空出插入位置;输入新购书籍的相关信息:书号、书名、作者、出版社;boo[i].next=NULL;total++;/*总量加1*/}}void Delete(Book &boo,char DeleteNum[])/*清除图书信息*/{if(书库中没有此书)输出“无此书”;if(书库中有此书){strcpy(连续两本书的相关信息);现存量减1;库存量减1;}else 输出“此书已有借阅者,无法删除!”;}void Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[])/*借阅图书信息*/{if(没有找到此书) 输出“书库中无此书!”;if(书库中有此书){借出一本书后,该书的现存量减1;并在借阅记录链表中插入该条记录;再对应读者信息记录链表,如果已有该读者证号信息,直接在该链表中插入此次借阅记录;如果无该读者证号信息,申请新单链表存放借阅记录。
}else 输出“该书现存量为0”;}void Return(Book &boo,lend &Lin,char ReturnNum[],char BorrowerNum[])/*归还图书信息*/{if(书库中无此书)输出“无此书记录”;if(书库中有此书){查找图书文件,修改图书的现存量;查找记录借阅信息的单链表,填入还书日期,删除借阅信息;查找记录读者信息的单链表,删除证号信息。
}}void SearchByNum(Book &boo,char SeaNum[])/*按书号查找*/{if(书库中无此书信息)/*用二分法查找*/输出“无此书”;else/*书库中有此书信息*/输出与此书有关的相关信息;}void SearchByName(Book &boo)/*按书名查找*/{输入想要查找书的书名;用顺序查找法查找;if(查找到需要查找的书)输出与此书相关的信息;}建议画出主要模块流程图。
四设计与调试分析1、这个程序设计中要注意定义两个结构体:图书结构体、借阅人结构体。
其中定义数组存放图书信息,申请链表存放借阅记录和读者信息记录。
2、程序中运用到大多的插入与删除,所以申请链表比较方便插入与删除。
但应前期需求分析的准备工作不充分,导致程序运行功能不全,比如查找时关于此书的信息不能全部显示出来,并且添加删除时库存的变化不能直接显示出来。
程序的健壮性不能达到预期的结果,这些都是需要改进的。
3、在程序中的函数调用是个非常重要的部分,也是经常需要用到的,在编写程序过程中,因为函数调用不准确,使得循环进不去,后来改变函数的调用关系,才达到了预期结果。
4、程序中还定义了全局变量,之前没定义全局变量,在下面的编写过程,同样性质的地方需要重复定义,比较麻烦,定义全局变量使得程序比较简明一点。
五用户手册【使用说明】1、进入图书馆管理系统主页面2、若有新书要新编入库,选择1,进入新书入库系统,输入入库书的书号,若书库中无该书,则设立新书目,输入新书信息。
若书库中已有该书,则输入新信息覆盖修改原书库中该书号对应书的信息。
3、若有书籍信息需要删除,选择2,进入清空库存系统,输入想要删除书的书号,则此书信息就已删除。
4、若要借阅图书,选择3,进入图书借阅系统,输入需要借阅书的书号以及读者证号,并输入还书日期,则借书成功。
5、若要归还图书,选择4,进入图书归还系统,输入需要归还图书的书号以及读者证号,则还书成功。
6、若要查找信息,选择5,进入查找信息子系统。
若要按书号查找,则选择子系统中的1,输入需要查找的书的书号,若按书名查找,则选择子系统中的2,输入需要查找的书名,若按作者查找,输入需要查找书的作者进行查找,若查找结束,则按0退出。
7、若系统使用结束,按0退出。
【程序中的头文件】#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXSIZE 100#define LIST_INIT_SIZE 100int Retotal;/*定义的全局变量*/int total;六测试成果1、采编入库2、清空库存3、图书借阅4、图书归还5、图书查找七附录(源程序清单)#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXSIZE 100#define LIST_INIT_SIZE 100typedef struct Boro{c har BNum[20];char RetDate[8];struct Boro *next;}Bor;typedef struct LinkBook {B or *next;c har CNum[20];int Total;}lend[LIST_INIT_SIZE];typedef struct LNode{c har CardNum[20];s truct LNode *next;}LinkList;typedef struct book{c har num[20];c har name[20];c har auth[20];c har pub[20];i nt TotNum;i nt NowNum;L inkList *next;}Book[MAXSIZE];int Retotal;int total;void InitBo(Book &boo) {for(int i=0;i<MAXSIZE;i++) {boo[i].NowNum=0;boo[i].TotNum=0;boo[i].next=NULL;}}void InitRe(lend &Lin){f or(int i=0;i<LIST_INIT_SIZE;i++)L in[i].next=NULL;}int mid=0;bool BinarySearch(Book boo,char SearchNum[]){i nt low=0,high=total;i nt found=0;w hile(low<=high){mid=(low+high)/2;if(strcmp(boo[mid].num,SearchNum)==0){found=1;return true;}if(strcmp(boo[mid].num,SearchNum)!=0)high=mid-1;elselow=mid+1;}i f(found==0)return false;}void Buy(Book &boo, char BuyNum[]){i nt i;i f(BinarySearch(boo,BuyNum)){boo[mid].TotNum++;boo[mid].NowNum++;printf("入库成功.\n");printf("已更改书库中该书的信息。