图书馆程序设计报告书马澜.docx
《图书馆程序设计报告书马澜.docx》由会员分享,可在线阅读,更多相关《图书馆程序设计报告书马澜.docx(53页珍藏版)》请在冰点文库上搜索。
图书馆程序设计报告书马澜
华科学院计算机科学与技术系
信息管理与信息系统专业
《程序设计综合课程设计》报告
(2010/2011学年第一学期)
学生姓名:
马澜
学生班级:
信息管理与信息系统092201H
学生学号:
200922040114
指导教师:
荀亚玲
2010年月日
目录
课程设计的目的..........................................3
课程设计实任务内容.......................................3
课程设计要求.............................................3
系统功能模块图...........................................3
详细设计说明.............................................4
部分函数流程图..........................................6
程序调试.................................................7
课程设计心得与体会......................................11
附录:
源程序代码........................................12
一、课程设计的目的
加深对C语言课程所学知识的理解,进一步巩固C语言算法规则.学会编制结构清晰.风格良好.数据结构适当的C程序,从而具备解决综合性问题的能力.
二、课程设计实任务内容:
图书馆
图书管理基本业务活动包括:
对一本书的采编入库、清除库存、借阅和归还等等。
试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。
三、课程设计要求
(1)每种书的登记内容至少包括书号、书名、著者、现存量和总库量等五项
(2)作为演示系统,不必使用文件,全部数据可以都内存存放。
但是由于上述四项基本业务活动都是通过书号(关键码)进行的,所以要用B树(2-3阶数)对书号建立索引,以获得高效率。
(3)系统应实现的操作及定义如下:
A、采编入库:
新购入一种书,经分类和确定书号之后登记到图书帐目中去。
如果这种书在帐中已有,则只将总库存量增加。
B、清除库存:
某种书已无保留价值,将它从图书帐目中注销。
C、借阅:
如果一种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期限。
D、归还:
注销对借阅者的登记,改变该书的现存量。
E、显示:
用凹入表的形式显示B树。
四、系统功能模块图
五、详细设计说明
书籍结构体(Book)
①私有数据
charbnum[10];//书号
charbname[20];//书名
charbauthor[10];//作者
charrname[10];//借阅人
②公有数据及公有函数
inttag;//状态标记判断指标(已借/在架)
Book()//构造函数初始化信息
voidset_bnum(char*no)//设置书号
char*get_bnum()//获得书号
voidset_bname(char*n)//设置书名
char*get_bname()//获得书名
voidset_bauthor(char*a)//设置作者
char*get_bauthor()//获得作者姓名
voidset_tag(intt)//状态设置
voidset_rname(char*rn)//设置借阅人
char*get_rname()//获得借阅人姓名
voidshow_tag()//显示图书状态
voidcopy(Bookm)//Book结构体copy函数
书籍管理结构体(BookManage)
①私有数据及函数
Bookbooks[100];//定义Book书籍结构体数组对象,最大容量100本
intlength;//计数
voidsaveFile()//保存书籍文件
voidreadFile()//读取书籍文件
②公有数据及函数
BookManage()//构造函数,读取磁盘文件
~BookManage()//析构函数,保存磁盘文件
booladd(Bookbook)//添加图书资料
intbnu_search(char*bnu)//按书号查找书籍
intbna_search(char*bna)//按书名查找书籍
intbau_search(char*bau)//按作者查找书籍
intrn_search(char*rn)//按借阅人查找书籍
voidrevise(Bookbook,inti)//带参的修改书籍函数
voiddeleteBook(intindex)//带参的删除书籍资料函数
voidshow_book()//不带参的显示书籍函数
voidshow_book(inti)//带参的显示书籍函数
voidbr_book()//读者借、还书功能函数
boolin(inti)//判断图书是否在架函数
读者结构体(Reader)
①私有数据及函数
charrname[10];//读者姓名
charrclass[10];//班级
charrtel[10];//电话
②公有数据及函数
Reader()//构造函数,实现数据初始化
voidset_rname(char*rn)//设置读者姓名
char*get_rname()//获得读者姓名
voidset_rclass(char*rc)//设置班级
char*get_rclass()//获得班级
voidset_rtel(char*rt)//设置电话
char*get_rtel()//获得电话
voidcopy(Readerm)//读者Reader结构体copy函数
读者管理结构体(ReaderManage)
①私有数据及函数
Readerreaders[50];//定义读者结构体数组对象,最多50位
intlength;//计数
voidreadFile()//读取读者文件函数
voidsaveFile()//保存读者文件
②公有数据及函数
ReaderManage()//构造函数,读取读者文件
~ReaderManage()//析构函数,保存读者文件
voidadd_reader(Readerr)//添加读者用户函数
intsearch(char*rn)//按姓名查找读者函数
boolrevise(Readerreader,inti)//修改读者资料函数
voiddelete_reader(intindex)//删除读者函数
boollog_reader(Readerr)//登录时判断读者用户是否存在函数
voidreg_reader()//注册用户函数
voidshow_reader()//不带参的显示读者信息函数
voidshow_reader(inti)//带参的显示读者信息函数
菜单结构体(Menu)
①私有数据及函数
BookManagebm;//定义书籍管理结构体对象bm
ReaderManagerm;//定义读者管理结构体对象rm
Readerr;//定义读者结构体对象r
intchoice;//菜单序号选择
intkey;//管理员密码
②公有数据及函数
voidheader()//页眉
voidlog_menu()//主界面登录菜单
voidadmin_menu()//管理员管理菜单
voidreader_menu()//读者服务菜单
voidbsearch_menu()//读者查找书籍菜单
voidabsearch_menu()//管理员查找书籍菜单
voidreader_lr()//读者登录或注册菜单
voidlog_admin()//管理员登录
voidrn_search()//按书号查找函数
voidbnu_search()//按书号查找函数
voidbna_search()//按书名查找函数
voidbau_search()//按作者查找函数
voidaddBook()//新增书籍函数
voidreviseBook()//修改书籍函数
voiddelBook()//删除书籍函数
voidreviseReader()//修改读者用户函数
voiddelReader()//删除读者用户函数
主函数(main)
intmain()
六、部分函数流程图
①管理员登录
②读者登录
③读者借阅图书
④管理员或读者按书名查找图书
七、程序调试
各界面菜单显示
①主登录界面
②系统管理界面
③读者登录界面
④读者服务界面
⑤书籍查找界面
登录验证
①管理员登录
A.输入错误密码B.输入正确密码
②读者登录
A.
输入已注册姓名B.输入未注册姓名
注册新读者用户
添加新的图书资料
①输入已存在图书书号②输入未存在图书书号
修改已有图书资料
①输入不存在图书书号②输入已存在图书书号
删除已有图书资料
①输入不存在图书书号②输入已存在图书书号
查找已有图书资料(以按书号查找为例)
①输入不存在图书书号
②输入已存在图书书号
2.4.8显示所有图书资料
八、课程设计心得与体会
经过近三个星期的努力,前后修修改改,调试又调试,我的C++图书管理系统终于得以诞生!
在这个过程中,我发现自己还有很多很多知识都没有学好,看别人的例子的时候好像很简单,自己一上机操作就有问题。
调试的时候系统总是报错,还有很多警告,每添加一个函数,往往都要要调试很久,有时候仅仅只是少了一个大括号,却花上近半个小时才找到问题的瓶颈所在。
系统虽然完成了,也可以运行,一些基本的功能也能够实现,但我知道,还有很多的不足。
另外,我发现帮助文件真的很有用,每当我看别人例子看不懂的时候,都是去帮助文件搜索,如果里面的信息不够完整,再利用各大网站的搜索引擎来寻找答案,比如更改背景颜色的问题,之前试了很多次都不行,后来偶然发现一个MS-DOS命令大全,然后再去网上搜索color命令的使用语法,原来以为很复杂的代码,只需一句system(colorfd),问题就迎刃而解了。
以后还会有很多课程设计,一定要吸取这次的教训,知识不是看过就可以了,而是要把知识学透、学精,才能够真正做到为我所用。
九、附录
#include
#include
#include
#include
#include
#defineBookFile"book.txt"//将字符串BookFile替换原文件中的宏名称book
#defineReaderFile"reader.txt"
usingnamespacestd;
//**********读者结构体,用于存放读者基本信息**********
classReader
{
private:
charrname[10];
charrclass[10];
charrtel[10];
public:
Reader()//构造函数,实现数据初始化
{strcpy(rname,"");strcpy(rclass,"");strcpy(rtel,"");}
voidset_rname(char*rn)//设置读者姓名
{strcpy(rname,rn);}//将rn的字符复制给rname
char*get_rname()//获得读者姓名
{returnrname;}//返回rname的值
voidset_rclass(char*rc)//设置班级
{strcpy(rclass,rc);}
char*get_rclass()//获得班级
{returnrclass;}
voidset_rtel(char*rt)//设置电话
{strcpy(rtel,rt);}
char*get_rtel()//获得电话
{returnrtel;}
voidcopy(Readerm)//读者Reader结构体copy函数
{strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());}
};
//*********读者管理结构体,实现对读者用户的管理*********
classReaderManage
{
Readerreaders[50];//定义读者结构体数组对象,最多50位
intlength;
voidreadFile()//读取读者文件函数
{
ifstreamfread;//定义输入文件流对象fread
length=0;//计数
if(!
fread)
{cout<<"读取磁盘文件失败!
"<(1);}
fread.open(ReaderFile,ios:
:
binary);//使文件流与文件关联,以二进制方式打开
inti=0;
while((fread.read((char*)&readers[i],sizeof(Reader))))//计算并返回所占字节数
i++;
length=i;
fread.close();//关闭磁盘文件
}
voidsaveFile()//保存读者文件
{
ofstreamfwrite;//定义输出文件流对象fwrite
if(!
fwrite)
{cout<<"文件保存失败!
\n";exit
(1);}
fwrite.open(ReaderFile,ios:
:
binary);//使文件流与文件关联,以二进制方式打开
fwrite.write((char*)readers,length*sizeof(Reader));//计算并返回所占字节数
fwrite.close();//关闭磁盘文件
}
public:
ReaderManage()//构造函数,读取读者文件
{readFile();}
~ReaderManage()//析构函数,保存读者文件
{saveFile();}
voidadd_reader(Readerr)//添加读者用户函数
{
if(length>=50)
{cout<<"对不起,注册人数已满!
\n";return;}
readers[length].copy(r);//调用读者结构体copy函数
length++;
}
intsearch(char*rn)//按姓名查找读者函数
{
for(inti=0;iif(strcmp(readers[i].get_rname(),rn)==0)//判断是否相等
returni;
return-1;
}
boolrevise(Readerreader,inti)//修改读者资料函数
{
readers[i].copy(reader);//调用读者结构体cpoy函数
returntrue;
}
voiddelete_reader(intindex)//删除读者函数
{
for(inti=index;ireaders[i].copy(readers[i+1]);//用后面的地址覆盖前面的地址
length--;
}
boollog_reader(Readerr)//登录时判断读者用户是否存在函数
{
for(inti=0;iif(strcmp(readers[i].get_rname(),r.get_rname())==0)
returntrue;
returnfalse;
}
voidreg_reader()//注册用户函数
{
charn[10];//姓名name
charc[10];//班级class
chart[10];//电话tel
Readerreader;
cout<<"\n\t请输入您的姓名:
";
cin>>n;
cout<<"\n\t请输入您的所在班级:
";
cin>>c;
cout<<"\n\t请输入您的联系电话:
";
cin>>t;
reader.set_rname(n);//调用读者结构体设置读者姓名函数
reader.set_rclass(c);//调用读者结构体设置读者班级函数
reader.set_rtel(t);//调用读者结构体设置联系电话函数
add_reader(reader);//调用读者结构体添加读者函数
cout<<"\n\t注册成功!
";
}
voidshow_reader()//不带参的显示读者信息函数
{
cout<<"\n**********************读****者****信****息****列****表**********************\n\n";
cout<<"姓名\t\t\t班级\t\t\t电话\n";
for(inti=0;i{
cout<cout<<"\t\t\t"<cout<<"\t\t\t"<}
}
voidshow_reader(inti)//带参的显示读者信息函数
{
cout<<"\n**********************读****者****信****息****列****表**********************\n\n";
cout<<"姓名\t\t\t班级\t\t\t电话\n";
cout<cout<<"\t\t\t"<cout<<"\t\t\t"<}
};
//********书籍结构体,用于存放书籍基本信息********
classBook
{
private:
charbnum[10];//书号
charbname[20];//书名
charbauthor[10];//作者
charrname[10];//借阅人
public:
inttag;//状态标记判断指标(已借/在架)
Book()//构造函数初始化信息
{strcpy(bnum,"");strcpy(bname,"");strcpy(bauthor,"");strcpy(rname,"");tag=0;}
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_tag(intt)//状态设置
{tag=t;}
voidset_rname(char*rn)//设置借阅人
{strcpy(rname,rn);}
char*get_rname()//获得借阅人姓名
{returnrname;}
voidshow_tag()//显示图书状态
{
if(tag==1)
{cout<<"已借";}
else
{cout<<"在架";}
}
voidcopy(Bookm)//Book结构体copy函数
{
strcpy(bnum,m.get_bnum());//将获得书号函数里的返回值里的字符复制到bnum
strcpy(bname,m.get_bname());
strcpy(bauthor,m.get_bauthor());
tag=0;
}
};
//**********书籍管理结构体,实现管理书籍功能**********
classBookManage
{
private:
Bookbooks[100];//定义Book书籍结构体数组对象,最大容量100本
intlength;
voidsaveFile()//保存书籍文件
{
ofstreamfwrite;//定义输出文件流ofstream结构体对象fwrite
if(!
fwrite)
{cout<<"文件保存失败!
\n";exit
(1);}
fwrite.open(BookFile,ios:
:
binary);//使文件流与文件建立关联,以二进制方式打开
fwrite.write((char*)books,length*sizeof(Book));//计算并返回所占字节数
fwrite.close();//关闭磁盘文件
}
voidreadFile()//读取书籍文件
{
ifstreamfread;//定义输入文件流对象fread
length=0;
if(!
fread)
{cout<<"文件读取失败!
"<(1);}