数据结构——图书管理系统
- 格式:docx
- 大小:331.46 KB
- 文档页数:26
struct book /*图书信息*/{int num; /*书号*/char name[10]; /*书名*/char where[10]; /*所在书库*/char author[15]; /*作者*/char pub[20]; /*出版社*/int count; /*数量*/struct book *next;};/*输出模块*/void print(struct book *p0){struct book *p;p=p0->next;printf("\n\n\t\t^^^^^^^^^^^^^^图书信息表^^^^^^^^^^^^^^");printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量\n"); while(p!=NULL){printf(PT);p=p->next;}getch();}/*输入模块*/struct book *creat(){struct book *head,*p1,*p2;int i=0;head=p2=(struct book *)malloc(N);head->next=NULL;printf("\n\n\t\t录入图书信息");printf("\n\t---------------------------------------");while(1){ p1=(struct book *)malloc(N);printf("\n 请输入图书编号(书号为0结束): ");scanf("%d",&p1->num);if(p1->num!=0){printf("\n\n书名所在书库作者出版社图书数量\n");scanf("%s%s%s%s%d",p1->name,p1->where,p1->author,p1->pub,&p1->count); p2->next=p1;p2=p1;i++;}elsebreak;}p2->next=NULL;free(p1);printf("\n\t\t----------------------------------------");printf("\n\t\t %d 种书录入完毕",i);getch();return head;}/*查找模块*/void find(struct book *p0){char name[10];int flag=1;struct book *p;p=p0->next;printf("请输入要查找的书名:\n");scanf("%s",name);for(p=p0;p;p=p->next)if(strcmp(p->name,name)==0){printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量\n"); printf(PT);flag=0;break;}if(flag) printf("\n 暂无此图书信息\n");getch();}/*删除模块*/void del(struct book *p0){char name[10];int flag=1;struct book *p;p=p0;printf("请输入要删除的书名:\n");scanf("%s",name);while(p!=NULL){if(strcmp(p->name,name)==0){p0->next=p->next; /*后续节点连接到前驱节点之后*/free(p);printf("\t该书资料已删除.");flag=0;break;}p0=p;p=p->next;}if(flag) printf("\n\t无此图书信息。
湖南科技大学课程设计报告题目: 图书管理基本业务模拟院系:计算机科学与工程学院专业班级:计算机科学与技术一班学号: 0905010119学生姓名:张杰指导教师:李峰2010年12月31日一、问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。
1)新书入库功能:新到书籍入库包含几方面的操作:查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(长整型)、该书的现存量(整型)、该书的总量(整型)。
输入该信息之后,将该节点插入到书籍信息链表中去。
该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。
2)读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。
不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。
3)借阅功能书籍借阅主要涉及存书库和读者信息库双方的更新。
用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。
若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。
4)归还功能读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。
5)信息查询功能信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。
用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 . 系统功能模块划分4。
流程图 4。
1录入图书信息4.2借阅图书4。
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]参考网址/manual/zh/function。
数据结构课程设计图书管理系统在当今数字化的时代,图书管理系统对于图书馆的高效运作和管理至关重要。
作为数据结构课程设计的一部分,设计一个功能齐全、操作便捷的图书管理系统,不仅能够巩固我们所学的数据结构知识,还能提高我们解决实际问题的能力。
一、需求分析一个完善的图书管理系统应具备以下基本功能:1、图书信息管理:包括图书的书名、作者、出版社、出版年份、ISBN 号、分类号、库存数量等信息的录入、修改、查询和删除。
2、读者信息管理:记录读者的姓名、性别、身份证号、联系电话、借阅证号、借阅记录等,同时支持读者信息的增删改查。
3、借阅管理:实现读者的借书、还书操作,能够记录借阅日期和应还日期,并自动计算逾期天数和罚款金额。
4、图书查询:提供多种查询方式,如按书名、作者、出版社、分类号等进行精确或模糊查询,以便读者快速找到所需图书。
5、统计分析:能够统计图书的借阅次数、热门图书排行、读者借阅情况等,为图书馆的管理决策提供数据支持。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和管理图书和读者的信息。
1、图书信息和读者信息可以使用结构体数组来存储。
结构体可以包含图书或读者的各项属性,数组则方便进行批量操作和遍历。
2、对于图书的分类和索引,可以使用二叉查找树或哈希表。
二叉查找树可以保证有序性,便于中序遍历获取排序后的图书信息;哈希表则能够快速定位特定的图书或读者,提高查询效率。
3、借阅记录可以使用链表来存储,便于动态地添加和删除借阅信息。
三、系统功能模块设计1、登录模块系统管理员和读者分别拥有不同的登录入口和权限。
管理员可以进行所有操作,读者只能进行查询和借阅相关操作。
2、图书管理模块图书录入:管理员输入图书的详细信息,将其添加到图书信息数组中。
图书修改:根据图书的 ISBN 号或其他唯一标识,修改图书的相关信息。
图书删除:按照指定条件删除图书记录。
图书查询:提供多种查询条件,快速检索图书信息。
数据库原理及应用——图书馆管理系统数据库设计一.需求分析需求分析的任务是调查应用领域,对应用领域中各应用的信息要求和操作要求进行详细分析,形成需求分析说明书。
重点是调查,收集与分析用户在数据管理中的信息要求、处理要求、数据的安全性与完整性要求。
功能模块设计将图书管理系统业务分为四个大的方面:学生数据管理、图书征订管理、藏书管理、图书流通管理。
功能模块图功能模块分析办卡、挂失、注销学生在图书馆中必须持卡办理一切业务,新生必须首先办理借书卡,当借书卡丢失时需办理挂失业务,毕业生或中途退学者必须办理注销卡业务,以防止借书卡的流失。
查询、借书、环书、注销学生在图书馆中持卡可以进行以下业务:查询自己借书状态,借书,还书,当所借书籍丢失时需办理注销业务。
图书查询、缺书登记学生需要查询自己所需书籍时,若馆中有则直接借书;若馆中没有,可以进行缺书登记。
数据流程分析与设计数据流程图数据字典的建立数据字典数据字典是我在数据流程图中选取的一些中层数据流,我把我所抽去的数据列出以下表来。
数据项二.概念结构设计E-R图根据前面的需求分析,可以将图书管理系统数据库实体划分为图书信息实体集、学生信息实体集、馆藏地实体集、借书卡信息实体集、缺书信息实体集,各实体集里还包含不同的实体以下包括所有的实体。
学生:{学号,姓名,性别,年级,学院,专业,班级}图书:{条码号,书名,作者,出版社,定价,馆藏地编号,图书状态,借阅状态}馆藏地:{馆藏地编号,馆藏地名称}借书卡:{卡号,卡状态,学号}缺书:{书名,作者,出版社,定价,搜索频率}学生日常事务信息:{卡号,时间,欠书状态,超时罚款} E-R图三.逻辑结构设计概念模型向关系模型的转变将E-R图转换为关系模型,即将实体、实体的属性和实体之间的联系转化为关系模式,为应用程序建立专门的视图而不必要应用程序直接访问数据表关系模式的设计StudentBookJieyue(应还时间—借书时间)等于一个月PlaceRountin对时间的检查,当借还书中的还书时间小于应还时间时,超时罚款为零;当超过应还时间未还书时,开始计费,超时罚款=(时间-应还时间)*0.01;当借还书中的还书时间确定时,超时罚款=(还书时间-应还时间)*0.01。
数据结构课程设计说明书年月日1设计目的(小标题黑体五号字)设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。
2.设计内容与要求具体功能有:1)每种书的登记内容包括书号、书名、著作者、出版单位、现存量与库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号与归还期限,改变现存量;5)归还:注销对借阅者的登记,改变该书的现存量。
3.本设计所采用的数据结构所用数据结构:线性表、查找、排序链表:用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表就是一种链式存取的结构,为找第 i 个数据元素必须先找到第 i-1 个数据元素。
因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 与 i。
(1)malloc(size)在内存的动态存储区申请一个长度为size字节的连续空间。
(2)calloc(n,size)在内存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。
若此函数未被成功执行,函数返回值为0。
(3)free(p)释放由指针p所指向的存储单元,而存储单元的大小就是最近一次调用malloc()或calloc()函数时所申请的存储空间。
运用了单链表的插入、删除、排序、修改等一些操作!4.功能模块详细设计4、1 详细设计思想(一)基本思想:(二)图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。
(三)程序中的主要函数有:void main() //主函数int CreateListR(LinkList *L) //尾插法建表void LocateElem(LinkList *L) //查询int Sort(LinkList *L) //递增有序排序(直接插入排序法) void Display(LinkList *L) //输出排序结果ModifyList(LinkList *L) //修改int ListDelete(LinkList *L) //删除void Borrow(LinkList *L) //借阅void Return(LinkList *L) //归还4、2 核心代码#include <stdio、h>#include <string、h>#include<stdlib、h>#include<malloc、h>typedef struct {int num;char name[20];char author[20];char press[20];int count;char price[10];} ElemType;typedef struct LNode //定义单链表结点类型{ElemType data;struct LNode *next;} LinkList;void InitList(LinkList *L) //初始化线性表{L = (LinkList *) malloc(sizeof(LinkList)); //创建头结点L->next = NULL;}int CreateListR(LinkList *L) //尾插法建表{int i, n;LinkList *s, *q, *p;p = L;while (p->next != NULL )p = p->next;printf("请输入需要录入的图书信息的个数:n=");scanf("%d", &n);for (i = 1; i < n + 1; i++) {s = (LinkList *) malloc(sizeof(LinkList));printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &s->data、num, s->data、name, s->data、author,s->data、press, &s->data、count, s->data、price);q = L->next;if (q == NULL ) {p->next = s;p = s;p->next = NULL;printf("录入成功!\n");continue;}while (q != NULL ) {if (strcmp(s->data、name, q->data、name) == 0) {printf("此图书已存在!");printf("请重新输入:\n");scanf("%d%s%s%s%d%s", &p->data、num, p->data、name,p->data、author, p->data、press, &p->data、count,p->data、price);}q = q->next;}p->next = s;p = s;p->next = NULL;printf("录入成功!\n");}return 0;}void LocateElem(LinkList *L) //查询{LinkList *p = L->next; //p指向第一个数据结点int c;int x = 0;char name1[10], author1[10], press1[10];printf(" 1 按书名查询:\n");printf(" 2 按作者名查询:\n");printf(" 3 按出版社名称:\n");printf(" 4 返回\n");printf(" 请选择1--4进行操作:\n");scanf("%d", &c);if (c > 4 || c < 1) {printf("您的输入有误!\n");scanf("%d", &c);}switch (c) {case 1:printf("请输入图书书名: \n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->data、name) != 0) //查找图书书名p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data、num, p->data、name,p->data、author, p->data、press, p->data、count,p->data、price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 2:printf("请输入图书作者:\n");scanf("%s", author1);while (p != NULL ) {if (strcmp(author1, p->data、author) != 0) //查找图书作者p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data、num, p->data、name,p->data、author, p->data、press, p->data、count,p->data、price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 3:printf("请输入图书的出版社名称: \n");scanf("%s", press1);while (p != NULL ) {if (strcmp(press1, p->data、press) != 0) //查找图书出版社名称p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d %s %s %s %d %s",p->data、num, p->data、name, p->data、author,p->data、press, p->data、count, p->data、price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起!不存在此图书\n");break;case 4:break;}}int Sort(LinkList *L) //递增有序排序(直接插入排序法){LinkList *p = L->next, *q, *r; //p指向第一个数据结点if (p != NULL ) //若原单链表中有一个或以上的数据结点{r = p->next; //r保存*p结点直接后继结点的指针p->next = NULL; //构造只含一个数据结点的有序表p = r;while (p != NULL ) {r = p->next; //r保存*p结点的直接后继结点的指针q = L;while (q->next != NULL && q->next->data、num < p->data、num) q = q->next; //在有序表中找插入*p的直接前驱结点*q的位置p->next = q->next; //将*p插入到*q之后q->next = p;p = r; //扫描原单链表余下的结点}}return 0;}void Display(LinkList *L) //输出排序结果{LinkList *p = L->next;while (p != NULL ) {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d \t %s \t %s\t %s\t%d\t %s", p->data、num,p->data、name, p->data、author, p->data、press, p->data、count,p->data、price);printf("\n");p = p->next;}}int ModifyList(LinkList *L) //修改{LinkList *p = L;char name1[10];printf("请输入要修改的图书的书名:\n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->data、name) == 0) //查找所要修改的书名{printf("请输入修改后的信息!\n");printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &p->data、num, p->data、name, p->data、author, p->data、press, &p->data、count, p->data、price);printf("修改成功!\n");return 0;}p = p->next;}printf("不存在此图书\n");return 0;}int ListDelete(LinkList *L) //删除{LinkList *p = L->next, *q = L;char name1[10];if (p != NULL ) {printf("请输入要删除的书名:");scanf("%s", name1);}while (p->next != NULL && strcmp(p->data、name, name1) != 0) {p = p->next;q = q->next;}if (p->next != NULL ) //如果p此时不就是最后一个节点,说明此时已经找到书{q->next = p->next;printf("删除成功!\n");return 0;}if (p->next == NULL && strcmp(name1, p->data、name) != 0) //如果p此时为最后一个结点并且没有找到与之相符的书名{printf("您输入的书名不存在,请核实后重新输入!\n");} else {q->next = NULL;printf("删除成功!\n");}return 0;}void Borrow(LinkList *L) //借阅{LinkList *p = L->next;char name1[10];printf("请输入要借阅的图书的书名:\n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->data、name) != 0) p = p->next;if (p->next == NULL && strcmp(name1, p->data、name) != 0) printf("此图书不存在!\n");else if (p->data、count < 1)printf("此书已借完!\n");else if (strcmp(name1, p->data、name) == 0) {printf("借书成功!\n");p->data、count--;}}void Return(LinkList *L) //归还{LinkList *p = L->next;char name1[10];printf("输入归还书的书名: \n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->data、name) != 0) p = p->next;if (p->next == NULL && strcmp(name1, p->data、name) != 0)printf("错误!此图书不存在!\n");else if (strcmp(name1, p->data、name) == 0) {printf("该书归还成功!\n");p->data、count++;}}void menu() { //菜单函数printf("---------------------------------------------------------- \n");printf(" 欢迎光临图书管理系统! \n");printf("----------------------------------------------------------- \n");printf("1、图书信息录入添加功能:\n");printf("2、图书信息查询功能:\n");printf("3、图书信息排序功能:\n");printf("4、图书的修改功能:\n");printf("5、图书的删除功能:\n");printf("6、图书借阅功能:\n");printf("7、图书归还功能:\n");printf("0、退出系统:\n");printf("请选择您需要的操作:\n");}int main() //主函数{int s;LinkList *L;L = (LinkList *) malloc(sizeof(LinkList));InitList(L);menu();printf("请输入编号:\n");scanf("%d", &s);while (s != 0) {switch (s) {case 1:CreateListR(L);break;case 2:LocateElem(L);break;case 3:Sort(L);Display(L);break;case 4:ModifyList(L);break;case 5:ListDelete(L);break;case 6:Borrow(L);break;case 7:Return(L);break;case 0:printf("谢谢使用\n");break;}scanf("%d", &s);}return 0; }。
数据结构课程设计图书管理系统设计图书管理系统一、引言图书管理系统是为了方便图书馆进行图书的管理、借阅和归还而开发的软件系统。
本文将详细介绍设计一个图书管理系统所需的标准格式文本。
二、系统概述本图书管理系统旨在提供一个高效、便捷的图书管理平台,帮助图书馆实现图书的分类、借阅、归还、查询等功能。
系统主要包括以下模块:图书管理模块、借阅管理模块、读者管理模块、系统管理模块。
三、图书管理模块1. 图书录入功能a. 系统管理员可以录入新书籍的相关信息,包括书名、作者、出版社、ISBN 号、价格等。
b. 系统应提供图书信息的校验功能,确保录入的图书信息准确无误。
c. 系统应提供图书封面图片上传功能,以便读者更直观地了解图书。
2. 图书查询功能a. 读者和管理员可以根据关键字、作者、出版社等条件进行图书查询。
b. 系统应提供模糊查询和精确查询两种方式,以满足不同用户的需求。
3. 图书借阅功能a. 读者可以通过系统查询图书的借阅情况,并选择借阅。
b. 系统应记录借阅信息,包括借阅时间、归还时间等。
4. 图书归还功能a. 读者在归还图书时,系统应自动计算借阅天数,并生成相应的借阅费用。
b. 系统应提供归还图书的操作记录,以便管理员查看。
四、借阅管理模块1. 借阅记录查询功能a. 管理员可以查询所有借阅记录,并根据条件进行筛选。
b. 系统应提供按照借阅时间、归还时间等进行排序的功能,方便管理员进行统计分析。
2. 借阅统计功能a. 系统应提供借阅数量、借阅率等统计功能,方便管理员对图书馆的借阅情况进行分析。
五、读者管理模块1. 读者注册功能a. 读者可以通过系统进行注册,并填写个人信息。
b. 系统应提供校验功能,确保读者信息的准确性。
2. 读者信息修改功能a. 读者可以通过系统修改个人信息,如联系方式、密码等。
3. 读者信息查询功能a. 读者可以查询自己的借阅记录、借阅情况等。
六、系统管理模块1. 管理员管理功能a. 系统管理员可以管理其他管理员的账号和权限。
石河子大学信息科学与技术学院计算机科学与技术专业课程设计报告二、结构图1.功能结构图2.主流程图图书管理系统新增图书信息的输入查询在架的图书信息恢复被删除图书信息为读者办理借书注册办理借书手续办理还书手续退出系统三、程序设计的想法和具体思路图书管理系统分为图书管理和会员管理两大部分。
设计一个图书类Book ,包括一本图书的基本管理功能,具有以下私有数据:int tag;//删除标记 1:已删 0:未删int no;//图书编号 char name[20];//书名int onshelf;//是否再架 1:再架 2:已借设计一个图书库类BDatabase ,具有以下私有数据:让用户选择要实行的操作.设置选择变量choiceStart输出提示借书 功能 Choice=1 还书 功能 Choice=2 图书 维护 Choice=3 读者 维护 Choice=4 退出 系统 Choice=0StopChoice =‘其它数值’提示输入错误int top; //图书记录指针Book book[Maxb]; //图书记录在其构造函数中,将bo ok.txt文件的所有录入读到book[]中。
处理完毕,在析构函数中将book[]中的所有未删除记录笑道book.txt文件中,中间的处理是对book[]进行的。
设计一个读者类Reader,包括一个读者的基本管理功能,具有以下私有数据:int tag; //删除标记 1:已删 0:未删int no; //读者编号char name[10]; //读者姓名int borbook[Maxbor];//所借图书设计一个读者库类RDatabase,具有以下私有数据:int top; //读者记录指针Reader read[Maxr];//读者记录在其构造函数中,将reader.txt文件的所有记录读到read[]中。
处理完毕,在析构函数中将read[]中的所有未删除记录写到reader.txt文件中,中间的处理都是对reader[]进行的。
一、需求分析1. 图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。
B树(2-3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;B树查找结果类型定义:节点指针、关键字序号和查找标志变量为整型。
2. 演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。
该演示系统,没有使用文件,全部数据放在内存存放。
四项基本业务都以书号为关键字进行的,采用了B树(2-3树)对书号建立索引,以提高效率。
3.图书管理系统实现功能:①采编入库:新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示B树现状。
②清除库存:实现某本书的全部信息删除操作,每清除一个书号则已以凹入表的形式显示B树现状。
③图书借阅:如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。
④图书预约:如果某书库存为零,则记录预约者姓名和证号,系统自动抓取当前预约时间和取书时间。
⑤图书归还:注销借阅者信息,并改变该书的现存量。
⑥作者专区:输入作者名字,系统将查找相应作者全部著作并显示出来。
⑦图书信息:可以根据书号查阅此书基本信息、借阅信息和预约信息,亦可以查找全部图书基本信息。
二、概要设计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)为关键字的个数基本操作:SearchBTree(T ,key);初始条件:B树T存在,key为和关键字类型相同的给定值。
一.实验目的巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
二.实验内容图书管理系统主要完成以下几方面的功能:输入信息——enter();显示信息———display( );查找以书名作为关键字———search( );删除信息———delete( );存盘———save ( );装入———load( ) ;三.实验步骤(可选)1.数据结构设计:添加,查找,删除图书信息,用链式存储比较方便,由于查找,删除都是以书名或电话号码为关键字进行的,因此要用到双向链表,效率高,以实现各种功能。
由此重点和难点是双向链表的建立,查找,删除等基本操作。
2.算法的设计流程图:3.主要函数代码:dlink *enter(dlink *h);// 输入图书信息函数int menu_select();//菜单选择函数dlink *add(dlink *h);//增加读者信息函数void search(dlink *h) ;//查找图书函数dlink *deletebyB_name(dlink *h);// 以书名为关键字删除dlink *deletebyno(dlink *h) ;//以图书编号为关键字删除void output(dlink *h);// 输出图书信息函数void searchbyB_name(dlink *h) //按书名查找void searchbyno(dlink *h) //按编号查找void save(dlink *h) //保存图书信息到文件struct information{string B_name;string B_author;string B_no;string B_pub;string B_sum;};struct information a[120]; //建立图书信息结构体typedef struct doublelink //定义双向链表{struct information data;struct doublelink *Llink,*Rlink;}dlink;dlink *enter(dlink *h) //输入图书信息函数{ dlink *head,*r,*p,*q;head=h;r=h;q=h->Rlink;system("cls");//新建用户信息p=new dlink;cout<<"\n\t\t**************** 请输入图书信息****************"<<endl;cout<<"请输入书名:"<<endl;cin>>p->data.B_name;cout<<"请输入作者名: "<<endl;cin>>p->data.B_author;cout<<"请输入编号名: "<<endl;cin>>p->data.B_no;cout<<"请输入出版社: "<<endl;cin>>p->data.B_pub;cout<<"请输入馆藏量名: "<<endl;cin >>p->data.B_sum;p->Rlink=NULL;while(q!=NULL){r=q;q=q->Rlink;}p->Llink=r;r->Rlink=p;r=p;num++;char z;cout<<" 是否要继续插入新图书信息? (Y/N):"<<endl;cin>>z;if((z=='y')||(z=='Y'))head=insert(head);return head;}void searchbyB_name(dlink *h) //按书名查找{if(num==0){cout<<"\n\t当前通讯录没有任何联系人信息!!!"<<endl;cout<<"\n\t\t\t*****无法执行查找操作!!!!******"<<endl;cout<<endl;}else{dlink *head,*p,*q;string nam;head=h;p=h->Rlink;int i,j=1,k=1,mark=0;system("cls");cout<<"请输入要查找的图书书名:"<<endl;cin>>nam;for(i=k;i<=num;i++,p=p->Rlink){while(p&&p->data.B_name!=nam){q=p;p=p->Rlink;j++;}if(p){cout<<"您要查找的图书信息为:"<<endl;cout<<"*************************************************************************** ****"<<endl;cout<<"\n\t书名: "<<p->data.B_name<<endl;cout<<"\n\t作者名: "<<p->data.B_author<<endl;cout<<"\n\t编号名: "<<p->data.B_no<<endl;cout<<"\n\t出版社: "<<p->data.B_pub<<endl;cout<<"\n\t馆藏量: "<<p->data.B_sum<<endl;cout<<"*************************************************************************** ****"<<endl;cout<<endl;mark=1;if(p->Rlink==NULL){cout<<"\n\t已无重名信息"<<endl;cout<<"\n\t您是否继续下一个查找???(Y/N)"<<endl;char z;cin>>z;if((z=='y')||(z=='Y'))search(head);else break;}}if(p==NULL){if(mark==1){if(q->data.B_name!=nam){cout<<"\n\t已无重名信息"<<endl;cout<<"\n\t您是否继续下一个查找???(Y/N)"<<endl;char z;cin>>z;if((z=='y')||(z=='Y'))search(head);else break;}}else{cout<<"\n\t\t^^^^^搜索的图书不存在!!!!!^^^^^^"<<endl;cout<<endl;cout<<"\n\t您是否继续下一个查找???(Y/N)"<<endl;char z;cin>>z;if((z=='y')||(z=='Y'))search(head);else break;;}}dlink *deletebyB_name(dlink *h) //按书名删除图书信息{dlink *head,*p,*q;if(num==0){ cout<<"\n\t\t当前通讯录没有任何联系人信息!!!"<<endl;cout<<"\n\t\t\t\t删除操作无法执行!!!!!!!!!"<<endl;}else{string nam;int flag=1,k=1,i,j=1;head=h;p=h->Rlink;system("pause");system("cls");cout<<"请输入要删除的图书书名:"<<endl;cin>>nam;for(i=k;i<=num;i++,p=p->Rlink){while(p&&p->data.B_name!=nam){q=p;p=p->Rlink;j++;} //whileif(p) //waiif{cout<<"您要删除的图书信息为:"<<endl;cout<<"weiyu"<<j+1<<"weizhi"<<endl;cout<<"*************************************************************************** ****"<<endl;cout<<"\n\t书名: "<<p->data.B_name<<endl;cout<<"\n\t作者名: "<<p->data.B_author<<endl;cout<<"\n\t编号名: "<<p->data.B_no<<endl;cout<<"\n\t出版社: "<<p->data.B_pub<<endl;cout<<"\n\t馆藏量: "<<p->data.B_sum<<endl;cout<<"*************************************************************************** ****"<<endl;char z;cout<<"您确定要删除该图书信息吗?(Y/N)"<<endl;cin>>z;if((z=='y')||(z=='Y')){if(num==1){p->Llink->Rlink=NULL;free(p);num--;}elseif(p->Llink==head){ p->Rlink->Llink=head;p->Llink->Rlink=p->Rlink;free(p);num--;}else if(p->Rlink==NULL){p->Llink->Rlink=NULL;free(p);num--;}else{ p->Rlink->Llink=p->Llink;q->Rlink=p->Rlink;free(p);num--;}cout<<"\n\t\t已删除成功!"<<endl;break;/*char s;cout<<"\n您是否继续删除相同书名的图书???(Y/N)"<<endl;cin>>s;if((s=='y')||(s=='Y'))continue;else break; */}else {cout<<"\n\t已放弃删除!!"<<endl;//有问题char d;cout<<"\n您是否继续删除相同书名的图书???(Y/N)"<<endl;cin>>d;if((d=='y')||(d=='Y'))continue;else break;}}//waiifelse {cout<<"没有此图书信息"<<endl;char a;cout<<"\n您是否要继续删除???(Y/N)"<<endl;cin>>a;if((a=='y')||(a=='Y'))head=deletebyB_name(head);elsebreak;}}//for}//elsecout<<endl;return head;}//wai四.实验的结果及分析。
图书管理信息系统一、课程设计题目:图书管理信息系统二、课程设计内容:实现图书管理信息系统的设计。
这是一个数据结构的综合使用,涉及的知识比较全面,特别是对文件的使用更为全面。
进入系统后,操作员可进行系统维护、读者管理、图书管理、图书流通、退出系统等操作。
系统维护:有“初始化”和“读盘”两个重要操作。
第一次开始运行时,必须选择“初始化”,使有关文件指针、计数器等初始化为0;而在以后的每次操作开始时,选择“读盘”,将保存过的相关图书信息磁盘文件读入,以便进行各类操作。
读者管理:可实现读者信息的追加一项输入。
需要输入读者号、读者名、可借书数。
输入“y”可连续输入信息,若输入“n”则结束输入,退出读者管理。
图书管理:有“图书信息输入”和“图书信息查询”两个重要操作。
若选“图书信息输入”,就进入相关子模块,在输入信息的同时建立相应的索引及索引文件和索引链头文件,输入书号、书名、作者名、出版社、分类号、藏书量等信息,根据提示输入“y”实现连续输入,若输入“n”则结束输入,退出图书管理;有了图书信息数据之后,就可以进行图书信息的查询以及图书借阅等操作了。
若选“图书信息查询”,可根据提示按书号、书名、作者、出版社等进行查询,系统会将查询结果输出。
图书流通:有“借书处理”和“还书处理”两个重要操作。
当选择“借书处理”,系统接受输入信息后,首先查询读者文件。
若没查到,显示“非法读者!”,若查到,则再检查该读者书是否已借满,如果未借满,则继续检查图书文件;否则显示“书已借满!”。
检查图书文件如发现书号不存在或书已借出,都会提示读者“非法书号!”或“书已借出”,否则,进行借出处理,修改借阅文件、读者文件以及图书主文件的相关数据项,并显示“借书成功!”。
当选择“还书处理”,系统在接受输入信息之后,首先用书号查询借还书文件,若找到,则填入还书日期,然后再用书号查询图书主文件,修改借出数,用读者号查找读者文件,修改读者的借书数,而后显示“还书成功!”,否则显示“非法书号!”并返回主控菜单。
数据结构课程设计-图书管理---1. 引言本文档是数据结构课程设计的项目文档,主题为图书管理系统。
该系统旨在通过使用数据结构和算法,实现对图书的管理和查询功能。
本文档将详细说明系统的需求分析、系统设计、开发和测试。
2. 需求分析在这一章节中,我们将对图书管理系统的需求进行详细分析。
2.1 功能需求本系统主要包含以下功能:- 图书录入:管理员可以通过系统添加新的图书信息。
- 图书查询:用户可以根据不同的条件查询图书信息。
- 图书借阅:用户可以借阅图书,并进行相应的借阅和归还操作。
- 图书管理:管理员可以对图书进行管理,如修改图书信息、删除图书等。
- 用户管理:管理员可以管理系统用户的信息,包括添加新用户、删除用户等。
2.2 性能需求系统需要保证以下性能指标:- 响应时间:系统对用户的请求需要在合理的时间范围内进行响应,尽量避免长时间等待。
- 并发能力:系统需要支持多个用户同时使用,同时对于查询和借阅等高频操作需要有良好的并发处理能力。
- 数据存储和管理:系统需要能够高效地存储和管理大量的图书信息和用户信息。
2.3 界面需求系统的用户界面应该简洁、直观,易于使用,并且具有良好的用户体验。
界面设计需要考虑到不同用户的需求,并提供相应的功能入口和导航。
3. 系统设计在这一章节中,我们将对图书管理系统进行整体设计和模块划分。
3.1 总体架构图书管理系统的总体架构包括以下模块:- 用户管理模块:负责用户的注册、登录以及个人信息管理。
- 图书管理模块:负责图书的录入、查询、借阅和管理。
- 数据库管理模块:负责与数据库的交互,包括数据的读取和存储。
3.2 模块设计在本节中,我们将对各个模块进行详细设计。
3.2.1 用户管理模块该模块包括以下功能:- 注册:用户可以通过用户名和密码进行注册。
- 登录:注册成功后,用户可以使用用户名和密码进行登录。
- 个人信息管理:登录后,用户可以修改个人信息,包括用户名、密码、联系方式等。
数据结构课程设计说明书年月日1设计目的(小标题黑体五号字)设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。
2.设计内容和要求具体功能有:1)每种书的登记内容包括书号、书名、著作者、出版单位、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;5)归还:注销对借阅者的登记,改变该书的现存量。
3.本设计所采用的数据结构所用数据结构:线性表、查找、排序链表:用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是一种链式存取的结构,为找第 i 个数据元素必须先找到第 i-1 个数据元素。
因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i。
(1)malloc(size)在内存的动态存储区申请一个长度为size字节的连续空间。
(2)calloc(n,size)在内存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。
若此函数未被成功执行,函数返回值为0。
(3)free(p)释放由指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的存储空间。
运用了单链表的插入、删除、排序、修改等一些操作!4.功能模块详细设计4.1 详细设计思想(一)基本思想:(二)图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。
(三)程序中的主要函数有:void main() //主函数int CreateListR(LinkList *L) //尾插法建表void LocateElem(LinkList *L) //查询int Sort(LinkList *L) //递增有序排序(直接插入排序法)void Display(LinkList *L) //输出排序结果ModifyList(LinkList *L) //修改int ListDelete(LinkList *L) //删除void Borrow(LinkList *L) //借阅void Return(LinkList *L) //归还4.2 核心代码#include <stdio.h> #include <string.h> #include<stdlib.h>#include<malloc.h>typedef struct {int num;char name[20];char author[20];char press[20];int count;char price[10];} ElemType;typedef struct LNode //定义单链表结点类型{ElemType data;struct LNode *next;} LinkList;void InitList(LinkList *L) //初始化线性表{L = (LinkList *) malloc(sizeof(LinkList)); //创建头结点L->next = NULL;}int CreateListR(LinkList *L) //尾插法建表{int i, n;LinkList *s, *q, *p;p = L;while (p->next != NULL )p = p->next;printf("请输入需要录入的图书信息的个数:n=");scanf("%d", &n);for (i = 1; i < n + 1; i++) {s = (LinkList *) malloc(sizeof(LinkList));printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &s->data.num, s->, s->data.author, s->data.press, &s->data.count, s->data.price);q = L->next;if (q == NULL ) {p->next = s;p = s;p->next = NULL;printf("录入成功!\n");continue;}while (q != NULL ) {if (strcmp(s->, q->) == 0) {printf("此图书已存在!");printf("请重新输入:\n");scanf("%d%s%s%s%d%s", &p->data.num, p->,p->data.author, p->data.press, &p->data.count,p->data.price);}q = q->next;}p->next = s;p = s;p->next = NULL;printf("录入成功!\n");}return 0;}void LocateElem(LinkList *L) //查询{LinkList *p = L->next; //p指向第一个数据结点int c;int x = 0;char name1[10], author1[10], press1[10];printf(" 1 按书名查询:\n");printf(" 2 按作者名查询:\n");printf(" 3 按出版社名称:\n");printf(" 4 返回\n");printf(" 请选择1--4进行操作:\n");scanf("%d", &c);if (c > 4 || c < 1) {printf("您的输入有误!\n");scanf("%d", &c);}switch (c) {case 1:printf("请输入图书书名: \n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) != 0) //查找图书书名p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 2:printf("请输入图书作者:\n");scanf("%s", author1);while (p != NULL ) {if (strcmp(author1, p->data.author) != 0) //查找图书作者p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 3:printf("请输入图书的出版社名称: \n");scanf("%s", press1);while (p != NULL ) {if (strcmp(press1, p->data.press) != 0) //查找图书出版社名称p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d %s %s %s %d %s",p->data.num, p->, p->data.author,p->data.press, p->data.count, p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起!不存在此图书\n");break;case 4:break;}}int Sort(LinkList *L) //递增有序排序(直接插入排序法){LinkList *p = L->next, *q, *r; //p指向第一个数据结点if (p != NULL ) //若原单链表中有一个或以上的数据结点{r = p->next; //r保存*p结点直接后继结点的指针p->next = NULL; //构造只含一个数据结点的有序表p = r;while (p != NULL ) {r = p->next; //r保存*p结点的直接后继结点的指针q = L;while (q->next != NULL && q->next->data.num < p->data.num)q = q->next; //在有序表中找插入*p的直接前驱结点*q的位置p->next = q->next; //将*p插入到*q之后q->next = p;p = r; //扫描原单链表余下的结点}}return 0;}void Display(LinkList *L) //输出排序结果{LinkList *p = L->next;while (p != NULL ) {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d \t %s \t %s\t %s\t%d\t %s", p->data.num,p->, p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;}}int ModifyList(LinkList *L) //修改{LinkList *p = L;char name1[10];printf("请输入要修改的图书的书名:\n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) == 0) //查找所要修改的书名{printf("请输入修改后的信息!\n");printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &p->data.num, p->, p->data.author,p->data.press, &p->data.count, p->data.price);printf("修改成功!\n");return 0;}p = p->next;}printf("不存在此图书\n");return 0;}int ListDelete(LinkList *L) //删除{LinkList *p = L->next, *q = L;char name1[10];if (p != NULL ) {printf("请输入要删除的书名:");scanf("%s", name1);}while (p->next != NULL && strcmp(p->, name1) != 0) {p = p->next;q = q->next;}if (p->next != NULL ) //如果p此时不是最后一个节点,说明此时已经找到书{q->next = p->next;printf("删除成功!\n");return 0;}if (p->next == NULL && strcmp(name1, p->) != 0) //如果p此时为最后一个结点并且没有找到与之相符的书名{printf("你输入的书名不存在,请核实后重新输入!\n");} else {q->next = NULL;printf("删除成功!\n");}return 0;}void Borrow(LinkList *L) //借阅{LinkList *p = L->next;char name1[10];printf("请输入要借阅的图书的书名:\n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->) != 0)p = p->next;if (p->next == NULL && strcmp(name1, p->) != 0)printf("此图书不存在!\n");else if (p->data.count < 1)printf("此书已借完!\n");else if (strcmp(name1, p->) == 0) {printf("借书成功!\n");p->data.count--;}}void Return(LinkList *L) //归还{LinkList *p = L->next;char name1[10];printf("输入归还书的书名: \n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->) != 0)p = p->next;if (p->next == NULL && strcmp(name1, p->) != 0)printf("错误!此图书不存在!\n");else if (strcmp(name1, p->) == 0) {printf("该书归还成功!\n");p->data.count++;}}void menu() { //菜单函数printf("---------------------------------------------------------- \n");printf(" 欢迎光临图书管理系统! \n");printf("----------------------------------------------------------- \n");printf("1.图书信息录入添加功能:\n");printf("2.图书信息查询功能:\n");printf("3.图书信息排序功能:\n");printf("4.图书的修改功能:\n");printf("5.图书的删除功能:\n");printf("6.图书借阅功能:\n");printf("7.图书归还功能:\n");printf("0.退出系统:\n");printf("请选择你需要的操作:\n");}int main() //主函数{int s;LinkList *L;L = (LinkList *) malloc(sizeof(LinkList));InitList(L);menu();printf("请输入编号:\n");scanf("%d", &s);while (s != 0) {switch (s) {case 1:CreateListR(L);break;case 2:LocateElem(L);break;case 3:Sort(L);Display(L);break;case 4:ModifyList(L);break;case 5:ListDelete(L);break;case 6:Borrow(L);break;case 7:Return(L);break;case 0:printf("谢谢使用\n");break;}scanf("%d", &s);}return 0;}(此页附在说明书后,请在验收前填好)。
数据结构——图书管理系统图书管理系统是一种用于管理图书馆藏书和读者借阅情况的软件系统。
它通过建立一个数据库来存储图书的相关信息,并提供了一系列的功能来方便图书管理员进行图书管理和读者借阅操作。
一、图书管理功能:1. 图书入库:管理员可以通过系统将新购买的图书录入到系统中,包括图书的书名、作者、出版社、ISBN号、价格等信息。
2. 图书查询:管理员可以根据图书的关键词进行查询,以便快速找到所需图书的详细信息。
3. 图书借还:系统可以记录读者的借书和还书情况,包括借书日期、还书日期等信息。
管理员可以根据读者的借书卡号或者图书的ISBN号进行借还操作,并更新图书的可借数量。
4. 图书续借:读者可以在借书期限到期前申请续借,管理员可以在系统中进行续借操作,并更新借书日期。
5. 图书预约:读者可以通过系统预约已被借出的图书,当图书归还后,系统会自动通知预约者前来借阅。
二、读者管理功能:1. 读者注册:读者可以通过系统进行注册,填写个人信息并获得借书卡号。
2. 读者信息管理:管理员可以对读者的个人信息进行管理,包括修改个人信息和删除读者信息。
3. 读者查询:管理员可以根据读者的借书卡号或者关键词进行查询,以便快速找到读者的详细信息。
4. 读者借阅情况统计:系统可以记录读者的借阅情况,包括借阅次数、借阅图书的种类等信息。
管理员可以通过系统生成借阅报表,用于分析读者的借阅情况。
三、系统管理功能:1. 用户权限管理:系统可以设置不同的用户权限,包括管理员和普通用户。
管理员具有对系统的所有功能进行操作的权限,而普通用户只能进行图书查询和预约操作。
2. 数据备份与恢复:系统可以定期进行数据备份,以防止数据丢失。
同时,系统也提供了数据恢复功能,可以在数据丢失时恢复到最近的备份点。
3. 系统日志记录:系统可以记录管理员和读者的操作日志,包括登录日志、图书借还日志等,以便管理员进行操作审计和故障排查。
以上是一个基本的图书管理系统的功能描述,实际的系统还可以根据实际需求进行扩展和定制。
数据结构-图书管理系统数据结构图书管理系统在当今数字化的时代,图书管理系统扮演着至关重要的角色。
无论是学校的图书馆、城市的公共图书馆还是企业内部的资料室,都需要一个高效、便捷且可靠的图书管理系统来满足人们对于知识获取和信息管理的需求。
图书管理系统的核心在于对数据的有效组织和管理,而这就离不开数据结构的运用。
数据结构就像是图书馆的书架,为图书的存放和检索提供了有序的方式。
常见的数据结构如数组、链表、栈、队列、树和图等,在图书管理系统中都有着各自独特的应用。
首先,让我们来谈谈数组。
数组是一种线性的数据结构,它可以用来存储固定数量的相同类型元素。
在图书管理系统中,可以用数组来存储图书的基本信息,如书名、作者、ISBN 码等。
由于数组的存储是连续的,所以在读取和写入数据时具有较高的效率。
但它也有局限性,那就是在插入和删除元素时,需要移动大量的数据,操作相对较为复杂。
链表则是另一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表在图书管理系统中的优势在于插入和删除操作比较简单,只需要修改指针即可。
例如,当需要删除一本图书的信息时,只需要将相关节点的指针调整,而无需像数组那样移动大量数据。
然而,链表在随机访问元素时效率较低,因为需要从头开始依次遍历节点才能找到目标元素。
栈和队列也是图书管理系统中常用的数据结构。
栈遵循“后进先出”的原则,就像一叠盘子,最后放上去的盘子最先被拿走。
在图书管理系统中,栈可以用于保存用户的操作记录,以便在需要时进行回退。
队列则遵循“先进先出”的原则,类似于排队买票的人群,先来的先得到服务。
可以用队列来处理图书借阅的排队请求,保证公平性和有序性。
接下来是树结构,二叉树和二叉搜索树在图书管理系统中应用广泛。
二叉搜索树的特点是左子树的节点值小于根节点值,右子树的节点值大于根节点值。
这使得在查找特定图书时能够大大提高效率,时间复杂度为 O(log n)。
此外,还可以使用平衡二叉树(如 AVL 树、红黑树等)来保证树的平衡性,进一步提高查找、插入和删除操作的效率。
数据结构课程设计——图书借阅管理系统图书借阅管理系统是一个用于管理图书借阅和归还的系统,它可以帮助图书馆或其他类似机构更有效地管理图书资源,提供给用户更方便的借阅和归还服务。
本文将介绍图书借阅管理系统的设计和功能。
一、系统概述图书借阅管理系统是一个基于数据结构的软件系统,它主要包括图书管理、借阅管理、归还管理和用户管理等功能模块。
通过该系统,用户可以查询图书信息、借阅图书、归还图书以及管理个人信息等操作,实现了图书借阅流程的自动化和信息化。
二、系统设计1. 数据库设计系统使用关系型数据库存储图书信息、用户信息、借阅记录等数据。
数据库中的表包括图书表、用户表、借阅记录表等。
图书表包含图书的基本信息,如图书编号、书名、作者、出版社等;用户表包含用户的基本信息,如用户编号、姓名、性别、联系方式等;借阅记录表包含借阅的相关信息,如借阅编号、借阅日期、归还日期等。
2. 界面设计系统的用户界面采用图形化界面,方便用户操作和交互。
主要界面包括登录界面、主界面、图书查询界面、借阅界面、归还界面和个人信息管理界面等。
登录界面用于用户身份验证,主界面是系统的入口,其他界面用于具体的功能操作。
3. 功能设计(1) 图书管理功能该功能主要包括图书的添加、删除、修改和查询。
管理员可以通过图书管理界面对图书进行管理,包括添加新的图书、删除不需要的图书、修改图书的信息以及查询图书的详细信息。
(2) 借阅管理功能该功能主要包括借阅图书和归还图书。
用户可以通过借阅界面查询图书并借阅,系统会记录借阅信息并更新图书的可借数量。
用户在归还界面归还图书时,系统会更新借阅记录并将图书的可借数量恢复。
(3) 用户管理功能该功能主要包括用户信息的管理和查询。
管理员可以通过用户管理界面添加新用户、删除用户、修改用户信息以及查询用户的详细信息。
(4) 个人信息管理功能该功能主要包括用户个人信息的修改和查询。
用户可以通过个人信息管理界面修改自己的个人信息,如姓名、性别、联系方式等。
书籍信息管理系统系统数据结构设计
书籍信息管理系统的数据结构设计可以包括以下几个方面的数据结构:
1. 书籍信息数据结构:包含书籍的基本信息,如书名、作者、出版社、出版日期、ISBN等。
可以使用一个书籍对象来表示,或者使用一个包含这些信息的数据结构,如字典或者结构体。
2. 书籍库存数据结构:记录每本书的库存信息,如当前库存数量、进货价格、销售价格等。
可以使用一个库存对象来表示,或者使用一个包含这些信息的数据结构,如字典或者结构体。
3. 图书馆数据结构:记录所有的书籍信息和库存信息。
可以使用一个图书馆对象来表示,其中包括一个书籍信息的集合和一个库存信息的集合。
可以使用列表、数组、哈希表等数据结构来存储这些信息。
4. 读者信息数据结构:记录读者的基本信息,如姓名、年龄、性别、借书数量等。
可以使用一个读者对象来表示,或者使用一个包含这些信息的数据结构,如字典或者结构体。
5. 借阅记录数据结构:记录读者借阅书籍的相关信息,如借阅日期、归还日期、借阅状态等。
可以使用一个借阅记录对象来表示,或者使用一个包含这些信息的数据结构,如字典或者结构体。
这些数据结构可以相互关联,实现书籍信息的管理和查询功能。
在具体实现中,可以根据系统需求和编程语言的特性选择合适的数据结构来表示和存储这些信息。
图书馆管理系统目录一、问题描述:二、系统需求分析:1 功能要求:2 技术要求:3 方案分析:三、概要设计:四、详细设计与程序代码:五、运行结果与测试:六、设计体会与总结一、问题描述图书借阅管理系统是一个学校不可缺少的部分,它的内容对于学校的管理者和读者来说都至关重要,直接关系到图书的借用率,所以开发图书管理系统能够为管理员和读者提供充足的信息和快捷的查询手段。
编写程序系统主要实现图书馆的增加图书、查询图书、删除图书、借阅图书、还书;增加会员、查询会员、删除会员、借书信息、到期书催还等智能化管理过程。
图书管理者只需略懂电脑知识就可以简易的操作该图书借阅管理系统。
二、系统需求分析图书借阅管理系统主要分为两大功能:(1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书到期书催还);(2)会员管理(增加会员、查询会员、删除会员、借书信息);要完成这个题目,主要是建立解决图书和会员的信息的存储,解决的方法是建立两个带头结点的单链表,分别用于存储图书和会员。
解决了这个问题后就是如何建立这两个链表的联系了,解决的方法是在图书结点中设一个借书人编号,在会员结点中设一个数组用于存会员借的书。
解决了这两个问题,剩下的工作就简单了。
只需按链表的操作就可以了。
1功能要求在图书借阅管理程序中须实现以下功能:(1)图书修改功能:能对图书借阅系统存储的信息进行修改。
提供两种修改方式,如按照图书编号修改、按照书名修改。
图书编号是图书记录的自然顺序编号。
(2)图书删除功能:能对图书借阅系统的图书信息进行删除。
删除时以记录为单位,能一次删除一条记录。
(3)借书功能:能对借出的图书作记录信息,能一次借出一本图书。
(4)还书功能:能将被借出的图书信息还原,能一次借出一本图书。
(5)保存功能:能将记录保存在任何自定义的文件中,如保存在:c:\books 、c:\lenders。
(6)通信录管理结束后,能够正常退出图书借阅管理程序。
WORD格式石河子大学信息科学与技术学院计算机科学与技术专业课程设计报告二、结构图1.功能结构图图书管理系统新增图查询在恢复被为读者办理借办理还退出系书信息架的图删除图办理借书手续书手续统的输入书信息书信息书注册2.主流程图Start设置选择变量choice输出提示让用户选择要实行的操作 .借书功能还书功能图书维护读者维护退出系统Choice=Choice=1Choice=2Choice=3Choice=4Choice=0‘其它数值’提示输入错误Stop三、程序设计的想法和具体思路图书管理系统分为图书管理和会员管理两大部分。
设计一个图书类Book,包括一本图书的基本管理功能,具有以下私有数据:inttag;// 删除标记1:已删0:未删intno;// 图书编号charname[20];// 书名intonshelf;// 是否再架 1:再架2:已借1inttop; // 图书记录指针Bookbook[Maxb];// 图书记录在其构造函数中,将book.txt 文件的所有录入读到book[]中。
处理完毕,在析构函数中将book[]中的所有未删除记录笑道book.txt 文件中,中间的处理是对book[]进行的。
设计一个读者类 Reader,包括一个读者的基本管理功能,具有以下私有数据:inttag;// 删除标记1:已删0:未删intno; // 读者编号charname[10];// 读者姓名intborbook[Maxbor];// 所借图书设计一个读者库类RDatabase,具有以下私有数据:inttop; // 读者记录指针Readerread[Maxr];// 读者记录在其构造函数中,将reader.txt 文件的所有记录读到read[] 中。
处理完毕,在析构函数中将 read[] 中的所有未删除记录写到reader.txt 文件中,中间的处理都是对reader[] 进行的。
四、参考文献1)谭浩强,《C++程序设计》,北京,清华大学出版社,2006年2)李振鹏,张小莉,郑艳娟,《数据结构》,中国铁道出版社,2007年3)杨小平,《VisualC++项目案例导航》,北京,科学出版社,2002年4)DavidConger,《软件开发:编程与设计》,北京,清华大学出版社,2006年.5) FrancisGlassborowRobertaAllen ,《YouCanDoIt!——C++编程新手互动教程》,北京,人民邮电出版社,2005年五、课程设计总结心得体会选到这个课程设计题目的时候,感觉挺简单的,查找,增加,,显示,统计,这些平时都学过,用过,但是实际操作中还是遇到了很多问题,所以特意到图书馆专门借了几本关于数据结构程序设计方面的书,同时也希望能把平时没有学好的地方好好补一补,能对知识有更深层次的理解.一切准备就绪,把平时写的相关的程序出来参考,对比,慢慢才找到一些感觉,把源程序写出来.经过几天终于写完了程序的初稿,然后输入电脑,一编译,发现错误几十个,还有好多警告,只得一条一条的看,一个一个的改,首当其冲的是再输入电脑过程中不小心漏掉的标点符号,有些括号忘了,有些是忘了写分号等粗心导致的小毛病,这些错误很容易改正.到后面的错误就有些麻烦了,当中有个头文件忘了写,编译过程中好几十个错误就是改不过来, 后来和同学讨论才知道原来错在什么地方,这样一下就变成了几个错误,这时信心大增,有些错误都看不懂错在那里,由于英文水平不太好,只好去查字典,还要推敲这个单词在这里到底是哪个意思,再加上以往的经验和同学的帮助下,好不容易才得到零错误零警告,那时真开心,我的程序终于可以运行了,激动的按下运行,得到了预想的界面,按照提示操作,都很顺利,一个一个的实验每一个功能,都以为成功了,当运行到了删除功能时,突然出现死循环,只见操作界面不停的闪.这是逻辑错误,很难找,后来只有一步一步的,一句一句的检查,找到了错误的根源,并改正.从进入大学来,我们学习了C++,数据结构。
特别是高老师的认真授课,精心讲解下,同学们学到了很多东西,知识方面的很多,还有平时?心的习惯也养成了.这对我们以后的学习生活很有好处,最后感谢常老师一学期以来对我们的教育帮助,对我们程序设计时的辅导.六、程序运行结果附录:源代码#include<iostream> #include<iomanip>#include<string>#include<fstream>// 输入/输出文件流类usingnamespacestd;constintMaxr=100;// 最多的读者constintMaxb=100;// 最多的图书constintMaxbor=5;// 每位读者最多借五本书//读者类,实现对读者的信息的描述classReader{private:inttag;// 删除标记1:已删0:未删intno; // 读者编号charname[10];// 读者姓名intborbook[Maxbor];// 所借图书public:Reader(){}char*getname(){returnname;} // 获取姓名intgettag(){returntag;} // 获取删除标记intgetno(){returnno;} // 获取读者编号voidsetname(charna[]) // 设置姓名{strcpy(name,na);}voiddelbook(){tag=1;}// 设置删除标记1:已删0:未删voidaddreader(intn,char*na)// 增加读者{tag=0;no=n;strcpy(name,na);for(inti=0;i<Maxbor;i++)borbook[i]=0;}voidborrowbook(intbookid)// 借书操作{for(inti=0;i<Maxbor;i++){if(borbook[i]==0){borbook[i]=bookid;return;}intretbook(intbookid)// 还书操作5{for(inti=0;i<Maxbor;i++){if(borbook[i]==bookid){borbook[i]=0;return1;}}return0;}voiddisp()/ /读出读者信息{cout<<setw(5)<<no<<setw(10)<<name<<" 借书编号:[";for(inti=0;i<Maxbor;i++)if(borbook[i]!=0)cout<<borbook[i]<<"|";cout<<"]"<<endl;}};//读者类库,实现建立读者的个人资料classRDatabase{private:inttop; // 读者记录指针Readerread[Maxr];// 读者记录public:RDatabase() // 构造函数,将reader.txt 读到read[] 中{Readers;top=-1;fstreamfile("reader.txt",ios::in);//打开一个输入文件while(1){file.read((char*)&s,sizeof(s));if(!file)break;top++;read[top]=s;}{top=-1;6}intaddreader(intn,char*na)// 添加读者时先查找是否存在{Reader*p=query(n);if(p==NULL){top++;read[top].addreader(n,na);return1;}return0;}Reader*query(intreaderid)// 按编号查找{for(inti=0;i<=top;i++)if(read[i].getno()==readerid&&read[i].gettag()==0){return&read[i];}returnNULL;}voiddisp()// 输出所有读者信息{for(inti=0;i<=top;i++)read[i].disp();}voidreaderdata();// 读者库维护~RDatabase()// 析构函数,将read[] 写到reader.txt 文件中{fstreamfile("reader.txt",ios::out);for(inti=0;i<=top;i++)if(read[i].gettag()==0)file.write((char*)&read[i],sizeof(read[i]));file.close();}};voidRDatabase::readerdata(){charchoice;charrname[20];intreaderid;Reader*r;while(choice!='0')7{cout<<"读者维护:t1.新增t2.更改t3.删除t4.查找t5.显示t6.全删t0.退出"<<endl;cin>>choice;switch(choice){case'1':cout<<" 输入读者编号:";cin>>readerid;cout<< "输入读者姓名:";cin>>rname;addreader(readerid,rname);break;case'2':cout<<" 输入读者编号:";cin>>readerid;r=query(readerid);if(r==NULL){cout<<" 该读者不存在"<<endl;break;}cout<<" 输入新的姓名:";cin>>rname;r->setname(rname);break;case'3':cout<<" 输入读者编号:";cin>>readerid;r=query(readerid);if(r==NULL){cout<<" 该读者不存在"<<endl;break;}r->delbook();break;case'4':cout<<" 读入读者编号:";cin>>readerid;r=query(readerid);if(r==NULL){cout<<" 该读者不存在"<<endl;break;8}r->disp();break;case'5':disp();break;case'6':clear();break;default:cout<<" 输入错误,请从新输入:";break;}}}//图书类,实现对图书的描述,图书的编号,书名,借出,还入等classBook{private:inttag;// 删除标记 1:已删0:未删intno;// 图书编号charname[20];// 书名intonshelf;// 是否再架1:再架2:已借public:Book(){}char*getname(){returnname;}// 获取姓名intgetno(){returnno;}// 获取图书编号intgettag(){returntag;}// 获取删除标记voidsetname(charna[])// 设置书名{strcpy(name,na);}voiddelbook(){tag=1;}// 删除图书voidaddbook(intn,char*na)// 增加图书{tag=0;no=n;strcpy(name,na);onshelf=1;}intborrowbook()// 借书操作{if(onshelf==1){onshelf=0;return1;9}return0;}voidretbook()// 还书操作{onshelf=1;}voiddisp()// 输出图书{cout<<setw(6)<<no<<setw(18)<<name<<setw(10) <<(onshelf==1?" 在架":"已借")<<endl;}};//图书库类,实现对图书的维护,查找,删除等classBDatabase{private:inttop; // 图书记录指针Bookbook[Maxb];// 图书记录public:BDatabase()// 构造函数,将book.txt 读到book[]中{Bookb;top=-1;fstreamfile("book.txt",ios::in);while(1){file.read((char*)&b,sizeof(b));if(!file)break;top++;book[top]=b;}file.close();}voidclear()// 全删{top=-1;}intaddbook(intn,char*na)// 增加图书{Book*p=query(n);if(NULL==p){top++;book[top].addbook(n,na);10return1;}return0;}Book*query(intbookid)// 查找图书{for(inti=0;i<=top;i++)if(book[i].getno()==bookid&&book[i].gettag()==0){return&book[i];}returnNULL;}voidbookdata();// 图书库维护voiddisp(){for(inti=0;i<=top;i++)if(book[i].gettag()==0)book[i].disp();}~BDatabase()// 析构函数,将book[]写到book.txt 文件中{fstreamfile("book.txt",ios::out);for(inti=0;i<=top;i++)if(book[i].gettag()==0)file.write((char*)&book[i],sizeof(book[i]));file.close();}};voidBDatabase::bookdata(){charchoice;charbname[40];intbookid;Book*b;while(choice!='0'){cout<<"图书维护:t1.新增t2.更改t3.删除t4.查找t5.显示t6.全删t0.退出"<<endl;cin>>choice;switch(choice){case'1':cout<<" 输入图书编号:"<<endl;cin>>bookid;11cout<<" 输入图书书名:"<<endl;cin>>bname;addbook(bookid,bname);break;case'2':cout<<" 输入图书编号:"<<endl;cin>>bookid;b=query(bookid);if(b==NULL){cout<<" 该图书不存在"<<endl;break;}cout<<" 输入新的书名:"<<endl;cin>>bname;b->setname(bname);break;case'3':cout<<" 读入图书编号:"<<endl;cin>>bookid;b=query(bookid);if(b==NULL){cout<<" 该图书不存在"<<endl;break;}b->delbook();break;case'4':cout<<" 读入图书编号:"<<endl;cin>>bookid;b=query(bookid);if(b==NULL){cout<<" 该图书不存在"<<endl;break;}b->disp();break;case'5':disp();break;case'6':clear();12break;default:cout<<" 输入错误,请从新输入:";}}}//main() 函数的实现,程序的主界面的引导voidmain(){charchoice;intbookid,readerid;RDatabaseReaderDB;Reader*r;BDatabaseBookDB;Book*b;while(choice!='0'){ cout<<endl<<endl<<" ttt图书管理系统n";cout<<"1.借书t2.还书t3.图书维护t4.读者维护t0.离开"<<endl;cin>>choice;switch(choice){case'1':cout<<" 借书n读者编号:";cin>>readerid;cout<<" 图书编号:";cin>>bookid;r=ReaderDB.query(readerid);// 按编号查找if(NULL==r){cout<<" 不存在该读者,不能借书"<<endl;break;}b=BookDB.query(bookid);if(b==NULL){cout<<" 不存在该图书,不能借书"<<endl;break;}if(b->borrowbook()==0){cout<<" 该图书已借出,不能借书"<<endl;break;}r->borrowbook(b->getno());break;case'2':13cout<<"还书n读者编号:";cin>>readerid;cout<<" 图书编号:";cin>>bookid;r=ReaderDB.query(readerid);if(r==NULL){cout<<" 不存在该读者,不能还书"<<endl;break;}b=BookDB.query(bookid);if(b==NULL){cout<<" 不存在该图书,不能还书"<<endl;break;}b->retbook();r->retbook(b->getno());break;case'3':BookDB.bookdata();break;case'4':ReaderDB.readerdata();break;default:cout<<" 输入错误,请从新输入:";}}}14。