分享
分销 收藏 举报 申诉 / 11
播放页_导航下方通栏广告

类型广工数据结构课程设计--图书管理系统.doc

  • 上传人:精****
  • 文档编号:3940735
  • 上传时间:2024-07-24
  • 格式:DOC
  • 页数:11
  • 大小:44.54KB
  • 下载积分:8 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    数据结构 课程设计 图书 管理 系统
    资源描述:
    数据结构课程设计报告 题目:图书管理系统 学 院 计算机学院 专 业 年级班别 学 号 学生姓名 指导教师 成 绩 ____________________ 2012年6月 1. 需求分析 ⑴ 图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量为整型,书名、著者名为字符型,B树(2—3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;B树查找结果类型定义: 节点指针、关键字序号和查找标志变量为整型. ⑵输出的形式; 该演示系统,没有使用文件,全部数据放在内存存放。四项基本业务都以书号为关键字进行的,采用了B树(2—3树)对书号建立索引,以B树的形式进行输出,形象且可以提高效率。 ⑶程序所能达到的功能; ① 采编入库:新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示B树现状. ②清除库存: 实现某本书的全部信息删除操作 ,每清除一个书号则已以凹入表的形式显示B树现状.③ 图书借阅: 如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。④ 图书归还:注销借阅者信息,并改变该书的现存量。 ⑤显示:以凹入表的形式显示 B树.这个操作是为了调试和维护的目的而设置的。 ⑷测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 入库书号: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)。抽象数据类型B树定义: ADT BTree{ 数据对象:D是具有相同特性的数据元素的集合.各个数据元素均含有类型相同,可惟一标识数据元素的关键字. 数据关系:数据元素同属于一个集合并且: 一棵m阶的B树,或为空,或为满足下列特性的m叉树: 树中每个结点至多有m棵子树; 若根结点不是叶子结点,则至少有两棵子树; 除根之外的所有非终端结点至少有m/2(取上限)棵子树; 所有的非终端结点包含下列信息数据: (n,A0,K1,A1,K2,A2,K3,……,Kn,An) 其中:Ki(i=1,2,……n)为关键字,且Ki〈Ki+1(i=1,2,……n-1);Ai(i=0,……n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,2,……n),An所指子树中所有结点的关键字均大于Kn,n(m/2(取上限)—1〈=n〈=m-1)为关键字的个数 基本操作: CreateBTree(BTree *T) 操作结果:构建B—树 BTreeSearch(sBTree *T,int k,sBTree* &x,int &index) 初始条件:树T存在,k为和关键字类型相同的给定值。 操作结果:若B树T中存在关键字等k的数据元素,则返回该元素的值或在表中的位置,否则返回“空”. BTreeInsert(k) 初始条件:B树T存在,k为待插入的数据元素。 操作结果:若T中不存在关键字等于k的数据元素,则插入k到T中。 BTreeDeleteKeywords(sBTree* T,k); 初始条件:B树T存在,k为和关键字相同的给定值。 操作结果:若T中存在其关键字等于k的数据元素,则删除之。 BTreeTraverse(BTree T,Visit) 初始条件:B树T存在,Visit是对T结点的函数 操作结果:遍历B树T,对每个结点调用Visit函数 PrintBTree(sBTree* T); 初始条件:书库T存在。 操作结果:以凹入表形式显示B树T。 }ADT BTree (2)。图书管理类型定义: ADT Book{ 数据对象:D={ai | ai∈BookType,i=1,2,3,……n,n〉=0,其中 每个数据元素ai含有类型相同,可惟一标识数据元素的关键字} 数据关系:数据元素同属一个集合 基本操作: InsertBook(sBTree *T,sKeywords keywords) 初始条件:B树T已存在。 操作结果:如果所要插入的书中已存在T树中,则只将该书的库存量增加,否则插入到T树中. Rent(k) 初始条件:书库不为空. 操作结果:如果书库中有书号为k的书,则借书成功,否则返回查找失败。Get(k) 初始条件:书库不为空。 操作结果:如果书库中有书号为k的书,则还书成功,否则返回查无此书。 }ADT Book (3)主程序 int main() { 初始化 系统界面; do { switch() 显示菜单信息; 接受命令; 处理命令; 输出结果; }while } 3。 详细设计 (1)抽象数据类型 B— 树存储定义: struct sBTree{ int n;//关键字的计量 sKeywords keywords[MAX_KEYWORDS];//关键字的最大容量 bool leaf; //判断是否为叶子 sBTree* children[MAX_KIDSNUM]; //孩子 }; sBTree *root=NULL; //根结点 int deep=0; //深度 void CreateBTree(); //构建B树 bool BTreeSearch(sBTree *T,int count,sBTree* &x,int &index);//查找关键字 void BTreeInsert(sKeywords keywords);//插入 void BTreeInsertNonfull(sBTree* x,sKeywords keywords); //非满B树的插入 void BTreeDeleteKeywords(sBTree* x,int count);//删除结点 void BTreeSplitChild(sBTree *parent,int i); //分裂孩子结点 sBTree* BTreeSplit(sBTree *x,sKeywords &keywords); //分裂结点 void BTreeCombine(sBTree *x,sKeywords keywords,sBTree *newNode)//结点合并 (2) B— 树操作定义 void CreateBTree() {//构建B—树 sBTree* newNode=(sBTree*)malloc(sizeof(sBTree));//分配存储空间 newNode—〉leaf=true; newNode—〉n=0; root=newNode; for(int i=0;i<MAX_KIDSNUM;i++) root—〉children[i]=NULL; } bool BTreeSearch(sBTree *T,int count,sBTree* &x,int &index) {//查找操作 int i=0; while( i〈(T-〉n) && count>(T—〉keywords[i]。count) ) i++; if( i<(T—〉n) && count==(T—〉keywords[i]。count) ){ x=T; index=i; return true; } if(T->leaf) return false; else return BTreeSearch(T—〉children[i],count,x,index); } void BTreeInsert(sKeywords keywords) { / /插入操作 sBTree* r=root; if(r—〉n==MAX_KEYWORDS){ //如果结点B树已满,则分配新的结点 sBTree* newNode=(sBTree*)malloc(sizeof(sBTree)); root=newNode; newNode-〉leaf=false; newNode—〉n=0; newNode—〉children[0]=r; BTreeSplitChild(newNode,0); BTreeInsertNonfull(newNode,keywords); } else BTreeInsertNonfull(r,keywords); } void BTreeInsertNonfull(sBTree* x,sKeywords keywords) { int i=(x—〉n); while( i〉0 && keywords〈x—>keywords[i—1] ) i-—; if(x-〉leaf) AddKeywordsToLine(x,i,keywords,NULL,true); else{ if( x—〉children[i]—〉n==MAX_KEYWORDS ){ BTreeSplitChild(x,i); if( keywords〉x—>keywords[i] ) i++; } BTreeInsertNonfull(x—>children[i],keywords); } } void BTreeDeleteKeywords(sBTree* x,int count) { //删除结点 sKeywords keywords; sBTree* newNode; int index=-1; if(x-〉leaf){ BTreeDeleteLeafData(x,count); } else if( DataInNode(x,count,index) ){ if( (x—>children[index]-〉n) > MIN_KEYWORDS ){ keywords=MaxKeywords(x-〉children[index]); x—〉keywords[index]=keywords; BTreeDeleteKeywords(x—>children[index],keywords。count); } else if( (x-〉children[index+1]—〉n) 〉 MIN_KEYWORDS ){ keywords=MinKeywords(x-〉children[index+1]); x->keywords[index]=keywords; BTreeDeleteKeywords(x-〉children[index+1],keywords。count); } else{ newNode=RemoveKeywordsFromLine(x,index,keywords,false); BTreeCombine(x-〉children[index],keywords,newNode); BTreeDeleteKeywords(x—〉children[index],count); } } else{ for(index=0;index<x->n;index++){ if(count〈x—〉keywords[index]。count) break; } if(x—〉children[index]-〉n==MIN_KEYWORDS){ if( index>0 && (x—〉children[index—1]—〉n)〉MIN_KEYWORDS ){ newNode=RemoveKeywordsFromLine(x->children[index—1],x->children[index-1]—>n—1,keywords,false); AddKeywordsToLine(x-〉children[index],0,x—〉keywords[index-1],newNode,false); x—>keywords[index—1]=keywords; BTreeDeleteKeywords(x-〉children[index],count); } else if( index〈(x—〉n) && (x—〉children[index+1]—〉n〉MIN_KEYWORDS) ) { newNode=RemoveKeywordsFromLine(x—>children[index+1],0,keywords,true); AddKeywordsToLine(x—〉children[index],x—〉children[index]-〉n,x->keywords[index],newNode,true); x—>keywords[index]=keywords; BTreeDeleteKeywords(x—>children[index],count); } else{ if(index==0){ newNode=RemoveKeywordsFromLine(x,index,keywords,false); BTreeCombine(x—〉children[index],keywords,newNode); BTreeDeleteKeywords(x->children[index],count); } else{ newNode=RemoveKeywordsFromLine(x,index-1,keywords,false); BTreeCombine(x—〉children[index-1],keywords,newNode); BTreeDeleteKeywords(x—>children[index—1],count); } } } else{ BTreeDeleteKeywords(x-〉children[index],count); } } newNode=root; while(root—>n==0){ newNode=root-〉children[0]; free(root); root=newNode; } } (3) 图书管理存储定义 void printBTree(sBTree* T); //B树的形式显示当前所有的图书号 void printTab(); void InsertBook(sBTree *T,sKeywords keywords); //插入新书 sKeywords MakeNewBook(); //输入新书的信息 void rent(int count); //借书 void get(int count); //还书 (4)图书管理函数定义 sKeywords MakeNewBook() //输入新书的信息 { sKeywords keywords; printf("请输入新书编号:\n"); scanf(”%d”,&(keywords。count)); printf(”请输入新书名称:\n”); scanf(”%s”,keywords.name); printf(”请输入新书作者:\n”); scanf("%s",keywords。author); printf(”请输入新书数量:\n”); scanf(”%d”,&(keywords。allReserves)); keywords.reserves=keywords。allReserves;//现有数量等于库存量 return keywords; } void InsertBook(sBTree *T,sKeywords keywords) //插入新书 { int index; sBTree* x; bool exist=BTreeSearch(T,keywords.count,x,index); if(exist){ x-〉keywords[index].allReserves+=keywords。allReserves;//库存增加 x—〉keywords[index]。reserves+=keywords。reserves;//现有量增加 } else{ BTreeInsert(keywords); } } void rent(int count) //借书,书库中有书号为count的书,借阅成功,否则“查 找 //失败 { sBTree* x; int index; if( BTreeSearch(root,count,x,index) && (x—〉keywords[index]。reserves>0) ) x-〉keywords[index]。reserves—-; else printf("查找失败!\n”); } void get(int count) //还书,如果书库中有书号为count的书,则可归还 { //若无,则输出“查无此书”。 sBTree* x; int index; if( BTreeSearch(root,count,x,index) ) x—>keywords[index]。reserves++; else printf(”查无此书!\n”); } void printBTree(sBTree* T) //B树的形式显示当前所有的图书号 { if(T==NULL) return; if(T—>leaf){ for(int i=0;i<T—>n;i++){ printTab(); printf("%d\n",T—>keywords[i]。count); } } else { for(int i=0;i<T—〉n;i++){ deep++; printBTree(T—>children[i]); deep—-; printTab(); printf("%d\n",T—〉keywords[i]。count); } deep++; printBTree(T—〉children[T->n]); deep——; } } void printTab() //按制表位输出书号 { for(int i=0;i〈deep;i++) printf("\t”); } (5) 主函数 void main() { sKeywords keywords; int count; //书号 char choice; CreateBTree(); //构建B树 printf(” \n\n”); printf(” 图书管理系统主菜单\n”); printf(” ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf(” ☆ 1-—--采编入库 ☆\n\n”); printf(" ☆ 2---—清除库存 ☆\n\n”); printf(” ☆ 3-——-借阅 ☆\n\n"); printf(” ☆ 4—--—归还 ☆\n\n"); printf(” ☆ 5-———显示 ☆\n\n”); printf(" ☆ 6—--—退出 ☆\n\n"); printf(” ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n”); printf(" 请选择相应编码:"); do{ scanf("%c",&choice); switch(choice) { case ’1’: //采编入库 keywords=MakeNewBook(); InsertBook(root,keywords); break; case '2': //清除库存 printf(”要删除的书编号为:”); scanf(”%d”,&count); BTreeDeleteKeywords(root,count); break; case ’3’: //借书 printf("要借出的书编号为:”); scanf("%d",&count); rent(count); break; case ’4’: //还书 printf(”归还的树编号为: ”); scanf(”%d”,&count); get(count); break; case ’5’: //退出 printBTree(root); default: break; } }while(choice!=’6'); } 函数调用过程如下图所示: 主函数 还书 借书 采编入库 清除库存 退出 构造函数 录入信息 插入结点 4。 调试分析 ⑴调试过程中遇到的问题以及对设计与实现的回顾讨论和分析: 对于本次设计个人感觉难度很大,因为图书管理系统涉及到的功能比较多,采编入库、清除库存、借阅和和归还,其中最难的部分是B树定义和操作以及B树相关操作的调用,书上对于B树这一块的内容比较少,网上B树的基本操作和算法很少,因此在B树的插入和删除算法上花了很多时间,后来通过网上查找资料跟同学讨论得出。此外,因为涉及的算法和代码比较多,很容易出各种各样的错,在编译方面也花了不少时间. ⑵算法的时空分析: 这个图书管理系统的存储时建立在内存上的,故程序退出数据得不到保存,每个功能感觉比较独立,相互间联系不算多,想要提高基本操作和算法的效率只能通过在算法的设计以及存储结构上下功夫. ⑶经验和体会: 《数据结构》这门课程考验的不仅仅是人的思维,更多的是考验人的耐心和洞察力,想要学好这一门课程,掌握基本要领,以及编写出执行能力各方面都强的程序需要花更多的时间去钻研;在编写过程中,会出现各种各样细节上的问题,大到一条算法,小到一个“="与“=="或者是“;”与“;”都可能成为你的障碍,细心和牢固的基础知识很重要。 5。 用户使用说明 1. 本程序运行环境为VC 6。0,执行文件为:图书管理系统。exe; 2. 程序界面与菜单信息 选择1:采编入库 ,新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示B树现状。 选择2:清除库存,实现某本书的全部信息删除操作 ,没清除一个书号则已以凹入表的形式显示B树现状。 选择3:图书借阅,如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间. 选择4:图书归还,注销借阅者信息,并改变该书的现存量. 选择5:显示输出。 选择6:安全退出. 6. 测试结果 测试数据: 入库书号:35,16,18,70,5,50,22,60,13,17,12,45,25,42,15,90,30,7 分别删除书号:45、90、50、22、42 (1) 新书入库界面如下: (2)所有的书号录入完毕后以B树形式显示: (3)分别删除书号45、90、50、22、42 (4) 删除后以B树形式显示剩下所有的书号 (5) 当只向系统中录入书号为35的书时,以下为借书号为12和书号为35、还书号为12和还书号为35的运行情况(成功和失败的测试结果) 7。 附录 提交源程序软盘 程序文件名清单:
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:广工数据结构课程设计--图书管理系统.doc
    链接地址:https://www.zixin.com.cn/doc/3940735.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork