您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页数据结构课程设计图书管理系统

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

来源:爱go旅游网
精品----

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

一 需求分析

该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。此程序规定:

(1) 管理员能够向系统中输入每种书的基本信息,包括书号、书名、作者、现存量和库存量、借阅记录,并保存记录;

(2) 用户(读者)能够按书号、书名、作者查询图书信息;

(3) 管理员能够实现图书采编入库(新购入一本书,经分类和确定书号之后登记到图书账目中去。如果这种书在帐中已有,则只将总库存量增加)、借阅(如果书的现存量大于0,

则借出一本,登记借阅者的图书证号和归还期限)、归还(删除对借阅者的登记,改变该书的现存量)、销毁(将图书从账目中删除)等操作。 二 概要设计 

系统用到的抽象数据类型定义:

1、ADT LinearList{

数据元素:D={ai|ai∈D0,i=1,2,…,n,n≥0,D0为某一数据对象} 关系:S={|ai,ai+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={ai|ai∈CharacterSet,i=1,2,…,n;n≧0} 数据关系:R={|ai-1,ai∈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 #include #include #define MAXSIZE 100 #define LIST_INIT_SIZE 100 int Retotal;/*定义的全局变量*/ int total;

--精品

精品----

六 测试成果

1、采编入库

2、清空库存

3、图书借阅

--精品

精品----

4、图书归还

5、图书查找

--精品

精品----

七 附录(源程序清单)

#include #include #include #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;ivoid InitRe(lend &Lin) { for(int i=0;iint 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 \ printf(\"作者:%s 出版社:%s\ 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].TotNum=boo[i].NowNum; printf(\"该书的名字是:\"); scanf(\" %s\ printf(\"该书的作者是:\"); scanf(\" %s\ printf(\"该书的出版社是:\");

--精品

精品----

scanf(\" %s\ boo[i].next=NULL; total++; printf(\"已增加该书的信息!\\n\"); printf(\"编号 :%s 书名:%s \ printf(\"作者:%s 出版社:%s\ 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;jvoid 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;inext)p=p->next; q=(Bor *)malloc(sizeof(Boro)); p->next=q; strcpy(q->BNum,BorrowNum); printf(\"输入归还日期:\"); scanf(\"%s\ 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->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--精品

精品----

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;kvoid SearchByNum(Book &boo,char SeaNum[]) { LinkList *p; p=boo[mid].next; if(BinarySearch(boo,SeaNum)==true) {

--精品

精品----

printf(\"书号:%s\\n\ printf(\"书名:%s\\n\ printf(\"作者名:%s\\n\ printf(\"出版社:%s\\n\ printf(\"现存量:%s\\n\ printf(\"库存量:%s\\n\ printf(\" \\n\"); } else printf(\"对不起,未找到您想查找的书。\\n\"); }

void SearchByName(Book &boo) { char SeaName[20]; printf(\"输入想查找的书的书名:\\n\"); scanf(\" %s\ printf(\"此书存在!\\n\"); for(int i=0;ivoid SearchByAuth(Book &boo) { char SeaAuth[20]; printf(\"输入想查找的书的作者:\\n\"); scanf(\" %s\ printf(\"找到符合该作者的书的详细信息如下:\\n\"); for(int i=0;i--精品

精品----

}

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\ switch(k) { case 1: printf(\"请输入书号:\");//输入书号查找 scanf(\" %s\ 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\ switch(choice) { case 1://采编入库 printf(\"请输入入库的书的书号:\"); scanf(\" %s\ Buy(Bo,BNum); system(\"pause\"); break; case 2://清空库存 printf(\"请输入想要清除的书的书号:\"); scanf(\" %s\ Delete(Bo,BNum); system(\"pause\"); break; case 3://借阅 printf(\"请输入想要借阅的书的书号:\\n\"); scanf(\" %s\ printf(\"请输入图书证号:\"); scanf(\" %s\ Borrow(Bo,Lin,BNum,CNum); system(\"pause\"); break; case 4://归还 printf(\"请输入想要归还的书的书号:\\n\"); scanf(\" %s\ printf(\"请输入图书证号:\"); scanf(\" %s\ 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; }

--精品

精品----

}

}

--精品

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务