大数据结构课程设计图书管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计图书管理系统
一需求分析
该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。

此程序规定:
(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 LinearList
2、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[]) //二分法查找比较书号
{
while(low〈=high)

计算中间点;
if(查找到书号相同的)
{
返回值true;
}
if(查找书号不相同)
用二分法进一步进行查找;

if(库中没有所要查找的书)
返回值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 100
int Retotal;/*定义的全局变量*/
int total;
六测试成果
1、采编入库
2、清空库存
3、图书借阅
4、图书归还
5、图书查找
七附录(源程序清单)
#include 〈stdio.h>
#include <string。

h〉
#include <stdlib。

h>
#define MAXSIZE 100
#define LIST_INIT_SIZE 100 typedef struct Boro

char BNum[20];
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;
}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)
{
for(int i=0;i<LIST_INIT_SIZE;i++)
Lin[i]。

next=NULL;
}
int mid=0;
bool BinarySearch(Book boo,char SearchNum[])
{
int low=0,high=total;
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;
}
void Buy(Book &boo, char BuyNum[])
{
int i;
if(BinarySearch(boo,BuyNum))

boo[mid].TotNum++;
boo[mid]。

NowNum++;
printf(”入库成功。

\n");
printf(”已更改书库中该书的信息。

\n”);
printf(”编号 :%s 书名:%s ",boo[mid]。

num,boo[mid]。

name);
printf(”作者:%s 出版社:%s",boo[mid]。

auth,boo[mid]。

pub);
printf(”\n");

if(!BinarySearch(boo,BuyNum))

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++;
printf(”已增加该书的信息!\n");
printf("编号:%s 书名:%s ",boo[i]。

num,boo[i].name);
printf(”作者:%s 出版社:%s",boo[i]。

auth,boo[i]。

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

void Delete(Book &boo,char DeleteNum[])

if(BinarySearch(boo,DeleteNum)==false||total==0)
printf(”书库中没有该书。

\n”);
if(BinarySearch(boo,DeleteNum))

if(!boo[mid].next)
{
int j;
for(j=mid;j<total;j++)
boo[j]=boo[j+1];
strcpy(boo[j].num,boo[j+1].num);
strcpy(boo[j].name,boo[j+1].name);
strcpy(boo[j]。

auth,boo[j+1]。

auth);
strcpy(boo[j].pub,boo[j+1]。

pub);
boo[j].TotNum=boo[j+1]。

TotNum;
boo[j]。

NowNum=boo[j+1]。

NowNum;
printf("已成功删除该书.\n");
}
else
printf("该书有借阅者,无法删除。

\n”);

}
void Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[]) {
Bor *p,*q;
LinkList *m,*n;
if(!BinarySearch(boo,BorrowNum)||total==0)
printf("书库里没这书。

\n");
if(BinarySearch(boo,BorrowNum))

if(boo[mid].NowNum>0)
{
boo[mid].NowNum--;
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));
m-〉next=n;
strcpy(n->CardNum,CaNum);
n-〉next=NULL;
}
int i=0;
for(i=0;i<Retotal;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++;
printf(”借阅成功.\n");
}

else
printf("借阅失败。

该书现在库存为0。

\n”);


void Return(Book &boo,lend &Lin,char ReturnNum[],char BorrowerNum[]){
Bor *p,*q;
LinkList *m,*n;
int flag=0;
if(!BinarySearch(boo,ReturnNum)||!total)
printf(”书库中无此书。

\n");
if(BinarySearch(boo,ReturnNum))
{
m=boo[mid]。

next;
if(!strcmp(m-〉CardNum,BorrowerNum))

boo[mid]。

NowNum++;
boo[mid]。

next=m—>next;
free(m);

else

while(m—>next)

if(!strcmp(m—〉next—>CardNum,BorrowerNum))

n=m->next;
m-〉next=n->next;
free(n);
boo[mid]。

NowNum++;
break;

m=m—〉next;
}
}
}
for(int i=0;i〈Retotal;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;
p—>next=q—>next;
free(q);
printf(”成功归还该书。

\n");
flag=1;
break;

p=p—>next;
}

}

for(int k=0;k<Retotal;k++)
if(!Lin[k]。

next)

int j;
for(j=k;j<Retotal;j++)
Lin[j]=Lin[j+1];
strcpy(Lin[j]。

CNum," ");
Retotal—-;

if(flag==0)
printf(”无该证信息.\n");
}
void SearchByNum(Book &boo,char SeaNum[])
{
LinkList *p;
p=boo[mid]。

next;
if(BinarySearch(boo,SeaNum)==true)

printf(”书号:%s\n”,boo[mid]。

num);
printf(”书名:%s\n”,boo[mid].name);
printf("作者名:%s\n”,boo[mid].auth);
printf("出版社:%s\n",boo[mid]。

pub);
printf("现存量:%s\n”,boo[mid]。

NowNum);
printf(”库存量:%s\n",boo[mid].TotNum);
printf(” \n");
}
else
printf("对不起,未找到您想查找的书。

\n");
}
void SearchByName(Book &boo)
{
char SeaName[20];
printf(”输入想查找的书的书名:\n");
scanf(” %s”,&SeaName);
printf(”此书存在!\n”);
for(int i=0;i<total;i++)

if(strcmp(SeaName,boo[i]。

name)==0)
{
printf(”编号:%s 书名:%s ”,boo[i]。

num,boo[i].name);
printf(”作者:%s 出版社:%s”,boo[i]。

auth,boo[i].pub);
printf(”总库存量:%s",boo[i].TotNum);
printf(”现库存量:%s”,boo[i]。

NowNum);
printf(”\n”);

}
}
void SearchByAuth(Book &boo)
{
char SeaAuth[20];
printf("输入想查找的书的作者:\n”);
scanf(" %s”,&SeaAuth);
printf("找到符合该作者的书的详细信息如下:\n”);
for(int i=0;i<total;i++)

if(strcmp(SeaAuth,boo[i]。

auth)==0)

printf("编号 :%s 书名:%s ”,boo[i]。

num,boo[i].name);
printf(”作者:%s 出版社:%s",boo[i]。

auth,boo[i].pub);
printf("\n");

}

void Menu()
{
printf(" 图书馆管理系统 \n”);
printf("1。

采编入库 2。

清空库存\n\n");
printf(”3. 图书借阅 4、图书归还\n\n”);
printf(”5。

按要求查找 0. 退出\n\n");
printf("请选择:”);

void Search()
{
char BNum[20];
Book Bo;
int k;
printf(" 图书馆查询子系统\n");
printf(”1、按书号查询 2、按书名查找\n\n");
printf(”3、按作者查询 4、退出子系统\n\n”);
printf(”请选择:”);
scanf("%d”,&k);
switch(k)
{
case 1:
printf("请输入书号:”);//输入书号查找
scanf(” %s”,&BNum);
SearchByNum(Bo,BNum);
break;
case 2:
SearchByName(Bo);
break;
case 3:
SearchByAuth(Bo);
break;
case 4:
exit(0);
break;
}
}
void main()

Book Bo;
lend Lin;
char BNum[20];
char CNum[20];
int choice=10;
while(choice!=0)

system("cls");
Menu();//显示菜单
scanf(" %d",&choice);
switch(choice)

case 1://采编入库
printf("请输入入库的书的书号:”);
scanf(” %s”,BNum);
Buy(Bo,BNum);
system(”pause");
break;
case 2://清空库存
printf(”请输入想要清除的书的书号:”);
scanf(" %s”,BNum);
Delete(Bo,BNum);
system(”pause");
break;
case 3://借阅
printf("请输入想要借阅的书的书号:\n”);
scanf(” %s",&BNum);
printf("请输入图书证号:");
scanf(" %s”,&CNum);
Borrow(Bo,Lin,BNum,CNum);
system("pause");
break;
case 4://归还
printf("请输入想要归还的书的书号:\n”);
scanf(” %s",&BNum);
printf("请输入图书证号:”);
scanf(” %s”,&CNum);
Return(Bo,Lin,BNum,CNum);
system(”pause”);
break;
case 5:
Search();
system("pause");
break;
case 0://退出系统
exit(0);
break;
default:printf("输入错误!\n");exit(0);break;
}

}。

相关文档
最新文档