C语言课设报告图书管理系统0文档格式.docx
- 文档编号:19335081
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:11
- 大小:46.08KB
C语言课设报告图书管理系统0文档格式.docx
《C语言课设报告图书管理系统0文档格式.docx》由会员分享,可在线阅读,更多相关《C语言课设报告图书管理系统0文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
3.2.3图书信息删除4
3.2.4图书信息显示4
3.2.5图书信息搜索4
3.2.6图书信息排序5
3.3读者管理模块设计6
3.3.1新增读者6
3.3.2修改读者信息7
3.3.3其他功能7
4所遇到的问题和分析解决7
4.1查找输出多个结果7
4.2设置控制台字体颜色7
5系统特色及关键技术8
6结论9
引言
图书馆管理系统是我国大部分院校或其它部门不可缺少的部分,书籍是人类精神食粮,尤其对一些学校,图书馆来说,非常重要。
在软件开发中,以计算机图书为主,称“计算机图书管理系统”。
计算机图书管理系统能够为用户实现借阅图书、管理等,随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对图书资源信息进行管理,具有着手工管理所无法比拟的优点.例如:
查阅迅速、安全性高、可靠性高、存储量大、保密性好、成本低等。
计算机图书管理系统能够单一定向计算机图书方面,具有实用,精简功能等效率,这些优点能够极大地提高图书馆管理的效率,也是企业、学校的科学化、正规化管理,与世界接轨的重要条件。
因此,开发这样一套管理软件是很有必要。
本案例开发的是“计算机图书管理系统”。
1系统概述
本图书馆管理系统,完成图书管理和读者管理的功能,并能对借阅信息进行管理,完成以下功能:
1.读者信息管理,可以添加、修改、删除、查询读者信息;
2.书籍信息管理,可以添加、修改、删除、查询书籍信息;
3.借书信息管理,可以进行添加借书信息。
4.还书信息管理,可以进行添加还书信息。
5.书籍信息统计,可以显示排序相关信息。
本系统适合小型图书管理机构使用。
2需求分析
2.1系统需求
图书管理系统需要满足来自两方面的需求,这两个方面分别是图书借阅者、和图书馆管理人员。
图书借阅者的需求是查询图书馆所存的图书、个人借阅情况及个人信息的修改;
图书馆管理人员的功能较为复杂,包括对图书借阅者、图书进行管理和维护,及系统状态的查看、维护。
图书馆信息管理系统是围绕图书馆的各项业务活动而建立的,其中涉及的信息大体上可以分为三类:
业务过程信息,读者信息和管理信息。
其中业务过程信息是指定完成业务所产生的过程控制信息,如借阅信息,新书入库信息等都是局部信息,读者信息是指在读者整个在校期间需要在整个系统范围内共享的信息,是基本信息。
图书馆管理人员功能的信息量很大,数据安全性和保密性要求最高。
本功能实现对图书信息、借阅者信息、总体借阅情况信息的管理和统计、管理人员信息查看及维护。
图书馆管理员可以浏览、查询、添加、删除、修改、统计图书的基本信息;
浏览、查询、统计、添加、删除和修改图书借阅者的基本信息,浏览、查询、统计图书馆的借阅信息,但不能添加、删除和修改借阅信息,但是,删除某条图书借阅者基本信息记录时,应实现对该图书借阅者借阅记录的级联删除。
根据市场需要,要求具有以下功能:
读者信息添加、修改、删除等功能。
书籍信息添加、修改、删除、查询等功能。
图书借阅功能。
2.2开发环境
VisualC++是功能最为强大可视化开发工具,它不仅支持传统的软件开发方法,更重要的是它能支持面向对象、可视化的开发风格。
因此VisualC++又称作是一个集成开发工具,它提供了软件代码自动生成和可视化的资源编辑功能。
C++是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
WindowsXP中文全称为视窗操作系统体验版。
是微软公司发布的一款视窗操作系统。
它发行于2001年10月25日,原来的名称是Whistler。
WindowsXP的最低系统要求:
计算机使用时钟频率为300MHz或更高的处理器;
至少需要233MHz(单个或双处理器系统);
使用IntelPentium/Celeron系列、AMDK6/Athlon/Duron系列或兼容的处理器,使用128MBRAM或更高(最低支持64M,可能会影响性能和某些功能),1.5GB可用硬盘空间,SuperVGA(800x600)或分辨率更高的视频适配器和监视器,CD-ROM或DVD驱动器,键盘和Microsoft鼠标或兼容的指针设备。
3详细设计
3.1系统功能概览
根据需求分析,设计系统框架。
图书管理系统由等5部分组成。
设计各部分具体功能如下:
1)读者信息模块。
包括读者编号、读者姓名、已借阅的图书三部分。
2)书籍信息模块。
包括编号、书名、作者、出版时间、出版社、总数、藏管名称、七部分。
3)书籍借还模块。
包括图书编号、读者编号。
4)书籍管理模块。
包括增加、删除、修改、查找、排序、统计几部分。
3.2图书管理模块设计
图书管理功能作为类library的一个方法,实现了有子菜单的图书管理功能,其中包括:
新增,修改,删除,打印,搜索,统计,退出。
函数中声明了一些变量:
intchoice作为输入缓存
Charwname[16]缓存输入的作者名
charbname[50];
缓存输入的书名
charpubname[50];
缓存输入的出版社名
intbook_num;
缓存输入的书编号
charpubtime[20];
缓存输入的出版时间
inttotal;
缓存输入的总册数
intnumin;
缓存输入的在馆册数
charaddress[50];
缓存输入的现存地址
bookm*b;
图书对象暂存指针;
由while语句检测输入的choice并决定是否打印菜单,接着由do-while语句检测choice值是否越界,如果越界则返回输入。
最终由switch语句根据输入的choice值进入各个功能。
3.2.1图书信息添加模块
此功能包含在图书管理模块中,图书管理函数voidlibrary:
:
bookmanage()中switch语句中的case1,在进入此模块时,屏幕依次打印“请输入编号”
书名,作者名,出版日期,出版社名称,入库数量。
新书入库时,在馆数量置为书数,最后输入存址。
在获得输入的7个参数后,调用library类成员函数
addbook(book_num,total,bname,wname,pubname,pubtime,address)
并根据返回值,输出是否成功加入图书信息的提示。
3.2.2图书信息更改
进入此功能后,首先提示输入需要修改的图书编号,在输入后调用library类成员函数search_bnum(book_num);
查找该编号图书是否在库,并给出相应的提示,如果不存在,则中断函数执行,返回上层菜单。
在正确查找到该编号后,依次提示输入新的书名,作者姓名,出版年月,出版社名称,登记数量,存址。
并由serach_bnum()返回的指针分别调用bookm类函数b->
setbname(bname);
b->
setwname(wname);
setpubtime(pubtime);
setpubname(pubname);
settotal(total);
setaddress(address);
来完成信息修改。
3.2.3图书信息删除
提示输入要删除图书的编号,调用search_bnum(book_num);
查找该编号,如存在。
则调用delbook();
删除该书,把flag置为1,使其不被写入文件。
3.2.4图书信息显示
调用library类函数show()。
Show()由bookm类函数show1();
和show2()构成,分别输出标题和内容。
3.2.5图书信息搜索
声明变量intselection;
用于存储选择。
打印菜单,列出选项,按图书编号搜索,按书名搜索,按作者搜索,按出版社搜索,同时按书名和出版社搜索,回到上层菜单。
当selection值为1时,按图书编号搜索使用函数search_bnum(book_num);
此函数有返回指向对象bookm的指针,检测该指针变量,如果为空,那么书库中没有该书,中断switch执行。
否则,使用该指针调用show()输出该书信息。
当selection值为2时,按图书书名搜索使用函数search_bname(bname);
当selection值为3时,按作者姓名查找图书,将输入变量wname作为参数调用函数search_wname(wname);
此函数直接在其内部输出查找结果,返回值为空。
执行完后,break。
当selection值为4时,按出版社名称查找图书,将输入变量pubname作为参数传递给函数search_pubname(pubname);
与作者姓名查找一样。
此函数在内部输出查找结果。
返回空值。
当selection值为5时,输出"
请输入需要查找的图书的书名:
"
,等待输入bname。
输出:
请输入要查找的出版社名称"
,等待输入pubname。
都输入后,调用library类中方法search_bname_pubname(bname,pubname),此方法原型为voidlibrary:
search_bname_pubname(charbname[],charpubname[]),在内部同时查找图书名称为bname和出版社名称为pubname的结果。
查找到直接输出,并置flag2为true。
否则会检测到flag2为false而在循环结束后输出:
对不起,该图书不存在!
当selection为0时,执行break;
结束本层菜单。
如若selection值不为0-5.输出:
"
对不起,输入有误,请重新输入!
3.2.6图书信息排序
声明变量selection2作为选择存储,而后输出菜单:
***************************************************
1按图书编号排序"
<
endl;
2按图书书名排序"
3按借出次数排序"
4按出版时间排序"
<
5统计信息"
0返回上层菜单"
***************************************************"
并使用do-while循环检测输入变量的正确性,如若超出范围,给出提示信息"
对不起,输入有误,请查证后再输入!
,当符合约束条件,则中断循环转入switch语句,根据selection2的值进入不同的功能中:
1.当selection2为1,调用函数sortbybnum(),此函数将使用冒泡排序图书数据数组book[]。
然后调用library类的show();
打印出全book[]。
2.当selection2为2,调用函数sortbybname();
,此函数将使用冒泡排序图书数据数组book[]。
3.当selection2为3,调用函数sortbynum_jie();
,此函数将使用选择排序图书数据数组book[]。
4.当selection2为4,调用函数sortbypub_time();
5.当selection2为5,声明变量count,count1,count2,count3,count4,
分别存储书库图书总数,书库1图书数量,书库2图书数量,书库3图书数量,其他书库图书数量。
使用循环遍历book[],并使用gettotal()返回书本数目并累加到相应的count中。
最后输出***************************************************"
书库中共有图书"
count<
本"
【书库1】有"
count1<
本,"
占"
(float)count1/count*100<
%"
【书库2】有"
count2<
(float)count2/count*100<
【书库3】有"
count3<
(float)count3/count*100<
【其他书库】有"
count4<
(float)count4/count*100<
3.3读者管理模块设计
类似于图书管理模块,首先管理模块函数名为voidReaderdata:
readerdata()
而后打印菜单***************************************************"
读者管理"
1新增读者信息"
2读者信息更改"
3删除读者信息"
4读者信息显示"
;
5搜索读者信息"
0安全退出模块"
***************************************************"
使用do-while循环检查输入变量是否越界,然后使用switch语句完成功能的选择
3.3.1新增读者
当case1时,提示"
请输入读者编号:
请输入读者姓名:
输入后调用函数addreader(reader_num,reader_name);
完成增加读者信息。
3.3.2修改读者信息
当case2时,提示"
,然后调用函数search_rnum(reader_num)查找该编号的读者信息,使用返回的指针调用setname(reader_name)重置读者姓名。
3.3.3其他功能
诸如编号3.4.5的功能。
与图书管理具有很大相似性,不在一一叙述。
4所遇到的问题和分析解决
4.1查找输出多个结果
最初编写的查找函数都是单参数,单输出结果,即查找到第一个符合条件的结果就停止查找。
而后考虑到,除图书编号,名称是唯一的,作者姓名及出版社等属性不一定唯一,即一个作者可能有几本作品,而一个出版社可能出版有多本图书。
这样最初的查找函数不能完全输出所有的结果。
首先想到并采用的是使用链表或者栈存储查找结构,使得查找函数返回栈或链表的头指针。
再遍历链表结点并输出图书信息。
此时又产生了第2个问题,如果使用栈,那么打印查找结果必然使用出栈操作,然而,假如需要打印两次的输出结果,或者,在其他地方需要使用到该结果,而打印过一次的栈已经清空,不能再度使用。
如果再次查找生成新栈,将大大增加操作繁琐度。
最终放弃使用不熟悉的stl模板库,重新设计图书编号和书名以外的查找函数:
首先声明变量boolflag2=false;
用来标记查找是否有结果。
如有结果则置为true,最后检测flag2的值,如为false输出无查找结果。
而查找判断语句中直接调用show();
输出查找结果,这样,更改函数返回类型为void,不在返回查找结果的指针。
4.2设置控制台字体颜色
由于windows系统控制台窗口颜色十分单调,并且不能有效的调整,所以,考虑使用特殊颜色字体打印相关内容,以达到突出重点,着重显示关键数据的目的。
网络查找的结果是:
要更改前景色和控制台窗口将显示的文本的背景色,使用
SetConsoleTextAttributeWin32应用程序函数。
此功能将设置写入屏幕缓冲区的字符的属性。
当您在运行时更改这些属性时,所做的更改是有效的只要是打开的控制台窗口。
如果关闭并重新打开在控制台窗口,属性将被重置为其默认值中。
如果从已在运行一个控制台窗口中的命令行中运行程序,您对文本属性的更改都有效的控制台窗口将,只要窗口是打开,即使在您的程序退出。
因此,程序退出之前,该程序恢复原始的颜色属性。
您可以通过使用GetConsoleScreenBufferInfo
函数来获取控制台窗口的文本属性。
此函数填充当前的输出缓冲区设置有关的信息在
CONSOLE_SCREEN_BUFFER_INFO
结构的实例。
此结构的
wAttribute
参数包含定义前景色和文本的背景色的颜色信息。
可能的颜色是任何颜色组合,可以创建由组合的红色、绿色和蓝色的。
此函数要求include头文件windows.h,需要使用到屏幕缓冲
HANDLEhConsoleHandle=GetStdHandle(STD_OUTPUT_HANDLE);
为第一个参数。
第2个参数是颜色代码。
可以使用头文件中的定义值或者相应的int。
在程序中使用后,使得整个程序所有字幕都变色,没有达到设定指定输出的效果,而大大增加了代码复杂性,所以放弃使用。
5系统特色及关键技术
系统使用fstream文件流进行文件操作。
在图书管理和读者管理的类构造函数中使用fstreamfile("
book.txt"
ios:
in);
进行数据读取。
在类的析构函数中使用fstreamfile("
out);
进行文件写入。
写入时使用file.write((char*)&
reader[i],sizeof(reader[i]));
进行,每次写入一个对象大小的数据。
析构函数简介:
析构函数(destructor)与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
析构函数往往用来做“清理善后”的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
以C++语言为例,析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud(),以区别于构造函数。
它不能带任何参数,也没有返回值(包括void类型)。
只能有一个析构函数,不能重载。
如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。
所以许多简单的类中没有用显式的析构函数。
6结论
通过这次课程设计,让我了解了更多关于设计时容易出现的错误,而且进一步的认识到平时学习积累的重要性。
在刚进行编译的时候发现了很多的错误,都是平时应该注意的细节问题,还好与同学进行了很好的交流,得以纠正错误。
本系统可以作为图书馆管理的系统,综合考虑到了图书馆管理的各个方面,界面设计简洁,当然还有一些不足。
为了能够较好地完成本次课程设计,我进行了阅读教材,网上搜索,到图书馆查找相关资料等准备工作,在做课程设计的过程中,我在利用所学知识的同时,又学到了很多实例化的理论知识和软件工程的一些实践。
总结了一些经验和方法。
强化了我的实际动手能力。
同时也找到自己的不足。
我一定会继续学习增加自己的编程能力和调试能力,在今后的学习中我会更加的努力,增加自己的知识储备。
拓宽了知识面,锻炼了能力,综合素质得到较大提高。
最后感谢老师给予的耐心指导与同学的帮助,使我能顺利完成这次课程设计。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 报告 图书 管理 系统