1、学号:20104303计算机实习报告系别:管理系专业:信息管理与信息系统专业班级:1043班学生姓名:李优指导教师:徐日日期:2012-09-03-2012-09-141需求分析1.1选题任务图书借阅管理系统(1)编程工具C+(2)要求选题学生应具有端正的学习态度、正常的交流能力,应有积极主动、克服困难的学习意识(3)本题概述以学院图书馆为例,图书借与管理是一项经常性工作,为使图书借阅管理工作准确高效,提供图书借阅记录的添加、修改、删除、查询、浏览、汇总等,用图书借阅关系软件,能有效提高工作效率,具有较强的实际意义。(4)功能描述能度日外部提供的包含图书借阅信息的文本文件(TXT文件);能在
2、程序中录入图书借阅信息(可参考我院图书馆网上图书借阅信息的各个项目),并将信息写入文本文件(TXT文件);能对所有图书借阅信息,按条件(按图书名、图书编号、借阅日期、借阅人、超期与否、超期天数等)查询浏览,能汇总统计计算出符合某条件的图书借阅记录的数量并浏览这些借阅信息,能将查询、浏览、汇总的结果输出结果文本文件(TXT文件)(5)辅助说明基础要求:+扩展要求:+1.2输入数据和输出数据形式:程序中包含的图书信息包括:charbnum20;书号charbname20;书名charbauthor10J;作者charrnameL10;借阅人charbdays10;charbchaoL10;借
3、出日期超期天数为了方便,我全部设置成了char型。而程序中包含两种输入方式和两种输出方式,对应题目要求,分别是:单个图书信息的增删查改;TXT文档的导入(图书数据库.txt);屏幕的打印;TXT文档的导出(书籍信息.tXt)o1.3测试数据及测试目的字母测试,错误数据测试,重复数据测试目的:产看本程序的纠错能力和是否人性化。2.1关键数据类型定义*书籍结构体,classBook(private:charbnum20;charbname20;charbauthor10;charrname10J;charbdays10J;charbchao10J;public:Book()vo
4、idset_bnum(charchar*get_bnum()voidcharvoid2程序设计用于存放书籍基本信息*set_bname(char*n)*get_bname()set_bauthor(char*a)书号书名作者借阅人借出日期超期天数构造函数初始化信息*no)设置书号获得书号设置书名获得书名设置作者char*get_bauthor()voidset_bdays(char*d)char*get_bdays()voidset_bchao(char*c)char*get_bchao()voidset_rname(char*rn)char
5、*get_rname()voidcopy(Bookm);/classbook获得作者姓名设置借出日期获得借出日期设置超出天数获得超出天数设置借阅人获得借阅人姓名/Book结构体copy函数*书籍管理结构体,实现管理书籍功能*classBookManageprivate:Bookbooks100;定义Book书籍结构体数组对象,最大容量100本public:intlength;构造函数,读取磁盘文件BookManage()intadd(Bookbook)添加图书资料intbnu-search(char*bnu)按书号查找书籍intbna_search(char*bna)按书名查
6、找书籍intbau_search(char*bau)按作者查找书籍intrn_search(char*rn)按借阅人查找书籍intbd_search(char*bd)按借出日期查找书籍intbc_search(char*bc)按超期天数查找书籍voidrevise(Bookbook,inti)/修改书籍函数voiddeleteBook(intindex)删除书籍资料函数voidshow_bookhead()显示输出列表,表头。voidshow_book(inti)显示书籍函数voidsaveFileHeadO/保存书籍文件的表头到txtvoidsaveFile(inti)带参的输出书籍到txt
8、arch()voidbc_search()voidaddBook()voidreviseBook()密码登陆按借阅人姓名查找函数按书号查找函数按书名查找函数按作者查找函数按借阅日期查找函数按超期天数查找函数添加新的书籍信息函数修改书籍函数voiddeiBook()删除书籍函数intmain()2.2主程序流程图2.3调用关系1.书籍信息的录入:voidset_bnum(char*no)strcpy(bnum,no);char*get_bnum()returnbnum;voidset_bname(char*n)strcpy(bname,n);char*get_bna
9、me()returnbname;voidset_bauthor(char*a)strcpy(bauthor,a);)char*get_bauthor()returnbauthor;)voidset_bdays(char*d)strcpy(bdays,d);)char*get_bdays()returnbdays;voidset_bchao(char*c)strcpy(bchao,c);)char*get_bchao()returnbchao;voidset_rname(char*rn)strcpy(rname,rn);char
10、*get_rname()returnrname;2.书籍信息的添加:intadd(Bookbook)判断length是否达到最大值,设置书号把字符串no中的字符复制到字符串bnum中获得书号返回值为bnum设置书名获得书名设置作者获得作者姓名设置借出日期获得借出日期设置超出天数获得超出天数设置借阅人获得借阅人姓名如果没有则进行添加。3.书籍信息的查找:无论是按照书号、书名、作者、借阅人、借出日期、超期天数来进行查找都是进行挨个比较,如果遇到相同则返回书籍的i值,进行返回输出。4.书籍信息的修改:输入想要修改的书籍编号,按照查找的方法,找到i,然后进行覆盖。完成修改。5.书籍的屏
11、幕打印输出:分两部分输出,首先打印一个头信息,相当于列表的头;然后利用循环语句带参输出(i为参数,循环)。6.保存信息到txt文件:同分为两部分,类似屏幕打印的方法,先存入表头,然后带参循环存入书籍信息。带参的意义就是,可以无限调用该语句,只要知道书的序号i。7.从信息中读取txt文件:structbookscharnumb10;书号charnameb20;charauthorb10J;charnamerL10;chardaysb10;charchaob10;/书名作者借阅人借出日期超期天数;定义结构体。利用fscanf()语句讲读取的数据按顺序存入结构体中。然后直接利用书籍添
13、89ABGDEF色色色色篮色色色色黑蓝绿湖红膏白=01234567CMD.EXE启动时髓爵舞号箭矗鬣韶颜鹃般DefaultColor注册表值。加是用相同的前景和直景颜色来执行COLOR命令,COLOR命令除潞EPRORLEUEL设置为1。图3.12.关于书籍的cout输出:最开始设计输出模块时候,仅仅是想到了不带参的book信息输出,show_book()函数中自带了一个for语句循环输出所有书籍信息,是为显示全部书籍设计的。但是后来发现如果要单显示筛选信息就要从新写一个带参show_book(inti),虽然函数重载允许这样做,但是却无意义的增加了代码长度。我选择删除了不带参的sh
14、ow_book(),把for语句循环写在外面。这样就增加了show_book(inti)函数的利用率,精简了函数的和长度。3.书籍信息的txt写入:综合了屏幕打印的经验,鉴于fwrite和cout使用方法和显示效果类似,我决定将txt的写入语句也设置成带参形式saveFile(inti),原理与show_book(inti)基本一致。完成这些就能实现。后来发现文件总是覆盖,每次写入都会将上一次的覆盖,也就是只有最后一行,后来才想起了ios:app追加模式,才最终算完整实现。4.读取数据函数:这个函数是我编辑最久的,因为使用的不熟练,我先查找了很多资料,并且写了一些单独的小程序去测试效果,但
15、是感觉都不理想。后来选择了一个最笨的方法,利用fseek函数一格一格的挑开空格和无用信息。但是这样做最大的缺点就是,我的txt导入文档鼻息保持固定格式,一格空格都不能多,如果多了就会导致错位。后来与徐老师交流时,老师也说这种输入方法不可取,因为实现了功能但是意义不大。规格太死,不够人性化。于是我就退后开始,重新选择语句。最后决定定义结构体,把txt中信息读取之后直接存入结构体,随后就把结构体中的数据利用set.xxxx函数存入。5.关于字母纠错及错误输入的处理:字母输入原来都是用fflush(stdin);来清空缓存来防止程序进入死循环。但是我这次编程想到了一个更加简单有效的方法:利用cha
25、:弋*黑"面*31校作者直正仔按日期麦技6;返回上级。|ill出索疑置输入也林要的技务序号,4谪桂3以要宜触借出日朝:26161W9建田野产BHWff米.:-<-米.:-;:-<-5.2测试目的1、测试学号重复2、测试字母和特殊字符对输入的影响3、测试筛选是否符合规格5.3测试结果全部通过6心得体会经历了为期十天的编程实习,我觉得我变得更加成熟了,我从一开始的迷茫到后来的目标坚定,这都是一个改变的过程。因为是在暑假前就选好了题目,而且提前也知道了题目的要求。所以我在暑假就做好的了充分的准备。其实最开始想自学用VC+来编写一个可视化的程序。但是实施起来却没有那么容易,因
26、为我学习的VC不系统不全面只是一些皮毛,改改别的还可以,但是要是真正想实现自己的思想就有点捉襟见肘。后决定还是先用比较熟悉的C+语言来编一个完整的系统。虽然以前有做过C+的实验。但是像这种完成的系统确实没有经历过。其实这也是一个挑战,也是一个开始,是我们接触完整系统的开始。等快开学时候我已经完成了大部分代码:0.1原版.cppwIC+Source|11KB工314实现二半二证U*T+SourceI也西102历史存档有vIbug.cppC+Source问题存档."PvIC+Source|.I21KB0.3.cppvIC+
27、Source|19KBdl功能基本实现U*C+Source21KB但是有一些问题还是没有解决,我开学后就开始全力去解决这些问题。偏偏事与愿违,关于文件读取问题始终没有找到好的解决办法。最后还是从C+教科书上找到的灵感来解决这些问题。收获很大。本次学习中我有以下收获:1、明确了C与C+的区别,运用了多种C+知识,包括一开始就没弄太明白的文件输入输出,这回事真正弄明白了。2、复习了类和结构体的知识,但是继承类没有用到。以后还要多加复习。3、第一次编写之后,运行之后有50多个错误,大多数都是因为马虎造成的。以后还要多加此类的练习熟能生巧。4、多多利用网络资源,看网上的类似的代码能够
28、开阔自己的思路,学习别人好的算法。学习有很大帮助。5、先写出流程图这样是非常好的一种习惯,可以为后面写程序打下好的基础。6、养成好习惯,一个一个模块写,写好了立即执行看是否有错误,以防都写完了,错误却没法去改正。10天的编程已经接近尾声,但是总觉得要完善我的选题仍有许多要做的工作。以后还要加强自己的学习。努力学习编程。感谢徐老师的指导。7附录#iiiclude
29、pacestd;*书籍结构体,classBook(private:charbnum20;charbname20;charbauthorflO;charrname10;charbdays10;charbchao10;public:Book()strcpy(bnum/M,);strcpy(bname/M,);strcpy(bauthor;MI);strcpy(rname,HM);strcpy(bdays/u,);strcpy(bchao/,M);用于存放书籍基本信息*书号书名作者借阅人借出口期超期天数构造函数初始化信息voidset_bnum(char*no)sti
30、cpy(bnuni4io);char*get_bnum()returnbnum;设置书号把字符串no中的字符更制到字符串bnum中获得书号返回值为bnumvoidset_bname(char*n)设置书名sticpy(bnaiiieji);char*get_bname()获得书名returnbnaine;voidset_bauthor(chai-*a)设置作者sticpy(bauthoi;a);char*get_bautliorQ获得作者姓名returnbauthor;设置借出口期获得借出口期设置超出天数/获得超出天数voidset_bdays(char*d)sticpy(bdays.d
31、);char*get_bdays()returnbdays;voidset_bchao(chai-*c)sticpy(bchao,c);char*get_bchao()returnbchao;voidseCrnaine(char*rn)设置借阅人sticpy(rname,in);char*get_rnaine()获得借阅人姓名returnrnaine;voidcopy(Bookm)/Book结构体copy函数strcpy(bnumjn.get_bnuniQ);将获得书号函数里的返回值里的字符更制到bnumstrcpy(bname4n.gecbname();strcpy(bauthor4ii
32、.get_bautlioi();strcpy(rnamejn.get_rname();strcpy(bdays,m.get_bdaysQ);strcpy(bchaojn.get_bchaoQ););*书籍管理结构体,实现管理书籍功能*classBookManageprivate:定义Book书籍结构体数组对象,最大容量100本Bookbooks100;public:mtlength;BookMaiiage()构造函数,读取磁盘文件length=0;从头读起,计数,最大100)BookManage0析构函数,保存磁盘文件intadd(Bookbook)/添力口图书资料/if(lengtli>
34、cmp(booksi.get_bnameO,bna)=O)判断returni;return-1;intbau_seaich(chai-*bau)按作者查找书籍(fbr(inti=O;i 35、籍(fbr(inti=O;i 41、K_SET);/跳开表头40字节for(inti=0;i<5;i+)(fscangS,"s",&fbrmi.numb);fscanf(fp,&fbrmi.naineb);fscanf(fp,M%s,&fbrmi.authorb);fscanf(fp,M%s*&r);fscanf(fp,M%s,&fbrmi.daysb);fscanf(fp,M%s,&fbnni.chaob);book.seCbnum(fbrmi.numb);book.secbname(b);book.set_bau 42、thor(fdnni.authorb);book.seOname(r);book.secbdays(formi.daysb);book.seCbchao(fbrmi.chaob);BookManage:add(book);fflush(stdin);/总是溢出,终于想去了清空缓存,就好了,呵呵fclose(fp););*菜单结构体,实现界面引导*classMenuBookMaiiagebm;定义书籍管理结构体对象bmprivate:charchoice;菜单序号选择intkey;管理员密码public:intcheck(intm)检查语句(/*intq;dowhile(!(