c++ 图书信息管理系统(附源码).doc
如有侵权,请联系网站删除,仅供学习与交流c+ 图书信息管理系统(附源码)【精品文档】第 25 页学号:20104303计算机实习报告系 别:管理系专 业:信息管理与信息系统专业班 级:1043班学生姓名:李 优指导教师:徐 日日 期:2012-09-032012-09-141需求分析1.1 选题任务图书借阅管理系统(1) 编程工具C+(2) 要求选题学生应具有端正的学习态度、正常的交流能力,应有积极主动、克服困难的学习意识(3) 本题概述以学院图书馆为例,图书借与管理是一项经常性工作,为使图书借阅管理工作准确高效,提供图书借阅记录的添加、修改、删除、查询、浏览、汇总等,用图书借阅关系软件,能有效提高工作效率,具有较强的实际意义。(4) 功能描述 能度日外部提供的包含图书借阅信息的文本文件(TXT文件); 能在程序中录入图书借阅信息(可参考我院图书馆网上图书借阅信息的各个项目),并将信息写入文本文件(TXT文件); 能对所有图书借阅信息,按条件(按图书名、图书编号、借阅日期、借阅人、超期与否、超期天数等)查询浏览,能汇总统计计算出符合某条件的图书借阅记录的数量并浏览这些借阅信息,能将查询、浏览、汇总的结果输出结果文本文件(TXT文件)(5) 辅助说明基础要求:+扩展要求:+1.2 输入数据和输出数据形式:程序中包含的图书信息包括: char bnum20; /书号 char bname20; /书名char bauthor10; /作者char rname10; /借阅人char bdays10; /借出日期char bchao10; /超期天数为了方便,我全部设置成了char型。而程序中包含两种输入方式和两种输出方式,对应题目要求,分别是:单个图书信息的增删查改;TXT文档的导入(图书数据库.txt);屏幕的打印;TXT文档的导出(书籍信息.txt)。1.3 测试数据及测试目的字母测试,错误数据测试,重复数据测试目的:产看本程序的纠错能力和是否人性化。2程序设计2.1 关键数据类型定义 /*书籍结构体,用于存放书籍基本信息*class Bookprivate: char bnum20; /书号 char bname20; /书名char bauthor10; /作者char rname10; /借阅人char bdays10; /借出日期char bchao10; /超期天数public:Book() /构造函数初始化信息void set_bnum(char *no) /设置书号char *get_bnum() /获得书号void set_bname(char *n) /设置书名char *get_bname() /获得书名void set_bauthor(char *a) /设置作者char *get_bauthor() /获得作者姓名void set_bdays(char *d) /设置借出日期char *get_bdays() /获得借出日期void set_bchao(char *c) /设置超出天数char *get_bchao() /获得超出天数void set_rname(char *rn) /设置借阅人char *get_rname() /获得借阅人姓名 void copy(Book m) /Book结构体copy函数 ;/class book/*书籍管理结构体,实现管理书籍功能*class BookManageprivate: Book books100; /定义Book书籍结构体数组对象,最大容量100本public:int length; BookManage() /构造函数,读取磁盘文件int add(Book book) /添加图书资料int bnu_search(char *bnu) /按书号查找书籍int bna_search(char *bna) /按书名查找书籍int bau_search(char *bau) /按作者查找书籍int rn_search(char *rn) /按借阅人查找书籍int bd_search(char *bd) /按借出日期查找书籍 int bc_search(char *bc) /按超期天数查找书籍void revise(Book book,int i) /修改书籍函数void deleteBook(int index) /删除书籍资料函数void show_bookhead() /显示输出列表,表头。void show_book(int i)/显示书籍函数void saveFileHead() /保存书籍文件的表头到txtvoid saveFile(int i)/带参的输出书籍到txtvoid readFile() /读取书籍文件;/ class BookManage/*菜单结构体,实现界面引导*class MenuBookManage bm; /定义书籍管理结构体对象bmprivate:int choice; /菜单序号选择int key; /管理员密码public:void header() /首页欢迎界面void log_menu() /主界面登录菜单void admin_menu() /管理菜单void absearch_menu() /查找书籍菜单void log_admin() /密码登陆void rn_search() /按借阅人姓名查找函数void bnu_search() /按书号查找函数void bna_search() /按书名查找函数void bau_search() /按作者查找函数void bd_search() /按借阅日期查找函数void bc_search() /按超期天数查找函数void addBook() /添加新的书籍信息函数void reviseBook() /修改书籍函数void delBook() /删除书籍函数int main()2.2 主程序流程图开始判断是否进入并输入密码3:删除已有图书资料4:查找已有图书资料5:查看所有图书资料6:读取指定位置TXT7: 写入指定位置TXT8:返回系统登录界面0: 退出图书管理系统1:添加新的图书资料2:修改已有图书资料输入书号判断书号是否重复输入要修改的书号判断存在输入要删除的书号判断存在退出系统按超期查找按作者查找按编号查找按日期查找按书名查找重新输入书号删除 书籍重新输入书号修改数据重新输入新书号添加书籍2.3 调用关系1.书籍信息的录入:void set_bnum(char *no) /设置书号strcpy(bnum,no); /把字符串no中的字符复制到字符串bnum中char *get_bnum() /获得书号 return bnum; /返回值为bnum void set_bname(char *n) /设置书名 strcpy(bname,n); char *get_bname() /获得书名 return bname; void set_bauthor(char *a) /设置作者 strcpy(bauthor,a); char *get_bauthor() /获得作者姓名 return bauthor; void set_bdays(char *d) /设置借出日期 strcpy(bdays,d); char *get_bdays() /获得借出日期 return bdays; void set_bchao(char *c) /设置超出天数 strcpy(bchao,c); char *get_bchao() /获得超出天数 return bchao; void set_rname(char *rn) /设置借阅人 strcpy(rname,rn); char *get_rname() /获得借阅人姓名 return rname;2.书籍信息的添加: int add(Book book) 判断length是否达到最大值,如果没有则进行添加。3书籍信息的查找:无论是按照书号、书名、作者、借阅人、借出日期、超期天数来进行查找都是进行挨个比较,如果遇到相同则返回书籍的i值,进行返回输出。4.书籍信息的修改:输入想要修改的书籍编号,按照查找的方法,找到i,然后进行覆盖。完成修改。5.书籍的屏幕打印输出:分两部分输出,首先打印一个头信息,相当于列表的头;然后利用循环语句带参输出(i为参数,循环)。6.保存信息到txt文件:同分为两部分,类似屏幕打印的方法,先存入表头,然后带参循环存入书籍信息。带参的意义就是,可以无限调用该语句,只要知道书的序号i。7.从信息中读取txt文件:struct books char numb10; /书号 char nameb20; /书名 char authorb10; /作者 char namer10; /借阅人 char daysb10; /借出日期 char chaob10; /超期天数定义结构体。利用fscanf()语句讲读取的数据按顺序存入结构体中。然后直接利用书籍添加函数直接写入系统。3调试分析3.1主要问题及解决方案:1.界面颜色设定:一直抛弃黑底白字这种默认形式,换一种颜色给人特殊的感觉,在网上找到相关的代码为system("color *");语句。但是也是没有头绪不知道怎么调试,后来一不小心设置错误,系统就弹出了提示界面,我就明白了界面颜色的设置方法(图3.1):图3.12.关于书籍的cout输出:最开始设计输出模块时候,仅仅是想到了不带参的book信息输出,show_book()函数中自带了一个for语句循环输出所有书籍信息,是为显示全部书籍设计的。但是后来发现如果要单显示筛选信息就要从新写一个带参show_book(int i),虽然函数重载允许这样做,但是却无意义的增加了代码长度。我选择删除了不带参的show_book(),把for语句循环写在外面。这样就增加了show_book(int i)函数的利用率,精简了函数的和长度。3.书籍信息的txt写入:综合了屏幕打印的经验,鉴于fwrite和cout使用方法和显示效果类似,我决定将txt的写入语句也设置成带参形式saveFile(int i),原理与show_book(int i)基本一致。完成这些就能实现。后来发现文件总是覆盖,每次写入都会将上一次的覆盖,也就是只有最后一行,后来才想起了ios:app追加模式,才最终算完整实现。4.读取数据函数:这个函数是我编辑最久的,因为使用的不熟练,我先查找了很多资料,并且写了一些单独的小程序去测试效果,但是感觉都不理想。后来选择了一个最笨的方法,利用fseek函数一格一格的挑开空格和无用信息。但是这样做最大的缺点就是,我的txt导入文档鼻息保持固定格式,一格空格都不能多,如果多了就会导致错位。后来与徐老师交流时,老师也说这种输入方法不可取,因为实现了功能但是意义不大。规格太死,不够人性化。于是我就退后开始,重新选择语句。最后决定定义结构体,把txt中信息读取之后直接存入结构体,随后就把结构体中的数据利用set_xxxx函数存入。5.关于字母纠错及错误输入的处理:字母输入原来都是用fflush(stdin);来清空缓存来防止程序进入死循环。但是我这次编程想到了一个更加简单有效的方法:利用char 来存储选择,随后强转为int型,其实就是讲所有的字符转为了asc2码,因为acs2码的唯一性,我就可以用switch直接跳过了字母部分,比如我要判断i的输入是否唯1,我就将i-48写入switch判断就好了。 4使用说明4.1 主要功能介绍及操作步骤:1.主界面: 选择1登陆,密码为1043,按任意键进入系统。2.系统操作界面:直接输入数字选择功能。1: 添加新的图书资料:2: 修改已有图书资料:3: 删除已有图书资料:4: 查找已有图书资料:根据序号选择功能:按书名查找:按作者查找:按借出日期查找:按超期天数查找:5: 查看所有图书资料: 6: 读取指定位置TXT:7: 写入指定位置TXT:5测试结果5.1 测试数据1A 4 asdfasdf(多字母):1000 /目的为测试重复编号的问题2.修改时候输入未知编号:3.查找时5.2 测试目的 1、测试学号重复2、测试字母和特殊字符对输入的影响3、测试筛选是否符合规格5.3 测试结果 全部通过6心得体会经历了为期十天的编程实习,我觉得我变得更加成熟了,我从一开始的迷茫到后来的目标坚定,这都是一个改变的过程。因为是在暑假前就选好了题目,而且提前也知道了题目的要求。所以我在暑假就做好的了充分的准备。其实最开始想自学用VC+来编写一个可视化的程序。但是实施起来却没有那么容易,因为我学习的VC不系统不全面只是一些皮毛,改改别的还可以,但是要是真正想实现自己的思想就有点捉襟见肘。后决定还是先用比较熟悉的C+语言来编一个完整的系统。虽然以前有做过C+的实验。但是像这种完成的系统确实没有经历过。其实这也是一个挑战,也是一个开始,是我们接触完整系统的开始。等快开学时候我已经完成了大部分代码:但是有一些问题还是没有解决,我开学后就开始全力去解决这些问题。偏偏事与愿违,关于文件读取问题始终没有找到好的解决办法。最后还是从c+教科书上找到的灵感来解决这些问题。收获很大。本次学习中我有以下收获:1、明确了c与c+的区别,运用了多种c+知识,包括一开始就没弄太明白的文件输入输出,这回事真正弄明白了。2、复习了类和结构体的知识,但是继承类没有用到。以后还要多加复习。3、第一次编写之后,运行之后有50多个错误,大多数都是因为马虎造成的。以后还要多加此类的练习熟能生巧。4、多多利用网络资源,看网上的类似的代码能够开阔自己的思路,学习别人好的算法。学习有很大帮助。5、先写出流程图这样是非常好的一种习惯,可以为后面写程序打下好的基础。6、养成好习惯,一个一个模块写,写好了立即执行看是否有错误,以防都写完了,错误却没法去改正。10天的编程已经接近尾声,但是总觉得要完善我的选题仍有许多要做的工作。以后还要加强自己的学习。努力学习编程。感谢徐老师的指导。 7附录#include <iostream>#include <iomanip> #include <string>#include <fstream> #include <conio.h>using namespace std;/*书籍结构体,用于存放书籍基本信息*class Bookprivate: char bnum20; /书号 char bname20; /书名char bauthor10; /作者char rname10; /借阅人char bdays10; /借出日期char bchao10; /超期天数public:Book() /构造函数初始化信息 strcpy(bnum,"");strcpy(bname,"");strcpy(bauthor,"");strcpy(rname,"");strcpy(bdays,""); strcpy(bchao,""); void set_bnum(char *no) /设置书号 strcpy(bnum,no); /把字符串no中的字符复制到字符串bnum中 char *get_bnum() /获得书号 return bnum; /返回值为bnum void set_bname(char *n) /设置书名 strcpy(bname,n); char *get_bname() /获得书名 return bname; void set_bauthor(char *a) /设置作者 strcpy(bauthor,a); char *get_bauthor() /获得作者姓名 return bauthor; void set_bdays(char *d) /设置借出日期 strcpy(bdays,d); char *get_bdays() /获得借出日期 return bdays; void set_bchao(char *c) /设置超出天数 strcpy(bchao,c); char *get_bchao() /获得超出天数 return bchao; void set_rname(char *rn) /设置借阅人 strcpy(rname,rn); char *get_rname() /获得借阅人姓名 return rname; void copy(Book m) /Book结构体copy函数 strcpy(bnum,m.get_bnum(); /将获得书号函数里的返回值里的字符复制到bnum strcpy(bname,m.get_bname(); strcpy(bauthor,m.get_bauthor(); strcpy(rname,m.get_rname(); strcpy(bdays,m.get_bdays(); strcpy(bchao,m.get_bchao();/*书籍管理结构体,实现管理书籍功能*class BookManageprivate: Book books100; /定义Book书籍结构体数组对象,最大容量100本public:int length; BookManage() /构造函数,读取磁盘文件length=0; /从头读起,计数,最大100 BookManage() /析构函数,保存磁盘文件 int add(Book book) /添加图书资料/if(length>=100) cout<<"对不起,储存已满,您无法继续添加!n" return -1; else bookslength.copy(book); /调用书籍结构体copy函数 length+; return (length-1);int bnu_search(char *bnu) /按书号查找书籍 for(int i=0;i<length;i+) if(strcmp(booksi.get_bnum(),bnu)=0) /字符串比较,判断是否相等 return i; return -1;int bna_search(char *bna) /按书名查找书籍 for(int i=0;i<length;i+) if(strcmp(booksi.get_bname(),bna)=0) /判断 return i; return -1;int bau_search(char *bau) /按作者查找书籍 for(int i=0;i<length;i+) if(strcmp(booksi.get_bauthor(),bau)=0)/判断 return i; return -1;int rn_search(char *rn) /按借阅人查找书籍 for(int i=0;i<length;i+) if(strcmp(booksi.get_rname(),rn)=0)/判断 return i; return -1;int bd_search(char *bd) /按借出日期查找书籍 for(int i=0;i<length;i+) if(strcmp(booksi.get_bdays(),bd)=0)/判断 return i; return -1;int bc_search(char *bc) /按超期天数查找书籍 for(int i=0;i<length;i+)if(strcmp(booksi.get_bchao(),bc)=0)/判断return i;return -1;void revise(Book book,int i) /修改书籍函数 booksi.copy(book); /调用Book结构体copy函数void deleteBook(int index) /删除书籍资料函数 for(int i=index;i<length-1;i+) booksi.copy(booksi+1);/用后面的地址将当前的地址覆盖 length-; void show_bookhead() /显示输出列表,表头。cout<<" *书*籍*信*息*列*表*nn" cout<<"书号" cout.width(15); cout<<"书名" cout.width(15); cout<<"作者" cout.width(15); cout<<"借阅人"cout.width(15); cout<<"借出日期"cout.width(15); cout<<"超期天数n"void show_book(int i)/显示书籍函数 cout<<booksi.get_bnum(); cout.width(15); cout<<booksi.get_bname(); cout.width(15); cout<<booksi.get_bauthor(); cout.width(15); cout<<booksi.get_rname(); cout.width(15); cout<<booksi.get_bdays(); cout.width(15); cout<<booksi.get_bchao()<<"n" void saveFileHead() /保存书籍文件的表头到txtofstream fwrite("书籍信息.txt",ios:app); if(!fwrite)cout<<"文件保存失败!n" exit(1);fwrite<<" *书*籍*信*息*列*表*nn" fwrite<<"书号" fwrite.width(15); fwrite<<"书名" fwrite.width(15); fwrite<<"作者" fwrite.width(15); fwrite<<"借阅人"fwrite.width(15); fwrite<<"借出日期"fwrite.width(15); fwrite<<"超期天数n"fwrite.close(); /关闭磁盘文件void saveFile(int i)/带参的输出书籍到txtofstream fwrite("书籍信息.txt",ios:app); fwrite<<booksi.get_bnum(); fwrite.width(15); fwrite<<booksi.get_bname(); fwrite.width(15); fwrite<<booksi.get_bauthor(); fwrite.width(15); fwrite<<booksi.get_rname(); fwrite.width(15); fwrite<<booksi.get_bdays(); fwrite.width(15); fwrite<<booksi.get_bchao()<<"n"fwrite.close(); /关闭磁盘文件void readFile() /读取书籍文件 struct books char numb10; /书号 char nameb20; /书名 char authorb10; /作者 char namer10; /借阅人 char daysb10; /借出日期 char chaob10; /超期天数Book book; /书籍结构体对象bookbooks form100;FILE *fp;if (NULL=(fp=fopen("图书数据库.txt","r")printf("file not open!n");exit(0);fseek(fp,40,SEEK_SET); /跳开表头40字节for(int i=0;i<5;i+)fscanf(fp, "%s", &formi.numb);fscanf(fp, "%s", &formi.nameb);fscanf(fp, "%s", &formi.authorb);fscanf(fp, "%s", &formi.namer);fscanf(fp, "%s", &formi.daysb);fscanf(fp, "%s", &formi.chaob);book.set_bnum(formi.numb);book.set_bname(formi.nameb);book.set_bauthor(formi.authorb); book.set_rname(formi.namer); book.set_bdays(formi.daysb);book.set_bchao(formi.chaob);BookManage:add(book);fflush(stdin); /总是溢出,终于想去了清空缓存,就好了,呵呵fclose(fp); /*菜单结构体,实现界面引导*class MenuBookManage bm; /定义书籍管理结构体对象bmprivate:char choice; /菜单序号选择 int key; /管理员密码public:int check(int m) /检查语句/*int q;dowhile(!(q=scanf("%ld",&m)|getchar()!='n') fflush(stdin);printf("输入错误,请重新输入:");while(q=0);(int) m;*/return m;void header() /首页欢迎界面/system("color A9");cout<<"t n"cout<<"t n"cout<<"t n" cout<<"t n"cout<<"t n"cout<<"t n"_sleep(1000);cout<<"t n"cout<<"t n"cout<<"t BESTI 北 京 电 子 科 技 学 院 n"cout<<"t =n"cout<<"t 图 书 借 阅 管 理 系 统 1.0 n"cout<<"t n"cout<<"t n"_sleep(600);void log_menu() /主界面登录菜单/system("color fd");header();cout<<"nttt< 请 选 择 是 否 进 入 >n"cout<<"ntttt1: 进 入 系 统nntttt0: 退 出nt您的选择是: "choice: cin>>choice;cin.ignore(); /清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响int check(choice); /检查语句switch(check-48)case 1: log_admin(); /登录,需密码验证break;case 0:exit(1); /退出系统break;default:cout<<"nt您的操作有误,请重新选择(01): "fflush(stdin);goto choice;void admin_menu() /管理菜单system("cls");/system("color f9");cout<