广工数据结构课程教学设计图书管理方案系统.doc

收藏

编号:2603448    类型:共享资源    大小:511.52KB    格式:DOC    上传时间:2020-04-23
8
金币
关 键 词:
数据结构 课程 教学 设计 图书 管理 方案 系统
资源描述:
^. 数据结构课程设计报告 题目:图书管理系统 学 院 计算机学院 专 业 年级班别 学 号 学生姓名 指导教师 成 绩 ____________________ 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=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;ichildren[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 && keywordskeywords[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;indexn;index++){ if(countkeywords[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;in;i++){ printTab(); printf("%d\n",T->keywords[i].count); } } else { for(int i=0;in;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
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:广工数据结构课程教学设计图书管理方案系统.doc
链接地址:https://www.taowenge.com/p-2603448.html
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

收起
展开