数据结构课程设计-图书管理系统_第1页
数据结构课程设计-图书管理系统_第2页
数据结构课程设计-图书管理系统_第3页
数据结构课程设计-图书管理系统_第4页
数据结构课程设计-图书管理系统_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用用 C 语言实现图书管理系统语言实现图书管理系统 摘 要 图书管理系统主要是对图书的录入 读者借阅 读者归还等功能进行 实现 本课程设计的系统开发平台为 Windows XP 程序设计语言为 C 程序 运行平台为 Windws98 2000 XP Seven 在程序设计中采用了 B 树方法提高书籍 的查找速度 关键词 程序设计 图书管理系统 C 数据结构 B 树 1 索引索引 1 1 课程设计目的 设计一个小型的图书管理系统 可以实现新增图书 读者借阅 读者归还 等功能 1 2 系统性能要求 能较快的查到所要查找的图书 能准确统计当前每种书的库存 以确定此 书是否可以外借 并且对外借的图书进行管理 记录借出时间 应还时间等 1 3 功能的实现 1 新书入库 确定书号后 登记到图书帐目表中 如果表中已有 则只将 库存量增加 2 借阅 如果一种书的现存量大于 0 则借出一本 登记借阅者的书证号 和归还期限 改变现存量 3 归还 注销对借阅者的登记 改变该书的现存量 2 系统详细设计及实现系统详细设计及实现 1 所用的知识体系 在整个程序的设计过程当中 用到了 C 的一些基础知识 面向对象的思 想和结构化的程序设计思想 数据结构的 B 树建立索引 用索引提高查找的效 率等 2 系统功能组成框图 3 3 系统功能模块划分系统功能模块划分 摸块保称功能说明 1系统管理显示库存 借阅 归还 2图书管理图书的添加 查询等操作 3借还书管理对每次借书信息的添加 删除等操作 主程序 输入显示借阅添加 加 查找退出 图 2 1 系统功能组成框图 显示库存 借出图书 新书入库 书号查找 归还 归还图书 排序 4 流程图 4 1 录入图书信息 录入图书信息 判断是否已经存在该图书 在原有的记录上加上现有的图 书数量 Y 向系统中加入新纪录 N 4 24 2 借阅图书借阅图书 输入要借阅的图书信息 判断图书是否存在 输出提示信息 告诉读者图书不存在 N 处理借阅功能 将该图书 数量减一 Y N 判断图书数 目是否大于 0 提示读者该图书都已借出 N Y N 4 34 3 归还图书归还图书 输入图书和读者信息 处理归还图书功能 清读 者的借阅记录 将图书的 在库数加一 5 功能实现 5 1 运行程序的主界面 图 5 1 操作界面 书号排 序 书名排 序 5 2 新书入库功能的操作界面 图 5 2 新书入库 5 3 查询数据的界面 图 5 3 查询书籍 5 4 查询所有书籍的界面 图 5 4 显示库存 5 5 图书借阅的界面 图 5 5 借阅书籍 5 6 还书的界面 图 5 6 还书 3 参考文献 1 谭浩强 C 语言设计 第三版 清华大学出版社 2 严蔚敏 吴伟民 数据结构 C 语言版 清华大学出版社 3 谭浩强 C 程序设计清华大学出版社 4 参考网址 5 参考网址 21cb15c html 附录 include include include include include 定义局变量 define N 10000 表示状态的字段 define TRUE 1 define FALSE 0 define OK 1 define ERROR 0 define INFEASIBLE 1 define OVERFLOW 2 typedef int Status typedef char string define m 3 B 树的阶 设为 借阅者的结构体 typedef struct User unsigned int number 借书证号码 int year int month int day 借书时间 int dyear 截至日期的年 int dmonth 截至日期的月 int dday 截至日期的日 struct User next 下一个借阅者 User 定义用户的的信息 书的结构体 struct Book unsigned int key 图书的书号 char bname 20 书名 char writter 20 著者 unsigned int left 现存量 unsigned int total 总存量 User user 借阅该书的人 b N 定义书的信息 B 树的存储结构 typedef Book KeyType typedef struct BTNode int keynum 结点中关键字个数 即结点的大小 struct BTNode parent 指向双亲结点 KeyType key m 1 关键字向量 号单元未用 struct BTNode ptr m 1 子树指针向量 BTNode BTree 查找结果的存储结构体 typedef struct BTNode pt 指向找到的结点 int i 1 m 在结点中的关键字序号 int tag B 树的查找结果类型 Result BTree root NULL 树根 函数声明部分 输入书的具体信息 void InBookMess KeyType 输入书的关键字 void InBookKey KeyType 显示书的具体信息 如果书存在就显示 void ShowBookMess Book book 显示一个结点中所包含的全部信息 显示单个结点 void ShowBTNode BTree p 显示 以层次的方法显示树的结点 void display BTree T 复制关键字的信息 void KeyTypeCopy KeyType 查找在某个结点中的位置 int Search BTree p KeyType K 查找 Result SearchBTree BTree T KeyType K 插入 void Insert BTree 分裂结点 void split BTree 生成一个新的结点 void NewRoot BTree 将书的信息插入到B 树中 Status InsertBTree BTree 删除树结点 Status DeleteBT BTree 与右最左结点交换 void exchange BTree 用户借阅 Status BorrowBook BTree T KeyType k 注销对借阅者的登记 改变该书的显存量 Status ReturnBook BTree T KeyType k void temp BTree T void save BTree p void save BTree p 保存模块程序 FILE fp 定义文件指针 if fp fopen book txt wb NULL 判断文件的存在 若非空 将fp 指向filename中记载的文件名的文件 printf 创建文件失败 n n 打印出错提示 getchar return for int i 1 i keynum i fprintf fp d s s d d n p key i key p key i bname p key i writter p key i left p key i total fclose fp 关闭文件 void temp BTree T int i if T save T 保存这个结点的全部值 for i 0 ikeynum i 使用递归的方法显示每个结点 if T ptr i temp T ptr i 读取文件 void read FILE fp fp1 定义文件指针 if fp fopen book txt rb NULL 打印出错提示 getchar return for int i 1 i 读取文件 if fscanf fp d s s d d InsertBTree root b i fclose fp 关闭文件 复制结点 将某个结点的值复制到另外一个值上 void KeyTypeCopy KeyType strcpy bak bname k bname bak left k left bak total k total strcpy bak writter k writter bak user k user 在一个结点中查找元素 返回结点的位置 int Search BTree p KeyType K if p return 1 int i 0 for i 0 i keynum else q p p p ptr i 在另一个分支上查找 if found 查找成功 R pt p R i i R tag 1 else 查找不成功 R pt q R i i R tag 0 返回结果信息 K的位置 或插入位置 return R 插入一条记录 void Insert BTree for int j n j i j KeyTypeCopy q key j 1 q key j 复制结点值 q ptr j 1 q ptr j KeyTypeCopy q key i 1 x q ptr i 1 ap if ap ap parent q q keynum 分离结点 void split BTree ap BTree malloc sizeof BTNode ap ptr 0 q ptr s for i s 1 j 1 i key j q key i ap ptr j q ptr i ap keynum n s ap parent q parent for i 0 i ptr i ap ptr i parent ap q keynum s 1 生成一个新的树结点 void NewRoot BTree T keynum 1 设置当前结点的元素个数 T ptr 0 p 设置左边结点的树根 T ptr 1 ap 设置右边的树根 KeyTypeCopy T key 1 x 将x 元素的结点值复制到T 的第一个元素中 当孩子不空的时候就设置当前结点为孩子的双亲 if p p parent T if ap ap parent T T parent NULL 当前结点的双亲为空 返回false 表示在原有结点上增加数量 返回true 表示创建了一个新的结点 Status InsertBTree BTree Result rs BTree q int i char addnum int finished needNewRoot s T是空树 参数q初值为NULL KeyType x 如果T 结点为空就生成一个新的结点 if T NewRoot T NULL K NULL else 查找元素k 在树中的位置 rs SearchBTree T K q rs pt 查找到包含元素k 的结点 i rs i 元素k 在树中的位置 if rs tag 1 判断该元素在树中是否存在 if strcmp q key i bname K bname 0 printf n t录入失败 原因 n printf t书号冲突 请重新为该书编号 n n printf t已经存在书号为 d 的书为 n q key i key ShowBookMess q key i return FALSE else printf n t该书已经存在 n n printf t是否增加其总量 y n scanf s if addnum Y addnum y q key i total K total 将总量增加 q key i left K left 将剩余量增加 printf n t增加总量后该书的信息如下 n ShowBookMess q key i else printf n t该书的信息如下 n ShowBookMess q key i ShowBookMess q key i return FALSE if x K ap NULL finished needNewRoot FALSE while needNewRoot 插入结点 if q keynum key s if q parent 在双亲结点 q中查找x的插入位置 q q parent i Search q x else needNewRoot TRUE else while if needNewRoot 根结点已分裂为结点 q和 ap NewRoot T q x ap 生成新根结点 T q和ap为子树指针 return OK 一个结点在双亲中的位置 返回其位置i int position BTree T if T return 0 int i 0 if T parent while i parent keynum if T T parent ptr i return i 返回当前的位置 i return 1 调整树的结构 Status fix BTree 取得p 在双亲中的位置 int mid m 1 2 1 要交换的临界点 BTree temp NULL int k if i 0 比自己小的兄弟结点 p keynum 增加一个结点 for k p keynum k 1 k KeyTypeCopy p key k p key k 1 将前面的结点后移一位 if p ptr 0 for k p keynum k 1 k p ptr k p ptr k 1 将要移动的结点的子结点向后移动 KeyTypeCopy p key 1 root key i 将双亲的结点复制到根 KeyTypeCopy root key i temp key temp keynum 将小兄弟结 点的最大的那个移动到双亲中 if temp ptr temp keynum 将兄弟结点的子结点也复制过来 p ptr 0 temp ptr temp keynum temp ptr temp keynum parent p 修改指向双亲的结点 temp ptr temp keynum NULL temp keynum 将左兄弟删除一个结点 return OK if i keynum p keynum 增加结点的个数 KeyTypeCopy p key p keynum root key i 1 将根结点的值 复制过来 KeyTypeCopy root key i 1 temp key 1 将右兄弟的结点复制 过来 for k 1 k keynum k KeyTypeCopy temp key k temp key k 1 将后面的结点向 前移动一位 if temp ptr 0 p ptr p keynum temp ptr 0 temp ptr 0 parent p 修改指向双亲的结点 for k 0 k keynum k 将子结点向前移动 temp ptr k temp ptr k 1 temp ptr k 1 NULL 将删除的结点的子结点置为空 temp keynum 将右兄弟删除一个结点 return OK return FALSE 合并结点 Status combine BTree 取得p 在双亲中的位置 int mid m 1 2 1 交换的条件 BTree p2 if i 0 如果是第一个位置 i 1 p2 root ptr i p keynum 增加一个结点 KeyTypeCopy p key p keynum root key i 将双亲的结点复制下 来 if p2 ptr 0 p ptr p keynum p2 ptr 0 将兄弟的子结点也复制过来 p2 ptr 0 parent p 修改双亲 for k i k keynum k 将双亲的结点向前移动一位 KeyTypeCopy root key k root key k 1 p keynum p key p keynum p2 key 1 if p2 ptr 1 p ptr p keynum p2 ptr 1 将兄弟的子结点也复制过来 p2 ptr 1 parent p 修改指向双亲的结点 root keynum free p2 p2 NULL for k 1 k keynum k root ptr k root ptr k 1 将双亲结点子结点向前移动 root ptr k 1 NULL else if i 0 p2 root ptr i 1 p2 keynum KeyTypeCopy p2 key p2 keynum root key i 复制根结点的值 到子结点中 if p ptr 0 p2 ptr p2 keynum p ptr 0 p ptr 0 parent p2 修改指向双亲的结点 for k i k keynum k KeyTypeCopy root key k root key k 1 将结点前移 root ptr k root ptr k 1 将子结点前移 root ptr k 1 NULL root keynum free p p p2 return OK 与右最左结点交换 void exchange BTree User user NULL if p ptr i p p ptr i while p ptr 0 p p ptr 0 while T key i user user T key i user 指向要释放的结点 T key i user T key i user next 指向下一个结点 free user 释放借阅者的信息 KeyTypeCopy T key i p key 1 交换数据 while i keynum 将该结点后面的数据后移 KeyTypeCopy p key i p key i 1 将后一个数据复制到前一个数 据 i p keynum 删除结点 T p return 输入书的具体信息 void InBookMess KeyType printf t请输入书号 编号最多为位数且不大于 do scanf s s book key atoi s if book key 65535 printf t输入有误 请重新输入 while book key 65535 printf t请输入书名 scanf s printf t请输入作者 scanf s printf t请输入总量 不能大于 do scanf s s book total atoi s if book total 65535 printf t输入有误 请重新输入 while book total 65535 book left book total book user NULL book user User malloc sizeof User 输入书的关键字 void InBookKey KeyType printf t请输入书号 do scanf s s book key atoi s if book key 65535 printf t输入有误 请重新输入 while book key 65535 book bname 0 0 book writter 0 0 book total 0 book left 0 显示书的具体信息 void ShowBookMess Book book User temp printf t书号为 3d n book key printf t书名为 3s n book bname printf t作者为 3s n book writter printf t剩余量为 3d n book left printf t总量为 3d n book total printf t 已借该书的人有 n temp book user while temp printf t图书证号 d t借书日期 d年 d月 d日 t归还日期 d年 d月 d日 n temp number temp year temp month temp day temp dyear temp dmonth temp dday temp temp next printf n 显示某个结点的信息 void ShowBTNode BTree p for int i 1 i keynum i printf t printf 书号为 d p key i key printf 书名为 5s p key i bname printf 作者为 5s p key i writter printf 剩余量为 5d p key i left printf 总量为 5d p key i total printf n 显示整棵树的信息 void display BTree T int i 0 if T ShowBTNode T 显示这个结点的全部值 for i 0 ikeynum i 使用递归的方法显示每个结点 if T ptr i display T ptr i 用户借阅说明 借阅登记的信息可以链接在相应的那种书的记录之后 输入借阅的信息 Status InUserMess User user char s 5 time t nowtime struct tm timeinfo time timeinfo localtime printf n t输入借阅者的信息 n printf t请输入图书证号 do scanf s s user number atoi s if user number number 65535 printf t输入有误 请重新输入 0到之间 while user number number 65535 printf t请输入归还日期 格式 d年 d月 d日 n timeinfo tm year 1900 timeinfo tm mon 1 timeinfo tm mday 归还日期的输入 printf t年 do scanf s s user dyear atoi s if user dyear tm year 1900 printf t输入有误 请重新输入 大于 d timeinfo tm year 1900 while user dyear tm year 1900 printf t月 do scanf s s user dmonth atoi s if user dmonth 12 user dmonth dmonth tm mon 1 while user dmonth 12 user dmonth dmonth tm mon 1 printf t日 do scanf s s user dday atoi s if user dday 31 user dday dday tm mday while user dday 31 user dday dday tm mday 设置借书的时间 user year timeinfo tm year 1900 user month timeinfo tm mon 1 user day timeinfo tm mday user next NULL return OK 借阅 如果一种书的显存量大于零 则借出一本 登记借阅着的图书证号和归还期限 Status BorrowBook BTree T KeyType k Result rs SearchBTree T k User user if rs tag 0 printf t很抱歉 你要借阅的书不存在 n return FALSE if rs pt key rs i left key rs i user while temp if temp number user number printf n t你已经借了这本书 不能够重复借 n free user return FALSE temp temp next rs pt key rs i left user next rs pt key rs i user rs pt key rs i user user return OK 还书 改变该书的库存量 Status ReturnBook BTree T KeyType k User user pre int number Result rs SearchBTree T k if rs tag 0 printf t很抱歉 不存在你要还的书 n return FALSE user rs pt key rs i user if user printf t这本书暂无出借 n return FALSE printf n t请输入图书证号 scanf d pre user do if user number number if user rs pt key rs i user rs pt key rs i user user next free user else pre next user next free user rs pt key rs i left return OK pre user user user next while user printf t你输入的图书证号不正确 请重新操作 n return FALSE 显示某个书的信息 void ShowWriterBook BTree p char writer for int i 1 i keynum i if strcmp p k

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论