图书管理课程设计报告.doc

上传人:牧羊曲112 文档编号:3838146 上传时间:2023-03-24 格式:DOC 页数:42 大小:453.50KB
返回 下载 相关 举报
图书管理课程设计报告.doc_第1页
第1页 / 共42页
图书管理课程设计报告.doc_第2页
第2页 / 共42页
图书管理课程设计报告.doc_第3页
第3页 / 共42页
图书管理课程设计报告.doc_第4页
第4页 / 共42页
图书管理课程设计报告.doc_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《图书管理课程设计报告.doc》由会员分享,可在线阅读,更多相关《图书管理课程设计报告.doc(42页珍藏版)》请在三一办公上搜索。

1、 课程设计题目及要求10. 图书管理(难度3)【问题描述】图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。【基本要求】1每种书的登记内容至少包括书号、书名、著者、现存量和总库存量等五项。2作为演示系统,不必使用文件,全部数据可以都在内存存放。但是由于上述四项基本业务活动都是通过书号(即关键字进行的,所以要用B树24树对书号建立索引,以获得高效率。3系统应实现的操作及其功能定义如下: 采编入库z新购入一种书,经分类和确定书号之后登记到图书账目中去。如果这种书在账中已有,则只将总库存量增加。 清除库存:某种书已无保

2、留价值,将它从图书账目中注销。 借阅:如果一种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期限。 归还z注销对借阅者的登记,改变该书的现存量。 显示:以凹入表的形式显示B树。这个操作是为了调试和维护的目的而设置的。【测试数据】入库书号:35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7然后清除:45,90,50,22,42其余数据自行设计。由空树开始,每插入删除一个关键字后就显示B树的状态。【实现提示】(1)24树的查找算法是基础,入库和清除操作都要调用。难点在于删除关键字的算法,因而只要算法对2-3树适用就可以了,暂时不必追求高

3、阶B树也适用的删除算法。(2)每种书的记录可以用动(或静)态链式结构。借阅登记信息可以链接在相应的那种书的记录之后。【进一步完成内容】(l)将一次会话过程(即程序一次运行)中的全部人机对话记入一个日志文件log中去。(2)增加列出某著者全部著作名的操作。思考如何提高这一操作的效率,参阅教科书12.6.2节。(3增加列出某种书状态的操作。状态信息除了包括这种书记录的全部信息外还包括最早到期(包括已逾期)的借阅者证号,日期可用整数实现,以求简化。(4)增加预约借书功能。完成情况:基本数据结构设计算法设计及流程图输入输出设计代码规范及注释数据测试及调试代码理解与说明评语综合评分目录第一部分 引言11

4、.1课程设计的目标11.2课程设计的基本要求1第二部分 系统功能和原始数据12.1原始数据12.2系统功能1第三部分 程序总体设计23.1数据结构23.2模块划分和层次结构33.3函数原型清单33.4程序总体框架43.5程序组织6第四部分 功能模块函数设计和调试7第五部分 程序清单22第六部分 课程设计总结39第七部分 参考资料39第一部分:引言数据结构课程设计的主要目的是培养学生综合运用数据结构程序设计课程所学到的知识,编写C程序解决实际问题的能力,以及严谨的工作态度和良好的程序设计习惯。通过课程设计的训练,学生应该能够了解程序设计的基本开发过程,掌握编写、调试和测试C语言程序的基本技巧,充

5、分理解结构化程序设计的基本方法。数据结构程序设计的主要任务是要求学生遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,分析、设计、编写、调试和测试数据结构程序及编写设计报告。第二部分:系统功能和原始数据(1) 原始数据入库书号:35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7然后清除:45,90,50,22,42(2)系统功能 1.图书信息录入功能;2.图书信息浏览功能;3.按书名查询图书信息;4.图书信息添加、删除功能;备注:图书信息包括:书的编号、书名、作者名、剩余量、总库存量、借书者信息等。第三部分:程序总

6、体设计(1) 数据结构B-树,顺序表。#define m 5 /B-树的阶#define M 20/借相同书的最大人数/*借阅者信息(用单链表方式存储)*/struct data /记录借书和还书日期的结构体类型 int year; /记录年 int month; /记录月 int day; /记录日;typedef struct Rechar number20;/借阅者编号struct data bro; /记录读者的借书日期 struct data back; /记录读者的还书日期Reader;/*书的结构体*/typedef struct Bookunsigned int key;/书的

7、编号 char bname20;/书的名称 char writter20;/作者姓名 unsigned int left;/剩余量 unsigned int total;/总库存量 Reader readerM;/借书者记录Books;/*B-树的存储结构*/typedef struct BTNodeint keynum;/结点关键子的个数 struct BTNode *parent;/指向父结点的指针Books keym+1;/一个结点中最多存放的书的个数struct BTNode *ptrm+1;/指向孩子结点的指针BTNode,*BTree;/*查找结果的存储结构体*/typedef s

8、tructBTNode *pt; int i; int tag; Result;(2) 模块划分和层次结构(3) 函数原型清单/*欢迎界面*/void print();/界面 char menu();/菜单界面/*输入书的信息*/void InBookMess(Books &book);/输入书号、书名等/*查找关键字在结点的位置*/int Search(BTree p, Books K);/一个结点中查找元素,返回结点的位置 Result SearchBTree(BTree T, Books K);/查找K书在树的位置并返回结果结构体 void ShowBookMess(Books book

9、);/显示一本书的具体信息/*插入关键字*/void NewRoot(BTree &T, BTree p, Books x, BTree ap);/ 生成一个树新的结点void split(BTree &q, int s, BTree &ap);/分离节点void Insert(BTree &q, int i, Books x, BTree ap);/一个节点上的插入 int InsertBTree(BTree &T, Books K);/将书插到B-树上/*B-树凹入输出*/ void mball(BTree bth,int num);/凹入输出/*删除关键字*/void MoveLeft(

10、BTree &q,int i);/将一个关键词经结点q移到左兄弟中 ,q为要删关键字结点的双亲结点 void MoveRight(BTree &q,int i);/将一个关键词经结点q移到右兄弟中 ,q为要删关键字结点的双亲结点 void Merge(BTree &q,int i);/合并结点,q为被删关键字结点的双亲结点 void DeleteBTree(BTree &T);/删除一个关键字/*显示书库*/void display(BTree T);/显示一棵树的所有书的书名/*输入书的关键字*/ void InBookKey(Books &book);/输入查找书的关键字 /*借还书*/v

11、oid borrow(BTree root);/借书 void payback(BTree root);/还书(4) 程序总体框架int main()Result rs; Books k; char t;/输入y或者n while(1)char c;print();c=menu(); /显示菜单switch(c) /按菜单函数返回值调用各相应函数case 1: system(cls);printf(t- 录入书信息-n);InBookMess(k); /输入添加书的内容 InsertBTree(root,k);/将书插入在B-树中 printf(t- 录入结束- n);printf(nThe

12、Btree is:n);mball(root,0);/凹入输出 break;case 2: system(cls);DeleteBTree(root);/删除B-树中的一本书printf(nThe Btree is:n);mball(root,0);break;case 3:system(cls); printf(t- 全部的书-nn);display(root);/ 显示整棵树的书的信息 printf(t- 显示完毕-n);break;case 4: system(cls);printf(t- 凹入表示法显示-n);printf(nThe Btree is:n); mball(root,0)

13、; break; case 5: system(cls);printf(t- 查找书信息-n);InBookKey(k);/输入要查找书的关键字 printf(n);rs = SearchBTree(root,k);if(rs.tag = 1)ShowBookMess(rs.pt-keyrs.i);/显示一本书的具体信息 elseprintf(t你要查找的书号%d 不存在!nn,k.key);printf(nt- 查找结束-n);break;case 6: system(cls);printf(t- 借阅-n);borrow(root);break;case 7:system(cls);pri

14、ntf(t- 还书-nn);payback(root);break;case 8:printf(nt你想退出吗?(y/n);t=getch();if(t=y|t=Y) exit(0);break;default :break;printf(nt 按任意键返回主菜单.);getch();system(cls);(5)程序组织第四部分:功能模块函数设计和调试/*菜单界面*/void print()printf(n );printf(n 欢迎进入图书管理系统 );printf(n );char menu()/显示菜单函数,返回接收的字符 printf(n);printf(n 1.新书入库 n 2.删

15、除旧书 n 3.显示书库 n 4.凹入显示 n 5.查找图书 n 6.读者借书 n 7.读者还书 n 8.退出系统 n);printf( n);printf(n);printf(ttt请选择n); printf(n);printf(n);printf(tt);fflush(stdin);/清除缓存return getchar(); /接受菜单命令 /*新书入库*/*输入添加书的内容*/void InBookMess(Books &book)char s5;printf(t请输入书号:);scanf(%s,s);book.key = atoi(s);printf(t请输入书名:);scanf(%

16、s,&book.bname);printf(t请输入作者:);scanf(%s,&book.writter);printf(t请输入总量:);scanf(%s,s);book.total = atoi(s);/将字符串转化为整型树 book.left = book.total;for(int i=0;ikeyi.bname,K.bname) != 0)printf(nt录入失败,原因:n);printf(.t书号冲突,请重新为该书编号!nn);printf(t已经存在书号为%d 的书为:n,q-keyi.key);ShowBookMess(q-keyi);return 0;else print

17、f(nt该书已经存在!nn);printf(t是否增加其总量(y/n):);getchar();scanf(%c,&addnum);if(addnum = Y | addnum = y)q-keyi.total+=K.total; q-keyi.left += K.total; printf(nt增加总量后该书的信息如下n);elseprintf(nt该书的信息如下:n);ShowBookMess(q-keyi); return 0; x = K; ap = NULL; finished = needNewRoot = 0; while (!needNewRoot & !finished) I

18、nsert(q, i, x, ap); /插入结点 if (q-keynum keys; if (q-parent) / 在双亲结点*q中查找x的插入位置 q = q-parent; i = Search(q, x); else needNewRoot = 1; if (needNewRoot) NewRoot(T, q, x, ap); / 生成新根结点*T,q和ap为子树指针 return 1;/*凹入表示法输入*/void mball(BTree bth,int num)/以brh为根节点的凹入输出 BTree p;int i,j;p=bth; /当前指向要输出的结点的指针if(p) /

19、结点非空for(j=0;jnum;j+) printf( );for(i=1;ikeynum;i+)/k=t;printf(%d ,p-keyi.key); /顺序输出该结点的关键字 /t=k;printf( n);for(i=0;ikeynum;i+) mball(p-ptri,num+1); /顺序递归访问该结点的各个子结点/*删除旧书*/*删除一个关键字*/void DeleteBTree(BTree &T)/在m阶B-树T上删除关键词Books x;/要删除Result rs; BTree q,p;int i,j,s=(m+1)/2;char isdel;/输入的是y还是n print

20、f(n);printf(nt 请输入你想要删除的书的关键字(即书号): );scanf(%d,&x.key);/x为要删的关键字 rs = SearchBTree(T,x);/找到x在B-树中的位置 if(rs.tag=0)printf(nt这本书不存在!n); return;printf(nt 你确定删除这本书吗?(y/n);getchar();scanf(%c,&isdel);if(isdel = n|isdel = N) return;else if (isdel = y|isdel = Y) while(rs.pt-ptrrs.i)/转化为叶子节点删除 rs.pt-keyrs.i=rs

21、.pt-ptrrs.i-key1; rs.pt=rs.pt-ptrrs.i; rs.i=1; p=rs.pt;/指向要删除关键字的结点 i=rs.i;/删除的关键词p-keyi位置 for(j=i;jkeynum;j+)/删除p-keyi和p-ptri p-keyj=p-keyj+1; p-ptrj=p-ptrj+1; p-keynum-; while(p-keynumparent; i=0; while(p!=q-ptri)/找出p结点为其双亲结点q的第i个孩子; i+; if(i=0)/结点p为最左边的孩子 if(q-ptr1-keynums-1)/右兄弟是否有多余的关键字 MoveLef

22、t(q,1); else Merge(q,1); else if(i=q-keynum)/结点p为最右边的孩子 if(q-ptri-1-keynums-1) MoveRight(q,i);else Merge(q,i); else if(q-ptri-1-keynums-1)/结点p为中间孩子,先检查左兄弟 MoveRight(q,i);else if(q-ptri+1-keynums-1)/再检查右兄弟 MoveLeft(q,i+1);else Merge(q,i); p=q; if(T-keynum=0)/根结点被合并,整个B-树降低一层 q=T;T=T-ptr0; free(q); vo

23、id MoveLeft(BTree &q,int i)/将一个关键词经结点q移到左兄弟中 ,q为要删关键字结点的双亲结点 int j;BTree r=q-ptri-1;/指向左结点 r-keynum+;r-keyr-keynum=q-keyi;/从双亲结点q移动关键词到左结点中 r-ptrr-keynum=q-ptri-ptr0;r=q-ptri; /指向右子树q-keyi=r-key1;/将右结点树中第一个关键词移到双亲结点q中 r-ptr0=r-ptr1;r-keynum-;for(j=1;jkeynum;j+)/将右结点中所有关键词左移一位 r-keyj=r-keyj+1;r-ptrj=

24、r-ptrj+1; void MoveRight(BTree &q,int i)/将一个关键词经结点q移到右兄弟中 ,q为要删关键字结点的双亲结点 int j;BTree r=q-ptri;/指向右结点for(j=r-keynum;j0;j-)/将右结点中所有关键词右移一位 r-keyj+1=r-keyj;r-ptrj+1=r-ptrj;r-key1=q-keyi;/将双亲结点q移动关键词到右结点中r-ptr1=r-ptr0;r-keynum+;r=q-ptri-1;/指向左结点q-keyi=r-keyr-keynum;/将左结点中最后一个关键词移到双亲结点q中 q-ptri-ptr0=r-p

25、trr-keynum;r-keynum-; void Merge(BTree &q,int i)/合并结点,q为被删关键字结点的双亲结点 int j;BTree r=q-ptri;/指向右结点,将被置空并删除;BTree l=q-ptri-1;/指向左结点l-keynum+;/从结点q移动关键词到左孩子中l-keyl-keynum=q-keyi;l-ptrl-keynum=r-ptr0;for(j=1;jkeynum;j+)/插入右结点中所有关键词l-keynum+;l-keyl-keynum=r-keyj;l-ptrl-keynum=r-ptrj; for(j=i;jkeynum;j+)/删

26、除父结点中相应的关键词 q-keyj=q-keyj+1;q-ptrj=q-ptrj+1;q-keynum-;free(r);/释放空的右结点占用的空间 /*显示书库*/*显示整棵树的信息*/void display(BTree T)int i = 0;if(T) for(i=0; ikeynum; i+) /使用递归的方法显示每个结点 display(T-ptri); printf(t); printf(书号为:%d , T-keyi+1.key); printf(书名为:%5s , T-keyi+1.bname); printf(作者为:%5s , T-keyi+1.writter); pr

27、intf(剩余量为:%5d , T-keyi+1.left); printf(总量为:%5d, T-keyi+1.total); printf(nn);display(T-ptri); /*凹入显示*/*凹入表示法输入*/void mball(BTree bth,int num)/以brh为根节点的凹入输出 BTree p;int i,j;p=bth; /当前指向要输出的结点的指针if(p) /结点非空for(j=0;jnum;j+) printf( );for(i=1;ikeynum;i+)/k=t;printf(%d ,p-keyi.key); /顺序输出该结点的关键字 /t=k;prin

28、tf( n);for(i=0;ikeynum;i+) mball(p-ptri,num+1); /顺序递归访问该结点的各个子结点/*查找图书*/*输入书的关键字*/void InBookKey(Books &book)char s5;printf(t请输入书号:);scanf(%s,s);book.key = atoi(s);/*在m阶B树T上查找关键字K,返回结果(pt,i,tag)*/Result SearchBTree(BTree T, Books K) BTree p, q; int found, i; Result R; p = T; q = NULL; found = 0; i =

29、 0; while (p & !found) i = Search(p, K); if (i 0 & p-keyi.key = K.key) found = 1; else q = p; p = p-ptri; if (found) R.pt = p; R.i = i; R.tag = 1; else R.pt = q; R.i = i; R.tag = 0; return R; /*显示书的具体信息*/void ShowBookMess(Books book)printf(t书号为:%3dn, book.key);printf(t书名为:%3sn, book.bname);printf(t作

30、者为:%3sn, book.writter);printf(t剩余量为:%3dn, book.left);printf(t总量为:%3dn, book.total);printf(n);/*读者借书*/void borrow(BTree root)int i,t,j;BTree p;Books k;Result rs;printf(n);printf(nt输入你想查找的书的关键字 (即书号): );scanf(%d,&k.key);printf(n);rs = SearchBTree(root,k);p=rs.pt;i=rs.i;if(rs.tag=1) /找到并显示该书的信息printf(nt 你想借这本书吗 ?(y/n);coutendlt ;coutendlsetiosflags(ios:left)t 书名 setw(28)keyi.bname; /输出相关内容coutendlt ;coutendlsetiosflags(ios:left)t 作者 setw(28)keyi.writter;coutendlt ;

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号