c图书信息管理系统附源码.docx
- 文档编号:29645173
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:47
- 大小:585.87KB
c图书信息管理系统附源码.docx
《c图书信息管理系统附源码.docx》由会员分享,可在线阅读,更多相关《c图书信息管理系统附源码.docx(47页珍藏版)》请在冰豆网上搜索。
c图书信息管理系统附源码
学号:
20104303
计算机实习报告
系别:
管理系
专业:
信息管理与信息系统专业
班级:
1043班
学生:
优
指导教师:
徐日
日期:
2012-09-03~2012-09-14
1需求分析
1.1选题任务
图书借阅管理系统
(1)编程工具
C++
(2)要求
选题学生应具有端正的学习态度、正常的交流能力,应有积极主动、克服困难的学习意识
(3)本题概述
以学院图书馆为例,图书借与管理是一项经常性工作,为使图书借阅管理工作准确高效,提供图书借阅记录的添加、修改、删除、查询、浏览、汇总等,用图书借阅关系软件,能有效提高工作效率,具有较强的实际意义。
(4)功能描述
1能度日外部提供的包含图书借阅信息的文本文件(TXT文件);
2能在程序中录入图书借阅信息(可参考我院图书馆网上图书借阅信息的各个项目),并将信息写入文本文件(TXT文件);
3能对所有图书借阅信息,按条件(按图书名、图书编号、借阅日期、借阅人、超期与否、超期天数等)查询浏览,能汇总统计计算出符合某条件的图书借阅记录的数量并浏览这些借阅信息,能将查询、浏览、汇总的结果输出结果文本文件(TXT文件)
(5)辅助说明
基础要求:
①+②
扩展要求:
①+②+③
1.2输入数据和输出数据形式:
程序中包含的图书信息包括:
charbnum[20];//书号
charbname[20];//书名
charbauthor[10];//作者
charrname[10];//借阅人
charbdays[10];//借出日期
charbchao[10];//超期天数
为了方便,我全部设置成了char型。
而程序中包含两种输入方式和两种输出方式,对应题目要求,分别是:
单个图书信息的增删查改;TXT文档的导入(图书数据库.txt);屏幕的打印;TXT文档的导出(书籍信息.txt)。
1.3测试数据及测试目的
字母测试,错误数据测试,重复数据测试
目的:
产看本程序的纠错能力和是否人性化。
2程序设计
2.1关键数据类型定义
//********书籍结构体,用于存放书籍基本信息********
classBook
{
private:
charbnum[20];//书号
charbname[20];//书名
charbauthor[10];//作者
charrname[10];//借阅人
charbdays[10];//借出日期
charbchao[10];//超期天数
public:
Book()//构造函数初始化信息
voidset_bnum(char*no)//设置书号
char*get_bnum()//获得书号
voidset_bname(char*n)//设置书名
char*get_bname()//获得书名
voidset_bauthor(char*a)//设置作者
char*get_bauthor()//获得作者
voidset_bdays(char*d)//设置借出日期
char*get_bdays()//获得借出日期
voidset_bchao(char*c)//设置超出天数
char*get_bchao()//获得超出天数
voidset_rname(char*rn)//设置借阅人
char*get_rname()//获得借阅人
voidcopy(Bookm)//Book结构体copy函数
};//classbook
//**********书籍管理结构体,实现管理书籍功能**********
classBookManage
{
private:
Bookbooks[100];//定义Book书籍结构体数组对象,最大容量100本
public:
intlength;
BookManage()//构造函数,读取磁盘文件
intadd(Bookbook)//添加图书资料
intbnu_search(char*bnu)//按书号查找书籍
intbna_search(char*bna)//按书名查找书籍
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)//显示书籍函数
voidsaveFileHead()///保存书籍文件的表头到txt
voidsaveFile(inti)//带参的输出书籍到txt
voidreadFile()//读取书籍文件
};//classBookManage
//**********菜单结构体,实现界面引导**********
classMenu
{
BookManagebm;//定义书籍管理结构体对象bm
private:
intchoice;//菜单序号选择
intkey;//管理员密码
public:
voidheader()//首页欢迎界面
voidlog_menu()//主界面登录菜单
voidadmin_menu()//管理菜单
voidabsearch_menu()//查找书籍菜单
voidlog_admin()//密码登陆
voidrn_search()//按借阅人查找函数
voidbnu_search()//按书号查找函数
voidbna_search()//按书名查找函数
voidbau_search()//按作者查找函数
voidbd_search()//按借阅日期查找函数
voidbc_search()//按超期天数查找函数
voidaddBook()//添加新的书籍信息函数
voidreviseBook()//修改书籍函数
voiddelBook()//删除书籍函数
intmain()
2.2主程序流程图
2.3调用关系
1.书籍信息的录入:
voidset_bnum(char*no)//设置书号
{strcpy(bnum,no);}//把字符串no中的字符复制到字符串bnum中
char*get_bnum()//获得书号
{returnbnum;}//返回值为bnum
voidset_bname(char*n)//设置书名
{strcpy(bname,n);}
char*get_bname()//获得书名
{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*get_rname()//获得借阅人
{returnrname;}
2.书籍信息的添加:
intadd(Bookbook)
判断length是否达到最大值,如果没有则进行添加。
3.书籍信息的查找:
无论是按照书号、书名、作者、借阅人、借出日期、超期天数来进行查找都是进行挨个比较,如果遇到相同则返回书籍的i值,进行返回输出。
4.书籍信息的修改:
输入想要修改的书籍编号,按照查找的方法,找到i,然后进行覆盖。
完成修改。
5.书籍的屏幕打印输出:
分两部分输出,首先打印一个头信息,相当于列表的头;然后利用循环语句带参输出(i为参数,循环)。
6.保存信息到txt文件:
同分为两部分,类似屏幕打印的方法,先存入表头,然后带参循环存入书籍信息。
带参的意义就是,可以无限调用该语句,只要知道书的序号i。
7.从信息中读取txt文件:
structbooks
{
charnumb[10];//书号
charnameb[20];//书名
charauthorb[10];//作者
charnamer[10];//借阅人
chardaysb[10];//借出日期
charchaob[10];//超期天数
};
定义结构体。
利用fscanf()语句讲读取的数据按顺序存入结构体中。
然后直接利用书籍添加函数直接写入系统。
3调试分析
3.1主要问题及解决方案:
1.界面颜色设定:
一直抛弃黑底白字这种默认形式,换一种颜色给人特殊的感觉,在网上找到相关的代码为system("color**");语句。
但是也是没有头绪不知道怎么调试,后来一不小心设置错误,系统就弹出了提示界面,我就明白了界面颜色的设置方法(图3.1):
图3.1
2.关于书籍的cout输出:
最开始设计输出模块时候,仅仅是想到了不带参的book信息输出,show_book()函数中自带了一个for语句循环输出所有书籍信息,是为显示全部书籍设计的。
但是后来发现如果要单显示筛选信息就要从新写一个带参show_book(inti),虽然函数重载允许这样做,但是却无意义的增加了代码长度。
我选择删除了不带参的show_book(),把for语句循环写在外面。
这样就增加了show_book(inti)函数的利用率,精简了函数的和长度。
3.书籍信息的txt写入:
综合了屏幕打印的经验,鉴于fwrite和cout使用方法和显示效果类似,我决定将txt的写入语句也设置成带参形式saveFile(inti),原理与show_book(inti)基本一致。
完成这些就能实现。
后来发现文件总是覆盖,每次写入都会将上一次的覆盖,也就是只有最后一行,后来才想起了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测试数据
1.A4asdfasdf(多字母):
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
#include
#include
#include
#include
usingnamespacestd;
//********书籍结构体,用于存放书籍基本信息********
classBook
{
private:
charbnum[20];//书号
charbname[20];//书名
charbauthor[10];//作者
charrname[10];//借阅人
charbdays[10];//借出日期
charbchao[10];//超期天数
public:
Book()//构造函数初始化信息
{strcpy(bnum,"");
strcpy(bname,"");
strcpy(bauthor,"");
strcpy(rname,"");
strcpy(bdays,"");
strcpy(bchao,"");
}
voidset_bnum(char*no)//设置书号
{strcpy(bnum,no);}//把字符串no中的字符复制到字符串bnum中
char*get_bnum()//获得书号
{returnbnum;}//返回值为bnum
voidset_bname(char*n)//设置书名
{strcpy(bname,n);}
char*get_bname()//获得书名
{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*get_rname()//获得借阅人
{returnrname;}
voidcopy(Bookm)//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());
}
};
//**********书籍管理结构体,实现管理书籍功能**********
classBookManage
{
private:
Bookbooks[100];//定义Book书籍结构体数组对象,最大容量100本
public:
intlength;
BookManage()//构造函数,读取磁盘文件
{
length=0;//从头读起,计数,最大100
}
~BookManage()//析构函数,保存磁盘文件
{
}
intadd(Bookbook)//添加图书资料/////////////
{
if(length>=100)
{
cout<<"对不起,储存已满,您无法继续添加!
\n";
return-1;
}
else
{
books[length].copy(book);//调用书籍结构体copy函数
length++;
return(length-1);
}
}
intbnu_search(char*bnu)//按书号查找书籍
{
for(inti=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比较,判断是否相等 returni; return-1; } intbna_search(char*bna)//按书名查找书籍 { for(inti=0;i if(strcmp(books[i].get_bname(),bna)==0)//判断 returni; return-1; } intbau_search(char*bau)//按作者查找书籍 { for(inti=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判断 returni; return-1; } intrn_search(char*rn)//按借阅人查找书籍 { for(inti=0;i if(strcmp(books[i].get_rname(),rn)==0)//判断 returni; return-1; } intbd_search(char*bd)//按借出日期查找书籍 { for(inti=0;i if(strcmp(books[i].get_bdays(),bd)==0)//判断 returni; return-1; } intbc_search(char*bc)//按超期天数查找书籍 { for(inti=0;i if(strcmp(books[i].get_bchao(),bc)==0)//判断 returni; return-1; } voidrevise(Bookbook,inti)//修改书籍函数 { books[i].copy(book); }//调用Book结构体copy函数 voiddeleteBook(intindex)//删除书籍资料函数 { for(inti=index;i books[i].copy(books[i+1]);//用后面的地址将当前的地址覆盖 length--; } voidshow_bookhead()//显示输出列表,表头。 { cout<<"**********************书****籍****信****息****列****表**********************\n\n"; cout<<"书号"; cout.width(15); cout<<"书名"; cout.width(15); cout<<"作者"; cout.width(15); cout<<"借阅人"; cout.width(15); cout<<"借出日期"; cout.width(15); cout<<"超期天数\n"; } voidshow_book(inti)//显示书籍函数 { cout< cout.width(15); cout< cout.width(15); cout< cout.width(15); cout< cout.width(1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 信息管理 系统 源码