北京理工大学 数据结构实验报告 实验四 图书管理系统
- 格式:docx
- 大小:161.67 KB
- 文档页数:24
图书管理系统实验报告图书管理系统实验报告引言:图书管理系统是现代图书馆不可或缺的一部分,它通过计算机技术的应用,实现了对图书的分类、借阅、归还等操作的自动化管理。
本实验旨在通过设计和实现一个简单的图书管理系统,探索其功能和效果,并对系统进行评估和改进。
一、系统设计与功能1.1 系统设计本系统采用了客户端-服务器的架构,客户端通过图形界面与服务器进行交互。
服务器端负责处理用户请求,包括图书查询、借阅、归还等操作,并将结果返回给客户端。
1.2 系统功能本系统具有以下功能:1) 图书查询:用户可以根据图书的名称、作者、ISBN等信息进行查询,并获取相关的图书信息。
2) 图书借阅:用户可以选择所需图书,并进行借阅操作。
系统会自动检查图书的可借状态,并记录借阅信息。
3) 图书归还:用户可以将已借阅的图书归还给图书馆。
系统会更新图书的借阅状态,并记录归还信息。
4) 用户管理:系统支持用户注册、登录和个人信息管理等功能,以便用户进行借阅操作。
二、实验过程与结果2.1 实验过程在实验过程中,我们首先进行了需求分析,明确了系统的功能和性能要求。
然后,我们进行了系统设计,包括数据库设计、界面设计等。
接下来,我们使用Python编程语言实现了系统的客户端和服务器端,并进行了功能测试和性能测试。
2.2 实验结果经过测试,我们的图书管理系统能够正常运行,并且具备良好的用户界面和交互体验。
系统能够快速响应用户请求,并正确处理各种操作。
同时,系统的性能表现也较好,能够处理大量并发请求,并保持稳定的运行状态。
三、系统评估与改进3.1 系统评估在实验过程中,我们对系统进行了评估。
通过用户反馈和测试结果,我们发现系统在功能和性能方面都达到了预期的要求。
用户对系统的易用性和交互体验给予了较高的评价。
3.2 系统改进尽管系统已经达到了预期的要求,但我们仍然发现了一些可以改进的地方。
例如,系统的查询功能可以进一步优化,提供更多的查询条件和搜索选项。
数据构造课程设计报告图书管理系统- ( word)可编写华北科技学院课程设计说明书专业:网络工程课程名称 :数据构造课程设计班级:姓名:学号:设计题目 :图书管理系统设计时间 : 2012-2-27至2012-3-9评语 :_____________________________________________________________________________________________________________________________________________________________________________________________________评阅成绩 :,, ,,评阅教师:,,一、设计题目与要求【问题描绘】设计一个计算机管理系统达成图书管理基本业务。
【基本要求】1) 每种书的登记内容包含书号、书名、著作者、现存量和库存量;2)对书号成立索引表 ( 线性表 ) 以提升查找效率 ;3)系统主要功能以下 :*采编入库 : 新购一种书,确立书号后,登记到图书帐目表中,假如表中已有,则只将库存量增添 ;*借阅 : 假如一种书的现存量大于 0,则借出一本,登记借阅者的书证号和送还限期,改变现存量 ;*送还 : 注销对借阅者的登记,改变该书的现存量。
【进一步达成内容】1)系统功能的进一步完美 ;2)索引表采纳树表。
设计内容 3)4)程序流程图5)源程序软件测试报告 ( 包含所用到的数据及结果) 6)二、纲要设计有八个模块1)图书初始化输入图书的一些信息,编号、作者、书名、数目,使有必定的库存。
2) 新书入库新书采编入库,输入编号后假如有次数只要输入数目,没有则持续输入书名、作者、数目。
3)增添读者信息读者信息初始化,输入念书证号和姓名,只有输入书证号和姓名才能进行借书还书 4)借书模块读者输入念书证号,证号存在输入要借的图书编号,不可以借同一本书,假如借书数目以达到最大也不可以借书。
图书管理系统实验报告一、问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
基本要求:a.建立图书信息。
b.提供想找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
数据结构与算法分析数据存储结构可根据需要自选。
如:顺序表、单链表、双链表、栈等。
算法主要要求用到对数据的查询与排序算法。
二、概要设计有四个模块1)图书初始化输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。
2)新书入库新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。
3)查询图书信息4)退出1)采编入库否2)查询图书信息图书信息初始化同一本新书入库的运行结果图不同的新书采编入库采编入库后查询图书信息的运行结果图借书借书后查询图书信息的运行结果图借同一本书的运行结果图退出五、总结体会虽然这次的程序是通过上网查出来的,但是通过这次的实验使我知道了图书管理系统的流程,知道了一些以前不知道的知识,在运行程序时也遇到了一些问题,借书时只能借一本书,再借书就不能显示是借了还是不能借,把最多能借书的数量改了一下还是不行,最后在每一个判断输出之后都加了goto END借书,就能正常借书了。
程序有点长,本来一个函数就能完成一个功能,他用了两个函数就我把自己能改成一个的改了。
借书系统比较复杂,不容易懂,和同学交流了一下自己看了看才明白。
这次的实验还让我复习了数据结构的一些知识,如数组,while语句,switch 语句,链表,还知道了如何使用system("cls")清屏,还知道了strcmp是用来比较字符串s1和s2大小的,strcpy使用来把字符串s2的值赋给s1的。
1、用例图(1) 借阅者用例图说明:借阅者能够通过该系统进行以下活动:1)查找图书:借阅者可以通过图书名称或者 ISBN/ISSN 号查找图书的详细信息。
2)登录系统:借阅者能够通过校园卡编号和相关密码登陆自助机器,查询图书信息、个人信息和进行图书预订。
3) 查询个人信息:每一个借阅者都可以通过自助机器在登录后查询自己的信息,但是不允许在未授权的情况下查询他人的信息。
为了防止有人蓄意查看他人信息,所以系统登录绑定手机号,每次借阅者登录系统时,自身的手机就会收到验证短信,惟独输入验证码,才干登录系统。
4)预订图书:在登录自助机器后,借阅者可以预订相关书籍内容。
5)借阅图书:借阅者可以通过图书管理员借阅相关书籍。
6)归还图书:借阅者通过图书管理员归还书籍,如果未按时归还,需要缴纳罚金。
(2) 图书管理员用例图说明:图书管理员能够通过该系统进行以下活动:1) 处理借阅:借阅者可以通过图书管理员借阅书籍。
当图书管理员处理借阅时,需要检查用户的合法性,如果不合法,不允许借阅书籍,如果之前该图书已经被该借阅者预订,需要删除其预订信息。
2)处理归还:借阅者可以通过图书管理员归还书籍,当借阅者借阅的书籍超过一定的期限时,图书管理员需要收取罚金。
(3) 系统管理员用例图说明:系统管理员能够通过该系统进行以下活动:1)查询书籍信息:系统管理员有权限去查询各种图书的信息。
2)添加书籍:书籍的添加时通过系统管理员进行的,图书添加时要输入书籍的详细信息。
3)删除书籍:书籍的删除也是通过系统管理员进行的,图书删除时书籍的所有信息都将被删除。
4)修改书籍:书籍的信息可以被系统管理员修改。
5)查询读者信息:系统管理员有权限去查询读者的信息。
6)添加读者:读者的添加是通过系统管理员进行的,读者被添加时要输入读者的详细信息。
例如新生开学和旁听生补办校园卡时,系统管理员需要更新读者数据库。
7)删除读者:读者的删除也是通过系统管理员进行的,读者被删除时读者的所有信息都将被删除。
竭诚为您提供优质文档/双击可除数据结构图书管理系统实验报告篇一:数据结构-图书管理系统实验报告数据结构课程设计报告课程名称_________题目名称学生学院专业班级学号学生姓名指导教师20XX年7月8日一、需求分析1.图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。
b树(2-3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;b树查找结果类型定义:节点指针、关键字序号和查找标志变量为整型。
2.演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。
该演示系统,没有使用文件,全部数据放在内存存放。
四项基本业务都以书号为关键字进行的,采用了b树(2-3树)对书号建立索引,以提高效率。
3.图书管理系统实现功能:①采编入库:新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示b树现状。
②清除库存:实现某本书的全部信息删除操作,每清除一个书号则已以凹入表的形式显示b树现状。
③图书借阅:如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。
④图书预约:如果某书库存为零,则记录预约者姓名和证号,系统自动抓取当前预约时间和取书时间。
⑤图书归还:注销借阅者信息,并改变该书的现存量。
⑥作者专区:输入作者名字,系统将查找相应作者全部著作并显示出来。
⑦图书信息:可以根据书号查阅此书基本信息、借阅信息和预约信息,亦可以查找全部图书基本信息。
二、概要设计1.抽象数据类型b树定义:ADTbTree{数据对象:D是具有相同特性的数据元素的集合。
Beijing Institute of PetrochemicalTechnology数据结构课程设计课程设计实验报告院(系、部): 信息工程学院姓名:计141范文虎指导教师签名:2016年6月29日·北京目录一.设计题目····································二.设计目的····································三.实验分工····································四.算法思想分析································五.算法描述实现································1。
《数据结构实验》期末大作业报告一、问题描述与设计要求图书馆管理系统应实现的目标:管理人员可以查看已存图书、注册新图书、修改已有图书信息、注册现存图书,学生可以借阅图书、归还图书、查看馆存图书。
系统的主界面、管理员入口界面、学生入口界面通过读取.txt文件输出在屏幕上。
在运行程序的时候,自动注册四本图书的信息,并将四本图书的信息写入.txt文件。
二、分析与设计(包括数据结构定义、功能模块定义、程序流程图等)1、数据结构:定义一个结构体存储图书的信息,包括书名、编号、存放量和书的状态(是否可借),采用单向链表存储图书馆的图书。
2、功能模块定义:a、查看已存图书:通过链表的遍历将图书的信息输出在电脑屏幕;b、注册新图书:通过在链表中插入新的结点增加一本新的图书信息;c、修改已有图书信息:按照关键字编号查找图书,找到图书后可对该图书的书名、数量、状态进行修改;d、注销现存图书:通过在链表中删除一个结点进行图书的注销功能;e、借阅图书:按照关键字书名查找图书,找到图书后图书的数量减1,若图书的数量等于0,状态修改为不可借。
f、归还图书:按照关键字书名查找图书,找到图书后图书的数量加1,状态修改为可借。
三、程序代码(只需核心功能代码并给出必要注释)main.c文件:#include"functions.h"#include"head.h"int main(){welcome();return 0;}functions.h文件:#ifndef FUNCTIONS_H_INCLUDED#define FUNCTIONS_H_INCLUDED#include"head.h"typedef struct book{char *name; //书名int id; //书的编号int count; //书的存放数量int status; //书的状态,是否可借struct book *next;}Book;void book1(); //预先录入4本图书信息,写入《预先录入的4本图书信息.txt》文件中void welcome(); //系统开始界面,从主界面.txt读取并输出void error(char *); //输入报错函数char land(); // [主页面项目]int usrstudent(); // [学生入口]从学生入口.txt读取并输出,返回0表示返回主页1表示继续执行本函数int usrmanager(); // [管理员入口]从管理员入口.txt读取并输出,返回0表示返回主页1表示继续执行本函数int viewbook(); // [查看图书]返回打印的图书个数失败返回-1int addbook(); // [注册图书]添加图书成功返回图书id 失败返回-1int modbook(); // [修改图书]修改图书信息成功后返回id 失败-1int delbook(); // [注销图书]删除成功返回被删除图书的id 失败返回-1void printbook(Book *); // [打印图书]Book *lookup(char *, int); // [搜索图书]int borrowbook(); // [借阅图书]int returnbook(); // [归还图书]Book *head = NULL;int nbook = 0; //图书数目void book1() //预先录入4本图书信息,写入《预先录入的4本图书信息.txt》文件中{system(CLEAR); //清屏char sname[MAXNAME];int id, count;char *namep;namep=NULL;Book *bp;bp = (Book *)malloc(sizeof (Book));bp->name="harry potter";bp->id = 1;bp->count = 2;bp->status = A V AILABLE;++nbook;bp->next = head;head = bp;bp = (Book *)malloc(sizeof (Book));bp->name="princekin";bp->id = 2;bp->count = 3;bp->status = A V AILABLE;++nbook;bp->next = head;head = bp;bp = (Book *)malloc(sizeof (Book));bp->name="romance of Three Kindoms";bp->id = 3;bp->count = 1;bp->status = A V AILABLE;++nbook;bp->next = head;head = bp;bp = (Book *)malloc(sizeof (Book));bp->name="data structures and alggorithms";bp->id = 4;bp->count = 1;bp->status = A V AILABLE;++nbook;bp->next = head;head = bp;FILE *fp;if((fp=fopen("预先录入的4本图书信息.txt","w"))==NULL) //将图书信息写入.txt文件{printf("该文件为空!");exit(1);}char ch[]="图书编号:4\n图书名:data structures and alggorithms\n图书存数:1\n图书状态:可借\n图书编号:3\n图书名:romance of Three Kindoms\n图书存数:1\n图书状态:可借\n图书编号:2\n图书名:princekin\n图书存数:3\n图书状态:可借\n图书编号:1\n图书名:harry potter\n图书存数:2\n图书状态:可借";fprintf(fp,"%s",ch);fclose(fp);}void welcome(){book1(); //预先录入4本图书信息while(1){char ch;FILE *fp;if((fp=fopen("主界面.txt","r"))==NULL){printf("该文件为空!");exit(1);}ch=fgetc(fp);putchar(ch);while(ch!=EOF){ch=fgetc(fp);putchar(ch);}fclose(fp);putchar('\n');switch(land()){case '1': //进入管理员入口while(1){if(usrmanager()){continue;}else{break;}}break;case '2': //进入学生入口while(1){if(usrstudent()){continue;}else{break;}}break;case '0':exit(0); //结束程序default:error("采集项目参数失败");}}}void error(char *s){fprintf(stderr, "%s\n", s);}char land(){char c, flag;int i;while(1){for(i = 0; (c = getchar()) != '\n'; flag = c, ++i);if(i == 1){if(flag == '1' || flag == '2' || flag == '0'){return flag;}}else if(i == 0){continue;}error("[请输入命令:1 / 2 / 0 选择项目]");}return '\0';}char dostudent(){char c, flag;int i;while(1){for(i = 0; (c = getchar()) != '\n'; flag = c, ++i );if(i == 1){if(flag == '1' || flag == '2' || flag == '3' || flag == '0'){return flag;}}else if(i == 0){continue;}error("[请输入命令:1 / 2 / 3/ 0 选择项目]");}}int usrstudent(){char ch;FILE *fp;if((fp=fopen("学生入口.txt","r"))==NULL){printf("该文件为空!");exit(1);}ch=fgetc(fp);putchar(ch);while(ch!=EOF){ch=fgetc(fp);putchar(ch);}fclose(fp);putchar('\n');switch(dostudent()){case '1':borrowbook();break;case '2':returnbook();break;case '3':viewbook();break;case '0':return 0;default:error("采集项目参数失败");break;}return 1;}int borrowbook(){system(CLEAR);char sname[MAXNAME];printf("请输入书名:\n");scanf("%s", sname);getchar();Book *bp;char *namep = NULL;if((bp = lookup(namep = strdup(sname), 0)) == NULL) {printf("图书%s 不存在\n", namep);fflush(stdin);return -1;}else{printbook(bp);if(! bp->status){printf("借阅图书:Y N\n");}else{printf("图书外借中\n");return 0;}while(1){char c = '\0';scanf("%c", &c);getchar();if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){fflush(stdin);error("指令无效");continue;}if(c == 'Y' || c == 'y'){--bp->count > -1 ? printf("成功\n") : printf("失败\n");if(! bp->count){bp->status = UNA V AILABLE;}return bp->id;}else{return 0;}}}return -1;}int returnbook(){system(CLEAR);char sname[MAXNAME];printf("请输入书名:\n");scanf("%s", sname);getchar();Book *bp;char *namep;if((bp = lookup(namep = strdup(sname), 0)) == NULL){fflush(stdin);printf("此图书并不是馆内图书\n");return -1;}else{printbook(bp);printf("归还图书:Y N\n");while(1){char c = '\0';scanf("%c", &c);getchar();if(!(c == 'Y' || c == 'y' || c == 'N' || c == 'n')){fflush(stdin);error("指令无效");}else if(c == 'Y' || c == 'y'){bp->count++ ? : (bp->status = A V AILABLE);printf("成功\n");return bp->id;}else{return 0;}}}return -1;}char domanager(){ //返回管理员入口界面输入的要进行的操作的字符char c, flag;int i;while(1){for(i = 0; (c = getchar()) != '\n'; flag = c, ++i);if(i == 1){if(flag == '1' || flag == '2' || flag == '3' || flag == '4' || flag == '0'){return flag;}}else if(i == 0){continue;}error("[请输入命令:1 / 2 / 3/ 4 / 0 选择项目]");}return '\0';}int usrmanager(){ //管理员入口char ch;FILE *fp;if((fp=fopen("管理员入口.txt","r"))==NULL) //从文件读取管理员入口界面{printf("该文件为空!");exit(1);}ch=fgetc(fp);putchar(ch);while(ch!=EOF){ch=fgetc(fp);putchar(ch);}fclose(fp);putchar('\n');switch(domanager()){case '1':viewbook();break;case '2':addbook();break;case '3':modbook();break;case '4':delbook();break;case '0':return 0; //返回主页default:error("采集项目参数失败");break;}return 1;}int viewbook(){system(CLEAR);Book *bp;for(bp =head; bp != NULL; bp = bp->next){printbook(bp);}if(nbook){return nbook;}else{printf("图书馆还没有图书哦\n");return 0;}return -1;}void printbook(Book *bp){printf("图书编号:%d\n", bp->id);printf("图书名:%s\n", bp->name);printf("图书存数:%d\n", bp->count);printf("图书状态:%s\n", bp->status ? "不可借" : "可借"); }int addbook(){system(CLEAR);char sname[MAXNAME];int id, count;char *namep;while(1){id = 0;count = 0;namep = NULL;printf("请输入图书名:\n");scanf("%s", sname);getchar();printf("请输入小于1000的图书编号:\n");scanf("%d", &id);getchar();if(!(id > 0 && id < 1000)){error("输入编号不符合要求");fflush(stdin); //清空输入缓冲区continue;}printf("请输入小于50的图书数量:\n");scanf("%d", &count);getchar();if(!(count > 0 && count < 50)){error("输入数目不符合要求");fflush(stdin); //清空输入缓冲区continue;}Book *bp;if((bp = lookup(namep = strdup(sname), id)) == NULL)//图书可以插入{ //strdup函数先用maolloc()配置与参数sname字符串相同的空间大小,然后将参数sname 字符串的内容复制到该内存地址,然后把该地址返回.bp = (Book *)malloc(sizeof (Book));if(bp == NULL || (bp->name = namep) == NULL){error("注册图书失败");fflush(stdin); //清空输入缓冲区continue;}bp->id = id;bp->count = count;bp->status = A V AILABLE;++nbook;bp->next = head;head = bp;printf("图书%s 注册成功\n", sname);return id;}else{fflush(stdin); //清空输入缓冲区error("图书名或编号已经被占用");}}return -1;}Book *lookup(char *s, int id){ //判断书是否重名或者重编号,重名或者重编号返回指针,否则返回NULL Book *bp;for(bp = head; bp != NULL; bp = bp->next){if(id == bp->id || strcmp(s, bp->name) == 0){return bp;}}return NULL;}int modbook(){ // 修改除id之外的信息因为要修改id 直接删掉后重新添加会更好system(CLEAR);Book *bp = NULL;while(1){int id = 0;printf("请输入要修改信息的图书编号:\n");scanf("%d", &id);getchar();if(!(id > 0 && id < 1000)){fflush(stdin); //清空输入缓冲区error("图书编号不符合要求");continue;}if((bp = lookup("", id)) != NULL){printf("以下为要修改的图书的现有信息:\n");printbook(bp);printf("[1] 修改图书名\n[2] 修改图书数量\n[3] 修改图书状态\n[0] 放弃修改\n"); while(1){int i;scanf("%d", &i);getchar();if(!(i == 1 || i == 2 || i == 3 || i == 0)){fflush(stdin);error("输入项目前编号选择相关项目");continue;}switch(i){case 1:while(1){char newname[MAXNAME], *namep;printf("图书名:\n");scanf("%s", newname);getchar();if((lookup(namep = strdup(newname), 0)) != NULL){fflush(stdin);error("图书名已存在");continue;}if((bp->name = namep) != NULL){printf("修改成功\n");return id;}}break;case 2:while(1){int bnum;printf("输入图书数量:\n");scanf("%d", &bnum);getchar();if(!(bnum > 0 || bnum < 1000)){fflush(stdin);error("数目不符合要求");continue;}bp->count = bnum;printf("修改成功\n");return id;}break;case 3:while(1){char c;int status;status = bp->status;status == A V AILABLE ? printf("修改状态为[不可借]:Y N\n") : printf("修改状态为[可借]:Y N\n");scanf("%c", &c);getchar();if(!( c == 'Y' || c == 'y' || c == 'N' || c == 'n')){fflush(stdin);error("指令无效");continue;}if(c == 'Y' || c == 'y'){status == A V AILABLE ? bp->status = UNA V AILABLE : (bp->status = A V AILABLE);printf("修改成功\n");return id;}else{printf("放弃修改\n");return 0;}}break;case 0:return 0;default:error("获取参数失败");break;}}}else{printf("没有此图书\n");return 0;}}return -1;}int delbook(){system(CLEAR);Book *bp, *fbp;int id = 0;printf("请输入要注销的图书编号:\n");scanf("%d", &id);getchar();if(!(id > 0 && id < 1000)){fflush(stdin);error("图书编号不符合要求");return -1;}for(fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next){if(bp->id == id){printbook(bp);break;}}if(bp != NULL){while(1){printf("确定要注销此图书:Y N\n");char YN;scanf("%c", &YN);getchar();if(!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))){fflush(stdin);error("指令无效\n");continue;}if(YN == 'Y' || YN == 'y'){bp == head ? head = bp->next : (fbp->next = bp->next);free(bp->name);bp = NULL;printf("图书注销成功\n");break;}else{printf("放弃注销\n");return 0;}}return id;}else{printf("要注销的图书编号不存在\n");return -1;}return -1;}#endif // FUNCTIONS_H_INCLUDEDhead.h文件:#ifndef HEAD_H_INCLUDED#define HEAD_H_INCLUDED#include <stdio.h>#include <stdlib.h>#include <string.h>#define A V AILABLE 0#define UNA V AILABLE 1#define MAXNAME 30#define CLEAR "cls"#endif // HEAD_H_INCLUDED四、测试与结果(给出测试用例及测试结果)按照书名借书查看图书信息注册新图书修改图书名注销图书归还图书修改图书数量修改图书状态五、用户使用说明1、程序没有运行的时候,预先录入的4本图书的信息并没有在“预先录入的4本图书信息.txt”文件中,程序一旦运行,图书信息将会被写入此文件中;2、主界面、学生入口、管理员入口的界面分别保存在“主界面.txt”、“学生入口.txt”、“管理员入口.txt”文件中,程序运行时,需要从这三个文件中读取数据并输出到屏幕上,脱离这三个文本文件,程序无法正常运行;3、注册新图书时,只能对不同编号和书名的图书进行注册,并不能使同一本书的数量增加,nbook存放的是不同书的数量,并不是所有图书的数目;4、在程序运行过程中,按照提示进行输入。
课程设计报告课设课题:课程设计——图书管理系统学院:电子信息学院专业:网络工程姓名:班级学号:BX1213指导教师:张艳报告日期:2013.12.12目录一、需求分析 (1)1.1 系统开发背景和意义 (1)1.2 设计题目与要求 (1)二、总体结构设计 (2)三、各子模块设计 (3)3.1 初始化图书信息 (3)3.2 系统主界面 (3)3.3 采编入库 (4)3.4 输入读者信息 (4)3.5 借阅图书 (4)3.6 归还图书 (6)3.7 查询图书信息 (7)3.8 查询读者信息 (8)四、程序设计调试情况分析 (9)五、测试结果 (11)5.1 欢迎界面 (11)5.2 初始化图书信息 (11)5.3 系统主界面 (11)5.4 采编入库 (12)5.5 输入读者信息 (13)5.6 借阅图书 (14)5.7 归还图书 (15)5.8 查询图书信息 (15)5.9 查询读者信息 (16)5.10 保存文件,退出 (18)六、总结 (19)七、参考文献 (20)八、附录(源代码) (21)一、需求分析1.1 系统开发背景和意义图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高图书管理的效率。
因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。
图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。
1.2 设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。
【基本要求】1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量;2) 对书号建立索引表(线性表)以提高查找效率;3) 系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。
数据结构课程设计课程设计实验报告院(系、部): 信息工程学院 姓 名: 计141范文虎指导教师签名:2016年 6月29日·北京Beijing Institute of PetrochemicalTechnology目录一.设计题目····································二.设计目的····································三.实验分工····································四.算法思想分析································五.算法描述实现································1.数据结构类型定义2.算法流程图3.程序代码六.运行结果····································七.结论········································一.设计题目图书管理基本业务模拟图书管理一般包括图书采编、图书编目、图书查询及图书流通(借、还书)等基本业务。
实验四图书管理系统姓名:任子龙学号:1120140167 班级:05111451一.需求分析(1)问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
(2)基本要求:a.建立图书信息。
b.提供查找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
(3)数据结构与算法分析将每一本书看作是一个基本单元。
由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。
其中,每本书作为一个结点,数据域包含char 型变量,指针域含有左右指针left和right。
二.概要设计1.抽象数据类型的定义为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;注意结点的指针域有left和right两个。
2.本程序包含两个模块(1)主程序模块主函数只包含了Menu_select()函数。
目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型。
各函数之间的调用关系:三.详细设计1.结点类型typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;2.子函数(1)功能菜单调用函数Menu_select()使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;(2)各种功能函数Initialize()//初始化图书系统信息;Insert()//添加新的图书信息;Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期”、“图书价格”多种关键字进行排序;Search()//实现对图书的查找功能,本程序可以实现按“图书编号”、“出版日期”、“图书价格”多种关键字进行查找;deletebook()//删除无效的图书信息;Print_book()//打印全部图书信息。
3.主函数Main函数十分的简单,目的只有一个,就是进入功能选择菜单。
int main(){/*主函数*/Menu_select(); /*调用主菜单*/}四.调试分析1.为了提高程序的健壮性,在menu函数中,考虑如果操作码超出0-7的范围,进行错误提示。
2.刚开始使用的其实是单链表,然后很快就发现了问题,当编写排序部分的时候,很难再进行下去;考虑过使用顺序表,但是由于有删除、添加的操作,所以也放弃了顺序表,最终决定用双向链表,这还是第一次。
过程中发现双向链表用起来很方便!3.排序函数sort()中为了保证程序的正确性,使用了自己较为熟练的冒泡排序法,没有考虑时间复杂度。
4.在编写的过程中也更加熟悉了switch函数,free函数,goto函数(当然尽量少用),还有学会了清屏,system(“cls”);五.测试结果1.建立图书信息及添加功能2.查找功能A.按编号查找:B.按日期查找3.修改功能4.删除功能5.排序功能为了说明问题,这里又添加了两本书《简爱》、《余罪》测试只提供按编号和日期排序A.按编号排序:B.按出版日期排序六、附录#include<stdio.h>#include <string.h>#include <stdlib.h>#include<conio.h>typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;BK *h_book;/*函数申明*/void Start(){ system("cls");printf("\n\n\n\t\t***************************************\ n");printf("\n\n\n\t\t\t欢迎使用图书管理系统\n");printf("\n\n\n\t\t***************************************\ n");printf("\n\n\n\t\t 按任意键进入系统...");getch();system("cls"); }void Insert()/*新书入库*/{ BK *p,*p0,*p1; p=p1=h_book;printf("\n新书入库模块...\n");printf("\n请输入新书信息..\n包括书号、书名、数量...\n");p0=(BK *)malloc(sizeof(BK));printf("图书编号:");scanf("%s",p0->number);while(strcmp(p0->number,p1->number)!=0&&p1->right!=NULL) p1=p1->right;if(strcmp(p0->number,p1->number)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/{ printf("\n此编号图书已存在!!直接入库!\n");}else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/{ printf("图书名称:");scanf("%s",p0->title);printf("图书作者:");scanf("%s",p0->author);printf("图书出版日期:");scanf("%s",p0->date);printf("图书价格:");scanf("%s",p0->price);while(p->right){ p=p->right; }if(h_book==NULL) h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/else {p->right=p0; p0->left=p;} /*此处分两种情况,链表中有数据,链表中最后元素的right指向p0处*/p0->right=NULL;}printf("\n新书入库完毕!按任意键继续下一步操作..\n");getch(); system("cls"); }void Print_book() /*打印所有图书信息*/{BK *p; p=h_book;printf("\n图书信息如下:\n\n");printf("图书编号\t图书名称\t图书作者\t出版日期\t价格\n"); while(p!=NULL) {printf("%s\t\t%s\t\t%s\t\t%s\t%s\n",p->number,p->title,p->auth or,p->date,p->price);p=p->right; }printf("\n图书信息打印完毕!按任意键继续下一步操作.."); getch(); system("cls"); }void Initialize() /*初始化*/{ BK *p0;printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");p0=(BK*)malloc(sizeof(BK));h_book=p0;printf("\n请输入图书信息:\n");printf("图书编号:"); /*输入图书编号(唯一)*/ scanf("%s",p0->number);printf("图书名称:"); /*输入图书名称*/scanf("%s",p0->title);printf("图书作者:"); /*输入图书作者*/scanf("%s",p0->author);printf("图书出版日期:"); /*输入图书出版日期*/ scanf("%s",p0->date);printf("图书价格:"); /*输入图书价格*/scanf("%s",p0->price);p0->right=NULL;p0->left=NULL;printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");getch();system("cls"); }void Sort(){/*按多种关键词排序*/BK *p,*front,*rear,*temp;int x;printf("\n图书排序开始..\n");printf("\n请选择关键字进行排序:\n");printf("1.书籍编号\n2.出版日期\n3.书籍价格\n");scanf("%d",&x);temp=(BK*)malloc(sizeof(BK));front=h_book;p=front;while(p->right) p=p->right;rear=p;while(1){ if(front==rear) break;else{p=front;while(1){if(p==rear) break;switch(x){case 1: if(strcmp(p->number,p->right->number)>0) //按编号冒泡排序{strcpy(temp->number,p->number);strcpy(p->number,p->right->nu mber);strcpy(p->right->number,temp->number);strcpy(temp->author,p->author);strcpy(p->author,p->right->author );strcpy(p->right->author,temp->author);strcpy(temp->title, p->title);strcpy(p->title, p->right->title); strcpy(p->right->title, temp->title);strcpy(temp->date, p->date); strcpy(p->date, p->right->date); strcpy(p->right->date, temp->date);strcpy(temp->price, p->price); strcpy(p->price, p->right->price); strcpy(p->right->price, temp->price);} break;case 2: if(strcmp(p->date,p->right->date)>0) //按出版日期冒泡排序{strcpy(temp->number,p->number);strcpy(p->number,p->right->nu mber);strcpy(p->right->number,temp->number);strcpy(temp->author,p->author);strcpy(p->author,p->right->author );strcpy(p->right->author,temp->author);strcpy(temp->title, p->title); strcpy(p->title, p->right->title); strcpy(p->right->title, temp->title);strcpy(temp->date, p->date); strcpy(p->date, p->right->date); strcpy(p->right->date, temp->date);strcpy(temp->price, p->price); strcpy(p->price, p->right->price); strcpy(p->right->price, temp->price);} break;case 3:if(strcmp(p->price,p->right->price)>0) //按价格冒泡排序{strcpy(temp->number,p->number);strcpy(p->number,p->right->nu mber);strcpy(p->right->number,temp->number);strcpy(temp->author,p->author);strcpy(p->author,p->right->author );strcpy(p->right->author,temp->author);strcpy(temp->title, p->title); strcpy(p->title, p->right->title); strcpy(p->right->title, temp->title);strcpy(temp->date, p->date); strcpy(p->date, p->right->date); strcpy(p->right->date, temp->date);strcpy(temp->price, p->price); strcpy(p->price, p->right->price); strcpy(p->right->price, temp->price);} break;default:break;}p=p->right;}rear=rear->left;}}printf("\n排序完毕!按任意键继续下一步操作..\n");getch(); system("cls");}void Search(){/*多种关键词查找*/BK *p;int x;char t[20]={0};printf("\n图书查找开始..\n");k:printf("\n请选择关键字进行查找:\n");printf("1.书籍编号\n2.出版日期\n3.书籍价格\n");scanf("%d",&x);printf("\n请输入关键字:\n");scanf("%s",t);p=h_book;while(p){switch(x){case 1:if(strcmp(p->number,t)==0){ printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author, p->date,p->price);} break;case 2:if(strcmp(p->date,t)==0){ printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author ,p->date,p->price);} break;case 3:if(strcmp(p->price,t)==0){ printf("%s\t%s\t%s\t%s\t%s\n",p->number,p->title,p->author, p->date,p->price);} break;default:printf("请输入正确的操作码!\n");goto k;}p=p->right;}printf("\n查找完毕!按任意键继续下一步操作..\n");getch(); system("cls");}void deletebook()/*删除图书信息*/{ BK *p;char t[20]={0};printf("\n请输入需要删除书籍编号:");scanf("%s",t);p=h_book->right;while(p){ if(strcmp(p->number,t)==0){p->left->right=p->right;p->right->left=p->left;free(p);break;}p=p->right;}printf("\n删除完毕!按任意键继续下一步操作..\n");getch(); system("cls");}void Modify()/*修改图书信息*/{ BK *p;char t[20]={0};printf("\n请输入需要修改书籍编号:");scanf("%s",t);p=h_book;while(p){ if(strcmp(p->number,t)==0) break;p=p->right;} /*指针p指向需要修改的结点*/printf("\n请重新输入图书信息:\n");printf("图书编号:"); /*输入图书编号(唯一)*/ scanf("%s",p->number);printf("图书名称:"); /*输入图书名称*/scanf("%s",p->title);printf("图书作者:"); /*输入图书作者*/scanf("%s",p->author);printf("图书出版日期:"); /*输入图书出版日期*/scanf("%d",&p->date);printf("图书价格:"); /*输入图书价格*/scanf("%d",&p->price);printf("\n修改完毕!按任意键继续下一步操作..\n");getch(); system("cls");}int Menu() /*主菜单*/{ int dm;printf("\n\t\t欢迎使用图书管理系统\n");printf("================================================= \n");printf("\t\t0----退出系统\n");printf("\t\t1----数据初始化\n");printf("\t\t2----新书入库\n");printf("\t\t3----图书排序\n");printf("\t\t4----搜索图书\n");printf("\t\t5----删除信息\n");printf("\t\t6----修改信息\n");printf("\t\t7----全部图书信息\n");printf("============================================== ===\n");printf("请输入相应的操作码:");for(;;){ scanf("%d",&dm); //dm输入的数字if(dm<0||dm>7)printf("\n错误!请重新输入:");else break; }return dm; }void Menu_select()/*主菜单选择函数*/{ for(;;){switch(Menu()) /*功能选择*/{case 0: system("cls");printf("\n\n\t欢迎下次使用本系统!(按任意键退出...)\n");getch();exit(0);case 1: Initialize();break;case 2: Insert();break;case 3: Sort();break;case 4: Search() ;break;case 5: deletebook();break;case 6: Modify();break;case 7: Print_book();break;default:printf("\n错误!");exit(0);}}}int main(){/*主函数*/Menu_select(); /*调用主菜单*/}。