数据结构
课程设计报告
设计题目:图书管理信息系统的设计与实现
专业通信工程(物联网)
班级
学生
学号
指导教师
起止时间 2012-8-20至2012-9-11
湖北师范学院
2012 年下学期
一、设计题目
十七、图书管理信息系统的设计与实现
【问题描述】图书信息所表示的就是一个数据库文件。图书管理一般包括:图书采编、图书编目、图书查询及图书流通(借、还书)等。要求设计一个图书管理信息系统,用计算机实现上述系统功能。
【基本要求】
建立一个图书信息数据库文件,输入若干种书的记录,建立一个以书号为关键字的索引文件;在主数据库文件中建立以书名、作者及出版社作为次关键字的索引以及对应的索引链头文件,如图所示;
建立关于书号、书名、作者及出版社的图书查询;
(1)实现图书的借还子系统,包括建立读者文件、借还文件、读者管
d)出版社索引链头文件
二、设计内容
设计一个计算机管理系统完成图书管理基本业务。
(1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;
(2)对书号建立索引表(线性表)以提高查找效率;
(3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,
则只将库存量增加;
(4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和还
期限,改变现存量;
(5)归还:注销对借阅者的登记,改变该书的现存量。
三、概要设计:确定所需模块及模块间调用关系
分析:首先应该定义借书人的结构体信息和图书结构体信息,为了便于查找图书和借书人,分别对其建立单链表。然后定义buy(),SearchByNum (),SearchByName(), borrow(),return()五个函数分别实现图书采编入库的功能,按书号查询的功能,按书名查找的功能,借书功能和还书功能。
.根据任务的要求,先定义头文件。然后写出借书人和图书的结构体信息。为了便
于查找图书和存储借书人的信息,分别对借书人和图书采用链表的形式存放。
//头文件的声明
#include
#include
#include
#define MAXSIZE 100 //最大值定义为100
#define LIST_INIT_SIZE 100//图书证使用者最大值定义为100
//借书人的结构体
typedef struct Boro//借书记录
{
char BNum[20];//所借书的书号
char BorDate[8];//借书日期
char RetDate[8];//归还日期
struct Boro *next;
}Bor;
typedef struct LinkBook
{
Bor *next;//该图书证的借书记录
char CNum[20];//图书证号
int Total;//借书的数量
}lend[LIST_INIT_SIZE];//借书人数组
//图书的结构体信息
typedef struct LNode
{
char CardNum[20];//图书证号
struct LNode *next;
}LinkList; //借书人
typedef struct book
{//每种图书需要登记的内容包括书号、书名、作者、出版社、总库存量和现库量。
char num[20];//书号
char name[20];//书名
char auth[20];//作者
char pub[20];//出版社
int TotNum;//总库存
int NowNum;//现库存
LinkList *next;//借了该书的人 }ook;
1、新图书采编入库的设计方案
采编入库:新购入一种书,如果该书在图书账目中已经存在,则将其库存量增加(包
括总库存量和现库存量),如果该书不存在,则在图书账目中增加一种书,总库存量和现库存量均为1。为了便于查找,另外定义了一个专门用于查找的函数BinarySearch(),使用的是折半查找法。
(1)折半查找法查找书号
int mid=0;//外部函数mid,用来返回查找到的位置
int BinarySearch(ook boo,char SearchNum[]) //二分法查找比较书号
{ 由于函数不能有两个返回值,所以设置一个外部变量mid,用来返回查找到的位置
int low=0,high=total-1;
int found=0;
while(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;
else low=mid+1;
}
if(found==0)
return false; //查找失败
}
2.新图书采编入库
void Buy(ook &boo, char BuyNum[])
{
if(BinarySearch(boo,BuyNum)) //如果书库中有此书
{
boo[mid].TotNum++; //总库存加1
boo[mid].NowNum++; //现库存加1
printf("入库成功.\n");
printf("已更改书库中该书的信息。编号 %s 的书 %s 作者是 %s ,出版社是 %s ,
目前的总库存是 %d ,现库存是 %d 。\n",
boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].TotN um,boo[mid].NowNum);
}
if(!BinarySearch(boo,BuyNum))
{
int i;
for(i=total;i>mid&&total;i--) //插在适合位置保持有序
boo[i]=boo[i-1]; //空出插入位置
printf("该书在书库中不存在。设立新书目,请补全书的详细信息。\n");
strcpy(boo[i].num,BuyNum);
printf("该书购入的数量是:");
scanf(" %d",&boo[i].NowNum);
boo[i].TotNum=boo[i].NowNum;
printf("该书的名字是:");
scanf(" %s",&boo[i].name);
printf("该书的作者是:");
scanf(" %s",&boo[i].auth);
printf("该书的出版社是:");
scanf(" %s",&boo[i].pub);//补全信息
boo[i].next=NULL;