图书管理信息系统的设计与实现.docx

上传人:b****1 文档编号:14813106 上传时间:2023-06-27 格式:DOCX 页数:32 大小:156.38KB
下载 相关 举报
图书管理信息系统的设计与实现.docx_第1页
第1页 / 共32页
图书管理信息系统的设计与实现.docx_第2页
第2页 / 共32页
图书管理信息系统的设计与实现.docx_第3页
第3页 / 共32页
图书管理信息系统的设计与实现.docx_第4页
第4页 / 共32页
图书管理信息系统的设计与实现.docx_第5页
第5页 / 共32页
图书管理信息系统的设计与实现.docx_第6页
第6页 / 共32页
图书管理信息系统的设计与实现.docx_第7页
第7页 / 共32页
图书管理信息系统的设计与实现.docx_第8页
第8页 / 共32页
图书管理信息系统的设计与实现.docx_第9页
第9页 / 共32页
图书管理信息系统的设计与实现.docx_第10页
第10页 / 共32页
图书管理信息系统的设计与实现.docx_第11页
第11页 / 共32页
图书管理信息系统的设计与实现.docx_第12页
第12页 / 共32页
图书管理信息系统的设计与实现.docx_第13页
第13页 / 共32页
图书管理信息系统的设计与实现.docx_第14页
第14页 / 共32页
图书管理信息系统的设计与实现.docx_第15页
第15页 / 共32页
图书管理信息系统的设计与实现.docx_第16页
第16页 / 共32页
图书管理信息系统的设计与实现.docx_第17页
第17页 / 共32页
图书管理信息系统的设计与实现.docx_第18页
第18页 / 共32页
图书管理信息系统的设计与实现.docx_第19页
第19页 / 共32页
图书管理信息系统的设计与实现.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

图书管理信息系统的设计与实现.docx

《图书管理信息系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《图书管理信息系统的设计与实现.docx(32页珍藏版)》请在冰点文库上搜索。

图书管理信息系统的设计与实现.docx

图书管理信息系统的设计与实现

 

图书管理信息系统的设计与实现

数据结构

课程设计报告

设计题目:

图书管理信息系统的设计与实现

 

专业通信工程(物联网)

班级

学生

学号

指导教师

起止时间2012-8-20至2012-9-11

湖北师范学院

2012年下学期

 

一、设计题目

十七、图书管理信息系统的设计与实现

【问题描述】图书信息所表示的就是一个数据库文件。

图书管理一般包括:

图书采编、图书编目、图书查询及图书流通(借、还书)等。

要求设计一个图书管理信息系统,用计算机实现上述系统功能。

【基本要求】

建立一个图书信息数据库文件,输入若干种书的记录,建立一个以书号为关键字的索引文件;在主数据库文件中建立以书名、作者及出版社作为次关键字的索引以及对应的索引链头文件,如图所示;

建立关于书号、书名、作者及出版社的图书查询;

(1)实现图书的借还子系统,包括建立读者文件、借还文件、读者管理及图书借还等相关的处理。

记录号

书号

书名

指针1

作者

指针2

出版社

指针3

分类

藏书量

借出数

1

1021

数据库

0

李小云

0

人民邮电

0

021

8

0

2

1014

数据结构

0

刘小洋

0

中国科学

0

013

6

0

3

1106

操作系统

0

许海平

0

人民邮电

1

024

7

0

4

1108

数据结构

2

孙一

0

清华大学

0

013

5

0

5

1203

程序设计

0

李小云

1

中国科学

2

035

6

0

6

2201

数据库

1

许海平

3

清华大学

4

021

6

0

7

2360

数据结构

4

李小云

5

人民邮电

3

013

5

0

8

0030

程序设计

5

刘小洋

2

清华大学

6

035

7

0

a)图书主索引文件

书名

链头地址

长度

作者

链头地址

长度

出版社

链头地址

长度

数据库

6

2

李小云

7

3

人民邮电

7

3

数据结构

7

3

刘小洋

8

2

中国科学

5

2

操作系统

3

1

许海平

6

2

清华大学

8

3

程序设计

8

2

孙一

4

1

b)书名索引链头文件c)作者索引链头文件d)出版社索引链头文件

二、设计内容

设计一个计算机管理系统完成图书管理基本业务。

(1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;

(2)对书号建立索引表(线性表)以提高查找效率;

(3)采编入库:

新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,

则只将库存量增加;

(4)借阅:

如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和还期限,改变现存量;(5)归还:

注销对借阅者的登记,改变该书的现存量。

三、概要设计:

确定所需模块及模块间调用关系

分析:

首先应该定义借书人的结构体信息和图书结构体信息,为了便于查找图书和借书人,分别对其建立单链表。

然后定义buy(),SearchByNum(),SearchByName(),borrow(),return()五个函数分别实现图书采编入库的功能,按书号查询的功能,按书名查找的功能,借书功能和还书功能。

.根据任务的要求,先定义头文件。

然后写出借书人和图书的结构体信息。

为了便于查找图书和存储借书人的信息,分别对借书人和图书采用链表的形式存放。

//头文件的声明

#include

#include

#include

#defineMAXSIZE100//最大值定义为100

#defineLIST_INIT_SIZE100//图书证使用者最大值定义为100

//借书人的结构体

typedefstructBoro//借书记录

{

charBNum[20];//所借书的书号

charBorDate[8];//借书日期

charRetDate[8];//归还日期

structBoro*next;

}Bor;

typedefstructLinkBook

{

Bor*next;//该图书证的借书记录

charCNum[20];//图书证号

intTotal;//借书的数量

}lend[LIST_INIT_SIZE];//借书人数组

//图书的结构体信息

typedefstructLNode

{

charCardNum[20];//图书证号

structLNode*next;

}LinkList;//借书人

typedefstructbook

{//每种图书需要登记的内容包括书号、书名、作者、出版社、总库存量和现库量。

charnum[20];//书号

charname[20];//书名

charauth[20];//作者

charpub[20];//出版社

intTotNum;//总库存

intNowNum;//现库存

LinkList*next;//借了该书的人}ook;

1、新图书采编入库的设计方案采编入库:

新购入一种书,如果该书在图书账目中已经存在,则将其库存量增加(包括总库存量和现库存量),如果该书不存在,则在图书账目中增加一种书,总库存量和现库存量均为1。

为了便于查找,另外定义了一个专门用于查找的函数BinarySearch(),使用的是折半查找法。

(1)折半查找法查找书号

intmid=0;//外部函数mid,用来返回查找到的位置

intBinarySearch(ookboo,charSearchNum[])//二分法查找比较书号

{由于函数不能有两个返回值,所以设置一个外部变量mid,用来返回查找到的位置

intlow=0,high=total-1;

intfound=0;

while(low<=high)

{

mid=(low+high)/2;//中间点

if(strcmp(boo[mid].num,SearchNum)==0)//书号相同

{found=1;returntrue;}//查找成功if(strcmp(boo[mid].num,SearchNum)!

=0)//书号不同high=mid-1;elselow=mid+1;

}

if(found==0)

returnfalse;//查找失败

}

2.新图书采编入库

voidBuy(ook&boo,charBuyNum[])

{

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].TotNum,boo[mid].NowNum);

}

if(!

BinarySearch(boo,BuyNum))

{

inti;

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;

total++;//总量+1

printf("已增加该书的信息。

编号%s的书%s作者是%s,出版社是%s,目前

的总库存是%d,现库存是%d。

\n",

boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);

printf("入库成功.\n");

}

}

3、查找图书的设计方案为了更便于查找,这里设计了两种查找方案,按书号查找和按书名查找。

在按书号查找中使用了折半查找法的查找函数。

按书号查找方案中都显示图书的所有状态,包括是在库还是借出,如果借出,并显示何人借走。

(1).按书号查找voidSearchByNum(ook&boo,charSeaNum[]){//BYNUM根据书号查找

LinkList*p;

p=boo[mid].next;

if(BinarySearch(boo,SeaNum)==false)printf("对不起,未找到您想查找的书。

\n");//二分查找没找到

else//找到了的话

{

{

printf("┃书号┃书名┃作者┃出版社┃现库存┃总库存┃\n");

printf("-------------------------------------------------------------------------------\n");

printf("┃%10s┃%10s┃%10s┃%10s┃%10d┃%10d┃\n",

boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].NowNum,boo[mid].TotNum);

if(boo[mid].next!

=NULL)

{printf("┃已借该书的┃\n");

printf("┃图书证号┃\n");

while(p)

{printf("┃%14s┃\n",p->CardNum);

p=p->next;

}}}while(p)

{

printf("%s",p->CardNum);//在按书号查找的函数里也显示借了这本书

的借阅者的证号

p=p->next;

}printf("\n");

}//显示查找的书籍的信息

}

(2).按书名查找

voidSearchByName(ook&boo)

{//BYNAME根据书名查找

charSeaName[20];

printf("输入想查找的书的书名:

\n");

scanf("%s",&SeaName);

printf("找到符合该书名的书的详细信息如下:

\n");

for(inti=0;i

{

if(strcmp(SeaName,boo[i].name)==0)//如果书名一样

{

printf("书号:

%s\n书名:

%s\n作者:

%s\n出版社:

%s\n总库存量:

%d\n现

库存量:

%d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo

[i].NowNum);

}//显示符合信息的所有书籍的信息

}

}

4、借阅图书的设计方案

如果一种书的现库存量大于零,则借出一本书,将现库存量减1,

并登记借阅者的图书证号和归还期限。

voidBorrow(ook&boo,lend&Lin,charBorrowNum[],charCaNum[])

{

Bor*p,*q;

LinkList*m,*n;

if(!

BinarySearch(boo,BorrowNum)||total==0)//如果没有找到此书

printf("书库里没这书。

\n");//如果有这书if(BinarySearch(boo,BorrowNum))//书库里有

{

if(boo[mid].NowNum>0)//看现库存是否大于0

{

boo[mid].NowNum--;//借出一本,少1

if(boo[mid].next==NULL)//若该书信息下显示该种书还没被人借过

{

m=(LinkList*)malloc(sizeof(LNode));//分配

boo[mid].next=m;//该图书信息中的链表的第一个结点

strcpy(m->CardNum,CaNum);

m->next=NULL;//后一个结点为空

}

else//如果已经有人在借这书了

{

m=boo[mid].next;

while(m->next)//遍历到最后一个结点m=m->next;

n=(LinkList*)malloc(sizeof(LNode));//分配空间,增加1个结点

m->next=n;

strcpy(n->CardNum,CaNum);//记录证号

n->next=NULL;

}

inti=0;

for(i=0;i

{

if(!

strcmp(Lin[i].CNum,CaNum))//如果已经有该图书证的信息

{

p=Lin[i].next;

while(p->next)p=p->next;//遍历到最后一个结点

q=(Bor*)malloc(sizeof(Boro));//分配空间

p->next=q;

strcpy(q->BNum,BorrowNum);//记录书号

printf("输入归还日期:

");

scanf("%s",&q->RetDate);q->next=NULL;

printf("借阅成功.\n");

break;//找到证了就跳出循环

}

}

if(i==Retotal)//如果没有这张证的信息

{

strcpy(Lin[i].CNum,CaNum);//记录证号

p=(Bor*)malloc(sizeof(Boro));//分配空间

Lin[i].next=p;

strcpy(p->BNum,BorrowNum);

printf("输入归还日期:

");

scanf("%s",&p->RetDate);

p->next=NULL;

Retotal++;//借阅证号信息总数加1

printf("借阅成功.\n");

}

}

elseprintf("借阅失败.该书现在库存为0.\n");

}

}

5、归还图书的设计方案定义了一个return函数,当进行还书时,在借阅者表里查找借阅者,注销对借阅者的登记。

在图书链表中改变该书的现存量,把现存量增加。

voidReturn(ook&boo,lend&Lin,charReturnNum[],charBorrowerNum[])

{Bor*p,*q;

LinkList*m,*n;

intflag=0;//设置一个参数

if(!

BinarySearch(boo,ReturnNum)||!

total)//没书

printf("书库中无此书.\n");

if(BinarySearch(boo,ReturnNum))//有书

{

m=boo[mid].next;

if(!

strcmp(m->CardNum,BorrowerNum))//如果是第一个借的人还的

{

boo[mid].NowNum++;//现库存加1

boo[mid].next=m->next;//删除结点

free(m);//释放该结点的空间空间

}

else

{

while(m->next)//查找归还者的借阅者结点

{

if(!

strcmp(m->next->CardNum,BorrowerNum))//如果找到

{

n=m->next;//n为归还者的借阅结点

m->next=n->next;//m指向归还者的借阅结点的下一结点

free(n);//释放空间

boo[mid].NowNum++;//现库存加1

break;

}

m=m->next;

}

}

}

//在借阅者表里查找借阅者信息

for(inti=0;i

{

if(!

strcmp(Lin[i].CNum,BorrowerNum))//如果找到借阅者

{

p=Lin[i].next;

if(!

strcmp(p->BNum,ReturnNum))//如果是归还的是借的第一本书

{

Lin[i].next=p->next;//指向下一借书结点

free(p);//释放结点空间

printf("成功归还该书.\n");

flag=1;

break;

}

else//找不到

{

while(p->next)//找到归还书的借书结点

{

if(!

strcmp(p->next->BNum,ReturnNum))//如果找到

{

q=p->next;//q为归还书的借书结点

p->next=q->next;//p指向下一借书结点

free(q);//释放空间

printf("成功归还该书.\n");

flag=1;

break;

}

p=p->next;

}

}

}

}

for(intk=0;k

if(!

Lin[k].next)

{

intj;

for(j=k;j

Lin[j]=Lin[j+1];//其后都往前移一位,覆盖掉当前信息

strcpy(Lin[j].CNum,"");//删除图书证号

Retotal--;//图书证数减1

}//删除当前状态下没借书的图书证的信息,节省空间

if(flag==0)printf("无该证信息.\n");

}

6、定义主函数,在主函数中设计出主界面。

便于用户进入后能够根据提示方便操作。

并且在主函数中定义出要实现的基本功能,在分别另外去实现。

分别在主函数中定义有:

Buy(Bo,BNum);SearchByNum(Bo,BNum);SearchByName(Bo);Borrow(Bo,Lin,BNum,CNum);Return(Bo,Lin,BNum,CNum)五个函数。

四、算法描述:

给出各模块流程图及代码

图书管理系统的总体结构如

 

完整代码如下:

“wj.h”

//借书人的结构体

typedefstructBoro//借书记录

{

charBNum[20];//所借书的书号

charBorDate[8];//借书日期

charRetDate[8];//归还日期

structBoro*next;

}Bor;

typedefstructLinkBook

{

Bor*next;//该图书证的借书记录

charCNum[20];//图书证号

intTotal;//借书的数量

}lend[LIST_INIT_SIZE];//借书人数组

//图书的结构体信息

typedefstructLNode

{

charCardNum[20];//图书证号

structLNode*next;

}LinkList;//借书人

typedefstructbook

{//每种图书需要登记的内容包括书号、书名、作者、出版社、总库存量和现库量。

charnum[20];//书号

charname[20];//书名

charauth[20];//作者

charpub[20];//出版社

intTotNum;//总库存

intNowNum;//现库存

LinkList*next;//借了该书的人

}ook;

intRetotal;//读者数量

inttotal;//定义外部变量.书的种类数

//结构体初始化

voidInitBo(ookboo[])//初始化图书信息

{

for(inti=0;i

{

boo[i].NowNum=0;

boo[i].TotNum=0;

boo[i].next=NULL;

}

}

voidInitRe(lend&Lin)//初始化借阅者信息

{

for(inti=0;i

Lin[i].next=NULL;

}

 

intmid=0;//外部函数mid,用来返回查找到的位置

intBinarySearch(ookboo[],charSearchNum[])//二分法查找比较书号

{//由于函数不能有两个返回值,所以设置一个外部变量mid,用来返回查找位置

intlow=0,high=total-1;

intfound=0;

while(low<=high)

{

mid=(low+high)/2;//中间点

if(strcmp(boo[mid].num,SearchNum)==0)//书号相同

{

found=1;

return1;

}//查找成功

if(strcmp(boo[mid].num,SearchNum)>0)//书号不同

high=mid-1;

elselow=mid+1;

}

if(found==0)

return0;//查找失败

}

voidBuy

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2